hls.js 1.6.0-beta.1.0.canary.10764 → 1.6.0-beta.1.0.canary.10766

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/hls.light.js CHANGED
@@ -1028,7 +1028,7 @@
1028
1028
  // Some browsers don't allow to use bind on console object anyway
1029
1029
  // fallback to default if needed
1030
1030
  try {
1031
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10764");
1031
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10766");
1032
1032
  } catch (e) {
1033
1033
  /* log fn threw an exception. All logger methods are no-ops. */
1034
1034
  return createLogger();
@@ -3272,6 +3272,10 @@
3272
3272
  }
3273
3273
  }]);
3274
3274
  }();
3275
+ function isMediaFragment(frag) {
3276
+ return frag.sn !== 'initSegment';
3277
+ }
3278
+
3275
3279
  /**
3276
3280
  * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
3277
3281
  */
@@ -3492,7 +3496,7 @@
3492
3496
  }, {
3493
3497
  key: "ref",
3494
3498
  get: function get() {
3495
- if (this.sn === 'initSegment') {
3499
+ if (!isMediaFragment(this)) {
3496
3500
  return null;
3497
3501
  }
3498
3502
  if (!this._ref) {
@@ -16882,7 +16886,7 @@
16882
16886
  var _data$deliveryDirecti2;
16883
16887
  var level = data.level,
16884
16888
  details = data.details;
16885
- var curLevel = this._levels[level];
16889
+ var curLevel = data.levelInfo;
16886
16890
  if (!curLevel) {
16887
16891
  var _data$deliveryDirecti;
16888
16892
  this.warn("Invalid level index " + level);
@@ -16893,7 +16897,7 @@
16893
16897
  }
16894
16898
 
16895
16899
  // only process level loaded events matching with expected level
16896
- if (level === this.currentLevelIndex) {
16900
+ if (curLevel === this.currentLevel) {
16897
16901
  // reset level load error counter on successful level loaded only if there is no issues with fragments
16898
16902
  if (curLevel.fragmentError === 0) {
16899
16903
  curLevel.loadError = 0;
@@ -16931,6 +16935,7 @@
16931
16935
  this.hls.trigger(Events.LEVEL_LOADING, {
16932
16936
  url: url,
16933
16937
  level: currentLevelIndex,
16938
+ levelInfo: currentLevel,
16934
16939
  pathwayId: currentLevel.attrs['PATHWAY-ID'],
16935
16940
  id: 0,
16936
16941
  // Deprecated Level urlId
@@ -18251,7 +18256,7 @@
18251
18256
  _proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
18252
18257
  var media = this.mediaBuffer ? this.mediaBuffer : this.media;
18253
18258
  this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag, false, part) + " > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
18254
- if (frag.sn !== 'initSegment') {
18259
+ if (isMediaFragment(frag)) {
18255
18260
  var _this$levels;
18256
18261
  if (frag.type !== PlaylistLevelType.SUBTITLE) {
18257
18262
  var el = frag.elementaryStreams;
@@ -18325,7 +18330,7 @@
18325
18330
  this.keyLoader.loadClear(frag, details.encryptedFragments);
18326
18331
  }
18327
18332
  var fragPrevious = this.fragPrevious;
18328
- if (frag.sn !== 'initSegment' && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
18333
+ if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
18329
18334
  var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
18330
18335
  if (shouldLoadParts !== this.loadingParts) {
18331
18336
  this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
@@ -18333,7 +18338,7 @@
18333
18338
  }
18334
18339
  }
18335
18340
  targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
18336
- if (this.loadingParts && frag.sn !== 'initSegment') {
18341
+ if (this.loadingParts && isMediaFragment(frag)) {
18337
18342
  var partList = details.partList;
18338
18343
  if (partList && progressCallback) {
18339
18344
  if (targetBufferTime > frag.end && details.fragmentHint) {
@@ -18376,7 +18381,7 @@
18376
18381
  }
18377
18382
  }
18378
18383
  }
18379
- if (frag.sn !== 'initSegment' && this.loadingParts) {
18384
+ if (isMediaFragment(frag) && this.loadingParts) {
18380
18385
  this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
18381
18386
  this.loadingParts = false;
18382
18387
  } else if (!frag.url) {
@@ -18918,7 +18923,7 @@
18918
18923
  return pos;
18919
18924
  };
18920
18925
  _proto.handleFragLoadAborted = function handleFragLoadAborted(frag, part) {
18921
- if (this.transmuxer && frag.sn !== 'initSegment' && frag.stats.aborted) {
18926
+ if (this.transmuxer && isMediaFragment(frag) && frag.stats.aborted) {
18922
18927
  this.warn("Fragment " + frag.sn + (part ? ' part ' + part.index : '') + " of level " + frag.level + " was aborted");
18923
18928
  this.resetFragmentLoading(frag);
18924
18929
  }
@@ -18953,10 +18958,18 @@
18953
18958
  var errorAction = data.errorAction;
18954
18959
  var _ref2 = errorAction || {},
18955
18960
  action = _ref2.action,
18961
+ flags = _ref2.flags,
18956
18962
  _ref2$retryCount = _ref2.retryCount,
18957
18963
  retryCount = _ref2$retryCount === void 0 ? 0 : _ref2$retryCount,
18958
18964
  retryConfig = _ref2.retryConfig;
18959
- if (errorAction && action === NetworkErrorAction.RetryRequest && retryConfig) {
18965
+ var couldRetry = !!errorAction && !!retryConfig;
18966
+ var retry = couldRetry && action === NetworkErrorAction.RetryRequest;
18967
+ var noAlternate = couldRetry && !errorAction.resolved && flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;
18968
+ if (!retry && noAlternate && isMediaFragment(frag) && !frag.endList) {
18969
+ this.resetFragmentErrors(filterType);
18970
+ this.treatAsGap(frag);
18971
+ errorAction.resolved = true;
18972
+ } else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {
18960
18973
  this.resetStartWhenNotLoaded(this.levelLastLoaded);
18961
18974
  var delay = getRetryDelay(retryConfig, retryCount);
18962
18975
  this.warn("Fragment " + frag.sn + " of " + filterType + " " + frag.level + " errored with " + data.details + ", retrying loading " + (retryCount + 1) + "/" + retryConfig.maxNumRetry + " in " + delay + "ms");
@@ -18974,7 +18987,7 @@
18974
18987
  this.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
18975
18988
  return;
18976
18989
  }
18977
- } else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
18990
+ } else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {
18978
18991
  this.state = State.WAITING_LEVEL;
18979
18992
  } else {
18980
18993
  this.state = State.ERROR;
@@ -19110,10 +19123,7 @@
19110
19123
  var error = new Error("Found no media in fragment " + frag.sn + " of level " + frag.level + " resetting transmuxer to fallback to playlist timing");
19111
19124
  if (level.fragmentError === 0) {
19112
19125
  // Mark and track the odd empty segment as a gap to avoid reloading
19113
- level.fragmentError++;
19114
- frag.gap = true;
19115
- this.fragmentTracker.removeFragment(frag);
19116
- this.fragmentTracker.fragBuffered(frag, true);
19126
+ this.treatAsGap(frag, level);
19117
19127
  }
19118
19128
  this.warn(error.message);
19119
19129
  this.hls.trigger(Events.ERROR, {
@@ -19147,6 +19157,14 @@
19147
19157
  }
19148
19158
  return this.playlistLabel() + " " + frag.level + " (" + (part ? 'part' : 'frag') + ":[" + ((_ref3 = pts && !part ? frag.startPTS : (part || frag).start) != null ? _ref3 : NaN).toFixed(3) + "-" + ((_ref4 = pts && !part ? frag.endPTS : (part || frag).end) != null ? _ref4 : NaN).toFixed(3) + "]" + (part && frag.type === 'main' ? 'INDEPENDENT=' + (part.independent ? 'YES' : 'NO') : '');
19149
19159
  };
19160
+ _proto.treatAsGap = function treatAsGap(frag, level) {
19161
+ if (level) {
19162
+ level.fragmentError++;
19163
+ }
19164
+ frag.gap = true;
19165
+ this.fragmentTracker.removeFragment(frag);
19166
+ this.fragmentTracker.fragBuffered(frag, true);
19167
+ };
19150
19168
  _proto.resetTransmuxer = function resetTransmuxer() {
19151
19169
  var _this$transmuxer2;
19152
19170
  (_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
@@ -19691,7 +19709,7 @@
19691
19709
  return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
19692
19710
  }
19693
19711
 
19694
- var version = "1.6.0-beta.1.0.canary.10764";
19712
+ var version = "1.6.0-beta.1.0.canary.10766";
19695
19713
 
19696
19714
  // ensure the worker ends up in the bundle
19697
19715
  // If the worker should not be included this gets aliased to empty.js
@@ -20335,7 +20353,7 @@
20335
20353
  var targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;
20336
20354
  var frag = this.getNextFragment(targetBufferTime, levelDetails);
20337
20355
  // Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)
20338
- if (this.couldBacktrack && !this.fragPrevious && frag && frag.sn !== 'initSegment' && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
20356
+ if (this.couldBacktrack && !this.fragPrevious && frag && isMediaFragment(frag) && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
20339
20357
  var _this$backtrackFragme;
20340
20358
  var backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;
20341
20359
  var fragIdx = backtrackSn - levelDetails.startSN;
@@ -20372,7 +20390,7 @@
20372
20390
  // Check if fragment is not loaded
20373
20391
  var fragState = this.fragmentTracker.getState(frag);
20374
20392
  if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
20375
- if (frag.sn === 'initSegment') {
20393
+ if (!isMediaFragment(frag)) {
20376
20394
  this._loadInitSegment(frag, level);
20377
20395
  } else if (this.bitrateTest) {
20378
20396
  this.log("Fragment " + frag.sn + " of level " + frag.level + " is being downloaded to test bitrate and will not be buffered");
@@ -20560,7 +20578,7 @@
20560
20578
  if (!levels || this.state !== State.IDLE) {
20561
20579
  return;
20562
20580
  }
20563
- var level = levels[data.level];
20581
+ var level = data.levelInfo;
20564
20582
  if (!level.details || level.details.live && this.levelLastLoaded !== level || this.waitForCdnTuneIn(level.details)) {
20565
20583
  this.state = State.WAITING_LEVEL;
20566
20584
  }
@@ -20577,7 +20595,7 @@
20577
20595
  return;
20578
20596
  }
20579
20597
  this.log("Level " + newLevelId + " loaded [" + newDetails.startSN + "," + newDetails.endSN + "]" + (newDetails.lastPartSn ? "[part-" + newDetails.lastPartSn + "-" + newDetails.lastPartIndex + "]" : '') + ", cc [" + newDetails.startCC + ", " + newDetails.endCC + "] duration:" + duration);
20580
- var curLevel = levels[newLevelId];
20598
+ var curLevel = data.levelInfo;
20581
20599
  var fragCurrent = this.fragCurrent;
20582
20600
  if (fragCurrent && (this.state === State.FRAG_LOADING || this.state === State.FRAG_LOADING_WAITING_RETRY)) {
20583
20601
  if (fragCurrent.level !== data.level && fragCurrent.loader) {
@@ -20782,7 +20800,7 @@
20782
20800
  }
20783
20801
  var stats = part ? part.stats : frag.stats;
20784
20802
  this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first));
20785
- if (frag.sn !== 'initSegment') {
20803
+ if (isMediaFragment(frag)) {
20786
20804
  this.fragPrevious = frag;
20787
20805
  }
20788
20806
  this.fragBufferedComplete(frag, part);
@@ -21639,6 +21657,7 @@
21639
21657
  hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);
21640
21658
  hls.on(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);
21641
21659
  hls.on(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);
21660
+ hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);
21642
21661
  };
21643
21662
  _proto.unregisterListeners = function unregisterListeners() {
21644
21663
  var hls = this.hls;
@@ -21646,6 +21665,7 @@
21646
21665
  hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);
21647
21666
  hls.off(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);
21648
21667
  hls.off(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);
21668
+ hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);
21649
21669
  }
21650
21670
 
21651
21671
  /**
@@ -21695,7 +21715,8 @@
21695
21715
  responseType: 'text',
21696
21716
  type: PlaylistContextType.MANIFEST,
21697
21717
  url: url,
21698
- deliveryDirectives: null
21718
+ deliveryDirectives: null,
21719
+ levelOrTrack: null
21699
21720
  });
21700
21721
  };
21701
21722
  _proto.onLevelLoading = function onLevelLoading(event, data) {
@@ -21703,7 +21724,8 @@
21703
21724
  level = data.level,
21704
21725
  pathwayId = data.pathwayId,
21705
21726
  url = data.url,
21706
- deliveryDirectives = data.deliveryDirectives;
21727
+ deliveryDirectives = data.deliveryDirectives,
21728
+ levelInfo = data.levelInfo;
21707
21729
  this.load({
21708
21730
  id: id,
21709
21731
  level: level,
@@ -21711,14 +21733,16 @@
21711
21733
  responseType: 'text',
21712
21734
  type: PlaylistContextType.LEVEL,
21713
21735
  url: url,
21714
- deliveryDirectives: deliveryDirectives
21736
+ deliveryDirectives: deliveryDirectives,
21737
+ levelOrTrack: levelInfo
21715
21738
  });
21716
21739
  };
21717
21740
  _proto.onAudioTrackLoading = function onAudioTrackLoading(event, data) {
21718
21741
  var id = data.id,
21719
21742
  groupId = data.groupId,
21720
21743
  url = data.url,
21721
- deliveryDirectives = data.deliveryDirectives;
21744
+ deliveryDirectives = data.deliveryDirectives,
21745
+ track = data.track;
21722
21746
  this.load({
21723
21747
  id: id,
21724
21748
  groupId: groupId,
@@ -21726,14 +21750,16 @@
21726
21750
  responseType: 'text',
21727
21751
  type: PlaylistContextType.AUDIO_TRACK,
21728
21752
  url: url,
21729
- deliveryDirectives: deliveryDirectives
21753
+ deliveryDirectives: deliveryDirectives,
21754
+ levelOrTrack: track
21730
21755
  });
21731
21756
  };
21732
21757
  _proto.onSubtitleTrackLoading = function onSubtitleTrackLoading(event, data) {
21733
21758
  var id = data.id,
21734
21759
  groupId = data.groupId,
21735
21760
  url = data.url,
21736
- deliveryDirectives = data.deliveryDirectives;
21761
+ deliveryDirectives = data.deliveryDirectives,
21762
+ track = data.track;
21737
21763
  this.load({
21738
21764
  id: id,
21739
21765
  groupId: groupId,
@@ -21741,9 +21767,23 @@
21741
21767
  responseType: 'text',
21742
21768
  type: PlaylistContextType.SUBTITLE_TRACK,
21743
21769
  url: url,
21744
- deliveryDirectives: deliveryDirectives
21770
+ deliveryDirectives: deliveryDirectives,
21771
+ levelOrTrack: track
21745
21772
  });
21746
21773
  };
21774
+ _proto.onLevelsUpdated = function onLevelsUpdated(event, data) {
21775
+ // abort and delete loader of removed levels
21776
+ var loader = this.loaders[PlaylistContextType.LEVEL];
21777
+ if (loader) {
21778
+ var context = loader.context;
21779
+ if (context && !data.levels.some(function (lvl) {
21780
+ return lvl === context.levelOrTrack;
21781
+ })) {
21782
+ loader.abort();
21783
+ delete this.loaders[PlaylistContextType.LEVEL];
21784
+ }
21785
+ }
21786
+ };
21747
21787
  _proto.load = function load(context) {
21748
21788
  var _context$deliveryDire,
21749
21789
  _this = this;
@@ -21755,7 +21795,7 @@
21755
21795
  var loader = this.getInternalLoader(context);
21756
21796
  if (loader) {
21757
21797
  var loaderContext = loader.context;
21758
- if (loaderContext && loaderContext.url === context.url && loaderContext.level === context.level) {
21798
+ if (loaderContext && loaderContext.url === context.url && loaderContext.levelOrTrack === context.levelOrTrack) {
21759
21799
  // same URL can't overlap
21760
21800
  this.hls.logger.trace('[playlist-loader]: playlist request ongoing');
21761
21801
  return;
@@ -22076,6 +22116,7 @@
22076
22116
  case PlaylistContextType.LEVEL:
22077
22117
  hls.trigger(Events.LEVEL_LOADED, {
22078
22118
  details: levelDetails,
22119
+ levelInfo: context.levelOrTrack || hls.levels[0],
22079
22120
  level: levelIndex || 0,
22080
22121
  id: id || 0,
22081
22122
  stats: stats,
@@ -22086,6 +22127,7 @@
22086
22127
  case PlaylistContextType.AUDIO_TRACK:
22087
22128
  hls.trigger(Events.AUDIO_TRACK_LOADED, {
22088
22129
  details: levelDetails,
22130
+ track: context.levelOrTrack,
22089
22131
  id: id || 0,
22090
22132
  groupId: groupId || '',
22091
22133
  stats: stats,
@@ -22096,6 +22138,7 @@
22096
22138
  case PlaylistContextType.SUBTITLE_TRACK:
22097
22139
  hls.trigger(Events.SUBTITLE_TRACK_LOADED, {
22098
22140
  details: levelDetails,
22141
+ track: context.levelOrTrack,
22099
22142
  id: id || 0,
22100
22143
  groupId: groupId || '',
22101
22144
  stats: stats,