From 249fe712feddb3b511fd6e496fee03a1dcb0ba43 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Tue, 11 Nov 2025 08:15:38 +0000 Subject: [PATCH] Enable scrobbling selected tracks in scrobble anything view --- lib/music_library_web/components/release.ex | 16 +++---- .../live/scrobble_live/show.ex | 47 ++++++++++++++++++- .../live/scrobble_live/show.html.heex | 10 ++-- priv/gettext/default.pot | 4 +- priv/gettext/en/LC_MESSAGES/default.po | 4 +- 5 files changed, 66 insertions(+), 15 deletions(-) diff --git a/lib/music_library_web/components/release.ex b/lib/music_library_web/components/release.ex index 7e6548de..00ade70c 100644 --- a/lib/music_library_web/components/release.ex +++ b/lib/music_library_web/components/release.ex @@ -313,6 +313,14 @@ defmodule MusicLibraryWeb.Components.Release do {:noreply, socket |> put_toast(:error, gettext("Error scrobbling selected tracks"))} end + def scrobble_button_label(selected_tracks) do + if MapSet.size(selected_tracks) > 0 do + gettext("Scrobble selected tracks") + else + gettext("Scrobble release") + end + end + defp medium_duration(medium) do medium |> MusicBrainz.Release.medium_duration() @@ -326,12 +334,4 @@ defmodule MusicLibraryWeb.Components.Release do medium.title end end - - defp scrobble_button_label(selected_tracks) do - if MapSet.size(selected_tracks) > 0 do - gettext("Scrobble selected tracks") - else - gettext("Scrobble release") - end - end end diff --git a/lib/music_library_web/live/scrobble_live/show.ex b/lib/music_library_web/live/scrobble_live/show.ex index 12940e56..06a0a363 100644 --- a/lib/music_library_web/live/scrobble_live/show.ex +++ b/lib/music_library_web/live/scrobble_live/show.ex @@ -1,7 +1,7 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do use MusicLibraryWeb, :live_view - import(MusicLibraryWeb.Components.Release, only: [medium: 1]) + import(MusicLibraryWeb.Components.Release, only: [medium: 1, scrobble_button_label: 1]) alias MusicLibrary.ScrobbleActivity @@ -12,7 +12,8 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do current_section: :scrobble, release: nil, can_scrobble: ScrobbleActivity.can_scrobble?(), - page_title: "Scrobble Release" + page_title: "Scrobble Release", + selected_tracks: MapSet.new() )} end @@ -80,4 +81,46 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do )} end end + + def handle_event("scrobble_selected_tracks", _params, socket) do + release_with_tracks = socket.assigns.release + selected_track_ids = socket.assigns.selected_tracks + + if MapSet.size(selected_track_ids) == 0 do + {:noreply, socket |> put_toast(:error, gettext("No tracks selected"))} + else + case ScrobbleActivity.scrobble_tracks( + selected_track_ids, + release_with_tracks, + finished_at: DateTime.utc_now() + ) do + {:ok, _} -> + {:noreply, + socket + |> assign(:selected_tracks, MapSet.new()) + |> put_toast(:info, gettext("Selected tracks scrobbled successfully"))} + + {:error, reason} -> + {:noreply, + socket + |> put_toast( + :error, + gettext("Error scrobbling selected tracks") <> "," <> inspect(reason) + )} + end + end + end + + def handle_event("toggle_track", %{"track-id" => track_id}, socket) do + selected_tracks = socket.assigns.selected_tracks + + updated_tracks = + if MapSet.member?(selected_tracks, track_id) do + MapSet.delete(selected_tracks, track_id) + else + MapSet.put(selected_tracks, track_id) + end + + {:noreply, assign(socket, :selected_tracks, updated_tracks)} + end end diff --git a/lib/music_library_web/live/scrobble_live/show.html.heex b/lib/music_library_web/live/scrobble_live/show.html.heex index b29dd409..76c68e8d 100644 --- a/lib/music_library_web/live/scrobble_live/show.html.heex +++ b/lib/music_library_web/live/scrobble_live/show.html.heex @@ -81,10 +81,14 @@ <.button :if={@can_scrobble} - phx-click="scrobble_release" + phx-click={ + if MapSet.size(@selected_tracks) > 0, + do: "scrobble_selected_tracks", + else: "scrobble_release" + } size="sm" > - {gettext("Scrobble release")} + {scrobble_button_label(@selected_tracks)} @@ -94,7 +98,7 @@ already_scrobbled={false} medium={medium} release_artists={@release.artists} - selected_tracks={MapSet.new()} + selected_tracks={@selected_tracks} media_count={MusicBrainz.Release.media_count(@release)} myself={nil} /> diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 6b6debb5..0147e809 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -761,7 +761,6 @@ msgid "Scrobbling..." msgstr "" #: lib/music_library_web/components/release.ex -#: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "Scrobble release" msgstr "" @@ -772,16 +771,19 @@ msgid "Scrobble selected tracks" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Selected tracks scrobbled successfully" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Error scrobbling selected tracks" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "No tracks selected" msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 27cd3766..c5ea501a 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -761,7 +761,6 @@ msgid "Scrobbling..." msgstr "" #: lib/music_library_web/components/release.ex -#: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "Scrobble release" msgstr "" @@ -772,16 +771,19 @@ msgid "Scrobble selected tracks" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Selected tracks scrobbled successfully" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Error scrobbling selected tracks" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "No tracks selected" msgstr ""