diff --git a/lib/pinchflat/profiles/media_profile.ex b/lib/pinchflat/profiles/media_profile.ex index db3f888..9398b0e 100644 --- a/lib/pinchflat/profiles/media_profile.ex +++ b/lib/pinchflat/profiles/media_profile.ex @@ -53,7 +53,7 @@ defmodule Pinchflat.Profiles.MediaProfile do field :shorts_behaviour, Ecto.Enum, values: ~w(include exclude only)a, default: :include field :livestream_behaviour, Ecto.Enum, values: ~w(include exclude only)a, default: :include - field :preferred_resolution, Ecto.Enum, values: ~w(2160p 1080p 720p 480p 360p)a, default: :"1080p" + field :preferred_resolution, Ecto.Enum, values: ~w(2160p 1080p 720p 480p 360p audio)a, default: :"1080p" has_many :sources, Source diff --git a/lib/pinchflat/profiles/options/yt_dlp/download_option_builder.ex b/lib/pinchflat/profiles/options/yt_dlp/download_option_builder.ex index e9b37cf..ac5c0de 100644 --- a/lib/pinchflat/profiles/options/yt_dlp/download_option_builder.ex +++ b/lib/pinchflat/profiles/options/yt_dlp/download_option_builder.ex @@ -44,7 +44,7 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilder do {{:download_auto_subs, true}, %{download_subs: true}} -> acc ++ [:write_auto_subs] - {{:embed_subs, true}, _} -> + {{:embed_subs, true}, %{preferred_resolution: pr}} when pr != :audio -> acc ++ [:embed_subs] {{:sub_langs, sub_langs}, %{download_subs: true}} -> @@ -63,10 +63,15 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilder do mapped_struct = Map.from_struct(media_profile) Enum.reduce(mapped_struct, [], fn attr, acc -> - case attr do - {:download_thumbnail, true} -> acc ++ [:write_thumbnail] - {:embed_thumbnail, true} -> acc ++ [:embed_thumbnail] - _ -> acc + case {attr, media_profile} do + {{:download_thumbnail, true}, _} -> + acc ++ [:write_thumbnail] + + {{:embed_thumbnail, true}, %{preferred_resolution: pr}} when pr != :audio -> + acc ++ [:embed_thumbnail] + + _ -> + acc end end) end @@ -75,10 +80,15 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilder do mapped_struct = Map.from_struct(media_profile) Enum.reduce(mapped_struct, [], fn attr, acc -> - case attr do - {:download_metadata, true} -> acc ++ [:write_info_json, :clean_info_json] - {:embed_metadata, true} -> acc ++ [:embed_metadata] - _ -> acc + case {attr, media_profile} do + {{:download_metadata, true}, _} -> + acc ++ [:write_info_json, :clean_info_json] + + {{:embed_metadata, true}, %{preferred_resolution: pr}} when pr != :audio -> + acc ++ [:embed_metadata] + + _ -> + acc end end) end @@ -87,6 +97,8 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilder do codec_options = "+codec:avc:m4a" case media_profile.preferred_resolution do + # Also be aware that :audio disabled all embedding options for thumbnails, subtitles, and metadata + :audio -> [format_sort: "ext", format: "bestaudio"] :"360p" -> [format_sort: "res:360,#{codec_options}"] :"480p" -> [format_sort: "res:480,#{codec_options}"] :"720p" -> [format_sort: "res:720,#{codec_options}"] 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 a313002..3e23050 100644 --- a/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex +++ b/lib/pinchflat_web/controllers/media_profiles/media_profile_html.ex @@ -21,11 +21,12 @@ defmodule PinchflatWeb.MediaProfiles.MediaProfileHTML do def friendly_resolution_options do [ - {"2160p", "4k"}, + {"4k", "2160p"}, {"1080p", "1080p"}, {"720p", "720p"}, {"480p", "480p"}, - {"360p", "360p"} + {"360p", "360p"}, + {"Audio Only", "audio"} ] end diff --git a/test/pinchflat/profiles/options/yt_dlp/download_option_builder_test.exs b/test/pinchflat/profiles/options/yt_dlp/download_option_builder_test.exs index 38e1ea0..75602eb 100644 --- a/test/pinchflat/profiles/options/yt_dlp/download_option_builder_test.exs +++ b/test/pinchflat/profiles/options/yt_dlp/download_option_builder_test.exs @@ -82,6 +82,14 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilderTest do assert :embed_subs in res end + test "doesn't include :embed_subs option when preferred_resolution is :audio", %{media_item: media_item} do + media_item = update_media_profile_attribute(media_item, %{embed_subs: true, preferred_resolution: :audio}) + + assert {:ok, res} = DownloadOptionBuilder.build(media_item) + + refute :embed_subs in res + end + test "includes sub_langs option when download_subs is true", %{media_item: media_item} do media_item = update_media_profile_attribute(media_item, %{download_subs: true, sub_langs: "en"}) @@ -125,6 +133,14 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilderTest do assert :embed_thumbnail in res end + test "doesn't include :embed_thumbnail option when preferred_resolution is :audio", %{media_item: media_item} do + media_item = update_media_profile_attribute(media_item, %{embed_thumbnail: true, preferred_resolution: :audio}) + + assert {:ok, res} = DownloadOptionBuilder.build(media_item) + + refute :embed_thumbnail in res + end + test "doesn't include these options when not specified", %{media_item: media_item} do media_item = update_media_profile_attribute(media_item, %{embed_thumbnail: false, download_thumbnail: false}) @@ -153,6 +169,14 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilderTest do assert :embed_metadata in res end + test "doesn't include :embed_metadata option when preferred_resolution is :audio", %{media_item: media_item} do + media_item = update_media_profile_attribute(media_item, %{embed_metadata: true, preferred_resolution: :audio}) + + assert {:ok, res} = DownloadOptionBuilder.build(media_item) + + refute :embed_metadata in res + end + test "doesn't include these options when not specified", %{media_item: media_item} do media_item = update_media_profile_attribute(media_item, %{embed_metadata: false, download_metadata: false}) @@ -172,6 +196,15 @@ defmodule Pinchflat.Profiles.Options.YtDlp.DownloadOptionBuilderTest do assert {:format_sort, "res:1080,+codec:avc:m4a"} in res end + + test "it includes quality options for audio only", %{media_item: media_item} do + media_item = update_media_profile_attribute(media_item, %{preferred_resolution: :audio}) + + assert {:ok, res} = DownloadOptionBuilder.build(media_item) + + assert {:format, "bestaudio"} in res + assert {:format_sort, "ext"} in res + end end defp update_media_profile_attribute(media_item_with_preloads, attrs) do