diff --git a/lib/music_library/collection.ex b/lib/music_library/collection.ex index d7edb060..29355f5f 100644 --- a/lib/music_library/collection.ex +++ b/lib/music_library/collection.ex @@ -109,6 +109,16 @@ defmodule MusicLibrary.Collection do Repo.all(q) end + def collected_releases_query do + from r in fragment("records, json_each(records.release_ids)"), + where: fragment("records.purchased_at IS NOT NULL"), + select: %{ + record_id: fragment("records.id"), + cover_hash: fragment("records.cover_hash"), + release_id: r.value + } + end + defp base_search do from r in SearchIndex, where: not is_nil(r.purchased_at) diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index 7e509b72..67a2db8c 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -3,7 +3,7 @@ defmodule MusicLibrary.ScrobbleActivity do alias LastFm.{Scrobble, Track} alias MusicBrainz.Release - alias MusicLibrary.{Artists, Records.ArtistRecord, Repo, Secrets} + alias MusicLibrary.{Artists, Collection, Records.ArtistRecord, Repo, Secrets, Wishlist} def can_scrobble? do Secrets.get("last_fm_session_key") !== nil @@ -119,23 +119,6 @@ defmodule MusicLibrary.ScrobbleActivity do # - Map each track to an artist, knowing that sometimes track artists do # not have the necessary information. In that case we can go from # track -> album -> record -> artist - collected_releases_query = - from r in fragment("records, json_each(records.release_ids)"), - where: fragment("records.purchased_at IS NOT NULL"), - select: %{ - record_id: fragment("records.id"), - cover_hash: fragment("records.cover_hash"), - release_id: r.value - } - - wishlisted_releases_query = - from r in fragment("records, json_each(records.release_ids)"), - where: fragment("records.purchased_at IS NULL"), - select: %{ - record_id: fragment("records.id"), - cover_hash: fragment("records.cover_hash"), - release_id: r.value - } all_artists_query = from ar in ArtistRecord, @@ -143,9 +126,9 @@ defmodule MusicLibrary.ScrobbleActivity do tracks_query = from t in Track, - left_join: cr in subquery(collected_releases_query), + left_join: cr in subquery(Collection.collected_releases_query()), on: cr.release_id == fragment("? ->> '$.musicbrainz_id'", t.album), - left_join: wr in subquery(wishlisted_releases_query), + 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, @@ -232,29 +215,11 @@ defmodule MusicLibrary.ScrobbleActivity do |> DateTime.from_naive!(timezone) |> DateTime.to_unix() - collected_releases_query = - from r in fragment("records, json_each(records.release_ids)"), - where: fragment("records.purchased_at IS NOT NULL"), - select: %{ - record_id: fragment("records.id"), - cover_hash: fragment("records.cover_hash"), - release_id: r.value - } - - wishlisted_releases_query = - from r in fragment("records, json_each(records.release_ids)"), - where: fragment("records.purchased_at IS NULL"), - select: %{ - record_id: fragment("records.id"), - cover_hash: fragment("records.cover_hash"), - release_id: r.value - } - query = from t in Track, - left_join: cr in subquery(collected_releases_query), + left_join: cr in subquery(Collection.collected_releases_query()), on: cr.release_id == fragment("? ->> '$.musicbrainz_id'", t.album), - left_join: wr in subquery(wishlisted_releases_query), + left_join: wr in subquery(Wishlist.wishlisted_releases_query()), on: wr.release_id == fragment("? ->> '$.musicbrainz_id'", t.album), where: t.scrobbled_at_uts >= ^cutoff_timestamp, where: fragment("json_extract(album, '$.title') != ''"), @@ -286,29 +251,11 @@ defmodule MusicLibrary.ScrobbleActivity do def get_top_albums(opts) do limit = Keyword.get(opts, :limit, 10) - collected_releases_query = - from r in fragment("records, json_each(records.release_ids)"), - where: fragment("records.purchased_at IS NOT NULL"), - select: %{ - record_id: fragment("records.id"), - cover_hash: fragment("records.cover_hash"), - release_id: r.value - } - - wishlisted_releases_query = - from r in fragment("records, json_each(records.release_ids)"), - where: fragment("records.purchased_at IS NULL"), - select: %{ - record_id: fragment("records.id"), - cover_hash: fragment("records.cover_hash"), - release_id: r.value - } - query = from t in Track, - left_join: cr in subquery(collected_releases_query), + left_join: cr in subquery(Collection.collected_releases_query()), on: cr.release_id == fragment("? ->> '$.musicbrainz_id'", t.album), - left_join: wr in subquery(wishlisted_releases_query), + left_join: wr in subquery(Wishlist.wishlisted_releases_query()), on: wr.release_id == fragment("? ->> '$.musicbrainz_id'", t.album), where: fragment("json_extract(album, '$.title') != ''"), group_by: [ diff --git a/lib/music_library/wishlist.ex b/lib/music_library/wishlist.ex index 959ab675..8fa77df0 100644 --- a/lib/music_library/wishlist.ex +++ b/lib/music_library/wishlist.ex @@ -21,6 +21,16 @@ defmodule MusicLibrary.Wishlist do Repo.aggregate(base_search(), :count) end + def wishlisted_releases_query do + from r in fragment("records, json_each(records.release_ids)"), + where: fragment("records.purchased_at IS NULL"), + select: %{ + record_id: fragment("records.id"), + cover_hash: fragment("records.cover_hash"), + release_id: r.value + } + end + defp base_search do from r in SearchIndex, where: is_nil(r.purchased_at)