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.
@@ -400,7 +400,7 @@ function enableLogs(debugConfig, context, id) {
400
400
  // Some browsers don't allow to use bind on console object anyway
401
401
  // fallback to default if needed
402
402
  try {
403
- newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10765"}`);
403
+ newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10767"}`);
404
404
  } catch (e) {
405
405
  /* log fn threw an exception. All logger methods are no-ops. */
406
406
  return createLogger();
@@ -2856,6 +2856,10 @@ class BaseSegment {
2856
2856
  elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;
2857
2857
  }
2858
2858
  }
2859
+ function isMediaFragment(frag) {
2860
+ return frag.sn !== 'initSegment';
2861
+ }
2862
+
2859
2863
  /**
2860
2864
  * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
2861
2865
  */
@@ -3009,7 +3013,7 @@ class Fragment extends BaseSegment {
3009
3013
  this._programDateTime = value;
3010
3014
  }
3011
3015
  get ref() {
3012
- if (this.sn === 'initSegment') {
3016
+ if (!isMediaFragment(this)) {
3013
3017
  return null;
3014
3018
  }
3015
3019
  if (!this._ref) {
@@ -7924,7 +7928,7 @@ class BaseStreamController extends TaskLoop {
7924
7928
  fragBufferedComplete(frag, part) {
7925
7929
  const media = this.mediaBuffer ? this.mediaBuffer : this.media;
7926
7930
  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)'})`);
7927
- if (frag.sn !== 'initSegment') {
7931
+ if (isMediaFragment(frag)) {
7928
7932
  var _this$levels;
7929
7933
  if (frag.type !== PlaylistLevelType.SUBTITLE) {
7930
7934
  const el = frag.elementaryStreams;
@@ -7993,7 +7997,7 @@ class BaseStreamController extends TaskLoop {
7993
7997
  this.keyLoader.loadClear(frag, details.encryptedFragments);
7994
7998
  }
7995
7999
  const fragPrevious = this.fragPrevious;
7996
- if (frag.sn !== 'initSegment' && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
8000
+ if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
7997
8001
  const shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
7998
8002
  if (shouldLoadParts !== this.loadingParts) {
7999
8003
  this.log(`LL-Part loading ${shouldLoadParts ? 'ON' : 'OFF'} loading sn ${fragPrevious == null ? void 0 : fragPrevious.sn}->${frag.sn}`);
@@ -8001,7 +8005,7 @@ class BaseStreamController extends TaskLoop {
8001
8005
  }
8002
8006
  }
8003
8007
  targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
8004
- if (this.loadingParts && frag.sn !== 'initSegment') {
8008
+ if (this.loadingParts && isMediaFragment(frag)) {
8005
8009
  const partList = details.partList;
8006
8010
  if (partList && progressCallback) {
8007
8011
  if (targetBufferTime > frag.end && details.fragmentHint) {
@@ -8040,7 +8044,7 @@ class BaseStreamController extends TaskLoop {
8040
8044
  }
8041
8045
  }
8042
8046
  }
8043
- if (frag.sn !== 'initSegment' && this.loadingParts) {
8047
+ if (isMediaFragment(frag) && this.loadingParts) {
8044
8048
  this.log(`LL-Part loading OFF after next part miss @${targetBufferTime.toFixed(2)}`);
8045
8049
  this.loadingParts = false;
8046
8050
  } else if (!frag.url) {
@@ -8599,7 +8603,7 @@ class BaseStreamController extends TaskLoop {
8599
8603
  return pos;
8600
8604
  }
8601
8605
  handleFragLoadAborted(frag, part) {
8602
- if (this.transmuxer && frag.sn !== 'initSegment' && frag.stats.aborted) {
8606
+ if (this.transmuxer && isMediaFragment(frag) && frag.stats.aborted) {
8603
8607
  this.warn(`Fragment ${frag.sn}${part ? ' part ' + part.index : ''} of level ${frag.level} was aborted`);
8604
8608
  this.resetFragmentLoading(frag);
8605
8609
  }
@@ -8634,10 +8638,18 @@ class BaseStreamController extends TaskLoop {
8634
8638
  const errorAction = data.errorAction;
8635
8639
  const {
8636
8640
  action,
8641
+ flags,
8637
8642
  retryCount = 0,
8638
8643
  retryConfig
8639
8644
  } = errorAction || {};
8640
- if (errorAction && action === NetworkErrorAction.RetryRequest && retryConfig) {
8645
+ const couldRetry = !!errorAction && !!retryConfig;
8646
+ const retry = couldRetry && action === NetworkErrorAction.RetryRequest;
8647
+ const noAlternate = couldRetry && !errorAction.resolved && flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;
8648
+ if (!retry && noAlternate && isMediaFragment(frag) && !frag.endList) {
8649
+ this.resetFragmentErrors(filterType);
8650
+ this.treatAsGap(frag);
8651
+ errorAction.resolved = true;
8652
+ } else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {
8641
8653
  this.resetStartWhenNotLoaded(this.levelLastLoaded);
8642
8654
  const delay = getRetryDelay(retryConfig, retryCount);
8643
8655
  this.warn(`Fragment ${frag.sn} of ${filterType} ${frag.level} errored with ${data.details}, retrying loading ${retryCount + 1}/${retryConfig.maxNumRetry} in ${delay}ms`);
@@ -8655,7 +8667,7 @@ class BaseStreamController extends TaskLoop {
8655
8667
  this.warn(`${data.details} reached or exceeded max retry (${retryCount})`);
8656
8668
  return;
8657
8669
  }
8658
- } else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
8670
+ } else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {
8659
8671
  this.state = State.WAITING_LEVEL;
8660
8672
  } else {
8661
8673
  this.state = State.ERROR;
@@ -8787,10 +8799,7 @@ class BaseStreamController extends TaskLoop {
8787
8799
  const error = new Error(`Found no media in fragment ${frag.sn} of level ${frag.level} resetting transmuxer to fallback to playlist timing`);
8788
8800
  if (level.fragmentError === 0) {
8789
8801
  // Mark and track the odd empty segment as a gap to avoid reloading
8790
- level.fragmentError++;
8791
- frag.gap = true;
8792
- this.fragmentTracker.removeFragment(frag);
8793
- this.fragmentTracker.fragBuffered(frag, true);
8802
+ this.treatAsGap(frag, level);
8794
8803
  }
8795
8804
  this.warn(error.message);
8796
8805
  this.hls.trigger(Events.ERROR, {
@@ -8821,6 +8830,14 @@ class BaseStreamController extends TaskLoop {
8821
8830
  var _ref, _ref2;
8822
8831
  return `${this.playlistLabel()} ${frag.level} (${part ? 'part' : 'frag'}:[${((_ref = pts && !part ? frag.startPTS : (part || frag).start) != null ? _ref : NaN).toFixed(3)}-${((_ref2 = pts && !part ? frag.endPTS : (part || frag).end) != null ? _ref2 : NaN).toFixed(3)}]${part && frag.type === 'main' ? 'INDEPENDENT=' + (part.independent ? 'YES' : 'NO') : ''}`;
8823
8832
  }
8833
+ treatAsGap(frag, level) {
8834
+ if (level) {
8835
+ level.fragmentError++;
8836
+ }
8837
+ frag.gap = true;
8838
+ this.fragmentTracker.removeFragment(frag);
8839
+ this.fragmentTracker.fragBuffered(frag, true);
8840
+ }
8824
8841
  resetTransmuxer() {
8825
8842
  var _this$transmuxer2;
8826
8843
  (_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
@@ -19082,7 +19099,7 @@ class GapController extends Logger {
19082
19099
  }
19083
19100
  }
19084
19101
 
19085
- const version = "1.6.0-beta.1.0.canary.10765";
19102
+ const version = "1.6.0-beta.1.0.canary.10767";
19086
19103
 
19087
19104
  // ensure the worker ends up in the bundle
19088
19105
  // If the worker should not be included this gets aliased to empty.js
@@ -19742,7 +19759,7 @@ class StreamController extends BaseStreamController {
19742
19759
  const targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;
19743
19760
  let frag = this.getNextFragment(targetBufferTime, levelDetails);
19744
19761
  // Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)
19745
- if (this.couldBacktrack && !this.fragPrevious && frag && frag.sn !== 'initSegment' && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
19762
+ if (this.couldBacktrack && !this.fragPrevious && frag && isMediaFragment(frag) && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
19746
19763
  var _this$backtrackFragme;
19747
19764
  const backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;
19748
19765
  const fragIdx = backtrackSn - levelDetails.startSN;
@@ -19779,7 +19796,7 @@ class StreamController extends BaseStreamController {
19779
19796
  // Check if fragment is not loaded
19780
19797
  const fragState = this.fragmentTracker.getState(frag);
19781
19798
  if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
19782
- if (frag.sn === 'initSegment') {
19799
+ if (!isMediaFragment(frag)) {
19783
19800
  this._loadInitSegment(frag, level);
19784
19801
  } else if (this.bitrateTest) {
19785
19802
  this.log(`Fragment ${frag.sn} of level ${frag.level} is being downloaded to test bitrate and will not be buffered`);
@@ -20205,7 +20222,7 @@ class StreamController extends BaseStreamController {
20205
20222
  }
20206
20223
  const stats = part ? part.stats : frag.stats;
20207
20224
  this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first));
20208
- if (frag.sn !== 'initSegment') {
20225
+ if (isMediaFragment(frag)) {
20209
20226
  this.fragPrevious = frag;
20210
20227
  }
20211
20228
  this.fragBufferedComplete(frag, part);
@@ -21925,6 +21942,10 @@ class Hls {
21925
21942
  return;
21926
21943
  }
21927
21944
  this.logger.log(`attachMedia`);
21945
+ if (this._media) {
21946
+ this.logger.warn(`media must be detached before attaching`);
21947
+ this.detachMedia();
21948
+ }
21928
21949
  const attachMediaSource = 'media' in data;
21929
21950
  const media = attachMediaSource ? data.media : data;
21930
21951
  const attachingData = attachMediaSource ? data : {