diff --git a/static/player/mode.ts b/static/player/mode.ts index 9a8cbb7..fcd53f2 100644 --- a/static/player/mode.ts +++ b/static/player/mode.ts @@ -1,16 +1,21 @@ import type { ModeSource } from "./types"; -import { state } from "./state"; + import { showControls } from "./controls"; -import { updateSubtitleOptions } from "./subtitles"; import { updateQualityOptions } from "./quality"; -import { safeLocalStorage } from "./storage"; import { streamUrlForMode } from "./source"; -import { loadVideoSource } from "./video"; +import { state } from "./state"; +import { safeLocalStorage } from "./storage"; +import { updateSubtitleOptions } from "./subtitles"; import { isRecord, parseModeSources } from "./validate"; +import { loadVideoSource } from "./video"; const alternateModeFor = (mode: string): "sub" | "dub" | null => { - if (mode === "sub") return "dub"; - if (mode === "dub") return "sub"; + if (mode === "sub") { + return "dub"; + } + if (mode === "dub") { + return "sub"; + } return null; }; @@ -23,10 +28,14 @@ const fetchModeSource = async ( `/api/watch/episode/${state.episode.malID}/${encodeURIComponent(episode)}?mode=${encodeURIComponent(mode)}`, { signal }, ); - if (!res.ok) throw new Error(`mode source request failed with status ${res.status}`); + if (!res.ok) { + throw new Error(`mode source request failed with status ${res.status}`); + } const data: unknown = await res.json(); - if (!isRecord(data)) return null; + if (!isRecord(data)) { + return null; + } const sources = parseModeSources(data.mode_sources); return sources[mode] ?? null; @@ -35,7 +44,9 @@ const fetchModeSource = async ( export const ensurePreferredModeSource = async (signal?: AbortSignal): Promise => { const storedMode = safeLocalStorage.getItem("player-audio-mode"); const preferredMode = storedMode === "sub" || storedMode === "dub" ? storedMode : null; - if (!preferredMode) return state.playback.currentMode; + if (!preferredMode) { + return state.playback.currentMode; + } if (state.playback.modeSources[preferredMode]?.token) { state.playback.currentMode = preferredMode; return preferredMode; @@ -43,7 +54,9 @@ export const ensurePreferredModeSource = async (signal?: AbortSignal): Promise => { const alternateMode = alternateModeFor(state.playback.currentMode); - if (!alternateMode) return; - if (state.playback.modeSources[alternateMode]?.token) return; + if (!alternateMode) { + return; + } + if (state.playback.modeSources[alternateMode]?.token) { + return; + } try { const alternateSource = await fetchModeSource(state.episode.current, alternateMode, signal); - if (!alternateSource?.token) return; + if (!alternateSource?.token) { + return; + } state.playback.modeSources = { ...state.playback.modeSources, @@ -78,17 +97,18 @@ export const hydrateAlternateMode = async (signal?: AbortSignal): Promise updateQualityOptions(); updateModeButtons(); } catch (error: unknown) { - if (error instanceof DOMException && error.name === "AbortError") return; + if (error instanceof DOMException && error.name === "AbortError") { + return; + } console.error("failed to hydrate alternate mode:", error); } }; -/** - * Switches between sub/dub mode. - * Saves preference to localStorage, reloads video src. - */ +/** Switches between sub/dub mode. Saves preference to localStorage, reloads video src. */ const switchMode = (mode: string): void => { - if (!state.playback.availableModes.includes(mode) || mode === state.playback.currentMode) return; + if (!state.playback.availableModes.includes(mode) || mode === state.playback.currentMode) { + return; + } state.playback.currentMode = mode; safeLocalStorage.setItem("player-audio-mode", mode); const qualitySelect = state.elements.container.querySelector( @@ -104,9 +124,13 @@ const switchMode = (mode: string): void => { const expectedMode = mode; const resumeSeconds = state.elements.video.currentTime; window.setTimeout(() => { - if (!expectedToken) return; + if (!expectedToken) { + return; + } const currentSrc = state.elements.video.currentSrc || state.elements.video.src || ""; - if (currentSrc.includes(`token=${encodeURIComponent(expectedToken)}`)) return; + if (currentSrc.includes(`token=${encodeURIComponent(expectedToken)}`)) { + return; + } try { sessionStorage.setItem("mal:resume-after-mode-switch", String(resumeSeconds)); @@ -123,10 +147,7 @@ const switchMode = (mode: string): void => { updateModeButtons(); }; -/** - * Updates dub/sub button styling based on current mode. - * Disables unavailable modes. - */ +/** Updates dub/sub button styling based on current mode. Disables unavailable modes. */ export const updateModeButtons = (): void => { const dub = state.elements.container.querySelector("[data-mode-dub]") as HTMLButtonElement | null; const sub = state.elements.container.querySelector("[data-mode-sub]") as HTMLButtonElement | null; @@ -149,9 +170,7 @@ export const updateModeButtons = (): void => { } }; -/** - * Binds click handlers for mode buttons and autoplay toggle. - */ +/** Binds click handlers for mode buttons and autoplay toggle. */ export const setupMode = (): void => { const dub = state.elements.container.querySelector("[data-mode-dub]") as HTMLButtonElement | null; const sub = state.elements.container.querySelector("[data-mode-sub]") as HTMLButtonElement | null;