Polyfill artist id in scrobble activity
This commit is contained in:
@@ -35,6 +35,15 @@ defmodule MusicLibrary.Artists do
|
|||||||
q |> Repo.all() |> MapSet.new()
|
q |> Repo.all() |> MapSet.new()
|
||||||
end
|
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
|
defp get_collected_artist_ids do
|
||||||
q =
|
q =
|
||||||
from ar in ArtistRecord,
|
from ar in ArtistRecord,
|
||||||
|
|||||||
@@ -2,19 +2,20 @@ defmodule MusicLibrary.ScrobbleActivity do
|
|||||||
alias MusicLibrary.{Artists, Collection, Wishlist}
|
alias MusicLibrary.{Artists, Collection, Wishlist}
|
||||||
|
|
||||||
def from_recent_tracks(recent_tracks, timezone) do
|
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 =
|
localized_recent_tracks =
|
||||||
Enum.map(recent_tracks, fn t ->
|
Enum.map(recent_tracks, fn t ->
|
||||||
%{
|
%{
|
||||||
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)
|
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()
|
all_artist_ids = Artists.get_all_artist_ids()
|
||||||
recent_artist_ids = recent_artist_ids(localized_recent_tracks)
|
recent_artist_ids = recent_artist_ids(localized_recent_tracks)
|
||||||
artist_ids = MapSet.intersection(all_artist_ids, recent_artist_ids)
|
artist_ids = MapSet.intersection(all_artist_ids, recent_artist_ids)
|
||||||
@@ -41,6 +42,39 @@ defmodule MusicLibrary.ScrobbleActivity do
|
|||||||
}
|
}
|
||||||
end
|
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
|
defp localize_scrobbled_at(uts, timezone) do
|
||||||
ldt =
|
ldt =
|
||||||
uts
|
uts
|
||||||
|
|||||||
Reference in New Issue
Block a user