hls.js 1.6.0-beta.1.0.canary.10765 → 1.6.0-beta.1.0.canary.10767

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.10765");
1031
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10767");
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) {
@@ -18252,7 +18256,7 @@
18252
18256
  _proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
18253
18257
  var media = this.mediaBuffer ? this.mediaBuffer : this.media;
18254
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)') + ")");
18255
- if (frag.sn !== 'initSegment') {
18259
+ if (isMediaFragment(frag)) {
18256
18260
  var _this$levels;
18257
18261
  if (frag.type !== PlaylistLevelType.SUBTITLE) {
18258
18262
  var el = frag.elementaryStreams;
@@ -18326,7 +18330,7 @@
18326
18330
  this.keyLoader.loadClear(frag, details.encryptedFragments);
18327
18331
  }
18328
18332
  var fragPrevious = this.fragPrevious;
18329
- if (frag.sn !== 'initSegment' && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
18333
+ if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
18330
18334
  var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
18331
18335
  if (shouldLoadParts !== this.loadingParts) {
18332
18336
  this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
@@ -18334,7 +18338,7 @@
18334
18338
  }
18335
18339
  }
18336
18340
  targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
18337
- if (this.loadingParts && frag.sn !== 'initSegment') {
18341
+ if (this.loadingParts && isMediaFragment(frag)) {
18338
18342
  var partList = details.partList;
18339
18343
  if (partList && progressCallback) {
18340
18344
  if (targetBufferTime > frag.end && details.fragmentHint) {
@@ -18377,7 +18381,7 @@
18377
18381
  }
18378
18382
  }
18379
18383
  }
18380
- if (frag.sn !== 'initSegment' && this.loadingParts) {
18384
+ if (isMediaFragment(frag) && this.loadingParts) {
18381
18385
  this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
18382
18386
  this.loadingParts = false;
18383
18387
  } else if (!frag.url) {
@@ -18919,7 +18923,7 @@
18919
18923
  return pos;
18920
18924
  };
18921
18925
  _proto.handleFragLoadAborted = function handleFragLoadAborted(frag, part) {
18922
- if (this.transmuxer && frag.sn !== 'initSegment' && frag.stats.aborted) {
18926
+ if (this.transmuxer && isMediaFragment(frag) && frag.stats.aborted) {
18923
18927
  this.warn("Fragment " + frag.sn + (part ? ' part ' + part.index : '') + " of level " + frag.level + " was aborted");
18924
18928
  this.resetFragmentLoading(frag);
18925
18929
  }
@@ -18954,10 +18958,18 @@
18954
18958
  var errorAction = data.errorAction;
18955
18959
  var _ref2 = errorAction || {},
18956
18960
  action = _ref2.action,
18961
+ flags = _ref2.flags,
18957
18962
  _ref2$retryCount = _ref2.retryCount,
18958
18963
  retryCount = _ref2$retryCount === void 0 ? 0 : _ref2$retryCount,
18959
18964
  retryConfig = _ref2.retryConfig;
18960
- 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) {
18961
18973
  this.resetStartWhenNotLoaded(this.levelLastLoaded);
18962
18974
  var delay = getRetryDelay(retryConfig, retryCount);
18963
18975
  this.warn("Fragment " + frag.sn + " of " + filterType + " " + frag.level + " errored with " + data.details + ", retrying loading " + (retryCount + 1) + "/" + retryConfig.maxNumRetry + " in " + delay + "ms");
@@ -18975,7 +18987,7 @@
18975
18987
  this.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
18976
18988
  return;
18977
18989
  }
18978
- } else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
18990
+ } else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {
18979
18991
  this.state = State.WAITING_LEVEL;
18980
18992
  } else {
18981
18993
  this.state = State.ERROR;
@@ -19111,10 +19123,7 @@
19111
19123
  var error = new Error("Found no media in fragment " + frag.sn + " of level " + frag.level + " resetting transmuxer to fallback to playlist timing");
19112
19124
  if (level.fragmentError === 0) {
19113
19125
  // Mark and track the odd empty segment as a gap to avoid reloading
19114
- level.fragmentError++;
19115
- frag.gap = true;
19116
- this.fragmentTracker.removeFragment(frag);
19117
- this.fragmentTracker.fragBuffered(frag, true);
19126
+ this.treatAsGap(frag, level);
19118
19127
  }
19119
19128
  this.warn(error.message);
19120
19129
  this.hls.trigger(Events.ERROR, {
@@ -19148,6 +19157,14 @@
19148
19157
  }
19149
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') : '');
19150
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
+ };
19151
19168
  _proto.resetTransmuxer = function resetTransmuxer() {
19152
19169
  var _this$transmuxer2;
19153
19170
  (_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
@@ -19692,7 +19709,7 @@
19692
19709
  return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
19693
19710
  }
19694
19711
 
19695
- var version = "1.6.0-beta.1.0.canary.10765";
19712
+ var version = "1.6.0-beta.1.0.canary.10767";
19696
19713
 
19697
19714
  // ensure the worker ends up in the bundle
19698
19715
  // If the worker should not be included this gets aliased to empty.js
@@ -20336,7 +20353,7 @@
20336
20353
  var targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;
20337
20354
  var frag = this.getNextFragment(targetBufferTime, levelDetails);
20338
20355
  // Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)
20339
- 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) {
20340
20357
  var _this$backtrackFragme;
20341
20358
  var backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;
20342
20359
  var fragIdx = backtrackSn - levelDetails.startSN;
@@ -20373,7 +20390,7 @@
20373
20390
  // Check if fragment is not loaded
20374
20391
  var fragState = this.fragmentTracker.getState(frag);
20375
20392
  if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
20376
- if (frag.sn === 'initSegment') {
20393
+ if (!isMediaFragment(frag)) {
20377
20394
  this._loadInitSegment(frag, level);
20378
20395
  } else if (this.bitrateTest) {
20379
20396
  this.log("Fragment " + frag.sn + " of level " + frag.level + " is being downloaded to test bitrate and will not be buffered");
@@ -20783,7 +20800,7 @@
20783
20800
  }
20784
20801
  var stats = part ? part.stats : frag.stats;
20785
20802
  this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first));
20786
- if (frag.sn !== 'initSegment') {
20803
+ if (isMediaFragment(frag)) {
20787
20804
  this.fragPrevious = frag;
20788
20805
  }
20789
20806
  this.fragBufferedComplete(frag, part);
@@ -22480,6 +22497,10 @@
22480
22497
  return;
22481
22498
  }
22482
22499
  this.logger.log("attachMedia");
22500
+ if (this._media) {
22501
+ this.logger.warn("media must be detached before attaching");
22502
+ this.detachMedia();
22503
+ }
22483
22504
  var attachMediaSource = 'media' in data;
22484
22505
  var media = attachMediaSource ? data.media : data;
22485
22506
  var attachingData = attachMediaSource ? data : {