Refresh covers asynchronously

This commit is contained in:
Claudio Ortolina
2025-04-14 10:58:47 +01:00
parent 995773f673
commit a3b6510c40
4 changed files with 47 additions and 10 deletions
+19 -1
View File
@@ -6,7 +6,7 @@ defmodule MusicLibrary.Records do
import Ecto.Query, warn: false
alias MusicLibrary.Records.{ArtistRecord, Cover, Record, SearchParser}
alias MusicLibrary.Repo
alias MusicLibrary.{BackgroundRepo, Repo, Worker}
def essential_fields do
[
@@ -200,6 +200,12 @@ defmodule MusicLibrary.Records do
end
end
def refresh_cover_async(record_id) do
%{"id" => record_id}
|> Worker.RefreshCover.new()
|> BackgroundRepo.insert()
end
def resize_cover(record) do
{:ok, thumb_data} = Cover.resize(record.cover_data)
@@ -267,4 +273,16 @@ defmodule MusicLibrary.Records do
def change_record(%Record{} = record, attrs \\ %{}) do
Record.changeset(record, attrs)
end
def subscribe(record_id) do
Phoenix.PubSub.subscribe(MusicLibrary.PubSub, "records:#{record_id}")
end
def notify_update(record) do
Phoenix.PubSub.broadcast(
MusicLibrary.PubSub,
"records:#{record.id}",
{:update, record}
)
end
end
+2 -1
View File
@@ -4,7 +4,8 @@ defmodule MusicLibrary.Worker.RefreshCover do
@impl Oban.Worker
def perform(%Oban.Job{args: %{"id" => record_id}}) do
record = MusicLibrary.Records.get_record!(record_id)
{:ok, _} = MusicLibrary.Records.refresh_cover(record)
{:ok, new_record} = MusicLibrary.Records.refresh_cover(record)
MusicLibrary.Records.notify_update(new_record)
:ok
end
end
@@ -8,7 +8,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
alias Phoenix.LiveView.JS
@impl true
def mount(_params, _session, socket) do
def mount(%{"id" => record_id}, _session, socket) do
socket =
if static_changed?(socket) do
put_flash(socket, :warning, gettext("The application has been updated, please reload."))
@@ -16,6 +16,10 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
socket
end
if connected?(socket) do
Records.subscribe(record_id)
end
{:ok, socket}
end
@@ -79,14 +83,11 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
end
def handle_event("refresh_cover", %{"id" => id}, socket) do
record = Records.get_record!(id)
case Records.refresh_cover(record) do
{:ok, updated_record} ->
case Records.refresh_cover_async(id) do
{:ok, _worker} ->
{:noreply,
socket
|> put_flash(:info, gettext("Cover refreshed successfully"))
|> assign(:record, updated_record)}
|> put_flash(:info, gettext("Cover scheduled for refresh"))}
{:error, reason} ->
{:noreply,
@@ -103,6 +104,14 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
{:noreply, assign(socket, :record, record)}
end
@impl true
def handle_info({:update, record}, socket) do
{:noreply,
socket
|> put_flash(:info, gettext("Record updated in the background"))
|> assign(:record, record)}
end
def page_title(:show, record) do
artist_names = Enum.map(record.artists, & &1.name)
+10 -1
View File
@@ -344,7 +344,6 @@ msgstr ""
msgid "Refresh LastFm Feed"
msgstr ""
#: lib/music_library_web/live/collection_live/show.ex
#: lib/music_library_web/live/wishlist_live/show.ex
#, elixir-autogen, elixir-format
msgid "Cover refreshed successfully"
@@ -732,3 +731,13 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Meta"
msgstr ""
#: lib/music_library_web/live/collection_live/show.ex
#, elixir-autogen, elixir-format
msgid "Cover scheduled for refresh"
msgstr ""
#: lib/music_library_web/live/collection_live/show.ex
#, elixir-autogen, elixir-format
msgid "Record updated in the background"
msgstr ""