Redo indexing mechanism (#16)
* Bumped up the line length because I fear no man * Refactored indexing Previously, indexing worked by collecting the video IDs of only videos that matched indexing criteria. This new model instead stores ALL videos for a given source, but will only _download_ videos that meet that criteria. This lets us backfill without indexing, makes it easier to add in other backends, lets us download one-off videos for a source that don't quite meet criteria, you name it. * Updated media finders to respect format filters; Added credo file
This commit is contained in:
1 parent
89497c4c6b
commit
dabec62e99
31 files changed
+646
-385
No files matched your search
@@ -45,7 +45,9 @@ defmodule Pinchflat.Profiles.MediaProfile do
|
||||
# through the entire collection to determine if a video is a short or
|
||||
# a livestream.
|
||||
# NOTE: these can BOTH be set to :only which will download shorts and
|
||||
# livestreams _only_ and ignore regular videos.
|
||||
# livestreams _only_ and ignore regular videos. The redundant case
|
||||
# is when one is set to :only and the other is set to :exclude.
|
||||
# See `build_format_clauses` in the Media context for more.
|
||||
field :shorts_behaviour, Ecto.Enum, values: [:include, :exclude, :only], default: :include
|
||||
field :livestream_behaviour, Ecto.Enum, values: [:include, :exclude, :only], default: :include
|
||||
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
defmodule Pinchflat.Profiles.Options.YtDlp.IndexOptionBuilder do
|
||||
@moduledoc """
|
||||
Builds the options for yt-dlp to index a media source based on the given media profile.
|
||||
"""
|
||||
|
||||
alias Pinchflat.Profiles.MediaProfile
|
||||
|
||||
@doc """
|
||||
Builds the options for yt-dlp to index a media source based on the given media profile.
|
||||
"""
|
||||
def build(%MediaProfile{} = media_profile) do
|
||||
built_options = release_type_options(media_profile)
|
||||
|
||||
{:ok, built_options}
|
||||
end
|
||||
|
||||
defp release_type_options(media_profile) do
|
||||
mapped_struct = Map.from_struct(media_profile)
|
||||
|
||||
# Appending multiple match filters treats them as an OR condition,
|
||||
# so we have to be careful around combining `only` and `exclude` options.
|
||||
# eg: only shorts + exclude livestreams = "any video that is a short OR is not a livestream"
|
||||
# which will return all shorts AND normal videos.
|
||||
Enum.reduce(mapped_struct, [], fn attr, acc ->
|
||||
case {attr, media_profile} do
|
||||
{{:shorts_behaviour, :only}, _} ->
|
||||
acc ++ [match_filter: "original_url*=/shorts/"]
|
||||
|
||||
{{:livestream_behaviour, :only}, _} ->
|
||||
acc ++ [match_filter: "was_live"]
|
||||
|
||||
# Since match_filter is an OR (see above), `exclude`s must be ignored entirely if the
|
||||
# other type is set to `only`. There is also special behaviour if they're both excludes,
|
||||
# hence why these check against `:include` alone.
|
||||
{{:shorts_behaviour, :exclude}, %{livestream_behaviour: :include}} ->
|
||||
acc ++ [match_filter: "original_url!*=/shorts/"]
|
||||
|
||||
{{:livestream_behaviour, :exclude}, %{shorts_behaviour: :include}} ->
|
||||
acc ++ [match_filter: "!was_live"]
|
||||
|
||||
# Again, since it's an OR, there's a special syntax if they're both excluded
|
||||
# to make it an AND. Note that I'm not checking for the other permutation of
|
||||
# both excluding since this MUST get hit so adding the other version would double up.
|
||||
{{:livestream_behaviour, :exclude}, %{shorts_behaviour: :exclude}} ->
|
||||
acc ++ [match_filter: "!was_live & original_url!*=/shorts/"]
|
||||
|
||||
_ ->
|
||||
acc
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user