From 924354eb4b804049248e4d9d756d879f8d347049 Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Wed, 21 May 2025 13:36:26 +0000 Subject: [PATCH] fix(subsonic): find lyrics by artist or albumartist (#4093) * find artist by multivalued exact match, instead of 'artist' field * check if lyrics are not empty * refactor(filters): rename function to better reflect its purpose Signed-off-by: Deluan --------- Signed-off-by: Deluan Co-authored-by: Deluan --- server/subsonic/filter/filters.go | 17 ++++++++++++----- server/subsonic/media_retrieval.go | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/server/subsonic/filter/filters.go b/server/subsonic/filter/filters.go index ab285e15..4ab4f964 100644 --- a/server/subsonic/filter/filters.go +++ b/server/subsonic/filter/filters.go @@ -108,12 +108,19 @@ func SongsByRandom(genre string, fromYear, toYear int) Options { return addDefaultFilters(options) } -func SongWithArtistTitle(artist, title string) Options { +func SongWithLyrics(artist, title string) Options { return addDefaultFilters(Options{ - Sort: "updated_at", - Order: "desc", - Max: 1, - Filters: And{Eq{"artist": artist, "title": title}}, + Sort: "updated_at", + Order: "desc", + Max: 1, + Filters: And{ + Eq{"title": title}, + NotEq{"lyrics": "[]"}, + Or{ + persistence.Exists("json_tree(participants, '$.albumartist')", Eq{"value": artist}), + persistence.Exists("json_tree(participants, '$.artist')", Eq{"value": artist}), + }, + }, }) } diff --git a/server/subsonic/media_retrieval.go b/server/subsonic/media_retrieval.go index 35a3fd3d..5cca74c3 100644 --- a/server/subsonic/media_retrieval.go +++ b/server/subsonic/media_retrieval.go @@ -98,7 +98,7 @@ func (api *Router) GetLyrics(r *http.Request) (*responses.Subsonic, error) { response := newResponse() lyricsResponse := responses.Lyrics{} response.Lyrics = &lyricsResponse - mediaFiles, err := api.ds.MediaFile(r.Context()).GetAll(filter.SongWithArtistTitle(artist, title)) + mediaFiles, err := api.ds.MediaFile(r.Context()).GetAll(filter.SongWithLyrics(artist, title)) if err != nil { return nil, err