From f04e7dce3bb9d094fdd5bc5405f19b8f272e3fc5 Mon Sep 17 00:00:00 2001 From: Deluan Date: Sat, 7 Feb 2026 12:42:14 -0500 Subject: [PATCH] feat: configurable artist and track algorithms Signed-off-by: Deluan --- adapters/listenbrainz/agent_test.go | 2 +- adapters/listenbrainz/client.go | 9 +++------ adapters/listenbrainz/client_test.go | 2 +- conf/configuration.go | 10 +++++++--- consts/consts.go | 4 ++++ 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/adapters/listenbrainz/agent_test.go b/adapters/listenbrainz/agent_test.go index 457f3904e..df70ec9c4 100644 --- a/adapters/listenbrainz/agent_test.go +++ b/adapters/listenbrainz/agent_test.go @@ -355,7 +355,7 @@ var _ = Describe("listenBrainzAgent", func() { var agent *listenBrainzAgent var httpClient *tests.FakeHttpClient mbid := "8f3471b5-7e6a-48da-86a9-c1c07a0f47ae" - baseUrl := "https://labs.api.listenbrainz.org/similar-recordings/json?algorithm=session_based_days_180_session_300_contribution_5_threshold_15_limit_50_skip_30&recording_mbids=" + baseUrl := "https://labs.api.listenbrainz.org/similar-recordings/json?algorithm=session_based_days_9000_session_300_contribution_5_threshold_15_limit_50_skip_30&recording_mbids=" BeforeEach(func() { httpClient = &tests.FakeHttpClient{} diff --git a/adapters/listenbrainz/client.go b/adapters/listenbrainz/client.go index bd1994164..76e47cdc8 100644 --- a/adapters/listenbrainz/client.go +++ b/adapters/listenbrainz/client.go @@ -12,16 +12,13 @@ import ( "path" "slices" + "github.com/navidrome/navidrome/conf" "github.com/navidrome/navidrome/log" ) const ( lbzApiUrl = "https://api.listenbrainz.org/1/" labsBase = "https://labs.api.listenbrainz.org/" - // There are a couple of algorithms from https://labs.api.listenbrainz.org/similar-artists - artistAlgorithm = "session_based_days_9000_session_300_contribution_5_threshold_15_limit_50_skip_30" - // From https://labs.api.listenbrainz.org/similar-recordings - trackAlgorithm = "session_based_days_180_session_300_contribution_5_threshold_15_limit_50_skip_30" ) var ( @@ -301,7 +298,7 @@ func (c *client) getSimilarArtists(ctx context.Context, mbid string, limit int) req, _ := http.NewRequestWithContext(ctx, http.MethodGet, labsBase+"similar-artists/json", nil) req.Header.Add("Content-Type", "application/json; charset=UTF-8") req.URL.RawQuery = url.Values{ - "artist_mbids": []string{mbid}, "algorithm": []string{artistAlgorithm}, + "artist_mbids": []string{mbid}, "algorithm": []string{conf.Server.ListenBrainz.ArtistAlgorithm}, }.Encode() log.Trace(ctx, fmt.Sprintf("Sending ListenBrainz Labs %s request", req.Method), "url", req.URL) @@ -340,7 +337,7 @@ func (c *client) getSimilarRecordings(ctx context.Context, mbid string, limit in req, _ := http.NewRequestWithContext(ctx, http.MethodGet, labsBase+"similar-recordings/json", nil) req.Header.Add("Content-Type", "application/json; charset=UTF-8") req.URL.RawQuery = url.Values{ - "recording_mbids": []string{mbid}, "algorithm": []string{trackAlgorithm}, + "recording_mbids": []string{mbid}, "algorithm": []string{conf.Server.ListenBrainz.TrackAlgorithm}, }.Encode() log.Trace(ctx, fmt.Sprintf("Sending ListenBrainz Labs %s request", req.Method), "url", req.URL) diff --git a/adapters/listenbrainz/client_test.go b/adapters/listenbrainz/client_test.go index e8e4d9810..b04d90237 100644 --- a/adapters/listenbrainz/client_test.go +++ b/adapters/listenbrainz/client_test.go @@ -291,7 +291,7 @@ var _ = Describe("client", func() { Context("getSimilarRecordings", func() { mbid := "8f3471b5-7e6a-48da-86a9-c1c07a0f47ae" - baseUrl := "https://labs.api.listenbrainz.org/similar-recordings/json?algorithm=session_based_days_180_session_300_contribution_5_threshold_15_limit_50_skip_30&recording_mbids=" + baseUrl := "https://labs.api.listenbrainz.org/similar-recordings/json?algorithm=session_based_days_9000_session_300_contribution_5_threshold_15_limit_50_skip_30&recording_mbids=" It("handles a malformed request with status code", func() { httpClient.Res = http.Response{ diff --git a/conf/configuration.go b/conf/configuration.go index ad7bb2d0b..3ed1d653d 100644 --- a/conf/configuration.go +++ b/conf/configuration.go @@ -194,8 +194,10 @@ type deezerOptions struct { } type listenBrainzOptions struct { - Enabled bool - BaseURL string + Enabled bool + BaseURL string + ArtistAlgorithm string + TrackAlgorithm string } type httpHeaderOptions struct { @@ -656,7 +658,9 @@ func setViperDefaults() { viper.SetDefault("deezer.enabled", true) viper.SetDefault("deezer.language", consts.DefaultInfoLanguage) viper.SetDefault("listenbrainz.enabled", true) - viper.SetDefault("listenbrainz.baseurl", "https://api.listenbrainz.org/1/") + viper.SetDefault("listenbrainz.baseurl", consts.DefaultListenBrainzBaseURL) + viper.SetDefault("listenbrainz.artistalgorithm", consts.DefaultListenBrainzArtistAlgorithm) + viper.SetDefault("listenbrainz.trackalgorithm", consts.DefaultListenBrainzTrackAlgorithm) viper.SetDefault("enablescrobblehistory", true) viper.SetDefault("httpheaders.frameoptions", "DENY") viper.SetDefault("backup.path", "") diff --git a/consts/consts.go b/consts/consts.go index 583df5c91..eb10fdc03 100644 --- a/consts/consts.go +++ b/consts/consts.go @@ -74,6 +74,10 @@ const ( DefaultHttpClientTimeOut = 10 * time.Second + DefaultListenBrainzBaseURL = "https://api.listenbrainz.org/1/" + DefaultListenBrainzArtistAlgorithm = "session_based_days_9000_session_300_contribution_5_threshold_15_limit_50_skip_30" + DefaultListenBrainzTrackAlgorithm = "session_based_days_9000_session_300_contribution_5_threshold_15_limit_50_skip_30" + DefaultScannerExtractor = "taglib" DefaultWatcherWait = 5 * time.Second Zwsp = string('\u200b')