From 4fb148e9dbe9c2fa1423e80203e7b0d66c619650 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sat, 14 Mar 2026 22:22:41 +0000 Subject: [PATCH] Simplify signatures of scrobbling functions --- lib/music_library/scrobble_activity.ex | 81 +++---------------- lib/music_library_web/components/release.ex | 12 ++- .../live/collection_live/show.ex | 4 +- .../live/scrobble_live/show.ex | 16 ++-- 4 files changed, 33 insertions(+), 80 deletions(-) diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index b7d3038a..f1d8831b 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -12,32 +12,15 @@ defmodule MusicLibrary.ScrobbleActivity do Secrets.get("last_fm_session_key") !== nil end - @spec scrobble_release(map(), keyword()) :: {:ok, term()} | {:error, term()} - def scrobble_release(release_with_tracks, opts) when is_list(opts) do - case Enum.sort(opts) do - [finished_at: _, started_at: _] -> - raise ArgumentError, """ - Cannot scrobble a release with both started_at and finished_at. - Remove either of them. - """ - - [started_at: started_at] -> - scrobble_release(release_with_tracks, {:started_at, started_at}) - - [finished_at: finished_at] -> - scrobble_release(release_with_tracks, {:finished_at, finished_at}) - end - end - - @spec scrobble_release(map(), {:finished_at, DateTime.t()}) :: {:ok, term()} | {:error, term()} - def scrobble_release(release_with_tracks, {:finished_at, finished_at}) do + @spec scrobble_release(map(), :started_at | :finished_at, DateTime.t()) :: + {:ok, term()} | {:error, term()} + def scrobble_release(release_with_tracks, :finished_at, finished_at) do release_duration = Release.release_duration(release_with_tracks) started_at = DateTime.add(finished_at, -release_duration, :millisecond) - scrobble_release(release_with_tracks, {:started_at, started_at}) + scrobble_release(release_with_tracks, :started_at, started_at) end - @spec scrobble_release(map(), {:started_at, DateTime.t()}) :: {:ok, term()} | {:error, term()} - def scrobble_release(release_with_tracks, {:started_at, started_at}) do + def scrobble_release(release_with_tracks, :started_at, started_at) do release_duration = Release.release_duration(release_with_tracks) if release_duration == 0 do @@ -54,40 +37,21 @@ defmodule MusicLibrary.ScrobbleActivity do end end - @spec scrobble_medium(integer(), map(), keyword()) :: {:ok, term()} | {:error, term()} - def scrobble_medium(number, release_with_tracks, opts) when is_list(opts) do - case Enum.sort(opts) do - [finished_at: _, started_at: _] -> - raise ArgumentError, """ - Cannot scrobble a medium with both started_at and finished_at. - Remove either of them. - """ - - [started_at: started_at] -> - scrobble_medium(number, release_with_tracks, {:started_at, started_at}) - - [finished_at: finished_at] -> - scrobble_medium(number, release_with_tracks, {:finished_at, finished_at}) - end - end - - @spec scrobble_medium(integer(), map(), {:finished_at, DateTime.t()}) :: + @spec scrobble_medium(integer(), map(), :started_at | :finished_at, DateTime.t()) :: {:ok, term()} | {:error, term()} - def scrobble_medium(number, release_with_tracks, {:finished_at, finished_at}) do + def scrobble_medium(number, release_with_tracks, :finished_at, finished_at) do case find_medium(release_with_tracks, number) do {:ok, medium} -> medium_duration = Release.medium_duration(medium) started_at = DateTime.add(finished_at, -medium_duration, :millisecond) - scrobble_medium(number, release_with_tracks, {:started_at, started_at}) + scrobble_medium(number, release_with_tracks, :started_at, started_at) {:error, :medium_not_found} -> {:error, :medium_not_found} end end - @spec scrobble_medium(integer(), map(), {:started_at, DateTime.t()}) :: - {:ok, term()} | {:error, term()} - def scrobble_medium(number, release_with_tracks, {:started_at, started_at}) do + def scrobble_medium(number, release_with_tracks, :started_at, started_at) do case find_medium(release_with_tracks, number) do {:ok, medium} -> medium_duration = Release.medium_duration(medium) @@ -109,26 +73,9 @@ defmodule MusicLibrary.ScrobbleActivity do end end - @spec scrobble_tracks(MapSet.t(), map(), keyword()) :: {:ok, term()} | {:error, term()} - def scrobble_tracks(selected_track_ids, release_with_tracks, opts) when is_list(opts) do - case Enum.sort(opts) do - [finished_at: _, started_at: _] -> - raise ArgumentError, """ - Cannot scrobble tracks with both started_at and finished_at. - Remove either of them. - """ - - [started_at: started_at] -> - scrobble_tracks(selected_track_ids, release_with_tracks, {:started_at, started_at}) - - [finished_at: finished_at] -> - scrobble_tracks(selected_track_ids, release_with_tracks, {:finished_at, finished_at}) - end - end - - @spec scrobble_tracks(MapSet.t(), map(), {:finished_at, DateTime.t()}) :: + @spec scrobble_tracks(MapSet.t(), map(), :started_at | :finished_at, DateTime.t()) :: {:ok, term()} | {:error, term()} - def scrobble_tracks(selected_track_ids, release_with_tracks, {:finished_at, finished_at}) do + def scrobble_tracks(selected_track_ids, release_with_tracks, :finished_at, finished_at) do all_tracks = Release.tracks(release_with_tracks) selected_tracks = @@ -136,12 +83,10 @@ defmodule MusicLibrary.ScrobbleActivity do tracks_duration = Enum.sum_by(selected_tracks, fn track -> track.length || 0 end) started_at = DateTime.add(finished_at, -tracks_duration, :millisecond) - scrobble_tracks(selected_track_ids, release_with_tracks, {:started_at, started_at}) + scrobble_tracks(selected_track_ids, release_with_tracks, :started_at, started_at) end - @spec scrobble_tracks(MapSet.t(), map(), {:started_at, DateTime.t()}) :: - {:ok, term()} | {:error, term()} - def scrobble_tracks(selected_track_ids, release_with_tracks, {:started_at, started_at}) do + def scrobble_tracks(selected_track_ids, release_with_tracks, :started_at, started_at) do all_tracks = Release.tracks(release_with_tracks) selected_tracks = diff --git a/lib/music_library_web/components/release.ex b/lib/music_library_web/components/release.ex index acb5aa48..d0c8914b 100644 --- a/lib/music_library_web/components/release.ex +++ b/lib/music_library_web/components/release.ex @@ -289,7 +289,7 @@ defmodule MusicLibraryWeb.Components.Release do def handle_event("scrobble_release", _params, socket) when release_loaded?(socket.assigns) do release_with_tracks = socket.assigns.release_with_tracks.result - case ScrobbleActivity.scrobble_release(release_with_tracks, finished_at: DateTime.utc_now()) do + case ScrobbleActivity.scrobble_release(release_with_tracks, :finished_at, DateTime.utc_now()) do {:ok, _} -> send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000) put_toast!(:info, gettext("Release scrobbled successfully")) @@ -318,8 +318,11 @@ defmodule MusicLibraryWeb.Components.Release do release_with_tracks = socket.assigns.release_with_tracks.result {number, ""} = Integer.parse(number) - case ScrobbleActivity.scrobble_medium(number, release_with_tracks, - finished_at: DateTime.utc_now() + case ScrobbleActivity.scrobble_medium( + number, + release_with_tracks, + :finished_at, + DateTime.utc_now() ) do {:ok, _} -> send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000) @@ -390,7 +393,8 @@ defmodule MusicLibraryWeb.Components.Release do case ScrobbleActivity.scrobble_tracks( selected_track_ids, release_with_tracks, - finished_at: DateTime.utc_now() + :finished_at, + DateTime.utc_now() ) do {:ok, _} -> send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000) diff --git a/lib/music_library_web/live/collection_live/show.ex b/lib/music_library_web/live/collection_live/show.ex index 9d30ea38..efb1d001 100644 --- a/lib/music_library_web/live/collection_live/show.ex +++ b/lib/music_library_web/live/collection_live/show.ex @@ -483,9 +483,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do 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() - ) + ScrobbleActivity.scrobble_release(release_with_tracks, :finished_at, DateTime.utc_now()) 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 72cbef12..68284d3a 100644 --- a/lib/music_library_web/live/scrobble_live/show.ex +++ b/lib/music_library_web/live/scrobble_live/show.ex @@ -147,8 +147,10 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do @impl true def handle_event("scrobble_release", _params, socket) do - case ScrobbleActivity.scrobble_release(socket.assigns.release, - finished_at: DateTime.utc_now() + case ScrobbleActivity.scrobble_release( + socket.assigns.release, + :finished_at, + DateTime.utc_now() ) do {:ok, _} -> {:noreply, @@ -168,8 +170,11 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do def handle_event("scrobble_medium", %{"number" => number}, socket) do {number, ""} = Integer.parse(number) - case ScrobbleActivity.scrobble_medium(number, socket.assigns.release, - finished_at: DateTime.utc_now() + case ScrobbleActivity.scrobble_medium( + number, + socket.assigns.release, + :finished_at, + DateTime.utc_now() ) do {:ok, _} -> {:noreply, @@ -196,7 +201,8 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do case ScrobbleActivity.scrobble_tracks( selected_track_ids, release_with_tracks, - finished_at: DateTime.utc_now() + :finished_at, + DateTime.utc_now() ) do {:ok, _} -> {:noreply,