stormcloud-video-player 0.8.59 → 0.8.60
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/LICENSE +21 -21
- package/README.md +1369 -1369
- package/dist/stormcloud-vp.min.js +3 -1
- package/lib/Player.cjs +548 -0
- package/lib/Player.cjs.map +1 -0
- package/lib/Player.d.cts +146 -0
- package/lib/{index.js → StormcloudPlayer.cjs} +1108 -1877
- package/lib/StormcloudPlayer.cjs.map +1 -0
- package/lib/{index.d.ts → StormcloudPlayer.d.cts} +7 -400
- package/lib/index.cjs +979 -251
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +18 -4032
- package/lib/patterns.cjs +111 -0
- package/lib/patterns.cjs.map +1 -0
- package/lib/patterns.d.cts +14 -0
- package/lib/player/AdBreakOrchestrator.cjs +48 -14
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +3 -1
- package/lib/player/AdConfigManager.cjs +155 -17
- package/lib/player/AdConfigManager.cjs.map +1 -1
- package/lib/player/AdConfigManager.d.cts +1 -1
- package/lib/player/AdTimingService.cjs.map +1 -1
- package/lib/player/AdTimingService.d.cts +1 -1
- package/lib/player/HlsEngine.cjs.map +1 -1
- package/lib/player/HlsEngine.d.cts +1 -1
- package/lib/player/PlaceholderLayer.cjs.map +1 -1
- package/lib/player/PlayerControls.cjs.map +1 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.cjs.map +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.cjs.map +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +979 -251
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/player/playerTypes.cjs.map +1 -1
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/FilePlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.cjs +979 -251
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +979 -251
- package/lib/players/index.cjs.map +1 -1
- package/lib/props.cjs +186 -0
- package/lib/props.cjs.map +1 -0
- package/lib/props.d.cts +62 -0
- package/lib/sdk/hlsAdPlayer.cjs +884 -234
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/sdk/pal.cjs.map +1 -1
- package/lib/types.cjs +49 -0
- package/lib/types.cjs.map +1 -0
- package/lib/{types-52ASml2N.d.cts → types.d.cts} +47 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +979 -251
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/ctvVastSignals.cjs +155 -17
- package/lib/utils/ctvVastSignals.cjs.map +1 -1
- package/lib/utils/devUrl.cjs.map +1 -1
- package/lib/utils/polyfills.cjs.map +1 -1
- package/lib/utils/tracking.cjs +42 -14
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/trackingIngest.cjs.map +1 -1
- package/lib/utils/vastEnvironmentSignals.cjs +167 -17
- package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
- package/lib/utils/vastEnvironmentSignals.d.cts +12 -1
- package/lib/utils/vastMacros.cjs +26 -0
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/lib/utils/vastTrackingMacros.cjs +5 -0
- package/lib/utils/vastTrackingMacros.cjs.map +1 -1
- package/lib/utils/vastTrackingMacros.d.cts +2 -0
- package/lib/utils.cjs +292 -0
- package/lib/utils.cjs.map +1 -0
- package/lib/utils.d.cts +17 -0
- package/package.json +91 -91
- package/rollup.config.js +90 -90
- package/lib/index.js.map +0 -1
package/lib/index.cjs
CHANGED
|
@@ -798,6 +798,7 @@ var KNOWN_VAST_MACROS = /* @__PURE__ */ new Set([
|
|
|
798
798
|
"PLAYERSIZE",
|
|
799
799
|
"PLAYERSTATE",
|
|
800
800
|
"PODSEQUENCE",
|
|
801
|
+
"REASON",
|
|
801
802
|
"REGULATIONS",
|
|
802
803
|
"SERVERSIDE",
|
|
803
804
|
"SERVERUA",
|
|
@@ -856,6 +857,10 @@ function resolveMacroValues(ctx) {
|
|
|
856
857
|
if (ctx.podSequence != null) {
|
|
857
858
|
set("PODSEQUENCE", String(ctx.podSequence));
|
|
858
859
|
}
|
|
860
|
+
set("ADSERVINGID", ctx.adServingId);
|
|
861
|
+
if (ctx.reason != null && ctx.reason !== "") {
|
|
862
|
+
set("REASON", String(ctx.reason));
|
|
863
|
+
}
|
|
859
864
|
return values;
|
|
860
865
|
}
|
|
861
866
|
function substituteVastTrackingMacros(url) {
|
|
@@ -872,10 +877,72 @@ function substituteVastTrackingMacros(url) {
|
|
|
872
877
|
});
|
|
873
878
|
}
|
|
874
879
|
// src/sdk/hlsAdPlayer.ts
|
|
880
|
+
var LINEAR_TRACKING_EVENTS = [
|
|
881
|
+
"creativeView",
|
|
882
|
+
"loaded",
|
|
883
|
+
"start",
|
|
884
|
+
"firstQuartile",
|
|
885
|
+
"midpoint",
|
|
886
|
+
"thirdQuartile",
|
|
887
|
+
"complete",
|
|
888
|
+
"mute",
|
|
889
|
+
"unmute",
|
|
890
|
+
"pause",
|
|
891
|
+
"resume",
|
|
892
|
+
"fullscreen",
|
|
893
|
+
"exitFullscreen",
|
|
894
|
+
"playerExpand",
|
|
895
|
+
"playerCollapse",
|
|
896
|
+
"notUsed"
|
|
897
|
+
];
|
|
898
|
+
function textOf(el) {
|
|
899
|
+
var _el_textContent;
|
|
900
|
+
var value = el === null || el === void 0 ? void 0 : (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
901
|
+
return value ? value : void 0;
|
|
902
|
+
}
|
|
903
|
+
function parseVastTime(value) {
|
|
904
|
+
if (!value) return void 0;
|
|
905
|
+
var parts = value.trim().split(":");
|
|
906
|
+
if (parts.length !== 3) return void 0;
|
|
907
|
+
var _parts_map = _sliced_to_array(parts.map(function(p) {
|
|
908
|
+
return parseFloat(p);
|
|
909
|
+
}), 3), h = _parts_map[0], m = _parts_map[1], s = _parts_map[2];
|
|
910
|
+
if (![
|
|
911
|
+
h,
|
|
912
|
+
m,
|
|
913
|
+
s
|
|
914
|
+
].every(function(n) {
|
|
915
|
+
return n !== void 0 && Number.isFinite(n);
|
|
916
|
+
})) {
|
|
917
|
+
return void 0;
|
|
918
|
+
}
|
|
919
|
+
return h * 3600 + m * 60 + s;
|
|
920
|
+
}
|
|
921
|
+
function parseProgressOffset(offset) {
|
|
922
|
+
if (!offset) return void 0;
|
|
923
|
+
var trimmed = offset.trim();
|
|
924
|
+
if (trimmed.endsWith("%")) {
|
|
925
|
+
var percent = parseFloat(trimmed);
|
|
926
|
+
return Number.isFinite(percent) ? {
|
|
927
|
+
offsetPercent: percent
|
|
928
|
+
} : void 0;
|
|
929
|
+
}
|
|
930
|
+
var seconds = parseVastTime(trimmed);
|
|
931
|
+
return seconds !== void 0 ? {
|
|
932
|
+
offsetSeconds: seconds
|
|
933
|
+
} : void 0;
|
|
934
|
+
}
|
|
875
935
|
var MAX_VAST_WRAPPER_DEPTH = 5;
|
|
876
936
|
var BEACON_TIMEOUT_MS = 3e4;
|
|
877
937
|
var inFlightBeacons = /* @__PURE__ */ new Set();
|
|
878
938
|
var VAST_ERROR_MEDIA_DISPLAY = 405;
|
|
939
|
+
var VAST_ERROR_WRAPPER_TIMEOUT = 301;
|
|
940
|
+
var VAST_ERROR_WRAPPER_LIMIT = 302;
|
|
941
|
+
var VAST_ERROR_WRAPPER_NO_ADS = 303;
|
|
942
|
+
var VAST_ERROR_NO_SUPPORTED_MEDIA = 403;
|
|
943
|
+
var VERIFICATION_NOT_SUPPORTED_REASON = 2;
|
|
944
|
+
var VIEWABLE_MIN_VISIBLE_RATIO = 0.5;
|
|
945
|
+
var VIEWABLE_MIN_CONTINUOUS_S = 2;
|
|
879
946
|
function toVastMediaErrorCode(error) {
|
|
880
947
|
switch(error === null || error === void 0 ? void 0 : error.code){
|
|
881
948
|
case 1:
|
|
@@ -903,6 +970,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
903
970
|
var adHls;
|
|
904
971
|
var adContainerEl = (_contentVideo_AD_CONTAINER_PROP = contentVideo[AD_CONTAINER_PROP]) !== null && _contentVideo_AD_CONTAINER_PROP !== void 0 ? _contentVideo_AD_CONTAINER_PROP : void 0;
|
|
905
972
|
var adEventHandlers = [];
|
|
973
|
+
var containerHandlers = [];
|
|
906
974
|
var currentAd;
|
|
907
975
|
var currentAdMediaFile;
|
|
908
976
|
var podAds = [];
|
|
@@ -920,14 +988,28 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
920
988
|
var sawDecodedVideoFrame = false;
|
|
921
989
|
var videoFrameCallbackHandle;
|
|
922
990
|
var pendingPlayPromise;
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
991
|
+
function createTrackingState() {
|
|
992
|
+
return {
|
|
993
|
+
impression: false,
|
|
994
|
+
loaded: false,
|
|
995
|
+
start: false,
|
|
996
|
+
firstQuartile: false,
|
|
997
|
+
midpoint: false,
|
|
998
|
+
thirdQuartile: false,
|
|
999
|
+
complete: false,
|
|
1000
|
+
viewabilitySettled: false,
|
|
1001
|
+
lastMuted: void 0,
|
|
1002
|
+
progressFired: /* @__PURE__ */ new Set()
|
|
1003
|
+
};
|
|
1004
|
+
}
|
|
1005
|
+
var trackingFired = createTrackingState();
|
|
1006
|
+
var resolvedAds = /* @__PURE__ */ new Set();
|
|
1007
|
+
var viewObserver;
|
|
1008
|
+
var visibleRatio = 0;
|
|
1009
|
+
var continuousVisibleS = 0;
|
|
1010
|
+
var lastViewSampleTime;
|
|
1011
|
+
var lastPlayerExpanded = false;
|
|
1012
|
+
var documentHandlers = [];
|
|
931
1013
|
function emit(event, payload) {
|
|
932
1014
|
var set = listeners.get(event);
|
|
933
1015
|
if (!set) return;
|
|
@@ -956,7 +1038,11 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
956
1038
|
}
|
|
957
1039
|
}
|
|
958
1040
|
}
|
|
959
|
-
function buildTrackingMacroContext(
|
|
1041
|
+
function buildTrackingMacroContext() {
|
|
1042
|
+
var options2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
1043
|
+
var _options2_ad;
|
|
1044
|
+
var errorCode = options2.errorCode, reason = options2.reason;
|
|
1045
|
+
var ad = (_options2_ad = options2.ad) !== null && _options2_ad !== void 0 ? _options2_ad : currentAd;
|
|
960
1046
|
var context = {
|
|
961
1047
|
adPlayheadSeconds: adVideoElement === null || adVideoElement === void 0 ? void 0 : adVideoElement.currentTime,
|
|
962
1048
|
contentPlayheadSeconds: contentVideo.currentTime,
|
|
@@ -977,11 +1063,17 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
977
1063
|
if (podAds.length > 0) {
|
|
978
1064
|
context.podSequence = podIndex + 1;
|
|
979
1065
|
}
|
|
1066
|
+
if (ad === null || ad === void 0 ? void 0 : ad.adServingId) {
|
|
1067
|
+
context.adServingId = ad.adServingId;
|
|
1068
|
+
}
|
|
1069
|
+
if (reason != null) {
|
|
1070
|
+
context.reason = reason;
|
|
1071
|
+
}
|
|
980
1072
|
return context;
|
|
981
1073
|
}
|
|
982
1074
|
function fireTrackingPixels(urls, options2) {
|
|
983
1075
|
if (!urls || urls.length === 0) return;
|
|
984
|
-
var macroContext = buildTrackingMacroContext(options2
|
|
1076
|
+
var macroContext = buildTrackingMacroContext(options2);
|
|
985
1077
|
urls.forEach(function(url) {
|
|
986
1078
|
try {
|
|
987
1079
|
var trackingUrl = substituteVastTrackingMacros(url, macroContext);
|
|
@@ -1092,8 +1184,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1092
1184
|
var url = (mediaFile.url.toLowerCase().split("?")[0] || "").trim();
|
|
1093
1185
|
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");
|
|
1094
1186
|
}
|
|
1095
|
-
function collectVideoMediaFiles(
|
|
1096
|
-
var mediaFileElements =
|
|
1187
|
+
function collectVideoMediaFiles(linear, verbose) {
|
|
1188
|
+
var mediaFileElements = linear.querySelectorAll(":scope > MediaFiles > MediaFile");
|
|
1097
1189
|
var mediaFiles = [];
|
|
1098
1190
|
if (verbose) {
|
|
1099
1191
|
console.log("[HlsAdPlayer] Found ".concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
|
|
@@ -1113,6 +1205,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1113
1205
|
}
|
|
1114
1206
|
return;
|
|
1115
1207
|
}
|
|
1208
|
+
var apiFramework = (mf.getAttribute("apiFramework") || "").toUpperCase();
|
|
1209
|
+
if (apiFramework === "VPAID") {
|
|
1210
|
+
if (verbose) {
|
|
1211
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, " ignored (VPAID creatives are not supported)"));
|
|
1212
|
+
}
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1116
1215
|
var bitrateAttr = mf.getAttribute("bitrate");
|
|
1117
1216
|
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
1118
1217
|
var mediaFile = {
|
|
@@ -1143,114 +1242,144 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1143
1242
|
return mediaFiles;
|
|
1144
1243
|
}
|
|
1145
1244
|
function createEmptyTrackingUrls() {
|
|
1146
|
-
|
|
1245
|
+
var urls = {
|
|
1147
1246
|
impression: [],
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
pause: [],
|
|
1156
|
-
resume: [],
|
|
1157
|
-
fullscreen: [],
|
|
1158
|
-
exitFullscreen: [],
|
|
1159
|
-
skip: [],
|
|
1160
|
-
error: []
|
|
1247
|
+
clickTracking: [],
|
|
1248
|
+
error: [],
|
|
1249
|
+
viewable: [],
|
|
1250
|
+
notViewable: [],
|
|
1251
|
+
viewUndetermined: [],
|
|
1252
|
+
verificationNotExecuted: [],
|
|
1253
|
+
progress: []
|
|
1161
1254
|
};
|
|
1255
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1256
|
+
try {
|
|
1257
|
+
for(var _iterator = LINEAR_TRACKING_EVENTS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1258
|
+
var event = _step.value;
|
|
1259
|
+
urls[event] = [];
|
|
1260
|
+
}
|
|
1261
|
+
} catch (err) {
|
|
1262
|
+
_didIteratorError = true;
|
|
1263
|
+
_iteratorError = err;
|
|
1264
|
+
} finally{
|
|
1265
|
+
try {
|
|
1266
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1267
|
+
_iterator.return();
|
|
1268
|
+
}
|
|
1269
|
+
} finally{
|
|
1270
|
+
if (_didIteratorError) {
|
|
1271
|
+
throw _iteratorError;
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
return urls;
|
|
1162
1276
|
}
|
|
1163
|
-
function
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
1168
|
-
if (url) trackingUrls.impression.push(url);
|
|
1277
|
+
function pushUrls(target, elements) {
|
|
1278
|
+
elements.forEach(function(el) {
|
|
1279
|
+
var url = textOf(el);
|
|
1280
|
+
if (url) target.push(url);
|
|
1169
1281
|
});
|
|
1170
|
-
|
|
1171
|
-
|
|
1282
|
+
}
|
|
1283
|
+
function collectLinearTracking(linear, into) {
|
|
1284
|
+
linear.querySelectorAll(":scope > TrackingEvents > Tracking").forEach(function(el) {
|
|
1172
1285
|
var event = el.getAttribute("event");
|
|
1173
|
-
var url = (
|
|
1174
|
-
if (event
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1286
|
+
var url = textOf(el);
|
|
1287
|
+
if (!event || !url) return;
|
|
1288
|
+
if (event === "progress") {
|
|
1289
|
+
var offset = parseProgressOffset(el.getAttribute("offset"));
|
|
1290
|
+
if (offset) into.progress.push(_object_spread({
|
|
1291
|
+
url: url
|
|
1292
|
+
}, offset));
|
|
1293
|
+
return;
|
|
1294
|
+
}
|
|
1295
|
+
if (LINEAR_TRACKING_EVENTS.indexOf(event) !== -1) {
|
|
1296
|
+
into[event].push(url);
|
|
1179
1297
|
}
|
|
1180
1298
|
});
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1299
|
+
pushUrls(into.clickTracking, linear.querySelectorAll(":scope > VideoClicks > ClickTracking"));
|
|
1300
|
+
}
|
|
1301
|
+
function collectAdLevelTracking(adBody, into) {
|
|
1302
|
+
pushUrls(into.impression, adBody.querySelectorAll(":scope > Impression"));
|
|
1303
|
+
pushUrls(into.error, adBody.querySelectorAll(":scope > Error"));
|
|
1304
|
+
pushUrls(into.viewable, adBody.querySelectorAll(":scope > ViewableImpression > Viewable"));
|
|
1305
|
+
pushUrls(into.notViewable, adBody.querySelectorAll(":scope > ViewableImpression > NotViewable"));
|
|
1306
|
+
pushUrls(into.viewUndetermined, adBody.querySelectorAll(":scope > ViewableImpression > ViewUndetermined"));
|
|
1307
|
+
adBody.querySelectorAll(':scope > AdVerifications > Verification, :scope > Extensions > Extension[type="AdVerifications"] > AdVerifications > Verification').forEach(function(verification) {
|
|
1308
|
+
pushUrls(into.verificationNotExecuted, verification.querySelectorAll(':scope > TrackingEvents > Tracking[event="verificationNotExecuted"]'));
|
|
1185
1309
|
});
|
|
1186
|
-
return trackingUrls;
|
|
1187
1310
|
}
|
|
1188
1311
|
function mergeTrackingUrls(target, source) {
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1312
|
+
var targetLists = target;
|
|
1313
|
+
var sourceLists = source;
|
|
1314
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1315
|
+
try {
|
|
1316
|
+
for(var _iterator = Object.keys(targetLists)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1317
|
+
var key = _step.value;
|
|
1318
|
+
var incoming = sourceLists[key];
|
|
1319
|
+
if (incoming && incoming.length > 0) {
|
|
1320
|
+
targetLists[key] = targetLists[key].concat(incoming);
|
|
1321
|
+
}
|
|
1192
1322
|
}
|
|
1193
|
-
})
|
|
1323
|
+
} catch (err) {
|
|
1324
|
+
_didIteratorError = true;
|
|
1325
|
+
_iteratorError = err;
|
|
1326
|
+
} finally{
|
|
1327
|
+
try {
|
|
1328
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1329
|
+
_iterator.return();
|
|
1330
|
+
}
|
|
1331
|
+
} finally{
|
|
1332
|
+
if (_didIteratorError) {
|
|
1333
|
+
throw _iteratorError;
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1194
1337
|
return target;
|
|
1195
1338
|
}
|
|
1339
|
+
function parseXml(xmlString) {
|
|
1340
|
+
var xmlDoc = new DOMParser().parseFromString(xmlString, "text/xml");
|
|
1341
|
+
var parserError = xmlDoc.querySelector("parsererror");
|
|
1342
|
+
if (parserError) {
|
|
1343
|
+
console.error("[HlsAdPlayer] XML parsing error (malformed VAST XML):", parserError.textContent);
|
|
1344
|
+
return null;
|
|
1345
|
+
}
|
|
1346
|
+
return xmlDoc;
|
|
1347
|
+
}
|
|
1348
|
+
function getAdSequence(adElement) {
|
|
1349
|
+
var sequence = parseInt(adElement.getAttribute("sequence") || "", 10);
|
|
1350
|
+
return Number.isFinite(sequence) ? sequence : void 0;
|
|
1351
|
+
}
|
|
1352
|
+
function emptyVastResult(root) {
|
|
1353
|
+
var errorUrls = [];
|
|
1354
|
+
pushUrls(errorUrls, root.querySelectorAll(":scope > Error"));
|
|
1355
|
+
return {
|
|
1356
|
+
type: "empty",
|
|
1357
|
+
errorUrls: errorUrls,
|
|
1358
|
+
errorCode: VAST_ERROR_WRAPPER_NO_ADS
|
|
1359
|
+
};
|
|
1360
|
+
}
|
|
1196
1361
|
function parseVastXml(xmlString) {
|
|
1197
1362
|
try {
|
|
1198
|
-
var
|
|
1199
|
-
var
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
}
|
|
1208
|
-
var adElement = xmlDoc.querySelector("Ad");
|
|
1363
|
+
var _adElements_find;
|
|
1364
|
+
var xmlDoc = parseXml(xmlString);
|
|
1365
|
+
if (!xmlDoc) return {
|
|
1366
|
+
type: "empty"
|
|
1367
|
+
};
|
|
1368
|
+
var root = xmlDoc.documentElement;
|
|
1369
|
+
var adElements = Array.from(root.querySelectorAll(":scope > Ad"));
|
|
1370
|
+
var adElement = (_adElements_find = adElements.find(function(el) {
|
|
1371
|
+
return getAdSequence(el) === void 0;
|
|
1372
|
+
})) !== null && _adElements_find !== void 0 ? _adElements_find : adElements[0];
|
|
1209
1373
|
if (!adElement) {
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
};
|
|
1374
|
+
var _root_getAttribute;
|
|
1375
|
+
console.warn("[HlsAdPlayer] No Ad element found in VAST ".concat((_root_getAttribute = root.getAttribute("version")) !== null && _root_getAttribute !== void 0 ? _root_getAttribute : "", " response"));
|
|
1376
|
+
return emptyVastResult(root);
|
|
1214
1377
|
}
|
|
1215
|
-
var
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
var wrapperUri = (_xmlDoc_querySelector2 = xmlDoc.querySelector("VASTAdTagURI")) === null || _xmlDoc_querySelector2 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent1 = _xmlDoc_querySelector2.textContent) === null || _xmlDoc_querySelector_textContent1 === void 0 ? void 0 : _xmlDoc_querySelector_textContent1.trim();
|
|
1219
|
-
if (wrapperUri) {
|
|
1220
|
-
console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(wrapperUri));
|
|
1221
|
-
return {
|
|
1222
|
-
type: "wrapper",
|
|
1223
|
-
vastAdTagUri: wrapperUri,
|
|
1224
|
-
trackingUrls: extractTrackingUrls(xmlDoc),
|
|
1225
|
-
clickThrough: clickThrough
|
|
1226
|
-
};
|
|
1378
|
+
var parsed = parseAdElement(adElement, true);
|
|
1379
|
+
if (parsed.type === "wrapper") {
|
|
1380
|
+
console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(parsed.vastAdTagUri));
|
|
1227
1381
|
}
|
|
1228
|
-
|
|
1229
|
-
var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
|
|
1230
|
-
var durationParts = durationText.split(":");
|
|
1231
|
-
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
1232
|
-
var mediaFiles = collectVideoMediaFiles(xmlDoc, true);
|
|
1233
|
-
if (mediaFiles.length === 0) {
|
|
1234
|
-
if (isNoAdAvailable) {
|
|
1235
|
-
console.warn("[HlsAdPlayer] No ads available (VAST response indicates no ads)");
|
|
1236
|
-
} else {
|
|
1237
|
-
console.warn("[HlsAdPlayer] No supported media files found in VAST XML");
|
|
1238
|
-
}
|
|
1239
|
-
return {
|
|
1240
|
-
type: "empty"
|
|
1241
|
-
};
|
|
1242
|
-
}
|
|
1243
|
-
return {
|
|
1244
|
-
type: "inline",
|
|
1245
|
-
ad: {
|
|
1246
|
-
id: adId,
|
|
1247
|
-
title: title,
|
|
1248
|
-
duration: duration,
|
|
1249
|
-
mediaFiles: mediaFiles,
|
|
1250
|
-
trackingUrls: extractTrackingUrls(xmlDoc),
|
|
1251
|
-
clickThrough: clickThrough
|
|
1252
|
-
}
|
|
1253
|
-
};
|
|
1382
|
+
return parsed;
|
|
1254
1383
|
} catch (error) {
|
|
1255
1384
|
console.error("[HlsAdPlayer] Error parsing VAST XML:", error);
|
|
1256
1385
|
return {
|
|
@@ -1259,48 +1388,101 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1259
1388
|
}
|
|
1260
1389
|
}
|
|
1261
1390
|
function parseAdElement(adElement) {
|
|
1391
|
+
var verbose = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
|
1262
1392
|
try {
|
|
1263
|
-
var
|
|
1264
|
-
var
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1393
|
+
var _parseVastTime;
|
|
1394
|
+
var wrapper = adElement.querySelector(":scope > Wrapper");
|
|
1395
|
+
if (wrapper) {
|
|
1396
|
+
var vastAdTagUri = textOf(wrapper.querySelector(":scope > VASTAdTagURI"));
|
|
1397
|
+
if (!vastAdTagUri) {
|
|
1398
|
+
console.warn("[HlsAdPlayer] <Wrapper> has no VASTAdTagURI");
|
|
1399
|
+
return {
|
|
1400
|
+
type: "empty"
|
|
1401
|
+
};
|
|
1402
|
+
}
|
|
1403
|
+
var trackingUrls2 = createEmptyTrackingUrls();
|
|
1404
|
+
collectAdLevelTracking(wrapper, trackingUrls2);
|
|
1405
|
+
wrapper.querySelectorAll(":scope > Creatives > Creative > Linear").forEach(function(linear2) {
|
|
1406
|
+
return collectLinearTracking(linear2, trackingUrls2);
|
|
1407
|
+
});
|
|
1269
1408
|
return {
|
|
1270
1409
|
type: "wrapper",
|
|
1271
|
-
vastAdTagUri:
|
|
1272
|
-
trackingUrls:
|
|
1273
|
-
|
|
1410
|
+
vastAdTagUri: vastAdTagUri,
|
|
1411
|
+
trackingUrls: trackingUrls2,
|
|
1412
|
+
rules: {
|
|
1413
|
+
followAdditionalWrappers: wrapper.getAttribute("followAdditionalWrappers") !== "false"
|
|
1414
|
+
}
|
|
1274
1415
|
};
|
|
1275
1416
|
}
|
|
1276
|
-
var
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
1280
|
-
var mediaFiles = collectVideoMediaFiles(adElement, false);
|
|
1281
|
-
if (mediaFiles.length === 0) {
|
|
1282
|
-
if (isNoAdAvailable) {
|
|
1283
|
-
console.warn("[HlsAdPlayer] Pod <Ad> indicates no ad available");
|
|
1284
|
-
} else {
|
|
1285
|
-
console.warn("[HlsAdPlayer] No supported media files in pod <Ad>");
|
|
1286
|
-
}
|
|
1417
|
+
var inLine = adElement.querySelector(":scope > InLine");
|
|
1418
|
+
if (!inLine) {
|
|
1419
|
+
console.warn("[HlsAdPlayer] <Ad> has neither <InLine> nor <Wrapper>");
|
|
1287
1420
|
return {
|
|
1288
1421
|
type: "empty"
|
|
1289
1422
|
};
|
|
1290
1423
|
}
|
|
1424
|
+
var errorUrls = [];
|
|
1425
|
+
pushUrls(errorUrls, inLine.querySelectorAll(":scope > Error"));
|
|
1426
|
+
if (adElement.getAttribute("conditionalAd") === "true") {
|
|
1427
|
+
console.warn("[HlsAdPlayer] Skipping conditional <Ad> (VPAID-only)");
|
|
1428
|
+
return {
|
|
1429
|
+
type: "empty",
|
|
1430
|
+
errorUrls: errorUrls,
|
|
1431
|
+
errorCode: VAST_ERROR_NO_SUPPORTED_MEDIA
|
|
1432
|
+
};
|
|
1433
|
+
}
|
|
1434
|
+
var linear;
|
|
1435
|
+
var mediaFiles = [];
|
|
1436
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1437
|
+
try {
|
|
1438
|
+
for(var _iterator = Array.from(inLine.querySelectorAll(":scope > Creatives > Creative > Linear"))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1439
|
+
var candidate = _step.value;
|
|
1440
|
+
var files = collectVideoMediaFiles(candidate, verbose);
|
|
1441
|
+
if (files.length > 0) {
|
|
1442
|
+
linear = candidate;
|
|
1443
|
+
mediaFiles = files;
|
|
1444
|
+
break;
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
} catch (err) {
|
|
1448
|
+
_didIteratorError = true;
|
|
1449
|
+
_iteratorError = err;
|
|
1450
|
+
} finally{
|
|
1451
|
+
try {
|
|
1452
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1453
|
+
_iterator.return();
|
|
1454
|
+
}
|
|
1455
|
+
} finally{
|
|
1456
|
+
if (_didIteratorError) {
|
|
1457
|
+
throw _iteratorError;
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
if (!linear) {
|
|
1462
|
+
console.warn("[HlsAdPlayer] No supported linear media files in <Ad>");
|
|
1463
|
+
return {
|
|
1464
|
+
type: "empty",
|
|
1465
|
+
errorUrls: errorUrls,
|
|
1466
|
+
errorCode: VAST_ERROR_NO_SUPPORTED_MEDIA
|
|
1467
|
+
};
|
|
1468
|
+
}
|
|
1469
|
+
var trackingUrls = createEmptyTrackingUrls();
|
|
1470
|
+
collectAdLevelTracking(inLine, trackingUrls);
|
|
1471
|
+
collectLinearTracking(linear, trackingUrls);
|
|
1291
1472
|
return {
|
|
1292
1473
|
type: "inline",
|
|
1293
1474
|
ad: {
|
|
1294
|
-
id:
|
|
1295
|
-
title:
|
|
1296
|
-
duration:
|
|
1475
|
+
id: adElement.getAttribute("id") || "unknown",
|
|
1476
|
+
title: textOf(inLine.querySelector(":scope > AdTitle")) || "Ad",
|
|
1477
|
+
duration: (_parseVastTime = parseVastTime(textOf(linear.querySelector(":scope > Duration")))) !== null && _parseVastTime !== void 0 ? _parseVastTime : 30,
|
|
1297
1478
|
mediaFiles: mediaFiles,
|
|
1298
|
-
trackingUrls:
|
|
1299
|
-
clickThrough:
|
|
1479
|
+
trackingUrls: trackingUrls,
|
|
1480
|
+
clickThrough: textOf(linear.querySelector(":scope > VideoClicks > ClickThrough")),
|
|
1481
|
+
adServingId: textOf(inLine.querySelector(":scope > AdServingId"))
|
|
1300
1482
|
}
|
|
1301
1483
|
};
|
|
1302
1484
|
} catch (error) {
|
|
1303
|
-
console.error("[HlsAdPlayer] Error parsing
|
|
1485
|
+
console.error("[HlsAdPlayer] Error parsing <Ad> element:", error);
|
|
1304
1486
|
return {
|
|
1305
1487
|
type: "empty"
|
|
1306
1488
|
};
|
|
@@ -1379,30 +1561,63 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1379
1561
|
}
|
|
1380
1562
|
function fetchAndParseVastAd(_0) {
|
|
1381
1563
|
return _async_to_generator(function(vastTagUrl) {
|
|
1382
|
-
var depth, accumulatedTracking, vastXml, parsed;
|
|
1564
|
+
var depth, accumulatedTracking, rules, vastXml, error, parsed, _parsed_errorUrls, _parsed_errorCode;
|
|
1383
1565
|
var _arguments = arguments;
|
|
1384
1566
|
return _ts_generator(this, function(_state) {
|
|
1385
1567
|
switch(_state.label){
|
|
1386
1568
|
case 0:
|
|
1387
|
-
depth = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : 0, accumulatedTracking = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : createEmptyTrackingUrls()
|
|
1569
|
+
depth = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : 0, accumulatedTracking = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : createEmptyTrackingUrls(), rules = _arguments.length > 3 && _arguments[3] !== void 0 ? _arguments[3] : {
|
|
1570
|
+
followAdditionalWrappers: true
|
|
1571
|
+
};
|
|
1572
|
+
_state.label = 1;
|
|
1573
|
+
case 1:
|
|
1574
|
+
_state.trys.push([
|
|
1575
|
+
1,
|
|
1576
|
+
3,
|
|
1577
|
+
,
|
|
1578
|
+
4
|
|
1579
|
+
]);
|
|
1388
1580
|
return [
|
|
1389
1581
|
4,
|
|
1390
1582
|
fetchVastXml(vastTagUrl, depth === 0 ? "include" : "omit")
|
|
1391
1583
|
];
|
|
1392
|
-
case
|
|
1584
|
+
case 2:
|
|
1393
1585
|
vastXml = _state.sent();
|
|
1586
|
+
return [
|
|
1587
|
+
3,
|
|
1588
|
+
4
|
|
1589
|
+
];
|
|
1590
|
+
case 3:
|
|
1591
|
+
error = _state.sent();
|
|
1592
|
+
if (depth === 0) throw error;
|
|
1593
|
+
console.warn("[HlsAdPlayer] Wrapped VAST request failed:", error);
|
|
1594
|
+
fireTrackingPixels(accumulatedTracking.error, {
|
|
1595
|
+
errorCode: VAST_ERROR_WRAPPER_TIMEOUT
|
|
1596
|
+
});
|
|
1597
|
+
return [
|
|
1598
|
+
2,
|
|
1599
|
+
null
|
|
1600
|
+
];
|
|
1601
|
+
case 4:
|
|
1394
1602
|
console.log("[HlsAdPlayer] VAST XML received");
|
|
1395
1603
|
console.log("[HlsAdPlayer] VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
|
|
1396
1604
|
parsed = parseVastXml(vastXml);
|
|
1397
1605
|
if (parsed.type === "empty") {
|
|
1606
|
+
;
|
|
1607
|
+
fireTrackingPixels(((_parsed_errorUrls = parsed.errorUrls) !== null && _parsed_errorUrls !== void 0 ? _parsed_errorUrls : []).concat(accumulatedTracking.error), {
|
|
1608
|
+
errorCode: (_parsed_errorCode = parsed.errorCode) !== null && _parsed_errorCode !== void 0 ? _parsed_errorCode : VAST_ERROR_WRAPPER_NO_ADS
|
|
1609
|
+
});
|
|
1398
1610
|
return [
|
|
1399
1611
|
2,
|
|
1400
1612
|
null
|
|
1401
1613
|
];
|
|
1402
1614
|
}
|
|
1403
1615
|
if (parsed.type === "wrapper") {
|
|
1404
|
-
if (depth >= MAX_VAST_WRAPPER_DEPTH) {
|
|
1405
|
-
console.warn("[HlsAdPlayer] VAST wrapper depth limit (".concat(MAX_VAST_WRAPPER_DEPTH, ") reached, aborting redirect chain"));
|
|
1616
|
+
if (depth >= MAX_VAST_WRAPPER_DEPTH || !rules.followAdditionalWrappers) {
|
|
1617
|
+
console.warn(rules.followAdditionalWrappers ? "[HlsAdPlayer] VAST wrapper depth limit (".concat(MAX_VAST_WRAPPER_DEPTH, ") reached, aborting redirect chain") : '[HlsAdPlayer] Parent wrapper set followAdditionalWrappers="false"; rejecting nested wrapper');
|
|
1618
|
+
fireTrackingPixels(accumulatedTracking.error.concat(parsed.trackingUrls.error), {
|
|
1619
|
+
errorCode: VAST_ERROR_WRAPPER_LIMIT
|
|
1620
|
+
});
|
|
1406
1621
|
return [
|
|
1407
1622
|
2,
|
|
1408
1623
|
null
|
|
@@ -1411,7 +1626,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1411
1626
|
mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);
|
|
1412
1627
|
return [
|
|
1413
1628
|
2,
|
|
1414
|
-
fetchAndParseVastAd(parsed.vastAdTagUri, depth + 1, accumulatedTracking)
|
|
1629
|
+
fetchAndParseVastAd(parsed.vastAdTagUri, depth + 1, accumulatedTracking, parsed.rules)
|
|
1415
1630
|
];
|
|
1416
1631
|
}
|
|
1417
1632
|
mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);
|
|
@@ -1425,7 +1640,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1425
1640
|
}
|
|
1426
1641
|
function fetchAndParsePod(vastTagUrl) {
|
|
1427
1642
|
return _async_to_generator(function() {
|
|
1428
|
-
var vastXml, trimmedXml,
|
|
1643
|
+
var _root_getAttribute, vastXml, trimmedXml, xmlDoc, root, adElements, _root_getAttribute1, _empty_errorUrls, empty, _empty_errorCode, resolveAd, podElements, buffet, ads, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, adElement, ad, err, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, adElement1, ad1, err;
|
|
1429
1644
|
return _ts_generator(this, function(_state) {
|
|
1430
1645
|
switch(_state.label){
|
|
1431
1646
|
case 0:
|
|
@@ -1444,125 +1659,212 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1444
1659
|
[]
|
|
1445
1660
|
];
|
|
1446
1661
|
}
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
console.error("[HlsAdPlayer] Pod VAST XML parsing error (malformed). Content (first 2000 chars):", vastXml.substring(0, 2e3));
|
|
1662
|
+
xmlDoc = parseXml(vastXml);
|
|
1663
|
+
if (!xmlDoc) {
|
|
1664
|
+
console.error("[HlsAdPlayer] Pod VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
|
|
1451
1665
|
return [
|
|
1452
1666
|
2,
|
|
1453
1667
|
[]
|
|
1454
1668
|
];
|
|
1455
1669
|
}
|
|
1456
|
-
|
|
1670
|
+
root = xmlDoc.documentElement;
|
|
1671
|
+
adElements = Array.from(root.querySelectorAll(":scope > Ad"));
|
|
1457
1672
|
if (adElements.length === 0) {
|
|
1458
|
-
|
|
1673
|
+
;
|
|
1674
|
+
;
|
|
1675
|
+
console.warn("[HlsAdPlayer] No <Ad> elements in VAST ".concat((_root_getAttribute1 = root.getAttribute("version")) !== null && _root_getAttribute1 !== void 0 ? _root_getAttribute1 : "", " pod response (no fill)"));
|
|
1676
|
+
empty = emptyVastResult(root);
|
|
1677
|
+
if (empty.type === "empty" && ((_empty_errorUrls = empty.errorUrls) === null || _empty_errorUrls === void 0 ? void 0 : _empty_errorUrls.length)) {
|
|
1678
|
+
;
|
|
1679
|
+
fireTrackingPixels(empty.errorUrls, {
|
|
1680
|
+
errorCode: (_empty_errorCode = empty.errorCode) !== null && _empty_errorCode !== void 0 ? _empty_errorCode : VAST_ERROR_WRAPPER_NO_ADS
|
|
1681
|
+
});
|
|
1682
|
+
}
|
|
1459
1683
|
return [
|
|
1460
1684
|
2,
|
|
1461
1685
|
[]
|
|
1462
1686
|
];
|
|
1463
1687
|
}
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1688
|
+
resolveAd = function resolveAd(adElement) {
|
|
1689
|
+
return _async_to_generator(function() {
|
|
1690
|
+
var _parsed_errorUrls, parsed, _parsed_errorCode;
|
|
1691
|
+
return _ts_generator(this, function(_state) {
|
|
1692
|
+
parsed = parseAdElement(adElement);
|
|
1693
|
+
if (parsed.type === "inline") return [
|
|
1694
|
+
2,
|
|
1695
|
+
parsed.ad
|
|
1696
|
+
];
|
|
1697
|
+
if (parsed.type === "wrapper") {
|
|
1698
|
+
return [
|
|
1699
|
+
2,
|
|
1700
|
+
fetchAndParseVastAd(parsed.vastAdTagUri, 1, parsed.trackingUrls, parsed.rules)
|
|
1701
|
+
];
|
|
1702
|
+
}
|
|
1703
|
+
if ((_parsed_errorUrls = parsed.errorUrls) === null || _parsed_errorUrls === void 0 ? void 0 : _parsed_errorUrls.length) {
|
|
1704
|
+
;
|
|
1705
|
+
fireTrackingPixels(parsed.errorUrls, {
|
|
1706
|
+
errorCode: (_parsed_errorCode = parsed.errorCode) !== null && _parsed_errorCode !== void 0 ? _parsed_errorCode : VAST_ERROR_NO_SUPPORTED_MEDIA
|
|
1707
|
+
});
|
|
1708
|
+
}
|
|
1709
|
+
return [
|
|
1710
|
+
2,
|
|
1711
|
+
null
|
|
1712
|
+
];
|
|
1713
|
+
});
|
|
1714
|
+
})();
|
|
1715
|
+
};
|
|
1716
|
+
podElements = adElements.filter(function(el) {
|
|
1717
|
+
return getAdSequence(el) !== void 0;
|
|
1718
|
+
}).sort(function(a, b) {
|
|
1719
|
+
return getAdSequence(a) - getAdSequence(b);
|
|
1720
|
+
});
|
|
1721
|
+
buffet = adElements.filter(function(el) {
|
|
1722
|
+
return getAdSequence(el) === void 0;
|
|
1470
1723
|
});
|
|
1471
1724
|
ads = [];
|
|
1725
|
+
if (!(podElements.length === 0)) return [
|
|
1726
|
+
3,
|
|
1727
|
+
10
|
|
1728
|
+
];
|
|
1472
1729
|
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1473
1730
|
_state.label = 2;
|
|
1474
1731
|
case 2:
|
|
1475
1732
|
_state.trys.push([
|
|
1476
1733
|
2,
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1734
|
+
7,
|
|
1735
|
+
8,
|
|
1736
|
+
9
|
|
1480
1737
|
]);
|
|
1481
|
-
_iterator =
|
|
1738
|
+
_iterator = buffet[Symbol.iterator]();
|
|
1482
1739
|
_state.label = 3;
|
|
1483
1740
|
case 3:
|
|
1484
1741
|
if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
|
|
1485
1742
|
3,
|
|
1486
|
-
|
|
1743
|
+
6
|
|
1487
1744
|
];
|
|
1488
1745
|
adElement = _step.value;
|
|
1489
|
-
parsed = parseAdElement(adElement);
|
|
1490
|
-
if (!(parsed.type === "inline")) return [
|
|
1491
|
-
3,
|
|
1492
|
-
4
|
|
1493
|
-
];
|
|
1494
|
-
ads.push(parsed.ad);
|
|
1495
1746
|
return [
|
|
1496
|
-
|
|
1497
|
-
|
|
1747
|
+
4,
|
|
1748
|
+
resolveAd(adElement)
|
|
1498
1749
|
];
|
|
1499
1750
|
case 4:
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
8
|
|
1503
|
-
];
|
|
1751
|
+
ad = _state.sent();
|
|
1752
|
+
if (ad) ads.push(ad);
|
|
1504
1753
|
_state.label = 5;
|
|
1505
1754
|
case 5:
|
|
1506
|
-
|
|
1507
|
-
5,
|
|
1508
|
-
7,
|
|
1509
|
-
,
|
|
1510
|
-
8
|
|
1511
|
-
]);
|
|
1755
|
+
_iteratorNormalCompletion = true;
|
|
1512
1756
|
return [
|
|
1513
|
-
|
|
1514
|
-
|
|
1757
|
+
3,
|
|
1758
|
+
3
|
|
1515
1759
|
];
|
|
1516
1760
|
case 6:
|
|
1517
|
-
resolved = _state.sent();
|
|
1518
|
-
if (resolved) {
|
|
1519
|
-
ads.push(resolved);
|
|
1520
|
-
}
|
|
1521
1761
|
return [
|
|
1522
1762
|
3,
|
|
1523
|
-
|
|
1763
|
+
9
|
|
1524
1764
|
];
|
|
1525
1765
|
case 7:
|
|
1526
|
-
|
|
1527
|
-
|
|
1766
|
+
err = _state.sent();
|
|
1767
|
+
_didIteratorError = true;
|
|
1768
|
+
_iteratorError = err;
|
|
1528
1769
|
return [
|
|
1529
1770
|
3,
|
|
1530
|
-
|
|
1771
|
+
9
|
|
1531
1772
|
];
|
|
1532
1773
|
case 8:
|
|
1533
|
-
|
|
1774
|
+
try {
|
|
1775
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1776
|
+
_iterator.return();
|
|
1777
|
+
}
|
|
1778
|
+
} finally{
|
|
1779
|
+
if (_didIteratorError) {
|
|
1780
|
+
throw _iteratorError;
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1534
1783
|
return [
|
|
1535
|
-
|
|
1536
|
-
3
|
|
1784
|
+
7
|
|
1537
1785
|
];
|
|
1538
1786
|
case 9:
|
|
1539
1787
|
return [
|
|
1540
1788
|
3,
|
|
1541
|
-
|
|
1789
|
+
21
|
|
1542
1790
|
];
|
|
1543
1791
|
case 10:
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1792
|
+
_iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
1793
|
+
_state.label = 11;
|
|
1794
|
+
case 11:
|
|
1795
|
+
_state.trys.push([
|
|
1796
|
+
11,
|
|
1797
|
+
19,
|
|
1798
|
+
20,
|
|
1799
|
+
21
|
|
1800
|
+
]);
|
|
1801
|
+
_iterator1 = podElements[Symbol.iterator]();
|
|
1802
|
+
_state.label = 12;
|
|
1803
|
+
case 12:
|
|
1804
|
+
if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
|
|
1805
|
+
3,
|
|
1806
|
+
18
|
|
1807
|
+
];
|
|
1808
|
+
adElement1 = _step1.value;
|
|
1809
|
+
return [
|
|
1810
|
+
4,
|
|
1811
|
+
resolveAd(adElement1)
|
|
1812
|
+
];
|
|
1813
|
+
case 13:
|
|
1814
|
+
ad1 = _state.sent();
|
|
1815
|
+
_state.label = 14;
|
|
1816
|
+
case 14:
|
|
1817
|
+
if (!(!ad1 && buffet.length > 0)) return [
|
|
1818
|
+
3,
|
|
1819
|
+
16
|
|
1820
|
+
];
|
|
1821
|
+
return [
|
|
1822
|
+
4,
|
|
1823
|
+
resolveAd(buffet.shift())
|
|
1824
|
+
];
|
|
1825
|
+
case 15:
|
|
1826
|
+
ad1 = _state.sent();
|
|
1827
|
+
return [
|
|
1828
|
+
3,
|
|
1829
|
+
14
|
|
1830
|
+
];
|
|
1831
|
+
case 16:
|
|
1832
|
+
if (ad1) ads.push(ad1);
|
|
1833
|
+
_state.label = 17;
|
|
1834
|
+
case 17:
|
|
1835
|
+
_iteratorNormalCompletion1 = true;
|
|
1547
1836
|
return [
|
|
1548
1837
|
3,
|
|
1549
1838
|
12
|
|
1550
1839
|
];
|
|
1551
|
-
case
|
|
1840
|
+
case 18:
|
|
1841
|
+
return [
|
|
1842
|
+
3,
|
|
1843
|
+
21
|
|
1844
|
+
];
|
|
1845
|
+
case 19:
|
|
1846
|
+
err = _state.sent();
|
|
1847
|
+
_didIteratorError1 = true;
|
|
1848
|
+
_iteratorError1 = err;
|
|
1849
|
+
return [
|
|
1850
|
+
3,
|
|
1851
|
+
21
|
|
1852
|
+
];
|
|
1853
|
+
case 20:
|
|
1552
1854
|
try {
|
|
1553
|
-
if (!
|
|
1554
|
-
|
|
1855
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
1856
|
+
_iterator1.return();
|
|
1555
1857
|
}
|
|
1556
1858
|
} finally{
|
|
1557
|
-
if (
|
|
1558
|
-
throw
|
|
1859
|
+
if (_didIteratorError1) {
|
|
1860
|
+
throw _iteratorError1;
|
|
1559
1861
|
}
|
|
1560
1862
|
}
|
|
1561
1863
|
return [
|
|
1562
1864
|
7
|
|
1563
1865
|
];
|
|
1564
|
-
case
|
|
1565
|
-
console.log("[HlsAdPlayer] Parsed ".concat(ads.length, " ad(s) from pod
|
|
1866
|
+
case 21:
|
|
1867
|
+
console.log("[HlsAdPlayer] Parsed ".concat(ads.length, " ad(s) from VAST ").concat((_root_getAttribute = root.getAttribute("version")) !== null && _root_getAttribute !== void 0 ? _root_getAttribute : "", " pod response"));
|
|
1566
1868
|
return [
|
|
1567
1869
|
2,
|
|
1568
1870
|
ads
|
|
@@ -1592,7 +1894,40 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1592
1894
|
var onTimeUpdate = function onTimeUpdate() {
|
|
1593
1895
|
if (!currentAd || !adVideoElement) return;
|
|
1594
1896
|
noteAdProgress();
|
|
1595
|
-
|
|
1897
|
+
sampleViewability();
|
|
1898
|
+
var currentTime = adVideoElement.currentTime;
|
|
1899
|
+
if (trackingFired.start) {
|
|
1900
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1901
|
+
try {
|
|
1902
|
+
for(var _iterator = currentAd.trackingUrls.progress[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1903
|
+
var event = _step.value;
|
|
1904
|
+
var _event_offsetSeconds, _event_offsetPercent;
|
|
1905
|
+
if (trackingFired.progressFired.has(event)) continue;
|
|
1906
|
+
var threshold = (_event_offsetSeconds = event.offsetSeconds) !== null && _event_offsetSeconds !== void 0 ? _event_offsetSeconds : ((_event_offsetPercent = event.offsetPercent) !== null && _event_offsetPercent !== void 0 ? _event_offsetPercent : 0) / 100 * currentAd.duration;
|
|
1907
|
+
if (currentTime >= threshold) {
|
|
1908
|
+
trackingFired.progressFired.add(event);
|
|
1909
|
+
fireTrackingPixels([
|
|
1910
|
+
event.url
|
|
1911
|
+
]);
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
} catch (err) {
|
|
1915
|
+
_didIteratorError = true;
|
|
1916
|
+
_iteratorError = err;
|
|
1917
|
+
} finally{
|
|
1918
|
+
try {
|
|
1919
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1920
|
+
_iterator.return();
|
|
1921
|
+
}
|
|
1922
|
+
} finally{
|
|
1923
|
+
if (_didIteratorError) {
|
|
1924
|
+
throw _iteratorError;
|
|
1925
|
+
}
|
|
1926
|
+
}
|
|
1927
|
+
}
|
|
1928
|
+
}
|
|
1929
|
+
if (!(currentAd.duration > 0)) return;
|
|
1930
|
+
var progress = currentTime / currentAd.duration;
|
|
1596
1931
|
if (progress >= 0.25 && !trackingFired.firstQuartile) {
|
|
1597
1932
|
trackingFired.firstQuartile = true;
|
|
1598
1933
|
fireTrackingPixels(currentAd.trackingUrls.firstQuartile);
|
|
@@ -1614,15 +1949,38 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1614
1949
|
handleVideoDecodeFailure();
|
|
1615
1950
|
}
|
|
1616
1951
|
};
|
|
1952
|
+
var onCanPlay = function onCanPlay() {
|
|
1953
|
+
if (!currentAd || trackingFired.loaded) return;
|
|
1954
|
+
trackingFired.loaded = true;
|
|
1955
|
+
fireTrackingPixels(currentAd.trackingUrls.loaded);
|
|
1956
|
+
};
|
|
1617
1957
|
var onPlaying = function onPlaying() {
|
|
1618
1958
|
startStallWatchdog();
|
|
1619
|
-
if (!currentAd ||
|
|
1959
|
+
if (!currentAd || !adVideoElement) return;
|
|
1960
|
+
if (!trackingFired.impression) {
|
|
1961
|
+
trackingFired.impression = true;
|
|
1962
|
+
resolvedAds.add(currentAd);
|
|
1963
|
+
fireTrackingPixels(currentAd.trackingUrls.impression);
|
|
1964
|
+
fireTrackingPixels(currentAd.trackingUrls.creativeView);
|
|
1965
|
+
fireTrackingPixels(currentAd.trackingUrls.verificationNotExecuted, {
|
|
1966
|
+
reason: VERIFICATION_NOT_SUPPORTED_REASON
|
|
1967
|
+
});
|
|
1968
|
+
emit("ad_impression", {
|
|
1969
|
+
adId: currentAd.id,
|
|
1970
|
+
index: podIndex,
|
|
1971
|
+
total: podAds.length || 1
|
|
1972
|
+
});
|
|
1973
|
+
}
|
|
1974
|
+
if (trackingFired.start) return;
|
|
1620
1975
|
trackingFired.start = true;
|
|
1976
|
+
trackingFired.lastMuted = adVideoElement.muted || adVideoElement.volume === 0;
|
|
1621
1977
|
fireTrackingPixels(currentAd.trackingUrls.start);
|
|
1622
1978
|
console.log("[HlsAdPlayer] Ad started playing");
|
|
1623
1979
|
};
|
|
1624
1980
|
var onEnded = function onEnded() {
|
|
1625
1981
|
if (!currentAd || trackingFired.complete) return;
|
|
1982
|
+
sampleViewability();
|
|
1983
|
+
settleViewability();
|
|
1626
1984
|
trackingFired.complete = true;
|
|
1627
1985
|
fireTrackingPixels(currentAd.trackingUrls.complete);
|
|
1628
1986
|
console.log("[HlsAdPlayer] Ad completed");
|
|
@@ -1634,11 +1992,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1634
1992
|
var onError = function onError(e) {
|
|
1635
1993
|
if (!adPlaying) return;
|
|
1636
1994
|
console.error("[HlsAdPlayer] Ad video error:", e);
|
|
1637
|
-
|
|
1638
|
-
fireTrackingPixels(currentAd.trackingUrls.error, {
|
|
1639
|
-
errorCode: toVastMediaErrorCode(adVideoElement === null || adVideoElement === void 0 ? void 0 : adVideoElement.error)
|
|
1640
|
-
});
|
|
1641
|
-
}
|
|
1995
|
+
reportCurrentAdError(toVastMediaErrorCode(adVideoElement === null || adVideoElement === void 0 ? void 0 : adVideoElement.error));
|
|
1642
1996
|
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1643
1997
|
return;
|
|
1644
1998
|
}
|
|
@@ -1646,19 +2000,26 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1646
2000
|
};
|
|
1647
2001
|
var onVolumeChange = function onVolumeChange() {
|
|
1648
2002
|
if (!currentAd || !adVideoElement) return;
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
2003
|
+
var muted = adVideoElement.muted || adVideoElement.volume === 0;
|
|
2004
|
+
if (!trackingFired.start) {
|
|
2005
|
+
trackingFired.lastMuted = muted;
|
|
2006
|
+
return;
|
|
1653
2007
|
}
|
|
2008
|
+
if (muted === trackingFired.lastMuted) return;
|
|
2009
|
+
trackingFired.lastMuted = muted;
|
|
2010
|
+
fireTrackingPixels(muted ? currentAd.trackingUrls.mute : currentAd.trackingUrls.unmute);
|
|
2011
|
+
};
|
|
2012
|
+
var isTrackablePlayback = function isTrackablePlayback() {
|
|
2013
|
+
return adPlaying && !!currentAd && !!adVideoElement && trackingFired.start && !trackingFired.complete && !adVideoElement.ended;
|
|
1654
2014
|
};
|
|
1655
2015
|
var onPause = function onPause() {
|
|
1656
|
-
|
|
2016
|
+
continuousVisibleS = 0;
|
|
2017
|
+
if (isTrackablePlayback()) {
|
|
1657
2018
|
fireTrackingPixels(currentAd.trackingUrls.pause);
|
|
1658
2019
|
}
|
|
1659
2020
|
};
|
|
1660
2021
|
var onPlay = function onPlay() {
|
|
1661
|
-
if (
|
|
2022
|
+
if (isTrackablePlayback()) {
|
|
1662
2023
|
fireTrackingPixels(currentAd.trackingUrls.resume);
|
|
1663
2024
|
}
|
|
1664
2025
|
};
|
|
@@ -1671,6 +2032,10 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1671
2032
|
type: "loadedmetadata",
|
|
1672
2033
|
handler: onLoadedMetadata
|
|
1673
2034
|
},
|
|
2035
|
+
{
|
|
2036
|
+
type: "canplay",
|
|
2037
|
+
handler: onCanPlay
|
|
2038
|
+
},
|
|
1674
2039
|
{
|
|
1675
2040
|
type: "playing",
|
|
1676
2041
|
handler: onPlaying
|
|
@@ -1742,6 +2107,229 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1742
2107
|
}
|
|
1743
2108
|
adEventHandlers = [];
|
|
1744
2109
|
}
|
|
2110
|
+
function handleAdClick() {
|
|
2111
|
+
if (!adPlaying || !currentAd) return;
|
|
2112
|
+
fireTrackingPixels(currentAd.trackingUrls.clickTracking);
|
|
2113
|
+
emit("ad_click", {
|
|
2114
|
+
adId: currentAd.id,
|
|
2115
|
+
clickThrough: currentAd.clickThrough
|
|
2116
|
+
});
|
|
2117
|
+
if (currentAd.clickThrough) {
|
|
2118
|
+
try {
|
|
2119
|
+
window.open(currentAd.clickThrough, "_blank", "noopener");
|
|
2120
|
+
} catch (error) {
|
|
2121
|
+
console.warn("[HlsAdPlayer] Failed to open ClickThrough URL:", error);
|
|
2122
|
+
}
|
|
2123
|
+
}
|
|
2124
|
+
}
|
|
2125
|
+
function reportCurrentAdError(errorCode) {
|
|
2126
|
+
if (!currentAd) return;
|
|
2127
|
+
resolvedAds.add(currentAd);
|
|
2128
|
+
fireTrackingPixels(currentAd.trackingUrls.error, {
|
|
2129
|
+
errorCode: errorCode
|
|
2130
|
+
});
|
|
2131
|
+
}
|
|
2132
|
+
function fireNotUsedForUnplayedAds() {
|
|
2133
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
2134
|
+
try {
|
|
2135
|
+
for(var _iterator = podAds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
2136
|
+
var ad = _step.value;
|
|
2137
|
+
if (resolvedAds.has(ad)) continue;
|
|
2138
|
+
resolvedAds.add(ad);
|
|
2139
|
+
fireTrackingPixels(ad.trackingUrls.notUsed, {
|
|
2140
|
+
ad: ad
|
|
2141
|
+
});
|
|
2142
|
+
}
|
|
2143
|
+
} catch (err) {
|
|
2144
|
+
_didIteratorError = true;
|
|
2145
|
+
_iteratorError = err;
|
|
2146
|
+
} finally{
|
|
2147
|
+
try {
|
|
2148
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
2149
|
+
_iterator.return();
|
|
2150
|
+
}
|
|
2151
|
+
} finally{
|
|
2152
|
+
if (_didIteratorError) {
|
|
2153
|
+
throw _iteratorError;
|
|
2154
|
+
}
|
|
2155
|
+
}
|
|
2156
|
+
}
|
|
2157
|
+
}
|
|
2158
|
+
function sampleViewability() {
|
|
2159
|
+
if (!currentAd || !adVideoElement || !viewObserver || !trackingFired.impression || trackingFired.viewabilitySettled) {
|
|
2160
|
+
return;
|
|
2161
|
+
}
|
|
2162
|
+
var now = adVideoElement.currentTime;
|
|
2163
|
+
var inView = visibleRatio >= VIEWABLE_MIN_VISIBLE_RATIO && document.visibilityState === "visible" && !adVideoElement.paused;
|
|
2164
|
+
if (!inView) {
|
|
2165
|
+
continuousVisibleS = 0;
|
|
2166
|
+
} else if (lastViewSampleTime !== void 0 && now >= lastViewSampleTime) {
|
|
2167
|
+
continuousVisibleS += now - lastViewSampleTime;
|
|
2168
|
+
}
|
|
2169
|
+
lastViewSampleTime = now;
|
|
2170
|
+
if (continuousVisibleS >= VIEWABLE_MIN_CONTINUOUS_S) {
|
|
2171
|
+
trackingFired.viewabilitySettled = true;
|
|
2172
|
+
fireTrackingPixels(currentAd.trackingUrls.viewable);
|
|
2173
|
+
}
|
|
2174
|
+
}
|
|
2175
|
+
function settleViewability() {
|
|
2176
|
+
if (!currentAd || !trackingFired.impression || trackingFired.viewabilitySettled) {
|
|
2177
|
+
return;
|
|
2178
|
+
}
|
|
2179
|
+
trackingFired.viewabilitySettled = true;
|
|
2180
|
+
fireTrackingPixels(viewObserver ? currentAd.trackingUrls.notViewable : currentAd.trackingUrls.viewUndetermined);
|
|
2181
|
+
}
|
|
2182
|
+
function handleFullscreenChange() {
|
|
2183
|
+
var _document_fullscreenElement;
|
|
2184
|
+
if (!adPlaying || !currentAd || !adContainerEl || !trackingFired.start) return;
|
|
2185
|
+
var fullscreenEl = (_document_fullscreenElement = document.fullscreenElement) !== null && _document_fullscreenElement !== void 0 ? _document_fullscreenElement : document.webkitFullscreenElement;
|
|
2186
|
+
var expanded = !!fullscreenEl && fullscreenEl.contains(adContainerEl);
|
|
2187
|
+
if (expanded === lastPlayerExpanded) return;
|
|
2188
|
+
lastPlayerExpanded = expanded;
|
|
2189
|
+
var urls = currentAd.trackingUrls;
|
|
2190
|
+
fireTrackingPixels(expanded ? urls.fullscreen.concat(urls.playerExpand) : urls.exitFullscreen.concat(urls.playerCollapse));
|
|
2191
|
+
}
|
|
2192
|
+
function attachContainerHandlers() {
|
|
2193
|
+
if (!adContainerEl || containerHandlers.length > 0) return;
|
|
2194
|
+
var onClick = function onClick() {
|
|
2195
|
+
return handleAdClick();
|
|
2196
|
+
};
|
|
2197
|
+
var onInteraction = function onInteraction(event) {
|
|
2198
|
+
if (adPlaying) emit("ad_interaction", event);
|
|
2199
|
+
};
|
|
2200
|
+
containerHandlers = [
|
|
2201
|
+
{
|
|
2202
|
+
type: "click",
|
|
2203
|
+
handler: onClick
|
|
2204
|
+
},
|
|
2205
|
+
{
|
|
2206
|
+
type: "mousedown",
|
|
2207
|
+
handler: onInteraction
|
|
2208
|
+
},
|
|
2209
|
+
{
|
|
2210
|
+
type: "touchstart",
|
|
2211
|
+
handler: onInteraction
|
|
2212
|
+
}
|
|
2213
|
+
];
|
|
2214
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
2215
|
+
try {
|
|
2216
|
+
for(var _iterator = containerHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
2217
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
2218
|
+
adContainerEl.addEventListener(type, handler);
|
|
2219
|
+
}
|
|
2220
|
+
} catch (err) {
|
|
2221
|
+
_didIteratorError = true;
|
|
2222
|
+
_iteratorError = err;
|
|
2223
|
+
} finally{
|
|
2224
|
+
try {
|
|
2225
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
2226
|
+
_iterator.return();
|
|
2227
|
+
}
|
|
2228
|
+
} finally{
|
|
2229
|
+
if (_didIteratorError) {
|
|
2230
|
+
throw _iteratorError;
|
|
2231
|
+
}
|
|
2232
|
+
}
|
|
2233
|
+
}
|
|
2234
|
+
var onFullscreenChange = function onFullscreenChange() {
|
|
2235
|
+
return handleFullscreenChange();
|
|
2236
|
+
};
|
|
2237
|
+
documentHandlers = [
|
|
2238
|
+
{
|
|
2239
|
+
type: "fullscreenchange",
|
|
2240
|
+
handler: onFullscreenChange
|
|
2241
|
+
},
|
|
2242
|
+
{
|
|
2243
|
+
type: "webkitfullscreenchange",
|
|
2244
|
+
handler: onFullscreenChange
|
|
2245
|
+
}
|
|
2246
|
+
];
|
|
2247
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
2248
|
+
try {
|
|
2249
|
+
for(var _iterator1 = documentHandlers[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
2250
|
+
var _step_value1 = _step1.value, type1 = _step_value1.type, handler1 = _step_value1.handler;
|
|
2251
|
+
document.addEventListener(type1, handler1);
|
|
2252
|
+
}
|
|
2253
|
+
} catch (err) {
|
|
2254
|
+
_didIteratorError1 = true;
|
|
2255
|
+
_iteratorError1 = err;
|
|
2256
|
+
} finally{
|
|
2257
|
+
try {
|
|
2258
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
2259
|
+
_iterator1.return();
|
|
2260
|
+
}
|
|
2261
|
+
} finally{
|
|
2262
|
+
if (_didIteratorError1) {
|
|
2263
|
+
throw _iteratorError1;
|
|
2264
|
+
}
|
|
2265
|
+
}
|
|
2266
|
+
}
|
|
2267
|
+
if (typeof IntersectionObserver !== "undefined") {
|
|
2268
|
+
viewObserver = new IntersectionObserver(function(entries) {
|
|
2269
|
+
var entry = entries[entries.length - 1];
|
|
2270
|
+
if (entry) {
|
|
2271
|
+
visibleRatio = entry.isIntersecting ? entry.intersectionRatio : 0;
|
|
2272
|
+
}
|
|
2273
|
+
}, {
|
|
2274
|
+
threshold: [
|
|
2275
|
+
0,
|
|
2276
|
+
0.25,
|
|
2277
|
+
0.5,
|
|
2278
|
+
0.75,
|
|
2279
|
+
1
|
|
2280
|
+
]
|
|
2281
|
+
});
|
|
2282
|
+
viewObserver.observe(adContainerEl);
|
|
2283
|
+
}
|
|
2284
|
+
}
|
|
2285
|
+
function detachContainerHandlers() {
|
|
2286
|
+
if (adContainerEl) {
|
|
2287
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
2288
|
+
try {
|
|
2289
|
+
for(var _iterator = containerHandlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
2290
|
+
var _step_value = _step.value, type = _step_value.type, handler = _step_value.handler;
|
|
2291
|
+
adContainerEl.removeEventListener(type, handler);
|
|
2292
|
+
}
|
|
2293
|
+
} catch (err) {
|
|
2294
|
+
_didIteratorError = true;
|
|
2295
|
+
_iteratorError = err;
|
|
2296
|
+
} finally{
|
|
2297
|
+
try {
|
|
2298
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
2299
|
+
_iterator.return();
|
|
2300
|
+
}
|
|
2301
|
+
} finally{
|
|
2302
|
+
if (_didIteratorError) {
|
|
2303
|
+
throw _iteratorError;
|
|
2304
|
+
}
|
|
2305
|
+
}
|
|
2306
|
+
}
|
|
2307
|
+
}
|
|
2308
|
+
containerHandlers = [];
|
|
2309
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
2310
|
+
try {
|
|
2311
|
+
for(var _iterator1 = documentHandlers[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
2312
|
+
var _step_value1 = _step1.value, type1 = _step_value1.type, handler1 = _step_value1.handler;
|
|
2313
|
+
document.removeEventListener(type1, handler1);
|
|
2314
|
+
}
|
|
2315
|
+
} catch (err) {
|
|
2316
|
+
_didIteratorError1 = true;
|
|
2317
|
+
_iteratorError1 = err;
|
|
2318
|
+
} finally{
|
|
2319
|
+
try {
|
|
2320
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
2321
|
+
_iterator1.return();
|
|
2322
|
+
}
|
|
2323
|
+
} finally{
|
|
2324
|
+
if (_didIteratorError1) {
|
|
2325
|
+
throw _iteratorError1;
|
|
2326
|
+
}
|
|
2327
|
+
}
|
|
2328
|
+
}
|
|
2329
|
+
documentHandlers = [];
|
|
2330
|
+
viewObserver === null || viewObserver === void 0 ? void 0 : viewObserver.disconnect();
|
|
2331
|
+
viewObserver = void 0;
|
|
2332
|
+
}
|
|
1745
2333
|
function setAdPlayingFlag(isPlaying) {
|
|
1746
2334
|
if (isPlaying) {
|
|
1747
2335
|
contentVideo.dataset.stormcloudAdPlaying = "true";
|
|
@@ -1749,15 +2337,10 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1749
2337
|
delete contentVideo.dataset.stormcloudAdPlaying;
|
|
1750
2338
|
}
|
|
1751
2339
|
}
|
|
1752
|
-
function
|
|
1753
|
-
trackingFired =
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
firstQuartile: false,
|
|
1757
|
-
midpoint: false,
|
|
1758
|
-
thirdQuartile: false,
|
|
1759
|
-
complete: false
|
|
1760
|
-
};
|
|
2340
|
+
function resetAdTracking() {
|
|
2341
|
+
trackingFired = createTrackingState();
|
|
2342
|
+
continuousVisibleS = 0;
|
|
2343
|
+
lastViewSampleTime = void 0;
|
|
1761
2344
|
}
|
|
1762
2345
|
function isRvfcSupported(video) {
|
|
1763
2346
|
return typeof video.requestVideoFrameCallback === "function";
|
|
@@ -1863,13 +2446,12 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1863
2446
|
if (podIndex >= podAds.length - 1) {
|
|
1864
2447
|
return false;
|
|
1865
2448
|
}
|
|
2449
|
+
settleViewability();
|
|
1866
2450
|
podIndex++;
|
|
1867
2451
|
currentAd = podAds[podIndex];
|
|
1868
2452
|
currentAdMediaFile = void 0;
|
|
1869
|
-
|
|
2453
|
+
resetAdTracking();
|
|
1870
2454
|
if (currentAd) {
|
|
1871
|
-
fireTrackingPixels(currentAd.trackingUrls.impression);
|
|
1872
|
-
trackingFired.impression = true;
|
|
1873
2455
|
console.log("[HlsAdPlayer] Advancing to next pod ad (".concat(podIndex + 1, "/").concat(podAds.length, "): ").concat(currentAd.title, ", duration: ").concat(currentAd.duration, "s"));
|
|
1874
2456
|
}
|
|
1875
2457
|
clearStallWatchdog();
|
|
@@ -1907,11 +2489,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1907
2489
|
function handleAdStall() {
|
|
1908
2490
|
console.warn("[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame");
|
|
1909
2491
|
clearStallWatchdog();
|
|
1910
|
-
|
|
1911
|
-
fireTrackingPixels(currentAd.trackingUrls.error, {
|
|
1912
|
-
errorCode: VAST_ERROR_MEDIA_DISPLAY
|
|
1913
|
-
});
|
|
1914
|
-
}
|
|
2492
|
+
reportCurrentAdError(VAST_ERROR_MEDIA_DISPLAY);
|
|
1915
2493
|
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1916
2494
|
return;
|
|
1917
2495
|
}
|
|
@@ -1977,11 +2555,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1977
2555
|
function handleVideoDecodeFailure() {
|
|
1978
2556
|
console.warn("[HlsAdPlayer] Ad audio is advancing but no video frames decoded (black screen) - skipping this creative");
|
|
1979
2557
|
clearStallWatchdog();
|
|
1980
|
-
|
|
1981
|
-
fireTrackingPixels(currentAd.trackingUrls.error, {
|
|
1982
|
-
errorCode: VAST_ERROR_MEDIA_DISPLAY
|
|
1983
|
-
});
|
|
1984
|
-
}
|
|
2558
|
+
reportCurrentAdError(VAST_ERROR_MEDIA_DISPLAY);
|
|
1985
2559
|
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1986
2560
|
return;
|
|
1987
2561
|
}
|
|
@@ -2036,6 +2610,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2036
2610
|
}
|
|
2037
2611
|
function handleAdComplete() {
|
|
2038
2612
|
console.log("[HlsAdPlayer] Handling ad completion");
|
|
2613
|
+
settleViewability();
|
|
2039
2614
|
clearStallWatchdog();
|
|
2040
2615
|
adPlaying = false;
|
|
2041
2616
|
setAdPlayingFlag(false);
|
|
@@ -2059,6 +2634,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2059
2634
|
}
|
|
2060
2635
|
function handleAdError() {
|
|
2061
2636
|
console.log("[HlsAdPlayer] Handling ad error");
|
|
2637
|
+
settleViewability();
|
|
2062
2638
|
clearStallWatchdog();
|
|
2063
2639
|
adPlaying = false;
|
|
2064
2640
|
setAdPlayingFlag(false);
|
|
@@ -2091,6 +2667,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2091
2667
|
adContainerEl = container;
|
|
2092
2668
|
}
|
|
2093
2669
|
contentVideo[AD_CONTAINER_PROP] = adContainerEl;
|
|
2670
|
+
attachContainerHandlers();
|
|
2094
2671
|
},
|
|
2095
2672
|
requestAds: function requestAds(vastTagUrl) {
|
|
2096
2673
|
return _async_to_generator(function() {
|
|
@@ -2153,10 +2730,6 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2153
2730
|
currentAd = ads[0];
|
|
2154
2731
|
currentAdMediaFile = void 0;
|
|
2155
2732
|
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"));
|
|
2156
|
-
if (currentAd) {
|
|
2157
|
-
fireTrackingPixels(currentAd.trackingUrls.impression);
|
|
2158
|
-
trackingFired.impression = true;
|
|
2159
|
-
}
|
|
2160
2733
|
return [
|
|
2161
2734
|
2,
|
|
2162
2735
|
Promise.resolve()
|
|
@@ -2196,7 +2769,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2196
2769
|
contentVideo[AD_VIDEO_PROP] = adVideoElement;
|
|
2197
2770
|
}
|
|
2198
2771
|
setupAdEventListeners();
|
|
2199
|
-
|
|
2772
|
+
resetAdTracking();
|
|
2200
2773
|
contentVolume = contentVideo.volume;
|
|
2201
2774
|
originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
|
|
2202
2775
|
if (!(options === null || options === void 0 ? void 0 : options.continueLiveStreamDuringAds)) {
|
|
@@ -2267,6 +2840,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2267
2840
|
var previousMutedState;
|
|
2268
2841
|
return _ts_generator(this, function(_state) {
|
|
2269
2842
|
console.log("[HlsAdPlayer] Stopping ad");
|
|
2843
|
+
settleViewability();
|
|
2844
|
+
fireNotUsedForUnplayedAds();
|
|
2270
2845
|
clearStallWatchdog();
|
|
2271
2846
|
adPlaying = false;
|
|
2272
2847
|
setAdPlayingFlag(false);
|
|
@@ -2297,6 +2872,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2297
2872
|
},
|
|
2298
2873
|
destroy: function destroy() {
|
|
2299
2874
|
console.log("[HlsAdPlayer] Destroying");
|
|
2875
|
+
settleViewability();
|
|
2876
|
+
fireNotUsedForUnplayedAds();
|
|
2300
2877
|
destroyed = true;
|
|
2301
2878
|
clearStallWatchdog();
|
|
2302
2879
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
@@ -2325,6 +2902,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2325
2902
|
contentVideo.muted = originalMutedState;
|
|
2326
2903
|
contentVideo.volume = Math.max(0, Math.min(1, originalVolume));
|
|
2327
2904
|
teardownAdEventListeners();
|
|
2905
|
+
detachContainerHandlers();
|
|
2328
2906
|
releaseAdDecoder();
|
|
2329
2907
|
currentAd = void 0;
|
|
2330
2908
|
currentAdMediaFile = void 0;
|
|
@@ -2772,6 +3350,7 @@ function resolveVastEnvironmentSignals(isCtv) {
|
|
|
2772
3350
|
limitAdTracking = (_ref1 = platformLat !== null && platformLat !== void 0 ? platformLat : readStoredLimitAdTracking()) !== null && _ref1 !== void 0 ? _ref1 : false;
|
|
2773
3351
|
}
|
|
2774
3352
|
}
|
|
3353
|
+
var deviceTypeHint = resolveDeviceTypeHint(isCtv);
|
|
2775
3354
|
if (isCtv) {
|
|
2776
3355
|
return _object_spread_props(_object_spread({
|
|
2777
3356
|
isCtv: true,
|
|
@@ -2783,10 +3362,10 @@ function resolveVastEnvironmentSignals(isCtv) {
|
|
|
2783
3362
|
} : {}, deviceId && limitAdTracking != null ? {
|
|
2784
3363
|
limitAdTracking: limitAdTracking
|
|
2785
3364
|
} : {}), {
|
|
2786
|
-
deviceTypeHint:
|
|
3365
|
+
deviceTypeHint: deviceTypeHint
|
|
2787
3366
|
});
|
|
2788
3367
|
}
|
|
2789
|
-
return _object_spread({
|
|
3368
|
+
return _object_spread_props(_object_spread({
|
|
2790
3369
|
isCtv: false
|
|
2791
3370
|
}, deviceId ? {
|
|
2792
3371
|
deviceId: deviceId
|
|
@@ -2794,7 +3373,142 @@ function resolveVastEnvironmentSignals(isCtv) {
|
|
|
2794
3373
|
deviceIdType: deviceIdType
|
|
2795
3374
|
} : {}, deviceId && limitAdTracking != null ? {
|
|
2796
3375
|
limitAdTracking: limitAdTracking
|
|
2797
|
-
} : {})
|
|
3376
|
+
} : {}), {
|
|
3377
|
+
deviceTypeHint: deviceTypeHint
|
|
3378
|
+
});
|
|
3379
|
+
}
|
|
3380
|
+
var DEVICE_TYPE_HINT = {
|
|
3381
|
+
FEATURE_PHONE: 1,
|
|
3382
|
+
SMARTPHONE: 2,
|
|
3383
|
+
DESKTOP: 3,
|
|
3384
|
+
TABLET: 4,
|
|
3385
|
+
CONNECTED_TV: 5,
|
|
3386
|
+
GAME_CONSOLE: 6,
|
|
3387
|
+
SET_TOP_BOX: 7
|
|
3388
|
+
};
|
|
3389
|
+
var DEVICE_TYPE_HINT_ALIASES = {
|
|
3390
|
+
featurephone: DEVICE_TYPE_HINT.FEATURE_PHONE,
|
|
3391
|
+
smartphone: DEVICE_TYPE_HINT.SMARTPHONE,
|
|
3392
|
+
mobile: DEVICE_TYPE_HINT.SMARTPHONE,
|
|
3393
|
+
phone: DEVICE_TYPE_HINT.SMARTPHONE,
|
|
3394
|
+
desktop: DEVICE_TYPE_HINT.DESKTOP,
|
|
3395
|
+
pc: DEVICE_TYPE_HINT.DESKTOP,
|
|
3396
|
+
tablet: DEVICE_TYPE_HINT.TABLET,
|
|
3397
|
+
ctv: DEVICE_TYPE_HINT.CONNECTED_TV,
|
|
3398
|
+
tv: DEVICE_TYPE_HINT.CONNECTED_TV,
|
|
3399
|
+
connectedtv: DEVICE_TYPE_HINT.CONNECTED_TV,
|
|
3400
|
+
smarttv: DEVICE_TYPE_HINT.CONNECTED_TV,
|
|
3401
|
+
console: DEVICE_TYPE_HINT.GAME_CONSOLE,
|
|
3402
|
+
gameconsole: DEVICE_TYPE_HINT.GAME_CONSOLE,
|
|
3403
|
+
stb: DEVICE_TYPE_HINT.SET_TOP_BOX,
|
|
3404
|
+
settopbox: DEVICE_TYPE_HINT.SET_TOP_BOX
|
|
3405
|
+
};
|
|
3406
|
+
var SET_TOP_BOX_UA = /LGSTB|\bSTB\b|STB\d|Set-?Top|SetTopBox|TV ?Box|Kaon|Humax|Arris|Technicolor|Sagemcom|Infomir|MAG\d{3}|KreaTV|Amino|Formuler|Dune ?HD|TiVo|MiBOX|Mi Box|SHIELD Android TV|\bAFT[A-Z]|Roku|AppleTV|Apple TV|CrKey/i;
|
|
3407
|
+
var GAME_CONSOLE_UA = /PlayStation|Xbox|Nintendo/i;
|
|
3408
|
+
var CONNECTED_TV_UA = /Web0S|webOS|Tizen|SMART-TV|SmartTV|NetCast|BRAVIA|HbbTV|VIDAA|Hisense|Philips|Viera|AQUOS|Android TV|Google TV|\bTV\b/i;
|
|
3409
|
+
var FEATURE_PHONE_UA = /KAIOS|MIDP|J2ME|Series40|Opera Mini/i;
|
|
3410
|
+
function resolveDeviceTypeHint(isCtv) {
|
|
3411
|
+
var override = readDeviceTypeHintOverride();
|
|
3412
|
+
if (override != null) return override;
|
|
3413
|
+
return inferDeviceTypeHint(isCtv);
|
|
3414
|
+
}
|
|
3415
|
+
function inferDeviceTypeHint(isCtv) {
|
|
3416
|
+
var fallback = isCtv ? DEVICE_TYPE_HINT.CONNECTED_TV : DEVICE_TYPE_HINT.DESKTOP;
|
|
3417
|
+
if (typeof navigator === "undefined") return fallback;
|
|
3418
|
+
var ua = navigator.userAgent || "";
|
|
3419
|
+
var maxTouchPoints = navigator.maxTouchPoints || 0;
|
|
3420
|
+
if (SET_TOP_BOX_UA.test(ua)) return DEVICE_TYPE_HINT.SET_TOP_BOX;
|
|
3421
|
+
if (GAME_CONSOLE_UA.test(ua)) return DEVICE_TYPE_HINT.GAME_CONSOLE;
|
|
3422
|
+
if (CONNECTED_TV_UA.test(ua) && !/Mobile/i.test(ua)) {
|
|
3423
|
+
return DEVICE_TYPE_HINT.CONNECTED_TV;
|
|
3424
|
+
}
|
|
3425
|
+
if (FEATURE_PHONE_UA.test(ua)) return DEVICE_TYPE_HINT.FEATURE_PHONE;
|
|
3426
|
+
if (/iPad/i.test(ua) || /Macintosh/i.test(ua) && maxTouchPoints > 1) {
|
|
3427
|
+
return DEVICE_TYPE_HINT.TABLET;
|
|
3428
|
+
}
|
|
3429
|
+
if (/iPhone|iPod/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;
|
|
3430
|
+
if (/Android/i.test(ua)) {
|
|
3431
|
+
if (/Mobile/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;
|
|
3432
|
+
if (maxTouchPoints === 0) return DEVICE_TYPE_HINT.SET_TOP_BOX;
|
|
3433
|
+
return DEVICE_TYPE_HINT.TABLET;
|
|
3434
|
+
}
|
|
3435
|
+
if (/Mobile|Windows Phone|BlackBerry/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;
|
|
3436
|
+
return fallback;
|
|
3437
|
+
}
|
|
3438
|
+
function readDeviceTypeHintOverride() {
|
|
3439
|
+
if (typeof window === "undefined") return void 0;
|
|
3440
|
+
var keys = [
|
|
3441
|
+
"dth",
|
|
3442
|
+
"deviceTypeHint"
|
|
3443
|
+
];
|
|
3444
|
+
var fromGlobal = normalizeDeviceTypeHint(window.__STORMCLOUD_DTH__);
|
|
3445
|
+
if (fromGlobal != null) return fromGlobal;
|
|
3446
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
3447
|
+
try {
|
|
3448
|
+
for(var _iterator = getNativeBridgeSources()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
3449
|
+
var source = _step.value;
|
|
3450
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
3451
|
+
try {
|
|
3452
|
+
for(var _iterator1 = keys[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
3453
|
+
var key = _step1.value;
|
|
3454
|
+
var value = source === null || source === void 0 ? void 0 : source[key];
|
|
3455
|
+
var normalized = normalizeDeviceTypeHint(typeof value === "function" ? safeCall(value, source) : value);
|
|
3456
|
+
if (normalized != null) return normalized;
|
|
3457
|
+
}
|
|
3458
|
+
} catch (err) {
|
|
3459
|
+
_didIteratorError1 = true;
|
|
3460
|
+
_iteratorError1 = err;
|
|
3461
|
+
} finally{
|
|
3462
|
+
try {
|
|
3463
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
3464
|
+
_iterator1.return();
|
|
3465
|
+
}
|
|
3466
|
+
} finally{
|
|
3467
|
+
if (_didIteratorError1) {
|
|
3468
|
+
throw _iteratorError1;
|
|
3469
|
+
}
|
|
3470
|
+
}
|
|
3471
|
+
}
|
|
3472
|
+
}
|
|
3473
|
+
} catch (err) {
|
|
3474
|
+
_didIteratorError = true;
|
|
3475
|
+
_iteratorError = err;
|
|
3476
|
+
} finally{
|
|
3477
|
+
try {
|
|
3478
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
3479
|
+
_iterator.return();
|
|
3480
|
+
}
|
|
3481
|
+
} finally{
|
|
3482
|
+
if (_didIteratorError) {
|
|
3483
|
+
throw _iteratorError;
|
|
3484
|
+
}
|
|
3485
|
+
}
|
|
3486
|
+
}
|
|
3487
|
+
for(var _i = 0, _iter = [
|
|
3488
|
+
"stormcloud.dth",
|
|
3489
|
+
"dth"
|
|
3490
|
+
]; _i < _iter.length; _i++){
|
|
3491
|
+
var key1 = _iter[_i];
|
|
3492
|
+
var normalized1 = normalizeDeviceTypeHint(readStoredString(key1));
|
|
3493
|
+
if (normalized1 != null) return normalized1;
|
|
3494
|
+
}
|
|
3495
|
+
return void 0;
|
|
3496
|
+
}
|
|
3497
|
+
function normalizeDeviceTypeHint(value) {
|
|
3498
|
+
if (typeof value === "number") {
|
|
3499
|
+
return Number.isInteger(value) && value >= 1 && value <= 7 ? value : void 0;
|
|
3500
|
+
}
|
|
3501
|
+
if (typeof value !== "string") return void 0;
|
|
3502
|
+
var trimmed = value.trim();
|
|
3503
|
+
if (/^[1-7]$/.test(trimmed)) return parseInt(trimmed, 10);
|
|
3504
|
+
return DEVICE_TYPE_HINT_ALIASES[trimmed.toLowerCase().replace(/[\s_-]/g, "")];
|
|
3505
|
+
}
|
|
3506
|
+
function safeCall(fn, thisArg) {
|
|
3507
|
+
try {
|
|
3508
|
+
return fn.call(thisArg);
|
|
3509
|
+
} catch (unused) {
|
|
3510
|
+
return void 0;
|
|
3511
|
+
}
|
|
2798
3512
|
}
|
|
2799
3513
|
function inferDeviceIdType() {
|
|
2800
3514
|
if (typeof navigator === "undefined") {
|
|
@@ -3000,22 +3714,9 @@ function isZeroedAdId(value) {
|
|
|
3000
3714
|
return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());
|
|
3001
3715
|
}
|
|
3002
3716
|
function readNativeBridgeSignals() {
|
|
3003
|
-
if (typeof window === "undefined") {
|
|
3004
|
-
return {};
|
|
3005
|
-
}
|
|
3006
|
-
var candidates = [
|
|
3007
|
-
window.__STORMCLOUD_CTV_AD_INFO__,
|
|
3008
|
-
window.__STORMCLOUD_CTV__,
|
|
3009
|
-
window.stormcloudCtv,
|
|
3010
|
-
window.AiryTV,
|
|
3011
|
-
window.Android,
|
|
3012
|
-
window.webOS,
|
|
3013
|
-
window.tizen,
|
|
3014
|
-
window.amazon
|
|
3015
|
-
].filter(Boolean);
|
|
3016
3717
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
3017
3718
|
try {
|
|
3018
|
-
for(var _iterator =
|
|
3719
|
+
for(var _iterator = getNativeBridgeSources()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
3019
3720
|
var source = _step.value;
|
|
3020
3721
|
var contentUrl = readBridgeValue(source, [
|
|
3021
3722
|
"contentUrl",
|
|
@@ -3090,6 +3791,21 @@ function readNativeBridgeSignals() {
|
|
|
3090
3791
|
}
|
|
3091
3792
|
return {};
|
|
3092
3793
|
}
|
|
3794
|
+
function getNativeBridgeSources() {
|
|
3795
|
+
if (typeof window === "undefined") {
|
|
3796
|
+
return [];
|
|
3797
|
+
}
|
|
3798
|
+
return [
|
|
3799
|
+
window.__STORMCLOUD_CTV_AD_INFO__,
|
|
3800
|
+
window.__STORMCLOUD_CTV__,
|
|
3801
|
+
window.stormcloudCtv,
|
|
3802
|
+
window.AiryTV,
|
|
3803
|
+
window.Android,
|
|
3804
|
+
window.webOS,
|
|
3805
|
+
window.tizen,
|
|
3806
|
+
window.amazon
|
|
3807
|
+
].filter(Boolean);
|
|
3808
|
+
}
|
|
3093
3809
|
function readBridgeValue(source, keys) {
|
|
3094
3810
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
3095
3811
|
try {
|
|
@@ -7546,6 +8262,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7546
8262
|
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 : "?"));
|
|
7547
8263
|
}
|
|
7548
8264
|
});
|
|
8265
|
+
adPlayer.on("ad_click", function() {
|
|
8266
|
+
_this.host.onAdClick();
|
|
8267
|
+
});
|
|
8268
|
+
adPlayer.on("ad_interaction", function(event) {
|
|
8269
|
+
if (event) _this.host.onAdInteraction(event);
|
|
8270
|
+
});
|
|
7549
8271
|
adPlayer.on("all_ads_completed", function() {
|
|
7550
8272
|
sendAdImpressionTracking(_this.host.config.licenseKey, {
|
|
7551
8273
|
source: "hls",
|
|
@@ -9075,6 +9797,12 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
9075
9797
|
},
|
|
9076
9798
|
generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
|
|
9077
9799
|
return _this.generatePodVastUrl(base, breakDurationMs);
|
|
9800
|
+
},
|
|
9801
|
+
onAdClick: function onAdClick() {
|
|
9802
|
+
return _this.palNonce.sendAdClick();
|
|
9803
|
+
},
|
|
9804
|
+
onAdInteraction: function onAdInteraction(event) {
|
|
9805
|
+
return _this.palNonce.sendAdTouch(event);
|
|
9078
9806
|
}
|
|
9079
9807
|
}, this.timing, this.adConfig, this.cueManager, this.placeholder);
|
|
9080
9808
|
}
|