Simplify signatures of scrobbling functions
This commit is contained in:
@@ -12,32 +12,15 @@ defmodule MusicLibrary.ScrobbleActivity do
|
|||||||
Secrets.get("last_fm_session_key") !== nil
|
Secrets.get("last_fm_session_key") !== nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec scrobble_release(map(), keyword()) :: {:ok, term()} | {:error, term()}
|
@spec scrobble_release(map(), :started_at | :finished_at, DateTime.t()) ::
|
||||||
def scrobble_release(release_with_tracks, opts) when is_list(opts) do
|
{:ok, term()} | {:error, term()}
|
||||||
case Enum.sort(opts) do
|
def scrobble_release(release_with_tracks, :finished_at, finished_at) 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
|
|
||||||
release_duration = Release.release_duration(release_with_tracks)
|
release_duration = Release.release_duration(release_with_tracks)
|
||||||
started_at = DateTime.add(finished_at, -release_duration, :millisecond)
|
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
|
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)
|
release_duration = Release.release_duration(release_with_tracks)
|
||||||
|
|
||||||
if release_duration == 0 do
|
if release_duration == 0 do
|
||||||
@@ -54,40 +37,21 @@ defmodule MusicLibrary.ScrobbleActivity do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec scrobble_medium(integer(), map(), keyword()) :: {:ok, term()} | {:error, term()}
|
@spec scrobble_medium(integer(), map(), :started_at | :finished_at, DateTime.t()) ::
|
||||||
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()}) ::
|
|
||||||
{:ok, term()} | {:error, term()}
|
{: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
|
case find_medium(release_with_tracks, number) do
|
||||||
{:ok, medium} ->
|
{:ok, medium} ->
|
||||||
medium_duration = Release.medium_duration(medium)
|
medium_duration = Release.medium_duration(medium)
|
||||||
started_at = DateTime.add(finished_at, -medium_duration, :millisecond)
|
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} ->
|
||||||
{:error, :medium_not_found}
|
{:error, :medium_not_found}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec scrobble_medium(integer(), map(), {:started_at, DateTime.t()}) ::
|
def scrobble_medium(number, release_with_tracks, :started_at, started_at) do
|
||||||
{:ok, term()} | {:error, term()}
|
|
||||||
def scrobble_medium(number, release_with_tracks, {:started_at, started_at}) do
|
|
||||||
case find_medium(release_with_tracks, number) do
|
case find_medium(release_with_tracks, number) do
|
||||||
{:ok, medium} ->
|
{:ok, medium} ->
|
||||||
medium_duration = Release.medium_duration(medium)
|
medium_duration = Release.medium_duration(medium)
|
||||||
@@ -109,26 +73,9 @@ defmodule MusicLibrary.ScrobbleActivity do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec scrobble_tracks(MapSet.t(), map(), keyword()) :: {:ok, term()} | {:error, term()}
|
@spec scrobble_tracks(MapSet.t(), map(), :started_at | :finished_at, DateTime.t()) ::
|
||||||
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()}) ::
|
|
||||||
{:ok, term()} | {:error, term()}
|
{: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)
|
all_tracks = Release.tracks(release_with_tracks)
|
||||||
|
|
||||||
selected_tracks =
|
selected_tracks =
|
||||||
@@ -136,12 +83,10 @@ defmodule MusicLibrary.ScrobbleActivity do
|
|||||||
|
|
||||||
tracks_duration = Enum.sum_by(selected_tracks, fn track -> track.length || 0 end)
|
tracks_duration = Enum.sum_by(selected_tracks, fn track -> track.length || 0 end)
|
||||||
started_at = DateTime.add(finished_at, -tracks_duration, :millisecond)
|
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
|
end
|
||||||
|
|
||||||
@spec scrobble_tracks(MapSet.t(), map(), {:started_at, DateTime.t()}) ::
|
def scrobble_tracks(selected_track_ids, release_with_tracks, :started_at, started_at) do
|
||||||
{:ok, term()} | {:error, term()}
|
|
||||||
def scrobble_tracks(selected_track_ids, release_with_tracks, {:started_at, started_at}) do
|
|
||||||
all_tracks = Release.tracks(release_with_tracks)
|
all_tracks = Release.tracks(release_with_tracks)
|
||||||
|
|
||||||
selected_tracks =
|
selected_tracks =
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ defmodule MusicLibraryWeb.Components.Release do
|
|||||||
def handle_event("scrobble_release", _params, socket) when release_loaded?(socket.assigns) do
|
def handle_event("scrobble_release", _params, socket) when release_loaded?(socket.assigns) do
|
||||||
release_with_tracks = socket.assigns.release_with_tracks.result
|
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, _} ->
|
{:ok, _} ->
|
||||||
send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000)
|
send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000)
|
||||||
put_toast!(:info, gettext("Release scrobbled successfully"))
|
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
|
release_with_tracks = socket.assigns.release_with_tracks.result
|
||||||
{number, ""} = Integer.parse(number)
|
{number, ""} = Integer.parse(number)
|
||||||
|
|
||||||
case ScrobbleActivity.scrobble_medium(number, release_with_tracks,
|
case ScrobbleActivity.scrobble_medium(
|
||||||
finished_at: DateTime.utc_now()
|
number,
|
||||||
|
release_with_tracks,
|
||||||
|
:finished_at,
|
||||||
|
DateTime.utc_now()
|
||||||
) do
|
) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000)
|
send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000)
|
||||||
@@ -390,7 +393,8 @@ defmodule MusicLibraryWeb.Components.Release do
|
|||||||
case ScrobbleActivity.scrobble_tracks(
|
case ScrobbleActivity.scrobble_tracks(
|
||||||
selected_track_ids,
|
selected_track_ids,
|
||||||
release_with_tracks,
|
release_with_tracks,
|
||||||
finished_at: DateTime.utc_now()
|
:finished_at,
|
||||||
|
DateTime.utc_now()
|
||||||
) do
|
) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000)
|
send_update_after(socket.assigns.myself, %{already_scrobbled: false}, 3000)
|
||||||
|
|||||||
@@ -483,9 +483,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
with {:ok, release} <- MusicBrainz.get_release(record.selected_release_id) do
|
with {:ok, release} <- MusicBrainz.get_release(record.selected_release_id) do
|
||||||
release_with_tracks = MusicBrainz.Release.from_api_response(release)
|
release_with_tracks = MusicBrainz.Release.from_api_response(release)
|
||||||
|
|
||||||
ScrobbleActivity.scrobble_release(release_with_tracks,
|
ScrobbleActivity.scrobble_release(release_with_tracks, :finished_at, DateTime.utc_now())
|
||||||
finished_at: DateTime.utc_now()
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end)}
|
end)}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -147,8 +147,10 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
|
|||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event("scrobble_release", _params, socket) do
|
def handle_event("scrobble_release", _params, socket) do
|
||||||
case ScrobbleActivity.scrobble_release(socket.assigns.release,
|
case ScrobbleActivity.scrobble_release(
|
||||||
finished_at: DateTime.utc_now()
|
socket.assigns.release,
|
||||||
|
:finished_at,
|
||||||
|
DateTime.utc_now()
|
||||||
) do
|
) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
{:noreply,
|
{:noreply,
|
||||||
@@ -168,8 +170,11 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
|
|||||||
def handle_event("scrobble_medium", %{"number" => number}, socket) do
|
def handle_event("scrobble_medium", %{"number" => number}, socket) do
|
||||||
{number, ""} = Integer.parse(number)
|
{number, ""} = Integer.parse(number)
|
||||||
|
|
||||||
case ScrobbleActivity.scrobble_medium(number, socket.assigns.release,
|
case ScrobbleActivity.scrobble_medium(
|
||||||
finished_at: DateTime.utc_now()
|
number,
|
||||||
|
socket.assigns.release,
|
||||||
|
:finished_at,
|
||||||
|
DateTime.utc_now()
|
||||||
) do
|
) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
{:noreply,
|
{:noreply,
|
||||||
@@ -196,7 +201,8 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
|
|||||||
case ScrobbleActivity.scrobble_tracks(
|
case ScrobbleActivity.scrobble_tracks(
|
||||||
selected_track_ids,
|
selected_track_ids,
|
||||||
release_with_tracks,
|
release_with_tracks,
|
||||||
finished_at: DateTime.utc_now()
|
:finished_at,
|
||||||
|
DateTime.utc_now()
|
||||||
) do
|
) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
{:noreply,
|
{:noreply,
|
||||||
|
|||||||
Reference in New Issue
Block a user