hls.js 1.6.0-beta.2.0.canary.10925 → 1.6.0-beta.2.0.canary.10926

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
@@ -1449,7 +1449,7 @@ export declare class FragmentTracker implements ComponentAPI {
1449
1449
  /**
1450
1450
  * Gets the partial fragment for a certain time
1451
1451
  */
1452
- getPartialFragment(time: number): Fragment | null;
1452
+ getPartialFragment(time: number): MediaFragment | null;
1453
1453
  isEndListAppended(type: PlaylistLevelType): boolean;
1454
1454
  getState(fragment: Fragment): FragmentState;
1455
1455
  private isTimeBuffered;
@@ -1665,7 +1665,14 @@ declare class Hls implements HlsEventEmitter {
1665
1665
  * @returns an array of levels (variants) sorted by HDCP-LEVEL, RESOLUTION (height), FRAME-RATE, CODECS, VIDEO-RANGE, and BANDWIDTH
1666
1666
  */
1667
1667
  get levels(): Level[];
1668
+ /**
1669
+ * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.
1670
+ */
1668
1671
  get latestLevelDetails(): LevelDetails | null;
1672
+ /**
1673
+ * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.
1674
+ */
1675
+ get loadLevelObj(): Level | null;
1669
1676
  /**
1670
1677
  * Index of quality level (variant) currently played
1671
1678
  */
package/dist/hls.d.ts CHANGED
@@ -1449,7 +1449,7 @@ export declare class FragmentTracker implements ComponentAPI {
1449
1449
  /**
1450
1450
  * Gets the partial fragment for a certain time
1451
1451
  */
1452
- getPartialFragment(time: number): Fragment | null;
1452
+ getPartialFragment(time: number): MediaFragment | null;
1453
1453
  isEndListAppended(type: PlaylistLevelType): boolean;
1454
1454
  getState(fragment: Fragment): FragmentState;
1455
1455
  private isTimeBuffered;
@@ -1665,7 +1665,14 @@ declare class Hls implements HlsEventEmitter {
1665
1665
  * @returns an array of levels (variants) sorted by HDCP-LEVEL, RESOLUTION (height), FRAME-RATE, CODECS, VIDEO-RANGE, and BANDWIDTH
1666
1666
  */
1667
1667
  get levels(): Level[];
1668
+ /**
1669
+ * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.
1670
+ */
1668
1671
  get latestLevelDetails(): LevelDetails | null;
1672
+ /**
1673
+ * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.
1674
+ */
1675
+ get loadLevelObj(): Level | null;
1669
1676
  /**
1670
1677
  * Index of quality level (variant) currently played
1671
1678
  */
package/dist/hls.js CHANGED
@@ -1059,7 +1059,7 @@
1059
1059
  // Some browsers don't allow to use bind on console object anyway
1060
1060
  // fallback to default if needed
1061
1061
  try {
1062
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.2.0.canary.10925");
1062
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.2.0.canary.10926");
1063
1063
  } catch (e) {
1064
1064
  /* log fn threw an exception. All logger methods are no-ops. */
1065
1065
  return createLogger();
@@ -2049,8 +2049,8 @@
2049
2049
  return -1;
2050
2050
  }
2051
2051
  function useAlternateAudio(audioTrackUrl, hls) {
2052
- var _hls$levels$hls$loadL;
2053
- return !!audioTrackUrl && audioTrackUrl !== ((_hls$levels$hls$loadL = hls.levels[hls.loadLevel]) == null ? undefined : _hls$levels$hls$loadL.uri);
2052
+ var _hls$loadLevelObj;
2053
+ return !!audioTrackUrl && audioTrackUrl !== ((_hls$loadLevelObj = hls.loadLevelObj) == null ? undefined : _hls$loadLevelObj.uri);
2054
2054
  }
2055
2055
 
2056
2056
  var AbrController = /*#__PURE__*/function (_Logger) {
@@ -2470,8 +2470,8 @@
2470
2470
  }
2471
2471
  // If no matching level found, see if min auto level would be a better option
2472
2472
  var minLevel = hls.levels[minAutoLevel];
2473
- var autoLevel = hls.levels[hls.loadLevel];
2474
- if ((minLevel == null ? undefined : minLevel.bitrate) < (autoLevel == null ? undefined : autoLevel.bitrate)) {
2473
+ var autoLevel = hls.loadLevelObj;
2474
+ if (autoLevel && (minLevel == null ? undefined : minLevel.bitrate) < autoLevel.bitrate) {
2475
2475
  return minAutoLevel;
2476
2476
  }
2477
2477
  // or if bitrate is not lower, continue to use loadLevel
@@ -3086,7 +3086,7 @@
3086
3086
  case ErrorDetails.SUBTITLE_LOAD_ERROR:
3087
3087
  case ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT:
3088
3088
  if (context) {
3089
- var level = hls.levels[hls.loadLevel];
3089
+ var level = hls.loadLevelObj;
3090
3090
  if (level && (context.type === PlaylistContextType.AUDIO_TRACK && level.hasAudioGroup(context.groupId) || context.type === PlaylistContextType.SUBTITLE_TRACK && level.hasSubtitleGroup(context.groupId))) {
3091
3091
  // Perform Pathway switch or Redundant failover if possible for fastest recovery
3092
3092
  // otherwise allow playlist retry count to reach max error retries
@@ -3099,7 +3099,7 @@
3099
3099
  return;
3100
3100
  case ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:
3101
3101
  {
3102
- var _level = hls.levels[hls.loadLevel];
3102
+ var _level = hls.loadLevelObj;
3103
3103
  var restrictedHdcpLevel = _level == null ? undefined : _level.attrs['HDCP-LEVEL'];
3104
3104
  if (restrictedHdcpLevel) {
3105
3105
  data.errorAction = {
@@ -9629,7 +9629,8 @@
9629
9629
  if (bufferInfo.len === 0 && bufferInfo.nextStart !== undefined) {
9630
9630
  var bufferedFragAtPos = this.fragmentTracker.getBufferedFrag(pos, type);
9631
9631
  if (bufferedFragAtPos && (bufferInfo.nextStart <= bufferedFragAtPos.end || bufferedFragAtPos.gap)) {
9632
- return BufferHelper.bufferInfo(bufferable, pos, Math.max(bufferInfo.nextStart, maxBufferHole));
9632
+ var gapDuration = Math.max(Math.min(bufferInfo.nextStart, bufferedFragAtPos.end) - pos, maxBufferHole);
9633
+ return BufferHelper.bufferInfo(bufferable, pos, gapDuration);
9633
9634
  }
9634
9635
  }
9635
9636
  return bufferInfo;
@@ -16334,7 +16335,7 @@
16334
16335
  return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
16335
16336
  }
16336
16337
 
16337
- var version = "1.6.0-beta.2.0.canary.10925";
16338
+ var version = "1.6.0-beta.2.0.canary.10926";
16338
16339
 
16339
16340
  // ensure the worker ends up in the bundle
16340
16341
  // If the worker should not be included this gets aliased to empty.js
@@ -25004,7 +25005,7 @@
25004
25005
  var primary = this.hls;
25005
25006
  var userConfig = primary.userConfig;
25006
25007
  var videoPreference = userConfig.videoPreference;
25007
- var currentLevel = primary.levels[primary.loadLevel] || primary.levels[primary.currentLevel];
25008
+ var currentLevel = primary.loadLevelObj || primary.levels[primary.currentLevel];
25008
25009
  if (videoPreference || currentLevel) {
25009
25010
  videoPreference = _extends({}, videoPreference);
25010
25011
  if (currentLevel.videoCodec) {
@@ -31048,7 +31049,7 @@
31048
31049
  var currentTime = media.currentTime;
31049
31050
  var bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);
31050
31051
  var startTime = currentTime < bufferInfo.start ? bufferInfo.start : bufferInfo.nextStart;
31051
- if (startTime) {
31052
+ if (startTime && this.hls) {
31052
31053
  var bufferStarved = bufferInfo.len <= config.maxBufferHole;
31053
31054
  var waiting = bufferInfo.len > 0 && bufferInfo.len < 1 && media.readyState < 3;
31054
31055
  var gapLength = startTime - currentTime;
@@ -31065,6 +31066,17 @@
31065
31066
  if (!startGap) {
31066
31067
  var startProvisioned = partial || fragmentTracker.getAppendedFrag(currentTime, PlaylistLevelType.MAIN);
31067
31068
  if (startProvisioned) {
31069
+ var _this$hls$loadLevelOb;
31070
+ // Do not seek when selected variant playlist is unloaded
31071
+ if (!((_this$hls$loadLevelOb = this.hls.loadLevelObj) != null && _this$hls$loadLevelOb.details)) {
31072
+ return 0;
31073
+ }
31074
+ // Do not seek when required fragments are inflight or appending
31075
+ var inFlightDependency = getInFlightDependency(this.hls.inFlightFragments, startTime);
31076
+ if (inFlightDependency) {
31077
+ return 0;
31078
+ }
31079
+ // Do not seek if we can't walk tracked fragments to end of gap
31068
31080
  var moreToLoad = false;
31069
31081
  var pos = startProvisioned.end;
31070
31082
  while (pos < startTime) {
@@ -31086,7 +31098,7 @@
31086
31098
  this.warn("skipping hole, adjusting currentTime from " + currentTime + " to " + targetTime);
31087
31099
  this.moved = true;
31088
31100
  media.currentTime = targetTime;
31089
- if (!(partial != null && partial.gap) && this.hls) {
31101
+ if (!(partial != null && partial.gap)) {
31090
31102
  var error = new Error("fragment loaded with buffer holes, seeking from " + currentTime + " to " + targetTime);
31091
31103
  this.hls.trigger(Events.ERROR, {
31092
31104
  type: ErrorTypes.MEDIA_ERROR,
@@ -32190,6 +32202,11 @@
32190
32202
  }
32191
32203
  return this._levels;
32192
32204
  }
32205
+ }, {
32206
+ key: "loadLevelObj",
32207
+ get: function get() {
32208
+ return this.currentLevel;
32209
+ }
32193
32210
  }, {
32194
32211
  key: "level",
32195
32212
  get: function get() {
@@ -32543,7 +32560,7 @@
32543
32560
  _proto.onTickEnd = function onTickEnd() {
32544
32561
  var _this$media2;
32545
32562
  _BaseStreamController.prototype.onTickEnd.call(this);
32546
- if ((_this$media2 = this.media) != null && _this$media2.readyState) {
32563
+ if ((_this$media2 = this.media) != null && _this$media2.readyState && this.media.seeking === false) {
32547
32564
  this.lastCurrentTime = this.media.currentTime;
32548
32565
  }
32549
32566
  this.checkFragmentChanged();
@@ -34923,12 +34940,25 @@
34923
34940
  var levels = this.levelController.levels;
34924
34941
  return levels ? levels : [];
34925
34942
  }
34943
+
34944
+ /**
34945
+ * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.
34946
+ */
34926
34947
  }, {
34927
34948
  key: "latestLevelDetails",
34928
34949
  get: function get() {
34929
34950
  return this.streamController.getLevelDetails() || null;
34930
34951
  }
34931
34952
 
34953
+ /**
34954
+ * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.
34955
+ */
34956
+ }, {
34957
+ key: "loadLevelObj",
34958
+ get: function get() {
34959
+ return this.levelController.loadLevelObj;
34960
+ }
34961
+
34932
34962
  /**
34933
34963
  * Index of quality level (variant) currently played
34934
34964
  */
package/dist/hls.js.d.ts CHANGED
@@ -1449,7 +1449,7 @@ export declare class FragmentTracker implements ComponentAPI {
1449
1449
  /**
1450
1450
  * Gets the partial fragment for a certain time
1451
1451
  */
1452
- getPartialFragment(time: number): Fragment | null;
1452
+ getPartialFragment(time: number): MediaFragment | null;
1453
1453
  isEndListAppended(type: PlaylistLevelType): boolean;
1454
1454
  getState(fragment: Fragment): FragmentState;
1455
1455
  private isTimeBuffered;
@@ -1665,7 +1665,14 @@ declare class Hls implements HlsEventEmitter {
1665
1665
  * @returns an array of levels (variants) sorted by HDCP-LEVEL, RESOLUTION (height), FRAME-RATE, CODECS, VIDEO-RANGE, and BANDWIDTH
1666
1666
  */
1667
1667
  get levels(): Level[];
1668
+ /**
1669
+ * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.
1670
+ */
1668
1671
  get latestLevelDetails(): LevelDetails | null;
1672
+ /**
1673
+ * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.
1674
+ */
1675
+ get loadLevelObj(): Level | null;
1669
1676
  /**
1670
1677
  * Index of quality level (variant) currently played
1671
1678
  */