diff --git a/lib/music_library/records.ex b/lib/music_library/records.ex index 02745507..e6fd4684 100644 --- a/lib/music_library/records.ex +++ b/lib/music_library/records.ex @@ -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 diff --git a/lib/music_library/worker/refresh_cover.ex b/lib/music_library/worker/refresh_cover.ex index a9c070c9..a803e2e5 100644 --- a/lib/music_library/worker/refresh_cover.ex +++ b/lib/music_library/worker/refresh_cover.ex @@ -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 diff --git a/lib/music_library_web/live/collection_live/show.ex b/lib/music_library_web/live/collection_live/show.ex index 897f14ec..12b78fd6 100644 --- a/lib/music_library_web/live/collection_live/show.ex +++ b/lib/music_library_web/live/collection_live/show.ex @@ -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) diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index fd9f9074..d5ee6d34 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -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 ""