// Run only on the local HTTP fixture's first origin. No microphone or upload. async function loadTeachingTrack(mediaURL, trackURL, timeoutMs = 5000) { const media = document.createElement('video'); media.crossOrigin = 'anonymous'; media.preload = 'metadata'; media.muted = true; const track = document.createElement('track'); track.kind = 'subtitles'; track.srclang = 'fa'; track.label = 'متن آزمایشی'; const result = await new Promise(resolve => { let timer; const finish = event => { clearTimeout(timer); track.onload = track.onerror = null; resolve({event, readyState: track.readyState, cueCount: track.track.cues ? track.track.cues.length : null, cues: track.track.cues ? Array.from(track.track.cues, c => ({id:c.id, start:c.startTime, end:c.endTime, text:c.text})) : []}); }; track.onload = () => finish('load'); track.onerror = () => finish('error'); timer = setTimeout(() => finish('timeout'), timeoutMs); media.src = mediaURL; track.src = trackURL; media.append(track); document.body.append(media); track.track.mode = 'hidden'; media.load(); }); media.pause(); media.removeAttribute('src'); media.load(); media.remove(); return result; }