scrobblerlog: implemented append mode

This commit is contained in:
Philipp Wolfer 2023-11-21 18:39:15 +01:00
parent 1af484e0f6
commit 56eae67292
No known key found for this signature in database
GPG key ID: 8FDF744D4919943B
4 changed files with 60 additions and 12 deletions

View file

@ -22,6 +22,7 @@ THE SOFTWARE.
package scrobblerlog
import (
"bufio"
"os"
"sort"
"time"
@ -33,6 +34,7 @@ import (
type ScrobblerLogBackend struct {
filePath string
includeSkipped bool
append bool
file *os.File
log ScrobblerLog
}
@ -42,26 +44,57 @@ func (b *ScrobblerLogBackend) Name() string { return "scrobbler-log" }
func (b *ScrobblerLogBackend) FromConfig(config *viper.Viper) models.Backend {
b.filePath = config.GetString("file-path")
b.includeSkipped = config.GetBool("include-skipped")
return b
}
func (b *ScrobblerLogBackend) StartImport() error {
file, err := os.Create(b.filePath)
if err != nil {
return err
b.append = true
if config.IsSet("append") {
b.append = config.GetBool("append")
}
b.log = ScrobblerLog{
Timezone: "UNKNOWN",
Client: "Rockbox unknown $Revision$",
}
return b
}
err = WriteHeader(file, &b.log)
func (b *ScrobblerLogBackend) StartImport() error {
flags := os.O_RDWR | os.O_CREATE
if !b.append {
flags |= os.O_TRUNC
}
file, err := os.OpenFile(b.filePath, flags, 0666)
if err != nil {
file.Close()
return err
}
if b.append {
stat, err := file.Stat()
if err != nil {
file.Close()
return err
}
if stat.Size() == 0 {
// Zero length file, treat as a new file
b.append = false
} else {
// Verify existing file is a scrobbler log
reader := bufio.NewReader(file)
err = ReadHeader(reader, &b.log)
if err != nil {
file.Close()
return err
}
file.Seek(0, 2)
}
}
if !b.append {
err = WriteHeader(file, &b.log)
if err != nil {
file.Close()
return err
}
}
b.file = file
return nil
}