mirror of
https://git.sr.ht/~phw/scotty
synced 2025-04-18 19:19: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)
|
reader := bufio.NewReader(data)
|
||||||
err := readHeader(reader, &result)
|
err := ReadHeader(reader, &result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ func Write(data io.Writer, listens models.ListensList) (lastTimestamp time.Time,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func readHeader(reader *bufio.Reader, log *ScrobblerLog) error {
|
func ReadHeader(reader *bufio.Reader, log *ScrobblerLog) error {
|
||||||
// Skip header
|
// Skip header
|
||||||
for i := 0; i < 3; i++ {
|
for i := 0; i < 3; i++ {
|
||||||
line, _, err := reader.ReadLine()
|
line, _, err := reader.ReadLine()
|
||||||
|
|
|
@ -22,6 +22,7 @@ THE SOFTWARE.
|
||||||
package scrobblerlog_test
|
package scrobblerlog_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -114,3 +115,14 @@ func TestWrite(t *testing.T) {
|
||||||
assert.Equal("", lines[4])
|
assert.Equal("", lines[4])
|
||||||
assert.Equal(time.Unix(1699572072, 0), lastTimestamp)
|
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
|
package scrobblerlog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
@ -33,6 +34,7 @@ import (
|
||||||
type ScrobblerLogBackend struct {
|
type ScrobblerLogBackend struct {
|
||||||
filePath string
|
filePath string
|
||||||
includeSkipped bool
|
includeSkipped bool
|
||||||
|
append bool
|
||||||
file *os.File
|
file *os.File
|
||||||
log ScrobblerLog
|
log ScrobblerLog
|
||||||
}
|
}
|
||||||
|
@ -42,25 +44,56 @@ func (b *ScrobblerLogBackend) Name() string { return "scrobbler-log" }
|
||||||
func (b *ScrobblerLogBackend) FromConfig(config *viper.Viper) models.Backend {
|
func (b *ScrobblerLogBackend) FromConfig(config *viper.Viper) models.Backend {
|
||||||
b.filePath = config.GetString("file-path")
|
b.filePath = config.GetString("file-path")
|
||||||
b.includeSkipped = config.GetBool("include-skipped")
|
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{
|
b.log = ScrobblerLog{
|
||||||
Timezone: "UNKNOWN",
|
Timezone: "UNKNOWN",
|
||||||
Client: "Rockbox unknown $Revision$",
|
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)
|
err = WriteHeader(file, &b.log)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
file.Close()
|
file.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
b.file = file
|
b.file = file
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -50,6 +50,9 @@ backend = "scrobbler-log"
|
||||||
file-path = "data/.scrobbler.log"
|
file-path = "data/.scrobbler.log"
|
||||||
# If true, reading listens from the file also returns listens marked as "skipped"
|
# If true, reading listens from the file also returns listens marked as "skipped"
|
||||||
include-skipped = true
|
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]
|
[service.jspf]
|
||||||
# Write listens and loves to JSPF playlist files (https://xspf.org/jspf)
|
# Write listens and loves to JSPF playlist files (https://xspf.org/jspf)
|
||||||
|
|
Loading…
Add table
Reference in a new issue