Remove duplication around searching scrobbled tracks

Fixes #157
This commit is contained in:
Claudio Ortolina
2026-04-09 06:57:24 +01:00
parent 49d26e1fd0
commit 59937dadb8
+17 -29
View File
@@ -170,20 +170,9 @@ defmodule MusicLibrary.ListeningStats do
page_size = Map.get(params, :page_size, @pagination[:tracks_page_size])
order = Map.get(params, :order, :scrobbled_at)
base_query = tracks_with_record_info_query()
search_query =
if query == "" do
base_query
else
query_term = "%#{String.downcase(query)}%"
from [t, cr, wr, ar] in base_query,
where:
like(fragment("lower(?)", t.title), ^query_term) or
like(fragment("lower(json_extract(?, '$.name'))", t.artist), ^query_term) or
like(fragment("lower(json_extract(?, '$.title'))", t.album), ^query_term)
end
tracks_with_record_info_query()
|> search_query(query)
ordered_query =
case order do
@@ -234,22 +223,9 @@ defmodule MusicLibrary.ListeningStats do
@spec search_tracks_count(String.t()) :: non_neg_integer()
def search_tracks_count(query \\ "") do
base_query = from(t in Track)
search_query =
if query == "" do
base_query
else
query_term = "%#{String.downcase(query)}%"
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)
end
Repo.aggregate(search_query, :count, :scrobbled_at_uts)
from(t in Track)
|> search_query(query)
|> Repo.aggregate(:count, :scrobbled_at_uts)
end
# Top albums/artists by period
@@ -478,6 +454,18 @@ defmodule MusicLibrary.ListeningStats do
fragment("? ->> '$.name'", t.artist) == ^main_artist_name
end
defp search_query(base_query, ""), do: base_query
defp search_query(base_query, query) do
query_term = "%#{String.downcase(query)}%"
from t in base_query,
where:
like(fragment("lower(?)", t.title), ^query_term) or
like(fragment("lower(json_extract(?, '$.name'))", t.artist), ^query_term) or
like(fragment("lower(json_extract(?, '$.title'))", t.album), ^query_term)
end
defp polyfill_artist(artist, musicbrainz_id) do
if is_nil(artist.musicbrainz_id) or artist.musicbrainz_id == "" do
%{artist | musicbrainz_id: musicbrainz_id}