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
|
@@ -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
|
|
8078
|
-
var
|
|
8079
|
-
var maxMonitorMs =
|
|
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
|
|
8083
|
-
var
|
|
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
|
|
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
|
|
8112
|
-
if (
|
|
8113
|
-
|
|
8114
|
-
|
|
8115
|
-
var
|
|
8116
|
-
|
|
8117
|
-
|
|
8118
|
-
|
|
8119
|
-
|
|
8120
|
-
|
|
8121
|
-
|
|
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)) {
|