diff --git a/lib/music_library_web/live/wishlist_live/show.ex b/lib/music_library_web/live/wishlist_live/show.ex
index 84f7cc42..676c3c52 100644
--- a/lib/music_library_web/live/wishlist_live/show.ex
+++ b/lib/music_library_web/live/wishlist_live/show.ex
@@ -1,6 +1,8 @@
defmodule MusicLibraryWeb.WishlistLive.Show do
use MusicLibraryWeb, :live_view
+ require Logger
+
import MusicLibraryWeb.RecordComponents,
only: [
artist_links: 1,
@@ -18,7 +20,8 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
alias MusicLibrary.Chats
alias MusicLibrary.OnlineStoreTemplates
- alias MusicLibrary.{Records, RecordSets}
+ alias MusicLibrary.{Records, RecordSets, ScrobbleActivity}
+ alias MusicLibraryWeb.ErrorMessages
alias MusicLibraryWeb.LiveHelpers.RecordActions
@impl true
@@ -45,6 +48,19 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
<.button_group>
+ <.button
+ :if={@can_scrobble? and @record.selected_release_id}
+ variant="soft"
+ phx-click="scrobble_release"
+ >
+ {gettext("Scrobble release")}
+ <.icon
+ name="hero-play"
+ class="icon"
+ aria-hidden="true"
+ data-slot="icon"
+ />
+
<.button
variant="soft"
phx-click={MusicLibraryWeb.Components.Chat.open("record-chat-sheet")}
@@ -319,6 +335,7 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
{:ok,
socket
|> assign(current_section: :wishlist)
+ |> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?())
|> assign(:current_date, current_date)}
end
@@ -380,6 +397,44 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
RecordActions.extract_colors(socket)
end
+ def handle_event("scrobble_release", _params, socket) do
+ record = socket.assigns.record
+
+ {:noreply,
+ start_async(socket, :scrobble_release, fn ->
+ with {:ok, release} <- MusicBrainz.get_release(record.selected_release_id) do
+ release_with_tracks = MusicBrainz.Release.from_api_response(release)
+
+ ScrobbleActivity.scrobble_release(release_with_tracks, :finished_at, DateTime.utc_now())
+ end
+ end)}
+ end
+
+ @impl true
+ def handle_async(:scrobble_release, {:ok, {:ok, _result}}, socket) do
+ {:noreply, put_toast(socket, :info, gettext("Release scrobbled successfully"))}
+ end
+
+ def handle_async(:scrobble_release, {:ok, {:error, reason}}, socket) do
+ {:noreply,
+ put_toast(
+ socket,
+ :error,
+ gettext("Error scrobbling release") <> ": " <> ErrorMessages.friendly_message(reason)
+ )}
+ end
+
+ def handle_async(:scrobble_release, {:exit, reason}, socket) do
+ Logger.error("Scrobble release failed: #{inspect(reason)}")
+
+ {:noreply,
+ put_toast(
+ socket,
+ :error,
+ gettext("Error scrobbling release") <> ": " <> ErrorMessages.friendly_message(reason)
+ )}
+ end
+
@impl true
def handle_info({MusicLibraryWeb.Components.RecordForm, {:saved, record}}, socket) do
{:noreply,
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index f53846e2..7b09ebbc 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -640,12 +640,14 @@ msgstr ""
#: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/collection_live/show.ex
+#: lib/music_library_web/live/wishlist_live/show.ex
#, elixir-autogen, elixir-format
msgid "Error scrobbling release"
msgstr ""
#: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/collection_live/show.ex
+#: lib/music_library_web/live/wishlist_live/show.ex
#, elixir-autogen, elixir-format
msgid "Release scrobbled successfully"
msgstr ""
@@ -662,6 +664,7 @@ msgstr ""
#: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/collection_live/show.ex
+#: lib/music_library_web/live/wishlist_live/show.ex
#, elixir-autogen, elixir-format
msgid "Scrobble release"
msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po
index feaf2219..f622bc6f 100644
--- a/priv/gettext/en/LC_MESSAGES/default.po
+++ b/priv/gettext/en/LC_MESSAGES/default.po
@@ -640,12 +640,14 @@ msgstr ""
#: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/collection_live/show.ex
+#: lib/music_library_web/live/wishlist_live/show.ex
#, elixir-autogen, elixir-format
msgid "Error scrobbling release"
msgstr ""
#: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/collection_live/show.ex
+#: lib/music_library_web/live/wishlist_live/show.ex
#, elixir-autogen, elixir-format
msgid "Release scrobbled successfully"
msgstr ""
@@ -662,6 +664,7 @@ msgstr ""
#: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/collection_live/show.ex
+#: lib/music_library_web/live/wishlist_live/show.ex
#, elixir-autogen, elixir-format
msgid "Scrobble release"
msgstr ""