diff --git a/CHANGES.md b/CHANGES.md index 5ac83ab..7324f77 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,14 +1,5 @@ # Scotty Changelog -## 0.5.2 - 2025-05-01 -- ListenBrainz: fixed loves export not considering latest timestamp - - -## 0.5.1 - 2025-05-01 -- scrobblerlog: fixed timezone offset calculation -- if system locale detection fails don't abort but fall back to English - - ## 0.5.0 - 2025-04-29 - ListenBrainz: handle missing loves metadata in case of merged recordings - ListenBrainz: fix loves import loading all existing loves diff --git a/internal/backends/deezer/deezer.go b/internal/backends/deezer/deezer.go index 756e271..7b6e1ad 100644 --- a/internal/backends/deezer/deezer.go +++ b/internal/backends/deezer/deezer.go @@ -117,7 +117,7 @@ out: listens := make(models.ListensList, 0, perPage) for _, track := range result.Tracks { listen := track.AsListen() - if listen.ListenedAt.After(oldestTimestamp) { + if listen.ListenedAt.Unix() > oldestTimestamp.Unix() { listens = append(listens, listen) } else { break @@ -186,7 +186,7 @@ out: loves := make(models.LovesList, 0, perPage) for _, track := range result.Tracks { love := track.AsLove() - if love.Created.After(oldestTimestamp) { + if love.Created.Unix() > oldestTimestamp.Unix() { loves = append(loves, love) } else { totalCount -= 1 diff --git a/internal/backends/funkwhale/funkwhale.go b/internal/backends/funkwhale/funkwhale.go index 3e296c1..99bf43d 100644 --- a/internal/backends/funkwhale/funkwhale.go +++ b/internal/backends/funkwhale/funkwhale.go @@ -84,7 +84,7 @@ out: for _, fwListen := range result.Results { listen := fwListen.AsListen() - if listen.ListenedAt.After(oldestTimestamp) { + if listen.ListenedAt.Unix() > oldestTimestamp.Unix() { p.Elapsed += 1 listens = append(listens, listen) } else { @@ -135,7 +135,7 @@ out: for _, favorite := range result.Results { love := favorite.AsLove() - if love.Created.After(oldestTimestamp) { + if love.Created.Unix() > oldestTimestamp.Unix() { p.Elapsed += 1 loves = append(loves, love) } else { diff --git a/internal/backends/listenbrainz/listenbrainz.go b/internal/backends/listenbrainz/listenbrainz.go index 6c7b747..d0074b1 100644 --- a/internal/backends/listenbrainz/listenbrainz.go +++ b/internal/backends/listenbrainz/listenbrainz.go @@ -199,7 +199,7 @@ func (b *ListenBrainzApiBackend) ExportLoves(oldestTimestamp time.Time, results exportChan := make(chan models.LovesResult) p := models.Progress{} - go b.exportLoves(oldestTimestamp, exportChan) + go b.exportLoves(time.Unix(0, 0), exportChan) for existingLoves := range exportChan { if existingLoves.Error != nil { progress <- p.Complete() @@ -219,6 +219,7 @@ func (b *ListenBrainzApiBackend) exportLoves(oldestTimestamp time.Time, results offset := 0 defer close(results) loves := make(models.LovesList, 0, 2*MaxItemsPerGet) + p := models.Progress{} out: for { @@ -245,13 +246,17 @@ out: } love := feedback.AsLove() - if love.Created.After(oldestTimestamp) { + if love.Created.Unix() > oldestTimestamp.Unix() { loves = append(loves, love) + p.Elapsed += 1 } else { break out } } + p.Total = int64(result.TotalCount) + p.Elapsed += int64(count) + offset += MaxItemsPerGet } diff --git a/internal/backends/spotify/spotify.go b/internal/backends/spotify/spotify.go index 8c17903..1827769 100644 --- a/internal/backends/spotify/spotify.go +++ b/internal/backends/spotify/spotify.go @@ -139,7 +139,7 @@ func (b *SpotifyApiBackend) ExportListens(oldestTimestamp time.Time, results cha for _, listen := range result.Items { l := listen.AsListen() - if l.ListenedAt.After(oldestTimestamp) { + if l.ListenedAt.Unix() > oldestTimestamp.Unix() { listens = append(listens, l) } else { // result contains listens older then oldestTimestamp @@ -195,7 +195,7 @@ out: loves := make(models.LovesList, 0, perPage) for _, track := range result.Items { love := track.AsLove() - if love.Created.After(oldestTimestamp) { + if love.Created.Unix() > oldestTimestamp.Unix() { loves = append(loves, love) } else { continue diff --git a/internal/backends/subsonic/subsonic.go b/internal/backends/subsonic/subsonic.go index d605324..1c26bfd 100644 --- a/internal/backends/subsonic/subsonic.go +++ b/internal/backends/subsonic/subsonic.go @@ -90,7 +90,7 @@ func (b *SubsonicApiBackend) filterSongs(songs []*subsonic.Child, oldestTimestam loves := make(models.LovesList, 0, len(songs)) for _, song := range songs { love := SongAsLove(*song, b.client.User) - if love.Created.After(oldestTimestamp) { + if love.Created.Unix() > oldestTimestamp.Unix() { loves = append(loves, love) } } diff --git a/internal/cli/transfer.go b/internal/cli/transfer.go index 0ba04b9..ade7ece 100644 --- a/internal/cli/transfer.go +++ b/internal/cli/transfer.go @@ -123,7 +123,7 @@ func (c *TransferCmd[E, I, R]) Transfer(exp backends.ExportProcessor[R], imp bac resultChan := make(chan models.ImportResult) go imp.Process(exportChan, resultChan, importProgress) result := <-resultChan - if timestamp.After(result.LastTimestamp) { + if result.LastTimestamp.Unix() < timestamp.Unix() { result.LastTimestamp = timestamp } wg.Wait() @@ -180,7 +180,7 @@ func (c *TransferCmd[E, I, R]) timestamp() (time.Time, error) { } func (c *TransferCmd[E, I, R]) updateTimestamp(result models.ImportResult, oldTimestamp time.Time) error { - if oldTimestamp.After(result.LastTimestamp) { + if result.LastTimestamp.Unix() < oldTimestamp.Unix() { result.LastTimestamp = oldTimestamp } printTimestamp("Latest timestamp: %v (%v)", result.LastTimestamp) diff --git a/internal/models/models.go b/internal/models/models.go index f2dd71d..18e3b44 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -121,7 +121,7 @@ type ListensList []Listen func (l ListensList) NewerThan(t time.Time) ListensList { result := make(ListensList, 0, len(l)) for _, item := range l { - if item.ListenedAt.After(t) { + if item.ListenedAt.Unix() > t.Unix() { result = append(result, item) } } @@ -133,7 +133,7 @@ func (l ListensList) Len() int { } func (l ListensList) Less(i, j int) bool { - return l[j].ListenedAt.After(l[i].ListenedAt) + return l[i].ListenedAt.Unix() < l[j].ListenedAt.Unix() } func (l ListensList) Swap(i, j int) { @@ -147,7 +147,7 @@ func (l LovesList) Len() int { } func (l LovesList) Less(i, j int) bool { - return l[j].Created.After(l[i].Created) + return l[i].Created.Unix() < l[j].Created.Unix() } func (l LovesList) Swap(i, j int) { @@ -190,7 +190,7 @@ type ImportResult struct { // Sets LastTimestamp to newTime, if newTime is newer than LastTimestamp func (i *ImportResult) UpdateTimestamp(newTime time.Time) { - if newTime.After(i.LastTimestamp) { + if newTime.Unix() > i.LastTimestamp.Unix() { i.LastTimestamp = newTime } } diff --git a/internal/version/version.go b/internal/version/version.go index b38a40f..07d1569 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -17,7 +17,7 @@ package version const ( AppName = "scotty" - AppVersion = "0.5.2" + AppVersion = "0.5.0" AppURL = "https://git.sr.ht/~phw/scotty/" ) diff --git a/pkg/scrobblerlog/parser.go b/pkg/scrobblerlog/parser.go index d355c62..9c6471c 100644 --- a/pkg/scrobblerlog/parser.go +++ b/pkg/scrobblerlog/parser.go @@ -247,8 +247,7 @@ func (l ScrobblerLog) rowToRecord(row []string) (Record, error) { // Convert a Unix timestamp to a [time.Time] object, but treat the timestamp // as being in the given location's timezone instead of UTC. -// If location is nil, the timestamp is returned assumed to already be in UTC -// and returned unchanged. +// If location is nil, the timestamp is returned as UTC. func timeFromLocalTimestamp(timestamp int64, location *time.Location) time.Time { t := time.Unix(timestamp, 0) @@ -257,7 +256,7 @@ func timeFromLocalTimestamp(timestamp int64, location *time.Location) time.Time if location != nil { _, offset := t.In(location).Zone() if offset != 0 { - t = t.Add(-time.Duration(offset) * time.Second) + t = t.Add(time.Duration(offset) * time.Second) } } diff --git a/pkg/scrobblerlog/parser_test.go b/pkg/scrobblerlog/parser_test.go index 8dc30e5..f4527cc 100644 --- a/pkg/scrobblerlog/parser_test.go +++ b/pkg/scrobblerlog/parser_test.go @@ -91,7 +91,7 @@ func TestParserFallbackTimezone(t *testing.T) { require.NoError(t, err) record1 := result.Records[0] assert.Equal( - time.Unix(1260342084, 0).Add(-2*time.Hour), + time.Unix(1260342084, 0).Add(2*time.Hour), record1.Timestamp, ) }