* Made method to getting singular media details; Renamed other related method * Takes a fun and flirty digression to remove abstractions around yt-dlp since I'm 100% committed to using it exclusively * Removed commented test code * Lays the groundwork for fast indexing * Added module for working with youtube RSS feed * Added methods to kick off indexing workers from RSS response * Improve short detection (#59) * Made media attribute-related yt-dlp calls return a struct * Added shorts attribute to media items * Added ability to discern a short from yt-dlp response * Updated search to use new shorts attribute * Fast index UI (#63) * Added fast_index field and adds it to source form * Added fast indexing to source changeset operations * Added fast indexing worker and updated other modules to start using it * Handled fast index worker on source update * Add support modals (#65) * Added fast indexing upgrade modal * Improved modal on smaller screens * Updated links to work again * Added donation modal * Reverted source fast index to 15 minutes * Removed unneeded HTML attributes from old alpine approach
45 lines
1.8 KiB
Elixir
45 lines
1.8 KiB
Elixir
defmodule Pinchflat.Profiles.OutputPathBuilder do
|
|
@moduledoc """
|
|
Builds yt-dlp-friendly output paths for downloaded media
|
|
"""
|
|
|
|
alias Pinchflat.RenderedString.Parser, as: TemplateParser
|
|
|
|
@doc """
|
|
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.
|
|
|
|
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)
|
|
end
|
|
|
|
# The `nil` case simply wraps the identifier in yt-dlp-style syntax. This assumes that
|
|
# the identifier is a valid yt-dlp option. The upside is that this gives the user
|
|
# access to ALL single-word yt-dlp options in the (imo) more friendly/forgiving liquid-style syntax.
|
|
#
|
|
# For all "custom" variables, we use the `Map.get/3` function to look up the value in the provided.
|
|
# See `custom_yt_dlp_option_map` for a list of those.
|
|
defp identifier_fn(identifier, variables) do
|
|
case Map.get(variables, identifier) do
|
|
nil -> "%(#{identifier})S"
|
|
value -> value
|
|
end
|
|
end
|
|
|
|
# This isn't the only source for custom options, since they can be passed in my the caller.
|
|
# `download_option_builder` is the most likely place for other custom options to be added,
|
|
# but if in doubt just search the codebase for `OutputPathBuilder.build`.
|
|
defp custom_yt_dlp_option_map do
|
|
%{
|
|
# Individual parts of the upload date
|
|
"upload_year" => "%(upload_date>%Y)S",
|
|
"upload_month" => "%(upload_date>%m)S",
|
|
"upload_day" => "%(upload_date>%d)S"
|
|
}
|
|
end
|
|
end
|