From 35049e2844e8535f40217154dac65d02678eb5ec Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sat, 27 Sep 2025 11:37:41 +0300 Subject: [PATCH] Simplify custom scrobble page --- .../live/scrobble_live/show.ex | 130 +++----- .../live/scrobble_live/show.html.heex | 303 +++++++----------- priv/gettext/default.pot | 76 +---- priv/gettext/en/LC_MESSAGES/default.po | 76 +---- 4 files changed, 164 insertions(+), 421 deletions(-) diff --git a/lib/music_library_web/live/scrobble_live/show.ex b/lib/music_library_web/live/scrobble_live/show.ex index 4eb78916..5dab4bfe 100644 --- a/lib/music_library_web/live/scrobble_live/show.ex +++ b/lib/music_library_web/live/scrobble_live/show.ex @@ -4,82 +4,29 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do alias MusicLibrary.ScrobbleActivity @impl true - def mount(%{"release_id" => release_id}, _session, socket) do + def mount(_params, _session, socket) do {:ok, assign(socket, current_section: :scrobble, - release_id: release_id, release: nil, - loading: true, can_scrobble: ScrobbleActivity.can_scrobble?(), - scrobble_form: %{ - "type" => "finished_at", - "finished_at_date" => Date.utc_today() |> Date.to_string(), - "finished_at_time" => Time.utc_now() |> Time.truncate(:second) |> Time.to_string(), - "started_at_date" => Date.utc_today() |> Date.to_string(), - "started_at_time" => Time.utc_now() |> Time.truncate(:second) |> Time.to_string() - }, page_title: "Scrobble Release" )} end @impl true def handle_params(params, _url, socket) do - {:noreply, apply_action(socket, socket.assigns.live_action, params)} + apply_action(socket, socket.assigns.live_action, params) end - defp apply_action(socket, :show, _params) do - send(self(), :fetch_release) - socket - end - - @impl true - def handle_event("update_scrobble_form", %{"scrobble" => scrobble_params}, socket) do - {:noreply, assign(socket, scrobble_form: scrobble_params)} - end - - def handle_event("scrobble_release", _params, socket) do - case perform_scrobble(socket.assigns.release, :all, socket.assigns.scrobble_form) do - {:ok, _result} -> - {:noreply, - socket - |> put_flash(:info, "Release scrobbled successfully!") - |> push_navigate(to: ~p"/scrobble")} - - {:error, reason} -> - {:noreply, put_flash(socket, :error, "Failed to scrobble release: #{inspect(reason)}")} - end - end - - def handle_event("scrobble_medium", %{"medium_number" => medium_number_str}, socket) do - {medium_number, ""} = Integer.parse(medium_number_str) - - case perform_scrobble( - socket.assigns.release, - {:medium, medium_number}, - socket.assigns.scrobble_form - ) do - {:ok, _result} -> - {:noreply, - socket - |> put_flash(:info, "Medium scrobbled successfully!") - |> push_navigate(to: ~p"/scrobble")} - - {:error, reason} -> - {:noreply, put_flash(socket, :error, "Failed to scrobble medium: #{inspect(reason)}")} - end - end - - @impl true - def handle_info(:fetch_release, socket) do - case MusicBrainz.get_release(socket.assigns.release_id) do + defp apply_action(socket, :show, %{"release_id" => release_id}) do + case MusicBrainz.get_release(release_id) do {:ok, release} -> release = MusicBrainz.Release.from_api_response(release) {:noreply, assign(socket, release: release, - loading: false, page_title: "Scrobble: #{release.title}" )} @@ -91,48 +38,47 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do end end - defp perform_scrobble(release, scope, scrobble_form) do - datetime_opts = build_datetime_opts(scrobble_form) + @impl true + def handle_event("scrobble_release", _params, socket) do + case ScrobbleActivity.scrobble_release(socket.assigns.release, + finished_at: DateTime.utc_now() + ) do + {:ok, _} -> + {:noreply, + socket + |> put_toast(:info, gettext("Release scrobbled successfully"))} - case scope do - :all -> - ScrobbleActivity.scrobble_release(release, datetime_opts) - - {:medium, medium_number} -> - ScrobbleActivity.scrobble_medium(medium_number, release, datetime_opts) + {:error, reason} -> + {:noreply, + socket + |> put_toast( + :error, + gettext("Error scrobbling release") <> "," <> inspect(reason) + )} end end - defp build_datetime_opts(%{ - "type" => "finished_at", - "finished_at_date" => date, - "finished_at_time" => time - }) do - with {:ok, date} <- Date.from_iso8601(date), - {:ok, time} <- Time.from_iso8601(time), - datetime <- DateTime.new!(date, time, "Etc/UTC") do - [finished_at: datetime] - else - _ -> [finished_at: DateTime.utc_now()] + def handle_event("scrobble_medium", %{"medium_number" => number}, socket) do + number = String.to_integer(number) + + case ScrobbleActivity.scrobble_medium(number, socket.assigns.release, + finished_at: DateTime.utc_now() + ) do + {:ok, _} -> + {:noreply, + socket + |> put_toast(:info, gettext("Disc scrobbled successfully"))} + + {:error, reason} -> + {:noreply, + socket + |> put_toast( + :error, + gettext("Error scrobbling disc") <> "," <> inspect(reason) + )} end end - defp build_datetime_opts(%{ - "type" => "started_at", - "started_at_date" => date, - "started_at_time" => time - }) do - with {:ok, date} <- Date.from_iso8601(date), - {:ok, time} <- Time.from_iso8601(time), - datetime <- DateTime.new!(date, time, "Etc/UTC") do - [started_at: datetime] - else - _ -> [started_at: DateTime.utc_now()] - end - end - - defp build_datetime_opts(_), do: [finished_at: DateTime.utc_now()] - defp format_duration(nil), do: "Unknown" defp format_duration(milliseconds) when is_integer(milliseconds) do 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 47d06191..7824458f 100644 --- a/lib/music_library_web/live/scrobble_live/show.html.heex +++ b/lib/music_library_web/live/scrobble_live/show.html.heex @@ -1,30 +1,8 @@
-
- <.icon name="hero-arrow-path" class="h-8 w-8 animate-spin mx-auto text-gray-400" /> -

