From 35a792df8ab2a92292a5c94e266b02dee4c61854 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Fri, 25 Apr 2025 16:36:57 +0100 Subject: [PATCH] Polyfill artist id in scrobble activity --- lib/music_library/artists.ex | 9 +++++ lib/music_library/scrobble_activity.ex | 46 ++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/lib/music_library/artists.ex b/lib/music_library/artists.ex index acc4c644..1471e2b7 100644 --- a/lib/music_library/artists.ex +++ b/lib/music_library/artists.ex @@ -35,6 +35,15 @@ defmodule MusicLibrary.Artists do q |> Repo.all() |> MapSet.new() end + def get_all_artist_pairs do + q = + from ar in ArtistRecord, + distinct: true, + select: %{artist_id: ar.musicbrainz_id, record_id: ar.record_id} + + q |> Repo.all() + end + defp get_collected_artist_ids do q = from ar in ArtistRecord, diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index cad279fe..f3cac71f 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -2,19 +2,20 @@ defmodule MusicLibrary.ScrobbleActivity do alias MusicLibrary.{Artists, Collection, Wishlist} def from_recent_tracks(recent_tracks, timezone) do + all_artist_pairs = Artists.get_all_artist_pairs() + recent_release_ids = recent_release_ids(recent_tracks) + collected_releases = Collection.collected_releases(recent_release_ids) + wishlisted_releases = Wishlist.wishlisted_releases(recent_release_ids) + localized_recent_tracks = Enum.map(recent_tracks, fn t -> %{ t - | scrobbled_at_label: localize_scrobbled_at(t.scrobbled_at_uts, timezone) + | scrobbled_at_label: localize_scrobbled_at(t.scrobbled_at_uts, timezone), + artist: polyfill_artist(t, collected_releases, wishlisted_releases, all_artist_pairs) } end) - recent_release_ids = recent_release_ids(localized_recent_tracks) - - collected_releases = Collection.collected_releases(recent_release_ids) - wishlisted_releases = Wishlist.wishlisted_releases(recent_release_ids) - all_artist_ids = Artists.get_all_artist_ids() recent_artist_ids = recent_artist_ids(localized_recent_tracks) artist_ids = MapSet.intersection(all_artist_ids, recent_artist_ids) @@ -41,6 +42,39 @@ defmodule MusicLibrary.ScrobbleActivity do } end + defp polyfill_artist(track, collected_releases, wishlisted_releases, all_artist_pairs) do + %{ + track.artist + | musicbrainz_id: + find_artist_id(track, collected_releases, wishlisted_releases, all_artist_pairs) + } + end + + defguardp has_no_artist_id(track) + when is_nil(track.artist.musicbrainz_id) or track.artist.musicbrainz_id == "" + + defp find_artist_id(track, collected_releases, wishlisted_releases, all_artist_pairs) + when has_no_artist_id(track) do + matched_release = + Enum.find(collected_releases ++ wishlisted_releases, fn r -> + r.release_id == track.album.musicbrainz_id + end) + + record_id = if matched_release, do: matched_release.record_id, else: nil + + if record_id do + Enum.find_value(all_artist_pairs, fn pair -> + if pair.record_id == record_id, do: pair.artist_id, else: nil + end) + else + nil + end + end + + defp find_artist_id(track, _collected_releases, _wishlisted_releases, _all_artist_pairs) do + track.artist.musicbrainz_id + end + defp localize_scrobbled_at(uts, timezone) do ldt = uts