Enable artists maintenance tasks

This commit is contained in:
Claudio Ortolina
2025-11-07 17:14:45 +00:00
parent 3911ea05bf
commit 4a5ed2de1a
8 changed files with 140 additions and 6 deletions
+44
View File
@@ -100,6 +100,50 @@ defmodule MusicLibrary.Artists do
end
end
def refresh_musicbrainz_data(artist_id) do
with {:ok, musicbrainz_artist} <- MusicBrainz.get_artist(artist_id) do
get_artist_info!(artist_id)
|> ArtistInfo.changeset(%{musicbrainz_data: musicbrainz_artist.musicbrainz_data})
|> Repo.update()
end
end
def refresh_musicbrainz_data_async(artist_info) do
meta = %{}
params = %{"id" => artist_info.id}
params
|> Worker.ArtistRefreshMusicBrainzData.new(meta: meta)
|> BackgroundRepo.insert()
end
def refresh_discogs_data(artist_id) do
artist_info = get_artist_info!(artist_id)
if discogs_id = ArtistInfo.discogs_id(artist_info) do
case Discogs.get_artist(discogs_id) do
{:ok, discogs_artist} ->
artist_info
|> ArtistInfo.changeset(%{discogs_data: discogs_artist})
|> Repo.update()
error ->
error
end
else
{:ok, artist_info}
end
end
def refresh_discogs_data_async(artist_info) do
meta = %{}
params = %{"id" => artist_info.id}
params
|> Worker.ArtistRefreshDiscogsData.new(meta: meta)
|> BackgroundRepo.insert()
end
def create_artist_info(attrs) do
%ArtistInfo{}
|> ArtistInfo.changeset(attrs)
+7
View File
@@ -71,4 +71,11 @@ defmodule MusicLibrary.Artists.ArtistInfo do
def external_links(artist_info),
do: ExternalLink.external_links(artist_info.musicbrainz_data, @external_link_patterns)
def discogs_id(artist_info) do
case artist_info.discogs_data do
%{"id" => discogs_id} -> discogs_id
_ -> nil
end
end
end
+48
View File
@@ -0,0 +1,48 @@
defmodule MusicLibrary.Artists.Batch do
import Ecto.Query
alias MusicLibrary.Artists
alias MusicLibrary.Artists.ArtistInfo
alias MusicLibrary.Repo
require Logger
def refresh_musicbrainz_data do
run_on_all_artist_infos(fn artist_info ->
Artists.refresh_musicbrainz_data_async(artist_info)
end)
end
def refresh_discogs_data do
run_on_all_artist_infos(fn artist_info ->
Artists.refresh_discogs_data_async(artist_info)
end)
end
defp run_on_all_artist_infos(fun) do
q = from(r in ArtistInfo)
stream = Repo.stream(q, max_rows: 50)
Repo.transaction(
fn ->
Enum.reduce(stream, [], fn artist_info, acc ->
case fun.(artist_info) do
{:error, reason} ->
Logger.error(
"Failed to run function on artist_info #{artist_info.id} with #{inspect(reason)}"
)
[artist_info.id | acc]
:ok ->
acc
{:ok, _artist_info} ->
acc
end
end)
end,
timeout: :infinity
)
end
end
@@ -0,0 +1,10 @@
defmodule MusicLibrary.Worker.ArtistRefreshDiscogsData do
use Oban.Worker, queue: :discogs, max_attempts: 3
@impl Oban.Worker
def perform(%Oban.Job{args: %{"id" => artist_info_id}}) do
MusicLibrary.Artists.refresh_discogs_data(artist_info_id)
Process.sleep(100)
end
end
@@ -0,0 +1,10 @@
defmodule MusicLibrary.Worker.ArtistRefreshMusicBrainzData do
use Oban.Worker, queue: :music_brainz, max_attempts: 3
@impl Oban.Worker
def perform(%Oban.Job{args: %{"id" => artist_info_id}}) do
MusicLibrary.Artists.refresh_musicbrainz_data(artist_info_id)
Process.sleep(500)
end
end
@@ -3,7 +3,8 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do
require Logger
alias MusicLibrary.Records.Batch
alias MusicLibrary.Artists
alias MusicLibrary.Records
alias MusicLibrary.Repo
def mount(_params, _session, socket) do
@@ -16,7 +17,7 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do
end
def handle_event("refresh_records_musicbrainz_data", _params, socket) do
Batch.refresh_musicbrainz_data()
Records.Batch.refresh_musicbrainz_data()
{:noreply,
socket
@@ -24,7 +25,23 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do
end
def handle_event("generate_record_embeddings", _params, socket) do
Batch.generate_embeddings()
Records.Batch.generate_embeddings()
{:noreply,
socket
|> put_toast(:info, gettext("Operation started in the background."))}
end
def handle_event("refresh_artists_musicbrainz_data", _params, socket) do
Artists.Batch.refresh_musicbrainz_data()
{:noreply,
socket
|> put_toast(:info, gettext("Operation started in the background."))}
end
def handle_event("refresh_artists_discogs_data", _params, socket) do
Artists.Batch.refresh_discogs_data()
{:noreply,
socket
@@ -48,7 +48,6 @@
<ul class="mt-4">
<li class="space-y-4">
<.button
disabled
type="button"
phx-click="refresh_artists_musicbrainz_data"
data-confirm={
@@ -60,7 +59,6 @@
{gettext("Refresh MusicBrainz data")}
</.button>
<.button
disabled
type="button"
phx-click="refresh_artists_discogs_data"
data-confirm={