import { state } from './state'; import { displayTimeFromAbsolute, absoluteTimeFromDisplay } from './timeline'; const streamUrlForMode = (mode: string, quality?: string): string => { const src = state.modeSources[mode]; if (!src?.token) return ''; let url = `${state.streamURL}?mode=${encodeURIComponent(mode)}&token=${encodeURIComponent(src.token)}`; if (quality && quality !== 'best') url += `&quality=${encodeURIComponent(quality)}`; return url; }; const loadVideo = (url: string): void => { if (!url) return; const wasPlaying = !state.video.paused; const prevTime = displayTimeFromAbsolute(state.video.currentTime); state.video.src = url; state.video.load(); state.pendingSeekTime = prevTime; if (wasPlaying) state.video.play().catch(() => {}); }; export const switchQuality = (quality: string): void => { const url = streamUrlForMode(state.currentMode, quality); if (!url) return; localStorage.setItem('mal:preferred-quality', quality); loadVideo(url); }; export const updateQualityOptions = (): void => { const select = state.container.querySelector('[data-quality-select]') as HTMLSelectElement | null; if (!select) return; const qualities = state.modeSources[state.currentMode]?.qualities ?? []; select.innerHTML = ''; const best = document.createElement('option'); best.value = 'best'; best.textContent = 'Auto / Best'; select.appendChild(best); qualities.forEach(q => { const opt = document.createElement('option'); opt.value = q; opt.textContent = q; select.appendChild(opt); }); const preferred = localStorage.getItem('mal:preferred-quality') || 'best'; select.value = qualities.includes(preferred) ? preferred : 'best'; const wrapper = select.parentElement; wrapper?.classList.toggle('hidden', qualities.length === 0); }; export const setupQuality = (): void => { const select = state.container.querySelector('[data-quality-select]') as HTMLSelectElement | null; select?.addEventListener('change', e => { switchQuality((e.target as HTMLSelectElement).value); }); };