UNPKG

@remotion/media-parser

Version:

A pure JavaScript library for parsing video files

145 lines (144 loc) 5.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.m3uState = void 0; const sample_sorter_1 = require("../containers/m3u/sample-sorter"); const log_1 = require("../log"); const m3uState = (logLevel) => { let selectedMainPlaylist = null; let associatedPlaylists = null; const hasEmittedVideoTrack = {}; const hasEmittedAudioTrack = {}; const hasEmittedDoneWithTracks = {}; let hasFinishedManifest = false; const seekToSecondsToProcess = {}; const nextSeekShouldSubtractChunks = {}; let readyToIterateOverM3u = false; const allChunksProcessed = {}; const m3uStreamRuns = {}; const tracksDone = {}; const getMainPlaylistUrl = () => { if (!selectedMainPlaylist) { throw new Error('No main playlist selected'); } const playlistUrl = selectedMainPlaylist.type === 'initial-url' ? selectedMainPlaylist.url : selectedMainPlaylist.stream.src; return playlistUrl; }; const getSelectedPlaylists = () => { return [ getMainPlaylistUrl(), ...(associatedPlaylists !== null && associatedPlaylists !== void 0 ? associatedPlaylists : []).map((p) => p.src), ]; }; const getAllChunksProcessedForPlaylist = (src) => allChunksProcessed[src]; const mp4HeaderSegments = {}; const setMp4HeaderSegment = (playlistUrl, structure) => { mp4HeaderSegments[playlistUrl] = structure; }; const getMp4HeaderSegment = (playlistUrl) => { return mp4HeaderSegments[playlistUrl]; }; return { setSelectedMainPlaylist: (stream) => { selectedMainPlaylist = stream; }, getSelectedMainPlaylist: () => selectedMainPlaylist, setHasEmittedVideoTrack: (src, callback) => { hasEmittedVideoTrack[src] = callback; }, hasEmittedVideoTrack: (src) => { const value = hasEmittedVideoTrack[src]; if (value === undefined) { return false; } return value; }, setHasEmittedAudioTrack: (src, callback) => { hasEmittedAudioTrack[src] = callback; }, hasEmittedAudioTrack: (src) => { const value = hasEmittedAudioTrack[src]; if (value === undefined) { return false; } return value; }, setHasEmittedDoneWithTracks: (src) => { hasEmittedDoneWithTracks[src] = true; }, hasEmittedDoneWithTracks: (src) => hasEmittedDoneWithTracks[src] !== undefined, setReadyToIterateOverM3u: () => { readyToIterateOverM3u = true; }, isReadyToIterateOverM3u: () => readyToIterateOverM3u, setAllChunksProcessed: (src) => { allChunksProcessed[src] = true; }, clearAllChunksProcessed: () => { Object.keys(allChunksProcessed).forEach((key) => { delete allChunksProcessed[key]; }); }, getAllChunksProcessedForPlaylist, getAllChunksProcessedOverall: () => { if (!selectedMainPlaylist) { return false; } const selectedPlaylists = getSelectedPlaylists(); return selectedPlaylists.every((url) => allChunksProcessed[url]); }, setHasFinishedManifest: () => { hasFinishedManifest = true; }, hasFinishedManifest: () => hasFinishedManifest, setM3uStreamRun: (playlistUrl, run) => { if (!run) { delete m3uStreamRuns[playlistUrl]; return; } m3uStreamRuns[playlistUrl] = run; }, setTracksDone: (playlistUrl) => { tracksDone[playlistUrl] = true; const selectedPlaylists = getSelectedPlaylists(); return selectedPlaylists.every((url) => tracksDone[url]); }, getTrackDone: (playlistUrl) => { return tracksDone[playlistUrl]; }, clearTracksDone: () => { Object.keys(tracksDone).forEach((key) => { delete tracksDone[key]; }); }, getM3uStreamRun: (playlistUrl) => { var _a; return (_a = m3uStreamRuns[playlistUrl]) !== null && _a !== void 0 ? _a : null; }, abortM3UStreamRuns: () => { const values = Object.values(m3uStreamRuns); if (values.length === 0) { return; } log_1.Log.trace(logLevel, `Aborting ${values.length} M3U stream runs`); values.forEach((run) => { run.abort(); }); }, setAssociatedPlaylists: (playlists) => { associatedPlaylists = playlists; }, getAssociatedPlaylists: () => associatedPlaylists, getSelectedPlaylists, sampleSorter: (0, sample_sorter_1.sampleSorter)({ logLevel, getAllChunksProcessedForPlaylist }), setMp4HeaderSegment, getMp4HeaderSegment, setSeekToSecondsToProcess: (playlistUrl, m3uSeek) => { seekToSecondsToProcess[playlistUrl] = m3uSeek; }, getSeekToSecondsToProcess: (playlistUrl) => { var _a; return (_a = seekToSecondsToProcess[playlistUrl]) !== null && _a !== void 0 ? _a : null; }, setNextSeekShouldSubtractChunks: (playlistUrl, chunks) => { nextSeekShouldSubtractChunks[playlistUrl] = chunks; }, getNextSeekShouldSubtractChunks: (playlistUrl) => { var _a; return (_a = nextSeekShouldSubtractChunks[playlistUrl]) !== null && _a !== void 0 ? _a : 0; }, }; }; exports.m3uState = m3uState;