hls.js 1.6.0-beta.1.0.canary.10765 → 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.d.mts CHANGED
@@ -376,6 +376,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
376
376
  private updateLevelTiming;
377
377
  private playlistLabel;
378
378
  private fragInfo;
379
+ private treatAsGap;
379
380
  protected resetTransmuxer(): void;
380
381
  protected recoverWorkerError(data: ErrorData): void;
381
382
  set state(nextState: string);
package/dist/hls.d.ts CHANGED
@@ -376,6 +376,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
376
376
  private updateLevelTiming;
377
377
  private playlistLabel;
378
378
  private fragInfo;
379
+ private treatAsGap;
379
380
  protected resetTransmuxer(): void;
380
381
  protected recoverWorkerError(data: ErrorData): void;
381
382
  set state(nextState: string);
package/dist/hls.js CHANGED
@@ -1057,7 +1057,7 @@
1057
1057
  // Some browsers don't allow to use bind on console object anyway
1058
1058
  // fallback to default if needed
1059
1059
  try {
1060
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10765");
1060
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10766");
1061
1061
  } catch (e) {
1062
1062
  /* log fn threw an exception. All logger methods are no-ops. */
1063
1063
  return createLogger();
@@ -4321,6 +4321,10 @@
4321
4321
  }
4322
4322
  }]);
4323
4323
  }();
4324
+ function isMediaFragment(frag) {
4325
+ return frag.sn !== 'initSegment';
4326
+ }
4327
+
4324
4328
  /**
4325
4329
  * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
4326
4330
  */
