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.
@@ -2514,31 +2514,134 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
2514
2514
  return 0;
2515
2515
  }
2516
2516
  },
2517
+ {
2518
+ key: "describeVideoState",
2519
+ value: function describeVideoState() {
2520
+ var _networkStates_v_networkState, _readyStates_v_readyState;
2521
+ var v = this.host.video;
2522
+ var networkStates = [
2523
+ "EMPTY",
2524
+ "IDLE",
2525
+ "LOADING",
2526
+ "NO_SOURCE"
2527
+ ];
2528
+ var readyStates = [
2529
+ "HAVE_NOTHING",
2530
+ "HAVE_METADATA",
2531
+ "HAVE_CURRENT_DATA",
2532
+ "HAVE_FUTURE_DATA",
2533
+ "HAVE_ENOUGH_DATA"
2534
+ ];
2535
+ var net = (_networkStates_v_networkState = networkStates[v.networkState]) !== null && _networkStates_v_networkState !== void 0 ? _networkStates_v_networkState : String(v.networkState);
2536
+ var ready = (_readyStates_v_readyState = readyStates[v.readyState]) !== null && _readyStates_v_readyState !== void 0 ? _readyStates_v_readyState : String(v.readyState);
2537
+ var err = v.error ? "code=".concat(v.error.code).concat(v.error.message ? " (".concat(v.error.message, ")") : "") : "none";
2538
+ var ranges = [];
2539
+ for(var i = 0; i < v.buffered.length; i++){
2540
+ ranges.push("[".concat(v.buffered.start(i).toFixed(2), "–").concat(v.buffered.end(i).toFixed(2), "]"));
2541
+ }
2542
+ 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");
2543
+ }
2544
+ },
2517
2545
  {
2518
2546
  key: "monitorLiveResumeStall",
2519
2547
  value: function monitorLiveResumeStall(resumeBaseline) {
2520
2548
  var _this = this;
2521
2549
  var pollIntervalMs = 1e3;
2522
2550
  var graceMs = 5e3;
2523
- var reloadCooldownMs = 5e3;
2524
- var maxHardReloads = 2;
2525
- var maxMonitorMs = 25e3;
2551
+ var recoveryCooldownMs = 5e3;
2552
+ var maxRecoveries = 2;
2553
+ var maxMonitorMs = 3e4;
2526
2554
  var startTime = Date.now();
2527
2555
  var baseline = resumeBaseline;
2528
- var hardReloads = 0;
2529
- var lastReloadAt = 0;
2556
+ var recoveries = 0;
2557
+ var lastRecoveryAt = 0;
2558
+ var video = this.host.video;
2559
+ var listenersAttached = false;
2560
+ var onMediaEvent;
2561
+ var diagEvents = [
2562
+ "loadstart",
2563
+ "loadedmetadata",
2564
+ "loadeddata",
2565
+ "canplay",
2566
+ "canplaythrough",
2567
+ "play",
2568
+ "playing",
2569
+ "pause",
2570
+ "waiting",
2571
+ "stalled",
2572
+ "suspend",
2573
+ "seeking",
2574
+ "seeked",
2575
+ "emptied",
2576
+ "error",
2577
+ "ended"
2578
+ ];
2579
+ if (this.debug) {
2580
+ onMediaEvent = function onMediaEvent(e) {
2581
+ var dt = ((Date.now() - startTime) / 1e3).toFixed(1);
2582
+ console.log("[ResumeDiag] +".concat(dt, "s event=").concat(e.type, " — ").concat(_this.describeVideoState()));
2583
+ };
2584
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2585
+ try {
2586
+ for(var _iterator = diagEvents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2587
+ var name = _step.value;
2588
+ video.addEventListener(name, onMediaEvent);
2589
+ }
2590
+ } catch (err) {
2591
+ _didIteratorError = true;
2592
+ _iteratorError = err;
2593
+ } finally{
2594
+ try {
2595
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2596
+ _iterator.return();
2597
+ }
2598
+ } finally{
2599
+ if (_didIteratorError) {
2600
+ throw _iteratorError;
2601
+ }
2602
+ }
2603
+ }
2604
+ listenersAttached = true;
2605
+ console.log("[ResumeDiag] +0.0s monitor start — ".concat(this.describeVideoState()));
2606
+ }
2607
+ var cleanup = function cleanup() {
2608
+ if (listenersAttached && onMediaEvent) {
2609
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2610
+ try {
2611
+ for(var _iterator = diagEvents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2612
+ var name = _step.value;
2613
+ video.removeEventListener(name, onMediaEvent);
2614
+ }
2615
+ } catch (err) {
2616
+ _didIteratorError = true;
2617
+ _iteratorError = err;
2618
+ } finally{
2619
+ try {
2620
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2621
+ _iterator.return();
2622
+ }
2623
+ } finally{
2624
+ if (_didIteratorError) {
2625
+ throw _iteratorError;
2626
+ }
2627
+ }
2628
+ }
2629
+ listenersAttached = false;
2630
+ }
2631
+ };
2530
2632
  var poll = function poll1() {
2531
2633
  if (_this.inAdBreak) {
2634
+ cleanup();
2532
2635
  return;
2533
2636
  }
2534
- var video = _this.host.video;
2535
2637
  var currentTime = video.currentTime;
2536
2638
  var advanced = currentTime > baseline + 0.5;
2537
2639
  var playing = !video.paused && video.readyState >= 3;
2538
2640
  if (advanced && playing) {
2539
2641
  if (_this.debug) {
2540
- console.log("[StormcloudVideoPlayer] Live stream resumed successfully after ad break");
2642
+ console.log("[StormcloudVideoPlayer] Live stream resumed successfully after ad break".concat(_this.describeVideoState()));
2541
2643
  }
2644
+ cleanup();
2542
2645
  return;
2543
2646
  }
2544
2647
  if (video.paused) {
@@ -2550,23 +2653,32 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
2550
2653
  var wedged = bufferedAhead < 0.5 && !advanced;
2551
2654
  if (elapsed >= maxMonitorMs) {
2552
2655
  if (_this.debug && !advanced) {
2553
- 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)"));
2656
+ console.warn("[StormcloudVideoPlayer] Live stream failed to resume after ".concat((maxMonitorMs / 1e3).toFixed(0), "s ").concat(_this.describeVideoState()));
2554
2657
  }
2658
+ cleanup();
2555
2659
  return;
2556
2660
  }
2557
- var canHardReload = wedged && elapsed >= graceMs && Date.now() - lastReloadAt >= reloadCooldownMs && hardReloads < maxHardReloads;
2558
- if (canHardReload) {
2559
- hardReloads++;
2560
- lastReloadAt = Date.now();
2561
- var liveSyncPos = _this.host.getLiveSyncPosition();
2562
- var reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;
2563
- if (_this.debug) {
2564
- 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, ")"));
2565
- }
2566
- if (liveSyncPos != null && liveSyncPos > currentTime) {
2567
- video.currentTime = liveSyncPos;
2661
+ var canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;
2662
+ if (canRecover) {
2663
+ recoveries++;
2664
+ lastRecoveryAt = Date.now();
2665
+ var isFinalAttempt = recoveries >= maxRecoveries;
2666
+ if (!isFinalAttempt) {
2667
+ var liveSyncPos = _this.host.getLiveSyncPosition();
2668
+ var reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;
2669
+ if (_this.debug) {
2670
+ 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()));
2671
+ }
2672
+ if (liveSyncPos != null && liveSyncPos > currentTime) {
2673
+ video.currentTime = liveSyncPos;
2674
+ }
2675
+ _this.host.restartHlsLoad(reloadPos);
2676
+ } else {
2677
+ if (_this.debug) {
2678
+ console.warn("[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
2679
+ }
2680
+ _this.host.reloadLiveStream();
2568
2681
  }
2569
- _this.host.restartHlsLoad(reloadPos);
2570
2682
  baseline = video.currentTime;
2571
2683
  if (video.paused) {
2572
2684
  var _video_play1;