diff --git a/lib/music_brainz/release.ex b/lib/music_brainz/release.ex index d728775c..27684c38 100644 --- a/lib/music_brainz/release.ex +++ b/lib/music_brainz/release.ex @@ -25,6 +25,10 @@ defmodule MusicBrainz.Release do Enum.sum_by(medium.tracks, fn track -> track.length || 0 end) end + def release_duration(release) do + Enum.sum_by(release.media, fn medium -> medium_duration(medium) end) + end + def tracks(release) do Enum.flat_map(release.media, fn medium -> medium.tracks end) end diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index 18c31422..69790acb 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -1,14 +1,37 @@ defmodule MusicLibrary.ScrobbleActivity do alias LastFm.Scrobble + alias MusicBrainz.Release alias MusicLibrary.{Artists, Collection, Wishlist} - def scrobble(release_with_tracks, started_time \\ DateTime.utc_now()) do + def scrobble(release_with_tracks, opts) when is_list(opts) do + case opts do + [started_at: _, finished_at: _] -> + raise ArgumentError, """ + Cannot scobble a release with both started_at and finished_at. + Remove either of them. + """ + + [started_at: started_at] -> + scrobble(release_with_tracks, {:started_at, started_at}) + + [finished_at: finished_at] -> + scrobble(release_with_tracks, {:finished_at, finished_at}) + end + end + + def scrobble(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_with_tracks, {:started_at, started_at}) + end + + def scrobble(release_with_tracks, {:started_at, started_at}) do session_key = MusicLibrary.Secrets.get!("last_fm_session_key").value - {scrobbles, _finished_time} = + {scrobbles, _finished_at} = release_with_tracks |> MusicBrainz.Release.tracks() - |> Enum.map_reduce(started_time, fn track, time -> + |> Enum.map_reduce(started_at, fn track, time -> album_artist = if release_with_tracks.artists !== track.artists do main_artist_name(release_with_tracks.artists) diff --git a/lib/music_library_web/live/collection_live/show.ex b/lib/music_library_web/live/collection_live/show.ex index faa0ace6..6da52ff2 100644 --- a/lib/music_library_web/live/collection_live/show.ex +++ b/lib/music_library_web/live/collection_live/show.ex @@ -134,7 +134,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do if release_with_tracks = release_with_tracks_async_result && release_with_tracks_async_result.result do - case ScrobbleActivity.scrobble(release_with_tracks, DateTime.utc_now()) do + case ScrobbleActivity.scrobble(release_with_tracks, finished_at: DateTime.utc_now()) do {:ok, _} -> {:noreply, socket