From 49cb2774e23f4e58b6cb56fa093ad984660eecf7 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Fri, 10 Nov 2023 00:56:43 +0100 Subject: [PATCH] listenbrainz: Read data from newest first Very low min_ts parameters lead to empty results from LB and there is no easy way to determine the oldest valid timestamp. --- backends/listenbrainz.go | 24 ++++++++++++++++-------- backends/listenbrainz/client.go | 5 +++-- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/backends/listenbrainz.go b/backends/listenbrainz.go index 0ef6127..84fee97 100644 --- a/backends/listenbrainz.go +++ b/backends/listenbrainz.go @@ -22,6 +22,7 @@ THE SOFTWARE. package backends import ( + "slices" "time" "github.com/spf13/viper" @@ -41,11 +42,13 @@ func (b ListenBrainzApiBackend) FromConfig(config *viper.Viper) Backend { } func (b ListenBrainzApiBackend) ExportListens(oldestTimestamp time.Time) ([]Listen, error) { - minTs := oldestTimestamp + maxTime := time.Now() + minTime := time.Unix(0, 0) listens := make([]Listen, 0) +out: for { - result, err := b.client.GetListens(b.username, minTs) + result, err := b.client.GetListens(b.username, maxTime, minTime) if err != nil { return nil, err } @@ -55,16 +58,21 @@ func (b ListenBrainzApiBackend) ExportListens(oldestTimestamp time.Time) ([]List break } - // Set minTs to the newest returned listen - minTs = time.Unix(result.Payload.Listens[0].ListenedAt, 0) + // Set maxTime to the oldest returned listen + maxTime = time.Unix(result.Payload.Listens[count-1].ListenedAt, 0) - // Iterate over the returned listens in reverse order (oldest first) - for i := count - 1; i >= 0; i-- { - lbListen := result.Payload.Listens[i] - listens = append(listens, Listen{}.FromListenBrainz(lbListen)) + for _, listen := range result.Payload.Listens { + if listen.ListenedAt > oldestTimestamp.Unix() { + listens = append(listens, Listen{}.FromListenBrainz(listen)) + } else { + // result contains listens older then oldestTimestamp, + // we can stop requesting more + break out + } } } + slices.Reverse(listens) return listens, nil } diff --git a/backends/listenbrainz/client.go b/backends/listenbrainz/client.go index ded8ce4..b458649 100644 --- a/backends/listenbrainz/client.go +++ b/backends/listenbrainz/client.go @@ -52,13 +52,14 @@ func New(token string) Client { return client } -func (c Client) GetListens(user string, minTs time.Time) (GetListensResult, error) { +func (c Client) GetListens(user string, maxTime time.Time, minTime time.Time) (GetListensResult, error) { const path = "/user/{username}/listens" result := &GetListensResult{} _, err := c.resty.R(). SetPathParam("username", user). SetQueryParams(map[string]string{ - "min_ts": strconv.FormatInt(minTs.Unix(), 10), + "max_ts": strconv.FormatInt(maxTime.Unix(), 10), + "min_ts": strconv.FormatInt(minTime.Unix(), 10), "count": strconv.FormatInt(int64(c.MaxResults), 10), }). SetResult(result).