1
0
Fork 0
mirror of https://github.com/DanielnetoDotCom/YouPHPTube synced 2025-10-05 19:42:38 +02:00

Node modules update

This commit is contained in:
DanieL 2022-08-31 09:55:36 -03:00
parent f394ef7856
commit 12225f5c27
123 changed files with 6221 additions and 3459 deletions

View file

@ -42231,7 +42231,7 @@ module.exports = {
abr: true,
skip_ua: ['firefox', 'safari', {
name: 'chrome',
version: '69.0'
version: '75.0'
}, {
name: 'chrome',
version: '79.0'

File diff suppressed because one or more lines are too long

220
node_modules/hls.js/dist/hls.js generated vendored
View file

@ -1551,7 +1551,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _fragment_finders__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./fragment-finders */ "./src/controller/fragment-finders.ts");
/* harmony import */ var _utils_discontinuities__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/discontinuities */ "./src/utils/discontinuities.ts");
/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../errors */ "./src/errors.ts");
/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts");
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -1573,7 +1572,6 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Objec
var TICK_INTERVAL = 100; // how often to tick in ms
var AudioStreamController = /*#__PURE__*/function (_BaseStreamController) {
@ -1674,6 +1672,7 @@ var AudioStreamController = /*#__PURE__*/function (_BaseStreamController) {
if (lastCurrentTime > 0 && startPosition === -1) {
this.log("Override startPosition with lastCurrentTime @" + lastCurrentTime.toFixed(3));
startPosition = lastCurrentTime;
this.state = _base_stream_controller__WEBPACK_IMPORTED_MODULE_1__["State"].IDLE;
} else {
this.loadedmetadata = false;
@ -1754,7 +1753,7 @@ var AudioStreamController = /*#__PURE__*/function (_BaseStreamController) {
}
} else if (this.videoTrackCC !== this.waitingVideoCC) {
// Drop waiting fragment if videoTrackCC has changed since waitingFragment was set and initPTS was not found
_utils_logger__WEBPACK_IMPORTED_MODULE_14__["logger"].log("Waiting fragment cc (" + frag.cc + ") cancelled because video is at cc " + this.videoTrackCC);
this.log("Waiting fragment cc (" + frag.cc + ") cancelled because video is at cc " + this.videoTrackCC);
this.clearWaitingFragment();
} else {
// Drop waiting fragment if an earlier fragment is needed
@ -1763,7 +1762,7 @@ var AudioStreamController = /*#__PURE__*/function (_BaseStreamController) {
var waitingFragmentAtPosition = Object(_fragment_finders__WEBPACK_IMPORTED_MODULE_11__["fragmentWithinToleranceTest"])(bufferInfo.end, this.config.maxFragLookUpTolerance, frag);
if (waitingFragmentAtPosition < 0) {
_utils_logger__WEBPACK_IMPORTED_MODULE_14__["logger"].log("Waiting fragment cc (" + frag.cc + ") @ " + frag.start + " cancelled because another fragment at " + bufferInfo.end + " is needed");
this.log("Waiting fragment cc (" + frag.cc + ") @ " + frag.start + " cancelled because another fragment at " + bufferInfo.end + " is needed");
this.clearWaitingFragment();
}
}
@ -1787,6 +1786,12 @@ var AudioStreamController = /*#__PURE__*/function (_BaseStreamController) {
}
};
_proto.resetLoadingState = function resetLoadingState() {
this.clearWaitingFragment();
_BaseStreamController.prototype.resetLoadingState.call(this);
};
_proto.onTickEnd = function onTickEnd() {
var media = this.media;
@ -2074,7 +2079,7 @@ var AudioStreamController = /*#__PURE__*/function (_BaseStreamController) {
var chunkMeta = new _types_transmuxer__WEBPACK_IMPORTED_MODULE_10__["ChunkMetadata"](frag.level, frag.sn, frag.stats.chunkCount, payload.byteLength, partIndex, partial);
transmuxer.push(payload, initSegmentData, audioCodec, '', frag, part, details.totalduration, accurateTimeOffset, chunkMeta, initPTS);
} else {
_utils_logger__WEBPACK_IMPORTED_MODULE_14__["logger"].log("Unknown video PTS for cc " + frag.cc + ", waiting for video PTS before demuxing audio frag " + frag.sn + " of [" + details.startSN + " ," + details.endSN + "],track " + trackId);
this.log("Unknown video PTS for cc " + frag.cc + ", waiting for video PTS before demuxing audio frag " + frag.sn + " of [" + details.startSN + " ," + details.endSN + "],track " + trackId);
var _this$waitingData = this.waitingData = this.waitingData || {
frag: frag,
@ -3654,8 +3659,6 @@ var BaseStreamController = /*#__PURE__*/function (_TaskLoop) {
};
_proto.getNextFragment = function getNextFragment(pos, levelDetails) {
var _frag, _frag2;
var fragments = levelDetails.fragments;
var fragLen = fragments.length;
@ -3693,11 +3696,15 @@ var BaseStreamController = /*#__PURE__*/function (_TaskLoop) {
if (!frag) {
var end = config.lowLatencyMode ? levelDetails.partEnd : levelDetails.fragmentEnd;
frag = this.getFragmentAtPosition(pos, end, levelDetails);
} // If an initSegment is present, it must be buffered first
}
return this.mapToInitFragWhenRequired(frag);
};
if ((_frag = frag) !== null && _frag !== void 0 && _frag.initSegment && !((_frag2 = frag) !== null && _frag2 !== void 0 && _frag2.initSegment.data) && !this.bitrateTest) {
frag = frag.initSegment;
_proto.mapToInitFragWhenRequired = function mapToInitFragWhenRequired(frag) {
// If an initSegment is present, it must be buffered first
if (frag !== null && frag !== void 0 && frag.initSegment && !(frag !== null && frag !== void 0 && frag.initSegment.data) && !this.bitrateTest) {
return frag.initSegment;
}
return frag;
@ -9553,7 +9560,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _types_transmuxer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../types/transmuxer */ "./src/types/transmuxer.ts");
/* harmony import */ var _gap_controller__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./gap-controller */ "./src/controller/gap-controller.ts");
/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../errors */ "./src/errors.ts");
/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts");
@ -9578,7 +9584,6 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Objec
var TICK_INTERVAL = 100; // how often to tick in ms
var StreamController = /*#__PURE__*/function (_BaseStreamController) {
@ -9598,7 +9603,6 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
_this.onvplaying = null;
_this.onvseeked = null;
_this.fragLastKbps = 0;
_this.stalled = false;
_this.couldBacktrack = false;
_this.backtrackFragment = null;
_this.audioCodecSwitch = false;
@ -10071,7 +10075,7 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
this.log('Trigger BUFFER_RESET');
this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_RESET, undefined);
this.fragmentTracker.removeAllFragments();
this.couldBacktrack = this.stalled = false;
this.couldBacktrack = false;
this.startPosition = this.lastCurrentTime = 0;
this.fragPlaying = null;
this.backtrackFragment = null;
@ -10470,7 +10474,7 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
if (startPosition >= 0 && currentTime < startPosition) {
if (media.seeking) {
_utils_logger__WEBPACK_IMPORTED_MODULE_12__["logger"].log("could not seek to " + startPosition + ", already seeking at " + currentTime);
this.log("could not seek to " + startPosition + ", already seeking at " + currentTime);
return;
}
@ -10479,7 +10483,7 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
var delta = bufferStart - startPosition;
if (delta > 0 && (delta < this.config.maxBufferHole || delta < this.config.maxFragLookUpTolerance)) {
_utils_logger__WEBPACK_IMPORTED_MODULE_12__["logger"].log("adjusting start position by " + delta + " to match buffer start");
this.log("adjusting start position by " + delta + " to match buffer start");
startPosition += delta;
this.startPosition = startPosition;
}
@ -11239,8 +11243,6 @@ var SubtitleStreamController = /*#__PURE__*/function (_BaseStreamController) {
}
if (this.state === _base_stream_controller__WEBPACK_IMPORTED_MODULE_6__["State"].IDLE) {
var _foundFrag;
var currentTrackId = this.currentTrackId,
levels = this.levels;
@ -11280,9 +11282,15 @@ var SubtitleStreamController = /*#__PURE__*/function (_BaseStreamController) {
foundFrag = fragments[fragLen - 1];
}
if ((_foundFrag = foundFrag) !== null && _foundFrag !== void 0 && _foundFrag.encrypted) {
foundFrag = this.mapToInitFragWhenRequired(foundFrag);
if (!foundFrag) {
return;
}
if (foundFrag.encrypted) {
this.loadKey(foundFrag, trackDetails);
} else if (foundFrag && this.fragmentTracker.getState(foundFrag) === _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].NOT_LOADED) {
} else if (this.fragmentTracker.getState(foundFrag) === _fragment_tracker__WEBPACK_IMPORTED_MODULE_5__["FragmentState"].NOT_LOADED) {
// only load if fragment is not loaded
this.loadFragment(foundFrag, trackDetails, targetBufferTime);
}
@ -11292,7 +11300,11 @@ var SubtitleStreamController = /*#__PURE__*/function (_BaseStreamController) {
_proto.loadFragment = function loadFragment(frag, levelDetails, targetBufferTime) {
this.fragCurrent = frag;
_BaseStreamController.prototype.loadFragment.call(this, frag, levelDetails, targetBufferTime);
if (frag.sn === 'initSegment') {
this._loadInitSegment(frag);
} else {
_BaseStreamController.prototype.loadFragment.call(this, frag, levelDetails, targetBufferTime);
}
};
_createClass(SubtitleStreamController, [{
@ -11774,8 +11786,10 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils_webvtt_parser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/webvtt-parser */ "./src/utils/webvtt-parser.ts");
/* harmony import */ var _utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/texttrack-utils */ "./src/utils/texttrack-utils.ts");
/* harmony import */ var _utils_imsc1_ttml_parser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/imsc1-ttml-parser */ "./src/utils/imsc1-ttml-parser.ts");
/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts");
/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts");
/* harmony import */ var _utils_mp4_tools__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/mp4-tools */ "./src/utils/mp4-tools.ts");
/* harmony import */ var _types_loader__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../types/loader */ "./src/types/loader.ts");
/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts");
@ -12114,7 +12128,9 @@ var TimelineController = /*#__PURE__*/function () {
if (textTrack) {
Object(_utils_texttrack_utils__WEBPACK_IMPORTED_MODULE_5__["clearCurrentCues"])(textTrack);
} else {
textTrack = _this2.createTextTrack('subtitles', track.name, track.lang);
var textTrackKind = _this2._captionsOrSubtitlesFromCharacteristics(track);
textTrack = _this2.createTextTrack(textTrackKind, track.name, track.lang);
if (textTrack) {
textTrack.mode = 'disabled';
@ -12144,6 +12160,21 @@ var TimelineController = /*#__PURE__*/function () {
}
};
_proto._captionsOrSubtitlesFromCharacteristics = function _captionsOrSubtitlesFromCharacteristics(track) {
var _track$attrs;
if ((_track$attrs = track.attrs) !== null && _track$attrs !== void 0 && _track$attrs.CHARACTERISTICS) {
var transcribesSpokenDialog = /transcribes-spoken-dialog/gi.test(track.attrs.CHARACTERISTICS);
var describesMusicAndSound = /describes-music-and-sound/gi.test(track.attrs.CHARACTERISTICS);
if (transcribesSpokenDialog && describesMusicAndSound) {
return 'captions';
}
}
return 'subtitles';
};
_proto.onManifestLoaded = function onManifestLoaded(event, data) {
var _this3 = this;
@ -12185,7 +12216,7 @@ var TimelineController = /*#__PURE__*/function () {
} // if this frag isn't contiguous, clear the parser so cues with bad start/end times aren't added to the textTrack
if (data.frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_7__["PlaylistLevelType"].MAIN) {
if (data.frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_8__["PlaylistLevelType"].MAIN) {
var _data$part$index, _data$part;
var sn = data.frag.sn;
@ -12207,7 +12238,7 @@ var TimelineController = /*#__PURE__*/function () {
var initPTS = this.initPTS,
unparsedVttFrags = this.unparsedVttFrags;
if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_7__["PlaylistLevelType"].SUBTITLE) {
if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_8__["PlaylistLevelType"].SUBTITLE) {
// If fragment is subtitle type, parse as WebVTT.
if (payload.byteLength) {
// We need an initial synchronisation PTS. Store fragments as long as none has arrived.
@ -12272,7 +12303,7 @@ var TimelineController = /*#__PURE__*/function () {
frag: frag
});
}, function (error) {
_utils_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].log("Failed to parse IMSC1: " + error);
_utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("Failed to parse IMSC1: " + error);
hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, {
success: false,
frag: frag,
@ -12282,11 +12313,13 @@ var TimelineController = /*#__PURE__*/function () {
};
_proto._parseVTTs = function _parseVTTs(frag, payload, vttCCs) {
var _this5 = this;
var _frag$initSegment,
_this5 = this;
var hls = this.hls; // Parse the WebVTT file contents.
Object(_utils_webvtt_parser__WEBPACK_IMPORTED_MODULE_4__["parseWebVTT"])(payload, this.initPTS[frag.cc], this.timescale[frag.cc], vttCCs, frag.cc, frag.start, function (cues) {
var payloadWebVTT = (_frag$initSegment = frag.initSegment) !== null && _frag$initSegment !== void 0 && _frag$initSegment.data ? Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_7__["appendUint8Array"])(frag.initSegment.data, new Uint8Array(payload)) : payload;
Object(_utils_webvtt_parser__WEBPACK_IMPORTED_MODULE_4__["parseWebVTT"])(payloadWebVTT, this.initPTS[frag.cc], this.timescale[frag.cc], vttCCs, frag.cc, frag.start, function (cues) {
_this5._appendCues(cues, frag.level);
hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, {
@ -12297,7 +12330,7 @@ var TimelineController = /*#__PURE__*/function () {
_this5._fallbackToIMSC1(frag, payload); // Something went wrong while parsing. Trigger event with success false.
_utils_logger__WEBPACK_IMPORTED_MODULE_8__["logger"].log("Failed to parse VTT cue: " + error);
_utils_logger__WEBPACK_IMPORTED_MODULE_9__["logger"].log("Failed to parse VTT cue: " + error);
hls.trigger(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].SUBTITLE_FRAG_PROCESSED, {
success: false,
frag: frag,
@ -12358,7 +12391,7 @@ var TimelineController = /*#__PURE__*/function () {
_proto.onFragDecrypted = function onFragDecrypted(event, data) {
var frag = data.frag;
if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_7__["PlaylistLevelType"].SUBTITLE) {
if (frag.type === _types_loader__WEBPACK_IMPORTED_MODULE_8__["PlaylistLevelType"].SUBTITLE) {
if (!Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(this.initPTS[frag.cc])) {
this.unparsedVttFrags.push(data);
return;
@ -13123,7 +13156,7 @@ var AACDemuxer = /*#__PURE__*/function (_BaseAudioDemuxer) {
_proto.appendFrame = function appendFrame(track, data, offset) {
_adts__WEBPACK_IMPORTED_MODULE_1__["initTrackConfig"](track, this.observer, data, offset, track.manifestCodec);
var frame = _adts__WEBPACK_IMPORTED_MODULE_1__["appendFrame"](track, data, offset, this.initPTS, this.frameIndex);
var frame = _adts__WEBPACK_IMPORTED_MODULE_1__["appendFrame"](track, data, offset, this.basePTS, this.frameIndex);
if (frame && frame.missing === 0) {
return frame;
@ -13456,12 +13489,14 @@ __webpack_require__.r(__webpack_exports__);
var BaseAudioDemuxer = /*#__PURE__*/function () {
function BaseAudioDemuxer() {
this._audioTrack = void 0;
this._id3Track = void 0;
this.frameIndex = 0;
this.cachedData = null;
this.basePTS = null;
this.initPTS = null;
}
@ -13479,9 +13514,15 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
};
};
_proto.resetTimeStamp = function resetTimeStamp() {};
_proto.resetTimeStamp = function resetTimeStamp(deaultTimestamp) {
this.initPTS = deaultTimestamp;
this.resetContiguity();
};
_proto.resetContiguity = function resetContiguity() {};
_proto.resetContiguity = function resetContiguity() {
this.basePTS = null;
this.frameIndex = 0;
};
_proto.canParse = function canParse(data, offset) {
return false;
@ -13505,21 +13546,21 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
var timestamp = id3Data ? _demux_id3__WEBPACK_IMPORTED_MODULE_1__["getTimeStamp"](id3Data) : undefined;
var length = data.length;
if (this.frameIndex === 0 || this.initPTS === null) {
this.initPTS = initPTSFn(timestamp, timeOffset);
if (this.basePTS === null || this.frameIndex === 0 && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(timestamp)) {
this.basePTS = initPTSFn(timestamp, timeOffset, this.initPTS);
} // more expressive than alternative: id3Data?.length
if (id3Data && id3Data.length > 0) {
id3Track.samples.push({
pts: this.initPTS,
dts: this.initPTS,
pts: this.basePTS,
dts: this.basePTS,
data: id3Data,
type: _types_demuxer__WEBPACK_IMPORTED_MODULE_2__["MetadataSchema"].audioId3
});
}
pts = this.initPTS;
pts = this.basePTS;
while (offset < length) {
if (this.canParse(data, offset)) {
@ -13580,7 +13621,6 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
this.demux(cachedData, 0);
}
this.frameIndex = 0;
return {
audioTrack: this._audioTrack,
videoTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_3__["dummyTrack"])(),
@ -13601,8 +13641,12 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
*/
var initPTSFn = function initPTSFn(timestamp, timeOffset) {
return Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(timestamp) ? timestamp * 90 : timeOffset * 90000;
var initPTSFn = function initPTSFn(timestamp, timeOffset, initPTS) {
if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(timestamp)) {
return timestamp * 90;
}
return timeOffset * 90000 + (initPTS || 0);
};
/* harmony default export */ __webpack_exports__["default"] = (BaseAudioDemuxer);
@ -14608,11 +14652,11 @@ var MP3Demuxer = /*#__PURE__*/function (_BaseAudioDemuxer) {
};
_proto.appendFrame = function appendFrame(track, data, offset) {
if (this.initPTS === null) {
if (this.basePTS === null) {
return;
}
return _mpegaudio__WEBPACK_IMPORTED_MODULE_3__["appendFrame"](track, data, offset, this.initPTS, this.frameIndex);
return _mpegaudio__WEBPACK_IMPORTED_MODULE_3__["appendFrame"](track, data, offset, this.basePTS, this.frameIndex);
};
return MP3Demuxer;
@ -15260,7 +15304,8 @@ var TransmuxerInterface = /*#__PURE__*/function () {
var trackSwitch = !(lastFrag && chunkMeta.level === lastFrag.level);
var snDiff = lastFrag ? chunkMeta.sn - lastFrag.sn : -1;
var partDiff = this.part ? chunkMeta.part - this.part.index : -1;
var contiguous = !trackSwitch && (snDiff === 1 || snDiff === 0 && partDiff === 1);
var progressive = snDiff === 0 && chunkMeta.id > 1 && chunkMeta.id === (lastFrag === null || lastFrag === void 0 ? void 0 : lastFrag.stats.chunkCount);
var contiguous = !trackSwitch && (snDiff === 1 || snDiff === 0 && (partDiff === 1 || progressive && partDiff <= 0));
var now = self.performance.now();
if (trackSwitch || snDiff || frag.stats.parsing.start === 0) {
@ -15362,6 +15407,14 @@ var TransmuxerInterface = /*#__PURE__*/function () {
this.onFlush(data.data);
break;
}
// pass logs from the worker thread to the main logger
case 'workerLog':
if (_utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"][data.data.logType]) {
_utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"][data.data.logType](data.data.message);
}
break;
/* falls through */
@ -15433,7 +15486,25 @@ function TransmuxerWorker(self) {
observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_DECRYPTED, forwardMessage);
observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, forwardMessage);
observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, forwardMessage); // forward logger events to main thread
var forwardWorkerLogs = function forwardWorkerLogs() {
var _loop = function _loop(logFn) {
var func = function func(message) {
forwardMessage('workerLog', {
logType: logFn,
message: message
});
};
_utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"][logFn] = func;
};
for (var logFn in _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"]) {
_loop(logFn);
}
};
self.addEventListener('message', function (ev) {
var data = ev.data;
@ -15443,6 +15514,7 @@ function TransmuxerWorker(self) {
var config = JSON.parse(data.config);
self.transmuxer = new _demux_transmuxer__WEBPACK_IMPORTED_MODULE_0__["default"](observer, data.typeSupported, config, data.vendor, data.id);
Object(_utils_logger__WEBPACK_IMPORTED_MODULE_2__["enableLogs"])(config.debug);
forwardWorkerLogs();
forwardMessage('init', null);
break;
}
@ -18248,7 +18320,7 @@ var Hls = /*#__PURE__*/function () {
}], [{
key: "version",
get: function get() {
return "1.2.0";
return "1.2.1";
}
}, {
key: "Events",
@ -20763,7 +20835,14 @@ var PlaylistLoader = /*#__PURE__*/function () {
};
_proto.handleSidxRequest = function handleSidxRequest(response, context) {
var sidxInfo = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["parseSegmentIndex"])(new Uint8Array(response.data)); // if provided fragment does not contain sidx, early return
var data = new Uint8Array(response.data);
var sidxBox = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["findBox"])(data, ['sidx'])[0]; // if provided fragment does not contain sidx, early return
if (!sidxBox) {
return;
}
var sidxInfo = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["parseSegmentIndex"])(sidxBox);
if (!sidxInfo) {
return;
@ -20780,7 +20859,9 @@ var PlaylistLoader = /*#__PURE__*/function () {
}
if (frag.initSegment) {
frag.initSegment.setByteRange(String(sidxInfo.moovEndOffset) + '@0');
var moovBox = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["findBox"])(data, ['moov'])[0];
var moovEndOffset = moovBox ? moovBox.length : null;
frag.initSegment.setByteRange(String(moovEndOffset) + '@0');
}
});
};
@ -26362,19 +26443,8 @@ function findBox(data, path) {
return results;
}
function parseSegmentIndex(initSegment) {
var moovBox = findBox(initSegment, ['moov']);
var moov = moovBox[0];
var moovEndOffset = moov ? moov.length : null; // we need this in case we need to chop of garbage of the end of current data
var sidxBox = findBox(initSegment, ['sidx']);
if (!sidxBox || !sidxBox[0]) {
return null;
}
function parseSegmentIndex(sidx) {
var references = [];
var sidx = sidxBox[0];
var version = sidx[0]; // set initial offset, we skip the reference ID (not needed)
var index = 8;
@ -26435,8 +26505,7 @@ function parseSegmentIndex(initSegment) {
timescale: timescale,
version: version,
referencesCount: referencesCount,
references: references,
moovEndOffset: moovEndOffset
references: references
};
}
/**
@ -26660,13 +26729,20 @@ function getDuration(data, initData) {
if (videoDuration === 0 && audioDuration === 0) {
// If duration samples are not available in the traf use sidx subsegment_duration
var sidx = parseSegmentIndex(data);
var sidxDuration = 0;
var sidxs = findBox(data, ['sidx']);
if (sidx !== null && sidx !== void 0 && sidx.references) {
return sidx.references.reduce(function (dur, ref) {
return dur + ref.info.duration || 0;
}, 0);
for (var _i = 0; _i < sidxs.length; _i++) {
var sidx = parseSegmentIndex(sidxs[_i]);
if (sidx !== null && sidx !== void 0 && sidx.references) {
sidxDuration += sidx.references.reduce(function (dur, ref) {
return dur + ref.info.duration || 0;
}, 0);
}
}
return sidxDuration;
}
if (videoDuration) {
@ -27051,12 +27127,12 @@ function parseSEIMessageFromNALu(unescapedData, pts, samples) {
if (payloadSize > 16) {
var uuidStrArray = [];
for (var _i = 0; _i < 16; _i++) {
for (var _i2 = 0; _i2 < 16; _i2++) {
var _b = data[seiPtr++].toString(16);
uuidStrArray.push(_b.length == 1 ? '0' + _b : _b);
if (_i === 3 || _i === 5 || _i === 7 || _i === 9) {
if (_i2 === 3 || _i2 === 5 || _i2 === 7 || _i2 === 9) {
uuidStrArray.push('-');
}
}
@ -27064,8 +27140,8 @@ function parseSEIMessageFromNALu(unescapedData, pts, samples) {
var length = payloadSize - 16;
var userDataBytes = new Uint8Array(length);
for (var _i2 = 0; _i2 < length; _i2++) {
userDataBytes[_i2] = data[seiPtr++];
for (var _i3 = 0; _i3 < length; _i3++) {
userDataBytes[_i3] = data[seiPtr++];
}
samples.push({

View file

@ -75,6 +75,7 @@ declare class AudioStreamController extends BaseStreamController implements Netw
startLoad(startPosition: number): void;
doTick(): void;
clearWaitingFragment(): void;
protected resetLoadingState(): void;
protected onTickEnd(): void;
private doTickIdle;
protected getMaxBufferLength(mainBufferLength?: number): number;
@ -253,6 +254,7 @@ declare class BaseStreamController extends TaskLoop implements NetworkComponentA
protected getMaxBufferLength(levelBitrate?: number): number;
protected reduceMaxBufferLength(threshold?: number): boolean;
protected getNextFragment(pos: number, levelDetails: LevelDetails): Fragment | null;
mapToInitFragWhenRequired(frag: Fragment | null): typeof frag;
getNextPart(partList: Part[], frag: Fragment, targetBufferTime: number): number;
private loadedEndOfParts;
protected getInitialLiveFragment(levelDetails: LevelDetails, fragments: Array<Fragment>): Fragment | null;
@ -1946,6 +1948,7 @@ export declare interface LevelAttributes extends AttrList {
BANDWIDTH?: string;
BYTERANGE?: string;
'CLOSED-CAPTIONS'?: string;
CHARACTERISTICS?: string;
CODECS?: string;
DEFAULT?: string;
FORCED?: string;
@ -2455,7 +2458,6 @@ declare class StreamController extends BaseStreamController implements NetworkCo
private onvplaying;
private onvseeked;
private fragLastKbps;
private stalled;
private couldBacktrack;
private backtrackFragment;
private audioCodecSwitch;
@ -2763,6 +2765,7 @@ declare class TimelineController implements ComponentAPI {
private onManifestLoading;
private _cleanTracks;
private onSubtitleTracksUpdated;
private _captionsOrSubtitlesFromCharacteristics;
private onManifestLoaded;
private onFragLoading;
private onFragLoaded;

File diff suppressed because one or more lines are too long

146
node_modules/hls.js/dist/hls.light.js generated vendored
View file

@ -2519,8 +2519,6 @@ var BaseStreamController = /*#__PURE__*/function (_TaskLoop) {
};
_proto.getNextFragment = function getNextFragment(pos, levelDetails) {
var _frag, _frag2;
var fragments = levelDetails.fragments;
var fragLen = fragments.length;
@ -2558,11 +2556,15 @@ var BaseStreamController = /*#__PURE__*/function (_TaskLoop) {
if (!frag) {
var end = config.lowLatencyMode ? levelDetails.partEnd : levelDetails.fragmentEnd;
frag = this.getFragmentAtPosition(pos, end, levelDetails);
} // If an initSegment is present, it must be buffered first
}
return this.mapToInitFragWhenRequired(frag);
};
if ((_frag = frag) !== null && _frag !== void 0 && _frag.initSegment && !((_frag2 = frag) !== null && _frag2 !== void 0 && _frag2.initSegment.data) && !this.bitrateTest) {
frag = frag.initSegment;
_proto.mapToInitFragWhenRequired = function mapToInitFragWhenRequired(frag) {
// If an initSegment is present, it must be buffered first
if (frag !== null && frag !== void 0 && frag.initSegment && !(frag !== null && frag !== void 0 && frag.initSegment.data) && !this.bitrateTest) {
return frag.initSegment;
}
return frag;
@ -7199,7 +7201,6 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _types_transmuxer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../types/transmuxer */ "./src/types/transmuxer.ts");
/* harmony import */ var _gap_controller__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./gap-controller */ "./src/controller/gap-controller.ts");
/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../errors */ "./src/errors.ts");
/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/logger */ "./src/utils/logger.ts");
@ -7224,7 +7225,6 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Objec
var TICK_INTERVAL = 100; // how often to tick in ms
var StreamController = /*#__PURE__*/function (_BaseStreamController) {
@ -7244,7 +7244,6 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
_this.onvplaying = null;
_this.onvseeked = null;
_this.fragLastKbps = 0;
_this.stalled = false;
_this.couldBacktrack = false;
_this.backtrackFragment = null;
_this.audioCodecSwitch = false;
@ -7717,7 +7716,7 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
this.log('Trigger BUFFER_RESET');
this.hls.trigger(_events__WEBPACK_IMPORTED_MODULE_3__["Events"].BUFFER_RESET, undefined);
this.fragmentTracker.removeAllFragments();
this.couldBacktrack = this.stalled = false;
this.couldBacktrack = false;
this.startPosition = this.lastCurrentTime = 0;
this.fragPlaying = null;
this.backtrackFragment = null;
@ -8116,7 +8115,7 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
if (startPosition >= 0 && currentTime < startPosition) {
if (media.seeking) {
_utils_logger__WEBPACK_IMPORTED_MODULE_12__["logger"].log("could not seek to " + startPosition + ", already seeking at " + currentTime);
this.log("could not seek to " + startPosition + ", already seeking at " + currentTime);
return;
}
@ -8125,7 +8124,7 @@ var StreamController = /*#__PURE__*/function (_BaseStreamController) {
var delta = bufferStart - startPosition;
if (delta > 0 && (delta < this.config.maxBufferHole || delta < this.config.maxFragLookUpTolerance)) {
_utils_logger__WEBPACK_IMPORTED_MODULE_12__["logger"].log("adjusting start position by " + delta + " to match buffer start");
this.log("adjusting start position by " + delta + " to match buffer start");
startPosition += delta;
this.startPosition = startPosition;
}
@ -9182,7 +9181,7 @@ var AACDemuxer = /*#__PURE__*/function (_BaseAudioDemuxer) {
_proto.appendFrame = function appendFrame(track, data, offset) {
_adts__WEBPACK_IMPORTED_MODULE_1__["initTrackConfig"](track, this.observer, data, offset, track.manifestCodec);
var frame = _adts__WEBPACK_IMPORTED_MODULE_1__["appendFrame"](track, data, offset, this.initPTS, this.frameIndex);
var frame = _adts__WEBPACK_IMPORTED_MODULE_1__["appendFrame"](track, data, offset, this.basePTS, this.frameIndex);
if (frame && frame.missing === 0) {
return frame;
@ -9515,12 +9514,14 @@ __webpack_require__.r(__webpack_exports__);
var BaseAudioDemuxer = /*#__PURE__*/function () {
function BaseAudioDemuxer() {
this._audioTrack = void 0;
this._id3Track = void 0;
this.frameIndex = 0;
this.cachedData = null;
this.basePTS = null;
this.initPTS = null;
}
@ -9538,9 +9539,15 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
};
};
_proto.resetTimeStamp = function resetTimeStamp() {};
_proto.resetTimeStamp = function resetTimeStamp(deaultTimestamp) {
this.initPTS = deaultTimestamp;
this.resetContiguity();
};
_proto.resetContiguity = function resetContiguity() {};
_proto.resetContiguity = function resetContiguity() {
this.basePTS = null;
this.frameIndex = 0;
};
_proto.canParse = function canParse(data, offset) {
return false;
@ -9564,21 +9571,21 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
var timestamp = id3Data ? _demux_id3__WEBPACK_IMPORTED_MODULE_1__["getTimeStamp"](id3Data) : undefined;
var length = data.length;
if (this.frameIndex === 0 || this.initPTS === null) {
this.initPTS = initPTSFn(timestamp, timeOffset);
if (this.basePTS === null || this.frameIndex === 0 && Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(timestamp)) {
this.basePTS = initPTSFn(timestamp, timeOffset, this.initPTS);
} // more expressive than alternative: id3Data?.length
if (id3Data && id3Data.length > 0) {
id3Track.samples.push({
pts: this.initPTS,
dts: this.initPTS,
pts: this.basePTS,
dts: this.basePTS,
data: id3Data,
type: _types_demuxer__WEBPACK_IMPORTED_MODULE_2__["MetadataSchema"].audioId3
});
}
pts = this.initPTS;
pts = this.basePTS;
while (offset < length) {
if (this.canParse(data, offset)) {
@ -9639,7 +9646,6 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
this.demux(cachedData, 0);
}
this.frameIndex = 0;
return {
audioTrack: this._audioTrack,
videoTrack: Object(_dummy_demuxed_track__WEBPACK_IMPORTED_MODULE_3__["dummyTrack"])(),
@ -9660,8 +9666,12 @@ var BaseAudioDemuxer = /*#__PURE__*/function () {
*/
var initPTSFn = function initPTSFn(timestamp, timeOffset) {
return Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(timestamp) ? timestamp * 90 : timeOffset * 90000;
var initPTSFn = function initPTSFn(timestamp, timeOffset, initPTS) {
if (Object(_home_runner_work_hls_js_hls_js_src_polyfills_number__WEBPACK_IMPORTED_MODULE_0__["isFiniteNumber"])(timestamp)) {
return timestamp * 90;
}
return timeOffset * 90000 + (initPTS || 0);
};
/* harmony default export */ __webpack_exports__["default"] = (BaseAudioDemuxer);
@ -10667,11 +10677,11 @@ var MP3Demuxer = /*#__PURE__*/function (_BaseAudioDemuxer) {
};
_proto.appendFrame = function appendFrame(track, data, offset) {
if (this.initPTS === null) {
if (this.basePTS === null) {
return;
}
return _mpegaudio__WEBPACK_IMPORTED_MODULE_3__["appendFrame"](track, data, offset, this.initPTS, this.frameIndex);
return _mpegaudio__WEBPACK_IMPORTED_MODULE_3__["appendFrame"](track, data, offset, this.basePTS, this.frameIndex);
};
return MP3Demuxer;
@ -11319,7 +11329,8 @@ var TransmuxerInterface = /*#__PURE__*/function () {
var trackSwitch = !(lastFrag && chunkMeta.level === lastFrag.level);
var snDiff = lastFrag ? chunkMeta.sn - lastFrag.sn : -1;
var partDiff = this.part ? chunkMeta.part - this.part.index : -1;
var contiguous = !trackSwitch && (snDiff === 1 || snDiff === 0 && partDiff === 1);
var progressive = snDiff === 0 && chunkMeta.id > 1 && chunkMeta.id === (lastFrag === null || lastFrag === void 0 ? void 0 : lastFrag.stats.chunkCount);
var contiguous = !trackSwitch && (snDiff === 1 || snDiff === 0 && (partDiff === 1 || progressive && partDiff <= 0));
var now = self.performance.now();
if (trackSwitch || snDiff || frag.stats.parsing.start === 0) {
@ -11421,6 +11432,14 @@ var TransmuxerInterface = /*#__PURE__*/function () {
this.onFlush(data.data);
break;
}
// pass logs from the worker thread to the main logger
case 'workerLog':
if (_utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"][data.data.logType]) {
_utils_logger__WEBPACK_IMPORTED_MODULE_3__["logger"][data.data.logType](data.data.message);
}
break;
/* falls through */
@ -11492,7 +11511,25 @@ function TransmuxerWorker(self) {
observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].FRAG_DECRYPTED, forwardMessage);
observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, forwardMessage);
observer.on(_events__WEBPACK_IMPORTED_MODULE_1__["Events"].ERROR, forwardMessage); // forward logger events to main thread
var forwardWorkerLogs = function forwardWorkerLogs() {
var _loop = function _loop(logFn) {
var func = function func(message) {
forwardMessage('workerLog', {
logType: logFn,
message: message
});
};
_utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"][logFn] = func;
};
for (var logFn in _utils_logger__WEBPACK_IMPORTED_MODULE_2__["logger"]) {
_loop(logFn);
}
};
self.addEventListener('message', function (ev) {
var data = ev.data;
@ -11502,6 +11539,7 @@ function TransmuxerWorker(self) {
var config = JSON.parse(data.config);
self.transmuxer = new _demux_transmuxer__WEBPACK_IMPORTED_MODULE_0__["default"](observer, data.typeSupported, config, data.vendor, data.id);
Object(_utils_logger__WEBPACK_IMPORTED_MODULE_2__["enableLogs"])(config.debug);
forwardWorkerLogs();
forwardMessage('init', null);
break;
}
@ -14320,7 +14358,7 @@ var Hls = /*#__PURE__*/function () {
}], [{
key: "version",
get: function get() {
return "1.2.0";
return "1.2.1";
}
}, {
key: "Events",
@ -16835,7 +16873,14 @@ var PlaylistLoader = /*#__PURE__*/function () {
};
_proto.handleSidxRequest = function handleSidxRequest(response, context) {
var sidxInfo = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["parseSegmentIndex"])(new Uint8Array(response.data)); // if provided fragment does not contain sidx, early return
var data = new Uint8Array(response.data);
var sidxBox = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["findBox"])(data, ['sidx'])[0]; // if provided fragment does not contain sidx, early return
if (!sidxBox) {
return;
}
var sidxInfo = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["parseSegmentIndex"])(sidxBox);
if (!sidxInfo) {
return;
@ -16852,7 +16897,9 @@ var PlaylistLoader = /*#__PURE__*/function () {
}
if (frag.initSegment) {
frag.initSegment.setByteRange(String(sidxInfo.moovEndOffset) + '@0');
var moovBox = Object(_utils_mp4_tools__WEBPACK_IMPORTED_MODULE_4__["findBox"])(data, ['moov'])[0];
var moovEndOffset = moovBox ? moovBox.length : null;
frag.initSegment.setByteRange(String(moovEndOffset) + '@0');
}
});
};
@ -20510,19 +20557,8 @@ function findBox(data, path) {
return results;
}
function parseSegmentIndex(initSegment) {
var moovBox = findBox(initSegment, ['moov']);
var moov = moovBox[0];
var moovEndOffset = moov ? moov.length : null; // we need this in case we need to chop of garbage of the end of current data
var sidxBox = findBox(initSegment, ['sidx']);
if (!sidxBox || !sidxBox[0]) {
return null;
}
function parseSegmentIndex(sidx) {
var references = [];
var sidx = sidxBox[0];
var version = sidx[0]; // set initial offset, we skip the reference ID (not needed)
var index = 8;
@ -20583,8 +20619,7 @@ function parseSegmentIndex(initSegment) {
timescale: timescale,
version: version,
referencesCount: referencesCount,
references: references,
moovEndOffset: moovEndOffset
references: references
};
}
/**
@ -20808,13 +20843,20 @@ function getDuration(data, initData) {
if (videoDuration === 0 && audioDuration === 0) {
// If duration samples are not available in the traf use sidx subsegment_duration
var sidx = parseSegmentIndex(data);
var sidxDuration = 0;
var sidxs = findBox(data, ['sidx']);
if (sidx !== null && sidx !== void 0 && sidx.references) {
return sidx.references.reduce(function (dur, ref) {
return dur + ref.info.duration || 0;
}, 0);
for (var _i = 0; _i < sidxs.length; _i++) {
var sidx = parseSegmentIndex(sidxs[_i]);
if (sidx !== null && sidx !== void 0 && sidx.references) {
sidxDuration += sidx.references.reduce(function (dur, ref) {
return dur + ref.info.duration || 0;
}, 0);
}
}
return sidxDuration;
}
if (videoDuration) {
@ -21199,12 +21241,12 @@ function parseSEIMessageFromNALu(unescapedData, pts, samples) {
if (payloadSize > 16) {
var uuidStrArray = [];
for (var _i = 0; _i < 16; _i++) {
for (var _i2 = 0; _i2 < 16; _i2++) {
var _b = data[seiPtr++].toString(16);
uuidStrArray.push(_b.length == 1 ? '0' + _b : _b);
if (_i === 3 || _i === 5 || _i === 7 || _i === 9) {
if (_i2 === 3 || _i2 === 5 || _i2 === 7 || _i2 === 9) {
uuidStrArray.push('-');
}
}
@ -21212,8 +21254,8 @@ function parseSEIMessageFromNALu(unescapedData, pts, samples) {
var length = payloadSize - 16;
var userDataBytes = new Uint8Array(length);
for (var _i2 = 0; _i2 < length; _i2++) {
userDataBytes[_i2] = data[seiPtr++];
for (var _i3 = 0; _i3 < length; _i3++) {
userDataBytes[_i3] = data[seiPtr++];
}
samples.push({

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
node_modules/hls.js/package.json generated vendored
View file

@ -1 +1 @@
{"name":"hls.js","license":"Apache-2.0","description":"JavaScript HLS client using MediaSourceExtension","homepage":"https://github.com/video-dev/hls.js","authors":"Guillaume du Pontavice <g.du.pontavice@gmail.com>","repository":{"type":"git","url":"https://github.com/video-dev/hls.js"},"bugs":{"url":"https://github.com/video-dev/hls.js/issues"},"main":"./dist/hls.js","types":"./dist/hls.js.d.ts","files":["dist/**/*","src/**/*"],"publishConfig":{"access":"public"},"scripts":{"build":"webpack --progress && npm run build:types","build:ci":"webpack && tsc --build tsconfig-lib.json && api-extractor run","build:debug":"webpack --progress --env debug --env demo","build:watch":"webpack --progress --env debug --env demo --watch","build:types":"tsc --build tsconfig-lib.json && api-extractor run --local","dev":"webpack serve --progress --env debug --env demo --port 8000 --static .","docs":"esdoc","lint":"eslint src/ tests/ --ext .js --ext .ts","lint:fix":"npm run lint -- --fix","lint:quiet":"npm run lint -- --quiet","lint:staged":"lint-staged","prettier":"prettier --write .","prettier:verify":"prettier --check .","pretest":"npm run lint","sanity-check":"npm run lint && npm run prettier:verify && npm run type-check && npm run docs && npm run build:types && npm run build && npm run test:unit","start":"npm run dev","test":"npm run test:unit && npm run test:func","test:unit":"karma start karma.conf.js","test:unit:debug":"DEBUG_UNIT_TESTS=1 karma start karma.conf.js --auto-watch --no-single-run --browsers Chrome","test:unit:watch":"karma start karma.conf.js --auto-watch --no-single-run","test:func":"BABEL_ENV=development mocha --require @babel/register tests/functional/auto/setup.js --timeout 40000 --exit","test:func:light":"BABEL_ENV=development HLSJS_LIGHT=1 mocha --require @babel/register tests/functional/auto/setup.js --timeout 40000 --exit","test:func:sauce":"SAUCE=1 UA=safari OS='OS X 10.15' BABEL_ENV=development mocha --require @babel/register tests/functional/auto/setup.js --timeout 40000 --exit","type-check":"tsc --noEmit","type-check:watch":"npm run type-check -- --watch","prepare":"husky install"},"devDependencies":{"@babel/core":"7.18.9","@babel/helper-module-imports":"7.18.6","@babel/plugin-proposal-class-properties":"7.18.6","@babel/plugin-proposal-object-rest-spread":"7.18.9","@babel/plugin-proposal-optional-chaining":"7.18.9","@babel/plugin-transform-object-assign":"7.18.6","@babel/preset-env":"7.18.9","@babel/preset-typescript":"7.18.6","@babel/register":"7.18.9","@itsjamie/esdoc-cli":"0.5.0","@itsjamie/esdoc-core":"0.5.0","@itsjamie/esdoc-ecmascript-proposal-plugin":"0.5.0","@itsjamie/esdoc-standard-plugin":"0.5.0","@itsjamie/esdoc-typescript-plugin":"0.5.0","@microsoft/api-extractor":"7.28.4","@types/chai":"4.3.1","@types/chart.js":"2.9.37","@types/mocha":"9.1.1","@types/sinon-chai":"3.2.8","@typescript-eslint/eslint-plugin":"5.23.0","@typescript-eslint/parser":"5.23.0","babel-loader":"8.2.5","babel-plugin-transform-remove-console":"6.9.4","chai":"4.3.6","chart.js":"2.9.4","chromedriver":"103.0.0","eslint":"8.20.0","eslint-config-prettier":"8.5.0","eslint-plugin-import":"2.26.0","eslint-plugin-mocha":"10.0.5","eslint-plugin-node":"11.1.0","eslint-plugin-promise":"6.0.0","eventemitter3":"4.0.7","http-server":"14.1.1","husky":"8.0.1","istanbul-instrumenter-loader":"3.0.1","jsonpack":"1.1.5","karma":"6.4.0","karma-chrome-launcher":"3.1.1","karma-coverage-istanbul-reporter":"3.0.3","karma-mocha":"2.0.1","karma-mocha-reporter":"2.2.5","karma-sinon-chai":"2.0.2","karma-sourcemap-loader":"0.3.8","karma-webpack":"4.0.2","lint-staged":"13.0.3","micromatch":"4.0.5","mocha":"10.0.0","netlify-cli":"10.7.1","prettier":"2.7.1","promise-polyfill":"8.2.3","sauce-connect-launcher":"1.3.2","selenium-webdriver":"4.3.1","semver":"7.3.7","sinon":"14.0.0","sinon-chai":"3.7.0","typescript":"4.7.4","url-toolkit":"2.2.5","webpack":"4.46.0","webpack-cli":"4.10.0","webpack-dev-server":"4.9.3","webpack-merge":"5.8.0","webworkify-webpack":"2.1.5"},"version":"1.2.0"}
{"name":"hls.js","license":"Apache-2.0","description":"JavaScript HLS client using MediaSourceExtension","homepage":"https://github.com/video-dev/hls.js","authors":"Guillaume du Pontavice <g.du.pontavice@gmail.com>","repository":{"type":"git","url":"https://github.com/video-dev/hls.js"},"bugs":{"url":"https://github.com/video-dev/hls.js/issues"},"main":"./dist/hls.js","types":"./dist/hls.js.d.ts","files":["dist/**/*","src/**/*"],"publishConfig":{"access":"public"},"scripts":{"build":"webpack --progress && npm run build:types","build:ci":"webpack && tsc --build tsconfig-lib.json && api-extractor run","build:debug":"webpack --progress --env debug --env demo","build:watch":"webpack --progress --env debug --env demo --watch","build:types":"tsc --build tsconfig-lib.json && api-extractor run --local","dev":"webpack serve --progress --env debug --env demo --port 8000 --static .","docs":"esdoc","lint":"eslint src/ tests/ --ext .js --ext .ts","lint:fix":"npm run lint -- --fix","lint:quiet":"npm run lint -- --quiet","lint:staged":"lint-staged","prettier":"prettier --write .","prettier:verify":"prettier --check .","pretest":"npm run lint","sanity-check":"npm run lint && npm run prettier:verify && npm run type-check && npm run docs && npm run build:types && npm run build && npm run test:unit","start":"npm run dev","test":"npm run test:unit && npm run test:func","test:unit":"karma start karma.conf.js","test:unit:debug":"DEBUG_UNIT_TESTS=1 karma start karma.conf.js --auto-watch --no-single-run --browsers Chrome","test:unit:watch":"karma start karma.conf.js --auto-watch --no-single-run","test:func":"BABEL_ENV=development mocha --require @babel/register tests/functional/auto/setup.js --timeout 40000 --exit","test:func:light":"BABEL_ENV=development HLSJS_LIGHT=1 mocha --require @babel/register tests/functional/auto/setup.js --timeout 40000 --exit","test:func:sauce":"SAUCE=1 UA=safari OS='OS X 10.15' BABEL_ENV=development mocha --require @babel/register tests/functional/auto/setup.js --timeout 40000 --exit","type-check":"tsc --noEmit","type-check:watch":"npm run type-check -- --watch","prepare":"husky install"},"devDependencies":{"@babel/core":"7.18.10","@babel/helper-module-imports":"7.18.6","@babel/plugin-proposal-class-properties":"7.18.6","@babel/plugin-proposal-object-rest-spread":"7.18.9","@babel/plugin-proposal-optional-chaining":"7.18.9","@babel/plugin-transform-object-assign":"7.18.6","@babel/preset-env":"7.18.10","@babel/preset-typescript":"7.18.6","@babel/register":"7.18.9","@itsjamie/esdoc-cli":"0.5.0","@itsjamie/esdoc-core":"0.5.0","@itsjamie/esdoc-ecmascript-proposal-plugin":"0.5.0","@itsjamie/esdoc-standard-plugin":"0.5.0","@itsjamie/esdoc-typescript-plugin":"0.5.0","@microsoft/api-extractor":"7.28.6","@types/chai":"4.3.3","@types/chart.js":"2.9.37","@types/mocha":"9.1.1","@types/sinon-chai":"3.2.8","@typescript-eslint/eslint-plugin":"5.23.0","@typescript-eslint/parser":"5.23.0","babel-loader":"8.2.5","babel-plugin-transform-remove-console":"6.9.4","chai":"4.3.6","chart.js":"2.9.4","chromedriver":"104.0.0","eslint":"8.21.0","eslint-config-prettier":"8.5.0","eslint-plugin-import":"2.26.0","eslint-plugin-mocha":"10.1.0","eslint-plugin-node":"11.1.0","eslint-plugin-promise":"6.0.0","eventemitter3":"4.0.7","http-server":"14.1.1","husky":"8.0.1","istanbul-instrumenter-loader":"3.0.1","jsonpack":"1.1.5","karma":"6.4.0","karma-chrome-launcher":"3.1.1","karma-coverage-istanbul-reporter":"3.0.3","karma-mocha":"2.0.1","karma-mocha-reporter":"2.2.5","karma-sinon-chai":"2.0.2","karma-sourcemap-loader":"0.3.8","karma-webpack":"4.0.2","lint-staged":"13.0.3","micromatch":"4.0.5","mocha":"10.0.0","netlify-cli":"10.7.1","prettier":"2.7.1","promise-polyfill":"8.2.3","sauce-connect-launcher":"1.3.2","selenium-webdriver":"4.4.0","semver":"7.3.7","sinon":"14.0.0","sinon-chai":"3.7.0","typescript":"4.7.4","url-toolkit":"2.2.5","webpack":"4.46.0","webpack-cli":"4.10.0","webpack-dev-server":"4.9.3","webpack-merge":"5.8.0","webworkify-webpack":"2.1.5"},"version":"1.2.1"}

View file

@ -11,7 +11,6 @@ import { ChunkMetadata } from '../types/transmuxer';
import { fragmentWithinToleranceTest } from './fragment-finders';
import { alignMediaPlaylistByPDT } from '../utils/discontinuities';
import { ErrorDetails } from '../errors';
import { logger } from '../utils/logger';
import type { NetworkComponentAPI } from '../types/component-api';
import type { FragmentTracker } from './fragment-tracker';
import type { TransmuxerResult } from '../types/transmuxer';
@ -136,6 +135,7 @@ class AudioStreamController
3
)}`
);
startPosition = lastCurrentTime;
this.state = State.IDLE;
} else {
this.loadedmetadata = false;
@ -197,7 +197,7 @@ class AudioStreamController
}
} else if (this.videoTrackCC !== this.waitingVideoCC) {
// Drop waiting fragment if videoTrackCC has changed since waitingFragment was set and initPTS was not found
logger.log(
this.log(
`Waiting fragment cc (${frag.cc}) cancelled because video is at cc ${this.videoTrackCC}`
);
this.clearWaitingFragment();
@ -215,7 +215,7 @@ class AudioStreamController
frag
);
if (waitingFragmentAtPosition < 0) {
logger.log(
this.log(
`Waiting fragment cc (${frag.cc}) @ ${frag.start} cancelled because another fragment at ${bufferInfo.end} is needed`
);
this.clearWaitingFragment();
@ -240,6 +240,11 @@ class AudioStreamController
}
}
protected resetLoadingState() {
this.clearWaitingFragment();
super.resetLoadingState();
}
protected onTickEnd() {
const { media } = this;
if (!media || !media.readyState) {
@ -550,7 +555,7 @@ class AudioStreamController
initPTS
);
} else {
logger.log(
this.log(
`Unknown video PTS for cc ${frag.cc}, waiting for video PTS before demuxing audio frag ${frag.sn} of [${details.startSN} ,${details.endSN}],track ${trackId}`
);
const { cache } = (this.waitingData = this.waitingData || {

View file

@ -854,9 +854,13 @@ export default class BaseStreamController
frag = this.getFragmentAtPosition(pos, end, levelDetails);
}
return this.mapToInitFragWhenRequired(frag);
}
mapToInitFragWhenRequired(frag: Fragment | null): typeof frag {
// If an initSegment is present, it must be buffered first
if (frag?.initSegment && !frag?.initSegment.data && !this.bitrateTest) {
frag = frag.initSegment;
return frag.initSegment;
}
return frag;

View file

@ -13,7 +13,6 @@ import type { TransmuxerResult } from '../types/transmuxer';
import { ChunkMetadata } from '../types/transmuxer';
import GapController from './gap-controller';
import { ErrorDetails } from '../errors';
import { logger } from '../utils/logger';
import type Hls from '../hls';
import type { LevelDetails } from '../loader/level-details';
import type { TrackSet } from '../types/track';
@ -52,7 +51,6 @@ export default class StreamController
private onvplaying: EventListener | null = null;
private onvseeked: EventListener | null = null;
private fragLastKbps: number = 0;
private stalled: boolean = false;
private couldBacktrack: boolean = false;
private backtrackFragment: Fragment | null = null;
private audioCodecSwitch: boolean = false;
@ -546,7 +544,7 @@ export default class StreamController
this.log('Trigger BUFFER_RESET');
this.hls.trigger(Events.BUFFER_RESET, undefined);
this.fragmentTracker.removeAllFragments();
this.couldBacktrack = this.stalled = false;
this.couldBacktrack = false;
this.startPosition = this.lastCurrentTime = 0;
this.fragPlaying = null;
this.backtrackFragment = null;
@ -982,7 +980,7 @@ export default class StreamController
// at that stage, there should be only one buffered range, as we reach that code after first fragment has been buffered
if (startPosition >= 0 && currentTime < startPosition) {
if (media.seeking) {
logger.log(
this.log(
`could not seek to ${startPosition}, already seeking at ${currentTime}`
);
return;
@ -995,9 +993,7 @@ export default class StreamController
(delta < this.config.maxBufferHole ||
delta < this.config.maxFragLookUpTolerance)
) {
logger.log(
`adjusting start position by ${delta} to match buffer start`
);
this.log(`adjusting start position by ${delta} to match buffer start`);
startPosition += delta;
this.startPosition = startPosition;
}

View file

@ -371,7 +371,7 @@ export class SubtitleStreamController
const fragLen = fragments.length;
const end = trackDetails.edge;
let foundFrag;
let foundFrag: Fragment | null;
const fragPrevious = this.fragPrevious;
if (targetBufferTime < end) {
const { maxFragLookUpTolerance } = config;
@ -392,10 +392,14 @@ export class SubtitleStreamController
foundFrag = fragments[fragLen - 1];
}
if (foundFrag?.encrypted) {
foundFrag = this.mapToInitFragWhenRequired(foundFrag);
if (!foundFrag) {
return;
}
if (foundFrag.encrypted) {
this.loadKey(foundFrag, trackDetails);
} else if (
foundFrag &&
this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED
) {
// only load if fragment is not loaded
@ -410,7 +414,11 @@ export class SubtitleStreamController
targetBufferTime: number
) {
this.fragCurrent = frag;
super.loadFragment(frag, levelDetails, targetBufferTime);
if (frag.sn === 'initSegment') {
this._loadInitSegment(frag);
} else {
super.loadFragment(frag, levelDetails, targetBufferTime);
}
}
get mediaBufferTimeRanges(): TimeRange[] {

View file

@ -9,6 +9,7 @@ import {
removeCuesInRange,
} from '../utils/texttrack-utils';
import { parseIMSC1, IMSC1_CODEC } from '../utils/imsc1-ttml-parser';
import { appendUint8Array } from '../utils/mp4-tools';
import { PlaylistLevelType } from '../types/loader';
import { Fragment } from '../loader/fragment';
import {
@ -361,8 +362,10 @@ export class TimelineController implements ComponentAPI {
if (textTrack) {
clearCurrentCues(textTrack);
} else {
const textTrackKind =
this._captionsOrSubtitlesFromCharacteristics(track);
textTrack = this.createTextTrack(
'subtitles',
textTrackKind,
track.name,
track.lang
);
@ -392,6 +395,25 @@ export class TimelineController implements ComponentAPI {
}
}
private _captionsOrSubtitlesFromCharacteristics(
track: MediaPlaylist
): TextTrackKind {
if (track.attrs?.CHARACTERISTICS) {
const transcribesSpokenDialog = /transcribes-spoken-dialog/gi.test(
track.attrs.CHARACTERISTICS
);
const describesMusicAndSound = /describes-music-and-sound/gi.test(
track.attrs.CHARACTERISTICS
);
if (transcribesSpokenDialog && describesMusicAndSound) {
return 'captions';
}
}
return 'subtitles';
}
private onManifestLoaded(
event: Events.MANIFEST_LOADED,
data: ManifestLoadedData
@ -533,8 +555,11 @@ export class TimelineController implements ComponentAPI {
private _parseVTTs(frag: Fragment, payload: ArrayBuffer, vttCCs: any) {
const hls = this.hls;
// Parse the WebVTT file contents.
const payloadWebVTT = frag.initSegment?.data
? appendUint8Array(frag.initSegment.data, new Uint8Array(payload))
: payload;
parseWebVTT(
payload,
payloadWebVTT,
this.initPTS[frag.cc],
this.timescale[frag.cc],
vttCCs,

View file

@ -79,7 +79,7 @@ class AACDemuxer extends BaseAudioDemuxer {
track,
data,
offset,
this.initPTS as number,
this.basePTS as number,
this.frameIndex
);
if (frame && frame.missing === 0) {

View file

@ -19,6 +19,7 @@ class BaseAudioDemuxer implements Demuxer {
protected _id3Track!: DemuxedMetadataTrack;
protected frameIndex: number = 0;
protected cachedData: Uint8Array | null = null;
protected basePTS: number | null = null;
protected initPTS: number | null = null;
resetInitSegment(
@ -38,9 +39,15 @@ class BaseAudioDemuxer implements Demuxer {
};
}
resetTimeStamp() {}
resetTimeStamp(deaultTimestamp) {
this.initPTS = deaultTimestamp;
this.resetContiguity();
}
resetContiguity(): void {}
resetContiguity(): void {
this.basePTS = null;
this.frameIndex = 0;
}
canParse(data: Uint8Array, offset: number): boolean {
return false;
@ -68,21 +75,24 @@ class BaseAudioDemuxer implements Demuxer {
const timestamp = id3Data ? ID3.getTimeStamp(id3Data) : undefined;
const length = data.length;
if (this.frameIndex === 0 || this.initPTS === null) {
this.initPTS = initPTSFn(timestamp, timeOffset);
if (
this.basePTS === null ||
(this.frameIndex === 0 && Number.isFinite(timestamp))
) {
this.basePTS = initPTSFn(timestamp, timeOffset, this.initPTS);
}
// more expressive than alternative: id3Data?.length
if (id3Data && id3Data.length > 0) {
id3Track.samples.push({
pts: this.initPTS,
dts: this.initPTS,
pts: this.basePTS,
dts: this.basePTS,
data: id3Data,
type: MetadataSchema.audioId3,
});
}
pts = this.initPTS;
pts = this.basePTS;
while (offset < length) {
if (this.canParse(data, offset)) {
@ -145,8 +155,6 @@ class BaseAudioDemuxer implements Demuxer {
this.demux(cachedData, 0);
}
this.frameIndex = 0;
return {
audioTrack: this._audioTrack,
videoTrack: dummyTrack() as DemuxedVideoTrack,
@ -166,10 +174,12 @@ class BaseAudioDemuxer implements Demuxer {
*/
export const initPTSFn = (
timestamp: number | undefined,
timeOffset: number
timeOffset: number,
initPTS: number | null
): number => {
return Number.isFinite(timestamp as number)
? timestamp! * 90
: timeOffset * 90000;
if (Number.isFinite(timestamp as number)) {
return timestamp! * 90;
}
return timeOffset * 90000 + (initPTS || 0);
};
export default BaseAudioDemuxer;

View file

@ -57,14 +57,14 @@ class MP3Demuxer extends BaseAudioDemuxer {
}
appendFrame(track, data, offset) {
if (this.initPTS === null) {
if (this.basePTS === null) {
return;
}
return MpegAudio.appendFrame(
track,
data,
offset,
this.initPTS,
this.basePTS,
this.frameIndex
);
}

View file

@ -166,8 +166,14 @@ export default class TransmuxerInterface {
const trackSwitch = !(lastFrag && chunkMeta.level === lastFrag.level);
const snDiff = lastFrag ? chunkMeta.sn - (lastFrag.sn as number) : -1;
const partDiff = this.part ? chunkMeta.part - this.part.index : -1;
const progressive =
snDiff === 0 &&
chunkMeta.id > 1 &&
chunkMeta.id === lastFrag?.stats.chunkCount;
const contiguous =
!trackSwitch && (snDiff === 1 || (snDiff === 0 && partDiff === 1));
!trackSwitch &&
(snDiff === 1 ||
(snDiff === 0 && (partDiff === 1 || (progressive && partDiff <= 0))));
const now = self.performance.now();
if (trackSwitch || snDiff || frag.stats.parsing.start === 0) {
@ -291,6 +297,13 @@ export default class TransmuxerInterface {
break;
}
// pass logs from the worker thread to the main logger
case 'workerLog':
if (logger[data.data.logType]) {
logger[data.data.logType](data.data.message);
}
break;
/* falls through */
default: {
data.data = data.data || {};

View file

@ -1,6 +1,6 @@
import Transmuxer, { isPromise } from '../demux/transmuxer';
import { Events } from '../events';
import { enableLogs } from '../utils/logger';
import { ILogFunction, enableLogs, logger } from '../utils/logger';
import { EventEmitter } from 'eventemitter3';
import type { RemuxedTrack, RemuxerResult } from '../types/remuxer';
import type { TransmuxerResult, ChunkMetadata } from '../types/transmuxer';
@ -15,6 +15,20 @@ export default function TransmuxerWorker(self) {
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
observer.on(Events.ERROR, forwardMessage);
// forward logger events to main thread
const forwardWorkerLogs = () => {
for (const logFn in logger) {
const func: ILogFunction = (message?) => {
forwardMessage('workerLog', {
logType: logFn,
message,
});
};
logger[logFn] = func;
}
};
self.addEventListener('message', (ev) => {
const data = ev.data;
switch (data.cmd) {
@ -28,6 +42,7 @@ export default function TransmuxerWorker(self) {
data.id
);
enableLogs(config.debug);
forwardWorkerLogs();
forwardMessage('init', null);
break;
}

View file

@ -12,7 +12,7 @@
import { Events } from '../events';
import { ErrorDetails, ErrorTypes } from '../errors';
import { logger } from '../utils/logger';
import { parseSegmentIndex } from '../utils/mp4-tools';
import { parseSegmentIndex, findBox } from '../utils/mp4-tools';
import M3U8Parser from './m3u8-parser';
import type { LevelParsed } from '../types/level';
import type {
@ -543,10 +543,13 @@ class PlaylistLoader {
response: LoaderResponse,
context: PlaylistLoaderContext
): void {
const sidxInfo = parseSegmentIndex(
new Uint8Array(response.data as ArrayBuffer)
);
const data = new Uint8Array(response.data as ArrayBuffer);
const sidxBox = findBox(data, ['sidx'])[0];
// if provided fragment does not contain sidx, early return
if (!sidxBox) {
return;
}
const sidxInfo = parseSegmentIndex(sidxBox);
if (!sidxInfo) {
return;
}
@ -564,7 +567,9 @@ class PlaylistLoader {
);
}
if (frag.initSegment) {
frag.initSegment.setByteRange(String(sidxInfo.moovEndOffset) + '@0');
const moovBox = findBox(data, ['moov'])[0];
const moovEndOffset = moovBox ? moovBox.length : null;
frag.initSegment.setByteRange(String(moovEndOffset) + '@0');
}
});
}

View file

@ -24,6 +24,7 @@ export interface LevelAttributes extends AttrList {
BANDWIDTH?: string;
BYTERANGE?: string;
'CLOSED-CAPTIONS'?: string;
CHARACTERISTICS?: string;
CODECS?: string;
DEFAULT?: string;
FORCED?: string;

View file

@ -1,4 +1,4 @@
interface ILogFunction {
export interface ILogFunction {
(message?: any, ...optionalParams: any[]): void;
}

View file

@ -91,22 +91,10 @@ type SidxInfo = {
version: number;
referencesCount: number;
references: any[];
moovEndOffset: number | null;
};
export function parseSegmentIndex(initSegment: Uint8Array): SidxInfo | null {
const moovBox = findBox(initSegment, ['moov']);
const moov = moovBox[0];
const moovEndOffset = moov ? moov.length : null; // we need this in case we need to chop of garbage of the end of current data
const sidxBox = findBox(initSegment, ['sidx']);
if (!sidxBox || !sidxBox[0]) {
return null;
}
export function parseSegmentIndex(sidx: Uint8Array): SidxInfo | null {
const references: any[] = [];
const sidx = sidxBox[0];
const version = sidx[0];
@ -179,7 +167,6 @@ export function parseSegmentIndex(initSegment: Uint8Array): SidxInfo | null {
version,
referencesCount,
references,
moovEndOffset,
};
}
@ -409,13 +396,19 @@ export function getDuration(data: Uint8Array, initData: InitData) {
}
if (videoDuration === 0 && audioDuration === 0) {
// If duration samples are not available in the traf use sidx subsegment_duration
const sidx = parseSegmentIndex(data);
if (sidx?.references) {
return sidx.references.reduce(
(dur, ref) => dur + ref.info.duration || 0,
0
);
let sidxDuration = 0;
const sidxs = findBox(data, ['sidx']);
for (let i = 0; i < sidxs.length; i++) {
const sidx = parseSegmentIndex(sidxs[i]);
if (sidx?.references) {
sidxDuration += sidx.references.reduce(
(dur, ref) => dur + ref.info.duration || 0,
0
);
}
}
return sidxDuration;
}
if (videoDuration) {
return videoDuration;