diff --git a/static/player/source.ts b/static/player/source.ts index 8bd21458..dc297226 100644 --- a/static/player/source.ts +++ b/static/player/source.ts @@ -1,6 +1,6 @@ import { state } from "./state"; import { safeLocalStorage } from "./storage"; -import { isRecord, parseModeSources } from "./validate"; +import { isRecord, parseModeSources, parseSegments } from "./validate"; import { loadVideoSource } from "./video"; export const streamUrlForMode = (mode: string, quality?: string): string => { @@ -20,10 +20,13 @@ export const streamUrlForMode = (mode: string, quality?: string): string => { return url; }; -export const refreshCurrentModeSource = async (signal?: AbortSignal): Promise => { +const loadCurrentModeSource = async ( + signal: AbortSignal | undefined, + forceRefresh: boolean, +): Promise => { const mode = state.playback.currentMode; const res = await fetch( - `/api/watch/episode/${state.episode.malID}/${encodeURIComponent(state.episode.current)}?mode=${encodeURIComponent(mode)}&refresh=1`, + `/api/watch/episode/${state.episode.malID}/${encodeURIComponent(state.episode.current)}?mode=${encodeURIComponent(mode)}${forceRefresh ? "&refresh=1" : ""}`, { signal }, ); if (!res.ok) { @@ -35,14 +38,37 @@ export const refreshCurrentModeSource = async (signal?: AbortSignal): Promise sources[candidate]?.token) ?? ""; + if (sources[initialMode]?.token) { + selectedMode = initialMode; + } + if (sources[mode]?.token) { + selectedMode = mode; + } + const source = sources[selectedMode]; + if (!source?.token) { return false; } - state.playback.modeSources = { ...state.playback.modeSources, [mode]: refreshedSource }; + state.playback.modeSources = { ...state.playback.modeSources, ...sources }; + state.playback.currentMode = selectedMode; + state.playback.modeSwitchedFrom = + typeof data.mode_switched_from === "string" ? data.mode_switched_from : ""; + const startTime = Number(data.start_time_seconds); + if (Number.isFinite(startTime) && startTime > 0) { + state.playback.startTimeSeconds = startTime; + } + state.skip.parsedSegments = parseSegments(data.segments); const preferredQuality = safeLocalStorage.getItem("mal:preferred-quality") || "best"; - loadVideoSource(streamUrlForMode(mode, preferredQuality), refreshedSource.type); + loadVideoSource(streamUrlForMode(selectedMode, preferredQuality), source.type); return true; }; + +export const resolveCurrentModeSource = (signal?: AbortSignal): Promise => + loadCurrentModeSource(signal, false); + +export const refreshCurrentModeSource = (signal?: AbortSignal): Promise => + loadCurrentModeSource(signal, true);