Implement Seriatim transcript parsing

This commit is contained in:
2026-07-03 21:13:12 +00:00
parent 47013daa04
commit 95a54505cf
5 changed files with 531 additions and 6 deletions

View File

@@ -3,6 +3,8 @@ package seriatim
import (
"bytes"
"encoding/json"
"fmt"
"io"
)
type transcript struct {
@@ -19,11 +21,55 @@ type segment struct {
}
func decodeTranscript(raw []byte) (transcript, error) {
var out transcript
decoder := json.NewDecoder(bytes.NewReader(raw))
decoder.UseNumber()
if err := decoder.Decode(&out); err != nil {
var fields map[string]json.RawMessage
if err := decodeJSON(raw, &fields); err != nil {
return transcript{}, err
}
return out, nil
if fields == nil {
return transcript{}, fmt.Errorf("top-level value must be an object")
}
metadataRaw, ok := fields["metadata"]
if !ok {
return transcript{}, fmt.Errorf("metadata is required")
}
var metadata map[string]any
if err := decodeJSON(metadataRaw, &metadata); err != nil {
return transcript{}, fmt.Errorf("metadata must be an object: %w", err)
}
if metadata == nil {
return transcript{}, fmt.Errorf("metadata must be an object")
}
segmentsRaw, ok := fields["segments"]
if !ok {
return transcript{}, fmt.Errorf("segments are required")
}
var segments []segment
if err := decodeJSON(segmentsRaw, &segments); err != nil {
return transcript{}, fmt.Errorf("segments must be an array: %w", err)
}
if segments == nil {
return transcript{}, fmt.Errorf("segments must be an array")
}
return transcript{
Metadata: metadata,
Segments: segments,
}, nil
}
func decodeJSON(raw []byte, out any) error {
decoder := json.NewDecoder(bytes.NewReader(raw))
decoder.UseNumber()
if err := decoder.Decode(out); err != nil {
return err
}
if err := decoder.Decode(&struct{}{}); err != io.EOF {
if err == nil {
return fmt.Errorf("unexpected trailing JSON value")
}
return err
}
return nil
}