mirror of
https://git.sr.ht/~phw/scotty
synced 2025-04-16 10:09:28 +02:00
scrobblerlog: implemented append mode
This commit is contained in:
parent
1af484e0f6
commit
56eae67292
4 changed files with 60 additions and 12 deletions
|
@ -46,7 +46,7 @@ func Parse(data io.Reader, includeSkipped bool) (ScrobblerLog, error) {
|
|||
}
|
||||
|
||||
reader := bufio.NewReader(data)
|
||||
err := readHeader(reader, &result)
|
||||
err := ReadHeader(reader, &result)
|
||||
if err != nil {
|
||||
return result, err
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ func Write(data io.Writer, listens models.ListensList) (lastTimestamp time.Time,
|
|||
return
|
||||
}
|
||||
|
||||
func readHeader(reader *bufio.Reader, log *ScrobblerLog) error {
|
||||
func ReadHeader(reader *bufio.Reader, log *ScrobblerLog) error {
|
||||
// Skip header
|
||||
for i := 0; i < 3; i++ {
|
||||
line, _, err := reader.ReadLine()
|
||||
|
|
|
@ -22,6 +22,7 @@ THE SOFTWARE.
|
|||
package scrobblerlog_test
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"strings"
|
||||
"testing"
|
||||
|
@ -114,3 +115,14 @@ func TestWrite(t *testing.T) {
|
|||
assert.Equal("", lines[4])
|
||||
assert.Equal(time.Unix(1699572072, 0), lastTimestamp)
|
||||
}
|
||||
|
||||
func TestReadHeader(t *testing.T) {
|
||||
data := bytes.NewBufferString(testScrobblerLog)
|
||||
reader := bufio.NewReader(data)
|
||||
log := scrobblerlog.ScrobblerLog{}
|
||||
err := scrobblerlog.ReadHeader(reader, &log)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, log.Timezone, "UNKNOWN")
|
||||
assert.Equal(t, log.Client, "Rockbox sansaclipplus $Revision$")
|
||||
assert.Empty(t, log.Listens)
|
||||
}
|
||||
|
|
|
@ -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,25 +44,56 @@ 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
|
||||
b.append = true
|
||||
if config.IsSet("append") {
|
||||
b.append = config.GetBool("append")
|
||||
}
|
||||
|
||||
func (b *ScrobblerLogBackend) StartImport() error {
|
||||
file, err := os.Create(b.filePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
b.log = ScrobblerLog{
|
||||
Timezone: "UNKNOWN",
|
||||
Client: "Rockbox unknown $Revision$",
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
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 {
|
||||
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
|
||||
|
|
|
@ -50,6 +50,9 @@ backend = "scrobbler-log"
|
|||
file-path = "data/.scrobbler.log"
|
||||
# If true, reading listens from the file also returns listens marked as "skipped"
|
||||
include-skipped = true
|
||||
# If true (default), new listens will be appended to the existing file. Set to
|
||||
# false to overwrite the file and create a new scrobbler log on every run.
|
||||
append = true
|
||||
|
||||
[service.jspf]
|
||||
# Write listens and loves to JSPF playlist files (https://xspf.org/jspf)
|
||||
|
|
Loading…
Add table
Reference in a new issue