diff --git a/internal/listenbrainz/archive.go b/internal/listenbrainz/archive.go index 68740aa..b263ca9 100644 --- a/internal/listenbrainz/archive.go +++ b/internal/listenbrainz/archive.go @@ -31,7 +31,7 @@ import ( "strconv" "time" - "github.com/simonfrey/jsonl" + "go.uploadedlobster.com/scotty/internal/models" "go.uploadedlobster.com/scotty/pkg/archive" ) @@ -130,7 +130,7 @@ func (a *ExportArchive) IterListens(minTimestamp time.Time) iter.Seq2[Listen, er continue } - f := JSONLFile[Listen]{file: file.f} + f := models.JSONLFile[Listen]{File: file.f} for l, err := range f.IterItems() { if err != nil { yield(Listen{}, err) @@ -161,7 +161,7 @@ func (a *ExportArchive) IterFeedback(minTimestamp time.Time) iter.Seq2[Feedback, return } - j := JSONLFile[Feedback]{file: files[0].File} + j := models.JSONLFile[Feedback]{File: files[0].File} for l, err := range j.IterItems() { if err != nil { yield(Feedback{}, err) @@ -194,42 +194,6 @@ type ListenExportFileInfo struct { f archive.OpenableFile } -type JSONLFile[T any] struct { - file archive.OpenableFile -} - -func (f *JSONLFile[T]) openReader() (*jsonl.Reader, error) { - fio, err := f.file.Open() - if err != nil { - return nil, err - } - reader := jsonl.NewReader(fio) - return &reader, nil -} - -func (f *JSONLFile[T]) IterItems() iter.Seq2[T, error] { - return func(yield func(T, error) bool) { - reader, err := f.openReader() - if err != nil { - var listen T - yield(listen, err) - return - } - defer reader.Close() - - for { - var listen T - err := reader.ReadSingleLine(&listen) - if err != nil { - break - } - if !yield(listen, nil) { - break - } - } - } -} - func getMonthTimeRange(year string, month string) (*timeRange, error) { yearInt, err := strconv.Atoi(year) if err != nil { diff --git a/internal/models/jsonl.go b/internal/models/jsonl.go new file mode 100644 index 0000000..2bb1ea1 --- /dev/null +++ b/internal/models/jsonl.go @@ -0,0 +1,65 @@ +/* +Copyright © 2025 Philipp Wolfer + +This file is part of Scotty. + +Scotty is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later version. + +Scotty is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +Scotty. If not, see . +*/ + +package models + +import ( + "errors" + "iter" + + "github.com/simonfrey/jsonl" + "go.uploadedlobster.com/scotty/pkg/archive" +) + +type JSONLFile[T any] struct { + File archive.OpenableFile +} + +func (f *JSONLFile[T]) openReader() (*jsonl.Reader, error) { + if f.File == nil { + return nil, errors.New("file not set") + } + fio, err := f.File.Open() + if err != nil { + return nil, err + } + reader := jsonl.NewReader(fio) + return &reader, nil +} + +func (f *JSONLFile[T]) IterItems() iter.Seq2[T, error] { + return func(yield func(T, error) bool) { + reader, err := f.openReader() + if err != nil { + var listen T + yield(listen, err) + return + } + defer reader.Close() + + for { + var listen T + err := reader.ReadSingleLine(&listen) + if err != nil { + break + } + if !yield(listen, nil) { + break + } + } + } +}