Add logic to backfill scrobbled_tracks

Chokes on duplicate primary keys
This commit is contained in:
Claudio Ortolina
2025-05-31 20:12:36 +01:00
parent a27b38f192
commit 750f0a74d1
4 changed files with 52 additions and 7 deletions
+5 -2
View File
@@ -51,11 +51,14 @@ defmodule LastFm.API do
|> post_request()
end
def get_recent_tracks(to_uts \\ nil, config) do
def get_recent_tracks(opts \\ [], config) do
to_uts = Keyword.get(opts, :to_uts)
limit = Keyword.get(opts, :limit, 50)
params =
config
|> base_params()
|> Keyword.merge(method: "user.getrecenttracks", limit: 50)
|> Keyword.merge(method: "user.getrecenttracks", limit: limit)
params = if to_uts, do: Keyword.put(params, :to, to_uts), else: params
+2 -2
View File
@@ -10,8 +10,8 @@ defmodule LastFm.Import do
:last_fm_data
]
def batch(uts_to) do
with {:ok, tracks} <- LastFm.get_tracks(uts_to) do
def batch(opts) do
with {:ok, tracks} <- LastFm.get_tracks(opts) do
track_params =
tracks
|> Enum.map(fn t -> Map.take(t, @insertable_fields) end)
@@ -0,0 +1,29 @@
defmodule LastFm.Worker.BackfillScrobbledTracks do
use Oban.Worker, queue: :heavy_writes, max_attempts: 3
alias MusicLibrary.BackgroundRepo
@backfill_delay 5
@batch_size 100
@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
{@batch_size, nil} ->
next_to_uts = LastFm.lowest_scrobbled_at_uts()
%{"to_uts" => next_to_uts}
|> new(schedule_in: @backfill_delay)
|> BackgroundRepo.insert()
{other_count, nil} when is_integer(other_count) ->
:ok
error ->
error
end
end
end