From a94c34978166c90b445962c2922b34b5df365f87 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Wed, 7 May 2025 09:04:03 +0100 Subject: [PATCH] Add context function to scrobble a release --- lib/music_brainz/release.ex | 4 ++++ lib/music_library/scrobble_activity.ex | 32 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/music_brainz/release.ex b/lib/music_brainz/release.ex index a4e42d64..d728775c 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 tracks(release) do + Enum.flat_map(release.media, fn medium -> medium.tracks end) + end + def from_api_response(r) do %__MODULE__{ id: r["id"], diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index 07aa2ee3..18c31422 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -1,6 +1,38 @@ defmodule MusicLibrary.ScrobbleActivity do + alias LastFm.Scrobble alias MusicLibrary.{Artists, Collection, Wishlist} + def scrobble(release_with_tracks, started_time \\ DateTime.utc_now()) do + session_key = MusicLibrary.Secrets.get!("last_fm_session_key").value + + {scrobbles, _finished_time} = + release_with_tracks + |> MusicBrainz.Release.tracks() + |> Enum.map_reduce(started_time, fn track, time -> + album_artist = + if release_with_tracks.artists !== track.artists do + main_artist_name(release_with_tracks.artists) + end + + time = time |> DateTime.add(track.length, :millisecond) + + scrobble = %Scrobble{ + artist: main_artist_name(track.artists), + album: release_with_tracks.title, + album_artist: album_artist, + track: track.title, + timestamp: DateTime.to_unix(time) + } + + {scrobble, time} + end) + + LastFm.scrobble(scrobbles, session_key) + end + + defp main_artist_name([]), do: nil + defp main_artist_name([artist | _rest]), do: artist.name + def from_recent_tracks(recent_tracks, timezone) do all_artist_pairs = Artists.get_all_artist_pairs() recent_release_ids = recent_release_ids(recent_tracks)