Refresh covers asynchronously
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
Reference in New Issue
Block a user