Updated all import/export interfaces

This commit is contained in:
Philipp Wolfer 2023-11-15 19:24:12 +01:00
parent 729a3d0ed0
commit ab04eb1123
No known key found for this signature in database
GPG key ID: 8FDF744D4919943B
12 changed files with 247 additions and 167 deletions

View file

@ -23,7 +23,7 @@ package maloja
import (
"errors"
"slices"
"sort"
"strings"
"time"
@ -45,17 +45,21 @@ func (b MalojaApiBackend) FromConfig(config *viper.Viper) models.Backend {
return b
}
func (b MalojaApiBackend) ExportListens(oldestTimestamp time.Time) ([]models.Listen, error) {
func (b MalojaApiBackend) ExportListens(oldestTimestamp time.Time, results chan models.ListensResult) {
page := 0
perPage := 1000
perPage := MaxItemsPerGet
listens := make([]models.Listen, 0)
defer close(results)
// We need to gather the full list of listens in order to sort them
listens := make(models.ListensList, 0, 2*perPage)
out:
for {
result, err := b.client.GetScrobbles(page, perPage)
if err != nil {
return nil, err
results <- models.ListensResult{Error: err}
return
}
count := len(result.List)
@ -74,44 +78,49 @@ out:
page += 1
}
slices.Reverse(listens)
return listens, nil
sort.Sort(listens)
results <- models.ListensResult{Listens: listens}
}
func (b MalojaApiBackend) ImportListens(listens []models.Listen, oldestTimestamp time.Time) (models.ImportResult, error) {
result := models.ImportResult{
TotalCount: len(listens),
ImportCount: 0,
func (b MalojaApiBackend) ImportListens(results chan models.ListensResult, oldestTimestamp time.Time) (models.ImportResult, error) {
importResult := models.ImportResult{
LastTimestamp: oldestTimestamp,
}
for _, listen := range listens {
if listen.ListenedAt.Unix() <= oldestTimestamp.Unix() {
continue
for result := range results {
if result.Error != nil {
return importResult, result.Error
}
scrobble := NewScrobble{
Title: listen.TrackName,
Artists: listen.ArtistNames,
Album: listen.ReleaseName,
Duration: int64(listen.PlaybackDuration.Seconds()),
Length: int64(listen.Duration.Seconds()),
Time: listen.ListenedAt.Unix(),
Nofix: b.nofix,
}
importResult.TotalCount += len(result.Listens)
for _, listen := range result.Listens {
if listen.ListenedAt.Unix() <= oldestTimestamp.Unix() {
break
}
resp, err := b.client.NewScrobble(scrobble)
if err != nil {
return result, err
} else if resp.Status != "success" {
return result, errors.New(resp.Error.Description)
}
scrobble := NewScrobble{
Title: listen.TrackName,
Artists: listen.ArtistNames,
Album: listen.ReleaseName,
Duration: int64(listen.PlaybackDuration.Seconds()),
Length: int64(listen.Duration.Seconds()),
Time: listen.ListenedAt.Unix(),
Nofix: b.nofix,
}
if listen.ListenedAt.Unix() > result.LastTimestamp.Unix() {
result.LastTimestamp = listen.ListenedAt
resp, err := b.client.NewScrobble(scrobble)
if err != nil {
return importResult, err
} else if resp.Status != "success" {
return importResult, errors.New(resp.Error.Description)
}
importResult.UpdateTimestamp(listen.ListenedAt)
importResult.ImportCount += 1
}
result.ImportCount += 1
}
return result, nil
return importResult, nil
}
func (s Scrobble) ToListen() models.Listen {