diff --git a/README.md b/README.md index fd3f6aa..066afae 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,10 @@ Then put it behind your existing reverse proxy like everything else as its own always-on-top bar, duplicating the cast icon and overlapping the new bottom bar in fullscreen) in favor of fully custom play/pause, a seek bar, and mute — see docs/architecture.md +- [x] Skip intro / jump to next episode at end credits, using Emby's own + native marker detection (`EnableMarkerDetection` + its "Detect + Episode Intros" task) rather than building fingerprinting + ourselves — see docs/architecture.md - [ ] Try a full party end-to-end with two real accounts (still the main gap) - [ ] Try casting to a real Chromecast (only the SDK's own bootstrap is confirmed here — no real device/session) diff --git a/client/src/api/embyApi.ts b/client/src/api/embyApi.ts index 13d71c8..68774a7 100644 --- a/client/src/api/embyApi.ts +++ b/client/src/api/embyApi.ts @@ -3,7 +3,7 @@ // module just wraps fetch calls to our own /api/* routes. See // docs/architecture.md for why this changed from the first version (CORS, // plus not wanting the browser to hold an Emby token at all). -import type { ItemDto, LibraryDto, PlaybackOptionsDto, SeasonDto } from '../types'; +import type { ItemDto, LibraryDto, PlaybackMarkersDto, PlaybackOptionsDto, SeasonDto } from '../types'; async function apiFetch(path: string, options: RequestInit = {}): Promise { const res = await fetch(path, { @@ -116,6 +116,10 @@ export function getPlaybackOptions(itemId: string): Promise return apiFetch(`/api/catalog/item/${itemId}/playback-options`); } +export function getPlaybackMarkers(itemId: string): Promise { + return apiFetch(`/api/catalog/item/${itemId}/markers`); +} + /** The party's own shared Emby stream (server/src/services/ * PartyStreamService.ts) - one negotiated PlaybackInfo session reused * by every member, instead of each viewer's own