feat: add type field to ModeSource and pass to loadVideoSource

This commit is contained in:
2026-06-14 21:37:49 +02:00
parent ef36578c4b
commit c891382efb
6 changed files with 14 additions and 5 deletions

View File

@@ -8,6 +8,7 @@ import { updateOverlay, isAutoplayEnabled, switchEpisodeRange } from "./ui";
import { markEpisodeTransition } from "../progress"; import { markEpisodeTransition } from "../progress";
import { safeLocalStorage } from "../storage"; import { safeLocalStorage } from "../storage";
import { completeAnime } from "./complete"; import { completeAnime } from "./complete";
import { loadVideoSource } from "../video";
/** /**
* Handles video end: either marks complete or loads next episode. * Handles video end: either marks complete or loads next episode.
@@ -89,8 +90,9 @@ export const goToNextEpisode = async (): Promise<void> => {
// load new video (keep preferences) // load new video (keep preferences)
const preferredQuality = safeLocalStorage.getItem("mal:preferred-quality") || "best"; const preferredQuality = safeLocalStorage.getItem("mal:preferred-quality") || "best";
state.video.src = `${state.streamURL}?mode=${encodeURIComponent(fallback)}&token=${encodeURIComponent(state.modeSources[fallback].token)}${preferredQuality !== "best" ? `&quality=${encodeURIComponent(preferredQuality)}` : ""}`; const source = state.modeSources[fallback];
state.video.load(); const nextSourceURL = `${state.streamURL}?mode=${encodeURIComponent(fallback)}&token=${encodeURIComponent(source.token)}${preferredQuality !== "best" ? `&quality=${encodeURIComponent(preferredQuality)}` : ""}`;
loadVideoSource(nextSourceURL, source.type);
if (!state.video.paused) { if (!state.video.paused) {
state.video.play().catch(() => undefined); state.video.play().catch(() => undefined);
} }

View File

@@ -13,6 +13,7 @@ import { setupSegmentEditor } from "./skip/editor";
import { setupThumbnails } from "./episodes/thumbnails"; import { setupThumbnails } from "./episodes/thumbnails";
import { markEpisodeTransition, saveEndedProgress, setupProgress } from "./progress"; import { markEpisodeTransition, saveEndedProgress, setupProgress } from "./progress";
import { safeLocalStorage } from "./storage"; import { safeLocalStorage } from "./storage";
import { destroyVideoSource, loadVideoSource } from "./video";
import { import {
absoluteTimeFromDisplay, absoluteTimeFromDisplay,
absoluteTimeFromRatio, absoluteTimeFromRatio,
@@ -49,6 +50,7 @@ const showPreviewPopover = (): void => {
}; };
const teardownPlayer = (): void => { const teardownPlayer = (): void => {
destroyVideoSource();
cleanup?.(); cleanup?.();
cleanup = null; cleanup = null;
currentContainer = null; currentContainer = null;
@@ -117,7 +119,9 @@ const initPlayer = (): void => {
const preferredQuality = safeLocalStorage.getItem("mal:preferred-quality") || "best"; const preferredQuality = safeLocalStorage.getItem("mal:preferred-quality") || "best";
const streamToken = state.modeSources[state.currentMode]?.token; const streamToken = state.modeSources[state.currentMode]?.token;
if (streamToken) { if (streamToken) {
state.video.src = `${state.streamURL}?mode=${encodeURIComponent(state.currentMode)}&token=${encodeURIComponent(streamToken)}${preferredQuality !== "best" ? `&quality=${encodeURIComponent(preferredQuality)}` : ""}`; const source = state.modeSources[state.currentMode];
const url = `${state.streamURL}?mode=${encodeURIComponent(state.currentMode)}&token=${encodeURIComponent(streamToken)}${preferredQuality !== "best" ? `&quality=${encodeURIComponent(preferredQuality)}` : ""}`;
loadVideoSource(url, source?.type);
} }
setupProgress(); setupProgress();

View File

@@ -33,6 +33,7 @@ const parseModeSources = (v: unknown): Record<string, ModeSource> => {
const qualities = value.qualities; const qualities = value.qualities;
out[key] = { out[key] = {
token: value.token, token: value.token,
type: typeof value.type === "string" ? value.type : undefined,
subtitles, subtitles,
qualities: isStringArray(qualities) ? qualities : undefined, qualities: isStringArray(qualities) ? qualities : undefined,
}; };
@@ -97,7 +98,7 @@ export const switchMode = (mode: string): void => {
"[data-quality-select]", "[data-quality-select]",
) as HTMLSelectElement | null; ) as HTMLSelectElement | null;
const url = streamUrlForMode(mode, qualitySelect?.value); const url = streamUrlForMode(mode, qualitySelect?.value);
loadVideoSource(url); loadVideoSource(url, state.modeSources[mode]?.type);
// Fallback: if the media element doesn't actually switch sources (some browsers can get "stuck"), // Fallback: if the media element doesn't actually switch sources (some browsers can get "stuck"),
// reload the page with the desired mode and resume time via sessionStorage. // reload the page with the desired mode and resume time via sessionStorage.

View File

@@ -11,7 +11,7 @@ export const switchQuality = (quality: string): void => {
const url = streamUrlForMode(state.currentMode, quality); const url = streamUrlForMode(state.currentMode, quality);
if (!url) return; if (!url) return;
safeLocalStorage.setItem("mal:preferred-quality", quality); safeLocalStorage.setItem("mal:preferred-quality", quality);
loadVideoSource(url); loadVideoSource(url, state.modeSources[state.currentMode]?.type);
}; };
/** /**

View File

@@ -203,6 +203,7 @@ export const initState = (c: HTMLElement): boolean => {
const qualities = value.qualities; const qualities = value.qualities;
out[key] = { out[key] = {
token: value.token, token: value.token,
type: typeof value.type === "string" ? value.type : undefined,
subtitles, subtitles,
qualities: isStringArray(qualities) ? qualities : undefined, qualities: isStringArray(qualities) ? qualities : undefined,
}; };

View File

@@ -1,6 +1,7 @@
// stream source for a single mode (sub/dub) // stream source for a single mode (sub/dub)
export interface ModeSource { export interface ModeSource {
token: string; token: string;
type?: string;
subtitles: SubtitleItem[]; subtitles: SubtitleItem[];
qualities?: string[]; qualities?: string[];
} }