- Wire introdb marker fetching into playback and Jellyfin compat - Persist and expose recap/preview markers alongside intro and credits - Add new playback/profile settings for recap and preview behavior
88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
package playback
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func TestNewChapterThumbnailReadyEvent(t *testing.T) {
|
|
event, err := NewChapterThumbnailReadyEvent(
|
|
"session-1",
|
|
42,
|
|
3,
|
|
"https://example.com/thumb.jpg",
|
|
"thumbhash",
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("NewChapterThumbnailReadyEvent() error = %v", err)
|
|
}
|
|
|
|
if event.Type != RealtimeMessageTypeEvent {
|
|
t.Fatalf("event.Type = %q, want %q", event.Type, RealtimeMessageTypeEvent)
|
|
}
|
|
if event.Name != RealtimeEventChapterThumbnailReady {
|
|
t.Fatalf("event.Name = %q, want %q", event.Name, RealtimeEventChapterThumbnailReady)
|
|
}
|
|
|
|
var payload ChapterThumbnailReadyPayload
|
|
if err := json.Unmarshal(event.Payload, &payload); err != nil {
|
|
t.Fatalf("json.Unmarshal(payload): %v", err)
|
|
}
|
|
if payload.SessionID != "session-1" || payload.FileID != 42 || payload.ChapterIndex != 3 {
|
|
t.Fatalf("payload = %#v, want session/file/chapter identifiers", payload)
|
|
}
|
|
if payload.ThumbnailURL != "https://example.com/thumb.jpg" {
|
|
t.Fatalf("payload.ThumbnailURL = %q, want thumbnail URL", payload.ThumbnailURL)
|
|
}
|
|
}
|
|
|
|
func TestNewMarkersUpdatedEvent(t *testing.T) {
|
|
event, err := NewMarkersUpdatedEvent(
|
|
"session-1",
|
|
42,
|
|
&TimeRangePayload{Start: 12, End: 75},
|
|
nil,
|
|
nil,
|
|
nil,
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("NewMarkersUpdatedEvent() error = %v", err)
|
|
}
|
|
if event.Name != RealtimeEventMarkersUpdated {
|
|
t.Fatalf("event.Name = %q, want %q", event.Name, RealtimeEventMarkersUpdated)
|
|
}
|
|
|
|
var payload MarkersUpdatedPayload
|
|
if err := json.Unmarshal(event.Payload, &payload); err != nil {
|
|
t.Fatalf("json.Unmarshal(payload): %v", err)
|
|
}
|
|
if payload.SessionID != "session-1" || payload.FileID != 42 {
|
|
t.Fatalf("payload = %#v, want session/file identifiers", payload)
|
|
}
|
|
if payload.Intro == nil || payload.Intro.Start != 12 || payload.Intro.End != 75 {
|
|
t.Fatalf("payload.Intro = %#v, want intro range", payload.Intro)
|
|
}
|
|
if payload.Credits != nil {
|
|
t.Fatalf("payload.Credits = %#v, want nil", payload.Credits)
|
|
}
|
|
}
|
|
|
|
func TestParseCommandEnvelopeStillWorks(t *testing.T) {
|
|
command, err := ParseCommandEnvelope([]byte(`{
|
|
"type":"command",
|
|
"command_id":"cmd-1",
|
|
"session_id":"session-1",
|
|
"name":"pause",
|
|
"payload":{"reason":"test"}
|
|
}`))
|
|
if err != nil {
|
|
t.Fatalf("ParseCommandEnvelope() error = %v", err)
|
|
}
|
|
if command.Type != RealtimeMessageTypeCommand {
|
|
t.Fatalf("command.Type = %q, want %q", command.Type, RealtimeMessageTypeCommand)
|
|
}
|
|
if command.Name != CommandPause {
|
|
t.Fatalf("command.Name = %q, want %q", command.Name, CommandPause)
|
|
}
|
|
}
|