diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index 67a2db8c..8af0a126 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -382,7 +382,25 @@ defmodule MusicLibrary.ScrobbleActivity do page_size = Map.get(params, :page_size, 200) order = Map.get(params, :order, :scrobbled_at) - base_query = from(t in Track) + all_artists_query = + from ar in ArtistRecord, + distinct: true + + base_query = + from t in Track, + left_join: cr in subquery(Collection.collected_releases_query()), + on: cr.release_id == fragment("? ->> '$.musicbrainz_id'", t.album), + left_join: wr in subquery(Wishlist.wishlisted_releases_query()), + on: wr.release_id == fragment("? ->> '$.musicbrainz_id'", t.album), + left_join: ar in subquery(all_artists_query), + on: wr.record_id == ar.record_id or cr.record_id == ar.record_id, + select: %{ + track: t, + collected_record_id: cr.record_id, + wishlisted_record_id: wr.record_id, + artist_id: ar.musicbrainz_id, + cover_hash: coalesce(cr.cover_hash, wr.cover_hash) + } search_query = if query == "" do @@ -393,8 +411,8 @@ defmodule MusicLibrary.ScrobbleActivity do from t in base_query, where: like(fragment("lower(?)", t.title), ^query_term) or - like(fragment("lower(json_extract(artist, '$.name'))"), ^query_term) or - like(fragment("lower(json_extract(album, '$.title'))"), ^query_term) + like(fragment("lower(json_extract(?, '$.name'))", t.artist), ^query_term) or + like(fragment("lower(json_extract(?, '$.title'))", t.album), ^query_term) end ordered_query = @@ -406,10 +424,10 @@ defmodule MusicLibrary.ScrobbleActivity do from t in search_query, order_by: [asc: t.title] :artist -> - from t in search_query, order_by: [asc: fragment("json_extract(artist, '$.name')")] + from t in search_query, order_by: [asc: fragment("json_extract(?, '$.name')", t.artist)] :album -> - from t in search_query, order_by: [asc: fragment("json_extract(album, '$.title')")] + from t in search_query, order_by: [asc: fragment("json_extract(?, '$.title')", t.album)] end offset = (page - 1) * page_size diff --git a/lib/music_library_web/live/scrobbled_tracks_live/index.ex b/lib/music_library_web/live/scrobbled_tracks_live/index.ex index e74cac09..3738ba1e 100644 --- a/lib/music_library_web/live/scrobbled_tracks_live/index.ex +++ b/lib/music_library_web/live/scrobbled_tracks_live/index.ex @@ -2,10 +2,12 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.Index do use MusicLibraryWeb, :live_view import MusicLibraryWeb.Components.Pagination + import MusicLibraryWeb.RecordComponents, only: [format_label: 1] import MusicLibraryWeb.ScrobbleComponents, only: [refresh_lastfm_feed_button: 1] alias LastFm.Track - alias MusicLibrary.ScrobbleActivity + alias MusicLibrary.Assets.Transform + alias MusicLibrary.{Records, ScrobbleActivity} @default_tracks_list_params %{ query: "", @@ -19,7 +21,9 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.Index do socket = socket |> assign(:current_section, :scrobble_activity) - |> stream_configure(:tracks, dom_id: fn %Track{scrobbled_at_uts: id} -> "tracks-#{id}" end) + |> stream_configure(:tracks, + dom_id: fn %{track: %Track{scrobbled_at_uts: id}} -> "tracks-#{id}" end + ) if connected?(socket) do LastFm.subscribe_to_feed() @@ -174,4 +178,20 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.Index do ~p"/scrobbled-tracks?#{qs}" end + + defp track_cover_url(track, nil) do + track.cover_url + end + + defp track_cover_url(track, cover_hash) do + if LastFm.fallback_cover?(track.cover_url) do + payload = + Transform.new(hash: cover_hash, width: 96) + |> Transform.encode!() + + ~p"/assets/#{payload}" + else + track.cover_url + end + end end diff --git a/lib/music_library_web/live/scrobbled_tracks_live/index.html.heex b/lib/music_library_web/live/scrobbled_tracks_live/index.html.heex index 9d8258ba..4fab5784 100644 --- a/lib/music_library_web/live/scrobbled_tracks_live/index.html.heex +++ b/lib/music_library_web/live/scrobbled_tracks_live/index.html.heex @@ -76,24 +76,28 @@
@@ -112,6 +116,56 @@