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
|
@@ -388,15 +388,19 @@ var import_react = __toESM(require("react"), 1);
|
|
|
388
388
|
var import_hls = __toESM(require("hls.js"), 1);
|
|
389
389
|
var MAX_VAST_WRAPPER_DEPTH = 5;
|
|
390
390
|
function createHlsAdPlayer(contentVideo, options) {
|
|
391
|
+
var _contentVideo_AD_VIDEO_PROP, _contentVideo_AD_CONTAINER_PROP;
|
|
391
392
|
var adPlaying = false;
|
|
392
393
|
var originalMutedState = false;
|
|
393
394
|
var originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));
|
|
394
395
|
var listeners = /* @__PURE__ */ new Map();
|
|
395
396
|
var licenseKey = options === null || options === void 0 ? void 0 : options.licenseKey;
|
|
396
397
|
var mainHlsInstance = options === null || options === void 0 ? void 0 : options.mainHlsInstance;
|
|
397
|
-
var
|
|
398
|
+
var AD_CONTAINER_PROP = "__stormcloudAdContainer";
|
|
399
|
+
var AD_VIDEO_PROP = "__stormcloudAdVideo";
|
|
400
|
+
var adVideoElement = (_contentVideo_AD_VIDEO_PROP = contentVideo[AD_VIDEO_PROP]) !== null && _contentVideo_AD_VIDEO_PROP !== void 0 ? _contentVideo_AD_VIDEO_PROP : void 0;
|
|
398
401
|
var adHls;
|
|
399
|
-
var adContainerEl;
|
|
402
|
+
var adContainerEl = (_contentVideo_AD_CONTAINER_PROP = contentVideo[AD_CONTAINER_PROP]) !== null && _contentVideo_AD_CONTAINER_PROP !== void 0 ? _contentVideo_AD_CONTAINER_PROP : void 0;
|
|
403
|
+
var adEventHandlers = [];
|
|
400
404
|
var currentAd;
|
|
401
405
|
var podAds = [];
|
|
402
406
|
var podIndex = 0;
|
|
@@ -551,6 +555,56 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
551
555
|
var url = mediaFile.url.toLowerCase();
|
|
552
556
|
return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
|
|
553
557
|
}
|
|
558
|
+
function isAudioMediaFile(mediaFile) {
|
|
559
|
+
var type = mediaFile.type.toLowerCase();
|
|
560
|
+
var url = (mediaFile.url.toLowerCase().split("?")[0] || "").trim();
|
|
561
|
+
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");
|
|
562
|
+
}
|
|
563
|
+
function collectVideoMediaFiles(scope, verbose) {
|
|
564
|
+
var mediaFileElements = scope.querySelectorAll("MediaFile");
|
|
565
|
+
var mediaFiles = [];
|
|
566
|
+
if (verbose) {
|
|
567
|
+
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
568
|
+
}
|
|
569
|
+
mediaFileElements.forEach(function(mf, index) {
|
|
570
|
+
var _mf_textContent;
|
|
571
|
+
var type = mf.getAttribute("type") || "";
|
|
572
|
+
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
573
|
+
var width = mf.getAttribute("width") || "";
|
|
574
|
+
var height = mf.getAttribute("height") || "";
|
|
575
|
+
if (verbose) {
|
|
576
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
577
|
+
}
|
|
578
|
+
if (!url) {
|
|
579
|
+
if (verbose) {
|
|
580
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
581
|
+
}
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
var bitrateAttr = mf.getAttribute("bitrate");
|
|
585
|
+
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
586
|
+
var mediaFile = {
|
|
587
|
+
url: url,
|
|
588
|
+
type: type,
|
|
589
|
+
width: parseInt(width || "1920", 10),
|
|
590
|
+
height: parseInt(height || "1080", 10),
|
|
591
|
+
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
592
|
+
};
|
|
593
|
+
if (isAudioMediaFile(mediaFile)) {
|
|
594
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, ' skipped (audio-only, type="').concat(type, '") — audio ads are not played to avoid a black screen'));
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
598
|
+
mediaFiles.push(mediaFile);
|
|
599
|
+
if (verbose) {
|
|
600
|
+
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
601
|
+
}
|
|
602
|
+
} else if (verbose) {
|
|
603
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
return mediaFiles;
|
|
607
|
+
}
|
|
554
608
|
function createEmptyTrackingUrls() {
|
|
555
609
|
return {
|
|
556
610
|
impression: [],
|
|
@@ -638,37 +692,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
638
692
|
var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
|
|
639
693
|
var durationParts = durationText.split(":");
|
|
640
694
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
641
|
-
var
|
|
642
|
-
var mediaFiles = [];
|
|
643
|
-
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
644
|
-
mediaFileElements.forEach(function(mf, index) {
|
|
645
|
-
var _mf_textContent;
|
|
646
|
-
var type = mf.getAttribute("type") || "";
|
|
647
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
648
|
-
var width = mf.getAttribute("width") || "";
|
|
649
|
-
var height = mf.getAttribute("height") || "";
|
|
650
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
651
|
-
var mediaFile = {
|
|
652
|
-
url: url,
|
|
653
|
-
type: type,
|
|
654
|
-
width: parseInt(width || "1920", 10),
|
|
655
|
-
height: parseInt(height || "1080", 10),
|
|
656
|
-
bitrate: void 0
|
|
657
|
-
};
|
|
658
|
-
if (!url) {
|
|
659
|
-
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
660
|
-
return;
|
|
661
|
-
}
|
|
662
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
663
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
664
|
-
mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;
|
|
665
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
666
|
-
mediaFiles.push(mediaFile);
|
|
667
|
-
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
668
|
-
} else {
|
|
669
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
670
|
-
}
|
|
671
|
-
});
|
|
695
|
+
var mediaFiles = collectVideoMediaFiles(xmlDoc, true);
|
|
672
696
|
if (mediaFiles.length === 0) {
|
|
673
697
|
if (isNoAdAvailable) {
|
|
674
698
|
console.warn("[HlsAdPlayer] No ads available (VAST response indicates no ads)");
|
|
@@ -716,28 +740,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
716
740
|
var durationText = ((_adElement_querySelector3 = adElement.querySelector("Duration")) === null || _adElement_querySelector3 === void 0 ? void 0 : _adElement_querySelector3.textContent) || "00:00:30";
|
|
717
741
|
var durationParts = durationText.split(":");
|
|
718
742
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
719
|
-
var
|
|
720
|
-
var mediaFiles = [];
|
|
721
|
-
mediaFileElements.forEach(function(mf) {
|
|
722
|
-
var _mf_textContent;
|
|
723
|
-
var type = mf.getAttribute("type") || "";
|
|
724
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
725
|
-
var width = mf.getAttribute("width") || "";
|
|
726
|
-
var height = mf.getAttribute("height") || "";
|
|
727
|
-
if (!url) return;
|
|
728
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
729
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
730
|
-
var mediaFile = {
|
|
731
|
-
url: url,
|
|
732
|
-
type: type,
|
|
733
|
-
width: parseInt(width || "1920", 10),
|
|
734
|
-
height: parseInt(height || "1080", 10),
|
|
735
|
-
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
736
|
-
};
|
|
737
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
738
|
-
mediaFiles.push(mediaFile);
|
|
739
|
-
}
|
|
740
|
-
});
|
|
743
|
+
var mediaFiles = collectVideoMediaFiles(adElement, false);
|
|
741
744
|
if (mediaFiles.length === 0) {
|
|
742
745
|
if (isNoAdAvailable) {
|
|
743
746
|
console.warn("[HlsAdPlayer] Pod <Ad> indicates no ad available");
|
|
@@ -1040,7 +1043,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1040
1043
|
}
|
|
1041
1044
|
function setupAdEventListeners() {
|
|
1042
1045
|
if (!adVideoElement || !currentAd) return;
|
|
1043
|
-
|
|
1046
|
+
if (adEventHandlers.length > 0) return;
|
|
1047
|
+
var onTimeUpdate = function onTimeUpdate() {
|
|
1044
1048
|
if (!currentAd || !adVideoElement) return;
|
|
1045
1049
|
noteAdProgress();
|
|
1046
1050
|
var progress = adVideoElement.currentTime / currentAd.duration;
|
|
@@ -1056,15 +1060,15 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1056
1060
|
trackingFired.thirdQuartile = true;
|
|
1057
1061
|
fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);
|
|
1058
1062
|
}
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1063
|
+
};
|
|
1064
|
+
var onPlaying = function onPlaying() {
|
|
1061
1065
|
startStallWatchdog();
|
|
1062
1066
|
if (!currentAd || trackingFired.start) return;
|
|
1063
1067
|
trackingFired.start = true;
|
|
1064
1068
|
fireTrackingPixels(currentAd.trackingUrls.start);
|
|
1065
1069
|
console.log("[HlsAdPlayer] Ad started playing");
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1070
|
+
};
|
|
1071
|
+
var onEnded = function onEnded() {
|
|
1068
1072
|
if (!currentAd || trackingFired.complete) return;
|
|
1069
1073
|
trackingFired.complete = true;
|
|
1070
1074
|
fireTrackingPixels(currentAd.trackingUrls.complete);
|
|
@@ -1073,8 +1077,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1073
1077
|
return;
|
|
1074
1078
|
}
|
|
1075
1079
|
handleAdComplete();
|
|
1076
|
-
}
|
|
1077
|
-
|
|
1080
|
+
};
|
|
1081
|
+
var onError = function onError(e) {
|
|
1078
1082
|
if (!adPlaying) return;
|
|
1079
1083
|
console.error("[HlsAdPlayer] Ad video error:", e);
|
|
1080
1084
|
if (currentAd) {
|
|
@@ -1084,25 +1088,100 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1084
1088
|
return;
|
|
1085
1089
|
}
|
|
1086
1090
|
handleAdError();
|
|
1087
|
-
}
|
|
1088
|
-
|
|
1089
|
-
if (!currentAd) return;
|
|
1091
|
+
};
|
|
1092
|
+
var onVolumeChange = function onVolumeChange() {
|
|
1093
|
+
if (!currentAd || !adVideoElement) return;
|
|
1090
1094
|
if (adVideoElement.muted) {
|
|
1091
1095
|
fireTrackingPixels(currentAd.trackingUrls.mute);
|
|
1092
1096
|
} else {
|
|
1093
1097
|
fireTrackingPixels(currentAd.trackingUrls.unmute);
|
|
1094
1098
|
}
|
|
1095
|
-
}
|
|
1096
|
-
|
|
1097
|
-
if (currentAd && !adVideoElement.ended) {
|
|
1099
|
+
};
|
|
1100
|
+
var onPause = function onPause() {
|
|
1101
|
+
if (currentAd && adVideoElement && !adVideoElement.ended) {
|
|
1098
1102
|
fireTrackingPixels(currentAd.trackingUrls.pause);
|
|
1099
1103
|
}
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
if (currentAd && adVideoElement.currentTime > 0) {
|
|
1104
|
+
};
|
|
1105
|
+
var onPlay = function onPlay() {
|
|
1106
|
+
if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {
|
|
1103
1107
|
fireTrackingPixels(currentAd.trackingUrls.resume);
|
|
1104
1108
|
}
|
|
1105
|
-
}
|
|
1109
|
+
};
|
|
1110
|
+
adEventHandlers = [
|
|
1111
|
+
{
|
|
1112
|
+
type: "timeupdate",
|
|
1113
|
+
handler: onTimeUpdate
|
|
1114
|
+
},
|
|
1115
|
+
{
|
|
1116
|
+
type: "playing",
|
|
1117
|
+
handler: onPlaying
|
|
1118
|
+
},
|
|
1119
|
+
{
|
|
1120
|
+
type: "ended",
|
|
1121
|
+
handler: onEnded
|
|
1122
|
+
},
|
|
1123
|
+
{
|
|
1124
|
+
type: "error",
|
|
1125
|
+
handler: onError
|
|
1126
|
+
},
|
|
1127
|
+
{
|
|
1128
|
+
type: "volumechange",
|
|
1129
|
+
handler: onVolumeChange
|
|
1130
|
+
},
|
|
1131
|
+
{
|
|
1132
|
+
type: "pause",
|
|
1133
|
+
handler: onPause
|
|
1134
|
+
},
|
|
1135
|
+
{
|
|
1136
|
+
type: "play",
|
|
1137
|
+
handler: onPlay
|
|
1138
|
+
}
|
|
1139
|
+
];
|
|
1140
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1141
|
+
try {
|
|
1142
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1143
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1144
|
+
adVideoElement.addEventListener(type, handler);
|
|
1145
|
+
}
|
|
1146
|
+
} catch (err) {
|
|
1147
|
+
_didIteratorError = true;
|
|
1148
|
+
_iteratorError = err;
|
|
1149
|
+
} finally{
|
|
1150
|
+
try {
|
|
1151
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1152
|
+
_iterator.return();
|
|
1153
|
+
}
|
|
1154
|
+
} finally{
|
|
1155
|
+
if (_didIteratorError) {
|
|
1156
|
+
throw _iteratorError;
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
function teardownAdEventListeners() {
|
|
1162
|
+
if (adVideoElement) {
|
|
1163
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1164
|
+
try {
|
|
1165
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1166
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1167
|
+
adVideoElement.removeEventListener(type, handler);
|
|
1168
|
+
}
|
|
1169
|
+
} catch (err) {
|
|
1170
|
+
_didIteratorError = true;
|
|
1171
|
+
_iteratorError = err;
|
|
1172
|
+
} finally{
|
|
1173
|
+
try {
|
|
1174
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1175
|
+
_iterator.return();
|
|
1176
|
+
}
|
|
1177
|
+
} finally{
|
|
1178
|
+
if (_didIteratorError) {
|
|
1179
|
+
throw _iteratorError;
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
adEventHandlers = [];
|
|
1106
1185
|
}
|
|
1107
1186
|
function setAdPlayingFlag(isPlaying) {
|
|
1108
1187
|
if (isPlaying) {
|
|
@@ -1248,15 +1327,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1248
1327
|
adHls = void 0;
|
|
1249
1328
|
}
|
|
1250
1329
|
if (adVideoElement) {
|
|
1251
|
-
adVideoElement.pause();
|
|
1252
|
-
adVideoElement.removeAttribute("src");
|
|
1253
1330
|
try {
|
|
1331
|
+
adVideoElement.pause();
|
|
1332
|
+
adVideoElement.removeAttribute("src");
|
|
1254
1333
|
adVideoElement.load();
|
|
1255
1334
|
} catch (error) {
|
|
1256
|
-
console.warn("[HlsAdPlayer]
|
|
1335
|
+
console.warn("[HlsAdPlayer] Error releasing ad decoder:", error);
|
|
1257
1336
|
}
|
|
1258
|
-
adVideoElement.remove();
|
|
1259
|
-
adVideoElement = void 0;
|
|
1260
1337
|
}
|
|
1261
1338
|
if (adContainerEl) {
|
|
1262
1339
|
adContainerEl.style.display = "none";
|
|
@@ -1319,6 +1396,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1319
1396
|
(_contentVideo_parentElement = contentVideo.parentElement) === null || _contentVideo_parentElement === void 0 ? void 0 : _contentVideo_parentElement.appendChild(container);
|
|
1320
1397
|
adContainerEl = container;
|
|
1321
1398
|
}
|
|
1399
|
+
contentVideo[AD_CONTAINER_PROP] = adContainerEl;
|
|
1322
1400
|
},
|
|
1323
1401
|
requestAds: function requestAds(vastTagUrl) {
|
|
1324
1402
|
return _async_to_generator(function() {
|
|
@@ -1421,8 +1499,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1421
1499
|
if (!adVideoElement) {
|
|
1422
1500
|
adVideoElement = createAdVideoElement();
|
|
1423
1501
|
adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.appendChild(adVideoElement);
|
|
1424
|
-
|
|
1502
|
+
contentVideo[AD_VIDEO_PROP] = adVideoElement;
|
|
1425
1503
|
}
|
|
1504
|
+
setupAdEventListeners();
|
|
1426
1505
|
resetQuartileTracking(true);
|
|
1427
1506
|
contentVolume = contentVideo.volume;
|
|
1428
1507
|
originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
|
|
@@ -1550,11 +1629,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1550
1629
|
setAdPlayingFlag(false);
|
|
1551
1630
|
contentVideo.muted = originalMutedState;
|
|
1552
1631
|
contentVideo.volume = Math.max(0, Math.min(1, originalVolume));
|
|
1632
|
+
teardownAdEventListeners();
|
|
1553
1633
|
releaseAdDecoder();
|
|
1554
|
-
if (adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.parentElement) {
|
|
1555
|
-
adContainerEl.parentElement.removeChild(adContainerEl);
|
|
1556
|
-
}
|
|
1557
|
-
adContainerEl = void 0;
|
|
1558
1634
|
currentAd = void 0;
|
|
1559
1635
|
podAds = [];
|
|
1560
1636
|
podIndex = 0;
|
|
@@ -3967,6 +4043,11 @@ function detectBrowser() {
|
|
|
3967
4043
|
chromeVersion: chromeVersionNum
|
|
3968
4044
|
};
|
|
3969
4045
|
}
|
|
4046
|
+
function requiresMediaPipelineResetAfterAds() {
|
|
4047
|
+
var _browser_tizenVersion;
|
|
4048
|
+
var browser = detectBrowser();
|
|
4049
|
+
return browser.name === "Samsung Tizen" && ((_browser_tizenVersion = browser.tizenVersion) !== null && _browser_tizenVersion !== void 0 ? _browser_tizenVersion : 0) >= 5;
|
|
4050
|
+
}
|
|
3970
4051
|
function getBrowserConfigOverrides() {
|
|
3971
4052
|
var browser = detectBrowser();
|
|
3972
4053
|
var overrides = {};
|
|
@@ -6728,30 +6809,49 @@ var HlsEngine = /*#__PURE__*/ function() {
|
|
|
6728
6809
|
{
|
|
6729
6810
|
key: "reloadLiveStream",
|
|
6730
6811
|
value: function reloadLiveStream() {
|
|
6812
|
+
var _this = this;
|
|
6731
6813
|
var hls = this.hls;
|
|
6732
6814
|
if (!hls) {
|
|
6733
6815
|
return;
|
|
6734
6816
|
}
|
|
6735
6817
|
if (this.debug) {
|
|
6736
|
-
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (
|
|
6818
|
+
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \u2192 reset video \u2192 fresh setupHls)");
|
|
6737
6819
|
}
|
|
6738
6820
|
try {
|
|
6739
6821
|
this.reloadingLiveStream = true;
|
|
6740
6822
|
hls.stopLoad();
|
|
6741
6823
|
hls.detachMedia();
|
|
6824
|
+
hls.destroy();
|
|
6825
|
+
this.hls = void 0;
|
|
6742
6826
|
try {
|
|
6743
6827
|
this.video.removeAttribute("src");
|
|
6744
6828
|
this.video.load();
|
|
6745
6829
|
} catch (error) {
|
|
6746
6830
|
console.warn("[StormcloudVideoPlayer] video.load() threw after src removal:", error);
|
|
6747
6831
|
}
|
|
6748
|
-
hls.attachMedia(this.video);
|
|
6749
6832
|
} catch (error) {
|
|
6750
6833
|
this.reloadingLiveStream = false;
|
|
6834
|
+
this.hls = void 0;
|
|
6751
6835
|
if (this.debug) {
|
|
6752
|
-
console.warn("[StormcloudVideoPlayer] Failed to hard-reload
|
|
6836
|
+
console.warn("[StormcloudVideoPlayer] Failed to tear down during hard-reload:", error);
|
|
6753
6837
|
}
|
|
6838
|
+
return;
|
|
6754
6839
|
}
|
|
6840
|
+
var recreateDelayMs = 600;
|
|
6841
|
+
window.setTimeout(function() {
|
|
6842
|
+
if (_this.hls) {
|
|
6843
|
+
_this.reloadingLiveStream = false;
|
|
6844
|
+
return;
|
|
6845
|
+
}
|
|
6846
|
+
try {
|
|
6847
|
+
_this.setupHls();
|
|
6848
|
+
} catch (error) {
|
|
6849
|
+
_this.reloadingLiveStream = false;
|
|
6850
|
+
if (_this.debug) {
|
|
6851
|
+
console.warn("[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:", error);
|
|
6852
|
+
}
|
|
6853
|
+
}
|
|
6854
|
+
}, recreateDelayMs);
|
|
6755
6855
|
}
|
|
6756
6856
|
},
|
|
6757
6857
|
{
|
|
@@ -8064,6 +8164,14 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8064
8164
|
this.host.video.style.visibility = "visible";
|
|
8065
8165
|
this.host.video.style.opacity = "1";
|
|
8066
8166
|
if (this.host.isLiveStream()) {
|
|
8167
|
+
if (this.host.requiresMediaPipelineResetAfterAds()) {
|
|
8168
|
+
if (this.debug) {
|
|
8169
|
+
console.log("[StormcloudVideoPlayer] Live break end \u2014 hard-reloading stream to reacquire decoder (single-decoder platform)");
|
|
8170
|
+
}
|
|
8171
|
+
this.host.reloadLiveStream();
|
|
8172
|
+
this.monitorLiveResumeStall(this.host.video.currentTime);
|
|
8173
|
+
return;
|
|
8174
|
+
}
|
|
8067
8175
|
var liveSyncPos = this.host.getLiveSyncPosition();
|
|
8068
8176
|
if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {
|
|
8069
8177
|
if (this.debug) {
|
|
@@ -8125,9 +8233,10 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8125
8233
|
key: "monitorLiveResumeStall",
|
|
8126
8234
|
value: function monitorLiveResumeStall(resumeBaseline) {
|
|
8127
8235
|
var _this = this;
|
|
8236
|
+
var needsReset = this.host.requiresMediaPipelineResetAfterAds();
|
|
8128
8237
|
var pollIntervalMs = 1e3;
|
|
8129
|
-
var graceMs = 5e3;
|
|
8130
|
-
var recoveryCooldownMs = 5e3;
|
|
8238
|
+
var graceMs = needsReset ? 8e3 : 5e3;
|
|
8239
|
+
var recoveryCooldownMs = needsReset ? 7e3 : 5e3;
|
|
8131
8240
|
var maxRecoveries = 3;
|
|
8132
8241
|
var maxMonitorMs = 45e3;
|
|
8133
8242
|
var startTime = Date.now();
|
|
@@ -8241,7 +8350,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8241
8350
|
if (canRecover) {
|
|
8242
8351
|
recoveries++;
|
|
8243
8352
|
lastRecoveryAt = Date.now();
|
|
8244
|
-
if (
|
|
8353
|
+
if (needsReset) {
|
|
8354
|
+
if (_this.debug) {
|
|
8355
|
+
console.warn("[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8356
|
+
}
|
|
8357
|
+
_this.host.reloadLiveStream();
|
|
8358
|
+
} else if (recoveries === 1) {
|
|
8245
8359
|
if (_this.debug) {
|
|
8246
8360
|
console.warn("[StormcloudVideoPlayer] Content wedged after ad break — calling recoverMediaError() (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8247
8361
|
}
|
|
@@ -8454,6 +8568,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8454
8568
|
recoverMediaError: function recoverMediaError() {
|
|
8455
8569
|
return _this.hlsEngine.recoverMediaError();
|
|
8456
8570
|
},
|
|
8571
|
+
requiresMediaPipelineResetAfterAds: function requiresMediaPipelineResetAfterAds1() {
|
|
8572
|
+
return requiresMediaPipelineResetAfterAds();
|
|
8573
|
+
},
|
|
8457
8574
|
generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
|
|
8458
8575
|
return _this.generatePodVastUrl(base, breakDurationMs);
|
|
8459
8576
|
}
|