stormcloud-video-player 0.8.25 → 0.8.26
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 +631 -115
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +7 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +631 -115
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +198 -41
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +4 -1
- package/lib/player/AdConfigManager.cjs +61 -1
- package/lib/player/AdConfigManager.cjs.map +1 -1
- package/lib/player/AdConfigManager.d.cts +12 -1
- package/lib/player/AdPreloadPool.d.cts +1 -1
- package/lib/player/AdTimingService.cjs +7 -0
- package/lib/player/AdTimingService.cjs.map +1 -1
- package/lib/player/AdTimingService.d.cts +2 -1
- package/lib/player/HlsEngine.d.cts +1 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +631 -115
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +2 -1
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/HlsPlayer.cjs +631 -115
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +631 -115
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +343 -71
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/{types-Bz4aRmzc.d.cts → types-Xgz2_W1C.d.cts} +6 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +631 -115
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/vastMacros.cjs +14 -1
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/lib/utils/vastMacros.d.cts +3 -0
- package/package.json +1 -1
package/lib/index.cjs
CHANGED
|
@@ -599,6 +599,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
599
599
|
var adHls;
|
|
600
600
|
var adContainerEl;
|
|
601
601
|
var currentAd;
|
|
602
|
+
var podAds = [];
|
|
603
|
+
var podIndex = 0;
|
|
602
604
|
var sessionId;
|
|
603
605
|
var preloadedAds = /* @__PURE__ */ new Map();
|
|
604
606
|
var preloadingAds = /* @__PURE__ */ new Map();
|
|
@@ -763,14 +765,14 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
763
765
|
error: []
|
|
764
766
|
};
|
|
765
767
|
}
|
|
766
|
-
function extractTrackingUrls(
|
|
768
|
+
function extractTrackingUrls(scope) {
|
|
767
769
|
var trackingUrls = createEmptyTrackingUrls();
|
|
768
|
-
|
|
770
|
+
scope.querySelectorAll("Impression").forEach(function(el) {
|
|
769
771
|
var _el_textContent;
|
|
770
772
|
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
771
773
|
if (url) trackingUrls.impression.push(url);
|
|
772
774
|
});
|
|
773
|
-
|
|
775
|
+
scope.querySelectorAll("Tracking").forEach(function(el) {
|
|
774
776
|
var _el_textContent;
|
|
775
777
|
var event = el.getAttribute("event");
|
|
776
778
|
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
@@ -781,7 +783,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
781
783
|
}
|
|
782
784
|
}
|
|
783
785
|
});
|
|
784
|
-
|
|
786
|
+
scope.querySelectorAll("Error").forEach(function(el) {
|
|
785
787
|
var _el_textContent;
|
|
786
788
|
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
787
789
|
if (url) trackingUrls.error.push(url);
|
|
@@ -891,6 +893,75 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
891
893
|
};
|
|
892
894
|
}
|
|
893
895
|
}
|
|
896
|
+
function parseAdElement(adElement) {
|
|
897
|
+
try {
|
|
898
|
+
var _adElement_querySelector, _adElement_querySelector_textContent, _adElement_querySelector1, _adElement_querySelector_textContent1, _adElement_querySelector2, _adElement_querySelector3;
|
|
899
|
+
var adId = adElement.getAttribute("id") || "unknown";
|
|
900
|
+
var title = ((_adElement_querySelector = adElement.querySelector("AdTitle")) === null || _adElement_querySelector === void 0 ? void 0 : _adElement_querySelector.textContent) || "Ad";
|
|
901
|
+
var clickThrough = (_adElement_querySelector1 = adElement.querySelector("ClickThrough")) === null || _adElement_querySelector1 === void 0 ? void 0 : (_adElement_querySelector_textContent = _adElement_querySelector1.textContent) === null || _adElement_querySelector_textContent === void 0 ? void 0 : _adElement_querySelector_textContent.trim();
|
|
902
|
+
var wrapperUri = (_adElement_querySelector2 = adElement.querySelector("VASTAdTagURI")) === null || _adElement_querySelector2 === void 0 ? void 0 : (_adElement_querySelector_textContent1 = _adElement_querySelector2.textContent) === null || _adElement_querySelector_textContent1 === void 0 ? void 0 : _adElement_querySelector_textContent1.trim();
|
|
903
|
+
if (wrapperUri) {
|
|
904
|
+
return {
|
|
905
|
+
type: "wrapper",
|
|
906
|
+
vastAdTagUri: wrapperUri,
|
|
907
|
+
trackingUrls: extractTrackingUrls(adElement),
|
|
908
|
+
clickThrough: clickThrough
|
|
909
|
+
};
|
|
910
|
+
}
|
|
911
|
+
var isNoAdAvailable = adId === "empty" || title.toLowerCase().includes("no ad available") || title.toLowerCase() === "no ad available";
|
|
912
|
+
var durationText = ((_adElement_querySelector3 = adElement.querySelector("Duration")) === null || _adElement_querySelector3 === void 0 ? void 0 : _adElement_querySelector3.textContent) || "00:00:30";
|
|
913
|
+
var durationParts = durationText.split(":");
|
|
914
|
+
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
915
|
+
var mediaFileElements = adElement.querySelectorAll("MediaFile");
|
|
916
|
+
var mediaFiles = [];
|
|
917
|
+
mediaFileElements.forEach(function(mf) {
|
|
918
|
+
var _mf_textContent;
|
|
919
|
+
var type = mf.getAttribute("type") || "";
|
|
920
|
+
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
921
|
+
var width = mf.getAttribute("width") || "";
|
|
922
|
+
var height = mf.getAttribute("height") || "";
|
|
923
|
+
if (!url) return;
|
|
924
|
+
var bitrateAttr = mf.getAttribute("bitrate");
|
|
925
|
+
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
926
|
+
var mediaFile = {
|
|
927
|
+
url: url,
|
|
928
|
+
type: type,
|
|
929
|
+
width: parseInt(width || "1920", 10),
|
|
930
|
+
height: parseInt(height || "1080", 10),
|
|
931
|
+
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
932
|
+
};
|
|
933
|
+
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
934
|
+
mediaFiles.push(mediaFile);
|
|
935
|
+
}
|
|
936
|
+
});
|
|
937
|
+
if (mediaFiles.length === 0) {
|
|
938
|
+
if (isNoAdAvailable) {
|
|
939
|
+
console.warn("[HlsAdPlayer] Pod <Ad> indicates no ad available");
|
|
940
|
+
} else {
|
|
941
|
+
console.warn("[HlsAdPlayer] No supported media files in pod <Ad>");
|
|
942
|
+
}
|
|
943
|
+
return {
|
|
944
|
+
type: "empty"
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
return {
|
|
948
|
+
type: "inline",
|
|
949
|
+
ad: {
|
|
950
|
+
id: adId,
|
|
951
|
+
title: title,
|
|
952
|
+
duration: duration,
|
|
953
|
+
mediaFiles: mediaFiles,
|
|
954
|
+
trackingUrls: extractTrackingUrls(adElement),
|
|
955
|
+
clickThrough: clickThrough
|
|
956
|
+
}
|
|
957
|
+
};
|
|
958
|
+
} catch (error) {
|
|
959
|
+
console.error("[HlsAdPlayer] Error parsing pod <Ad> element:", error);
|
|
960
|
+
return {
|
|
961
|
+
type: "empty"
|
|
962
|
+
};
|
|
963
|
+
}
|
|
964
|
+
}
|
|
894
965
|
function fetchVastXml(vastTagUrl) {
|
|
895
966
|
return _async_to_generator(function() {
|
|
896
967
|
var response;
|
|
@@ -967,6 +1038,146 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
967
1038
|
});
|
|
968
1039
|
}).apply(this, arguments);
|
|
969
1040
|
}
|
|
1041
|
+
function fetchAndParsePod(vastTagUrl) {
|
|
1042
|
+
return _async_to_generator(function() {
|
|
1043
|
+
var vastXml, parser, xmlDoc, adElements, ads, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, adElement, parsed, resolved, error, err;
|
|
1044
|
+
return _ts_generator(this, function(_state) {
|
|
1045
|
+
switch(_state.label){
|
|
1046
|
+
case 0:
|
|
1047
|
+
return [
|
|
1048
|
+
4,
|
|
1049
|
+
fetchVastXml(vastTagUrl)
|
|
1050
|
+
];
|
|
1051
|
+
case 1:
|
|
1052
|
+
vastXml = _state.sent();
|
|
1053
|
+
console.log("[HlsAdPlayer] Pod VAST XML received");
|
|
1054
|
+
parser = new DOMParser();
|
|
1055
|
+
xmlDoc = parser.parseFromString(vastXml, "text/xml");
|
|
1056
|
+
if (xmlDoc.querySelector("parsererror")) {
|
|
1057
|
+
console.error("[HlsAdPlayer] Pod VAST XML parsing error (malformed)");
|
|
1058
|
+
return [
|
|
1059
|
+
2,
|
|
1060
|
+
[]
|
|
1061
|
+
];
|
|
1062
|
+
}
|
|
1063
|
+
adElements = Array.from(xmlDoc.querySelectorAll("Ad"));
|
|
1064
|
+
if (adElements.length === 0) {
|
|
1065
|
+
console.warn("[HlsAdPlayer] No <Ad> elements found in pod VAST response");
|
|
1066
|
+
return [
|
|
1067
|
+
2,
|
|
1068
|
+
[]
|
|
1069
|
+
];
|
|
1070
|
+
}
|
|
1071
|
+
adElements.sort(function(a, b) {
|
|
1072
|
+
var aSeq = parseInt(a.getAttribute("sequence") || "", 10);
|
|
1073
|
+
var bSeq = parseInt(b.getAttribute("sequence") || "", 10);
|
|
1074
|
+
var aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;
|
|
1075
|
+
var bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;
|
|
1076
|
+
return aVal - bVal;
|
|
1077
|
+
});
|
|
1078
|
+
ads = [];
|
|
1079
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1080
|
+
_state.label = 2;
|
|
1081
|
+
case 2:
|
|
1082
|
+
_state.trys.push([
|
|
1083
|
+
2,
|
|
1084
|
+
10,
|
|
1085
|
+
11,
|
|
1086
|
+
12
|
|
1087
|
+
]);
|
|
1088
|
+
_iterator = adElements[Symbol.iterator]();
|
|
1089
|
+
_state.label = 3;
|
|
1090
|
+
case 3:
|
|
1091
|
+
if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
|
|
1092
|
+
3,
|
|
1093
|
+
9
|
|
1094
|
+
];
|
|
1095
|
+
adElement = _step.value;
|
|
1096
|
+
parsed = parseAdElement(adElement);
|
|
1097
|
+
if (!(parsed.type === "inline")) return [
|
|
1098
|
+
3,
|
|
1099
|
+
4
|
|
1100
|
+
];
|
|
1101
|
+
ads.push(parsed.ad);
|
|
1102
|
+
return [
|
|
1103
|
+
3,
|
|
1104
|
+
8
|
|
1105
|
+
];
|
|
1106
|
+
case 4:
|
|
1107
|
+
if (!(parsed.type === "wrapper")) return [
|
|
1108
|
+
3,
|
|
1109
|
+
8
|
|
1110
|
+
];
|
|
1111
|
+
_state.label = 5;
|
|
1112
|
+
case 5:
|
|
1113
|
+
_state.trys.push([
|
|
1114
|
+
5,
|
|
1115
|
+
7,
|
|
1116
|
+
,
|
|
1117
|
+
8
|
|
1118
|
+
]);
|
|
1119
|
+
return [
|
|
1120
|
+
4,
|
|
1121
|
+
fetchAndParseVastAd(parsed.vastAdTagUri, 1, parsed.trackingUrls)
|
|
1122
|
+
];
|
|
1123
|
+
case 6:
|
|
1124
|
+
resolved = _state.sent();
|
|
1125
|
+
if (resolved) {
|
|
1126
|
+
ads.push(resolved);
|
|
1127
|
+
}
|
|
1128
|
+
return [
|
|
1129
|
+
3,
|
|
1130
|
+
8
|
|
1131
|
+
];
|
|
1132
|
+
case 7:
|
|
1133
|
+
error = _state.sent();
|
|
1134
|
+
console.warn("[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:", error);
|
|
1135
|
+
return [
|
|
1136
|
+
3,
|
|
1137
|
+
8
|
|
1138
|
+
];
|
|
1139
|
+
case 8:
|
|
1140
|
+
_iteratorNormalCompletion = true;
|
|
1141
|
+
return [
|
|
1142
|
+
3,
|
|
1143
|
+
3
|
|
1144
|
+
];
|
|
1145
|
+
case 9:
|
|
1146
|
+
return [
|
|
1147
|
+
3,
|
|
1148
|
+
12
|
|
1149
|
+
];
|
|
1150
|
+
case 10:
|
|
1151
|
+
err = _state.sent();
|
|
1152
|
+
_didIteratorError = true;
|
|
1153
|
+
_iteratorError = err;
|
|
1154
|
+
return [
|
|
1155
|
+
3,
|
|
1156
|
+
12
|
|
1157
|
+
];
|
|
1158
|
+
case 11:
|
|
1159
|
+
try {
|
|
1160
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1161
|
+
_iterator.return();
|
|
1162
|
+
}
|
|
1163
|
+
} finally{
|
|
1164
|
+
if (_didIteratorError) {
|
|
1165
|
+
throw _iteratorError;
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
return [
|
|
1169
|
+
7
|
|
1170
|
+
];
|
|
1171
|
+
case 12:
|
|
1172
|
+
console.log("[HlsAdPlayer] Parsed ".concat(ads.length, " ad(s) from pod VAST response"));
|
|
1173
|
+
return [
|
|
1174
|
+
2,
|
|
1175
|
+
ads
|
|
1176
|
+
];
|
|
1177
|
+
}
|
|
1178
|
+
});
|
|
1179
|
+
})();
|
|
1180
|
+
}
|
|
970
1181
|
function createAdVideoElement() {
|
|
971
1182
|
var video = document.createElement("video");
|
|
972
1183
|
video.style.position = "absolute";
|
|
@@ -1011,6 +1222,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1011
1222
|
trackingFired.complete = true;
|
|
1012
1223
|
fireTrackingPixels(currentAd.trackingUrls.complete);
|
|
1013
1224
|
console.log("[HlsAdPlayer] Ad completed");
|
|
1225
|
+
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1014
1228
|
handleAdComplete();
|
|
1015
1229
|
});
|
|
1016
1230
|
adVideoElement.addEventListener("error", function(e) {
|
|
@@ -1019,6 +1233,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1019
1233
|
if (currentAd) {
|
|
1020
1234
|
fireTrackingPixels(currentAd.trackingUrls.error);
|
|
1021
1235
|
}
|
|
1236
|
+
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1022
1239
|
handleAdError();
|
|
1023
1240
|
});
|
|
1024
1241
|
adVideoElement.addEventListener("volumechange", function() {
|
|
@@ -1047,6 +1264,94 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1047
1264
|
delete contentVideo.dataset.stormcloudAdPlaying;
|
|
1048
1265
|
}
|
|
1049
1266
|
}
|
|
1267
|
+
function resetQuartileTracking(preserveImpression) {
|
|
1268
|
+
trackingFired = {
|
|
1269
|
+
impression: preserveImpression ? trackingFired.impression : false,
|
|
1270
|
+
start: false,
|
|
1271
|
+
firstQuartile: false,
|
|
1272
|
+
midpoint: false,
|
|
1273
|
+
thirdQuartile: false,
|
|
1274
|
+
complete: false
|
|
1275
|
+
};
|
|
1276
|
+
}
|
|
1277
|
+
function loadCurrentAdMedia() {
|
|
1278
|
+
if (!adVideoElement || !currentAd) {
|
|
1279
|
+
throw new Error("No ad video element or ad to load");
|
|
1280
|
+
}
|
|
1281
|
+
var mediaFile = selectBestMediaFile(currentAd.mediaFiles);
|
|
1282
|
+
if (!mediaFile) {
|
|
1283
|
+
throw new Error("No media file available for ad");
|
|
1284
|
+
}
|
|
1285
|
+
var isHlsAd = isHlsMediaFile(mediaFile);
|
|
1286
|
+
console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad (pod ").concat(podIndex + 1, "/").concat(podAds.length || 1, ") from: ").concat(mediaFile.url));
|
|
1287
|
+
if (isHlsAd && import_hls.default.isSupported()) {
|
|
1288
|
+
if (adHls) {
|
|
1289
|
+
adHls.destroy();
|
|
1290
|
+
}
|
|
1291
|
+
adHls = new import_hls.default({
|
|
1292
|
+
enableWorker: true,
|
|
1293
|
+
lowLatencyMode: false
|
|
1294
|
+
});
|
|
1295
|
+
adHls.loadSource(mediaFile.url);
|
|
1296
|
+
adHls.attachMedia(adVideoElement);
|
|
1297
|
+
adHls.on(import_hls.default.Events.MANIFEST_PARSED, function() {
|
|
1298
|
+
console.log("[HlsAdPlayer] HLS manifest parsed, starting playback");
|
|
1299
|
+
adVideoElement.play().catch(function(error) {
|
|
1300
|
+
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1301
|
+
handleAdError();
|
|
1302
|
+
});
|
|
1303
|
+
});
|
|
1304
|
+
adHls.on(import_hls.default.Events.ERROR, function(_event, data) {
|
|
1305
|
+
console.error("[HlsAdPlayer] HLS error:", data);
|
|
1306
|
+
if (data.fatal) {
|
|
1307
|
+
handleAdError();
|
|
1308
|
+
}
|
|
1309
|
+
});
|
|
1310
|
+
} else if (isHlsAd && adVideoElement.canPlayType("application/vnd.apple.mpegurl")) {
|
|
1311
|
+
adVideoElement.src = mediaFile.url;
|
|
1312
|
+
adVideoElement.play().catch(function(error) {
|
|
1313
|
+
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1314
|
+
handleAdError();
|
|
1315
|
+
});
|
|
1316
|
+
} else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {
|
|
1317
|
+
if (adHls) {
|
|
1318
|
+
adHls.destroy();
|
|
1319
|
+
adHls = void 0;
|
|
1320
|
+
}
|
|
1321
|
+
adVideoElement.src = mediaFile.url;
|
|
1322
|
+
adVideoElement.load();
|
|
1323
|
+
adVideoElement.play().catch(function(error) {
|
|
1324
|
+
console.error("[HlsAdPlayer] Error starting progressive ad playback:", error);
|
|
1325
|
+
handleAdError();
|
|
1326
|
+
});
|
|
1327
|
+
} else {
|
|
1328
|
+
throw new Error("Unsupported ad media file type: ".concat(mediaFile.type));
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
function advanceToNextPodAd() {
|
|
1332
|
+
if (podIndex >= podAds.length - 1) {
|
|
1333
|
+
return false;
|
|
1334
|
+
}
|
|
1335
|
+
podIndex++;
|
|
1336
|
+
currentAd = podAds[podIndex];
|
|
1337
|
+
resetQuartileTracking(false);
|
|
1338
|
+
if (currentAd) {
|
|
1339
|
+
fireTrackingPixels(currentAd.trackingUrls.impression);
|
|
1340
|
+
trackingFired.impression = true;
|
|
1341
|
+
console.log("[HlsAdPlayer] Advancing to next pod ad (".concat(podIndex + 1, "/").concat(podAds.length, "): ").concat(currentAd.title, ", duration: ").concat(currentAd.duration, "s"));
|
|
1342
|
+
}
|
|
1343
|
+
try {
|
|
1344
|
+
loadCurrentAdMedia();
|
|
1345
|
+
emit("pod_ad_started", {
|
|
1346
|
+
index: podIndex,
|
|
1347
|
+
total: podAds.length
|
|
1348
|
+
});
|
|
1349
|
+
return true;
|
|
1350
|
+
} catch (error) {
|
|
1351
|
+
console.error("[HlsAdPlayer] Failed to load next pod ad:", error);
|
|
1352
|
+
return false;
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1050
1355
|
function handleAdComplete() {
|
|
1051
1356
|
console.log("[HlsAdPlayer] Handling ad completion");
|
|
1052
1357
|
adPlaying = false;
|
|
@@ -1100,7 +1405,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1100
1405
|
},
|
|
1101
1406
|
requestAds: function requestAds(vastTagUrl) {
|
|
1102
1407
|
return _async_to_generator(function() {
|
|
1103
|
-
var
|
|
1408
|
+
var ads, preloaded, error;
|
|
1104
1409
|
return _ts_generator(this, function(_state) {
|
|
1105
1410
|
switch(_state.label){
|
|
1106
1411
|
case 0:
|
|
@@ -1121,12 +1426,18 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1121
1426
|
6
|
|
1122
1427
|
]);
|
|
1123
1428
|
sessionId = generateSessionId();
|
|
1429
|
+
ads = [];
|
|
1124
1430
|
if (!preloadedAds.has(vastTagUrl)) return [
|
|
1125
1431
|
3,
|
|
1126
1432
|
2
|
|
1127
1433
|
];
|
|
1128
|
-
|
|
1434
|
+
preloaded = preloadedAds.get(vastTagUrl);
|
|
1129
1435
|
preloadedAds.delete(vastTagUrl);
|
|
1436
|
+
if (preloaded) {
|
|
1437
|
+
ads = [
|
|
1438
|
+
preloaded
|
|
1439
|
+
];
|
|
1440
|
+
}
|
|
1130
1441
|
console.log("[HlsAdPlayer] Using preloaded VAST response:", vastTagUrl);
|
|
1131
1442
|
return [
|
|
1132
1443
|
3,
|
|
@@ -1135,13 +1446,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1135
1446
|
case 2:
|
|
1136
1447
|
return [
|
|
1137
1448
|
4,
|
|
1138
|
-
|
|
1449
|
+
fetchAndParsePod(vastTagUrl)
|
|
1139
1450
|
];
|
|
1140
1451
|
case 3:
|
|
1141
|
-
|
|
1452
|
+
ads = _state.sent();
|
|
1142
1453
|
_state.label = 4;
|
|
1143
1454
|
case 4:
|
|
1144
|
-
if (!
|
|
1455
|
+
if (!ads.length) {
|
|
1145
1456
|
console.warn("[HlsAdPlayer] No ads available from VAST response");
|
|
1146
1457
|
emit("ad_error");
|
|
1147
1458
|
return [
|
|
@@ -1149,10 +1460,14 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1149
1460
|
Promise.reject(new Error("No ads available from VAST response"))
|
|
1150
1461
|
];
|
|
1151
1462
|
}
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1463
|
+
podAds = ads;
|
|
1464
|
+
podIndex = 0;
|
|
1465
|
+
currentAd = ads[0];
|
|
1466
|
+
console.log("[HlsAdPlayer] Pod parsed: ".concat(ads.length, ' ad(s), first="').concat(currentAd === null || currentAd === void 0 ? void 0 : currentAd.title, '", duration=').concat(currentAd === null || currentAd === void 0 ? void 0 : currentAd.duration, "s"));
|
|
1467
|
+
if (currentAd) {
|
|
1468
|
+
fireTrackingPixels(currentAd.trackingUrls.impression);
|
|
1469
|
+
trackingFired.impression = true;
|
|
1470
|
+
}
|
|
1156
1471
|
return [
|
|
1157
1472
|
2,
|
|
1158
1473
|
Promise.resolve()
|
|
@@ -1175,7 +1490,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1175
1490
|
},
|
|
1176
1491
|
play: function play() {
|
|
1177
1492
|
return _async_to_generator(function() {
|
|
1178
|
-
var contentVolume
|
|
1493
|
+
var contentVolume;
|
|
1179
1494
|
return _ts_generator(this, function(_state) {
|
|
1180
1495
|
if (!currentAd) {
|
|
1181
1496
|
console.warn("[HlsAdPlayer] Cannot play: No ad loaded (no ads available)");
|
|
@@ -1191,14 +1506,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1191
1506
|
adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.appendChild(adVideoElement);
|
|
1192
1507
|
setupAdEventListeners();
|
|
1193
1508
|
}
|
|
1194
|
-
|
|
1195
|
-
impression: trackingFired.impression,
|
|
1196
|
-
start: false,
|
|
1197
|
-
firstQuartile: false,
|
|
1198
|
-
midpoint: false,
|
|
1199
|
-
thirdQuartile: false,
|
|
1200
|
-
complete: false
|
|
1201
|
-
};
|
|
1509
|
+
resetQuartileTracking(true);
|
|
1202
1510
|
contentVolume = contentVideo.volume;
|
|
1203
1511
|
originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
|
|
1204
1512
|
if (!(options === null || options === void 0 ? void 0 : options.continueLiveStreamDuringAds)) {
|
|
@@ -1216,60 +1524,12 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1216
1524
|
adVideoElement.muted = originalMutedState;
|
|
1217
1525
|
console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
|
|
1218
1526
|
}
|
|
1219
|
-
mediaFile = selectBestMediaFile(currentAd.mediaFiles);
|
|
1220
|
-
if (!mediaFile) {
|
|
1221
|
-
throw new Error("No media file available for ad");
|
|
1222
|
-
}
|
|
1223
1527
|
if (adContainerEl) {
|
|
1224
1528
|
adContainerEl.style.display = "flex";
|
|
1225
1529
|
adContainerEl.style.pointerEvents = "auto";
|
|
1226
1530
|
}
|
|
1227
1531
|
emit("content_pause");
|
|
1228
|
-
|
|
1229
|
-
console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
|
|
1230
|
-
if (isHlsAd && import_hls.default.isSupported()) {
|
|
1231
|
-
if (adHls) {
|
|
1232
|
-
adHls.destroy();
|
|
1233
|
-
}
|
|
1234
|
-
adHls = new import_hls.default({
|
|
1235
|
-
enableWorker: true,
|
|
1236
|
-
lowLatencyMode: false
|
|
1237
|
-
});
|
|
1238
|
-
adHls.loadSource(mediaFile.url);
|
|
1239
|
-
adHls.attachMedia(adVideoElement);
|
|
1240
|
-
adHls.on(import_hls.default.Events.MANIFEST_PARSED, function() {
|
|
1241
|
-
console.log("[HlsAdPlayer] HLS manifest parsed, starting playback");
|
|
1242
|
-
adVideoElement.play().catch(function(error) {
|
|
1243
|
-
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1244
|
-
handleAdError();
|
|
1245
|
-
});
|
|
1246
|
-
});
|
|
1247
|
-
adHls.on(import_hls.default.Events.ERROR, function(event, data) {
|
|
1248
|
-
console.error("[HlsAdPlayer] HLS error:", data);
|
|
1249
|
-
if (data.fatal) {
|
|
1250
|
-
handleAdError();
|
|
1251
|
-
}
|
|
1252
|
-
});
|
|
1253
|
-
} else if (isHlsAd && adVideoElement.canPlayType("application/vnd.apple.mpegurl")) {
|
|
1254
|
-
adVideoElement.src = mediaFile.url;
|
|
1255
|
-
adVideoElement.play().catch(function(error) {
|
|
1256
|
-
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1257
|
-
handleAdError();
|
|
1258
|
-
});
|
|
1259
|
-
} else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {
|
|
1260
|
-
if (adHls) {
|
|
1261
|
-
adHls.destroy();
|
|
1262
|
-
adHls = void 0;
|
|
1263
|
-
}
|
|
1264
|
-
adVideoElement.src = mediaFile.url;
|
|
1265
|
-
adVideoElement.load();
|
|
1266
|
-
adVideoElement.play().catch(function(error) {
|
|
1267
|
-
console.error("[HlsAdPlayer] Error starting progressive ad playback:", error);
|
|
1268
|
-
handleAdError();
|
|
1269
|
-
});
|
|
1270
|
-
} else {
|
|
1271
|
-
throw new Error("Unsupported ad media file type: ".concat(mediaFile.type));
|
|
1272
|
-
}
|
|
1532
|
+
loadCurrentAdMedia();
|
|
1273
1533
|
return [
|
|
1274
1534
|
2,
|
|
1275
1535
|
Promise.resolve()
|
|
@@ -1344,6 +1604,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1344
1604
|
adVideoElement.src = "";
|
|
1345
1605
|
}
|
|
1346
1606
|
currentAd = void 0;
|
|
1607
|
+
podAds = [];
|
|
1608
|
+
podIndex = 0;
|
|
1347
1609
|
return [
|
|
1348
1610
|
2
|
|
1349
1611
|
];
|
|
@@ -1393,6 +1655,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1393
1655
|
}
|
|
1394
1656
|
adContainerEl = void 0;
|
|
1395
1657
|
currentAd = void 0;
|
|
1658
|
+
podAds = [];
|
|
1659
|
+
podIndex = 0;
|
|
1396
1660
|
listeners.clear();
|
|
1397
1661
|
preloadedAds.clear();
|
|
1398
1662
|
preloadingAds.clear();
|
|
@@ -1484,6 +1748,14 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1484
1748
|
},
|
|
1485
1749
|
getLoadedAdId: function getLoadedAdId() {
|
|
1486
1750
|
return currentAd === null || currentAd === void 0 ? void 0 : currentAd.id;
|
|
1751
|
+
},
|
|
1752
|
+
getPodAdCount: function getPodAdCount() {
|
|
1753
|
+
return podAds.length;
|
|
1754
|
+
},
|
|
1755
|
+
getPodTotalDurationMs: function getPodTotalDurationMs() {
|
|
1756
|
+
return podAds.reduce(function(total, ad) {
|
|
1757
|
+
return total + (ad.duration > 0 ? ad.duration * 1e3 : 0);
|
|
1758
|
+
}, 0);
|
|
1487
1759
|
}
|
|
1488
1760
|
};
|
|
1489
1761
|
}
|
|
@@ -3336,7 +3608,20 @@ function applyVastMacros(baseUrl, ctx) {
|
|
|
3336
3608
|
if (ctx.pod != null) {
|
|
3337
3609
|
params.set("pod", String(ctx.pod));
|
|
3338
3610
|
}
|
|
3339
|
-
|
|
3611
|
+
var optimizedPodMode = ctx.podMaxAds != null || ctx.podMinDurationMs != null || ctx.podMaxDurationMs != null;
|
|
3612
|
+
if (optimizedPodMode) {
|
|
3613
|
+
params.delete("ppos");
|
|
3614
|
+
params.delete("lip");
|
|
3615
|
+
if (ctx.podMinDurationMs != null) {
|
|
3616
|
+
params.set("pmnd", String(Math.max(0, Math.round(ctx.podMinDurationMs))));
|
|
3617
|
+
}
|
|
3618
|
+
if (ctx.podMaxDurationMs != null) {
|
|
3619
|
+
params.set("pmxd", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));
|
|
3620
|
+
}
|
|
3621
|
+
if (ctx.podMaxAds != null) {
|
|
3622
|
+
params.set("pmad", String(Math.max(1, Math.round(ctx.podMaxAds))));
|
|
3623
|
+
}
|
|
3624
|
+
} else if (ctx.adPosition != null) {
|
|
3340
3625
|
params.set("ppos", String(ctx.adPosition));
|
|
3341
3626
|
}
|
|
3342
3627
|
var requestUrl = ctx.contentUrl || ctx.pageUrl;
|
|
@@ -4701,6 +4986,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
4701
4986
|
this.podAssignedByPrefetch = false;
|
|
4702
4987
|
this.adRequestPositionInBreak = 0;
|
|
4703
4988
|
this.lastHeartbeatTime = 0;
|
|
4989
|
+
this.defaultPodMaxAds = 6;
|
|
4704
4990
|
this.config = config;
|
|
4705
4991
|
this.video = video;
|
|
4706
4992
|
}
|
|
@@ -5156,6 +5442,52 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
5156
5442
|
return urls;
|
|
5157
5443
|
}
|
|
5158
5444
|
},
|
|
5445
|
+
{
|
|
5446
|
+
key: "resolvePodParams",
|
|
5447
|
+
value: function resolvePodParams(breakDurationMs) {
|
|
5448
|
+
var maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs;
|
|
5449
|
+
var maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;
|
|
5450
|
+
var minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;
|
|
5451
|
+
return {
|
|
5452
|
+
maxAds: maxAds,
|
|
5453
|
+
minDurationMs: minDurationMs,
|
|
5454
|
+
maxDurationMs: maxDurationMs
|
|
5455
|
+
};
|
|
5456
|
+
}
|
|
5457
|
+
},
|
|
5458
|
+
{
|
|
5459
|
+
key: "generatePodVastUrl",
|
|
5460
|
+
value: function generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {
|
|
5461
|
+
var _podParams_maxDurationMs;
|
|
5462
|
+
var adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;
|
|
5463
|
+
var envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);
|
|
5464
|
+
var urlWithMacros = applyVastMacros(baseUrl, {
|
|
5465
|
+
correlator: generateCorrelator(),
|
|
5466
|
+
streamCorrelator: this.streamCorrelator,
|
|
5467
|
+
pod: this.podCounter > 0 ? this.podCounter : void 0,
|
|
5468
|
+
podMaxAds: podParams.maxAds,
|
|
5469
|
+
podMinDurationMs: podParams.minDurationMs,
|
|
5470
|
+
podMaxDurationMs: podParams.maxDurationMs,
|
|
5471
|
+
isCtv: envSignals.isCtv,
|
|
5472
|
+
contentUrl: envSignals.contentUrl,
|
|
5473
|
+
pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? window.location.href : void 0,
|
|
5474
|
+
adWillPlayMuted: adWillPlayMuted,
|
|
5475
|
+
adWillAutoPlay: !!this.config.autoplay,
|
|
5476
|
+
appId: envSignals.appId,
|
|
5477
|
+
appName: envSignals.appName,
|
|
5478
|
+
sessionId: envSignals.sessionId,
|
|
5479
|
+
deviceId: envSignals.deviceId,
|
|
5480
|
+
deviceIdType: envSignals.deviceIdType,
|
|
5481
|
+
limitAdTracking: envSignals.limitAdTracking,
|
|
5482
|
+
deviceTypeHint: envSignals.deviceTypeHint,
|
|
5483
|
+
adTest: this.config.adTest,
|
|
5484
|
+
consent: this.consentSignals
|
|
5485
|
+
});
|
|
5486
|
+
var finalUrl = palNonce.injectNonce(urlWithMacros);
|
|
5487
|
+
console.log("[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=".concat(this.podCounter, ", pmad=").concat(podParams.maxAds, ", pmnd=").concat(podParams.minDurationMs, ", pmxd=").concat((_podParams_maxDurationMs = podParams.maxDurationMs) !== null && _podParams_maxDurationMs !== void 0 ? _podParams_maxDurationMs : "?", "):"), finalUrl);
|
|
5488
|
+
return finalUrl;
|
|
5489
|
+
}
|
|
5490
|
+
},
|
|
5159
5491
|
{
|
|
5160
5492
|
// --- Tracking ---
|
|
5161
5493
|
key: "initializeTracking",
|
|
@@ -5461,6 +5793,13 @@ var AdTimingService = /*#__PURE__*/ function() {
|
|
|
5461
5793
|
this.lastAdRequestTime = Date.now();
|
|
5462
5794
|
}
|
|
5463
5795
|
},
|
|
5796
|
+
{
|
|
5797
|
+
key: "notePodAdStarted",
|
|
5798
|
+
value: function notePodAdStarted() {
|
|
5799
|
+
this.currentAdIndex++;
|
|
5800
|
+
this.totalAdsInBreak = this.currentAdIndex;
|
|
5801
|
+
}
|
|
5802
|
+
},
|
|
5464
5803
|
{
|
|
5465
5804
|
key: "getRemainingAdMs",
|
|
5466
5805
|
value: function getRemainingAdMs() {
|
|
@@ -6969,13 +7308,26 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
6969
7308
|
}
|
|
6970
7309
|
},
|
|
6971
7310
|
{
|
|
6972
|
-
|
|
7311
|
+
key: "optimizedPodsEnabled",
|
|
7312
|
+
get: // ───────────────────────────────────────────────────────────────
|
|
6973
7313
|
// IMA event listeners
|
|
6974
7314
|
// ───────────────────────────────────────────────────────────────
|
|
7315
|
+
function get() {
|
|
7316
|
+
return !!this.host.config.optimizedPods;
|
|
7317
|
+
}
|
|
7318
|
+
},
|
|
7319
|
+
{
|
|
6975
7320
|
key: "attachImaEventListeners",
|
|
6976
7321
|
value: function attachImaEventListeners() {
|
|
6977
7322
|
var _this = this;
|
|
6978
7323
|
var adPlayer = this.host.getAdPlayer();
|
|
7324
|
+
adPlayer.on("pod_ad_started", function(payload) {
|
|
7325
|
+
_this.timing.notePodAdStarted();
|
|
7326
|
+
if (_this.debug) {
|
|
7327
|
+
var _ref;
|
|
7328
|
+
console.log("[POD] Playing pod ad ".concat((payload === null || payload === void 0 ? void 0 : payload.index) != null ? payload.index + 1 : "?", "/").concat((_ref = payload === null || payload === void 0 ? void 0 : payload.total) !== null && _ref !== void 0 ? _ref : "?"));
|
|
7329
|
+
}
|
|
7330
|
+
});
|
|
6979
7331
|
adPlayer.on("all_ads_completed", function() {
|
|
6980
7332
|
sendAdImpressionTracking(_this.host.config.licenseKey, {
|
|
6981
7333
|
source: "hls",
|
|
@@ -7133,7 +7485,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7133
7485
|
// ───────────────────────────────────────────────────────────────
|
|
7134
7486
|
function handleAdStart(_marker) {
|
|
7135
7487
|
return _async_to_generator(function() {
|
|
7136
|
-
var scheduled, tags, baseVastUrl, adBreakDurationMs, mode, currentMuted, currentVolume, firstAdUrl, usePreloadedAd, preloadedController, preloaded, firstAdUrlArray, adPlayer, preservedMuted, preservedVolume, adVolume, adPlayer1, adVolume1, error, fallbackPreloaded, ap, adVolume2, fallbackError;
|
|
7488
|
+
var scheduled, tags, baseVastUrl, adBreakDurationMs, mode, currentMuted, currentVolume, podPlayed, firstAdUrl, usePreloadedAd, preloadedController, preloaded, firstAdUrlArray, adPlayer, preservedMuted, preservedVolume, adVolume, adPlayer1, adVolume1, error, fallbackPreloaded, ap, adVolume2, fallbackError;
|
|
7137
7489
|
return _ts_generator(this, function(_state) {
|
|
7138
7490
|
switch(_state.label){
|
|
7139
7491
|
case 0:
|
|
@@ -7180,6 +7532,26 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7180
7532
|
if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {
|
|
7181
7533
|
this.timing.expectedAdBreakDurationMs = adBreakDurationMs;
|
|
7182
7534
|
}
|
|
7535
|
+
if (!this.optimizedPodsEnabled) return [
|
|
7536
|
+
3,
|
|
7537
|
+
2
|
|
7538
|
+
];
|
|
7539
|
+
return [
|
|
7540
|
+
4,
|
|
7541
|
+
this.startOptimizedPod(baseVastUrl, adBreakDurationMs, currentMuted, currentVolume)
|
|
7542
|
+
];
|
|
7543
|
+
case 1:
|
|
7544
|
+
podPlayed = _state.sent();
|
|
7545
|
+
if (podPlayed) {
|
|
7546
|
+
return [
|
|
7547
|
+
2
|
|
7548
|
+
];
|
|
7549
|
+
}
|
|
7550
|
+
if (this.debug) {
|
|
7551
|
+
console.log("[POD] Optimized pod unavailable, falling back to sequential single-ad path");
|
|
7552
|
+
}
|
|
7553
|
+
_state.label = 2;
|
|
7554
|
+
case 2:
|
|
7183
7555
|
usePreloadedAd = false;
|
|
7184
7556
|
preloaded = this.preloadPool.getPreloadedAd();
|
|
7185
7557
|
if (preloaded) {
|
|
@@ -7221,21 +7593,21 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7221
7593
|
if (this.debug) {
|
|
7222
7594
|
console.log("[CONTINUOUS-FETCH] First VAST URL:", firstAdUrl);
|
|
7223
7595
|
}
|
|
7224
|
-
_state.label =
|
|
7225
|
-
case
|
|
7596
|
+
_state.label = 3;
|
|
7597
|
+
case 3:
|
|
7226
7598
|
_state.trys.push([
|
|
7227
|
-
|
|
7228
|
-
|
|
7599
|
+
3,
|
|
7600
|
+
14,
|
|
7229
7601
|
,
|
|
7230
|
-
|
|
7602
|
+
22
|
|
7231
7603
|
]);
|
|
7232
7604
|
if (!(usePreloadedAd && preloadedController)) return [
|
|
7233
7605
|
3,
|
|
7234
|
-
|
|
7606
|
+
7
|
|
7235
7607
|
];
|
|
7236
7608
|
if (!!this.timing.ensureLoadedAdFitsBudget(preloadedController)) return [
|
|
7237
7609
|
3,
|
|
7238
|
-
|
|
7610
|
+
5
|
|
7239
7611
|
];
|
|
7240
7612
|
this.timing.rejectLoadedAdForDuration(preloadedController);
|
|
7241
7613
|
this.startContinuousFetching(baseVastUrl);
|
|
@@ -7243,12 +7615,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7243
7615
|
4,
|
|
7244
7616
|
this.tryNextAvailableAdWithRateLimit()
|
|
7245
7617
|
];
|
|
7246
|
-
case
|
|
7618
|
+
case 4:
|
|
7247
7619
|
_state.sent();
|
|
7248
7620
|
return [
|
|
7249
7621
|
2
|
|
7250
7622
|
];
|
|
7251
|
-
case
|
|
7623
|
+
case 5:
|
|
7252
7624
|
adPlayer = this.host.getAdPlayer();
|
|
7253
7625
|
preservedMuted = adPlayer.getOriginalMutedState();
|
|
7254
7626
|
preservedVolume = adPlayer.getOriginalVolume();
|
|
@@ -7273,7 +7645,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7273
7645
|
4,
|
|
7274
7646
|
preloadedController.play()
|
|
7275
7647
|
];
|
|
7276
|
-
case
|
|
7648
|
+
case 6:
|
|
7277
7649
|
_state.sent();
|
|
7278
7650
|
this.timing.markAdStarted();
|
|
7279
7651
|
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
@@ -7283,22 +7655,22 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7283
7655
|
preloadedController.setAdVolume(adVolume);
|
|
7284
7656
|
return [
|
|
7285
7657
|
3,
|
|
7286
|
-
|
|
7658
|
+
13
|
|
7287
7659
|
];
|
|
7288
|
-
case
|
|
7660
|
+
case 7:
|
|
7289
7661
|
adPlayer1 = this.host.getAdPlayer();
|
|
7290
7662
|
return [
|
|
7291
7663
|
4,
|
|
7292
7664
|
this.timing.enforceGlobalRateLimit()
|
|
7293
7665
|
];
|
|
7294
|
-
case
|
|
7666
|
+
case 8:
|
|
7295
7667
|
_state.sent();
|
|
7296
7668
|
this.timing.lastAdRequestTime = Date.now();
|
|
7297
7669
|
return [
|
|
7298
7670
|
4,
|
|
7299
7671
|
adPlayer1.requestAds(firstAdUrl)
|
|
7300
7672
|
];
|
|
7301
|
-
case
|
|
7673
|
+
case 9:
|
|
7302
7674
|
_state.sent();
|
|
7303
7675
|
sendAdLoadedTracking(this.host.config.licenseKey, {
|
|
7304
7676
|
source: "hls",
|
|
@@ -7310,7 +7682,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7310
7682
|
}
|
|
7311
7683
|
if (!!this.timing.ensureLoadedAdFitsBudget(adPlayer1)) return [
|
|
7312
7684
|
3,
|
|
7313
|
-
|
|
7685
|
+
11
|
|
7314
7686
|
];
|
|
7315
7687
|
this.timing.rejectLoadedAdForDuration(adPlayer1);
|
|
7316
7688
|
this.recreateAdController();
|
|
@@ -7319,12 +7691,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7319
7691
|
4,
|
|
7320
7692
|
this.tryNextAvailableAdWithRateLimit()
|
|
7321
7693
|
];
|
|
7322
|
-
case
|
|
7694
|
+
case 10:
|
|
7323
7695
|
_state.sent();
|
|
7324
7696
|
return [
|
|
7325
7697
|
2
|
|
7326
7698
|
];
|
|
7327
|
-
case
|
|
7699
|
+
case 11:
|
|
7328
7700
|
this.timing.consecutiveFailures = 0;
|
|
7329
7701
|
this.startContinuousFetching(baseVastUrl);
|
|
7330
7702
|
if (!this.preloadPool.active) {
|
|
@@ -7334,7 +7706,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7334
7706
|
4,
|
|
7335
7707
|
adPlayer1.play()
|
|
7336
7708
|
];
|
|
7337
|
-
case
|
|
7709
|
+
case 12:
|
|
7338
7710
|
_state.sent();
|
|
7339
7711
|
this.timing.markAdStarted();
|
|
7340
7712
|
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
@@ -7342,40 +7714,40 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7342
7714
|
}
|
|
7343
7715
|
adVolume1 = currentMuted ? 0 : currentVolume;
|
|
7344
7716
|
adPlayer1.setAdVolume(adVolume1);
|
|
7345
|
-
_state.label =
|
|
7346
|
-
case
|
|
7717
|
+
_state.label = 13;
|
|
7718
|
+
case 13:
|
|
7347
7719
|
return [
|
|
7348
7720
|
3,
|
|
7349
|
-
|
|
7721
|
+
22
|
|
7350
7722
|
];
|
|
7351
|
-
case
|
|
7723
|
+
case 14:
|
|
7352
7724
|
error = _state.sent();
|
|
7353
7725
|
if (this.debug) {
|
|
7354
7726
|
console.warn("[CONTINUOUS-FETCH] First ad request failed:", error);
|
|
7355
7727
|
}
|
|
7356
7728
|
if (!!usePreloadedAd) return [
|
|
7357
7729
|
3,
|
|
7358
|
-
|
|
7730
|
+
20
|
|
7359
7731
|
];
|
|
7360
7732
|
fallbackPreloaded = this.preloadPool.getPreloadedAd();
|
|
7361
7733
|
if (!fallbackPreloaded) return [
|
|
7362
7734
|
3,
|
|
7363
|
-
|
|
7735
|
+
20
|
|
7364
7736
|
];
|
|
7365
7737
|
if (this.debug) {
|
|
7366
7738
|
console.log("[CONTINUOUS-FETCH] First ad failed, using preloaded fallback");
|
|
7367
7739
|
}
|
|
7368
|
-
_state.label =
|
|
7369
|
-
case
|
|
7740
|
+
_state.label = 15;
|
|
7741
|
+
case 15:
|
|
7370
7742
|
_state.trys.push([
|
|
7371
|
-
|
|
7372
|
-
|
|
7743
|
+
15,
|
|
7744
|
+
19,
|
|
7373
7745
|
,
|
|
7374
|
-
|
|
7746
|
+
20
|
|
7375
7747
|
]);
|
|
7376
7748
|
if (!!this.timing.ensureLoadedAdFitsBudget(fallbackPreloaded.adController)) return [
|
|
7377
7749
|
3,
|
|
7378
|
-
|
|
7750
|
+
17
|
|
7379
7751
|
];
|
|
7380
7752
|
this.timing.rejectLoadedAdForDuration(fallbackPreloaded.adController);
|
|
7381
7753
|
this.startContinuousFetching(baseVastUrl);
|
|
@@ -7383,12 +7755,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7383
7755
|
4,
|
|
7384
7756
|
this.tryNextAvailableAdWithRateLimit()
|
|
7385
7757
|
];
|
|
7386
|
-
case
|
|
7758
|
+
case 16:
|
|
7387
7759
|
_state.sent();
|
|
7388
7760
|
return [
|
|
7389
7761
|
2
|
|
7390
7762
|
];
|
|
7391
|
-
case
|
|
7763
|
+
case 17:
|
|
7392
7764
|
this.swapToPreloadedAdPlayer(fallbackPreloaded.adController);
|
|
7393
7765
|
this.timing.consecutiveFailures = 0;
|
|
7394
7766
|
this.startContinuousFetching(baseVastUrl);
|
|
@@ -7401,7 +7773,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7401
7773
|
4,
|
|
7402
7774
|
ap.play()
|
|
7403
7775
|
];
|
|
7404
|
-
case
|
|
7776
|
+
case 18:
|
|
7405
7777
|
_state.sent();
|
|
7406
7778
|
this.timing.markAdStarted();
|
|
7407
7779
|
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
@@ -7412,16 +7784,16 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7412
7784
|
return [
|
|
7413
7785
|
2
|
|
7414
7786
|
];
|
|
7415
|
-
case
|
|
7787
|
+
case 19:
|
|
7416
7788
|
fallbackError = _state.sent();
|
|
7417
7789
|
if (this.debug) {
|
|
7418
7790
|
console.warn("[CONTINUOUS-FETCH] Preloaded fallback also failed:", fallbackError);
|
|
7419
7791
|
}
|
|
7420
7792
|
return [
|
|
7421
7793
|
3,
|
|
7422
|
-
|
|
7794
|
+
20
|
|
7423
7795
|
];
|
|
7424
|
-
case
|
|
7796
|
+
case 20:
|
|
7425
7797
|
if (this.timing.isTemporaryAdError(error)) {
|
|
7426
7798
|
this.timing.temporaryFailureUrls.set(firstAdUrl, Date.now());
|
|
7427
7799
|
if (this.debug) {
|
|
@@ -7439,13 +7811,137 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7439
7811
|
4,
|
|
7440
7812
|
this.tryNextAvailableAdWithRateLimit()
|
|
7441
7813
|
];
|
|
7442
|
-
case
|
|
7814
|
+
case 21:
|
|
7443
7815
|
_state.sent();
|
|
7444
7816
|
return [
|
|
7445
7817
|
3,
|
|
7446
|
-
|
|
7818
|
+
22
|
|
7447
7819
|
];
|
|
7448
|
-
case
|
|
7820
|
+
case 22:
|
|
7821
|
+
return [
|
|
7822
|
+
2
|
|
7823
|
+
];
|
|
7824
|
+
}
|
|
7825
|
+
});
|
|
7826
|
+
}).call(this);
|
|
7827
|
+
}
|
|
7828
|
+
},
|
|
7829
|
+
{
|
|
7830
|
+
key: "startOptimizedPod",
|
|
7831
|
+
value: // ───────────────────────────────────────────────────────────────
|
|
7832
|
+
// Optimized pod (single multi-ad request)
|
|
7833
|
+
// ───────────────────────────────────────────────────────────────
|
|
7834
|
+
function startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {
|
|
7835
|
+
return _async_to_generator(function() {
|
|
7836
|
+
var podUrl, adPlayer, requestToken, _ref, _adPlayer_getPodAdCount, podCount, error;
|
|
7837
|
+
return _ts_generator(this, function(_state) {
|
|
7838
|
+
switch(_state.label){
|
|
7839
|
+
case 0:
|
|
7840
|
+
if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {
|
|
7841
|
+
podUrl = this.pendingAdBreak.vastUrls[0];
|
|
7842
|
+
this.clearPendingAdBreak();
|
|
7843
|
+
} else {
|
|
7844
|
+
podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);
|
|
7845
|
+
}
|
|
7846
|
+
if (!podUrl) {
|
|
7847
|
+
return [
|
|
7848
|
+
2,
|
|
7849
|
+
false
|
|
7850
|
+
];
|
|
7851
|
+
}
|
|
7852
|
+
this.continuousFetchingActive = false;
|
|
7853
|
+
this.recreateAdController();
|
|
7854
|
+
adPlayer = this.host.getAdPlayer();
|
|
7855
|
+
requestToken = ++this.timing.adRequestTokenCounter;
|
|
7856
|
+
this.timing.activeAdRequestToken = requestToken;
|
|
7857
|
+
this.timing.startAdRequestWatchdog(requestToken);
|
|
7858
|
+
_state.label = 1;
|
|
7859
|
+
case 1:
|
|
7860
|
+
_state.trys.push([
|
|
7861
|
+
1,
|
|
7862
|
+
5,
|
|
7863
|
+
,
|
|
7864
|
+
6
|
|
7865
|
+
]);
|
|
7866
|
+
return [
|
|
7867
|
+
4,
|
|
7868
|
+
this.timing.enforceGlobalRateLimit()
|
|
7869
|
+
];
|
|
7870
|
+
case 2:
|
|
7871
|
+
_state.sent();
|
|
7872
|
+
this.timing.lastAdRequestTime = Date.now();
|
|
7873
|
+
return [
|
|
7874
|
+
4,
|
|
7875
|
+
adPlayer.requestAds(podUrl)
|
|
7876
|
+
];
|
|
7877
|
+
case 3:
|
|
7878
|
+
_state.sent();
|
|
7879
|
+
this.timing.clearAdRequestWatchdog();
|
|
7880
|
+
if (this.timing.activeAdRequestToken !== requestToken) {
|
|
7881
|
+
return [
|
|
7882
|
+
2,
|
|
7883
|
+
true
|
|
7884
|
+
];
|
|
7885
|
+
}
|
|
7886
|
+
podCount = (_ref = (_adPlayer_getPodAdCount = adPlayer.getPodAdCount) === null || _adPlayer_getPodAdCount === void 0 ? void 0 : _adPlayer_getPodAdCount.call(adPlayer)) !== null && _ref !== void 0 ? _ref : 1;
|
|
7887
|
+
if (podCount < 1) {
|
|
7888
|
+
return [
|
|
7889
|
+
2,
|
|
7890
|
+
false
|
|
7891
|
+
];
|
|
7892
|
+
}
|
|
7893
|
+
if (this.debug) {
|
|
7894
|
+
console.log(podCount === 1 ? "[POD] Response contained a single ad; playing it and enabling sequential top-up" : "[POD] Optimized pod returned ".concat(podCount, " ads; playing pod in one controller"));
|
|
7895
|
+
}
|
|
7896
|
+
sendAdLoadedTracking(this.host.config.licenseKey, {
|
|
7897
|
+
source: "hls",
|
|
7898
|
+
vastUrl: podUrl,
|
|
7899
|
+
timestamp: /* @__PURE__ */ new Date().toISOString()
|
|
7900
|
+
}, this.analyticsContext).catch(function() {});
|
|
7901
|
+
this.timing.startAdFailsafeTimer(requestToken);
|
|
7902
|
+
return [
|
|
7903
|
+
4,
|
|
7904
|
+
adPlayer.play()
|
|
7905
|
+
];
|
|
7906
|
+
case 4:
|
|
7907
|
+
_state.sent();
|
|
7908
|
+
this.timing.markAdStarted();
|
|
7909
|
+
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
7910
|
+
this.timing.scheduleAdStopAtBreakBoundary();
|
|
7911
|
+
}
|
|
7912
|
+
adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);
|
|
7913
|
+
this.timing.consecutiveFailures = 0;
|
|
7914
|
+
if (podCount === 1) {
|
|
7915
|
+
this.continuousFetchingActive = true;
|
|
7916
|
+
this.startContinuousFetching(baseVastUrl);
|
|
7917
|
+
if (!this.preloadPool.active) {
|
|
7918
|
+
this.preloadPool.startPreloadPool(baseVastUrl, []);
|
|
7919
|
+
}
|
|
7920
|
+
}
|
|
7921
|
+
return [
|
|
7922
|
+
2,
|
|
7923
|
+
true
|
|
7924
|
+
];
|
|
7925
|
+
case 5:
|
|
7926
|
+
error = _state.sent();
|
|
7927
|
+
this.timing.clearAdRequestWatchdog();
|
|
7928
|
+
this.timing.clearAdFailsafeTimer();
|
|
7929
|
+
if (this.timing.activeAdRequestToken === requestToken) {
|
|
7930
|
+
this.timing.activeAdRequestToken = null;
|
|
7931
|
+
}
|
|
7932
|
+
if (this.debug) {
|
|
7933
|
+
console.warn("[POD] Optimized pod request/play failed:", error);
|
|
7934
|
+
}
|
|
7935
|
+
if (this.timing.isTemporaryAdError(error)) {
|
|
7936
|
+
this.timing.temporaryFailureUrls.set(podUrl, Date.now());
|
|
7937
|
+
}
|
|
7938
|
+
this.continuousFetchingActive = true;
|
|
7939
|
+
this.recreateAdController();
|
|
7940
|
+
return [
|
|
7941
|
+
2,
|
|
7942
|
+
false
|
|
7943
|
+
];
|
|
7944
|
+
case 6:
|
|
7449
7945
|
return [
|
|
7450
7946
|
2
|
|
7451
7947
|
];
|
|
@@ -8527,6 +9023,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8527
9023
|
},
|
|
8528
9024
|
generateVastUrls: function generateVastUrls(base, count) {
|
|
8529
9025
|
return _this.generateVastUrls(base, count);
|
|
9026
|
+
},
|
|
9027
|
+
generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
|
|
9028
|
+
return _this.generatePodVastUrl(base, breakDurationMs);
|
|
8530
9029
|
}
|
|
8531
9030
|
}, this.timing, this.preloadPool, this.adConfig, this.cueManager, this.placeholder);
|
|
8532
9031
|
}
|
|
@@ -8559,6 +9058,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8559
9058
|
return this.adConfig.generateVastUrlsWithCorrelators(baseUrl, count, this.adPlayer, this.palNonce, this.adBreak.inAdBreak);
|
|
8560
9059
|
}
|
|
8561
9060
|
},
|
|
9061
|
+
{
|
|
9062
|
+
key: "generatePodVastUrl",
|
|
9063
|
+
value: function generatePodVastUrl(baseUrl, breakDurationMs) {
|
|
9064
|
+
var podParams = this.adConfig.resolvePodParams(breakDurationMs);
|
|
9065
|
+
return this.adConfig.generatePodVastUrl(baseUrl, podParams, this.adPlayer, this.palNonce, this.adBreak.inAdBreak);
|
|
9066
|
+
}
|
|
9067
|
+
},
|
|
8562
9068
|
{
|
|
8563
9069
|
key: "load",
|
|
8564
9070
|
value: // ───────────────────────────────────────────────────────────────
|
|
@@ -8947,7 +9453,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8947
9453
|
}
|
|
8948
9454
|
this.adConfig.beginNewAdPod();
|
|
8949
9455
|
this.adConfig.podAssignedByPrefetch = true;
|
|
8950
|
-
var
|
|
9456
|
+
var optimizedPods = !!this.config.optimizedPods;
|
|
9457
|
+
var breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;
|
|
9458
|
+
var generatedUrls = optimizedPods ? [
|
|
9459
|
+
this.generatePodVastUrl(baseVastUrl, breakDurationMs)
|
|
9460
|
+
] : this.generateVastUrls(baseVastUrl, 1);
|
|
8951
9461
|
this.adBreak.pendingAdBreak = _object_spread_props(_object_spread({
|
|
8952
9462
|
marker: marker
|
|
8953
9463
|
}, fragmentSn !== void 0 ? {
|
|
@@ -8969,7 +9479,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8969
9479
|
}, detectPayload), buildAnalyticsContext(this.config)).catch(function() {});
|
|
8970
9480
|
if (this.debug) {
|
|
8971
9481
|
console.log("[PREFETCH] Starting ad prefetch for upcoming ad break");
|
|
8972
|
-
console.log("[PREFETCH] Pre-generated ".concat(generatedUrls.length, " VAST
|
|
9482
|
+
console.log("[PREFETCH] Pre-generated ".concat(generatedUrls.length, " ").concat(optimizedPods ? "pod" : "VAST", " URL(s)"));
|
|
9483
|
+
}
|
|
9484
|
+
if (optimizedPods) {
|
|
9485
|
+
if (this.debug) {
|
|
9486
|
+
console.log("[PREFETCH] Optimized pods enabled - skipping single-ad preload pool");
|
|
9487
|
+
}
|
|
9488
|
+
return;
|
|
8973
9489
|
}
|
|
8974
9490
|
this.preloadPool.startPreloadPool(baseVastUrl, generatedUrls.slice(0, 1), false);
|
|
8975
9491
|
}
|