diff --git a/lib/pinchflat/downloading/download_option_builder.ex b/lib/pinchflat/downloading/download_option_builder.ex index a9eeba5..ebb3667 100644 --- a/lib/pinchflat/downloading/download_option_builder.ex +++ b/lib/pinchflat/downloading/download_option_builder.ex @@ -35,12 +35,19 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do Builds the output path for yt-dlp to download media based on the given source's media profile. Uses the source's override output path template if it exists. + Accepts a %MediaItem{} or %Source{} struct. If a %Source{} struct is passed, it + will use a default %MediaItem{} struct with the given source. + Returns binary() """ - def build_output_path_for(%Source{} = source_with_preloads) do - output_path_template = Sources.output_path_template(source_with_preloads) + def build_output_path_for(%MediaItem{} = media_item_with_preloads) do + output_path_template = Sources.output_path_template(media_item_with_preloads.source) - build_output_path(output_path_template, source_with_preloads) + build_output_path(output_path_template, media_item_with_preloads) + end + + def build_output_path_for(%Source{} = source_with_preloads) do + build_output_path_for(%MediaItem{source: source_with_preloads}) end defp default_options do @@ -168,23 +175,29 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do defp output_options(media_item_with_preloads) do [ - output: build_output_path_for(media_item_with_preloads.source) + output: build_output_path_for(media_item_with_preloads) ] end - defp build_output_path(string, source) do - additional_options_map = output_options_map(source) + defp build_output_path(string, media_item_with_preloads) do + additional_options_map = output_options_map(media_item_with_preloads) {:ok, output_path} = OutputPathBuilder.build(string, additional_options_map) Path.join(base_directory(), output_path) end - defp output_options_map(source) do + defp output_options_map(media_item_with_preloads) do + source = media_item_with_preloads.source + %{ "source_custom_name" => source.custom_name, "source_collection_id" => source.collection_id, "source_collection_name" => source.collection_name, - "source_collection_type" => source.collection_type + "source_collection_type" => source.collection_type, + "media_upload_date_index" => + media_item_with_preloads.upload_date_index + |> to_string() + |> String.pad_leading(2, "0") } end @@ -198,7 +211,7 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do |> String.split(~r{\.}, include_captures: true) |> List.insert_at(-3, "-thumb") |> Enum.join() - |> build_output_path(media_item_with_preloads.source) + |> build_output_path(media_item_with_preloads) end defp base_directory do diff --git a/test/pinchflat/downloading/download_option_builder_test.exs b/test/pinchflat/downloading/download_option_builder_test.exs index 8008b7f..9cf3048 100644 --- a/test/pinchflat/downloading/download_option_builder_test.exs +++ b/test/pinchflat/downloading/download_option_builder_test.exs @@ -33,6 +33,15 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do assert {:output, "/tmp/test/media/#{media_item.source.custom_name}.%(ext)s"} in res end + test "respects custom media_item-related output path options", %{media_item: media_item} do + media_item = + update_media_profile_attribute(media_item, %{output_path_template: "{{ media_upload_date_index }}.%(ext)s"}) + + assert {:ok, res} = DownloadOptionBuilder.build(media_item) + + assert {:output, "/tmp/test/media/00.%(ext)s"} in res + end + test "uses source's output override if present", %{media_item: media_item} do source = media_item.source {:ok, _} = Sources.update_source(source, %{output_path_template_override: "override.%(ext)s"}) @@ -386,6 +395,12 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do end describe "build_output_path_for/1" do + test "builds an output path for a media item", %{media_item: media_item} do + path = DownloadOptionBuilder.build_output_path_for(media_item) + + assert path == "/tmp/test/media/%(title)S.%(ext)s" + end + test "builds an output path for a source", %{media_item: media_item} do path = DownloadOptionBuilder.build_output_path_for(media_item.source)