{gettext("Loading release details...")}

-
-
+
- <.link navigate={~p"/scrobble"} class="flex-shrink-0"> - <.button variant="ghost" size="sm"> - <.icon name="hero-arrow-left" class="h-4 w-4 mr-2" /> {gettext("Back to Search")} - - - -
-

- {@release.title} -

-

- - by {@release.artists |> Enum.map(& &1.name) |> Enum.join(", ")} - - - {@release.date} - -

-
+
-
-
-
-
-

{gettext("Release Information")}

-
-
- {"Cover -
-
-
-
- - {gettext("Release Date:")} - -
{@release.date} -
-
- - {gettext("Country:")} - -
{@release.country} -
-
- - {gettext("Barcode:")} - -
{@release.barcode} -
-
- - {gettext("Catalog Number:")} - -
{@release.catalog_number} -
-
-
-
+
+
+

+ {@release.title} +

+

+ + by {@release.artists |> Enum.map(& &1.name) |> Enum.join(", ")} + + + {@release.date} + +

+
+
+ {"Cover
-
- -
-
-

{gettext("Tracks")}

-
-
-
-

1} class="font-medium"> - Medium {medium.number} - - - {medium.title} - - - ({medium.format}) - -

-

- {gettext("Tracks")} - - ({medium.format}) - -

- <.button - :if={@can_scrobble} - size="sm" - variant="outline" - phx-click="scrobble_medium" - phx-value-medium_number={medium.number} - > - <.icon name="hero-play" class="h-3 w-3 mr-1" /> {gettext("Scrobble Medium")} - -
- -
-
-
- - {track.position} - -
-

- {track.title} -

-

- {track.artists |> Enum.map(& &1.name) |> Enum.join(", ")} -

-
-
- - {format_duration(track.length)} - -
-
+
+
+
+ + {gettext("Release Date:")} + +
{@release.date} +
+
+ + {gettext("Country:")} + +
{@release.country} +
+
+ + {gettext("Barcode:")} + +
{@release.barcode} +
+
+ + {gettext("Catalog Number:")} + +
{@release.catalog_number}
+
-
-
-
-

{gettext("Scrobble Options")}

+
+
+
+

{gettext("Tracks")}

- <.form - for={%{}} - as={:scrobble} - phx-change="update_scrobble_form" - class="space-y-4" - > - <.select - name="type" - label={gettext("Scrobble timing")} - value={@scrobble_form["type"]} - options={[ - {gettext("Just finished listening"), "finished_at"}, - {gettext("Started listening at"), "started_at"} - ]} - /> + <.button + :if={@can_scrobble} + phx-click="scrobble_release" + size="sm" + > + {gettext("Scrobble release")} + +
-
- <.input - type="date" - name="finished_at_date" - label={gettext("Finished Date")} - value={@scrobble_form["finished_at_date"]} - /> - <.input - type="time" - name="finished_at_time" - label={gettext("Finished Time")} - value={@scrobble_form["finished_at_time"]} - /> -
-
- <.input - type="date" - name="started_at_date" - label={gettext("Started Date")} - value={@scrobble_form["started_at_date"]} - /> - <.input - type="time" - name="started_at_time" - label={gettext("Started Time")} - value={@scrobble_form["started_at_time"]} - /> -
- - -
+
+
+
+

1} class="font-medium"> + Medium {medium.number} + + - {medium.title} + + + ({medium.format}) + +

