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,5 +1,5 @@
1
1
  import { Component } from 'react';
2
- import { a as StormcloudVideoPlayerConfig } from '../types-cTqIKw_D.cjs';
2
+ import { S as StormcloudVideoPlayerConfig } from '../types-iDjS8f_7.cjs';
3
3
 
4
4
  interface HlsPlayerProps extends StormcloudVideoPlayerConfig {
5
5
  onMount?: (player: any) => void;
@@ -6288,6 +6288,7 @@ var HlsEngine = /*#__PURE__*/ function() {
6288
6288
  this.isLiveStream = false;
6289
6289
  this.nativeHlsMode = false;
6290
6290
  this.videoSrcProtection = null;
6291
+ this.reloadingLiveStream = false;
6291
6292
  this.bufferedSegmentsCount = 0;
6292
6293
  this.shouldAutoplayAfterBuffering = false;
6293
6294
  this.hasInitialBufferCompleted = false;
@@ -6421,6 +6422,7 @@ var HlsEngine = /*#__PURE__*/ function() {
6421
6422
  _state.sent();
6422
6423
  _state.label = 3;
6423
6424
  case 3:
6425
+ this.reloadingLiveStream = false;
6424
6426
  return [
6425
6427
  2
6426
6428
  ];
@@ -6765,6 +6767,33 @@ var HlsEngine = /*#__PURE__*/ function() {
6765
6767
  }
6766
6768
  }
6767
6769
  },
6770
+ {
6771
+ key: "reloadLiveStream",
6772
+ value: function reloadLiveStream() {
6773
+ var hls = this.hls;
6774
+ if (!hls) {
6775
+ return;
6776
+ }
6777
+ if (this.debug) {
6778
+ console.log("[StormcloudVideoPlayer] Hard-reloading live stream (detach \u2192 reset video \u2192 re-attach)");
6779
+ }
6780
+ try {
6781
+ this.reloadingLiveStream = true;
6782
+ hls.stopLoad();
6783
+ hls.detachMedia();
6784
+ try {
6785
+ this.video.removeAttribute("src");
6786
+ this.video.load();
6787
+ } catch (unused) {}
6788
+ hls.attachMedia(this.video);
6789
+ } catch (error) {
6790
+ this.reloadingLiveStream = false;
6791
+ if (this.debug) {
6792
+ console.warn("[StormcloudVideoPlayer] Failed to hard-reload live stream:", error);
6793
+ }
6794
+ }
6795
+ }
6796
+ },
6768
6797
  {
6769
6798
  key: "destroy",
6770
6799
  value: function destroy() {
@@ -8104,31 +8133,134 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
8104
8133
  return 0;
8105
8134
  }
8106
8135
  },
8136
+ {
8137
+ key: "describeVideoState",
8138
+ value: function describeVideoState() {
8139
+ var _networkStates_v_networkState, _readyStates_v_readyState;
8140
+ var v = this.host.video;
8141
+ var networkStates = [
8142
+ "EMPTY",
8143
+ "IDLE",
8144
+ "LOADING",
8145
+ "NO_SOURCE"
8146
+ ];
8147
+ var readyStates = [
8148
+ "HAVE_NOTHING",
8149
+ "HAVE_METADATA",
8150
+ "HAVE_CURRENT_DATA",
8151
+ "HAVE_FUTURE_DATA",
8152
+ "HAVE_ENOUGH_DATA"
8153
+ ];
8154
+ var net = (_networkStates_v_networkState = networkStates[v.networkState]) !== null && _networkStates_v_networkState !== void 0 ? _networkStates_v_networkState : String(v.networkState);
8155
+ var ready = (_readyStates_v_readyState = readyStates[v.readyState]) !== null && _readyStates_v_readyState !== void 0 ? _readyStates_v_readyState : String(v.readyState);
8156
+ var err = v.error ? "code=".concat(v.error.code).concat(v.error.message ? " (".concat(v.error.message, ")") : "") : "none";
8157
+ var ranges = [];
8158
+ for(var i = 0; i < v.buffered.length; i++){
8159
+ ranges.push("[".concat(v.buffered.start(i).toFixed(2), "–").concat(v.buffered.end(i).toFixed(2), "]"));
8160
+ }
8161
+ 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");
8162
+ }
8163
+ },
8107
8164
  {
8108
8165
  key: "monitorLiveResumeStall",
8109
8166
  value: function monitorLiveResumeStall(resumeBaseline) {
8110
8167
  var _this = this;
8111
8168
  var pollIntervalMs = 1e3;
8112
8169
  var graceMs = 5e3;
8113
- var reloadCooldownMs = 5e3;
8114
- var maxHardReloads = 2;
8115
- var maxMonitorMs = 25e3;
8170
+ var recoveryCooldownMs = 5e3;
8171
+ var maxRecoveries = 2;
8172
+ var maxMonitorMs = 3e4;
8116
8173
  var startTime = Date.now();
8117
8174
  var baseline = resumeBaseline;
8118
- var hardReloads = 0;
8119
- var lastReloadAt = 0;
8175
+ var recoveries = 0;
8176
+ var lastRecoveryAt = 0;
8177
+ var video = this.host.video;
8178
+ var listenersAttached = false;
8179
+ var onMediaEvent;
8180
+ var diagEvents = [
8181
+ "loadstart",
8182
+ "loadedmetadata",
8183
+ "loadeddata",
8184
+ "canplay",
8185
+ "canplaythrough",
8186
+ "play",
8187
+ "playing",
8188
+ "pause",
8189
+ "waiting",
8190
+ "stalled",
8191
+ "suspend",
8192
+ "seeking",
8193
+ "seeked",
8194
+ "emptied",
8195
+ "error",
8196
+ "ended"
8197
+ ];
8198
+ if (this.debug) {
8199
+ onMediaEvent = function onMediaEvent(e) {
8200
+ var dt = ((Date.now() - startTime) / 1e3).toFixed(1);
8201
+ console.log("[ResumeDiag] +".concat(dt, "s event=").concat(e.type, " — ").concat(_this.describeVideoState()));
8202
+ };
8203
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
8204
+ try {
8205
+ for(var _iterator = diagEvents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
8206
+ var name = _step.value;
8207
+ video.addEventListener(name, onMediaEvent);
8208
+ }
8209
+ } catch (err) {
8210
+ _didIteratorError = true;
8211
+ _iteratorError = err;
8212
+ } finally{
8213
+ try {
8214
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
8215
+ _iterator.return();
8216
+ }
8217
+ } finally{
8218
+ if (_didIteratorError) {
8219
+ throw _iteratorError;
8220
+ }
8221
+ }
8222
+ }
8223
+ listenersAttached = true;
8224
+ console.log("[ResumeDiag] +0.0s monitor start — ".concat(this.describeVideoState()));
8225
+ }
8226
+ var cleanup = function cleanup() {
8227
+ if (listenersAttached && onMediaEvent) {
8228
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
8229
+ try {
8230
+ for(var _iterator = diagEvents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
8231
+ var name = _step.value;
8232
+ video.removeEventListener(name, onMediaEvent);
8233
+ }
8234
+ } catch (err) {
8235
+ _didIteratorError = true;
8236
+ _iteratorError = err;
8237
+ } finally{
8238
+ try {
8239
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
8240
+ _iterator.return();
8241
+ }
8242
+ } finally{
8243
+ if (_didIteratorError) {
8244
+ throw _iteratorError;
8245
+ }
8246
+ }
8247
+ }
8248
+ listenersAttached = false;
8249
+ }
8250
+ };
8120
8251
  var poll = function poll1() {
8121
8252
  if (_this.inAdBreak) {
8253
+ cleanup();
8122
8254
  return;
8123
8255
  }
8124
- var video = _this.host.video;
8125
8256
  var currentTime = video.currentTime;
8126
8257
  var advanced = currentTime > baseline + 0.5;
8127
8258
  var playing = !video.paused && video.readyState >= 3;
8128
8259
  if (advanced && playing) {
8129
8260
  if (_this.debug) {
8130
- console.log("[StormcloudVideoPlayer] Live stream resumed successfully after ad break");
8261
+ console.log("[StormcloudVideoPlayer] Live stream resumed successfully after ad break".concat(_this.describeVideoState()));
8131
8262
  }
8263
+ cleanup();
8132
8264
  return;
8133
8265
  }
8134
8266
  if (video.paused) {
@@ -8140,23 +8272,32 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
8140
8272
  var wedged = bufferedAhead < 0.5 && !advanced;
8141
8273
  if (elapsed >= maxMonitorMs) {
8142
8274
  if (_this.debug && !advanced) {
8143
- 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)"));
8275
+ console.warn("[StormcloudVideoPlayer] Live stream failed to resume after ".concat((maxMonitorMs / 1e3).toFixed(0), "s ").concat(_this.describeVideoState()));
8144
8276
  }
8277
+ cleanup();
8145
8278
  return;
8146
8279
  }
8147
- var canHardReload = wedged && elapsed >= graceMs && Date.now() - lastReloadAt >= reloadCooldownMs && hardReloads < maxHardReloads;
8148
- if (canHardReload) {
8149
- hardReloads++;
8150
- lastReloadAt = Date.now();
8151
- var liveSyncPos = _this.host.getLiveSyncPosition();
8152
- var reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;
8153
- if (_this.debug) {
8154
- 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, ")"));
8155
- }
8156
- if (liveSyncPos != null && liveSyncPos > currentTime) {
8157
- video.currentTime = liveSyncPos;
8280
+ var canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;
8281
+ if (canRecover) {
8282
+ recoveries++;
8283
+ lastRecoveryAt = Date.now();
8284
+ var isFinalAttempt = recoveries >= maxRecoveries;
8285
+ if (!isFinalAttempt) {
8286
+ var liveSyncPos = _this.host.getLiveSyncPosition();
8287
+ var reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;
8288
+ if (_this.debug) {
8289
+ 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()));
8290
+ }
8291
+ if (liveSyncPos != null && liveSyncPos > currentTime) {
8292
+ video.currentTime = liveSyncPos;
8293
+ }
8294
+ _this.host.restartHlsLoad(reloadPos);
8295
+ } else {
8296
+ if (_this.debug) {
8297
+ console.warn("[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
8298
+ }
8299
+ _this.host.reloadLiveStream();
8158
8300
  }
8159
- _this.host.restartHlsLoad(reloadPos);
8160
8301
  baseline = video.currentTime;
8161
8302
  if (video.paused) {
8162
8303
  var _video_play1;
@@ -8319,6 +8460,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
8319
8460
  restartHlsLoad: function restartHlsLoad(position) {
8320
8461
  return _this.hlsEngine.restartLoadAt(position);
8321
8462
  },
8463
+ reloadLiveStream: function reloadLiveStream() {
8464
+ return _this.hlsEngine.reloadLiveStream();
8465
+ },
8322
8466
  generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
8323
8467
  return _this.generatePodVastUrl(base, breakDurationMs);
8324
8468
  }
@@ -8450,6 +8594,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
8450
8594
  return _async_to_generator(function() {
8451
8595
  var prerollKey, adBehavior;
8452
8596
  return _ts_generator(this, function(_state) {
8597
+ if (this.hlsEngine.reloadingLiveStream) {
8598
+ if (this.debug) {
8599
+ console.log("[StormcloudVideoPlayer] Manifest re-parsed after hard reload \u2014 skipping ad-player setup");
8600
+ }
8601
+ return [
8602
+ 2
8603
+ ];
8604
+ }
8453
8605
  if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {
8454
8606
  prerollKey = "synthetic-vod-preroll";
8455
8607
  if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {