From 28251284568a105dd6c3b8e2c9336b129799b6c3 Mon Sep 17 00:00:00 2001 From: Caleb Allen Date: Sun, 29 Mar 2026 14:58:46 -0400 Subject: [PATCH] fix: use Labs API for similar artists (was hitting nonexistent endpoint) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SimilarArtists() was calling api.listenbrainz.org/1/explore/similar-artists/{mbid} which doesn't exist (404). Changed to labs.api.listenbrainz.org/similar-artists/json with artist_mbids + algorithm query params — the same Labs API that searchindex.go already uses for Tier 4 indexing. Also added snake_case → camelCase wire conversion via existing lbSimilarArtistWire type. --- backend/explore/listenbrainz.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/backend/explore/listenbrainz.go b/backend/explore/listenbrainz.go index e31b6a2..a80b01e 100644 --- a/backend/explore/listenbrainz.go +++ b/backend/explore/listenbrainz.go @@ -104,9 +104,10 @@ func (c *ListenBrainzClient) SimilarArtists( ctx context.Context, artistMBID string, ) ([]LBSimilarArtist, error) { url := fmt.Sprintf( - "%s/1/explore/similar-artists/%s", - listenBrainzBaseURL, + "%s/similar-artists/json?artist_mbids=%s&algorithm=%s", + labsBaseURL, artistMBID, + labsSimilarAlgorithm, ) cacheKey := "lb:similar-artists:" + artistMBID @@ -128,11 +129,22 @@ func (c *ListenBrainzClient) SimilarArtists( return nil, nil //nolint:nilnil // graceful degradation for unstable endpoint } - var out []LBSimilarArtist - if err := json.Unmarshal(body, &out); err != nil { + // Labs API returns snake_case — unmarshal into wire type, + // then convert to camelCase Wails type. + var wire []lbSimilarArtistWire + if err := json.Unmarshal(body, &wire); err != nil { return nil, fmt.Errorf("listenbrainz similar artists unmarshal: %w", err) } + out := make([]LBSimilarArtist, len(wire)) + for i, w := range wire { + out[i] = LBSimilarArtist{ + ArtistMBID: w.ArtistMBID, + Name: w.Name, + Score: float64(w.Score), + } + } + c.cacheJSON(cacheKey, out, cacheTTLEntity, artistMBID, "artist") return out, nil