Added media item upload date index to download option builder

This commit is contained in:
Kieran Eglin 2024-05-02 10:03:24 -07:00
parent 1a2ba15a9d
commit 68f1f49cfc
No known key found for this signature in database
GPG key ID: 193984967FCF432D
2 changed files with 37 additions and 9 deletions

View file

@ -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 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. 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() Returns binary()
""" """
def build_output_path_for(%Source{} = source_with_preloads) do def build_output_path_for(%MediaItem{} = media_item_with_preloads) do
output_path_template = Sources.output_path_template(source_with_preloads) 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 end
defp default_options do defp default_options do
@ -168,23 +175,29 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do
defp output_options(media_item_with_preloads) 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 end
defp build_output_path(string, source) do defp build_output_path(string, media_item_with_preloads) do
additional_options_map = output_options_map(source) additional_options_map = output_options_map(media_item_with_preloads)
{:ok, output_path} = OutputPathBuilder.build(string, additional_options_map) {:ok, output_path} = OutputPathBuilder.build(string, additional_options_map)
Path.join(base_directory(), output_path) Path.join(base_directory(), output_path)
end 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_custom_name" => source.custom_name,
"source_collection_id" => source.collection_id, "source_collection_id" => source.collection_id,
"source_collection_name" => source.collection_name, "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 end
@ -198,7 +211,7 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilder do
|> String.split(~r{\.}, include_captures: true) |> String.split(~r{\.}, include_captures: true)
|> List.insert_at(-3, "-thumb") |> List.insert_at(-3, "-thumb")
|> Enum.join() |> Enum.join()
|> build_output_path(media_item_with_preloads.source) |> build_output_path(media_item_with_preloads)
end end
defp base_directory do defp base_directory do

View file

@ -33,6 +33,15 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
assert {:output, "/tmp/test/media/#{media_item.source.custom_name}.%(ext)s"} in res assert {:output, "/tmp/test/media/#{media_item.source.custom_name}.%(ext)s"} in res
end 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 test "uses source's output override if present", %{media_item: media_item} do
source = media_item.source source = media_item.source
{:ok, _} = Sources.update_source(source, %{output_path_template_override: "override.%(ext)s"}) {:ok, _} = Sources.update_source(source, %{output_path_template_override: "override.%(ext)s"})
@ -386,6 +395,12 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
end end
describe "build_output_path_for/1" do 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 test "builds an output path for a source", %{media_item: media_item} do
path = DownloadOptionBuilder.build_output_path_for(media_item.source) path = DownloadOptionBuilder.build_output_path_for(media_item.source)