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

@ -37,12 +37,12 @@ import (
type ScrobblerLog struct {
Timezone string
Client string
Listens []models.Listen
Listens models.ListensList
}
func Parse(data io.Reader, includeSkipped bool) (ScrobblerLog, error) {
result := ScrobblerLog{
Listens: make([]models.Listen, 0),
Listens: make(models.ListensList, 0),
}
reader := bufio.NewReader(data)
@ -92,16 +92,11 @@ func Parse(data io.Reader, includeSkipped bool) (ScrobblerLog, error) {
return result, nil
}
func Write(data io.Writer, log *ScrobblerLog) (lastTimestamp time.Time, err error) {
err = writeHeader(data, log)
if err != nil {
return
}
func Write(data io.Writer, listens models.ListensList) (lastTimestamp time.Time, err error) {
tsvWriter := csv.NewWriter(data)
tsvWriter.Comma = '\t'
for _, listen := range log.Listens {
for _, listen := range listens {
if listen.ListenedAt.Unix() > lastTimestamp.Unix() {
lastTimestamp = listen.ListenedAt
}
@ -162,7 +157,7 @@ func readHeader(reader *bufio.Reader, log *ScrobblerLog) error {
return nil
}
func writeHeader(writer io.Writer, log *ScrobblerLog) error {
func WriteHeader(writer io.Writer, log *ScrobblerLog) error {
headers := []string{
"#AUDIOSCROBBLER/1.1\n",
"#TZ/" + log.Timezone + "\n",

View file

@ -98,7 +98,9 @@ func TestWrite(t *testing.T) {
},
},
}
lastTimestamp, err := scrobblerlog.Write(buffer, &log)
err := scrobblerlog.WriteHeader(buffer, &log)
require.NoError(t, err)
lastTimestamp, err := scrobblerlog.Write(buffer, log.Listens)
require.NoError(t, err)
result := string(buffer.Bytes())
lines := strings.Split(result, "\n")

View file

@ -23,6 +23,7 @@ package scrobblerlog
import (
"os"
"sort"
"time"
"github.com/spf13/viper"
@ -40,31 +41,36 @@ func (b ScrobblerLogBackend) FromConfig(config *viper.Viper) models.Backend {
return b
}
func (b ScrobblerLogBackend) ExportListens(oldestTimestamp time.Time) ([]models.Listen, error) {
func (b ScrobblerLogBackend) ExportListens(oldestTimestamp time.Time, results chan models.ListensResult) {
defer close(results)
file, err := os.Open(b.filePath)
if err != nil {
return nil, err
results <- models.ListensResult{Error: err}
return
}
defer file.Close()
result, err := Parse(file, b.includeSkipped)
log, err := Parse(file, b.includeSkipped)
if err != nil {
return nil, err
results <- models.ListensResult{Error: err}
close(results)
return
}
return result.Listens, nil
listens := log.Listens.NewerThan(oldestTimestamp)
sort.Sort(listens)
results <- models.ListensResult{Listens: listens}
}
func (b ScrobblerLogBackend) ImportListens(listens []models.Listen, oldestTimestamp time.Time) (models.ImportResult, error) {
result := models.ImportResult{
TotalCount: len(listens),
func (b ScrobblerLogBackend) ImportListens(results chan models.ListensResult, oldestTimestamp time.Time) (models.ImportResult, error) {
importResult := models.ImportResult{
LastTimestamp: oldestTimestamp,
}
file, err := os.Create(b.filePath)
if err != nil {
return result, err
return importResult, err
}
defer file.Close()
@ -72,16 +78,27 @@ func (b ScrobblerLogBackend) ImportListens(listens []models.Listen, oldestTimest
log := ScrobblerLog{
Timezone: "UNKNOWN",
Client: "Rockbox unknown $Revision$",
Listens: listens,
}
lastTimestamp, err := Write(file, &log)
err = WriteHeader(file, &log)
if err != nil {
return result, err
return importResult, err
}
result.LastTimestamp = lastTimestamp
result.ImportCount = len(listens)
return result, nil
for result := range results {
if result.Error != nil {
return importResult, result.Error
}
importResult.TotalCount += len(result.Listens)
lastTimestamp, err := Write(file, result.Listens)
if err != nil {
return importResult, err
}
importResult.UpdateTimestamp(lastTimestamp)
importResult.ImportCount += len(result.Listens)
}
return importResult, nil
}