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