@@ -4541,7 +4545,7 @@
4541
4545
  }, {
4542
4546
  key: "ref",
4543
4547
  get: function get() {
4544
- if (this.sn === 'initSegment') {
4548
+ if (!isMediaFragment(this)) {
4545
4549
  return null;
4546
4550
  }
4547
4551
  if (!this._ref) {
@@ -9196,7 +9200,7 @@
9196
9200
  _proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
9197
9201
  var media = this.mediaBuffer ? this.mediaBuffer : this.media;
9198
9202
  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)') + ")");
9199
- if (frag.sn !== 'initSegment') {
9203
+ if (isMediaFragment(frag)) {
9200
9204
  var _this$levels;
9201
9205
  if (frag.type !== PlaylistLevelType.SUBTITLE) {
9202
9206
  var el = frag.elementaryStreams;
@@ -9270,7 +9274,7 @@
9270
9274
  this.keyLoader.loadClear(frag, details.encryptedFragments);
9271
9275
  }
9272
9276
  var fragPrevious = this.fragPrevious;
9273
- if (frag.sn !== 'initSegment' && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
9277
+ if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
9274
9278
  var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
9275
9279
  if (shouldLoadParts !== this.loadingParts) {
9276
9280
  this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
@@ -9278,7 +9282,7 @@
9278
9282
  }
9279
9283
  }
9280
9284
  targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
9281
- if (this.loadingParts && frag.sn !== 'initSegment') {
9285
+ if (this.loadingParts && isMediaFragment(frag)) {
9282
9286
  var partList = details.partList;
9283
9287
  if (partList && progressCallback) {
9284
9288
  if (targetBufferTime > frag.end && details.fragmentHint) {
@@ -9321,7 +9325,7 @@
9321
9325
  }
9322
9326
  }
9323
9327
  }
9324
- if (frag.sn !== 'initSegment' && this.loadingParts) {
9328
+ if (isMediaFragment(frag) && this.loadingParts) {
9325
9329
  this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
9326
9330
  this.loadingParts = false;
9327
9331
  } else if (!frag.url) {
@@ -9863,7 +9867,7 @@
9863
9867
  return pos;
9864
9868
  };
9865
9869
  _proto.handleFragLoadAborted = function handleFragLoadAborted(frag, part) {
9866
- if (this.transmuxer && frag.sn !== 'initSegment' && frag.stats.aborted) {
9870
+ if (this.transmuxer && isMediaFragment(frag) && frag.stats.aborted) {
9867
9871
  this.warn("Fragment " + frag.sn + (part ? ' part ' + part.index : '') + " of level " + frag.level + " was aborted");
9868
9872
  this.resetFragmentLoading(frag);
9869
9873
  }
@@ -9898,10 +9902,18 @@
9898
9902
  var errorAction = data.errorAction;
9899
9903
  var _ref2 = errorAction || {},
9900
9904
  action = _ref2.action,
9905
+ flags = _ref2.flags,
9901
9906
  _ref2$retryCount = _ref2.retryCount,
9902
9907
  retryCount = _ref2$retryCount === void 0 ? 0 : _ref2$retryCount,
9903
9908
  retryConfig = _ref2.retryConfig;
9904
- if (errorAction && action === NetworkErrorAction.RetryRequest && retryConfig) {
9909
+ var couldRetry = !!errorAction && !!retryConfig;
9910
+ var retry = couldRetry && action === NetworkErrorAction.RetryRequest;
9911
+ var noAlternate = couldRetry && !errorAction.resolved && flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;
9912
+ if (!retry && noAlternate && isMediaFragment(frag) && !frag.endList) {
9913
+ this.resetFragmentErrors(filterType);
9914
+ this.treatAsGap(frag);
9915
+ errorAction.resolved = true;
9916
+ } else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {
9905
9917
  this.resetStartWhenNotLoaded(this.levelLastLoaded);
9906
9918
  var delay = getRetryDelay(retryConfig, retryCount);
9907
9919
  this.warn("Fragment " + frag.sn + " of " + filterType + " " + frag.level + " errored with " + data.details + ", retrying loading " + (retryCount + 1) + "/" + retryConfig.maxNumRetry + " in " + delay + "ms");
@@ -9919,7 +9931,7 @@
9919
9931
  this.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
9920
9932
  return;
9921
9933
  }
9922
- } else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
9934
+ } else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {
9923
9935
  this.state = State.WAITING_LEVEL;
9924
9936
  } else {
9925
9937
  this.state = State.ERROR;
@@ -10055,10 +10067,7 @@
10055
10067
  var error = new Error("Found no media in fragment " + frag.sn + " of level " + frag.level + " resetting transmuxer to fallback to playlist timing");
10056
10068
  if (level.fragmentError === 0) {
10057
10069
  // Mark and track the odd empty segment as a gap to avoid reloading
10058
- level.fragmentError++;
10059
- frag.gap = true;
10060
- this.fragmentTracker.removeFragment(frag);
10061
- this.fragmentTracker.fragBuffered(frag, true);
10070
+ this.treatAsGap(frag, level);
10062
10071
  }
10063
10072
  this.warn(error.message);
10064
10073
  this.hls.trigger(Events.ERROR, {
@@ -10092,6 +10101,14 @@
10092
10101
  }
10093
10102
  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') : '');
10094
10103
  };
10104
+ _proto.treatAsGap = function treatAsGap(frag, level) {
10105
+ if (level) {
10106
+ level.fragmentError++;
10107
+ }
10108
+ frag.gap = true;
10109
+ this.fragmentTracker.removeFragment(frag);
10110
+ this.fragmentTracker.fragBuffered(frag, true);
10111
+ };
10095
10112
  _proto.resetTransmuxer = function resetTransmuxer() {
10096
10113
  var _this$transmuxer2;
10097
10114
  (_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
@@ -16222,7 +16239,7 @@
16222
16239
  return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
16223
16240
  }
16224
16241
 
16225
- var version = "1.6.0-beta.1.0.canary.10765";
16242
+ var version = "1.6.0-beta.1.0.canary.10766";
16226
16243
 
16227
16244
  // ensure the worker ends up in the bundle
16228
16245
  // If the worker should not be included this gets aliased to empty.js
@@ -16915,7 +16932,7 @@
16915
16932
 
16916
16933
  // Request audio segments up to one fragment ahead of main stream-controller
16917
16934
  var mainFragLoading = (_this$mainFragLoading = this.mainFragLoading) == null ? void 0 : _this$mainFragLoading.frag;
16918
- if (this.startFragRequested && mainFragLoading && mainFragLoading.sn !== 'initSegment' && frag.sn !== 'initSegment' && !frag.endList && (!trackDetails.live || !this.loadingParts && targetBufferTime < this.hls.liveSyncPosition)) {
16935
+ if (this.startFragRequested && mainFragLoading && isMediaFragment(mainFragLoading) && isMediaFragment(frag) && !frag.endList && (!trackDetails.live || !this.loadingParts && targetBufferTime < this.hls.liveSyncPosition)) {
16919
16936
  var mainFrag = mainFragLoading;
16920
16937
  if (frag.start > mainFrag.end) {
16921
16938
  // Get buffered frag at target position from tracker (loaded out of sequence)
@@ -17117,7 +17134,7 @@
17117
17134
  }
17118
17135
  };
17119
17136
  _proto.onFragLoading = function onFragLoading(event, data) {
17120
- if (data.frag.type === PlaylistLevelType.MAIN && data.frag.sn !== 'initSegment') {
17137
+ if (data.frag.type === PlaylistLevelType.MAIN && isMediaFragment(data.frag)) {
17121
17138
  this.mainFragLoading = data;
17122
17139
  if (this.state === State.IDLE) {
17123
17140
  this.tick();
@@ -17136,7 +17153,7 @@
17136
17153
  this.warn("Fragment " + frag.sn + (part ? ' p: ' + part.index : '') + " of level " + frag.level + " finished buffering, but was aborted. state: " + this.state + ", audioSwitch: " + (this.switchingTrack ? this.switchingTrack.name : 'false'));
17137
17154
  return;
17138
17155
  }
17139
- if (frag.sn !== 'initSegment') {
17156
+ if (isMediaFragment(frag)) {
17140
17157
  this.fragPrevious = frag;
17141
17158
  var track = this.switchingTrack;
17142
17159
  if (track) {
@@ -17334,7 +17351,7 @@
17334
17351
  // we force a frag loading in audio switch as fragment tracker might not have evicted previous frags in case of quick audio switch
17335
17352
  if (this.switchingTrack || fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
17336
17353
  var _track$details2;
17337
- if (frag.sn === 'initSegment') {
17354
+ if (!isMediaFragment(frag)) {
17338
17355
  this._loadInitSegment(frag, track);
17339
17356
  } else if ((_track$details2 = track.details) != null && _track$details2.live && !this.initPTS[frag.cc]) {
17340
17357
  this.log("Waiting for video PTS in continuity counter " + frag.cc + " of live stream before loading audio fragment " + frag.sn + " of level " + this.trackId);
@@ -25510,7 +25527,7 @@
25510
25527
  _proto.onSubtitleFragProcessed = function onSubtitleFragProcessed(event, data) {
25511
25528
  var frag = data.frag,
25512
25529
  success = data.success;
25513
- if (frag.sn !== 'initSegment') {
25530
+ if (isMediaFragment(frag)) {
25514
25531
  this.fragPrevious = frag;
25515
25532
  }
25516
25533
  this.state = State.IDLE;
@@ -25779,7 +25796,7 @@
25779
25796
  return;
25780
25797
  }
25781
25798
  foundFrag = this.mapToInitFragWhenRequired(foundFrag);
25782
- if (foundFrag.sn !== 'initSegment') {
25799
+ if (isMediaFragment(foundFrag)) {
25783
25800
  // Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment
25784
25801
  var curSNIdx = foundFrag.sn - trackDetails.startSN;
25785
25802
  var prevFrag = fragments[curSNIdx - 1];
@@ -25794,7 +25811,7 @@
25794
25811
  }
25795
25812
  };
25796
25813
  _proto.loadFragment = function loadFragment(frag, level, targetBufferTime) {
25797
- if (frag.sn === 'initSegment') {
25814
+ if (!isMediaFragment(frag)) {
25798
25815
  this._loadInitSegment(frag, level);
25799
25816
  } else {
25800
25817
  _BaseStreamController.prototype.loadFragment.call(this, frag, level, targetBufferTime);
@@ -32156,7 +32173,7 @@
32156
32173
  var targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;
32157
32174
  var frag = this.getNextFragment(targetBufferTime, levelDetails);
32158
32175
  // Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)
32159
- if (this.couldBacktrack && !this.fragPrevious && frag && frag.sn !== 'initSegment' && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
32176
+ if (this.couldBacktrack && !this.fragPrevious && frag && isMediaFragment(frag) && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
32160
32177
  var _this$backtrackFragme;
32161
32178
  var backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;
32162
32179
  var fragIdx = backtrackSn - levelDetails.startSN;
@@ -32193,7 +32210,7 @@
32193
32210
  // Check if fragment is not loaded
32194
32211
  var fragState = this.fragmentTracker.getState(frag);
32195
32212
  if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
32196
- if (frag.sn === 'initSegment') {
32213
+ if (!isMediaFragment(frag)) {
32197
32214
  this._loadInitSegment(frag, level);
32198
32215
  } else if (this.bitrateTest) {
32199
32216
  this.log("Fragment " + frag.sn + " of level " + frag.level + " is being downloaded to test bitrate and will not be buffered");
@@ -32603,7 +32620,7 @@
32603
32620
  }
32604
32621
  var stats = part ? part.stats : frag.stats;
32605
32622
  this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first));
32606
- if (frag.sn !== 'initSegment') {
32623
+ if (isMediaFragment(frag)) {
32607
32624
  this.fragPrevious = frag;
32608
32625
  }
32609
32626
  this.fragBufferedComplete(frag, part);
package/dist/hls.js.d.ts CHANGED
@@ -376,6 +376,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
376
376
  private updateLevelTiming;
377
377
  private playlistLabel;
378
378
  private fragInfo;
379
+ private treatAsGap;
379
380
  protected resetTransmuxer(): void;
380
381
  protected recoverWorkerError(data: ErrorData): void;
381
382
  set state(nextState: string);