From 9b5a087974a7551d77e498eff36b87354c1da0e9 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Mon, 13 Nov 2023 18:11:18 +0100 Subject: [PATCH] ListenBrainz: Skip importing existing loves --- backends/listenbrainz/listenbrainz.go | 33 ++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/backends/listenbrainz/listenbrainz.go b/backends/listenbrainz/listenbrainz.go index 4baa676..96dd22a 100644 --- a/backends/listenbrainz/listenbrainz.go +++ b/backends/listenbrainz/listenbrainz.go @@ -116,6 +116,17 @@ func (b ListenBrainzApiBackend) ImportLoves(loves []models.Love, oldestTimestamp LastTimestamp: oldestTimestamp, ImportErrors: make([]string, 0), } + + existingLoves, err := b.ExportLoves(time.Unix(0, 0)) + if err != nil { + return result, err + } + + existingMbids := make(map[string]bool, len(existingLoves)) + for _, love := range existingLoves { + existingMbids[string(love.RecordingMbid)] = true + } + for _, love := range loves { if love.Created.Unix() <= oldestTimestamp.Unix() { continue @@ -123,19 +134,29 @@ func (b ListenBrainzApiBackend) ImportLoves(loves []models.Love, oldestTimestamp // TODO: Support love import without recording MBID if love.RecordingMbid != "" { - resp, err := b.client.SendFeedback(Feedback{ - RecordingMbid: string(love.RecordingMbid), - Score: 1, - }) + ok := false + errMsg := "" + if existingMbids[string(love.RecordingMbid)] { + ok = true + } else { + resp, err := b.client.SendFeedback(Feedback{ + RecordingMbid: string(love.RecordingMbid), + Score: 1, + }) + ok = err == nil && resp.Status == "ok" + if err != nil { + errMsg = err.Error() + } + } - if err == nil && resp.Status == "ok" { + if ok { result.ImportCount += 1 if love.Created.Unix() > result.LastTimestamp.Unix() { result.LastTimestamp = love.Created } } else { msg := fmt.Sprintf("Failed import of \"%s\" by %s: %v", - love.TrackName, love.ArtistName(), err.Error()) + love.TrackName, love.ArtistName(), errMsg) result.ImportErrors = append(result.ImportErrors, msg) } }