stormcloud-video-player 0.8.46 → 0.8.48
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 +209 -88
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +2 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +206 -89
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +17 -3
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +1 -0
- package/lib/player/HlsEngine.cjs +22 -3
- package/lib/player/HlsEngine.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +205 -88
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.cjs +205 -88
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/index.cjs +205 -88
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +158 -82
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +205 -88
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/utils/browserCompat.cjs +9 -0
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/browserCompat.d.cts +2 -1
- package/package.json +1 -1
package/lib/players/index.cjs
CHANGED
|
@@ -438,15 +438,19 @@ var import_react2 = require("react");
|
|
|
438
438
|
var import_hls = __toESM(require("hls.js"), 1);
|
|
439
439
|
var MAX_VAST_WRAPPER_DEPTH = 5;
|
|
440
440
|
function createHlsAdPlayer(contentVideo, options) {
|
|
441
|
+
var _contentVideo_AD_VIDEO_PROP, _contentVideo_AD_CONTAINER_PROP;
|
|
441
442
|
var adPlaying = false;
|
|
442
443
|
var originalMutedState = false;
|
|
443
444
|
var originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));
|
|
444
445
|
var listeners = /* @__PURE__ */ new Map();
|
|
445
446
|
var licenseKey = options === null || options === void 0 ? void 0 : options.licenseKey;
|
|
446
447
|
var mainHlsInstance = options === null || options === void 0 ? void 0 : options.mainHlsInstance;
|
|
447
|
-
var
|
|
448
|
+
var AD_CONTAINER_PROP = "__stormcloudAdContainer";
|
|
449
|
+
var AD_VIDEO_PROP = "__stormcloudAdVideo";
|
|
450
|
+
var adVideoElement = (_contentVideo_AD_VIDEO_PROP = contentVideo[AD_VIDEO_PROP]) !== null && _contentVideo_AD_VIDEO_PROP !== void 0 ? _contentVideo_AD_VIDEO_PROP : void 0;
|
|
448
451
|
var adHls;
|
|
449
|
-
var adContainerEl;
|
|
452
|
+
var adContainerEl = (_contentVideo_AD_CONTAINER_PROP = contentVideo[AD_CONTAINER_PROP]) !== null && _contentVideo_AD_CONTAINER_PROP !== void 0 ? _contentVideo_AD_CONTAINER_PROP : void 0;
|
|
453
|
+
var adEventHandlers = [];
|
|
450
454
|
var currentAd;
|
|
451
455
|
var podAds = [];
|
|
452
456
|
var podIndex = 0;
|
|
@@ -601,6 +605,56 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
601
605
|
var url = mediaFile.url.toLowerCase();
|
|
602
606
|
return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
|
|
603
607
|
}
|
|
608
|
+
function isAudioMediaFile(mediaFile) {
|
|
609
|
+
var type = mediaFile.type.toLowerCase();
|
|
610
|
+
var url = (mediaFile.url.toLowerCase().split("?")[0] || "").trim();
|
|
611
|
+
return type.startsWith("audio/") || url.endsWith(".mp3") || url.endsWith(".aac") || url.endsWith(".m4a") || url.endsWith(".ogg") || url.endsWith(".oga") || url.endsWith(".opus") || url.endsWith(".wav") || url.endsWith(".weba");
|
|
612
|
+
}
|
|
613
|
+
function collectVideoMediaFiles(scope, verbose) {
|
|
614
|
+
var mediaFileElements = scope.querySelectorAll("MediaFile");
|
|
615
|
+
var mediaFiles = [];
|
|
616
|
+
if (verbose) {
|
|
617
|
+
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
618
|
+
}
|
|
619
|
+
mediaFileElements.forEach(function(mf, index) {
|
|
620
|
+
var _mf_textContent;
|
|
621
|
+
var type = mf.getAttribute("type") || "";
|
|
622
|
+
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
623
|
+
var width = mf.getAttribute("width") || "";
|
|
624
|
+
var height = mf.getAttribute("height") || "";
|
|
625
|
+
if (verbose) {
|
|
626
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
627
|
+
}
|
|
628
|
+
if (!url) {
|
|
629
|
+
if (verbose) {
|
|
630
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
631
|
+
}
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
var bitrateAttr = mf.getAttribute("bitrate");
|
|
635
|
+
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
636
|
+
var mediaFile = {
|
|
637
|
+
url: url,
|
|
638
|
+
type: type,
|
|
639
|
+
width: parseInt(width || "1920", 10),
|
|
640
|
+
height: parseInt(height || "1080", 10),
|
|
641
|
+
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
642
|
+
};
|
|
643
|
+
if (isAudioMediaFile(mediaFile)) {
|
|
644
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, ' skipped (audio-only, type="').concat(type, '") — audio ads are not played to avoid a black screen'));
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
648
|
+
mediaFiles.push(mediaFile);
|
|
649
|
+
if (verbose) {
|
|
650
|
+
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
651
|
+
}
|
|
652
|
+
} else if (verbose) {
|
|
653
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
return mediaFiles;
|
|
657
|
+
}
|
|
604
658
|
function createEmptyTrackingUrls() {
|
|
605
659
|
return {
|
|
606
660
|
impression: [],
|
|
@@ -688,37 +742,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
688
742
|
var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
|
|
689
743
|
var durationParts = durationText.split(":");
|
|
690
744
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
691
|
-
var
|
|
692
|
-
var mediaFiles = [];
|
|
693
|
-
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
694
|
-
mediaFileElements.forEach(function(mf, index) {
|
|
695
|
-
var _mf_textContent;
|
|
696
|
-
var type = mf.getAttribute("type") || "";
|
|
697
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
698
|
-
var width = mf.getAttribute("width") || "";
|
|
699
|
-
var height = mf.getAttribute("height") || "";
|
|
700
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
701
|
-
var mediaFile = {
|
|
702
|
-
url: url,
|
|
703
|
-
type: type,
|
|
704
|
-
width: parseInt(width || "1920", 10),
|
|
705
|
-
height: parseInt(height || "1080", 10),
|
|
706
|
-
bitrate: void 0
|
|
707
|
-
};
|
|
708
|
-
if (!url) {
|
|
709
|
-
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
710
|
-
return;
|
|
711
|
-
}
|
|
712
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
713
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
714
|
-
mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;
|
|
715
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
716
|
-
mediaFiles.push(mediaFile);
|
|
717
|
-
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
718
|
-
} else {
|
|
719
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
720
|
-
}
|
|
721
|
-
});
|
|
745
|
+
var mediaFiles = collectVideoMediaFiles(xmlDoc, true);
|
|
722
746
|
if (mediaFiles.length === 0) {
|
|
723
747
|
if (isNoAdAvailable) {
|
|
724
748
|
console.warn("[HlsAdPlayer] No ads available (VAST response indicates no ads)");
|
|
@@ -766,28 +790,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
766
790
|
var durationText = ((_adElement_querySelector3 = adElement.querySelector("Duration")) === null || _adElement_querySelector3 === void 0 ? void 0 : _adElement_querySelector3.textContent) || "00:00:30";
|
|
767
791
|
var durationParts = durationText.split(":");
|
|
768
792
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
769
|
-
var
|
|
770
|
-
var mediaFiles = [];
|
|
771
|
-
mediaFileElements.forEach(function(mf) {
|
|
772
|
-
var _mf_textContent;
|
|
773
|
-
var type = mf.getAttribute("type") || "";
|
|
774
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
775
|
-
var width = mf.getAttribute("width") || "";
|
|
776
|
-
var height = mf.getAttribute("height") || "";
|
|
777
|
-
if (!url) return;
|
|
778
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
779
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
780
|
-
var mediaFile = {
|
|
781
|
-
url: url,
|
|
782
|
-
type: type,
|
|
783
|
-
width: parseInt(width || "1920", 10),
|
|
784
|
-
height: parseInt(height || "1080", 10),
|
|
785
|
-
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
786
|
-
};
|
|
787
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
788
|
-
mediaFiles.push(mediaFile);
|
|
789
|
-
}
|
|
790
|
-
});
|
|
793
|
+
var mediaFiles = collectVideoMediaFiles(adElement, false);
|
|
791
794
|
if (mediaFiles.length === 0) {
|
|
792
795
|
if (isNoAdAvailable) {
|
|
793
796
|
console.warn("[HlsAdPlayer] Pod <Ad> indicates no ad available");
|
|
@@ -1090,7 +1093,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1090
1093
|
}
|
|
1091
1094
|
function setupAdEventListeners() {
|
|
1092
1095
|
if (!adVideoElement || !currentAd) return;
|
|
1093
|
-
|
|
1096
|
+
if (adEventHandlers.length > 0) return;
|
|
1097
|
+
var onTimeUpdate = function onTimeUpdate() {
|
|
1094
1098
|
if (!currentAd || !adVideoElement) return;
|
|
1095
1099
|
noteAdProgress();
|
|
1096
1100
|
var progress = adVideoElement.currentTime / currentAd.duration;
|
|
@@ -1106,15 +1110,15 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1106
1110
|
trackingFired.thirdQuartile = true;
|
|
1107
1111
|
fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);
|
|
1108
1112
|
}
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1113
|
+
};
|
|
1114
|
+
var onPlaying = function onPlaying() {
|
|
1111
1115
|
startStallWatchdog();
|
|
1112
1116
|
if (!currentAd || trackingFired.start) return;
|
|
1113
1117
|
trackingFired.start = true;
|
|
1114
1118
|
fireTrackingPixels(currentAd.trackingUrls.start);
|
|
1115
1119
|
console.log("[HlsAdPlayer] Ad started playing");
|
|
1116
|
-
}
|
|
1117
|
-
|
|
1120
|
+
};
|
|
1121
|
+
var onEnded = function onEnded() {
|
|
1118
1122
|
if (!currentAd || trackingFired.complete) return;
|
|
1119
1123
|
trackingFired.complete = true;
|
|
1120
1124
|
fireTrackingPixels(currentAd.trackingUrls.complete);
|
|
@@ -1123,8 +1127,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1123
1127
|
return;
|
|
1124
1128
|
}
|
|
1125
1129
|
handleAdComplete();
|
|
1126
|
-
}
|
|
1127
|
-
|
|
1130
|
+
};
|
|
1131
|
+
var onError = function onError(e) {
|
|
1128
1132
|
if (!adPlaying) return;
|
|
1129
1133
|
console.error("[HlsAdPlayer] Ad video error:", e);
|
|
1130
1134
|
if (currentAd) {
|
|
@@ -1134,25 +1138,100 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1134
1138
|
return;
|
|
1135
1139
|
}
|
|
1136
1140
|
handleAdError();
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
if (!currentAd) return;
|
|
1141
|
+
};
|
|
1142
|
+
var onVolumeChange = function onVolumeChange() {
|
|
1143
|
+
if (!currentAd || !adVideoElement) return;
|
|
1140
1144
|
if (adVideoElement.muted) {
|
|
1141
1145
|
fireTrackingPixels(currentAd.trackingUrls.mute);
|
|
1142
1146
|
} else {
|
|
1143
1147
|
fireTrackingPixels(currentAd.trackingUrls.unmute);
|
|
1144
1148
|
}
|
|
1145
|
-
}
|
|
1146
|
-
|
|
1147
|
-
if (currentAd && !adVideoElement.ended) {
|
|
1149
|
+
};
|
|
1150
|
+
var onPause = function onPause() {
|
|
1151
|
+
if (currentAd && adVideoElement && !adVideoElement.ended) {
|
|
1148
1152
|
fireTrackingPixels(currentAd.trackingUrls.pause);
|
|
1149
1153
|
}
|
|
1150
|
-
}
|
|
1151
|
-
|
|
1152
|
-
if (currentAd && adVideoElement.currentTime > 0) {
|
|
1154
|
+
};
|
|
1155
|
+
var onPlay = function onPlay() {
|
|
1156
|
+
if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {
|
|
1153
1157
|
fireTrackingPixels(currentAd.trackingUrls.resume);
|
|
1154
1158
|
}
|
|
1155
|
-
}
|
|
1159
|
+
};
|
|
1160
|
+
adEventHandlers = [
|
|
1161
|
+
{
|
|
1162
|
+
type: "timeupdate",
|
|
1163
|
+
handler: onTimeUpdate
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
type: "playing",
|
|
1167
|
+
handler: onPlaying
|
|
1168
|
+
},
|
|
1169
|
+
{
|
|
1170
|
+
type: "ended",
|
|
1171
|
+
handler: onEnded
|
|
1172
|
+
},
|
|
1173
|
+
{
|
|
1174
|
+
type: "error",
|
|
1175
|
+
handler: onError
|
|
1176
|
+
},
|
|
1177
|
+
{
|
|
1178
|
+
type: "volumechange",
|
|
1179
|
+
handler: onVolumeChange
|
|
1180
|
+
},
|
|
1181
|
+
{
|
|
1182
|
+
type: "pause",
|
|
1183
|
+
handler: onPause
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
type: "play",
|
|
1187
|
+
handler: onPlay
|
|
1188
|
+
}
|
|
1189
|
+
];
|
|
1190
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1191
|
+
try {
|
|
1192
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1193
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1194
|
+
adVideoElement.addEventListener(type, handler);
|
|
1195
|
+
}
|
|
1196
|
+
} catch (err) {
|
|
1197
|
+
_didIteratorError = true;
|
|
1198
|
+
_iteratorError = err;
|
|
1199
|
+
} finally{
|
|
1200
|
+
try {
|
|
1201
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1202
|
+
_iterator.return();
|
|
1203
|
+
}
|
|
1204
|
+
} finally{
|
|
1205
|
+
if (_didIteratorError) {
|
|
1206
|
+
throw _iteratorError;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
function teardownAdEventListeners() {
|
|
1212
|
+
if (adVideoElement) {
|
|
1213
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1214
|
+
try {
|
|
1215
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1216
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1217
|
+
adVideoElement.removeEventListener(type, handler);
|
|
1218
|
+
}
|
|
1219
|
+
} catch (err) {
|
|
1220
|
+
_didIteratorError = true;
|
|
1221
|
+
_iteratorError = err;
|
|
1222
|
+
} finally{
|
|
1223
|
+
try {
|
|
1224
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1225
|
+
_iterator.return();
|
|
1226
|
+
}
|
|
1227
|
+
} finally{
|
|
1228
|
+
if (_didIteratorError) {
|
|
1229
|
+
throw _iteratorError;
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
adEventHandlers = [];
|
|
1156
1235
|
}
|
|
1157
1236
|
function setAdPlayingFlag(isPlaying) {
|
|
1158
1237
|
if (isPlaying) {
|
|
@@ -1298,15 +1377,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1298
1377
|
adHls = void 0;
|
|
1299
1378
|
}
|
|
1300
1379
|
if (adVideoElement) {
|
|
1301
|
-
adVideoElement.pause();
|
|
1302
|
-
adVideoElement.removeAttribute("src");
|
|
1303
1380
|
try {
|
|
1381
|
+
adVideoElement.pause();
|
|
1382
|
+
adVideoElement.removeAttribute("src");
|
|
1304
1383
|
adVideoElement.load();
|
|
1305
1384
|
} catch (error) {
|
|
1306
|
-
console.warn("[HlsAdPlayer]
|
|
1385
|
+
console.warn("[HlsAdPlayer] Error releasing ad decoder:", error);
|
|
1307
1386
|
}
|
|
1308
|
-
adVideoElement.remove();
|
|
1309
|
-
adVideoElement = void 0;
|
|
1310
1387
|
}
|
|
1311
1388
|
if (adContainerEl) {
|
|
1312
1389
|
adContainerEl.style.display = "none";
|
|
@@ -1369,6 +1446,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1369
1446
|
(_contentVideo_parentElement = contentVideo.parentElement) === null || _contentVideo_parentElement === void 0 ? void 0 : _contentVideo_parentElement.appendChild(container);
|
|
1370
1447
|
adContainerEl = container;
|
|
1371
1448
|
}
|
|
1449
|
+
contentVideo[AD_CONTAINER_PROP] = adContainerEl;
|
|
1372
1450
|
},
|
|
1373
1451
|
requestAds: function requestAds(vastTagUrl) {
|
|
1374
1452
|
return _async_to_generator(function() {
|
|
@@ -1471,8 +1549,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1471
1549
|
if (!adVideoElement) {
|
|
1472
1550
|
adVideoElement = createAdVideoElement();
|
|
1473
1551
|
adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.appendChild(adVideoElement);
|
|
1474
|
-
|
|
1552
|
+
contentVideo[AD_VIDEO_PROP] = adVideoElement;
|
|
1475
1553
|
}
|
|
1554
|
+
setupAdEventListeners();
|
|
1476
1555
|
resetQuartileTracking(true);
|
|
1477
1556
|
contentVolume = contentVideo.volume;
|
|
1478
1557
|
originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
|
|
@@ -1600,11 +1679,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1600
1679
|
setAdPlayingFlag(false);
|
|
1601
1680
|
contentVideo.muted = originalMutedState;
|
|
1602
1681
|
contentVideo.volume = Math.max(0, Math.min(1, originalVolume));
|
|
1682
|
+
teardownAdEventListeners();
|
|
1603
1683
|
releaseAdDecoder();
|
|
1604
|
-
if (adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.parentElement) {
|
|
1605
|
-
adContainerEl.parentElement.removeChild(adContainerEl);
|
|
1606
|
-
}
|
|
1607
|
-
adContainerEl = void 0;
|
|
1608
1684
|
currentAd = void 0;
|
|
1609
1685
|
podAds = [];
|
|
1610
1686
|
podIndex = 0;
|
|
@@ -4017,6 +4093,11 @@ function detectBrowser() {
|
|
|
4017
4093
|
chromeVersion: chromeVersionNum
|
|
4018
4094
|
};
|
|
4019
4095
|
}
|
|
4096
|
+
function requiresMediaPipelineResetAfterAds() {
|
|
4097
|
+
var _browser_tizenVersion;
|
|
4098
|
+
var browser = detectBrowser();
|
|
4099
|
+
return browser.name === "Samsung Tizen" && ((_browser_tizenVersion = browser.tizenVersion) !== null && _browser_tizenVersion !== void 0 ? _browser_tizenVersion : 0) >= 5;
|
|
4100
|
+
}
|
|
4020
4101
|
function getBrowserConfigOverrides() {
|
|
4021
4102
|
var browser = detectBrowser();
|
|
4022
4103
|
var overrides = {};
|
|
@@ -6778,30 +6859,49 @@ var HlsEngine = /*#__PURE__*/ function() {
|
|
|
6778
6859
|
{
|
|
6779
6860
|
key: "reloadLiveStream",
|
|
6780
6861
|
value: function reloadLiveStream() {
|
|
6862
|
+
var _this = this;
|
|
6781
6863
|
var hls = this.hls;
|
|
6782
6864
|
if (!hls) {
|
|
6783
6865
|
return;
|
|
6784
6866
|
}
|
|
6785
6867
|
if (this.debug) {
|
|
6786
|
-
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (
|
|
6868
|
+
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \u2192 reset video \u2192 fresh setupHls)");
|
|
6787
6869
|
}
|
|
6788
6870
|
try {
|
|
6789
6871
|
this.reloadingLiveStream = true;
|
|
6790
6872
|
hls.stopLoad();
|
|
6791
6873
|
hls.detachMedia();
|
|
6874
|
+
hls.destroy();
|
|
6875
|
+
this.hls = void 0;
|
|
6792
6876
|
try {
|
|
6793
6877
|
this.video.removeAttribute("src");
|
|
6794
6878
|
this.video.load();
|
|
6795
6879
|
} catch (error) {
|
|
6796
6880
|
console.warn("[StormcloudVideoPlayer] video.load() threw after src removal:", error);
|
|
6797
6881
|
}
|
|
6798
|
-
hls.attachMedia(this.video);
|
|
6799
6882
|
} catch (error) {
|
|
6800
6883
|
this.reloadingLiveStream = false;
|
|
6884
|
+
this.hls = void 0;
|
|
6801
6885
|
if (this.debug) {
|
|
6802
|
-
console.warn("[StormcloudVideoPlayer] Failed to hard-reload
|
|
6886
|
+
console.warn("[StormcloudVideoPlayer] Failed to tear down during hard-reload:", error);
|
|
6803
6887
|
}
|
|
6888
|
+
return;
|
|
6804
6889
|
}
|
|
6890
|
+
var recreateDelayMs = 600;
|
|
6891
|
+
window.setTimeout(function() {
|
|
6892
|
+
if (_this.hls) {
|
|
6893
|
+
_this.reloadingLiveStream = false;
|
|
6894
|
+
return;
|
|
6895
|
+
}
|
|
6896
|
+
try {
|
|
6897
|
+
_this.setupHls();
|
|
6898
|
+
} catch (error) {
|
|
6899
|
+
_this.reloadingLiveStream = false;
|
|
6900
|
+
if (_this.debug) {
|
|
6901
|
+
console.warn("[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:", error);
|
|
6902
|
+
}
|
|
6903
|
+
}
|
|
6904
|
+
}, recreateDelayMs);
|
|
6805
6905
|
}
|
|
6806
6906
|
},
|
|
6807
6907
|
{
|
|
@@ -8114,6 +8214,14 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8114
8214
|
this.host.video.style.visibility = "visible";
|
|
8115
8215
|
this.host.video.style.opacity = "1";
|
|
8116
8216
|
if (this.host.isLiveStream()) {
|
|
8217
|
+
if (this.host.requiresMediaPipelineResetAfterAds()) {
|
|
8218
|
+
if (this.debug) {
|
|
8219
|
+
console.log("[StormcloudVideoPlayer] Live break end \u2014 hard-reloading stream to reacquire decoder (single-decoder platform)");
|
|
8220
|
+
}
|
|
8221
|
+
this.host.reloadLiveStream();
|
|
8222
|
+
this.monitorLiveResumeStall(this.host.video.currentTime);
|
|
8223
|
+
return;
|
|
8224
|
+
}
|
|
8117
8225
|
var liveSyncPos = this.host.getLiveSyncPosition();
|
|
8118
8226
|
if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {
|
|
8119
8227
|
if (this.debug) {
|
|
@@ -8175,9 +8283,10 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8175
8283
|
key: "monitorLiveResumeStall",
|
|
8176
8284
|
value: function monitorLiveResumeStall(resumeBaseline) {
|
|
8177
8285
|
var _this = this;
|
|
8286
|
+
var needsReset = this.host.requiresMediaPipelineResetAfterAds();
|
|
8178
8287
|
var pollIntervalMs = 1e3;
|
|
8179
|
-
var graceMs = 5e3;
|
|
8180
|
-
var recoveryCooldownMs = 5e3;
|
|
8288
|
+
var graceMs = needsReset ? 8e3 : 5e3;
|
|
8289
|
+
var recoveryCooldownMs = needsReset ? 7e3 : 5e3;
|
|
8181
8290
|
var maxRecoveries = 3;
|
|
8182
8291
|
var maxMonitorMs = 45e3;
|
|
8183
8292
|
var startTime = Date.now();
|
|
@@ -8291,7 +8400,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8291
8400
|
if (canRecover) {
|
|
8292
8401
|
recoveries++;
|
|
8293
8402
|
lastRecoveryAt = Date.now();
|
|
8294
|
-
if (
|
|
8403
|
+
if (needsReset) {
|
|
8404
|
+
if (_this.debug) {
|
|
8405
|
+
console.warn("[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8406
|
+
}
|
|
8407
|
+
_this.host.reloadLiveStream();
|
|
8408
|
+
} else if (recoveries === 1) {
|
|
8295
8409
|
if (_this.debug) {
|
|
8296
8410
|
console.warn("[StormcloudVideoPlayer] Content wedged after ad break — calling recoverMediaError() (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8297
8411
|
}
|
|
@@ -8504,6 +8618,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8504
8618
|
recoverMediaError: function recoverMediaError() {
|
|
8505
8619
|
return _this.hlsEngine.recoverMediaError();
|
|
8506
8620
|
},
|
|
8621
|
+
requiresMediaPipelineResetAfterAds: function requiresMediaPipelineResetAfterAds1() {
|
|
8622
|
+
return requiresMediaPipelineResetAfterAds();
|
|
8623
|
+
},
|
|
8507
8624
|
generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
|
|
8508
8625
|
return _this.generatePodVastUrl(base, breakDurationMs);
|
|
8509
8626
|
}
|