e1f8e94686
* 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
57 lines
1.5 KiB
Elixir
57 lines
1.5 KiB
Elixir
defmodule Pinchflat.Workers.MediaDownloadWorker do
|
|
@moduledoc false
|
|
|
|
use Oban.Worker,
|
|
queue: :media_fetching,
|
|
unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]],
|
|
tags: ["media_item", "media_fetching"]
|
|
|
|
alias Pinchflat.Repo
|
|
alias Pinchflat.Media
|
|
alias Pinchflat.Tasks
|
|
alias Pinchflat.MediaClient.MediaDownloader
|
|
alias Pinchflat.Workers.FilesystemDataWorker
|
|
|
|
@impl Oban.Worker
|
|
@doc """
|
|
For a given media item, download the media alongside any options.
|
|
Does not download media if its source is set to not download media.
|
|
|
|
Returns :ok | {:ok, %MediaItem{}} | {:error, any, ...any}
|
|
"""
|
|
def perform(%Oban.Job{args: %{"id" => media_item_id}}) do
|
|
media_item =
|
|
media_item_id
|
|
|> Media.get_media_item!()
|
|
|> Repo.preload(:source)
|
|
|
|
# If the source is set to not download media, perform a no-op
|
|
if media_item.source.download_media do
|
|
download_media_and_schedule_jobs(media_item)
|
|
else
|
|
:ok
|
|
end
|
|
end
|
|
|
|
defp download_media_and_schedule_jobs(media_item) do
|
|
case MediaDownloader.download_for_media_item(media_item) do
|
|
{:ok, _} ->
|
|
schedule_filesystem_data_worker(media_item)
|
|
{:ok, media_item}
|
|
|
|
err ->
|
|
err
|
|
end
|
|
end
|
|
|
|
defp schedule_filesystem_data_worker(media_item) do
|
|
%{id: media_item.id}
|
|
|> FilesystemDataWorker.new()
|
|
|> Tasks.create_job_with_task(media_item)
|
|
|> case do
|
|
{:ok, task} -> {:ok, task}
|
|
{:error, :duplicate_job} -> {:ok, :job_exists}
|
|
end
|
|
end
|
|
end
|