mirror of
https://github.com/kieraneglin/pinchflat.git
synced 2026-01-23 02:24:24 +00:00
[Enhancement] Run fast indexing on source creation and at higher priority (#583)
* Updated default job priorities for downloading queue * Added the ability to set priority to various downloading helpers * Sets sources to fast index on creation
This commit is contained in:
parent
704d29dc7e
commit
62214b80a6
12 changed files with 114 additions and 61 deletions
|
|
@ -27,13 +27,15 @@ defmodule Pinchflat.Downloading.DownloadingHelpers do
|
|||
|
||||
Returns :ok
|
||||
"""
|
||||
def enqueue_pending_download_tasks(%Source{download_media: true} = source) do
|
||||
def enqueue_pending_download_tasks(source, job_opts \\ [])
|
||||
|
||||
def enqueue_pending_download_tasks(%Source{download_media: true} = source, job_opts) do
|
||||
source
|
||||
|> Media.list_pending_media_items_for()
|
||||
|> Enum.each(&MediaDownloadWorker.kickoff_with_task/1)
|
||||
|> Enum.each(&MediaDownloadWorker.kickoff_with_task(&1, %{}, job_opts))
|
||||
end
|
||||
|
||||
def enqueue_pending_download_tasks(%Source{download_media: false}) do
|
||||
def enqueue_pending_download_tasks(%Source{download_media: false}, _job_opts) do
|
||||
:ok
|
||||
end
|
||||
|
||||
|
|
@ -55,13 +57,13 @@ defmodule Pinchflat.Downloading.DownloadingHelpers do
|
|||
|
||||
Returns {:ok, %Task{}} | {:error, :should_not_download} | {:error, any()}
|
||||
"""
|
||||
def kickoff_download_if_pending(%MediaItem{} = media_item) do
|
||||
def kickoff_download_if_pending(%MediaItem{} = media_item, job_opts \\ []) do
|
||||
media_item = Repo.preload(media_item, :source)
|
||||
|
||||
if media_item.source.download_media && Media.pending_download?(media_item) do
|
||||
Logger.info("Kicking off download for media item ##{media_item.id} (#{media_item.media_id})")
|
||||
|
||||
MediaDownloadWorker.kickoff_with_task(media_item)
|
||||
MediaDownloadWorker.kickoff_with_task(media_item, %{}, job_opts)
|
||||
else
|
||||
{:error, :should_not_download}
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ defmodule Pinchflat.Downloading.MediaDownloadWorker do
|
|||
|
||||
use Oban.Worker,
|
||||
queue: :media_fetching,
|
||||
priority: 5,
|
||||
unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]],
|
||||
tags: ["media_item", "media_fetching", "show_in_dashboard"]
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpers do
|
|||
Returns [%MediaItem{}] where each item is a new media item that was created _but not necessarily
|
||||
downloaded_.
|
||||
"""
|
||||
def kickoff_download_tasks_from_youtube_rss_feed(%Source{} = source) do
|
||||
def index_and_kickoff_downloads(%Source{} = source) do
|
||||
# The media_profile is needed to determine the quality options to _then_ determine a more
|
||||
# accurate predicted filepath
|
||||
source = Repo.preload(source, [:media_profile])
|
||||
|
|
@ -53,6 +53,7 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpers do
|
|||
Enum.map(new_media_ids, fn media_id ->
|
||||
case create_media_item_from_media_id(source, media_id) do
|
||||
{:ok, media_item} ->
|
||||
DownloadingHelpers.kickoff_download_if_pending(media_item, priority: 0)
|
||||
media_item
|
||||
|
||||
err ->
|
||||
|
|
@ -61,7 +62,9 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpers do
|
|||
end
|
||||
end)
|
||||
|
||||
DownloadingHelpers.enqueue_pending_download_tasks(source)
|
||||
# Pick up any stragglers. Intentionally has a lower priority than the per-media item
|
||||
# kickoff above
|
||||
DownloadingHelpers.enqueue_pending_download_tasks(source, priority: 1)
|
||||
|
||||
Enum.filter(maybe_new_media_items, & &1)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ defmodule Pinchflat.FastIndexing.FastIndexingWorker do
|
|||
|
||||
Order of operations:
|
||||
1. FastIndexingWorker (this module) periodically checks the YouTube RSS feed for new media.
|
||||
with `FastIndexingHelpers.kickoff_download_tasks_from_youtube_rss_feed`
|
||||
2. If the above `kickoff_download_tasks_from_youtube_rss_feed` finds new media items in the RSS feed,
|
||||
with `FastIndexingHelpers.index_and_kickoff_downloads`
|
||||
2. If the above `index_and_kickoff_downloads` finds new media items in the RSS feed,
|
||||
it indexes them with a yt-dlp call to create the media item records then kicks off downloading
|
||||
tasks (MediaDownloadWorker) for any new media items _that should be downloaded_.
|
||||
3. Once downloads are kicked off, this worker sends a notification to the apprise server if applicable
|
||||
|
|
@ -67,7 +67,7 @@ defmodule Pinchflat.FastIndexing.FastIndexingWorker do
|
|||
|
||||
new_media_items =
|
||||
source
|
||||
|> FastIndexingHelpers.kickoff_download_tasks_from_youtube_rss_feed()
|
||||
|> FastIndexingHelpers.index_and_kickoff_downloads()
|
||||
|> Enum.filter(&Media.pending_download?(&1))
|
||||
|
||||
if source.download_media do
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ defmodule Pinchflat.SlowIndexing.SlowIndexingHelpers do
|
|||
def kickoff_indexing_task(%Source{} = source, job_args \\ %{}, job_opts \\ []) do
|
||||
job_offset_seconds = if job_args[:force], do: 0, else: calculate_job_offset_seconds(source)
|
||||
|
||||
Tasks.delete_pending_tasks_for(source, "FastIndexingWorker")
|
||||
Tasks.delete_pending_tasks_for(source, "MediaCollectionIndexingWorker", include_executing: true)
|
||||
|
||||
MediaCollectionIndexingWorker.kickoff_with_task(source, job_args, job_opts ++ [schedule_in: job_offset_seconds])
|
||||
|
|
|
|||
|
|
@ -300,6 +300,10 @@ defmodule Pinchflat.Sources do
|
|||
%{__meta__: %{state: :built}} ->
|
||||
SlowIndexingHelpers.kickoff_indexing_task(source)
|
||||
|
||||
if Ecto.Changeset.get_field(changeset, :fast_index) do
|
||||
FastIndexingHelpers.kickoff_indexing_task(source)
|
||||
end
|
||||
|
||||
# If the record has been persisted, only run indexing if the
|
||||
# indexing frequency has been changed and is now greater than 0
|
||||
%{__meta__: %{state: :loaded}} ->
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue