[Enhancement] Add Media Center support for videos uploaded on the same day (#221)
* Added upload date index field to media_items * Added incrementing index for upload dates * Added media item upload date index to download option builder * Added new season_episode_index_from_date to UI; updated parser * Improve support for channels * Hopefully fixed flakey test
This commit is contained in:
1 parent
112c6a4f14
commit
04b14719ee
10 files changed
+261
-16
No files matched your search
@@ -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" => to_string(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
|
||||
|
||||
@@ -9,13 +9,23 @@ defmodule Pinchflat.Downloading.OutputPathBuilder do
|
||||
Builds the actual final filepath from a given template. Optionally, you can pass in
|
||||
a map of additional options to be used in the template.
|
||||
|
||||
Custom options are recursively expanded _once_ so you can nest custom options
|
||||
one-deep if needed.
|
||||
|
||||
Translates liquid-style templates into yt-dlp-style templates,
|
||||
leaving yt-dlp syntax intact.
|
||||
"""
|
||||
def build(template_string, additional_template_options \\ %{}) do
|
||||
combined_options = Map.merge(custom_yt_dlp_option_map(), additional_template_options)
|
||||
|
||||
TemplateParser.parse(template_string, combined_options, &identifier_fn/2)
|
||||
expanded_options =
|
||||
Enum.map(combined_options, fn {key, value} ->
|
||||
{:ok, parse_result} = TemplateParser.parse(value, combined_options, &identifier_fn/2)
|
||||
|
||||
{key, parse_result}
|
||||
end)
|
||||
|
||||
TemplateParser.parse(template_string, Map.new(expanded_options), &identifier_fn/2)
|
||||
end
|
||||
|
||||
# The `nil` case simply wraps the identifier in yt-dlp-style syntax. This assumes that
|
||||
@@ -43,6 +53,7 @@ defmodule Pinchflat.Downloading.OutputPathBuilder do
|
||||
"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",
|
||||
"season_episode_index_from_date" => "s%(upload_date>%Y)Se%(upload_date>%m%d)S{{ media_upload_date_index }}",
|
||||
"artist_name" => "%(artist,creator,uploader,uploader_id)S"
|
||||
}
|
||||
end
|
||||
|
||||
Reference in new issue
Block a user