import { swallow } from "./diagnostics"; export type RuntimeMediaClip = { el: HTMLVideoElement | HTMLAudioElement; start: number; mediaStart: number; duration: number; end: number; volume: number | null; playbackRate: number; loop: boolean; /** Source media duration in seconds (from el.duration). Used for loop wrapping. */ sourceDuration: number | null; }; export function refreshRuntimeMediaCache(params?: { resolveStartSeconds?: (element: Element) => number; resolveDurationSeconds?: (element: HTMLVideoElement | HTMLAudioElement) => number | null; shouldIncludeElement?: (element: HTMLVideoElement | HTMLAudioElement) => boolean; }): { timedMediaEls: Array; mediaClips: RuntimeMediaClip[]; videoClips: RuntimeMediaClip[]; maxMediaEnd: number; } { const mediaEls = Array.from(document.querySelectorAll("video, audio")) as Array< HTMLVideoElement | HTMLAudioElement >; const timedMediaEls = params?.shouldIncludeElement ? mediaEls.filter((el) => params.shouldIncludeElement?.(el)) : mediaEls.filter((el) => el.hasAttribute("data-start")); const mediaClips: RuntimeMediaClip[] = []; const videoClips: RuntimeMediaClip[] = []; let maxMediaEnd = 0; for (const el of timedMediaEls) { const start = params?.resolveStartSeconds ? params.resolveStartSeconds(el) : Number.parseFloat(el.dataset.start ?? "0"); if (!Number.isFinite(start)) continue; const mediaStart = Number.parseFloat(el.dataset.playbackStart ?? el.dataset.mediaStart ?? "0") || 0; // Read per-element rate from the native defaultPlaybackRate property. // LLMs set this via el.defaultPlaybackRate = 0.5 in a