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
|
@@ -351,15 +351,19 @@ module.exports = __toCommonJS(StormcloudVideoPlayer_exports);
|
|
|
351
351
|
var import_hls = __toESM(require("hls.js"), 1);
|
|
352
352
|
var MAX_VAST_WRAPPER_DEPTH = 5;
|
|
353
353
|
function createHlsAdPlayer(contentVideo, options) {
|
|
354
|
+
var _contentVideo_AD_VIDEO_PROP, _contentVideo_AD_CONTAINER_PROP;
|
|
354
355
|
var adPlaying = false;
|
|
355
356
|
var originalMutedState = false;
|
|
356
357
|
var originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));
|
|
357
358
|
var listeners = /* @__PURE__ */ new Map();
|
|
358
359
|
var licenseKey = options === null || options === void 0 ? void 0 : options.licenseKey;
|
|
359
360
|
var mainHlsInstance = options === null || options === void 0 ? void 0 : options.mainHlsInstance;
|
|
360
|
-
var
|
|
361
|
+
var AD_CONTAINER_PROP = "__stormcloudAdContainer";
|
|
362
|
+
var AD_VIDEO_PROP = "__stormcloudAdVideo";
|
|
363
|
+
var adVideoElement = (_contentVideo_AD_VIDEO_PROP = contentVideo[AD_VIDEO_PROP]) !== null && _contentVideo_AD_VIDEO_PROP !== void 0 ? _contentVideo_AD_VIDEO_PROP : void 0;
|
|
361
364
|
var adHls;
|
|
362
|
-
var adContainerEl;
|
|
365
|
+
var adContainerEl = (_contentVideo_AD_CONTAINER_PROP = contentVideo[AD_CONTAINER_PROP]) !== null && _contentVideo_AD_CONTAINER_PROP !== void 0 ? _contentVideo_AD_CONTAINER_PROP : void 0;
|
|
366
|
+
var adEventHandlers = [];
|
|
363
367
|
var currentAd;
|
|
364
368
|
var podAds = [];
|
|
365
369
|
var podIndex = 0;
|
|
@@ -514,6 +518,56 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
514
518
|
var url = mediaFile.url.toLowerCase();
|
|
515
519
|
return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
|
|
516
520
|
}
|
|
521
|
+
function isAudioMediaFile(mediaFile) {
|
|
522
|
+
var type = mediaFile.type.toLowerCase();
|
|
523
|
+
var url = (mediaFile.url.toLowerCase().split("?")[0] || "").trim();
|
|
524
|
+
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");
|
|
525
|
+
}
|
|
526
|
+
function collectVideoMediaFiles(scope, verbose) {
|
|
527
|
+
var mediaFileElements = scope.querySelectorAll("MediaFile");
|
|
528
|
+
var mediaFiles = [];
|
|
529
|
+
if (verbose) {
|
|
530
|
+
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
531
|
+
}
|
|
532
|
+
mediaFileElements.forEach(function(mf, index) {
|
|
533
|
+
var _mf_textContent;
|
|
534
|
+
var type = mf.getAttribute("type") || "";
|
|
535
|
+
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
536
|
+
var width = mf.getAttribute("width") || "";
|
|
537
|
+
var height = mf.getAttribute("height") || "";
|
|
538
|
+
if (verbose) {
|
|
539
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
540
|
+
}
|
|
541
|
+
if (!url) {
|
|
542
|
+
if (verbose) {
|
|
543
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
544
|
+
}
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
var bitrateAttr = mf.getAttribute("bitrate");
|
|
548
|
+
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
549
|
+
var mediaFile = {
|
|
550
|
+
url: url,
|
|
551
|
+
type: type,
|
|
552
|
+
width: parseInt(width || "1920", 10),
|
|
553
|
+
height: parseInt(height || "1080", 10),
|
|
554
|
+
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
555
|
+
};
|
|
556
|
+
if (isAudioMediaFile(mediaFile)) {
|
|
557
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, ' skipped (audio-only, type="').concat(type, '") — audio ads are not played to avoid a black screen'));
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
561
|
+
mediaFiles.push(mediaFile);
|
|
562
|
+
if (verbose) {
|
|
563
|
+
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
564
|
+
}
|
|
565
|
+
} else if (verbose) {
|
|
566
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
return mediaFiles;
|
|
570
|
+
}
|
|
517
571
|
function createEmptyTrackingUrls() {
|
|
518
572
|
return {
|
|
519
573
|
impression: [],
|
|
@@ -601,37 +655,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
601
655
|
var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
|
|
602
656
|
var durationParts = durationText.split(":");
|
|
603
657
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
604
|
-
var
|
|
605
|
-
var mediaFiles = [];
|
|
606
|
-
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
607
|
-
mediaFileElements.forEach(function(mf, index) {
|
|
608
|
-
var _mf_textContent;
|
|
609
|
-
var type = mf.getAttribute("type") || "";
|
|
610
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
611
|
-
var width = mf.getAttribute("width") || "";
|
|
612
|
-
var height = mf.getAttribute("height") || "";
|
|
613
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
614
|
-
var mediaFile = {
|
|
615
|
-
url: url,
|
|
616
|
-
type: type,
|
|
617
|
-
width: parseInt(width || "1920", 10),
|
|
618
|
-
height: parseInt(height || "1080", 10),
|
|
619
|
-
bitrate: void 0
|
|
620
|
-
};
|
|
621
|
-
if (!url) {
|
|
622
|
-
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
626
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
627
|
-
mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;
|
|
628
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
629
|
-
mediaFiles.push(mediaFile);
|
|
630
|
-
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
631
|
-
} else {
|
|
632
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
633
|
-
}
|
|
634
|
-
});
|
|
658
|
+
var mediaFiles = collectVideoMediaFiles(xmlDoc, true);
|
|
635
659
|
if (mediaFiles.length === 0) {
|
|
636
660
|
if (isNoAdAvailable) {
|
|
637
661
|
console.warn("[HlsAdPlayer] No ads available (VAST response indicates no ads)");
|
|
@@ -679,28 +703,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
679
703
|
var durationText = ((_adElement_querySelector3 = adElement.querySelector("Duration")) === null || _adElement_querySelector3 === void 0 ? void 0 : _adElement_querySelector3.textContent) || "00:00:30";
|
|
680
704
|
var durationParts = durationText.split(":");
|
|
681
705
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
682
|
-
var
|
|
683
|
-
var mediaFiles = [];
|
|
684
|
-
mediaFileElements.forEach(function(mf) {
|
|
685
|
-
var _mf_textContent;
|
|
686
|
-
var type = mf.getAttribute("type") || "";
|
|
687
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
688
|
-
var width = mf.getAttribute("width") || "";
|
|
689
|
-
var height = mf.getAttribute("height") || "";
|
|
690
|
-
if (!url) return;
|
|
691
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
692
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
693
|
-
var mediaFile = {
|
|
694
|
-
url: url,
|
|
695
|
-
type: type,
|
|
696
|
-
width: parseInt(width || "1920", 10),
|
|
697
|
-
height: parseInt(height || "1080", 10),
|
|
698
|
-
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
699
|
-
};
|
|
700
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
701
|
-
mediaFiles.push(mediaFile);
|
|
702
|
-
}
|
|
703
|
-
});
|
|
706
|
+
var mediaFiles = collectVideoMediaFiles(adElement, false);
|
|
704
707
|
if (mediaFiles.length === 0) {
|
|
705
708
|
if (isNoAdAvailable) {
|
|
706
709
|
console.warn("[HlsAdPlayer] Pod <Ad> indicates no ad available");
|
|
@@ -1003,7 +1006,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1003
1006
|
}
|
|
1004
1007
|
function setupAdEventListeners() {
|
|
1005
1008
|
if (!adVideoElement || !currentAd) return;
|
|
1006
|
-
|
|
1009
|
+
if (adEventHandlers.length > 0) return;
|
|
1010
|
+
var onTimeUpdate = function onTimeUpdate() {
|
|
1007
1011
|
if (!currentAd || !adVideoElement) return;
|
|
1008
1012
|
noteAdProgress();
|
|
1009
1013
|
var progress = adVideoElement.currentTime / currentAd.duration;
|
|
@@ -1019,15 +1023,15 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1019
1023
|
trackingFired.thirdQuartile = true;
|
|
1020
1024
|
fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);
|
|
1021
1025
|
}
|
|
1022
|
-
}
|
|
1023
|
-
|
|
1026
|
+
};
|
|
1027
|
+
var onPlaying = function onPlaying() {
|
|
1024
1028
|
startStallWatchdog();
|
|
1025
1029
|
if (!currentAd || trackingFired.start) return;
|
|
1026
1030
|
trackingFired.start = true;
|
|
1027
1031
|
fireTrackingPixels(currentAd.trackingUrls.start);
|
|
1028
1032
|
console.log("[HlsAdPlayer] Ad started playing");
|
|
1029
|
-
}
|
|
1030
|
-
|
|
1033
|
+
};
|
|
1034
|
+
var onEnded = function onEnded() {
|
|
1031
1035
|
if (!currentAd || trackingFired.complete) return;
|
|
1032
1036
|
trackingFired.complete = true;
|
|
1033
1037
|
fireTrackingPixels(currentAd.trackingUrls.complete);
|
|
@@ -1036,8 +1040,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1036
1040
|
return;
|
|
1037
1041
|
}
|
|
1038
1042
|
handleAdComplete();
|
|
1039
|
-
}
|
|
1040
|
-
|
|
1043
|
+
};
|
|
1044
|
+
var onError = function onError(e) {
|
|
1041
1045
|
if (!adPlaying) return;
|
|
1042
1046
|
console.error("[HlsAdPlayer] Ad video error:", e);
|
|
1043
1047
|
if (currentAd) {
|
|
@@ -1047,25 +1051,100 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1047
1051
|
return;
|
|
1048
1052
|
}
|
|
1049
1053
|
handleAdError();
|
|
1050
|
-
}
|
|
1051
|
-
|
|
1052
|
-
if (!currentAd) return;
|
|
1054
|
+
};
|
|
1055
|
+
var onVolumeChange = function onVolumeChange() {
|
|
1056
|
+
if (!currentAd || !adVideoElement) return;
|
|
1053
1057
|
if (adVideoElement.muted) {
|
|
1054
1058
|
fireTrackingPixels(currentAd.trackingUrls.mute);
|
|
1055
1059
|
} else {
|
|
1056
1060
|
fireTrackingPixels(currentAd.trackingUrls.unmute);
|
|
1057
1061
|
}
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
if (currentAd && !adVideoElement.ended) {
|
|
1062
|
+
};
|
|
1063
|
+
var onPause = function onPause() {
|
|
1064
|
+
if (currentAd && adVideoElement && !adVideoElement.ended) {
|
|
1061
1065
|
fireTrackingPixels(currentAd.trackingUrls.pause);
|
|
1062
1066
|
}
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
if (currentAd && adVideoElement.currentTime > 0) {
|
|
1067
|
+
};
|
|
1068
|
+
var onPlay = function onPlay() {
|
|
1069
|
+
if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {
|
|
1066
1070
|
fireTrackingPixels(currentAd.trackingUrls.resume);
|
|
1067
1071
|
}
|
|
1068
|
-
}
|
|
1072
|
+
};
|
|
1073
|
+
adEventHandlers = [
|
|
1074
|
+
{
|
|
1075
|
+
type: "timeupdate",
|
|
1076
|
+
handler: onTimeUpdate
|
|
1077
|
+
},
|
|
1078
|
+
{
|
|
1079
|
+
type: "playing",
|
|
1080
|
+
handler: onPlaying
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
type: "ended",
|
|
1084
|
+
handler: onEnded
|
|
1085
|
+
},
|
|
1086
|
+
{
|
|
1087
|
+
type: "error",
|
|
1088
|
+
handler: onError
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
type: "volumechange",
|
|
1092
|
+
handler: onVolumeChange
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
type: "pause",
|
|
1096
|
+
handler: onPause
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
type: "play",
|
|
1100
|
+
handler: onPlay
|
|
1101
|
+
}
|
|
1102
|
+
];
|
|
1103
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1104
|
+
try {
|
|
1105
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1106
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1107
|
+
adVideoElement.addEventListener(type, handler);
|
|
1108
|
+
}
|
|
1109
|
+
} catch (err) {
|
|
1110
|
+
_didIteratorError = true;
|
|
1111
|
+
_iteratorError = err;
|
|
1112
|
+
} finally{
|
|
1113
|
+
try {
|
|
1114
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1115
|
+
_iterator.return();
|
|
1116
|
+
}
|
|
1117
|
+
} finally{
|
|
1118
|
+
if (_didIteratorError) {
|
|
1119
|
+
throw _iteratorError;
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
function teardownAdEventListeners() {
|
|
1125
|
+
if (adVideoElement) {
|
|
1126
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1127
|
+
try {
|
|
1128
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1129
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1130
|
+
adVideoElement.removeEventListener(type, handler);
|
|
1131
|
+
}
|
|
1132
|
+
} catch (err) {
|
|
1133
|
+
_didIteratorError = true;
|
|
1134
|
+
_iteratorError = err;
|
|
1135
|
+
} finally{
|
|
1136
|
+
try {
|
|
1137
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1138
|
+
_iterator.return();
|
|
1139
|
+
}
|
|
1140
|
+
} finally{
|
|
1141
|
+
if (_didIteratorError) {
|
|
1142
|
+
throw _iteratorError;
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
adEventHandlers = [];
|
|
1069
1148
|
}
|
|
1070
1149
|
function setAdPlayingFlag(isPlaying) {
|
|
1071
1150
|
if (isPlaying) {
|
|
@@ -1211,15 +1290,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1211
1290
|
adHls = void 0;
|
|
1212
1291
|
}
|
|
1213
1292
|
if (adVideoElement) {
|
|
1214
|
-
adVideoElement.pause();
|
|
1215
|
-
adVideoElement.removeAttribute("src");
|
|
1216
1293
|
try {
|
|
1294
|
+
adVideoElement.pause();
|
|
1295
|
+
adVideoElement.removeAttribute("src");
|
|
1217
1296
|
adVideoElement.load();
|
|
1218
1297
|
} catch (error) {
|
|
1219
|
-
console.warn("[HlsAdPlayer]
|
|
1298
|
+
console.warn("[HlsAdPlayer] Error releasing ad decoder:", error);
|
|
1220
1299
|
}
|
|
1221
|
-
adVideoElement.remove();
|
|
1222
|
-
adVideoElement = void 0;
|
|
1223
1300
|
}
|
|
1224
1301
|
if (adContainerEl) {
|
|
1225
1302
|
adContainerEl.style.display = "none";
|
|
@@ -1282,6 +1359,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1282
1359
|
(_contentVideo_parentElement = contentVideo.parentElement) === null || _contentVideo_parentElement === void 0 ? void 0 : _contentVideo_parentElement.appendChild(container);
|
|
1283
1360
|
adContainerEl = container;
|
|
1284
1361
|
}
|
|
1362
|
+
contentVideo[AD_CONTAINER_PROP] = adContainerEl;
|
|
1285
1363
|
},
|
|
1286
1364
|
requestAds: function requestAds(vastTagUrl) {
|
|
1287
1365
|
return _async_to_generator(function() {
|
|
@@ -1384,8 +1462,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1384
1462
|
if (!adVideoElement) {
|
|
1385
1463
|
adVideoElement = createAdVideoElement();
|
|
1386
1464
|
adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.appendChild(adVideoElement);
|
|
1387
|
-
|
|
1465
|
+
contentVideo[AD_VIDEO_PROP] = adVideoElement;
|
|
1388
1466
|
}
|
|
1467
|
+
setupAdEventListeners();
|
|
1389
1468
|
resetQuartileTracking(true);
|
|
1390
1469
|
contentVolume = contentVideo.volume;
|
|
1391
1470
|
originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
|
|
@@ -1513,11 +1592,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1513
1592
|
setAdPlayingFlag(false);
|
|
1514
1593
|
contentVideo.muted = originalMutedState;
|
|
1515
1594
|
contentVideo.volume = Math.max(0, Math.min(1, originalVolume));
|
|
1595
|
+
teardownAdEventListeners();
|
|
1516
1596
|
releaseAdDecoder();
|
|
1517
|
-
if (adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.parentElement) {
|
|
1518
|
-
adContainerEl.parentElement.removeChild(adContainerEl);
|
|
1519
|
-
}
|
|
1520
|
-
adContainerEl = void 0;
|
|
1521
1597
|
currentAd = void 0;
|
|
1522
1598
|
podAds = [];
|
|
1523
1599
|
podIndex = 0;
|
|
@@ -3930,6 +4006,11 @@ function detectBrowser() {
|
|
|
3930
4006
|
chromeVersion: chromeVersionNum
|
|
3931
4007
|
};
|
|
3932
4008
|
}
|
|
4009
|
+
function requiresMediaPipelineResetAfterAds() {
|
|
4010
|
+
var _browser_tizenVersion;
|
|
4011
|
+
var browser = detectBrowser();
|
|
4012
|
+
return browser.name === "Samsung Tizen" && ((_browser_tizenVersion = browser.tizenVersion) !== null && _browser_tizenVersion !== void 0 ? _browser_tizenVersion : 0) >= 5;
|
|
4013
|
+
}
|
|
3933
4014
|
function getBrowserConfigOverrides() {
|
|
3934
4015
|
var browser = detectBrowser();
|
|
3935
4016
|
var overrides = {};
|
|
@@ -6691,30 +6772,49 @@ var HlsEngine = /*#__PURE__*/ function() {
|
|
|
6691
6772
|
{
|
|
6692
6773
|
key: "reloadLiveStream",
|
|
6693
6774
|
value: function reloadLiveStream() {
|
|
6775
|
+
var _this = this;
|
|
6694
6776
|
var hls = this.hls;
|
|
6695
6777
|
if (!hls) {
|
|
6696
6778
|
return;
|
|
6697
6779
|
}
|
|
6698
6780
|
if (this.debug) {
|
|
6699
|
-
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (
|
|
6781
|
+
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \u2192 reset video \u2192 fresh setupHls)");
|
|
6700
6782
|
}
|
|
6701
6783
|
try {
|
|
6702
6784
|
this.reloadingLiveStream = true;
|
|
6703
6785
|
hls.stopLoad();
|
|
6704
6786
|
hls.detachMedia();
|
|
6787
|
+
hls.destroy();
|
|
6788
|
+
this.hls = void 0;
|
|
6705
6789
|
try {
|
|
6706
6790
|
this.video.removeAttribute("src");
|
|
6707
6791
|
this.video.load();
|
|
6708
6792
|
} catch (error) {
|
|
6709
6793
|
console.warn("[StormcloudVideoPlayer] video.load() threw after src removal:", error);
|
|
6710
6794
|
}
|
|
6711
|
-
hls.attachMedia(this.video);
|
|
6712
6795
|
} catch (error) {
|
|
6713
6796
|
this.reloadingLiveStream = false;
|
|
6797
|
+
this.hls = void 0;
|
|
6714
6798
|
if (this.debug) {
|
|
6715
|
-
console.warn("[StormcloudVideoPlayer] Failed to hard-reload
|
|
6799
|
+
console.warn("[StormcloudVideoPlayer] Failed to tear down during hard-reload:", error);
|
|
6716
6800
|
}
|
|
6801
|
+
return;
|
|
6717
6802
|
}
|
|
6803
|
+
var recreateDelayMs = 600;
|
|
6804
|
+
window.setTimeout(function() {
|
|
6805
|
+
if (_this.hls) {
|
|
6806
|
+
_this.reloadingLiveStream = false;
|
|
6807
|
+
return;
|
|
6808
|
+
}
|
|
6809
|
+
try {
|
|
6810
|
+
_this.setupHls();
|
|
6811
|
+
} catch (error) {
|
|
6812
|
+
_this.reloadingLiveStream = false;
|
|
6813
|
+
if (_this.debug) {
|
|
6814
|
+
console.warn("[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:", error);
|
|
6815
|
+
}
|
|
6816
|
+
}
|
|
6817
|
+
}, recreateDelayMs);
|
|
6718
6818
|
}
|
|
6719
6819
|
},
|
|
6720
6820
|
{
|
|
@@ -8027,6 +8127,14 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8027
8127
|
this.host.video.style.visibility = "visible";
|
|
8028
8128
|
this.host.video.style.opacity = "1";
|
|
8029
8129
|
if (this.host.isLiveStream()) {
|
|
8130
|
+
if (this.host.requiresMediaPipelineResetAfterAds()) {
|
|
8131
|
+
if (this.debug) {
|
|
8132
|
+
console.log("[StormcloudVideoPlayer] Live break end \u2014 hard-reloading stream to reacquire decoder (single-decoder platform)");
|
|
8133
|
+
}
|
|
8134
|
+
this.host.reloadLiveStream();
|
|
8135
|
+
this.monitorLiveResumeStall(this.host.video.currentTime);
|
|
8136
|
+
return;
|
|
8137
|
+
}
|
|
8030
8138
|
var liveSyncPos = this.host.getLiveSyncPosition();
|
|
8031
8139
|
if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {
|
|
8032
8140
|
if (this.debug) {
|
|
@@ -8088,9 +8196,10 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8088
8196
|
key: "monitorLiveResumeStall",
|
|
8089
8197
|
value: function monitorLiveResumeStall(resumeBaseline) {
|
|
8090
8198
|
var _this = this;
|
|
8199
|
+
var needsReset = this.host.requiresMediaPipelineResetAfterAds();
|
|
8091
8200
|
var pollIntervalMs = 1e3;
|
|
8092
|
-
var graceMs = 5e3;
|
|
8093
|
-
var recoveryCooldownMs = 5e3;
|
|
8201
|
+
var graceMs = needsReset ? 8e3 : 5e3;
|
|
8202
|
+
var recoveryCooldownMs = needsReset ? 7e3 : 5e3;
|
|
8094
8203
|
var maxRecoveries = 3;
|
|
8095
8204
|
var maxMonitorMs = 45e3;
|
|
8096
8205
|
var startTime = Date.now();
|
|
@@ -8204,7 +8313,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8204
8313
|
if (canRecover) {
|
|
8205
8314
|
recoveries++;
|
|
8206
8315
|
lastRecoveryAt = Date.now();
|
|
8207
|
-
if (
|
|
8316
|
+
if (needsReset) {
|
|
8317
|
+
if (_this.debug) {
|
|
8318
|
+
console.warn("[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8319
|
+
}
|
|
8320
|
+
_this.host.reloadLiveStream();
|
|
8321
|
+
} else if (recoveries === 1) {
|
|
8208
8322
|
if (_this.debug) {
|
|
8209
8323
|
console.warn("[StormcloudVideoPlayer] Content wedged after ad break — calling recoverMediaError() (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8210
8324
|
}
|
|
@@ -8417,6 +8531,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8417
8531
|
recoverMediaError: function recoverMediaError() {
|
|
8418
8532
|
return _this.hlsEngine.recoverMediaError();
|
|
8419
8533
|
},
|
|
8534
|
+
requiresMediaPipelineResetAfterAds: function requiresMediaPipelineResetAfterAds1() {
|
|
8535
|
+
return requiresMediaPipelineResetAfterAds();
|
|
8536
|
+
},
|
|
8420
8537
|
generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
|
|
8421
8538
|
return _this.generatePodVastUrl(base, breakDurationMs);
|
|
8422
8539
|
}
|