package jellyfin
import (
"bufio"
"bytes"
"encoding/json"
"io"
"iter"
"strconv"
"github.com/navidrome/navidrome/server/jellyfin/dto"
)
func streamItemsEnvelope(w io.Writer, items iter.Seq2[dto.BaseItemDto, error], total, start int) error {
bw := bufio.NewWriterSize(w, 64*1024)
_, _ = bw.WriteString(`{"Items":[`)
if err := encodeItems(bw, items); err != nil {
_ = bw.Flush()
return err
}
_, _ = bw.WriteString(`],"TotalRecordCount":`)
_, _ = bw.WriteString(strconv.Itoa(total))
_, _ = bw.WriteString(`,"StartIndex":`)
_, _ = bw.WriteString(strconv.Itoa(start))
_, _ = bw.WriteString("}\n")
return bw.Flush()
}
func streamItemsArray(w io.Writer, items iter.Seq2[dto.BaseItemDto, error]) error {
bw := bufio.NewWriterSize(w, 64*1024)
_, _ = bw.WriteString("[")
if err := encodeItems(bw, items); err != nil {
_ = bw.Flush()
return err
}
_, _ = bw.WriteString("]\n")
return bw.Flush()
}
func encodeItems(bw *bufio.Writer, items iter.Seq2[dto.BaseItemDto, error]) error {
var itemBuf bytes.Buffer
enc := json.NewEncoder(&itemBuf)
first := true
for item, err := range items {
if err != nil {
return err
}
if !first {
if _, err := bw.WriteString(","); err != nil {
return err
}
}
first = false
itemBuf.Reset()
if err := enc.Encode(item); err != nil {
return err
}
b := itemBuf.Bytes()
if _, err := bw.Write(b[:len(b)-1]); err != nil {
return err
}
}
return nil
}
func sliceItems(items []dto.BaseItemDto) iter.Seq2[dto.BaseItemDto, error] {
return func(yield func(dto.BaseItemDto, error) bool) {
for i := range items {
if !yield(items[i], nil) {
return
}
}
}
}