+

+ {gettext("Tracks")} + + ({medium.format}) + +

<.button - phx-click="scrobble_release" - class="w-full" - size="lg" + :if={@can_scrobble} + size="sm" + variant="outline" + phx-click="scrobble_medium" + phx-value-medium_number={medium.number} > - <.icon name="hero-play" class="h-4 w-4 mr-2" /> {gettext( - "Scrobble Entire Release" - )} + {gettext("Scrobble disc")} +
-

- {gettext("This will scrobble all tracks from all media in sequence")} -

+
+
+
+ + {track.position} + +
+

+ {track.title} +

+

+ {track.artists |> Enum.map(& &1.name) |> Enum.join(", ")} +

+
+
+ + {format_duration(track.length)} + +
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 074ff545..78ced8bd 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -739,11 +739,13 @@ msgid "Successfully connected your Last.fm account" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Error scrobbling release" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Release scrobbled successfully" msgstr "" @@ -760,21 +762,25 @@ 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 "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Disc 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 disc" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "Scrobble disc" msgstr "" @@ -1435,11 +1441,6 @@ msgstr[1] "" msgid "Releases for \"%{title}\"" msgstr "" -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Back to Search" -msgstr "" - #: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "Barcode:" @@ -1455,76 +1456,11 @@ msgstr "" msgid "Country:" msgstr "" -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Finished Date" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Finished Time" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Just finished listening" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Loading release details..." -msgstr "" - #: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "Release Date:" msgstr "" -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Release Information" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Scrobble Entire Release" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Scrobble Medium" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Scrobble Options" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Scrobble timing" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Started Date" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Started Time" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Started listening at" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "This will scrobble all tracks from all media in sequence" -msgstr "" - #: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "You need to connect your Last.fm account to scrobble. Please set up your Last.fm session key in the settings." diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index bbb00447..d428018b 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -739,11 +739,13 @@ msgid "Successfully connected your Last.fm account" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Error scrobbling release" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Release scrobbled successfully" msgstr "" @@ -760,21 +762,25 @@ 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 "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format msgid "Disc scrobbled successfully" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.ex #, elixir-autogen, elixir-format, fuzzy msgid "Error scrobbling disc" msgstr "" #: lib/music_library_web/components/release.ex +#: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format, fuzzy msgid "Scrobble disc" msgstr "" @@ -1435,11 +1441,6 @@ msgstr[1] "" msgid "Releases for \"%{title}\"" msgstr "" -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Back to Search" -msgstr "" - #: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "Barcode:" @@ -1455,76 +1456,11 @@ msgstr "" msgid "Country:" msgstr "" -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Finished Date" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Finished Time" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Just finished listening" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format, fuzzy -msgid "Loading release details..." -msgstr "" - #: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format, fuzzy msgid "Release Date:" msgstr "" -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Release Information" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format, fuzzy -msgid "Scrobble Entire Release" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format, fuzzy -msgid "Scrobble Medium" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format, fuzzy -msgid "Scrobble Options" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format, fuzzy -msgid "Scrobble timing" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Started Date" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Started Time" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "Started listening at" -msgstr "" - -#: lib/music_library_web/live/scrobble_live/show.html.heex -#, elixir-autogen, elixir-format -msgid "This will scrobble all tracks from all media in sequence" -msgstr "" - #: lib/music_library_web/live/scrobble_live/show.html.heex #, elixir-autogen, elixir-format msgid "You need to connect your Last.fm account to scrobble. Please set up your Last.fm session key in the settings."