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
|
@@ -402,15 +402,19 @@ var import_react = require("react");
|
|
|
402
402
|
var import_hls = __toESM(require("hls.js"), 1);
|
|
403
403
|
var MAX_VAST_WRAPPER_DEPTH = 5;
|
|
404
404
|
function createHlsAdPlayer(contentVideo, options) {
|
|
405
|
+
var _contentVideo_AD_VIDEO_PROP, _contentVideo_AD_CONTAINER_PROP;
|
|
405
406
|
var adPlaying = false;
|
|
406
407
|
var originalMutedState = false;
|
|
407
408
|
var originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));
|
|
408
409
|
var listeners = /* @__PURE__ */ new Map();
|
|
409
410
|
var licenseKey = options === null || options === void 0 ? void 0 : options.licenseKey;
|
|
410
411
|
var mainHlsInstance = options === null || options === void 0 ? void 0 : options.mainHlsInstance;
|
|
411
|
-
var
|
|
412
|
+
var AD_CONTAINER_PROP = "__stormcloudAdContainer";
|
|
413
|
+
var AD_VIDEO_PROP = "__stormcloudAdVideo";
|
|
414
|
+
var adVideoElement = (_contentVideo_AD_VIDEO_PROP = contentVideo[AD_VIDEO_PROP]) !== null && _contentVideo_AD_VIDEO_PROP !== void 0 ? _contentVideo_AD_VIDEO_PROP : void 0;
|
|
412
415
|
var adHls;
|
|
413
|
-
var adContainerEl;
|
|
416
|
+
var adContainerEl = (_contentVideo_AD_CONTAINER_PROP = contentVideo[AD_CONTAINER_PROP]) !== null && _contentVideo_AD_CONTAINER_PROP !== void 0 ? _contentVideo_AD_CONTAINER_PROP : void 0;
|
|
417
|
+
var adEventHandlers = [];
|
|
414
418
|
var currentAd;
|
|
415
419
|
var podAds = [];
|
|
416
420
|
var podIndex = 0;
|
|
@@ -565,6 +569,56 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
565
569
|
var url = mediaFile.url.toLowerCase();
|
|
566
570
|
return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
|
|
567
571
|
}
|
|
572
|
+
function isAudioMediaFile(mediaFile) {
|
|
573
|
+
var type = mediaFile.type.toLowerCase();
|
|
574
|
+
var url = (mediaFile.url.toLowerCase().split("?")[0] || "").trim();
|
|
575
|
+
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");
|
|
576
|
+
}
|
|
577
|
+
function collectVideoMediaFiles(scope, verbose) {
|
|
578
|
+
var mediaFileElements = scope.querySelectorAll("MediaFile");
|
|
579
|
+
var mediaFiles = [];
|
|
580
|
+
if (verbose) {
|
|
581
|
+
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
582
|
+
}
|
|
583
|
+
mediaFileElements.forEach(function(mf, index) {
|
|
584
|
+
var _mf_textContent;
|
|
585
|
+
var type = mf.getAttribute("type") || "";
|
|
586
|
+
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
587
|
+
var width = mf.getAttribute("width") || "";
|
|
588
|
+
var height = mf.getAttribute("height") || "";
|
|
589
|
+
if (verbose) {
|
|
590
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
591
|
+
}
|
|
592
|
+
if (!url) {
|
|
593
|
+
if (verbose) {
|
|
594
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
595
|
+
}
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
var bitrateAttr = mf.getAttribute("bitrate");
|
|
599
|
+
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
600
|
+
var mediaFile = {
|
|
601
|
+
url: url,
|
|
602
|
+
type: type,
|
|
603
|
+
width: parseInt(width || "1920", 10),
|
|
604
|
+
height: parseInt(height || "1080", 10),
|
|
605
|
+
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
606
|
+
};
|
|
607
|
+
if (isAudioMediaFile(mediaFile)) {
|
|
608
|
+
console.warn("[HlsAdPlayer] MediaFile ".concat(index, ' skipped (audio-only, type="').concat(type, '") — audio ads are not played to avoid a black screen'));
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
612
|
+
mediaFiles.push(mediaFile);
|
|
613
|
+
if (verbose) {
|
|
614
|
+
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
615
|
+
}
|
|
616
|
+
} else if (verbose) {
|
|
617
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
return mediaFiles;
|
|
621
|
+
}
|
|
568
622
|
function createEmptyTrackingUrls() {
|
|
569
623
|
return {
|
|
570
624
|
impression: [],
|
|
@@ -652,37 +706,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
652
706
|
var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
|
|
653
707
|
var durationParts = durationText.split(":");
|
|
654
708
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
655
|
-
var
|
|
656
|
-
var mediaFiles = [];
|
|
657
|
-
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
658
|
-
mediaFileElements.forEach(function(mf, index) {
|
|
659
|
-
var _mf_textContent;
|
|
660
|
-
var type = mf.getAttribute("type") || "";
|
|
661
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
662
|
-
var width = mf.getAttribute("width") || "";
|
|
663
|
-
var height = mf.getAttribute("height") || "";
|
|
664
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
665
|
-
var mediaFile = {
|
|
666
|
-
url: url,
|
|
667
|
-
type: type,
|
|
668
|
-
width: parseInt(width || "1920", 10),
|
|
669
|
-
height: parseInt(height || "1080", 10),
|
|
670
|
-
bitrate: void 0
|
|
671
|
-
};
|
|
672
|
-
if (!url) {
|
|
673
|
-
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has empty URL"));
|
|
674
|
-
return;
|
|
675
|
-
}
|
|
676
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
677
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
678
|
-
mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;
|
|
679
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
680
|
-
mediaFiles.push(mediaFile);
|
|
681
|
-
console.log("[HlsAdPlayer] Added ".concat(isHlsMediaFile(mediaFile) ? "HLS" : "progressive", " MediaFile: ").concat(url));
|
|
682
|
-
} else {
|
|
683
|
-
console.log("[HlsAdPlayer] MediaFile ".concat(index, ' ignored (type="').concat(type, '" is not supported)'));
|
|
684
|
-
}
|
|
685
|
-
});
|
|
709
|
+
var mediaFiles = collectVideoMediaFiles(xmlDoc, true);
|
|
686
710
|
if (mediaFiles.length === 0) {
|
|
687
711
|
if (isNoAdAvailable) {
|
|
688
712
|
console.warn("[HlsAdPlayer] No ads available (VAST response indicates no ads)");
|
|
@@ -730,28 +754,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
730
754
|
var durationText = ((_adElement_querySelector3 = adElement.querySelector("Duration")) === null || _adElement_querySelector3 === void 0 ? void 0 : _adElement_querySelector3.textContent) || "00:00:30";
|
|
731
755
|
var durationParts = durationText.split(":");
|
|
732
756
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
733
|
-
var
|
|
734
|
-
var mediaFiles = [];
|
|
735
|
-
mediaFileElements.forEach(function(mf) {
|
|
736
|
-
var _mf_textContent;
|
|
737
|
-
var type = mf.getAttribute("type") || "";
|
|
738
|
-
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
739
|
-
var width = mf.getAttribute("width") || "";
|
|
740
|
-
var height = mf.getAttribute("height") || "";
|
|
741
|
-
if (!url) return;
|
|
742
|
-
var bitrateAttr = mf.getAttribute("bitrate");
|
|
743
|
-
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
744
|
-
var mediaFile = {
|
|
745
|
-
url: url,
|
|
746
|
-
type: type,
|
|
747
|
-
width: parseInt(width || "1920", 10),
|
|
748
|
-
height: parseInt(height || "1080", 10),
|
|
749
|
-
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
750
|
-
};
|
|
751
|
-
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
752
|
-
mediaFiles.push(mediaFile);
|
|
753
|
-
}
|
|
754
|
-
});
|
|
757
|
+
var mediaFiles = collectVideoMediaFiles(adElement, false);
|
|
755
758
|
if (mediaFiles.length === 0) {
|
|
756
759
|
if (isNoAdAvailable) {
|
|
757
760
|
console.warn("[HlsAdPlayer] Pod <Ad> indicates no ad available");
|
|
@@ -1054,7 +1057,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1054
1057
|
}
|
|
1055
1058
|
function setupAdEventListeners() {
|
|
1056
1059
|
if (!adVideoElement || !currentAd) return;
|
|
1057
|
-
|
|
1060
|
+
if (adEventHandlers.length > 0) return;
|
|
1061
|
+
var onTimeUpdate = function onTimeUpdate() {
|
|
1058
1062
|
if (!currentAd || !adVideoElement) return;
|
|
1059
1063
|
noteAdProgress();
|
|
1060
1064
|
var progress = adVideoElement.currentTime / currentAd.duration;
|
|
@@ -1070,15 +1074,15 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1070
1074
|
trackingFired.thirdQuartile = true;
|
|
1071
1075
|
fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);
|
|
1072
1076
|
}
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1077
|
+
};
|
|
1078
|
+
var onPlaying = function onPlaying() {
|
|
1075
1079
|
startStallWatchdog();
|
|
1076
1080
|
if (!currentAd || trackingFired.start) return;
|
|
1077
1081
|
trackingFired.start = true;
|
|
1078
1082
|
fireTrackingPixels(currentAd.trackingUrls.start);
|
|
1079
1083
|
console.log("[HlsAdPlayer] Ad started playing");
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1084
|
+
};
|
|
1085
|
+
var onEnded = function onEnded() {
|
|
1082
1086
|
if (!currentAd || trackingFired.complete) return;
|
|
1083
1087
|
trackingFired.complete = true;
|
|
1084
1088
|
fireTrackingPixels(currentAd.trackingUrls.complete);
|
|
@@ -1087,8 +1091,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1087
1091
|
return;
|
|
1088
1092
|
}
|
|
1089
1093
|
handleAdComplete();
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1094
|
+
};
|
|
1095
|
+
var onError = function onError(e) {
|
|
1092
1096
|
if (!adPlaying) return;
|
|
1093
1097
|
console.error("[HlsAdPlayer] Ad video error:", e);
|
|
1094
1098
|
if (currentAd) {
|
|
@@ -1098,25 +1102,100 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1098
1102
|
return;
|
|
1099
1103
|
}
|
|
1100
1104
|
handleAdError();
|
|
1101
|
-
}
|
|
1102
|
-
|
|
1103
|
-
if (!currentAd) return;
|
|
1105
|
+
};
|
|
1106
|
+
var onVolumeChange = function onVolumeChange() {
|
|
1107
|
+
if (!currentAd || !adVideoElement) return;
|
|
1104
1108
|
if (adVideoElement.muted) {
|
|
1105
1109
|
fireTrackingPixels(currentAd.trackingUrls.mute);
|
|
1106
1110
|
} else {
|
|
1107
1111
|
fireTrackingPixels(currentAd.trackingUrls.unmute);
|
|
1108
1112
|
}
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1111
|
-
if (currentAd && !adVideoElement.ended) {
|
|
1113
|
+
};
|
|
1114
|
+
var onPause = function onPause() {
|
|
1115
|
+
if (currentAd && adVideoElement && !adVideoElement.ended) {
|
|
1112
1116
|
fireTrackingPixels(currentAd.trackingUrls.pause);
|
|
1113
1117
|
}
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
if (currentAd && adVideoElement.currentTime > 0) {
|
|
1118
|
+
};
|
|
1119
|
+
var onPlay = function onPlay() {
|
|
1120
|
+
if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {
|
|
1117
1121
|
fireTrackingPixels(currentAd.trackingUrls.resume);
|
|
1118
1122
|
}
|
|
1119
|
-
}
|
|
1123
|
+
};
|
|
1124
|
+
adEventHandlers = [
|
|
1125
|
+
{
|
|
1126
|
+
type: "timeupdate",
|
|
1127
|
+
handler: onTimeUpdate
|
|
1128
|
+
},
|
|
1129
|
+
{
|
|
1130
|
+
type: "playing",
|
|
1131
|
+
handler: onPlaying
|
|
1132
|
+
},
|
|
1133
|
+
{
|
|
1134
|
+
type: "ended",
|
|
1135
|
+
handler: onEnded
|
|
1136
|
+
},
|
|
1137
|
+
{
|
|
1138
|
+
type: "error",
|
|
1139
|
+
handler: onError
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
type: "volumechange",
|
|
1143
|
+
handler: onVolumeChange
|
|
1144
|
+
},
|
|
1145
|
+
{
|
|
1146
|
+
type: "pause",
|
|
1147
|
+
handler: onPause
|
|
1148
|
+
},
|
|
1149
|
+
{
|
|
1150
|
+
type: "play",
|
|
1151
|
+
handler: onPlay
|
|
1152
|
+
}
|
|
1153
|
+
];
|
|
1154
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1155
|
+
try {
|
|
1156
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1157
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1158
|
+
adVideoElement.addEventListener(type, handler);
|
|
1159
|
+
}
|
|
1160
|
+
} catch (err) {
|
|
1161
|
+
_didIteratorError = true;
|
|
1162
|
+
_iteratorError = err;
|
|
1163
|
+
} finally{
|
|
1164
|
+
try {
|
|
1165
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1166
|
+
_iterator.return();
|
|
1167
|
+
}
|
|
1168
|
+
} finally{
|
|
1169
|
+
if (_didIteratorError) {
|
|
1170
|
+
throw _iteratorError;
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
function teardownAdEventListeners() {
|
|
1176
|
+
if (adVideoElement) {
|
|
1177
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1178
|
+
try {
|
|
1179
|
+
for(var _iterator = adEventHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1180
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
1181
|
+
adVideoElement.removeEventListener(type, handler);
|
|
1182
|
+
}
|
|
1183
|
+
} catch (err) {
|
|
1184
|
+
_didIteratorError = true;
|
|
1185
|
+
_iteratorError = err;
|
|
1186
|
+
} finally{
|
|
1187
|
+
try {
|
|
1188
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1189
|
+
_iterator.return();
|
|
1190
|
+
}
|
|
1191
|
+
} finally{
|
|
1192
|
+
if (_didIteratorError) {
|
|
1193
|
+
throw _iteratorError;
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
adEventHandlers = [];
|
|
1120
1199
|
}
|
|
1121
1200
|
function setAdPlayingFlag(isPlaying) {
|
|
1122
1201
|
if (isPlaying) {
|
|
@@ -1262,15 +1341,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1262
1341
|
adHls = void 0;
|
|
1263
1342
|
}
|
|
1264
1343
|
if (adVideoElement) {
|
|
1265
|
-
adVideoElement.pause();
|
|
1266
|
-
adVideoElement.removeAttribute("src");
|
|
1267
1344
|
try {
|
|
1345
|
+
adVideoElement.pause();
|
|
1346
|
+
adVideoElement.removeAttribute("src");
|
|
1268
1347
|
adVideoElement.load();
|
|
1269
1348
|
} catch (error) {
|
|
1270
|
-
console.warn("[HlsAdPlayer]
|
|
1349
|
+
console.warn("[HlsAdPlayer] Error releasing ad decoder:", error);
|
|
1271
1350
|
}
|
|
1272
|
-
adVideoElement.remove();
|
|
1273
|
-
adVideoElement = void 0;
|
|
1274
1351
|
}
|
|
1275
1352
|
if (adContainerEl) {
|
|
1276
1353
|
adContainerEl.style.display = "none";
|
|
@@ -1333,6 +1410,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1333
1410
|
(_contentVideo_parentElement = contentVideo.parentElement) === null || _contentVideo_parentElement === void 0 ? void 0 : _contentVideo_parentElement.appendChild(container);
|
|
1334
1411
|
adContainerEl = container;
|
|
1335
1412
|
}
|
|
1413
|
+
contentVideo[AD_CONTAINER_PROP] = adContainerEl;
|
|
1336
1414
|
},
|
|
1337
1415
|
requestAds: function requestAds(vastTagUrl) {
|
|
1338
1416
|
return _async_to_generator(function() {
|
|
@@ -1435,8 +1513,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1435
1513
|
if (!adVideoElement) {
|
|
1436
1514
|
adVideoElement = createAdVideoElement();
|
|
1437
1515
|
adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.appendChild(adVideoElement);
|
|
1438
|
-
|
|
1516
|
+
contentVideo[AD_VIDEO_PROP] = adVideoElement;
|
|
1439
1517
|
}
|
|
1518
|
+
setupAdEventListeners();
|
|
1440
1519
|
resetQuartileTracking(true);
|
|
1441
1520
|
contentVolume = contentVideo.volume;
|
|
1442
1521
|
originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
|
|
@@ -1564,11 +1643,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1564
1643
|
setAdPlayingFlag(false);
|
|
1565
1644
|
contentVideo.muted = originalMutedState;
|
|
1566
1645
|
contentVideo.volume = Math.max(0, Math.min(1, originalVolume));
|
|
1646
|
+
teardownAdEventListeners();
|
|
1567
1647
|
releaseAdDecoder();
|
|
1568
|
-
if (adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.parentElement) {
|
|
1569
|
-
adContainerEl.parentElement.removeChild(adContainerEl);
|
|
1570
|
-
}
|
|
1571
|
-
adContainerEl = void 0;
|
|
1572
1648
|
currentAd = void 0;
|
|
1573
1649
|
podAds = [];
|
|
1574
1650
|
podIndex = 0;
|
|
@@ -3981,6 +4057,11 @@ function detectBrowser() {
|
|
|
3981
4057
|
chromeVersion: chromeVersionNum
|
|
3982
4058
|
};
|
|
3983
4059
|
}
|
|
4060
|
+
function requiresMediaPipelineResetAfterAds() {
|
|
4061
|
+
var _browser_tizenVersion;
|
|
4062
|
+
var browser = detectBrowser();
|
|
4063
|
+
return browser.name === "Samsung Tizen" && ((_browser_tizenVersion = browser.tizenVersion) !== null && _browser_tizenVersion !== void 0 ? _browser_tizenVersion : 0) >= 5;
|
|
4064
|
+
}
|
|
3984
4065
|
function getBrowserConfigOverrides() {
|
|
3985
4066
|
var browser = detectBrowser();
|
|
3986
4067
|
var overrides = {};
|
|
@@ -6742,30 +6823,49 @@ var HlsEngine = /*#__PURE__*/ function() {
|
|
|
6742
6823
|
{
|
|
6743
6824
|
key: "reloadLiveStream",
|
|
6744
6825
|
value: function reloadLiveStream() {
|
|
6826
|
+
var _this = this;
|
|
6745
6827
|
var hls = this.hls;
|
|
6746
6828
|
if (!hls) {
|
|
6747
6829
|
return;
|
|
6748
6830
|
}
|
|
6749
6831
|
if (this.debug) {
|
|
6750
|
-
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (
|
|
6832
|
+
console.log("[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \u2192 reset video \u2192 fresh setupHls)");
|
|
6751
6833
|
}
|
|
6752
6834
|
try {
|
|
6753
6835
|
this.reloadingLiveStream = true;
|
|
6754
6836
|
hls.stopLoad();
|
|
6755
6837
|
hls.detachMedia();
|
|
6838
|
+
hls.destroy();
|
|
6839
|
+
this.hls = void 0;
|
|
6756
6840
|
try {
|
|
6757
6841
|
this.video.removeAttribute("src");
|
|
6758
6842
|
this.video.load();
|
|
6759
6843
|
} catch (error) {
|
|
6760
6844
|
console.warn("[StormcloudVideoPlayer] video.load() threw after src removal:", error);
|
|
6761
6845
|
}
|
|
6762
|
-
hls.attachMedia(this.video);
|
|
6763
6846
|
} catch (error) {
|
|
6764
6847
|
this.reloadingLiveStream = false;
|
|
6848
|
+
this.hls = void 0;
|
|
6765
6849
|
if (this.debug) {
|
|
6766
|
-
console.warn("[StormcloudVideoPlayer] Failed to hard-reload
|
|
6850
|
+
console.warn("[StormcloudVideoPlayer] Failed to tear down during hard-reload:", error);
|
|
6767
6851
|
}
|
|
6852
|
+
return;
|
|
6768
6853
|
}
|
|
6854
|
+
var recreateDelayMs = 600;
|
|
6855
|
+
window.setTimeout(function() {
|
|
6856
|
+
if (_this.hls) {
|
|
6857
|
+
_this.reloadingLiveStream = false;
|
|
6858
|
+
return;
|
|
6859
|
+
}
|
|
6860
|
+
try {
|
|
6861
|
+
_this.setupHls();
|
|
6862
|
+
} catch (error) {
|
|
6863
|
+
_this.reloadingLiveStream = false;
|
|
6864
|
+
if (_this.debug) {
|
|
6865
|
+
console.warn("[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:", error);
|
|
6866
|
+
}
|
|
6867
|
+
}
|
|
6868
|
+
}, recreateDelayMs);
|
|
6769
6869
|
}
|
|
6770
6870
|
},
|
|
6771
6871
|
{
|
|
@@ -8078,6 +8178,14 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8078
8178
|
this.host.video.style.visibility = "visible";
|
|
8079
8179
|
this.host.video.style.opacity = "1";
|
|
8080
8180
|
if (this.host.isLiveStream()) {
|
|
8181
|
+
if (this.host.requiresMediaPipelineResetAfterAds()) {
|
|
8182
|
+
if (this.debug) {
|
|
8183
|
+
console.log("[StormcloudVideoPlayer] Live break end \u2014 hard-reloading stream to reacquire decoder (single-decoder platform)");
|
|
8184
|
+
}
|
|
8185
|
+
this.host.reloadLiveStream();
|
|
8186
|
+
this.monitorLiveResumeStall(this.host.video.currentTime);
|
|
8187
|
+
return;
|
|
8188
|
+
}
|
|
8081
8189
|
var liveSyncPos = this.host.getLiveSyncPosition();
|
|
8082
8190
|
if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {
|
|
8083
8191
|
if (this.debug) {
|
|
@@ -8139,9 +8247,10 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8139
8247
|
key: "monitorLiveResumeStall",
|
|
8140
8248
|
value: function monitorLiveResumeStall(resumeBaseline) {
|
|
8141
8249
|
var _this = this;
|
|
8250
|
+
var needsReset = this.host.requiresMediaPipelineResetAfterAds();
|
|
8142
8251
|
var pollIntervalMs = 1e3;
|
|
8143
|
-
var graceMs = 5e3;
|
|
8144
|
-
var recoveryCooldownMs = 5e3;
|
|
8252
|
+
var graceMs = needsReset ? 8e3 : 5e3;
|
|
8253
|
+
var recoveryCooldownMs = needsReset ? 7e3 : 5e3;
|
|
8145
8254
|
var maxRecoveries = 3;
|
|
8146
8255
|
var maxMonitorMs = 45e3;
|
|
8147
8256
|
var startTime = Date.now();
|
|
@@ -8255,7 +8364,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
8255
8364
|
if (canRecover) {
|
|
8256
8365
|
recoveries++;
|
|
8257
8366
|
lastRecoveryAt = Date.now();
|
|
8258
|
-
if (
|
|
8367
|
+
if (needsReset) {
|
|
8368
|
+
if (_this.debug) {
|
|
8369
|
+
console.warn("[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8370
|
+
}
|
|
8371
|
+
_this.host.reloadLiveStream();
|
|
8372
|
+
} else if (recoveries === 1) {
|
|
8259
8373
|
if (_this.debug) {
|
|
8260
8374
|
console.warn("[StormcloudVideoPlayer] Content wedged after ad break — calling recoverMediaError() (recovery ".concat(recoveries, "/").concat(maxRecoveries, ") — ").concat(_this.describeVideoState()));
|
|
8261
8375
|
}
|
|
@@ -8468,6 +8582,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8468
8582
|
recoverMediaError: function recoverMediaError() {
|
|
8469
8583
|
return _this.hlsEngine.recoverMediaError();
|
|
8470
8584
|
},
|
|
8585
|
+
requiresMediaPipelineResetAfterAds: function requiresMediaPipelineResetAfterAds1() {
|
|
8586
|
+
return requiresMediaPipelineResetAfterAds();
|
|
8587
|
+
},
|
|
8471
8588
|
generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
|
|
8472
8589
|
return _this.generatePodVastUrl(base, breakDurationMs);
|
|
8473
8590
|
}
|