mirror of
https://git.sr.ht/~phw/scotty
synced 2025-04-29 13:27:03 +02:00
Updated all import/export interfaces
This commit is contained in:
parent
729a3d0ed0
commit
ab04eb1123
12 changed files with 247 additions and 167 deletions
|
@ -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",
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue