diff --git a/lib/pinchflat/downloading/output_path_builder.ex b/lib/pinchflat/downloading/output_path_builder.ex index 6364da0..374d57f 100644 --- a/lib/pinchflat/downloading/output_path_builder.ex +++ b/lib/pinchflat/downloading/output_path_builder.ex @@ -40,7 +40,9 @@ defmodule Pinchflat.Downloading.OutputPathBuilder do "upload_year" => "%(upload_date>%Y)S", "upload_month" => "%(upload_date>%m)S", "upload_day" => "%(upload_date>%d)S", - "upload_yyyy_mm_dd" => "%(upload_date>%Y-%m-%d)S" + "upload_yyyy_mm_dd" => "%(upload_date>%Y-%m-%d)S", + "season_from_date" => "%(upload_date>%Y)S", + "season_episode_from_date" => "s%(upload_date>%Y)Se%(upload_date>%m%d)S" } end end diff --git a/lib/pinchflat/profiles/media_profile.ex b/lib/pinchflat/profiles/media_profile.ex index 0655e06..7ecddb7 100644 --- a/lib/pinchflat/profiles/media_profile.ex +++ b/lib/pinchflat/profiles/media_profile.ex @@ -35,14 +35,14 @@ defmodule Pinchflat.Profiles.MediaProfile do field :download_subs, :boolean, default: false field :download_auto_subs, :boolean, default: false - field :embed_subs, :boolean, default: true + field :embed_subs, :boolean, default: false field :sub_langs, :string, default: "en" field :download_thumbnail, :boolean, default: false - field :embed_thumbnail, :boolean, default: true + field :embed_thumbnail, :boolean, default: false field :download_metadata, :boolean, default: false - field :embed_metadata, :boolean, default: true + field :embed_metadata, :boolean, default: false field :download_nfo, :boolean, default: false # NOTE: these do NOT speed up indexing - the indexer still has to go diff --git a/lib/pinchflat_web/components/core_components.ex b/lib/pinchflat_web/components/core_components.ex index 314dbf9..52295d0 100644 --- a/lib/pinchflat_web/components/core_components.ex +++ b/lib/pinchflat_web/components/core_components.ex @@ -317,17 +317,7 @@ defmodule PinchflatWeb.CoreComponents do <%= @label_suffix %>
- - +
- <.label for={@id}> + <.label :if={@label} for={@id}> <%= @label %><%= @label_suffix %> - +
+ + <%= render_slot(@inner_block) %> +
<.help :if={@help}><%= @help %> <.error :for={msg <- @errors}><%= msg %>
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" + > + Select + + +
- <.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 +
<.output_template_help />