vidstack
Version:
Build awesome media experiences on the web.
53 lines (50 loc) • 1.71 kB
JavaScript
import { onDispose } from 'maverick.js';
import { H as TextTrack, Z as TEXT_TRACK_NATIVE, J as TEXT_TRACK_READY_STATE, _ as TEXT_TRACK_NATIVE_HLS } from '../../media-core.js';
class NativeHLSTextTracks {
constructor(_video, _context) {
this._video = _video;
this._context = _context;
_video.textTracks.onaddtrack = this._onAddTrack.bind(this);
onDispose(this._onDispose.bind(this));
}
_onAddTrack(event) {
const nativeTrack = event.track;
if (!nativeTrack || findTextTrackElement(this._video, nativeTrack))
return;
const track = new TextTrack({
id: nativeTrack.id,
kind: nativeTrack.kind,
label: nativeTrack.label,
language: nativeTrack.language,
type: "vtt"
});
track[TEXT_TRACK_NATIVE] = { track: nativeTrack };
track[TEXT_TRACK_READY_STATE] = 2;
track[TEXT_TRACK_NATIVE_HLS] = true;
let lastIndex = 0;
const onCueChange = (event2) => {
if (!nativeTrack.cues)
return;
for (let i = lastIndex; i < nativeTrack.cues.length; i++) {
track.addCue(nativeTrack.cues[i], event2);
lastIndex++;
}
};
onCueChange(event);
nativeTrack.oncuechange = onCueChange;
this._context.textTracks.add(track, event);
track.setMode(nativeTrack.mode, event);
}
_onDispose() {
this._video.textTracks.onaddtrack = null;
for (const track of this._context.textTracks) {
const nativeTrack = track[TEXT_TRACK_NATIVE]?.track;
if (nativeTrack?.oncuechange)
nativeTrack.oncuechange = null;
}
}
}
function findTextTrackElement(video, track) {
return Array.from(video.children).find((el) => el.track === track);
}
export { NativeHLSTextTracks as N };