Move BackfillScrobbledTracks worker under MusicLibrary namespace

This commit is contained in:
Claudio Ortolina
2026-03-28 08:05:02 +00:00
parent 4e2e0605ed
commit 47f8eddff1
4 changed files with 29 additions and 24 deletions
+1 -16
View File
@@ -3,8 +3,7 @@ defmodule LastFm do
Last.fm API facade for scrobbling and listening history.
"""
alias LastFm.{API, Scrobble, Track, Worker}
alias MusicLibrary.{BackgroundRepo, Repo}
alias LastFm.{API, Scrobble, Track}
@spec get_tracks(keyword()) :: {:ok, [Track.t()]} | {:error, term()}
def get_tracks(opts) do
@@ -12,20 +11,6 @@ defmodule LastFm do
API.get_recent_tracks(opts, last_fm_config)
end
@spec lowest_scrobbled_at_uts() :: integer() | nil
def lowest_scrobbled_at_uts do
Repo.aggregate(Track, :min, :scrobbled_at_uts)
end
@spec backfill_scrobbled_tracks() :: {:ok, Oban.Job.t()} | {:error, Ecto.Changeset.t()}
def backfill_scrobbled_tracks do
to_uts = lowest_scrobbled_at_uts()
%{"to_uts" => to_uts}
|> Worker.BackfillScrobbledTracks.new()
|> BackgroundRepo.insert()
end
@spec get_artist_info(String.t(), String.t()) :: {:ok, LastFm.Artist.t()} | {:error, term()}
def get_artist_info(musicbrainz_id, name) do
last_fm_config = last_fm_config()
+17 -1
View File
@@ -13,12 +13,14 @@ defmodule MusicLibrary.ListeningStats do
alias MusicLibrary.{
Artists,
BackgroundRepo,
Collection,
ListeningStats.Refresh,
Records.ArtistRecord,
Records.Record,
Repo,
Wishlist
Wishlist,
Worker
}
@pagination Application.compile_env!(:music_library, :pagination)
@@ -79,6 +81,20 @@ defmodule MusicLibrary.ListeningStats do
Refresh.refresh()
end
@spec lowest_scrobbled_at_uts() :: integer() | nil
def lowest_scrobbled_at_uts do
Repo.aggregate(Track, :min, :scrobbled_at_uts)
end
@spec backfill_scrobbled_tracks() :: {:ok, Oban.Job.t()} | {:error, Ecto.Changeset.t()}
def backfill_scrobbled_tracks do
to_uts = lowest_scrobbled_at_uts()
%{"to_uts" => to_uts}
|> Worker.BackfillScrobbledTracks.new()
|> BackgroundRepo.insert()
end
@spec artist_play_count(String.t()) :: non_neg_integer()
def artist_play_count(artist_musicbrainz_id) do
from(t in Track,
@@ -1,19 +1,23 @@
defmodule LastFm.Worker.BackfillScrobbledTracks do
defmodule MusicLibrary.Worker.BackfillScrobbledTracks do
@moduledoc """
Oban worker that backfills scrobbled tracks from Last.fm in batches.
Self-chaining: after importing a full batch, enqueues itself with the
next `to_uts` timestamp to continue backfilling.
"""
use Oban.Worker, queue: :heavy_writes, max_attempts: 3
alias MusicLibrary.BackgroundRepo
alias MusicLibrary.{BackgroundRepo, ListeningStats}
@backfill_delay 1
@batch_size 200
@impl Oban.Worker
def perform(%{args: %{"to_uts" => to_uts}}) do
# importing is an all or nothing operation, which means that we can
# use the returning count to determine if we reached the end of the backfilling
# process.
case LastFm.Import.batch(to_uts: to_uts, limit: @batch_size) do
{:ok, @batch_size} ->
next_to_uts = LastFm.lowest_scrobbled_at_uts()
next_to_uts = ListeningStats.lowest_scrobbled_at_uts()
%{"to_uts" => next_to_uts}
|> new(schedule_in: @backfill_delay)