Refactor modules into contexts (#78)
* [WIP] break out a few contexts, start refactoring fast index modules * [WIP] more contexts, this time around slow indexing and downloads * [WIP] got all tests passing * [WIP] Added moduledocs * Built a genserver to rename old jobs on boot * Added a module naming check; moved things around * Fixed specs
This commit is contained in:
1 parent
c0885cfaf2
commit
3c897e96e6
66 files changed
+1092
-568
No files matched your search
@@ -1,46 +0,0 @@
|
||||
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",
|
||||
"upload_yyyy_mm_dd" => "%(upload_date>%Y)S-%(upload_date>%m)S-%(upload_date>%d)S"
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,74 @@
|
||||
defmodule Pinchflat.Profiles do
|
||||
@moduledoc """
|
||||
The Profiles context.
|
||||
"""
|
||||
|
||||
import Ecto.Query, warn: false
|
||||
|
||||
alias Pinchflat.Repo
|
||||
alias Pinchflat.Sources
|
||||
alias Pinchflat.Profiles.MediaProfile
|
||||
|
||||
@doc """
|
||||
Returns the list of media_profiles.
|
||||
|
||||
Returns [%MediaProfile{}, ...]
|
||||
"""
|
||||
def list_media_profiles do
|
||||
Repo.all(MediaProfile)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a single media_profile.
|
||||
|
||||
Returns %MediaProfile{}. Raises `Ecto.NoResultsError` if the Media profile does not exist.
|
||||
"""
|
||||
def get_media_profile!(id), do: Repo.get!(MediaProfile, id)
|
||||
|
||||
@doc """
|
||||
Creates a media_profile.
|
||||
|
||||
Returns {:ok, %MediaProfile{}} | {:error, %Ecto.Changeset{}}
|
||||
"""
|
||||
def create_media_profile(attrs) do
|
||||
%MediaProfile{}
|
||||
|> MediaProfile.changeset(attrs)
|
||||
|> Repo.insert()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a media_profile.
|
||||
|
||||
Returns {:ok, %MediaProfile{}} | {:error, %Ecto.Changeset{}}
|
||||
"""
|
||||
def update_media_profile(%MediaProfile{} = media_profile, attrs) do
|
||||
media_profile
|
||||
|> MediaProfile.changeset(attrs)
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Deletes a media_profile, all its sources, and all their media items.
|
||||
Can optionally delete the media files.
|
||||
|
||||
Returns {:ok, %MediaProfile{}} | {:error, %Ecto.Changeset{}}
|
||||
"""
|
||||
def delete_media_profile(%MediaProfile{} = media_profile, opts \\ []) do
|
||||
delete_files = Keyword.get(opts, :delete_files, false)
|
||||
|
||||
media_profile
|
||||
|> Sources.list_sources_for()
|
||||
|> Enum.each(fn source ->
|
||||
Sources.delete_source(source, delete_files: delete_files)
|
||||
end)
|
||||
|
||||
Repo.delete(media_profile)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns `%Ecto.Changeset{}`
|
||||
"""
|
||||
def change_media_profile(%MediaProfile{} = media_profile, attrs \\ %{}) do
|
||||
MediaProfile.changeset(media_profile, attrs)
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user