b633d0f75c
* Adds method to improve cleanup of empty directories * resolved bug where source metadata worker could call itself in an infinite loop * Refactored file deletion for media items * Removed useless filesystem data worker * Updated task listing fns to take a record directly * Refactored the way I call workers * Improved some tests
52 lines
1.5 KiB
Elixir
52 lines
1.5 KiB
Elixir
defmodule Pinchflat.Metadata.SourceMetadataStorageWorker do
|
|
@moduledoc false
|
|
|
|
use Oban.Worker,
|
|
queue: :remote_metadata,
|
|
tags: ["media_source", "source_metadata", "remote_metadata"],
|
|
max_attempts: 1,
|
|
# This is the only thing stopping this job from calling itself
|
|
# in an infinite loop.
|
|
unique: [period: 600]
|
|
|
|
alias __MODULE__
|
|
alias Pinchflat.Repo
|
|
alias Pinchflat.Tasks
|
|
alias Pinchflat.Sources
|
|
alias Pinchflat.YtDlp.MediaCollection
|
|
alias Pinchflat.Metadata.MetadataFileHelpers
|
|
|
|
@doc """
|
|
Starts the source metadata storage worker and creates a task for the source.
|
|
|
|
Returns {:ok, %Task{}} | {:error, :duplicate_job} | {:error, %Ecto.Changeset{}}
|
|
"""
|
|
def kickoff_with_task(source, opts \\ []) do
|
|
%{id: source.id}
|
|
|> SourceMetadataStorageWorker.new(opts)
|
|
|> Tasks.create_job_with_task(source)
|
|
end
|
|
|
|
@doc """
|
|
Fetches and stores metadata for a source in the secret metadata location.
|
|
|
|
Returns :ok
|
|
"""
|
|
@impl Oban.Worker
|
|
def perform(%Oban.Job{args: %{"id" => source_id}}) do
|
|
source = Repo.preload(Sources.get_source!(source_id), :metadata)
|
|
{:ok, metadata} = MediaCollection.get_source_metadata(source.original_url)
|
|
|
|
# Since updating a source kicks this job off again, we enforce job uniqueness (above)
|
|
# to once, per source, per x minutes. This is to prevent a job from calling itself
|
|
# in an infinite loop.
|
|
Sources.update_source(source, %{
|
|
metadata: %{
|
|
metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(source, metadata)
|
|
}
|
|
})
|
|
|
|
:ok
|
|
end
|
|
end
|