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.mjs CHANGED
@@ -402,7 +402,7 @@ function enableLogs(debugConfig, context, id) {
402
402
  // Some browsers don't allow to use bind on console object anyway
403
403
  // fallback to default if needed
404
404
  try {
405
- newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.2.0.canary.10925"}`);
405
+ newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.2.0.canary.10926"}`);
406
406
  } catch (e) {
407
407
  /* log fn threw an exception. All logger methods are no-ops. */
408
408
  return createLogger();
@@ -1307,8 +1307,8 @@ function searchDownAndUpList(arr, searchIndex, predicate) {
1307
1307
  return -1;
1308
1308
  }
1309
1309
  function useAlternateAudio(audioTrackUrl, hls) {
1310
- var _hls$levels$hls$loadL;
1311
- return !!audioTrackUrl && audioTrackUrl !== ((_hls$levels$hls$loadL = hls.levels[hls.loadLevel]) == null ? undefined : _hls$levels$hls$loadL.uri);
1310
+ var _hls$loadLevelObj;
1311
+ return !!audioTrackUrl && audioTrackUrl !== ((_hls$loadLevelObj = hls.loadLevelObj) == null ? undefined : _hls$loadLevelObj.uri);
1312
1312
  }
1313
1313
 
1314
1314
  class AbrController extends Logger {
@@ -1802,8 +1802,8 @@ class AbrController extends Logger {
1802
1802
  }
1803
1803
  // If no matching level found, see if min auto level would be a better option
1804
1804
  const minLevel = hls.levels[minAutoLevel];
1805
- const autoLevel = hls.levels[hls.loadLevel];
1806
- if ((minLevel == null ? undefined : minLevel.bitrate) < (autoLevel == null ? undefined : autoLevel.bitrate)) {
1805
+ const autoLevel = hls.loadLevelObj;
1806
+ if (autoLevel && (minLevel == null ? undefined : minLevel.bitrate) < autoLevel.bitrate) {
1807
1807
  return minAutoLevel;
1808
1808
  }
1809
1809
  // or if bitrate is not lower, continue to use loadLevel
@@ -2344,7 +2344,7 @@ class ErrorController extends Logger {
2344
2344
  case ErrorDetails.SUBTITLE_LOAD_ERROR:
2345
2345
  case ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT:
2346
2346
  if (context) {
2347
- const level = hls.levels[hls.loadLevel];
2347
+ const level = hls.loadLevelObj;
2348
2348
  if (level && (context.type === PlaylistContextType.AUDIO_TRACK && level.hasAudioGroup(context.groupId) || context.type === PlaylistContextType.SUBTITLE_TRACK && level.hasSubtitleGroup(context.groupId))) {
2349
2349
  // Perform Pathway switch or Redundant failover if possible for fastest recovery
2350
2350
  // otherwise allow playlist retry count to reach max error retries
@@ -2357,7 +2357,7 @@ class ErrorController extends Logger {
2357
2357
  return;
2358
2358
  case ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:
2359
2359
  {
2360
- const level = hls.levels[hls.loadLevel];
2360
+ const level = hls.loadLevelObj;
2361
2361
  const restrictedHdcpLevel = level == null ? undefined : level.attrs['HDCP-LEVEL'];
2362
2362
  if (restrictedHdcpLevel) {
2363
2363
  data.errorAction = {
@@ -8892,7 +8892,8 @@ class BaseStreamController extends TaskLoop {
8892
8892
  if (bufferInfo.len === 0 && bufferInfo.nextStart !== undefined) {
8893
8893
  const bufferedFragAtPos = this.fragmentTracker.getBufferedFrag(pos, type);
8894
8894
  if (bufferedFragAtPos && (bufferInfo.nextStart <= bufferedFragAtPos.end || bufferedFragAtPos.gap)) {
8895
- return BufferHelper.bufferInfo(bufferable, pos, Math.max(bufferInfo.nextStart, maxBufferHole));
8895
+ const gapDuration = Math.max(Math.min(bufferInfo.nextStart, bufferedFragAtPos.end) - pos, maxBufferHole);
8896
+ return BufferHelper.bufferInfo(bufferable, pos, gapDuration);
8896
8897
  }
8897
8898
  }
8898
8899
  return bufferInfo;
@@ -9859,7 +9860,7 @@ var eventemitter3 = {exports: {}};
9859
9860
  var eventemitter3Exports = eventemitter3.exports;
9860
9861
  var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
9861
9862
 
9862
- const version = "1.6.0-beta.2.0.canary.10925";
9863
+ const version = "1.6.0-beta.2.0.canary.10926";
9863
9864
 
9864
9865
  // ensure the worker ends up in the bundle
9865
9866
  // If the worker should not be included this gets aliased to empty.js
@@ -25047,7 +25048,7 @@ MediaSource ${JSON.stringify(attachMediaSourceData)} from ${logFromSource}`);
25047
25048
  const primary = this.hls;
25048
25049
  const userConfig = primary.userConfig;
25049
25050
  let videoPreference = userConfig.videoPreference;
25050
- const currentLevel = primary.levels[primary.loadLevel] || primary.levels[primary.currentLevel];
25051
+ const currentLevel = primary.loadLevelObj || primary.levels[primary.currentLevel];
25051
25052
  if (videoPreference || currentLevel) {
25052
25053
  videoPreference = _extends({}, videoPreference);
25053
25054
  if (currentLevel.videoCodec) {
@@ -30139,7 +30140,7 @@ class GapController extends TaskLoop {
30139
30140
  const currentTime = media.currentTime;
30140
30141
  const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);
30141
30142
  const startTime = currentTime < bufferInfo.start ? bufferInfo.start : bufferInfo.nextStart;
30142
- if (startTime) {
30143
+ if (startTime && this.hls) {
30143
30144
  const bufferStarved = bufferInfo.len <= config.maxBufferHole;
30144
30145
  const waiting = bufferInfo.len > 0 && bufferInfo.len < 1 && media.readyState < 3;
30145
30146
  const gapLength = startTime - currentTime;
@@ -30156,6 +30157,17 @@ class GapController extends TaskLoop {
30156
30157
  if (!startGap) {
30157
30158
  const startProvisioned = partial || fragmentTracker.getAppendedFrag(currentTime, PlaylistLevelType.MAIN);
30158
30159
  if (startProvisioned) {
30160
+ var _this$hls$loadLevelOb;
30161
+ // Do not seek when selected variant playlist is unloaded
30162
+ if (!((_this$hls$loadLevelOb = this.hls.loadLevelObj) != null && _this$hls$loadLevelOb.details)) {
30163
+ return 0;
30164
+ }
30165
+ // Do not seek when required fragments are inflight or appending
30166
+ const inFlightDependency = getInFlightDependency(this.hls.inFlightFragments, startTime);
30167
+ if (inFlightDependency) {
30168
+ return 0;
30169
+ }
30170
+ // Do not seek if we can't walk tracked fragments to end of gap
30159
30171
  let moreToLoad = false;
30160
30172
  let pos = startProvisioned.end;
30161
30173
  while (pos < startTime) {
@@ -30177,7 +30189,7 @@ class GapController extends TaskLoop {
30177
30189
  this.warn(`skipping hole, adjusting currentTime from ${currentTime} to ${targetTime}`);
30178
30190
  this.moved = true;
30179
30191
  media.currentTime = targetTime;
30180
- if (!(partial != null && partial.gap) && this.hls) {
30192
+ if (!(partial != null && partial.gap)) {
30181
30193
  const error = new Error(`fragment loaded with buffer holes, seeking from ${currentTime} to ${targetTime}`);
30182
30194
  this.hls.trigger(Events.ERROR, {
30183
30195
  type: ErrorTypes.MEDIA_ERROR,
@@ -31131,6 +31143,9 @@ class LevelController extends BasePlaylistController {
31131
31143
  }
31132
31144
  return this._levels;
31133
31145
  }
31146
+ get loadLevelObj() {
31147
+ return this.currentLevel;
31148
+ }
31134
31149
  get level() {
31135
31150
  return this.currentLevelIndex;
31136
31151
  }
@@ -31616,7 +31631,7 @@ class StreamController extends BaseStreamController {
31616
31631
  onTickEnd() {
31617
31632
  var _this$media2;
31618
31633
  super.onTickEnd();
31619
- if ((_this$media2 = this.media) != null && _this$media2.readyState) {
31634
+ if ((_this$media2 = this.media) != null && _this$media2.readyState && this.media.seeking === false) {
31620
31635
  this.lastCurrentTime = this.media.currentTime;
31621
31636
  }
31622
31637
  this.checkFragmentChanged();
@@ -34000,10 +34015,21 @@ class Hls {
34000
34015
  const levels = this.levelController.levels;
34001
34016
  return levels ? levels : [];
34002
34017
  }
34018
+
34019
+ /**
34020
+ * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.
34021
+ */
34003
34022
  get latestLevelDetails() {
34004
34023
  return this.streamController.getLevelDetails() || null;
34005
34024
  }
34006
34025
 
34026
+ /**
34027
+ * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.
34028
+ */
34029
+ get loadLevelObj() {
34030
+ return this.levelController.loadLevelObj;
34031
+ }
34032
+
34007
34033
  /**
34008
34034
  * Index of quality level (variant) currently played
34009
34035
  */