stormcloud-video-player 0.8.42 → 0.8.44

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.
@@ -1,4 +1,4 @@
1
- import { a as StormcloudVideoPlayerConfig } from '../types-cTqIKw_D.cjs';
1
+ import { S as StormcloudVideoPlayerConfig } from '../types-iDjS8f_7.cjs';
2
2
 
3
3
  declare class StormcloudVideoPlayer {
4
4
  private readonly video;
@@ -1,4 +1,4 @@
1
- import { S as Scte35Marker } from '../types-cTqIKw_D.cjs';
1
+ import { a as Scte35Marker } from '../types-iDjS8f_7.cjs';
2
2
 
3
3
  type Scte35CueSource = "manifest" | "id3" | "ts";
4
4
  type Scte35CueReadiness = "early" | "playback";
@@ -6252,6 +6252,7 @@ var HlsEngine = /*#__PURE__*/ function() {
6252
6252
  this.isLiveStream = false;
6253
6253
  this.nativeHlsMode = false;
6254
6254
  this.videoSrcProtection = null;
6255
+ this.reloadingLiveStream = false;
6255
6256
  this.bufferedSegmentsCount = 0;
6256
6257
  this.shouldAutoplayAfterBuffering = false;
6257
6258
  this.hasInitialBufferCompleted = false;
@@ -6385,6 +6386,7 @@ var HlsEngine = /*#__PURE__*/ function() {
6385
6386
  _state.sent();
6386
6387
  _state.label = 3;
6387
6388
  case 3:
6389
+ this.reloadingLiveStream = false;
6388
6390
  return [
6389
6391
  2
6390
6392
  ];
@@ -6729,6 +6731,33 @@ var HlsEngine = /*#__PURE__*/ function() {
6729
6731
  }
6730
6732
  }
6731
6733
  },
6734
+ {
6735
+ key: "reloadLiveStream",
6736
+ value: function reloadLiveStream() {
6737
+ var hls = this.hls;
6738
+ if (!hls) {
6739
+ return;
6740
+ }
6741
+ if (this.debug) {
6742
+ console.log("[StormcloudVideoPlayer] Hard-reloading live stream (detach \u2192 reset video \u2192 re-attach)");
6743
+ }
6744
+ try {
6745
+ this.reloadingLiveStream = true;
6746
+ hls.stopLoad();
6747
+ hls.detachMedia();
6748
+ try {
6749
+ this.video.removeAttribute("src");
6750
+ this.video.load();
6751
+ } catch (unused) {}
6752
+ hls.attachMedia(this.video);
6753
+ } catch (error) {
6754
+ this.reloadingLiveStream = false;
6755
+ if (this.debug) {
6756
+ console.warn("[StormcloudVideoPlayer] Failed to hard-reload live stream:", error);
6757
+ }
6758
+ }
6759
+ }
6760
+ },
6732
6761
  {
6733
6762
  key: "destroy",
6734
6763
  value: function destroy() {
@@ -8068,31 +8097,134 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
8068
8097
  return 0;
8069
8098
  }
8070
8099
  },
8100
+ {
8101
+ key: "describeVideoState",
8102
+ value: function describeVideoState() {
8103
+ var _networkStates_v_networkState, _readyStates_v_readyState;
8104
+ var v = this.host.video;
8105
+ var networkStates = [
8106
+ "EMPTY",
8107
+ "IDLE",
8108
+ "LOADING",
8109
+ "NO_SOURCE"
8110
+ ];
8111
+ var readyStates = [
8112
+ "HAVE_NOTHING",
8113
+ "HAVE_METADATA",
8114
+ "HAVE_CURRENT_DATA",
8115
+ "HAVE_FUTURE_DATA",
8116
+ "HAVE_ENOUGH_DATA"
8117
+ ];
8118
+ var net = (_networkStates_v_networkState = networkStates[v.networkState]) !== null && _networkStates_v_networkState !== void 0 ? _networkStates_v_networkState : String(v.networkState);
8119
+ var ready = (_readyStates_v_readyState = readyStates[v.readyState]) !== null && _readyStates_v_readyState !== void 0 ? _readyStates_v_readyState : String(v.readyState);
8120
+ var err = v.error ? "code=".concat(v.error.code).concat(v.error.message ? " (".concat(v.error.message, ")") : "") : "none";
8121
+ var ranges = [];
8122
+ for(var i = 0; i < v.buffered.length; i++){
8123
+ ranges.push("[".concat(v.buffered.start(i).toFixed(2), "–").concat(v.buffered.end(i).toFixed(2), "]"));
8124
+ }
8125
+ return "t=".concat(v.currentTime.toFixed(2), "s paused=").concat(v.paused, " ended=").concat(v.ended, " seeking=").concat(v.seeking, " readyState=").concat(ready, " networkState=").concat(net, " error=").concat(err, " buffered=").concat(ranges.length ? ranges.join(",") : "none");
8126
+ }
8127
+ },
8071
8128
  {
8072
8129
  key: "monitorLiveResumeStall",
8073
8130
  value: function monitorLiveResumeStall(resumeBaseline) {
8074
8131
  var _this = this;
8075
8132
  var pollIntervalMs = 1e3;
8076
8133
  var graceMs = 5e3;
8077
- var reloadCooldownMs = 5e3;
8078
- var maxHardReloads = 2;
8079
- var maxMonitorMs = 25e3;
8134
+ var recoveryCooldownMs = 5e3;
8135
+ var maxRecoveries = 2;
8136
+ var maxMonitorMs = 3e4;
8080
8137
  var startTime = Date.now();
8081
8138
  var baseline = resumeBaseline;
8082
- var hardReloads = 0;
8083
- var lastReloadAt = 0;
8139
+ var recoveries = 0;
8140
+ var lastRecoveryAt = 0;
8141
+ var video = this.host.video;
8142
+ var listenersAttached = false;
8143
+ var onMediaEvent;
8144
+ var diagEvents = [
8145
+ "loadstart",
8146
+ "loadedmetadata",
8147
+ "loadeddata",
8148
+ "canplay",
8149
+ "canplaythrough",
8150
+ "play",
8151
+ "playing",
8152
+ "pause",
8153
+ "waiting",
8154
+ "stalled",
8155
+ "suspend",
8156
+ "seeking",
8157
+ "seeked",
8158
+ "emptied",
8159
+ "error",
8160
+ "ended"
8161
+ ];
8162
+ if (this.debug) {
8163
+ onMediaEvent = function onMediaEvent(e) {
8164
+ var dt = ((Date.now() - startTime) / 1e3).toFixed(1);
8165
+ console.log("[ResumeDiag] +".concat(dt, "s event=").concat(e.type, " — ").concat(_this.describeVideoState()));
8166
+ };
8167
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
8168
+ try {
8169
+ for(var _iterator = diagEvents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
8170
+ var name = _step.value;
8171
+ video.addEventListener(name, onMediaEvent);
8172
+ }
8173
+ } catch (err) {
8174
+ _didIteratorError = true;
8175
+ _iteratorError = err;
8176
+ } finally{
8177
+ try {
8178
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
8179
+ _iterator.return();
8180
+ }
8181
+ } finally{
8182
+ if (_didIteratorError) {
8183
+ throw _iteratorError;
8184
+ }
8185
+ }
8186
+ }
8187
+ listenersAttached = true;
8188
+ console.log("[ResumeDiag] +0.0s monitor start — ".concat(this.describeVideoState()));
8189
+ }
8190
+ var cleanup = function cleanup() {
8191
+ if (listenersAttached && onMediaEvent) {
8192
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
8193
+ try {
8194
+ for(var _iterator = diagEvents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
8195
+ var name = _step.value;
8196
+ video.removeEventListener(name, onMediaEvent);
8197
+ }
8198
+ } catch (err) {
8199
+ _didIteratorError = true;
8200
+ _iteratorError = err;
8201
+ } finally{
8202
+ try {
8203
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
8204
+ _iterator.return();
8205
+ }
8206
+ } finally{
8207
+ if (_didIteratorError) {
8208
+ throw _iteratorError;
8209
+ }
8210
+ }
8211
+ }
8212
+ listenersAttached = false;
8213
+ }
8214
+ };
8084
8215
  var poll = function poll1() {
8085
8216
  if (_this.inAdBreak) {
8217
+ cleanup();
8086
8218
  return;
8087
8219
  }
8088
- var video = _this.host.video;
8089
8220
  var currentTime = video.currentTime;
8090
8221
  var advanced = currentTime > baseline + 0.5;
8091
8222
  var playing = !video.paused && video.readyState >= 3;
8092
8223
  if (advanced && playing) {
8093
8224
  if (_this.debug) {
8094
- console.log("[StormcloudVideoPlayer] Live stream resumed successfully after ad break");
8225
+ console.log("[StormcloudVideoPlayer] Live stream resumed successfully after ad break".concat(_this.describeVideoState()));
8095
8226
  }
8227
+ cleanup();
8096
8228
  return;
8097
8229
  }
8098
8230
  if (video.paused) {
@@ -8104,23 +8236,32 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
8104
8236
  var wedged = bufferedAhead < 0.5 && !advanced;
8105
8237
  if (elapsed >= maxMonitorMs) {
8106
8238
  if (_this.debug && !advanced) {
8107
- console.warn("[StormcloudVideoPlayer] Live stream failed to resume after ".concat((maxMonitorMs / 1e3).toFixed(0), "s (t=").concat(currentTime.toFixed(2), "s, buffered=").concat(bufferedAhead.toFixed(2), "s)"));
8239
+ console.warn("[StormcloudVideoPlayer] Live stream failed to resume after ".concat((maxMonitorMs / 1e3).toFixed(0), "s ").concat(_this.describeVideoState()));
8108
8240
  }
8241
+ cleanup();
8109
8242
  return;
8110
8243
  }
8111
- var canHardReload = wedged && elapsed >= graceMs && Date.now() - lastReloadAt >= reloadCooldownMs && hardReloads < maxHardReloads;
8112
- if (canHardReload) {
8113
- hardReloads++;
8114
- lastReloadAt = Date.now();
8115
- var liveSyncPos = _this.host.getLiveSyncPosition();
8116
- var reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;
8117
- if (_this.debug) {
8118
- console.warn("[StormcloudVideoPlayer] Content wedged after ad break (t=".concat(currentTime.toFixed(2), "s, buffered=").concat(bufferedAhead.toFixed(2), "s) forcing HLS reload at ").concat(reloadPos.toFixed(2), "s (hard reload ").concat(hardReloads, "/").concat(maxHardReloads, ")"));
8119
- }
8120
- if (liveSyncPos != null && liveSyncPos > currentTime) {
8121
- video.currentTime = liveSyncPos;
8244
+ var canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;
8245
+ if (canRecover) {
8246
+ recoveries++;
8247
+ lastRecoveryAt = Date.now();
8248
+ var isFinalAttempt = recoveries >= maxRecoveries;
8249
+ if (!isFinalAttempt) {
8250
+ var liveSyncPos = _this.host.getLiveSyncPosition();
8251
+ var reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;
8252
+ if (_this.debug) {
8253
+ console.warn("[StormcloudVideoPlayer] Content wedged after ad break — restarting HLS load at ".concat(reloadPos.toFixed(2), "s (recovery ").concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
8254
+ }
8255
+ if (liveSyncPos != null && liveSyncPos > currentTime) {
8256
+ video.currentTime = liveSyncPos;
8257
+ }
8258
+ _this.host.restartHlsLoad(reloadPos);
8259
+ } else {
8260
+ if (_this.debug) {
8261
+ console.warn("[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
8262
+ }
8263
+ _this.host.reloadLiveStream();
8122
8264
  }
8123
- _this.host.restartHlsLoad(reloadPos);
8124
8265
  baseline = video.currentTime;
8125
8266
  if (video.paused) {
8126
8267
  var _video_play1;
@@ -8283,6 +8424,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
8283
8424
  restartHlsLoad: function restartHlsLoad(position) {
8284
8425
  return _this.hlsEngine.restartLoadAt(position);
8285
8426
  },
8427
+ reloadLiveStream: function reloadLiveStream() {
8428
+ return _this.hlsEngine.reloadLiveStream();
8429
+ },
8286
8430
  generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
8287
8431
  return _this.generatePodVastUrl(base, breakDurationMs);
8288
8432
  }
@@ -8414,6 +8558,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
8414
8558
  return _async_to_generator(function() {
8415
8559
  var prerollKey, adBehavior;
8416
8560
  return _ts_generator(this, function(_state) {
8561
+ if (this.hlsEngine.reloadingLiveStream) {
8562
+ if (this.debug) {
8563
+ console.log("[StormcloudVideoPlayer] Manifest re-parsed after hard reload \u2014 skipping ad-player setup");
8564
+ }
8565
+ return [
8566
+ 2
8567
+ ];
8568
+ }
8417
8569
  if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {
8418
8570
  prerollKey = "synthetic-vod-preroll";
8419
8571
  if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {