diff --git a/lib/pinchflat_web/components/custom_components/button_components.ex b/lib/pinchflat_web/components/custom_components/button_components.ex
index 304e280..c6f6e01 100644
--- a/lib/pinchflat_web/components/custom_components/button_components.ex
+++ b/lib/pinchflat_web/components/custom_components/button_components.ex
@@ -28,9 +28,10 @@ defmodule PinchflatWeb.CustomComponents.ButtonComponents do
"#{@rounding} inline-flex items-center justify-center px-8 py-4",
"#{@color}",
"hover:bg-opacity-90 lg:px-8 xl:px-10",
- "disabled:bg-opacity-50 disabled:cursor-not-allowed disabled:text-gray-2",
+ "disabled:bg-opacity-50 disabled:cursor-not-allowed disabled:text-grey-5",
@class
]}
+ type={@type}
disabled={@disabled}
{@rest}
>
diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex
index 85990a4..8f84700 100644
--- a/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex
+++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex
@@ -1,6 +1,8 @@
defmodule PinchflatWeb.MediaProfiles.MediaProfileHTML do
use PinchflatWeb, :html
+ alias Pinchflat.Profiles.MediaProfile
+
embed_templates "media_profile_html/*"
@doc """
@@ -53,4 +55,25 @@ defmodule PinchflatWeb.MediaProfiles.MediaProfileHTML do
duration_string
)a
end
+
+ def preset_options do
+ [
+ {"Default", "default"},
+ {"Media Center (Plex, Jellyfin, Kodi, etc.)", "media_center"},
+ {"Music", "audio"},
+ {"Archiving", "archiving"}
+ ]
+ end
+
+ defp default_output_template do
+ %MediaProfile{}.output_path_template
+ end
+
+ defp media_center_output_template do
+ "/shows/{{ source_custom_name }}/{{ season_from_date }}/{{ season_episode_from_date }} - {{ title }}.{{ ext }}"
+ end
+
+ defp audio_output_template do
+ "/music/{{ source_custom_name }}/{{ title }}.{{ ext }}"
+ end
end
diff --git a/lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex
index bed943e..3eba728 100644
--- a/lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex
+++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html/media_profile_form.html.heex
@@ -3,123 +3,218 @@
Oops, something went wrong! Please check the errors below.
-
- General Options
-
- <.input
- field={f[:name]}
- type="text"
- label="Name"
- placeholder="New Profile"
- help="Something descriptive. Does not impact indexing or downloading (required)"
- />
+
+
+ Use a Preset
+
+
+ <.input
+ prompt="Select preset"
+ name="media_profile_preset"
+ value=""
+ options={preset_options()}
+ type="select"
+ x-model="selection"
+ inputclass="w-full"
+ help="You can further customize the settings after selecting a preset. This is just a starting point"
+ >
+ <.button
+ class="h-13 w-2/5 lg:w-1/5 ml-2 md:ml-4"
+ rounding="rounded"
+ type="button"
+ x-on:click="selectedPreset = selection; selection = null"
+ x-bind:disabled="!selection"
+ >
+ SelectPreset
+
+
+
- <.input
- field={f[:output_path_template]}
- type="text"
- inputclass="font-mono"
- label="Output path template"
- help="Must end with .{{ ext }}. See below for more details. The default is good for most cases (required)"
- />
+
+ General Options
+
-
- Subtitle Options
-
- <.input
- field={f[:download_subs]}
- type="toggle"
- label="Download Subtitles"
- help="Downloads subtitle files alongside media file"
- />
- <.input
- field={f[:download_auto_subs]}
- type="toggle"
- label="Download Autogenerated Subtitles"
- help="Prefers normal subs but will download autogenerated if needed. Requires 'Download Subtitles' to be enabled"
- />
- <.input
- field={f[:embed_subs]}
- type="toggle"
- label="Embed Subtitles"
- help="Downloads and embeds subtitles in the media file itself, if supported. Uneffected by 'Download Subtitles' (recommended)"
- />
- <.input
- field={f[:sub_langs]}
- type="text"
- label="Subtitle Languages"
- help="Use commas for multiple languages (eg: en,de)"
- />
+
+ <.input
+ field={f[:name]}
+ type="text"
+ label="Name"
+ placeholder="New Profile"
+ help="Something descriptive. Does not impact indexing or downloading (required)"
+ x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
+ />
+
-
- Thumbnail Options
-
- <.input
- field={f[:download_thumbnail]}
- type="toggle"
- label="Download Thumbnail"
- help="Downloads thumbnail alongside media file"
- />
- <.input
- field={f[:embed_thumbnail]}
- type="toggle"
- label="Embed Thumbnail"
- help="Downloads and embeds thumbnail in the media file itself, if supported. Uneffected by 'Download Thumbnail' (recommended)"
- />
+
+ <.input
+ field={f[:output_path_template]}
+ type="text"
+ inputclass="font-mono"
+ label="Output path template"
+ help="Must end with .{{ ext }}. See below for more details. The default is good for most cases (required)"
+ x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
+ />
+
-
- Metadata Options
-
- <.input
- field={f[:download_metadata]}
- type="toggle"
- label="Download Metadata"
- help="Downloads metadata file alongside media file"
- />
- <.input
- field={f[:embed_metadata]}
- type="toggle"
- label="Embed Metadata"
- help="Downloads and embeds metadata in the media file itself, if supported. Uneffected by 'Download Metadata' (recommended)"
- />
- <.input
- field={f[:download_nfo]}
- type="toggle"
- label="Download NFO data"
- help="Downloads NFO data alongside media file for use with Jellyfin, Kodi, etc."
- />
+
+ Subtitle Options
+
-
- Release Format Options
-
+
+ <.input
+ field={f[:download_subs]}
+ type="toggle"
+ label="Download Subtitles"
+ help="Downloads subtitle files alongside media file"
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
- <.input
- field={f[:shorts_behaviour]}
- options={friendly_format_type_options()}
- type="select"
- label="Include Shorts?"
- help="Experimental. Please report any issues on GitHub"
- />
- <.input
- field={f[:livestream_behaviour]}
- options={friendly_format_type_options()}
- type="select"
- label="Include Livestreams?"
- help="Excludes media that comes from a past livestream"
- />
+
+ <.input
+ field={f[:download_auto_subs]}
+ type="toggle"
+ label="Download Autogenerated Subtitles"
+ help="Prefers normal subs but will download autogenerated if needed. Requires 'Download Subtitles' to be enabled"
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
-
- Quality Options
-
+
+ <.input
+ field={f[:embed_subs]}
+ type="toggle"
+ label="Embed Subtitles"
+ help="Downloads and embeds subtitles in the media file itself, if supported. Uneffected by 'Download Subtitles' (recommended)"
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
- <.input
- field={f[:preferred_resolution]}
- options={friendly_resolution_options()}
- type="select"
- label="Preferred Resolution"
- help="Will grab the closest available resolution if your preferred is not available. 'Audio Only' grabs the highest quality m4a"
- />
+
+ <.input
+ field={f[:sub_langs]}
+ type="text"
+ label="Subtitle Languages"
+ help="Use commas for multiple languages (eg: en,de)"
+ x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
+ />
+
- <.button class="my-10 sm:mb-7.5 w-full sm:w-auto">Save Media profile
+
+ Thumbnail Options
+
+
+
+ <.input
+ field={f[:download_thumbnail]}
+ type="toggle"
+ label="Download Thumbnail"
+ help="Downloads thumbnail alongside media file"
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
+
+
+ <.input
+ field={f[:embed_thumbnail]}
+ type="toggle"
+ label="Embed Thumbnail"
+ help="Downloads and embeds thumbnail in the media file itself, if supported. Uneffected by 'Download Thumbnail' (recommended)"
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
+
+
+ Metadata Options
+
+
+
+ <.input
+ field={f[:download_metadata]}
+ type="toggle"
+ label="Download Metadata"
+ help="Downloads metadata file alongside media file"
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
+
+
+ <.input
+ field={f[:embed_metadata]}
+ type="toggle"
+ label="Embed Metadata"
+ help="Downloads and embeds metadata in the media file itself, if supported. Uneffected by 'Download Metadata' (recommended)"
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
+
+
+ <.input
+ field={f[:download_nfo]}
+ type="toggle"
+ label="Download NFO data"
+ help="Downloads NFO data alongside media file for use with Jellyfin, Kodi, etc."
+ x-init="$watch('selectedPreset', p => p && (enabled = presets[p]))"
+ />
+
+
+
+ Release Format Options
+
+
+
+ <.input
+ field={f[:shorts_behaviour]}
+ options={friendly_format_type_options()}
+ type="select"
+ label="Include Shorts?"
+ help="Experimental. Please report any issues on GitHub"
+ x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
+ />
+
+
+
+ <.input
+ field={f[:livestream_behaviour]}
+ options={friendly_format_type_options()}
+ type="select"
+ label="Include Livestreams?"
+ help="Excludes media that comes from a past livestream"
+ x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
+ />
+
+
+
+ Quality Options
+
+
+
+ <.input
+ field={f[:preferred_resolution]}
+ options={friendly_resolution_options()}
+ type="select"
+ label="Preferred Resolution"
+ help="Will grab the closest available resolution if your preferred is not available. 'Audio Only' grabs the highest quality m4a"
+ x-init="$watch('selectedPreset', p => p && ($el.value = presets[p]))"
+ />
+
+
+ <.button class="my-10 sm:mb-7.5 w-full sm:w-auto">Save Media profile
+