From 4d18a207ee0c081be98fac4a27fb2b5158168805 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Mon, 13 Nov 2023 18:49:20 +0100 Subject: [PATCH] ListenBrainz: Support import of loves without recording MBID --- backends/listenbrainz/client.go | 19 +++++++++++++++++++ backends/listenbrainz/client_test.go | 17 +++++++++++++++++ backends/listenbrainz/listenbrainz.go | 16 ++++++++++++---- backends/listenbrainz/models.go | 9 +++++++++ backends/listenbrainz/testdata/listens.json | 2 +- backends/listenbrainz/testdata/lookup.json | 10 ++++++++++ 6 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 backends/listenbrainz/testdata/lookup.json diff --git a/backends/listenbrainz/client.go b/backends/listenbrainz/client.go index 887f92d..0e844c6 100644 --- a/backends/listenbrainz/client.go +++ b/backends/listenbrainz/client.go @@ -125,3 +125,22 @@ func (c Client) SendFeedback(feedback Feedback) (result StatusResult, err error) } return } + +func (c Client) Lookup(recordingName string, artistName string) (result LookupResult, err error) { + const path = "/metadata/lookup" + errorResult := ErrorResult{} + response, err := c.HttpClient.R(). + SetQueryParams(map[string]string{ + "recording_name": recordingName, + "artist_name": artistName, + }). + SetResult(&result). + SetError(&errorResult). + Get(path) + + if response.StatusCode() != 200 { + err = errors.New(errorResult.Error) + return + } + return +} diff --git a/backends/listenbrainz/client_test.go b/backends/listenbrainz/client_test.go index c3ddd64..69d42d3 100644 --- a/backends/listenbrainz/client_test.go +++ b/backends/listenbrainz/client_test.go @@ -100,6 +100,23 @@ func TestSendFeedback(t *testing.T) { assert.Equal(t, "ok", result.Status) } +func TestLookup(t *testing.T) { + defer httpmock.DeactivateAndReset() + + client := listenbrainz.NewClient("thetoken") + setupHttpMock(t, client.HttpClient.GetClient(), + "https://api.listenbrainz.org/1/metadata/lookup", + "testdata/lookup.json") + + result, err := client.Lookup("Paradise Lost", "Say Just Words") + require.NoError(t, err) + + assert := assert.New(t) + assert.Equal("Say Just Words", result.RecordingName) + assert.Equal("Paradise Lost", result.ArtistCreditName) + assert.Equal("569436a1-234a-44bc-a370-8f4d252bef21", result.RecordingMbid) +} + func setupHttpMock(t *testing.T, client *http.Client, url string, testDataPath string) { httpmock.ActivateNonDefault(client) diff --git a/backends/listenbrainz/listenbrainz.go b/backends/listenbrainz/listenbrainz.go index 96dd22a..86472e4 100644 --- a/backends/listenbrainz/listenbrainz.go +++ b/backends/listenbrainz/listenbrainz.go @@ -132,15 +132,23 @@ func (b ListenBrainzApiBackend) ImportLoves(loves []models.Love, oldestTimestamp continue } - // TODO: Support love import without recording MBID - if love.RecordingMbid != "" { + recordingMbid := string(love.RecordingMbid) + + if recordingMbid == "" { + lookup, err := b.client.Lookup(love.TrackName, love.ArtistName()) + if err == nil { + recordingMbid = lookup.RecordingMbid + } + } + + if recordingMbid != "" { ok := false errMsg := "" - if existingMbids[string(love.RecordingMbid)] { + if existingMbids[recordingMbid] { ok = true } else { resp, err := b.client.SendFeedback(Feedback{ - RecordingMbid: string(love.RecordingMbid), + RecordingMbid: recordingMbid, Score: 1, }) ok = err == nil && resp.Status == "ok" diff --git a/backends/listenbrainz/models.go b/backends/listenbrainz/models.go index 8b4f44c..4557783 100644 --- a/backends/listenbrainz/models.go +++ b/backends/listenbrainz/models.go @@ -85,6 +85,15 @@ type Feedback struct { UserName string `json:"user_id,omitempty"` } +type LookupResult struct { + ArtistCreditName string `json:"artist_credit_name"` + ReleaseName string `json:"release_name"` + RecordingName string `json:"recording_name"` + RecordingMbid string `json:"recording_mbid"` + ReleaseMbid string `json:"release_mbid"` + ArtistMbids []string `json:"artist_mbids"` +} + type StatusResult struct { Status string `json:"status"` } diff --git a/backends/listenbrainz/testdata/listens.json b/backends/listenbrainz/testdata/listens.json index c173aad..5d799b8 100644 --- a/backends/listenbrainz/testdata/listens.json +++ b/backends/listenbrainz/testdata/listens.json @@ -112,4 +112,4 @@ ], "user_id": "outsidecontext" } -} \ No newline at end of file +} diff --git a/backends/listenbrainz/testdata/lookup.json b/backends/listenbrainz/testdata/lookup.json new file mode 100644 index 0000000..82eed83 --- /dev/null +++ b/backends/listenbrainz/testdata/lookup.json @@ -0,0 +1,10 @@ +{ + "artist_credit_name": "Paradise Lost", + "artist_mbids": [ + "10bf95b6-30e3-44f1-817f-45762cdc0de0" + ], + "recording_mbid": "569436a1-234a-44bc-a370-8f4d252bef21", + "recording_name": "Say Just Words", + "release_mbid": "90b2d144-e5f3-3192-9da5-0d72d67c61be", + "release_name": "One Second" +}