stormcloud-video-player 0.8.25 → 0.8.27
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 +714 -128
- 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 +714 -128
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +278 -49
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +4 -1
- package/lib/player/AdConfigManager.cjs +144 -14
- 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 +714 -128
- 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 +714 -128
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +714 -128
- 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 +714 -128
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/ctvVastSignals.cjs +80 -8
- package/lib/utils/ctvVastSignals.cjs.map +1 -1
- package/lib/utils/tracking.cjs +80 -8
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/vastEnvironmentSignals.cjs +83 -13
- package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
- package/lib/utils/vastMacros.cjs +15 -1
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/lib/utils/vastMacros.d.cts +3 -0
- package/package.json +1 -1
|
@@ -398,6 +398,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
398
398
|
var adHls;
|
|
399
399
|
var adContainerEl;
|
|
400
400
|
var currentAd;
|
|
401
|
+
var podAds = [];
|
|
402
|
+
var podIndex = 0;
|
|
401
403
|
var sessionId;
|
|
402
404
|
var preloadedAds = /* @__PURE__ */ new Map();
|
|
403
405
|
var preloadingAds = /* @__PURE__ */ new Map();
|
|
@@ -562,14 +564,14 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
562
564
|
error: []
|
|
563
565
|
};
|
|
564
566
|
}
|
|
565
|
-
function extractTrackingUrls(
|
|
567
|
+
function extractTrackingUrls(scope) {
|
|
566
568
|
var trackingUrls = createEmptyTrackingUrls();
|
|
567
|
-
|
|
569
|
+
scope.querySelectorAll("Impression").forEach(function(el) {
|
|
568
570
|
var _el_textContent;
|
|
569
571
|
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
570
572
|
if (url) trackingUrls.impression.push(url);
|
|
571
573
|
});
|
|
572
|
-
|
|
574
|
+
scope.querySelectorAll("Tracking").forEach(function(el) {
|
|
573
575
|
var _el_textContent;
|
|
574
576
|
var event = el.getAttribute("event");
|
|
575
577
|
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
@@ -580,7 +582,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
580
582
|
}
|
|
581
583
|
}
|
|
582
584
|
});
|
|
583
|
-
|
|
585
|
+
scope.querySelectorAll("Error").forEach(function(el) {
|
|
584
586
|
var _el_textContent;
|
|
585
587
|
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
586
588
|
if (url) trackingUrls.error.push(url);
|
|
@@ -690,6 +692,75 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
690
692
|
};
|
|
691
693
|
}
|
|
692
694
|
}
|
|
695
|
+
function parseAdElement(adElement) {
|
|
696
|
+
try {
|
|
697
|
+
var _adElement_querySelector, _adElement_querySelector_textContent, _adElement_querySelector1, _adElement_querySelector_textContent1, _adElement_querySelector2, _adElement_querySelector3;
|
|
698
|
+
var adId = adElement.getAttribute("id") || "unknown";
|
|
699
|
+
var title = ((_adElement_querySelector = adElement.querySelector("AdTitle")) === null || _adElement_querySelector === void 0 ? void 0 : _adElement_querySelector.textContent) || "Ad";
|
|
700
|
+
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();
|
|
701
|
+
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();
|
|
702
|
+
if (wrapperUri) {
|
|
703
|
+
return {
|
|
704
|
+
type: "wrapper",
|
|
705
|
+
vastAdTagUri: wrapperUri,
|
|
706
|
+
trackingUrls: extractTrackingUrls(adElement),
|
|
707
|
+
clickThrough: clickThrough
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
var isNoAdAvailable = adId === "empty" || title.toLowerCase().includes("no ad available") || title.toLowerCase() === "no ad available";
|
|
711
|
+
var durationText = ((_adElement_querySelector3 = adElement.querySelector("Duration")) === null || _adElement_querySelector3 === void 0 ? void 0 : _adElement_querySelector3.textContent) || "00:00:30";
|
|
712
|
+
var durationParts = durationText.split(":");
|
|
713
|
+
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
714
|
+
var mediaFileElements = adElement.querySelectorAll("MediaFile");
|
|
715
|
+
var mediaFiles = [];
|
|
716
|
+
mediaFileElements.forEach(function(mf) {
|
|
717
|
+
var _mf_textContent;
|
|
718
|
+
var type = mf.getAttribute("type") || "";
|
|
719
|
+
var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
|
|
720
|
+
var width = mf.getAttribute("width") || "";
|
|
721
|
+
var height = mf.getAttribute("height") || "";
|
|
722
|
+
if (!url) return;
|
|
723
|
+
var bitrateAttr = mf.getAttribute("bitrate");
|
|
724
|
+
var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
|
|
725
|
+
var mediaFile = {
|
|
726
|
+
url: url,
|
|
727
|
+
type: type,
|
|
728
|
+
width: parseInt(width || "1920", 10),
|
|
729
|
+
height: parseInt(height || "1080", 10),
|
|
730
|
+
bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
|
|
731
|
+
};
|
|
732
|
+
if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {
|
|
733
|
+
mediaFiles.push(mediaFile);
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
if (mediaFiles.length === 0) {
|
|
737
|
+
if (isNoAdAvailable) {
|
|
738
|
+
console.warn("[HlsAdPlayer] Pod <Ad> indicates no ad available");
|
|
739
|
+
} else {
|
|
740
|
+
console.warn("[HlsAdPlayer] No supported media files in pod <Ad>");
|
|
741
|
+
}
|
|
742
|
+
return {
|
|
743
|
+
type: "empty"
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
return {
|
|
747
|
+
type: "inline",
|
|
748
|
+
ad: {
|
|
749
|
+
id: adId,
|
|
750
|
+
title: title,
|
|
751
|
+
duration: duration,
|
|
752
|
+
mediaFiles: mediaFiles,
|
|
753
|
+
trackingUrls: extractTrackingUrls(adElement),
|
|
754
|
+
clickThrough: clickThrough
|
|
755
|
+
}
|
|
756
|
+
};
|
|
757
|
+
} catch (error) {
|
|
758
|
+
console.error("[HlsAdPlayer] Error parsing pod <Ad> element:", error);
|
|
759
|
+
return {
|
|
760
|
+
type: "empty"
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
}
|
|
693
764
|
function fetchVastXml(vastTagUrl) {
|
|
694
765
|
return _async_to_generator(function() {
|
|
695
766
|
var response;
|
|
@@ -766,6 +837,146 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
766
837
|
});
|
|
767
838
|
}).apply(this, arguments);
|
|
768
839
|
}
|
|
840
|
+
function fetchAndParsePod(vastTagUrl) {
|
|
841
|
+
return _async_to_generator(function() {
|
|
842
|
+
var vastXml, parser, xmlDoc, adElements, ads, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, adElement, parsed, resolved, error, err;
|
|
843
|
+
return _ts_generator(this, function(_state) {
|
|
844
|
+
switch(_state.label){
|
|
845
|
+
case 0:
|
|
846
|
+
return [
|
|
847
|
+
4,
|
|
848
|
+
fetchVastXml(vastTagUrl)
|
|
849
|
+
];
|
|
850
|
+
case 1:
|
|
851
|
+
vastXml = _state.sent();
|
|
852
|
+
console.log("[HlsAdPlayer] Pod VAST XML received");
|
|
853
|
+
parser = new DOMParser();
|
|
854
|
+
xmlDoc = parser.parseFromString(vastXml, "text/xml");
|
|
855
|
+
if (xmlDoc.querySelector("parsererror")) {
|
|
856
|
+
console.error("[HlsAdPlayer] Pod VAST XML parsing error (malformed)");
|
|
857
|
+
return [
|
|
858
|
+
2,
|
|
859
|
+
[]
|
|
860
|
+
];
|
|
861
|
+
}
|
|
862
|
+
adElements = Array.from(xmlDoc.querySelectorAll("Ad"));
|
|
863
|
+
if (adElements.length === 0) {
|
|
864
|
+
console.warn("[HlsAdPlayer] No <Ad> elements found in pod VAST response");
|
|
865
|
+
return [
|
|
866
|
+
2,
|
|
867
|
+
[]
|
|
868
|
+
];
|
|
869
|
+
}
|
|
870
|
+
adElements.sort(function(a, b) {
|
|
871
|
+
var aSeq = parseInt(a.getAttribute("sequence") || "", 10);
|
|
872
|
+
var bSeq = parseInt(b.getAttribute("sequence") || "", 10);
|
|
873
|
+
var aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;
|
|
874
|
+
var bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;
|
|
875
|
+
return aVal - bVal;
|
|
876
|
+
});
|
|
877
|
+
ads = [];
|
|
878
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
879
|
+
_state.label = 2;
|
|
880
|
+
case 2:
|
|
881
|
+
_state.trys.push([
|
|
882
|
+
2,
|
|
883
|
+
10,
|
|
884
|
+
11,
|
|
885
|
+
12
|
|
886
|
+
]);
|
|
887
|
+
_iterator = adElements[Symbol.iterator]();
|
|
888
|
+
_state.label = 3;
|
|
889
|
+
case 3:
|
|
890
|
+
if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
|
|
891
|
+
3,
|
|
892
|
+
9
|
|
893
|
+
];
|
|
894
|
+
adElement = _step.value;
|
|
895
|
+
parsed = parseAdElement(adElement);
|
|
896
|
+
if (!(parsed.type === "inline")) return [
|
|
897
|
+
3,
|
|
898
|
+
4
|
|
899
|
+
];
|
|
900
|
+
ads.push(parsed.ad);
|
|
901
|
+
return [
|
|
902
|
+
3,
|
|
903
|
+
8
|
|
904
|
+
];
|
|
905
|
+
case 4:
|
|
906
|
+
if (!(parsed.type === "wrapper")) return [
|
|
907
|
+
3,
|
|
908
|
+
8
|
|
909
|
+
];
|
|
910
|
+
_state.label = 5;
|
|
911
|
+
case 5:
|
|
912
|
+
_state.trys.push([
|
|
913
|
+
5,
|
|
914
|
+
7,
|
|
915
|
+
,
|
|
916
|
+
8
|
|
917
|
+
]);
|
|
918
|
+
return [
|
|
919
|
+
4,
|
|
920
|
+
fetchAndParseVastAd(parsed.vastAdTagUri, 1, parsed.trackingUrls)
|
|
921
|
+
];
|
|
922
|
+
case 6:
|
|
923
|
+
resolved = _state.sent();
|
|
924
|
+
if (resolved) {
|
|
925
|
+
ads.push(resolved);
|
|
926
|
+
}
|
|
927
|
+
return [
|
|
928
|
+
3,
|
|
929
|
+
8
|
|
930
|
+
];
|
|
931
|
+
case 7:
|
|
932
|
+
error = _state.sent();
|
|
933
|
+
console.warn("[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:", error);
|
|
934
|
+
return [
|
|
935
|
+
3,
|
|
936
|
+
8
|
|
937
|
+
];
|
|
938
|
+
case 8:
|
|
939
|
+
_iteratorNormalCompletion = true;
|
|
940
|
+
return [
|
|
941
|
+
3,
|
|
942
|
+
3
|
|
943
|
+
];
|
|
944
|
+
case 9:
|
|
945
|
+
return [
|
|
946
|
+
3,
|
|
947
|
+
12
|
|
948
|
+
];
|
|
949
|
+
case 10:
|
|
950
|
+
err = _state.sent();
|
|
951
|
+
_didIteratorError = true;
|
|
952
|
+
_iteratorError = err;
|
|
953
|
+
return [
|
|
954
|
+
3,
|
|
955
|
+
12
|
|
956
|
+
];
|
|
957
|
+
case 11:
|
|
958
|
+
try {
|
|
959
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
960
|
+
_iterator.return();
|
|
961
|
+
}
|
|
962
|
+
} finally{
|
|
963
|
+
if (_didIteratorError) {
|
|
964
|
+
throw _iteratorError;
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
return [
|
|
968
|
+
7
|
|
969
|
+
];
|
|
970
|
+
case 12:
|
|
971
|
+
console.log("[HlsAdPlayer] Parsed ".concat(ads.length, " ad(s) from pod VAST response"));
|
|
972
|
+
return [
|
|
973
|
+
2,
|
|
974
|
+
ads
|
|
975
|
+
];
|
|
976
|
+
}
|
|
977
|
+
});
|
|
978
|
+
})();
|
|
979
|
+
}
|
|
769
980
|
function createAdVideoElement() {
|
|
770
981
|
var video = document.createElement("video");
|
|
771
982
|
video.style.position = "absolute";
|
|
@@ -810,6 +1021,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
810
1021
|
trackingFired.complete = true;
|
|
811
1022
|
fireTrackingPixels(currentAd.trackingUrls.complete);
|
|
812
1023
|
console.log("[HlsAdPlayer] Ad completed");
|
|
1024
|
+
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
813
1027
|
handleAdComplete();
|
|
814
1028
|
});
|
|
815
1029
|
adVideoElement.addEventListener("error", function(e) {
|
|
@@ -818,6 +1032,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
818
1032
|
if (currentAd) {
|
|
819
1033
|
fireTrackingPixels(currentAd.trackingUrls.error);
|
|
820
1034
|
}
|
|
1035
|
+
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1036
|
+
return;
|
|
1037
|
+
}
|
|
821
1038
|
handleAdError();
|
|
822
1039
|
});
|
|
823
1040
|
adVideoElement.addEventListener("volumechange", function() {
|
|
@@ -846,6 +1063,94 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
846
1063
|
delete contentVideo.dataset.stormcloudAdPlaying;
|
|
847
1064
|
}
|
|
848
1065
|
}
|
|
1066
|
+
function resetQuartileTracking(preserveImpression) {
|
|
1067
|
+
trackingFired = {
|
|
1068
|
+
impression: preserveImpression ? trackingFired.impression : false,
|
|
1069
|
+
start: false,
|
|
1070
|
+
firstQuartile: false,
|
|
1071
|
+
midpoint: false,
|
|
1072
|
+
thirdQuartile: false,
|
|
1073
|
+
complete: false
|
|
1074
|
+
};
|
|
1075
|
+
}
|
|
1076
|
+
function loadCurrentAdMedia() {
|
|
1077
|
+
if (!adVideoElement || !currentAd) {
|
|
1078
|
+
throw new Error("No ad video element or ad to load");
|
|
1079
|
+
}
|
|
1080
|
+
var mediaFile = selectBestMediaFile(currentAd.mediaFiles);
|
|
1081
|
+
if (!mediaFile) {
|
|
1082
|
+
throw new Error("No media file available for ad");
|
|
1083
|
+
}
|
|
1084
|
+
var isHlsAd = isHlsMediaFile(mediaFile);
|
|
1085
|
+
console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad (pod ").concat(podIndex + 1, "/").concat(podAds.length || 1, ") from: ").concat(mediaFile.url));
|
|
1086
|
+
if (isHlsAd && import_hls.default.isSupported()) {
|
|
1087
|
+
if (adHls) {
|
|
1088
|
+
adHls.destroy();
|
|
1089
|
+
}
|
|
1090
|
+
adHls = new import_hls.default({
|
|
1091
|
+
enableWorker: true,
|
|
1092
|
+
lowLatencyMode: false
|
|
1093
|
+
});
|
|
1094
|
+
adHls.loadSource(mediaFile.url);
|
|
1095
|
+
adHls.attachMedia(adVideoElement);
|
|
1096
|
+
adHls.on(import_hls.default.Events.MANIFEST_PARSED, function() {
|
|
1097
|
+
console.log("[HlsAdPlayer] HLS manifest parsed, starting playback");
|
|
1098
|
+
adVideoElement.play().catch(function(error) {
|
|
1099
|
+
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1100
|
+
handleAdError();
|
|
1101
|
+
});
|
|
1102
|
+
});
|
|
1103
|
+
adHls.on(import_hls.default.Events.ERROR, function(_event, data) {
|
|
1104
|
+
console.error("[HlsAdPlayer] HLS error:", data);
|
|
1105
|
+
if (data.fatal) {
|
|
1106
|
+
handleAdError();
|
|
1107
|
+
}
|
|
1108
|
+
});
|
|
1109
|
+
} else if (isHlsAd && adVideoElement.canPlayType("application/vnd.apple.mpegurl")) {
|
|
1110
|
+
adVideoElement.src = mediaFile.url;
|
|
1111
|
+
adVideoElement.play().catch(function(error) {
|
|
1112
|
+
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1113
|
+
handleAdError();
|
|
1114
|
+
});
|
|
1115
|
+
} else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {
|
|
1116
|
+
if (adHls) {
|
|
1117
|
+
adHls.destroy();
|
|
1118
|
+
adHls = void 0;
|
|
1119
|
+
}
|
|
1120
|
+
adVideoElement.src = mediaFile.url;
|
|
1121
|
+
adVideoElement.load();
|
|
1122
|
+
adVideoElement.play().catch(function(error) {
|
|
1123
|
+
console.error("[HlsAdPlayer] Error starting progressive ad playback:", error);
|
|
1124
|
+
handleAdError();
|
|
1125
|
+
});
|
|
1126
|
+
} else {
|
|
1127
|
+
throw new Error("Unsupported ad media file type: ".concat(mediaFile.type));
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
function advanceToNextPodAd() {
|
|
1131
|
+
if (podIndex >= podAds.length - 1) {
|
|
1132
|
+
return false;
|
|
1133
|
+
}
|
|
1134
|
+
podIndex++;
|
|
1135
|
+
currentAd = podAds[podIndex];
|
|
1136
|
+
resetQuartileTracking(false);
|
|
1137
|
+
if (currentAd) {
|
|
1138
|
+
fireTrackingPixels(currentAd.trackingUrls.impression);
|
|
1139
|
+
trackingFired.impression = true;
|
|
1140
|
+
console.log("[HlsAdPlayer] Advancing to next pod ad (".concat(podIndex + 1, "/").concat(podAds.length, "): ").concat(currentAd.title, ", duration: ").concat(currentAd.duration, "s"));
|
|
1141
|
+
}
|
|
1142
|
+
try {
|
|
1143
|
+
loadCurrentAdMedia();
|
|
1144
|
+
emit("pod_ad_started", {
|
|
1145
|
+
index: podIndex,
|
|
1146
|
+
total: podAds.length
|
|
1147
|
+
});
|
|
1148
|
+
return true;
|
|
1149
|
+
} catch (error) {
|
|
1150
|
+
console.error("[HlsAdPlayer] Failed to load next pod ad:", error);
|
|
1151
|
+
return false;
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
849
1154
|
function handleAdComplete() {
|
|
850
1155
|
console.log("[HlsAdPlayer] Handling ad completion");
|
|
851
1156
|
adPlaying = false;
|
|
@@ -899,7 +1204,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
899
1204
|
},
|
|
900
1205
|
requestAds: function requestAds(vastTagUrl) {
|
|
901
1206
|
return _async_to_generator(function() {
|
|
902
|
-
var
|
|
1207
|
+
var ads, preloaded, error;
|
|
903
1208
|
return _ts_generator(this, function(_state) {
|
|
904
1209
|
switch(_state.label){
|
|
905
1210
|
case 0:
|
|
@@ -920,12 +1225,18 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
920
1225
|
6
|
|
921
1226
|
]);
|
|
922
1227
|
sessionId = generateSessionId();
|
|
1228
|
+
ads = [];
|
|
923
1229
|
if (!preloadedAds.has(vastTagUrl)) return [
|
|
924
1230
|
3,
|
|
925
1231
|
2
|
|
926
1232
|
];
|
|
927
|
-
|
|
1233
|
+
preloaded = preloadedAds.get(vastTagUrl);
|
|
928
1234
|
preloadedAds.delete(vastTagUrl);
|
|
1235
|
+
if (preloaded) {
|
|
1236
|
+
ads = [
|
|
1237
|
+
preloaded
|
|
1238
|
+
];
|
|
1239
|
+
}
|
|
929
1240
|
console.log("[HlsAdPlayer] Using preloaded VAST response:", vastTagUrl);
|
|
930
1241
|
return [
|
|
931
1242
|
3,
|
|
@@ -934,13 +1245,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
934
1245
|
case 2:
|
|
935
1246
|
return [
|
|
936
1247
|
4,
|
|
937
|
-
|
|
1248
|
+
fetchAndParsePod(vastTagUrl)
|
|
938
1249
|
];
|
|
939
1250
|
case 3:
|
|
940
|
-
|
|
1251
|
+
ads = _state.sent();
|
|
941
1252
|
_state.label = 4;
|
|
942
1253
|
case 4:
|
|
943
|
-
if (!
|
|
1254
|
+
if (!ads.length) {
|
|
944
1255
|
console.warn("[HlsAdPlayer] No ads available from VAST response");
|
|
945
1256
|
emit("ad_error");
|
|
946
1257
|
return [
|
|
@@ -948,10 +1259,14 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
948
1259
|
Promise.reject(new Error("No ads available from VAST response"))
|
|
949
1260
|
];
|
|
950
1261
|
}
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
1262
|
+
podAds = ads;
|
|
1263
|
+
podIndex = 0;
|
|
1264
|
+
currentAd = ads[0];
|
|
1265
|
+
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"));
|
|
1266
|
+
if (currentAd) {
|
|
1267
|
+
fireTrackingPixels(currentAd.trackingUrls.impression);
|
|
1268
|
+
trackingFired.impression = true;
|
|
1269
|
+
}
|
|
955
1270
|
return [
|
|
956
1271
|
2,
|
|
957
1272
|
Promise.resolve()
|
|
@@ -974,7 +1289,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
974
1289
|
},
|
|
975
1290
|
play: function play() {
|
|
976
1291
|
return _async_to_generator(function() {
|
|
977
|
-
var contentVolume
|
|
1292
|
+
var contentVolume;
|
|
978
1293
|
return _ts_generator(this, function(_state) {
|
|
979
1294
|
if (!currentAd) {
|
|
980
1295
|
console.warn("[HlsAdPlayer] Cannot play: No ad loaded (no ads available)");
|
|
@@ -990,14 +1305,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
990
1305
|
adContainerEl === null || adContainerEl === void 0 ? void 0 : adContainerEl.appendChild(adVideoElement);
|
|
991
1306
|
setupAdEventListeners();
|
|
992
1307
|
}
|
|
993
|
-
|
|
994
|
-
impression: trackingFired.impression,
|
|
995
|
-
start: false,
|
|
996
|
-
firstQuartile: false,
|
|
997
|
-
midpoint: false,
|
|
998
|
-
thirdQuartile: false,
|
|
999
|
-
complete: false
|
|
1000
|
-
};
|
|
1308
|
+
resetQuartileTracking(true);
|
|
1001
1309
|
contentVolume = contentVideo.volume;
|
|
1002
1310
|
originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
|
|
1003
1311
|
if (!(options === null || options === void 0 ? void 0 : options.continueLiveStreamDuringAds)) {
|
|
@@ -1015,60 +1323,12 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1015
1323
|
adVideoElement.muted = originalMutedState;
|
|
1016
1324
|
console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
|
|
1017
1325
|
}
|
|
1018
|
-
mediaFile = selectBestMediaFile(currentAd.mediaFiles);
|
|
1019
|
-
if (!mediaFile) {
|
|
1020
|
-
throw new Error("No media file available for ad");
|
|
1021
|
-
}
|
|
1022
1326
|
if (adContainerEl) {
|
|
1023
1327
|
adContainerEl.style.display = "flex";
|
|
1024
1328
|
adContainerEl.style.pointerEvents = "auto";
|
|
1025
1329
|
}
|
|
1026
1330
|
emit("content_pause");
|
|
1027
|
-
|
|
1028
|
-
console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
|
|
1029
|
-
if (isHlsAd && import_hls.default.isSupported()) {
|
|
1030
|
-
if (adHls) {
|
|
1031
|
-
adHls.destroy();
|
|
1032
|
-
}
|
|
1033
|
-
adHls = new import_hls.default({
|
|
1034
|
-
enableWorker: true,
|
|
1035
|
-
lowLatencyMode: false
|
|
1036
|
-
});
|
|
1037
|
-
adHls.loadSource(mediaFile.url);
|
|
1038
|
-
adHls.attachMedia(adVideoElement);
|
|
1039
|
-
adHls.on(import_hls.default.Events.MANIFEST_PARSED, function() {
|
|
1040
|
-
console.log("[HlsAdPlayer] HLS manifest parsed, starting playback");
|
|
1041
|
-
adVideoElement.play().catch(function(error) {
|
|
1042
|
-
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1043
|
-
handleAdError();
|
|
1044
|
-
});
|
|
1045
|
-
});
|
|
1046
|
-
adHls.on(import_hls.default.Events.ERROR, function(event, data) {
|
|
1047
|
-
console.error("[HlsAdPlayer] HLS error:", data);
|
|
1048
|
-
if (data.fatal) {
|
|
1049
|
-
handleAdError();
|
|
1050
|
-
}
|
|
1051
|
-
});
|
|
1052
|
-
} else if (isHlsAd && adVideoElement.canPlayType("application/vnd.apple.mpegurl")) {
|
|
1053
|
-
adVideoElement.src = mediaFile.url;
|
|
1054
|
-
adVideoElement.play().catch(function(error) {
|
|
1055
|
-
console.error("[HlsAdPlayer] Error starting ad playback:", error);
|
|
1056
|
-
handleAdError();
|
|
1057
|
-
});
|
|
1058
|
-
} else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {
|
|
1059
|
-
if (adHls) {
|
|
1060
|
-
adHls.destroy();
|
|
1061
|
-
adHls = void 0;
|
|
1062
|
-
}
|
|
1063
|
-
adVideoElement.src = mediaFile.url;
|
|
1064
|
-
adVideoElement.load();
|
|
1065
|
-
adVideoElement.play().catch(function(error) {
|
|
1066
|
-
console.error("[HlsAdPlayer] Error starting progressive ad playback:", error);
|
|
1067
|
-
handleAdError();
|
|
1068
|
-
});
|
|
1069
|
-
} else {
|
|
1070
|
-
throw new Error("Unsupported ad media file type: ".concat(mediaFile.type));
|
|
1071
|
-
}
|
|
1331
|
+
loadCurrentAdMedia();
|
|
1072
1332
|
return [
|
|
1073
1333
|
2,
|
|
1074
1334
|
Promise.resolve()
|
|
@@ -1143,6 +1403,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1143
1403
|
adVideoElement.src = "";
|
|
1144
1404
|
}
|
|
1145
1405
|
currentAd = void 0;
|
|
1406
|
+
podAds = [];
|
|
1407
|
+
podIndex = 0;
|
|
1146
1408
|
return [
|
|
1147
1409
|
2
|
|
1148
1410
|
];
|
|
@@ -1192,6 +1454,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1192
1454
|
}
|
|
1193
1455
|
adContainerEl = void 0;
|
|
1194
1456
|
currentAd = void 0;
|
|
1457
|
+
podAds = [];
|
|
1458
|
+
podIndex = 0;
|
|
1195
1459
|
listeners.clear();
|
|
1196
1460
|
preloadedAds.clear();
|
|
1197
1461
|
preloadingAds.clear();
|
|
@@ -1283,6 +1547,14 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1283
1547
|
},
|
|
1284
1548
|
getLoadedAdId: function getLoadedAdId() {
|
|
1285
1549
|
return currentAd === null || currentAd === void 0 ? void 0 : currentAd.id;
|
|
1550
|
+
},
|
|
1551
|
+
getPodAdCount: function getPodAdCount() {
|
|
1552
|
+
return podAds.length;
|
|
1553
|
+
},
|
|
1554
|
+
getPodTotalDurationMs: function getPodTotalDurationMs() {
|
|
1555
|
+
return podAds.reduce(function(total, ad) {
|
|
1556
|
+
return total + (ad.duration > 0 ? ad.duration * 1e3 : 0);
|
|
1557
|
+
}, 0);
|
|
1286
1558
|
}
|
|
1287
1559
|
};
|
|
1288
1560
|
}
|
|
@@ -1662,38 +1934,108 @@ function getOrCreateStoredUuid(storageKey) {
|
|
|
1662
1934
|
if (typeof window === "undefined") {
|
|
1663
1935
|
return void 0;
|
|
1664
1936
|
}
|
|
1665
|
-
var existing =
|
|
1937
|
+
var existing = readPersistentId(storageKey);
|
|
1666
1938
|
if (existing) {
|
|
1939
|
+
writePersistentId(storageKey, existing);
|
|
1667
1940
|
return existing;
|
|
1668
1941
|
}
|
|
1669
1942
|
var id = createUuid();
|
|
1670
|
-
|
|
1671
|
-
var _window_localStorage;
|
|
1672
|
-
(_window_localStorage = window.localStorage) === null || _window_localStorage === void 0 ? void 0 : _window_localStorage.setItem(storageKey, id);
|
|
1673
|
-
} catch (unused) {}
|
|
1943
|
+
writePersistentId(storageKey, id);
|
|
1674
1944
|
return id;
|
|
1675
1945
|
}
|
|
1676
1946
|
function getOrCreateCtvSessionId() {
|
|
1677
|
-
var existing =
|
|
1947
|
+
var existing = readPersistentId(CTV_SESSION_STORAGE_KEY);
|
|
1678
1948
|
if (existing) {
|
|
1949
|
+
writePersistentId(CTV_SESSION_STORAGE_KEY, existing);
|
|
1679
1950
|
return existing;
|
|
1680
1951
|
}
|
|
1681
1952
|
var sessionId = createUuid();
|
|
1953
|
+
writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);
|
|
1954
|
+
return sessionId;
|
|
1955
|
+
}
|
|
1956
|
+
function readPersistentId(storageKey) {
|
|
1957
|
+
return readStoredString(storageKey) || readCookie(storageKey);
|
|
1958
|
+
}
|
|
1959
|
+
function writePersistentId(storageKey, value) {
|
|
1682
1960
|
try {
|
|
1683
1961
|
var _window_localStorage;
|
|
1684
|
-
(_window_localStorage = window.localStorage) === null || _window_localStorage === void 0 ? void 0 : _window_localStorage.setItem(
|
|
1962
|
+
(_window_localStorage = window.localStorage) === null || _window_localStorage === void 0 ? void 0 : _window_localStorage.setItem(storageKey, value);
|
|
1963
|
+
} catch (unused) {}
|
|
1964
|
+
writeCookie(storageKey, value);
|
|
1965
|
+
}
|
|
1966
|
+
var PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;
|
|
1967
|
+
function readCookie(name) {
|
|
1968
|
+
if (typeof document === "undefined") {
|
|
1969
|
+
return void 0;
|
|
1970
|
+
}
|
|
1971
|
+
try {
|
|
1972
|
+
var prefix = encodeURIComponent(name) + "=";
|
|
1973
|
+
var parts = document.cookie ? document.cookie.split(";") : [];
|
|
1974
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1975
|
+
try {
|
|
1976
|
+
for(var _iterator = parts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1977
|
+
var part = _step.value;
|
|
1978
|
+
var entry = part.trim();
|
|
1979
|
+
if (entry.startsWith(prefix)) {
|
|
1980
|
+
return decodeURIComponent(entry.slice(prefix.length)) || void 0;
|
|
1981
|
+
}
|
|
1982
|
+
}
|
|
1983
|
+
} catch (err) {
|
|
1984
|
+
_didIteratorError = true;
|
|
1985
|
+
_iteratorError = err;
|
|
1986
|
+
} finally{
|
|
1987
|
+
try {
|
|
1988
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1989
|
+
_iterator.return();
|
|
1990
|
+
}
|
|
1991
|
+
} finally{
|
|
1992
|
+
if (_didIteratorError) {
|
|
1993
|
+
throw _iteratorError;
|
|
1994
|
+
}
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
} catch (unused) {}
|
|
1998
|
+
return void 0;
|
|
1999
|
+
}
|
|
2000
|
+
function writeCookie(name, value) {
|
|
2001
|
+
if (typeof document === "undefined") {
|
|
2002
|
+
return;
|
|
2003
|
+
}
|
|
2004
|
+
try {
|
|
2005
|
+
document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + ";path=/;max-age=" + PERSISTENT_ID_COOKIE_MAX_AGE + ";SameSite=Lax";
|
|
1685
2006
|
} catch (unused) {}
|
|
1686
|
-
return sessionId;
|
|
1687
2007
|
}
|
|
1688
2008
|
function createUuid() {
|
|
2009
|
+
var _bytes_, _bytes_1;
|
|
1689
2010
|
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
1690
2011
|
return crypto.randomUUID();
|
|
1691
2012
|
}
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
2013
|
+
var bytes = new Uint8Array(16);
|
|
2014
|
+
if (typeof crypto !== "undefined" && typeof crypto.getRandomValues === "function") {
|
|
2015
|
+
crypto.getRandomValues(bytes);
|
|
2016
|
+
} else {
|
|
2017
|
+
var seed = Date.now() ^ Math.floor(performanceNow() * 1e3);
|
|
2018
|
+
for(var i = 0; i < 16; i++){
|
|
2019
|
+
seed = seed * 1103515245 + 12345 & 2147483647;
|
|
2020
|
+
bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;
|
|
2021
|
+
}
|
|
2022
|
+
}
|
|
2023
|
+
bytes[6] = ((_bytes_ = bytes[6]) !== null && _bytes_ !== void 0 ? _bytes_ : 0) & 15 | 64;
|
|
2024
|
+
bytes[8] = ((_bytes_1 = bytes[8]) !== null && _bytes_1 !== void 0 ? _bytes_1 : 0) & 63 | 128;
|
|
2025
|
+
var hex = "";
|
|
2026
|
+
for(var i1 = 0; i1 < 16; i1++){
|
|
2027
|
+
var _bytes_i;
|
|
2028
|
+
hex += ((_bytes_i = bytes[i1]) !== null && _bytes_i !== void 0 ? _bytes_i : 0).toString(16).padStart(2, "0");
|
|
2029
|
+
}
|
|
2030
|
+
return hex.slice(0, 8) + "-" + hex.slice(8, 12) + "-" + hex.slice(12, 16) + "-" + hex.slice(16, 20) + "-" + hex.slice(20, 32);
|
|
2031
|
+
}
|
|
2032
|
+
function performanceNow() {
|
|
2033
|
+
try {
|
|
2034
|
+
if (typeof performance !== "undefined" && typeof performance.now === "function") {
|
|
2035
|
+
return performance.now();
|
|
2036
|
+
}
|
|
2037
|
+
} catch (unused) {}
|
|
2038
|
+
return 0;
|
|
1697
2039
|
}
|
|
1698
2040
|
function readPlatformNativeDeviceId() {
|
|
1699
2041
|
if (typeof window === "undefined") return {};
|
|
@@ -3111,7 +3453,20 @@ function applyVastMacros(baseUrl, ctx) {
|
|
|
3111
3453
|
if (ctx.pod != null) {
|
|
3112
3454
|
params.set("pod", String(ctx.pod));
|
|
3113
3455
|
}
|
|
3114
|
-
|
|
3456
|
+
var optimizedPodMode = ctx.podMaxAds != null || ctx.podMinDurationMs != null || ctx.podMaxDurationMs != null;
|
|
3457
|
+
if (optimizedPodMode) {
|
|
3458
|
+
params.delete("ppos");
|
|
3459
|
+
params.delete("lip");
|
|
3460
|
+
if (ctx.podMinDurationMs != null) {
|
|
3461
|
+
params.set("pmnd", String(Math.max(0, Math.round(ctx.podMinDurationMs))));
|
|
3462
|
+
}
|
|
3463
|
+
if (ctx.podMaxDurationMs != null) {
|
|
3464
|
+
params.set("pmxd", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));
|
|
3465
|
+
}
|
|
3466
|
+
if (ctx.podMaxAds != null) {
|
|
3467
|
+
params.set("pmad", String(Math.max(1, Math.round(ctx.podMaxAds))));
|
|
3468
|
+
}
|
|
3469
|
+
} else if (ctx.adPosition != null) {
|
|
3115
3470
|
params.set("ppos", String(ctx.adPosition));
|
|
3116
3471
|
}
|
|
3117
3472
|
var requestUrl = ctx.contentUrl || ctx.pageUrl;
|
|
@@ -4453,6 +4808,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
4453
4808
|
this.podAssignedByPrefetch = false;
|
|
4454
4809
|
this.adRequestPositionInBreak = 0;
|
|
4455
4810
|
this.lastHeartbeatTime = 0;
|
|
4811
|
+
this.defaultPodMaxAds = 6;
|
|
4456
4812
|
this.config = config;
|
|
4457
4813
|
this.video = video;
|
|
4458
4814
|
}
|
|
@@ -4908,6 +5264,52 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
4908
5264
|
return urls;
|
|
4909
5265
|
}
|
|
4910
5266
|
},
|
|
5267
|
+
{
|
|
5268
|
+
key: "resolvePodParams",
|
|
5269
|
+
value: function resolvePodParams(breakDurationMs) {
|
|
5270
|
+
var maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs;
|
|
5271
|
+
var maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;
|
|
5272
|
+
var minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;
|
|
5273
|
+
return {
|
|
5274
|
+
maxAds: maxAds,
|
|
5275
|
+
minDurationMs: minDurationMs,
|
|
5276
|
+
maxDurationMs: maxDurationMs
|
|
5277
|
+
};
|
|
5278
|
+
}
|
|
5279
|
+
},
|
|
5280
|
+
{
|
|
5281
|
+
key: "generatePodVastUrl",
|
|
5282
|
+
value: function generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {
|
|
5283
|
+
var _podParams_maxDurationMs;
|
|
5284
|
+
var adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;
|
|
5285
|
+
var envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);
|
|
5286
|
+
var urlWithMacros = applyVastMacros(baseUrl, {
|
|
5287
|
+
correlator: generateCorrelator(),
|
|
5288
|
+
streamCorrelator: this.streamCorrelator,
|
|
5289
|
+
pod: this.podCounter > 0 ? this.podCounter : void 0,
|
|
5290
|
+
podMaxAds: podParams.maxAds,
|
|
5291
|
+
podMinDurationMs: podParams.minDurationMs,
|
|
5292
|
+
podMaxDurationMs: podParams.maxDurationMs,
|
|
5293
|
+
isCtv: envSignals.isCtv,
|
|
5294
|
+
contentUrl: envSignals.contentUrl,
|
|
5295
|
+
pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? window.location.href : void 0,
|
|
5296
|
+
adWillPlayMuted: adWillPlayMuted,
|
|
5297
|
+
adWillAutoPlay: !!this.config.autoplay,
|
|
5298
|
+
appId: envSignals.appId,
|
|
5299
|
+
appName: envSignals.appName,
|
|
5300
|
+
sessionId: envSignals.sessionId,
|
|
5301
|
+
deviceId: envSignals.deviceId,
|
|
5302
|
+
deviceIdType: envSignals.deviceIdType,
|
|
5303
|
+
limitAdTracking: envSignals.limitAdTracking,
|
|
5304
|
+
deviceTypeHint: envSignals.deviceTypeHint,
|
|
5305
|
+
adTest: this.config.adTest,
|
|
5306
|
+
consent: this.consentSignals
|
|
5307
|
+
});
|
|
5308
|
+
var finalUrl = palNonce.injectNonce(urlWithMacros);
|
|
5309
|
+
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);
|
|
5310
|
+
return finalUrl;
|
|
5311
|
+
}
|
|
5312
|
+
},
|
|
4911
5313
|
{
|
|
4912
5314
|
// --- Tracking ---
|
|
4913
5315
|
key: "initializeTracking",
|
|
@@ -5213,6 +5615,13 @@ var AdTimingService = /*#__PURE__*/ function() {
|
|
|
5213
5615
|
this.lastAdRequestTime = Date.now();
|
|
5214
5616
|
}
|
|
5215
5617
|
},
|
|
5618
|
+
{
|
|
5619
|
+
key: "notePodAdStarted",
|
|
5620
|
+
value: function notePodAdStarted() {
|
|
5621
|
+
this.currentAdIndex++;
|
|
5622
|
+
this.totalAdsInBreak = this.currentAdIndex;
|
|
5623
|
+
}
|
|
5624
|
+
},
|
|
5216
5625
|
{
|
|
5217
5626
|
key: "getRemainingAdMs",
|
|
5218
5627
|
value: function getRemainingAdMs() {
|
|
@@ -6721,13 +7130,26 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
6721
7130
|
}
|
|
6722
7131
|
},
|
|
6723
7132
|
{
|
|
6724
|
-
|
|
7133
|
+
key: "optimizedPodsEnabled",
|
|
7134
|
+
get: // ───────────────────────────────────────────────────────────────
|
|
6725
7135
|
// IMA event listeners
|
|
6726
7136
|
// ───────────────────────────────────────────────────────────────
|
|
7137
|
+
function get() {
|
|
7138
|
+
return !!this.host.config.optimizedPods;
|
|
7139
|
+
}
|
|
7140
|
+
},
|
|
7141
|
+
{
|
|
6727
7142
|
key: "attachImaEventListeners",
|
|
6728
7143
|
value: function attachImaEventListeners() {
|
|
6729
7144
|
var _this = this;
|
|
6730
7145
|
var adPlayer = this.host.getAdPlayer();
|
|
7146
|
+
adPlayer.on("pod_ad_started", function(payload) {
|
|
7147
|
+
_this.timing.notePodAdStarted();
|
|
7148
|
+
if (_this.debug) {
|
|
7149
|
+
var _ref;
|
|
7150
|
+
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 : "?"));
|
|
7151
|
+
}
|
|
7152
|
+
});
|
|
6731
7153
|
adPlayer.on("all_ads_completed", function() {
|
|
6732
7154
|
sendAdImpressionTracking(_this.host.config.licenseKey, {
|
|
6733
7155
|
source: "hls",
|
|
@@ -6885,7 +7307,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
6885
7307
|
// ───────────────────────────────────────────────────────────────
|
|
6886
7308
|
function handleAdStart(_marker) {
|
|
6887
7309
|
return _async_to_generator(function() {
|
|
6888
|
-
var scheduled, tags, baseVastUrl, adBreakDurationMs, mode, currentMuted, currentVolume, firstAdUrl, usePreloadedAd, preloadedController, preloaded, firstAdUrlArray, adPlayer, preservedMuted, preservedVolume, adVolume, adPlayer1, adVolume1, error, fallbackPreloaded, ap, adVolume2, fallbackError;
|
|
7310
|
+
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;
|
|
6889
7311
|
return _ts_generator(this, function(_state) {
|
|
6890
7312
|
switch(_state.label){
|
|
6891
7313
|
case 0:
|
|
@@ -6932,6 +7354,26 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
6932
7354
|
if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {
|
|
6933
7355
|
this.timing.expectedAdBreakDurationMs = adBreakDurationMs;
|
|
6934
7356
|
}
|
|
7357
|
+
if (!this.optimizedPodsEnabled) return [
|
|
7358
|
+
3,
|
|
7359
|
+
2
|
|
7360
|
+
];
|
|
7361
|
+
return [
|
|
7362
|
+
4,
|
|
7363
|
+
this.startOptimizedPod(baseVastUrl, adBreakDurationMs, currentMuted, currentVolume)
|
|
7364
|
+
];
|
|
7365
|
+
case 1:
|
|
7366
|
+
podPlayed = _state.sent();
|
|
7367
|
+
if (podPlayed) {
|
|
7368
|
+
return [
|
|
7369
|
+
2
|
|
7370
|
+
];
|
|
7371
|
+
}
|
|
7372
|
+
if (this.debug) {
|
|
7373
|
+
console.log("[POD] Optimized pod unavailable, falling back to sequential single-ad path");
|
|
7374
|
+
}
|
|
7375
|
+
_state.label = 2;
|
|
7376
|
+
case 2:
|
|
6935
7377
|
usePreloadedAd = false;
|
|
6936
7378
|
preloaded = this.preloadPool.getPreloadedAd();
|
|
6937
7379
|
if (preloaded) {
|
|
@@ -6973,21 +7415,21 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
6973
7415
|
if (this.debug) {
|
|
6974
7416
|
console.log("[CONTINUOUS-FETCH] First VAST URL:", firstAdUrl);
|
|
6975
7417
|
}
|
|
6976
|
-
_state.label =
|
|
6977
|
-
case
|
|
7418
|
+
_state.label = 3;
|
|
7419
|
+
case 3:
|
|
6978
7420
|
_state.trys.push([
|
|
6979
|
-
|
|
6980
|
-
|
|
7421
|
+
3,
|
|
7422
|
+
14,
|
|
6981
7423
|
,
|
|
6982
|
-
|
|
7424
|
+
22
|
|
6983
7425
|
]);
|
|
6984
7426
|
if (!(usePreloadedAd && preloadedController)) return [
|
|
6985
7427
|
3,
|
|
6986
|
-
|
|
7428
|
+
7
|
|
6987
7429
|
];
|
|
6988
7430
|
if (!!this.timing.ensureLoadedAdFitsBudget(preloadedController)) return [
|
|
6989
7431
|
3,
|
|
6990
|
-
|
|
7432
|
+
5
|
|
6991
7433
|
];
|
|
6992
7434
|
this.timing.rejectLoadedAdForDuration(preloadedController);
|
|
6993
7435
|
this.startContinuousFetching(baseVastUrl);
|
|
@@ -6995,12 +7437,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
6995
7437
|
4,
|
|
6996
7438
|
this.tryNextAvailableAdWithRateLimit()
|
|
6997
7439
|
];
|
|
6998
|
-
case
|
|
7440
|
+
case 4:
|
|
6999
7441
|
_state.sent();
|
|
7000
7442
|
return [
|
|
7001
7443
|
2
|
|
7002
7444
|
];
|
|
7003
|
-
case
|
|
7445
|
+
case 5:
|
|
7004
7446
|
adPlayer = this.host.getAdPlayer();
|
|
7005
7447
|
preservedMuted = adPlayer.getOriginalMutedState();
|
|
7006
7448
|
preservedVolume = adPlayer.getOriginalVolume();
|
|
@@ -7025,7 +7467,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7025
7467
|
4,
|
|
7026
7468
|
preloadedController.play()
|
|
7027
7469
|
];
|
|
7028
|
-
case
|
|
7470
|
+
case 6:
|
|
7029
7471
|
_state.sent();
|
|
7030
7472
|
this.timing.markAdStarted();
|
|
7031
7473
|
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
@@ -7035,22 +7477,22 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7035
7477
|
preloadedController.setAdVolume(adVolume);
|
|
7036
7478
|
return [
|
|
7037
7479
|
3,
|
|
7038
|
-
|
|
7480
|
+
13
|
|
7039
7481
|
];
|
|
7040
|
-
case
|
|
7482
|
+
case 7:
|
|
7041
7483
|
adPlayer1 = this.host.getAdPlayer();
|
|
7042
7484
|
return [
|
|
7043
7485
|
4,
|
|
7044
7486
|
this.timing.enforceGlobalRateLimit()
|
|
7045
7487
|
];
|
|
7046
|
-
case
|
|
7488
|
+
case 8:
|
|
7047
7489
|
_state.sent();
|
|
7048
7490
|
this.timing.lastAdRequestTime = Date.now();
|
|
7049
7491
|
return [
|
|
7050
7492
|
4,
|
|
7051
7493
|
adPlayer1.requestAds(firstAdUrl)
|
|
7052
7494
|
];
|
|
7053
|
-
case
|
|
7495
|
+
case 9:
|
|
7054
7496
|
_state.sent();
|
|
7055
7497
|
sendAdLoadedTracking(this.host.config.licenseKey, {
|
|
7056
7498
|
source: "hls",
|
|
@@ -7062,7 +7504,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7062
7504
|
}
|
|
7063
7505
|
if (!!this.timing.ensureLoadedAdFitsBudget(adPlayer1)) return [
|
|
7064
7506
|
3,
|
|
7065
|
-
|
|
7507
|
+
11
|
|
7066
7508
|
];
|
|
7067
7509
|
this.timing.rejectLoadedAdForDuration(adPlayer1);
|
|
7068
7510
|
this.recreateAdController();
|
|
@@ -7071,12 +7513,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7071
7513
|
4,
|
|
7072
7514
|
this.tryNextAvailableAdWithRateLimit()
|
|
7073
7515
|
];
|
|
7074
|
-
case
|
|
7516
|
+
case 10:
|
|
7075
7517
|
_state.sent();
|
|
7076
7518
|
return [
|
|
7077
7519
|
2
|
|
7078
7520
|
];
|
|
7079
|
-
case
|
|
7521
|
+
case 11:
|
|
7080
7522
|
this.timing.consecutiveFailures = 0;
|
|
7081
7523
|
this.startContinuousFetching(baseVastUrl);
|
|
7082
7524
|
if (!this.preloadPool.active) {
|
|
@@ -7086,7 +7528,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7086
7528
|
4,
|
|
7087
7529
|
adPlayer1.play()
|
|
7088
7530
|
];
|
|
7089
|
-
case
|
|
7531
|
+
case 12:
|
|
7090
7532
|
_state.sent();
|
|
7091
7533
|
this.timing.markAdStarted();
|
|
7092
7534
|
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
@@ -7094,40 +7536,40 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7094
7536
|
}
|
|
7095
7537
|
adVolume1 = currentMuted ? 0 : currentVolume;
|
|
7096
7538
|
adPlayer1.setAdVolume(adVolume1);
|
|
7097
|
-
_state.label =
|
|
7098
|
-
case
|
|
7539
|
+
_state.label = 13;
|
|
7540
|
+
case 13:
|
|
7099
7541
|
return [
|
|
7100
7542
|
3,
|
|
7101
|
-
|
|
7543
|
+
22
|
|
7102
7544
|
];
|
|
7103
|
-
case
|
|
7545
|
+
case 14:
|
|
7104
7546
|
error = _state.sent();
|
|
7105
7547
|
if (this.debug) {
|
|
7106
7548
|
console.warn("[CONTINUOUS-FETCH] First ad request failed:", error);
|
|
7107
7549
|
}
|
|
7108
7550
|
if (!!usePreloadedAd) return [
|
|
7109
7551
|
3,
|
|
7110
|
-
|
|
7552
|
+
20
|
|
7111
7553
|
];
|
|
7112
7554
|
fallbackPreloaded = this.preloadPool.getPreloadedAd();
|
|
7113
7555
|
if (!fallbackPreloaded) return [
|
|
7114
7556
|
3,
|
|
7115
|
-
|
|
7557
|
+
20
|
|
7116
7558
|
];
|
|
7117
7559
|
if (this.debug) {
|
|
7118
7560
|
console.log("[CONTINUOUS-FETCH] First ad failed, using preloaded fallback");
|
|
7119
7561
|
}
|
|
7120
|
-
_state.label =
|
|
7121
|
-
case
|
|
7562
|
+
_state.label = 15;
|
|
7563
|
+
case 15:
|
|
7122
7564
|
_state.trys.push([
|
|
7123
|
-
|
|
7124
|
-
|
|
7565
|
+
15,
|
|
7566
|
+
19,
|
|
7125
7567
|
,
|
|
7126
|
-
|
|
7568
|
+
20
|
|
7127
7569
|
]);
|
|
7128
7570
|
if (!!this.timing.ensureLoadedAdFitsBudget(fallbackPreloaded.adController)) return [
|
|
7129
7571
|
3,
|
|
7130
|
-
|
|
7572
|
+
17
|
|
7131
7573
|
];
|
|
7132
7574
|
this.timing.rejectLoadedAdForDuration(fallbackPreloaded.adController);
|
|
7133
7575
|
this.startContinuousFetching(baseVastUrl);
|
|
@@ -7135,12 +7577,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7135
7577
|
4,
|
|
7136
7578
|
this.tryNextAvailableAdWithRateLimit()
|
|
7137
7579
|
];
|
|
7138
|
-
case
|
|
7580
|
+
case 16:
|
|
7139
7581
|
_state.sent();
|
|
7140
7582
|
return [
|
|
7141
7583
|
2
|
|
7142
7584
|
];
|
|
7143
|
-
case
|
|
7585
|
+
case 17:
|
|
7144
7586
|
this.swapToPreloadedAdPlayer(fallbackPreloaded.adController);
|
|
7145
7587
|
this.timing.consecutiveFailures = 0;
|
|
7146
7588
|
this.startContinuousFetching(baseVastUrl);
|
|
@@ -7153,7 +7595,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7153
7595
|
4,
|
|
7154
7596
|
ap.play()
|
|
7155
7597
|
];
|
|
7156
|
-
case
|
|
7598
|
+
case 18:
|
|
7157
7599
|
_state.sent();
|
|
7158
7600
|
this.timing.markAdStarted();
|
|
7159
7601
|
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
@@ -7164,16 +7606,16 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7164
7606
|
return [
|
|
7165
7607
|
2
|
|
7166
7608
|
];
|
|
7167
|
-
case
|
|
7609
|
+
case 19:
|
|
7168
7610
|
fallbackError = _state.sent();
|
|
7169
7611
|
if (this.debug) {
|
|
7170
7612
|
console.warn("[CONTINUOUS-FETCH] Preloaded fallback also failed:", fallbackError);
|
|
7171
7613
|
}
|
|
7172
7614
|
return [
|
|
7173
7615
|
3,
|
|
7174
|
-
|
|
7616
|
+
20
|
|
7175
7617
|
];
|
|
7176
|
-
case
|
|
7618
|
+
case 20:
|
|
7177
7619
|
if (this.timing.isTemporaryAdError(error)) {
|
|
7178
7620
|
this.timing.temporaryFailureUrls.set(firstAdUrl, Date.now());
|
|
7179
7621
|
if (this.debug) {
|
|
@@ -7191,13 +7633,137 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7191
7633
|
4,
|
|
7192
7634
|
this.tryNextAvailableAdWithRateLimit()
|
|
7193
7635
|
];
|
|
7194
|
-
case
|
|
7636
|
+
case 21:
|
|
7195
7637
|
_state.sent();
|
|
7196
7638
|
return [
|
|
7197
7639
|
3,
|
|
7198
|
-
|
|
7640
|
+
22
|
|
7199
7641
|
];
|
|
7200
|
-
case
|
|
7642
|
+
case 22:
|
|
7643
|
+
return [
|
|
7644
|
+
2
|
|
7645
|
+
];
|
|
7646
|
+
}
|
|
7647
|
+
});
|
|
7648
|
+
}).call(this);
|
|
7649
|
+
}
|
|
7650
|
+
},
|
|
7651
|
+
{
|
|
7652
|
+
key: "startOptimizedPod",
|
|
7653
|
+
value: // ───────────────────────────────────────────────────────────────
|
|
7654
|
+
// Optimized pod (single multi-ad request)
|
|
7655
|
+
// ───────────────────────────────────────────────────────────────
|
|
7656
|
+
function startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {
|
|
7657
|
+
return _async_to_generator(function() {
|
|
7658
|
+
var podUrl, adPlayer, requestToken, _ref, _adPlayer_getPodAdCount, podCount, error;
|
|
7659
|
+
return _ts_generator(this, function(_state) {
|
|
7660
|
+
switch(_state.label){
|
|
7661
|
+
case 0:
|
|
7662
|
+
if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {
|
|
7663
|
+
podUrl = this.pendingAdBreak.vastUrls[0];
|
|
7664
|
+
this.clearPendingAdBreak();
|
|
7665
|
+
} else {
|
|
7666
|
+
podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);
|
|
7667
|
+
}
|
|
7668
|
+
if (!podUrl) {
|
|
7669
|
+
return [
|
|
7670
|
+
2,
|
|
7671
|
+
false
|
|
7672
|
+
];
|
|
7673
|
+
}
|
|
7674
|
+
this.continuousFetchingActive = false;
|
|
7675
|
+
this.recreateAdController();
|
|
7676
|
+
adPlayer = this.host.getAdPlayer();
|
|
7677
|
+
requestToken = ++this.timing.adRequestTokenCounter;
|
|
7678
|
+
this.timing.activeAdRequestToken = requestToken;
|
|
7679
|
+
this.timing.startAdRequestWatchdog(requestToken);
|
|
7680
|
+
_state.label = 1;
|
|
7681
|
+
case 1:
|
|
7682
|
+
_state.trys.push([
|
|
7683
|
+
1,
|
|
7684
|
+
5,
|
|
7685
|
+
,
|
|
7686
|
+
6
|
|
7687
|
+
]);
|
|
7688
|
+
return [
|
|
7689
|
+
4,
|
|
7690
|
+
this.timing.enforceGlobalRateLimit()
|
|
7691
|
+
];
|
|
7692
|
+
case 2:
|
|
7693
|
+
_state.sent();
|
|
7694
|
+
this.timing.lastAdRequestTime = Date.now();
|
|
7695
|
+
return [
|
|
7696
|
+
4,
|
|
7697
|
+
adPlayer.requestAds(podUrl)
|
|
7698
|
+
];
|
|
7699
|
+
case 3:
|
|
7700
|
+
_state.sent();
|
|
7701
|
+
this.timing.clearAdRequestWatchdog();
|
|
7702
|
+
if (this.timing.activeAdRequestToken !== requestToken) {
|
|
7703
|
+
return [
|
|
7704
|
+
2,
|
|
7705
|
+
true
|
|
7706
|
+
];
|
|
7707
|
+
}
|
|
7708
|
+
podCount = (_ref = (_adPlayer_getPodAdCount = adPlayer.getPodAdCount) === null || _adPlayer_getPodAdCount === void 0 ? void 0 : _adPlayer_getPodAdCount.call(adPlayer)) !== null && _ref !== void 0 ? _ref : 1;
|
|
7709
|
+
if (podCount < 1) {
|
|
7710
|
+
return [
|
|
7711
|
+
2,
|
|
7712
|
+
false
|
|
7713
|
+
];
|
|
7714
|
+
}
|
|
7715
|
+
if (this.debug) {
|
|
7716
|
+
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"));
|
|
7717
|
+
}
|
|
7718
|
+
sendAdLoadedTracking(this.host.config.licenseKey, {
|
|
7719
|
+
source: "hls",
|
|
7720
|
+
vastUrl: podUrl,
|
|
7721
|
+
timestamp: /* @__PURE__ */ new Date().toISOString()
|
|
7722
|
+
}, this.analyticsContext).catch(function() {});
|
|
7723
|
+
this.timing.startAdFailsafeTimer(requestToken);
|
|
7724
|
+
return [
|
|
7725
|
+
4,
|
|
7726
|
+
adPlayer.play()
|
|
7727
|
+
];
|
|
7728
|
+
case 4:
|
|
7729
|
+
_state.sent();
|
|
7730
|
+
this.timing.markAdStarted();
|
|
7731
|
+
if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {
|
|
7732
|
+
this.timing.scheduleAdStopAtBreakBoundary();
|
|
7733
|
+
}
|
|
7734
|
+
adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);
|
|
7735
|
+
this.timing.consecutiveFailures = 0;
|
|
7736
|
+
if (podCount === 1) {
|
|
7737
|
+
this.continuousFetchingActive = true;
|
|
7738
|
+
this.startContinuousFetching(baseVastUrl);
|
|
7739
|
+
if (!this.preloadPool.active) {
|
|
7740
|
+
this.preloadPool.startPreloadPool(baseVastUrl, []);
|
|
7741
|
+
}
|
|
7742
|
+
}
|
|
7743
|
+
return [
|
|
7744
|
+
2,
|
|
7745
|
+
true
|
|
7746
|
+
];
|
|
7747
|
+
case 5:
|
|
7748
|
+
error = _state.sent();
|
|
7749
|
+
this.timing.clearAdRequestWatchdog();
|
|
7750
|
+
this.timing.clearAdFailsafeTimer();
|
|
7751
|
+
if (this.timing.activeAdRequestToken === requestToken) {
|
|
7752
|
+
this.timing.activeAdRequestToken = null;
|
|
7753
|
+
}
|
|
7754
|
+
if (this.debug) {
|
|
7755
|
+
console.warn("[POD] Optimized pod request/play failed:", error);
|
|
7756
|
+
}
|
|
7757
|
+
if (this.timing.isTemporaryAdError(error)) {
|
|
7758
|
+
this.timing.temporaryFailureUrls.set(podUrl, Date.now());
|
|
7759
|
+
}
|
|
7760
|
+
this.continuousFetchingActive = true;
|
|
7761
|
+
this.recreateAdController();
|
|
7762
|
+
return [
|
|
7763
|
+
2,
|
|
7764
|
+
false
|
|
7765
|
+
];
|
|
7766
|
+
case 6:
|
|
7201
7767
|
return [
|
|
7202
7768
|
2
|
|
7203
7769
|
];
|
|
@@ -8279,6 +8845,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8279
8845
|
},
|
|
8280
8846
|
generateVastUrls: function generateVastUrls(base, count) {
|
|
8281
8847
|
return _this.generateVastUrls(base, count);
|
|
8848
|
+
},
|
|
8849
|
+
generatePodVastUrl: function generatePodVastUrl(base, breakDurationMs) {
|
|
8850
|
+
return _this.generatePodVastUrl(base, breakDurationMs);
|
|
8282
8851
|
}
|
|
8283
8852
|
}, this.timing, this.preloadPool, this.adConfig, this.cueManager, this.placeholder);
|
|
8284
8853
|
}
|
|
@@ -8311,6 +8880,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8311
8880
|
return this.adConfig.generateVastUrlsWithCorrelators(baseUrl, count, this.adPlayer, this.palNonce, this.adBreak.inAdBreak);
|
|
8312
8881
|
}
|
|
8313
8882
|
},
|
|
8883
|
+
{
|
|
8884
|
+
key: "generatePodVastUrl",
|
|
8885
|
+
value: function generatePodVastUrl(baseUrl, breakDurationMs) {
|
|
8886
|
+
var podParams = this.adConfig.resolvePodParams(breakDurationMs);
|
|
8887
|
+
return this.adConfig.generatePodVastUrl(baseUrl, podParams, this.adPlayer, this.palNonce, this.adBreak.inAdBreak);
|
|
8888
|
+
}
|
|
8889
|
+
},
|
|
8314
8890
|
{
|
|
8315
8891
|
key: "load",
|
|
8316
8892
|
value: // ───────────────────────────────────────────────────────────────
|
|
@@ -8699,7 +9275,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8699
9275
|
}
|
|
8700
9276
|
this.adConfig.beginNewAdPod();
|
|
8701
9277
|
this.adConfig.podAssignedByPrefetch = true;
|
|
8702
|
-
var
|
|
9278
|
+
var optimizedPods = !!this.config.optimizedPods;
|
|
9279
|
+
var breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;
|
|
9280
|
+
var generatedUrls = optimizedPods ? [
|
|
9281
|
+
this.generatePodVastUrl(baseVastUrl, breakDurationMs)
|
|
9282
|
+
] : this.generateVastUrls(baseVastUrl, 1);
|
|
8703
9283
|
this.adBreak.pendingAdBreak = _object_spread_props(_object_spread({
|
|
8704
9284
|
marker: marker
|
|
8705
9285
|
}, fragmentSn !== void 0 ? {
|
|
@@ -8721,7 +9301,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8721
9301
|
}, detectPayload), buildAnalyticsContext(this.config)).catch(function() {});
|
|
8722
9302
|
if (this.debug) {
|
|
8723
9303
|
console.log("[PREFETCH] Starting ad prefetch for upcoming ad break");
|
|
8724
|
-
console.log("[PREFETCH] Pre-generated ".concat(generatedUrls.length, " VAST
|
|
9304
|
+
console.log("[PREFETCH] Pre-generated ".concat(generatedUrls.length, " ").concat(optimizedPods ? "pod" : "VAST", " URL(s)"));
|
|
9305
|
+
}
|
|
9306
|
+
if (optimizedPods) {
|
|
9307
|
+
if (this.debug) {
|
|
9308
|
+
console.log("[PREFETCH] Optimized pods enabled - skipping single-ad preload pool");
|
|
9309
|
+
}
|
|
9310
|
+
return;
|
|
8725
9311
|
}
|
|
8726
9312
|
this.preloadPool.startPreloadPool(baseVastUrl, generatedUrls.slice(0, 1), false);
|
|
8727
9313
|
}
|