mirror of
https://git.sr.ht/~phw/scotty
synced 2025-06-05 12:58:33 +02:00
More granular progress report for JSPF and scrobblerlog
This commit is contained in:
parent
83eac8c801
commit
c7af90b585
4 changed files with 55 additions and 19 deletions
|
@ -108,21 +108,22 @@ func (b *JSPFBackend) ExportListens(ctx context.Context, oldestTimestamp time.Ti
|
|||
}
|
||||
|
||||
listens := make(models.ListensList, 0, len(b.playlist.Tracks))
|
||||
for _, track := range b.playlist.Tracks {
|
||||
p.Export.Total = int64(len(b.playlist.Tracks))
|
||||
for _, track := range models.IterExportProgress(b.playlist.Tracks, &p, progress) {
|
||||
listen, err := trackAsListen(track)
|
||||
if err == nil && listen != nil && listen.ListenedAt.After(oldestTimestamp) {
|
||||
listens = append(listens, *listen)
|
||||
p.Export.TotalItems += 1
|
||||
}
|
||||
}
|
||||
|
||||
sort.Sort(listens)
|
||||
p.Export.Total = int64(len(listens))
|
||||
p.Export.Complete()
|
||||
progress <- p
|
||||
results <- models.ListensResult{Items: listens}
|
||||
}
|
||||
|
||||
func (b *JSPFBackend) ImportListens(ctx context.Context, export models.ListensResult, importResult models.ImportResult, progress chan models.TransferProgress) (models.ImportResult, error) {
|
||||
for _, listen := range export.Items {
|
||||
p := models.TransferProgress{}.FromImportResult(importResult, false)
|
||||
for _, listen := range models.IterImportProgress(export.Items, &p, progress) {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return importResult, err
|
||||
}
|
||||
|
@ -133,7 +134,6 @@ func (b *JSPFBackend) ImportListens(ctx context.Context, export models.ListensRe
|
|||
importResult.UpdateTimestamp(listen.ListenedAt)
|
||||
}
|
||||
|
||||
progress <- models.TransferProgress{}.FromImportResult(importResult, false)
|
||||
return importResult, nil
|
||||
}
|
||||
|
||||
|
@ -151,21 +151,22 @@ func (b *JSPFBackend) ExportLoves(ctx context.Context, oldestTimestamp time.Time
|
|||
}
|
||||
|
||||
loves := make(models.LovesList, 0, len(b.playlist.Tracks))
|
||||
for _, track := range b.playlist.Tracks {
|
||||
p.Export.Total = int64(len(b.playlist.Tracks))
|
||||
for _, track := range models.IterExportProgress(b.playlist.Tracks, &p, progress) {
|
||||
love, err := trackAsLove(track)
|
||||
if err == nil && love != nil && love.Created.After(oldestTimestamp) {
|
||||
loves = append(loves, *love)
|
||||
p.Export.TotalItems += 1
|
||||
}
|
||||
}
|
||||
|
||||
sort.Sort(loves)
|
||||
p.Export.Total = int64(len(loves))
|
||||
p.Export.Complete()
|
||||
progress <- p
|
||||
results <- models.LovesResult{Items: loves}
|
||||
}
|
||||
|
||||
func (b *JSPFBackend) ImportLoves(ctx context.Context, export models.LovesResult, importResult models.ImportResult, progress chan models.TransferProgress) (models.ImportResult, error) {
|
||||
for _, love := range export.Items {
|
||||
p := models.TransferProgress{}.FromImportResult(importResult, false)
|
||||
for _, love := range models.IterImportProgress(export.Items, &p, progress) {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return importResult, err
|
||||
}
|
||||
|
@ -176,7 +177,6 @@ func (b *JSPFBackend) ImportLoves(ctx context.Context, export models.LovesResult
|
|||
importResult.UpdateTimestamp(love.Created)
|
||||
}
|
||||
|
||||
progress <- models.TransferProgress{}.FromImportResult(importResult, false)
|
||||
return importResult, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -154,22 +154,23 @@ func (b *ScrobblerLogBackend) ExportListens(ctx context.Context, oldestTimestamp
|
|||
|
||||
listens := make(models.ListensList, 0, len(b.log.Records))
|
||||
client := strings.Split(b.log.Client, " ")[0]
|
||||
for _, record := range b.log.Records {
|
||||
p.Export.Total = int64(len(b.log.Records))
|
||||
for _, record := range models.IterExportProgress(b.log.Records, &p, progress) {
|
||||
listen := recordToListen(record, client)
|
||||
if listen.ListenedAt.After(oldestTimestamp) {
|
||||
listens = append(listens, recordToListen(record, client))
|
||||
p.Export.TotalItems += 1
|
||||
}
|
||||
}
|
||||
|
||||
sort.Sort(listens)
|
||||
p.Export.Total = int64(len(listens))
|
||||
p.Export.Complete()
|
||||
progress <- p
|
||||
results <- models.ListensResult{Items: listens}
|
||||
}
|
||||
|
||||
func (b *ScrobblerLogBackend) ImportListens(ctx context.Context, export models.ListensResult, importResult models.ImportResult, progress chan models.TransferProgress) (models.ImportResult, error) {
|
||||
p := models.TransferProgress{}.FromImportResult(importResult, false)
|
||||
records := make([]scrobblerlog.Record, len(export.Items))
|
||||
for i, listen := range export.Items {
|
||||
for i, listen := range models.IterImportProgress(export.Items, &p, progress) {
|
||||
records[i] = listenToRecord(listen)
|
||||
}
|
||||
lastTimestamp, err := b.log.Append(b.file, records)
|
||||
|
@ -179,8 +180,6 @@ func (b *ScrobblerLogBackend) ImportListens(ctx context.Context, export models.L
|
|||
|
||||
importResult.UpdateTimestamp(lastTimestamp)
|
||||
importResult.ImportCount += len(export.Items)
|
||||
progress <- models.TransferProgress{}.FromImportResult(importResult, false)
|
||||
|
||||
return importResult, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ THE SOFTWARE.
|
|||
package models
|
||||
|
||||
import (
|
||||
"iter"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
@ -244,3 +245,38 @@ func (p *Progress) Complete() {
|
|||
func (p *Progress) Abort() {
|
||||
p.Aborted = true
|
||||
}
|
||||
|
||||
func IterExportProgress[T any](
|
||||
items []T, t *TransferProgress, c chan TransferProgress,
|
||||
) iter.Seq2[int, T] {
|
||||
return iterProgress(items, t, t.Export, c, true)
|
||||
}
|
||||
|
||||
func IterImportProgress[T any](
|
||||
items []T, t *TransferProgress, c chan TransferProgress,
|
||||
) iter.Seq2[int, T] {
|
||||
return iterProgress(items, t, t.Import, c, false)
|
||||
}
|
||||
|
||||
func iterProgress[T any](
|
||||
items []T, t *TransferProgress,
|
||||
p *Progress, c chan TransferProgress,
|
||||
autocomplete bool,
|
||||
) iter.Seq2[int, T] {
|
||||
// Report progress in 1% steps
|
||||
steps := len(items) / 100
|
||||
return func(yield func(int, T) bool) {
|
||||
for i, item := range items {
|
||||
yield(i, item)
|
||||
p.Elapsed++
|
||||
if i%steps == 0 {
|
||||
c <- *t
|
||||
}
|
||||
}
|
||||
|
||||
if autocomplete {
|
||||
p.Complete()
|
||||
c <- *t
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue