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.
- package/dist/stormcloud-vp.min.js +1 -1
- package/lib/index.cjs +172 -20
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +172 -20
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +132 -20
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +3 -1
- package/lib/player/AdConfigManager.d.cts +1 -1
- package/lib/player/AdTimingService.d.cts +1 -1
- package/lib/player/HlsEngine.cjs +29 -0
- package/lib/player/HlsEngine.cjs.map +1 -1
- package/lib/player/HlsEngine.d.cts +3 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +172 -20
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/HlsPlayer.cjs +172 -20
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +172 -20
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/types-iDjS8f_7.d.cts +133 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +172 -20
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Component } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { S as StormcloudVideoPlayerConfig } from '../types-iDjS8f_7.cjs';
|
|
3
3
|
|
|
4
4
|
interface HlsPlayerProps extends StormcloudVideoPlayerConfig {
|
|
5
5
|
onMount?: (player: any) => void;
|
package/lib/players/index.cjs
CHANGED
|
@@ -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
|
|
8114
|
-
var
|
|
8115
|
-
var maxMonitorMs =
|
|
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
|
|
8119
|
-
var
|
|
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
|
|
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
|
|
8148
|
-
if (
|
|
8149
|
-
|
|
8150
|
-
|
|
8151
|
-
var
|
|
8152
|
-
|
|
8153
|
-
|
|
8154
|
-
|
|
8155
|
-
|
|
8156
|
-
|
|
8157
|
-
|
|
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)) {
|