stormcloud-video-player 0.8.69 → 0.8.71
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 +2 -2
- package/lib/StormcloudPlayer.cjs +547 -40
- package/lib/StormcloudPlayer.cjs.map +1 -1
- package/lib/index.cjs +577 -42
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +18 -2
- package/lib/index.js +577 -42
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +355 -18
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +18 -0
- package/lib/player/EdgePodRequest.cjs +148 -0
- package/lib/player/EdgePodRequest.cjs.map +1 -0
- package/lib/player/EdgePodRequest.d.cts +14 -0
- package/lib/player/StormcloudVideoPlayer.cjs +547 -40
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +9 -0
- package/lib/players/HlsPlayer.cjs +547 -40
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/index.cjs +547 -40
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +120 -19
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/types.d.cts +10 -3
- package/lib/ui/StormcloudVideoPlayer.cjs +577 -42
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/package.json +1 -1
package/lib/sdk/hlsAdPlayer.cjs
CHANGED
|
@@ -880,7 +880,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
880
880
|
img.onload = null;
|
|
881
881
|
img.onerror = null;
|
|
882
882
|
inFlightBeacons.delete(img);
|
|
883
|
-
console.log("[HlsAdPlayer] Tracking pixel settled (".concat(outcome, "): ").concat(
|
|
883
|
+
console.log("[HlsAdPlayer] Tracking pixel settled (".concat(outcome, "): ").concat(trackingHost));
|
|
884
884
|
if (outcome !== "load") {
|
|
885
885
|
logFunnel("tracking_request_settled", {
|
|
886
886
|
reason: outcome,
|
|
@@ -898,7 +898,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
898
898
|
return release("timeout");
|
|
899
899
|
}, BEACON_TIMEOUT_MS);
|
|
900
900
|
img.src = trackingUrl;
|
|
901
|
-
console.log("[HlsAdPlayer] Fired tracking pixel: ".concat(
|
|
901
|
+
console.log("[HlsAdPlayer] Fired tracking pixel: ".concat(trackingHost));
|
|
902
902
|
logFunnel("tracking_request_created", {
|
|
903
903
|
trackingHost: trackingHost,
|
|
904
904
|
errorCode: options2 === null || options2 === void 0 ? void 0 : options2.errorCode
|
|
@@ -1352,7 +1352,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1352
1352
|
});
|
|
1353
1353
|
}
|
|
1354
1354
|
if (parsed.type === "wrapper") {
|
|
1355
|
-
console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(parsed.vastAdTagUri));
|
|
1355
|
+
console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(redactUrl(parsed.vastAdTagUri)));
|
|
1356
1356
|
}
|
|
1357
1357
|
return parsed;
|
|
1358
1358
|
}
|
|
@@ -1544,8 +1544,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1544
1544
|
switch(_state.label){
|
|
1545
1545
|
case 0:
|
|
1546
1546
|
attempt++;
|
|
1547
|
-
if (kind
|
|
1548
|
-
logFunnel("
|
|
1547
|
+
if (kind !== "wrapper") {
|
|
1548
|
+
logFunnel("".concat(kind, "_http_request_sent"), {
|
|
1549
1549
|
attempt: attempt,
|
|
1550
1550
|
credentials: creds
|
|
1551
1551
|
});
|
|
@@ -1565,8 +1565,8 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1565
1565
|
];
|
|
1566
1566
|
case 1:
|
|
1567
1567
|
response = _state.sent();
|
|
1568
|
-
if (kind
|
|
1569
|
-
logFunnel("
|
|
1568
|
+
if (kind !== "wrapper") {
|
|
1569
|
+
logFunnel("".concat(kind, "_response_received"), {
|
|
1570
1570
|
attempt: attempt,
|
|
1571
1571
|
httpStatus: response.status,
|
|
1572
1572
|
ok: response.ok,
|
|
@@ -1736,8 +1736,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1736
1736
|
elapsedMs: Date.now() - fetchStartedAt
|
|
1737
1737
|
});
|
|
1738
1738
|
}
|
|
1739
|
-
console.log("[HlsAdPlayer] VAST XML received");
|
|
1740
|
-
console.log("[HlsAdPlayer] VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
|
|
1739
|
+
console.log("[HlsAdPlayer] VAST XML received (length=".concat(vastXml.length, ")"));
|
|
1741
1740
|
parsed = parseVastXml(vastXml);
|
|
1742
1741
|
if (parsed.type === "empty") {
|
|
1743
1742
|
;
|
|
@@ -1778,16 +1777,35 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1778
1777
|
});
|
|
1779
1778
|
}).apply(this, arguments);
|
|
1780
1779
|
}
|
|
1780
|
+
function isEdgeEmptySentinelAd(adElement) {
|
|
1781
|
+
var _textOf;
|
|
1782
|
+
if ((adElement.getAttribute("id") || "").trim().toLowerCase() === "empty") {
|
|
1783
|
+
return true;
|
|
1784
|
+
}
|
|
1785
|
+
var inLine = adElement.querySelector(":scope > InLine");
|
|
1786
|
+
if (!inLine) return false;
|
|
1787
|
+
if (/^no ad available$/i.test((_textOf = textOf(inLine.querySelector(":scope > AdTitle"))) !== null && _textOf !== void 0 ? _textOf : "")) {
|
|
1788
|
+
return true;
|
|
1789
|
+
}
|
|
1790
|
+
var durations = Array.from(inLine.querySelectorAll(":scope > Creatives > Creative > Linear > Duration")).map(function(el) {
|
|
1791
|
+
return parseVastTime(textOf(el));
|
|
1792
|
+
});
|
|
1793
|
+
return durations.length > 0 && durations.every(function(seconds) {
|
|
1794
|
+
return seconds === 0;
|
|
1795
|
+
});
|
|
1796
|
+
}
|
|
1781
1797
|
function fetchAndParsePod(vastTagUrl) {
|
|
1798
|
+
var source = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "gam";
|
|
1782
1799
|
return _async_to_generator(function() {
|
|
1783
|
-
var _root_getAttribute, _root_getAttribute1, vastXml, trimmedXml, xmlDoc, root, adElements, _root_getAttribute2, _empty_errorUrls, empty, _empty_errorCode, resolveAd, podElements, buffet, resolveAll, ads, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, ad, err, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, ad1, err;
|
|
1800
|
+
var _root_getAttribute, _root_getAttribute1, isEdge, vastXml, trimmedXml, xmlDoc, root, adElements, _root_getAttribute2, _empty_errorUrls, empty, _empty_errorCode, resolveAd, candidates, podElements, buffet, resolveAll, ads, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, ad, err, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, ad1, err;
|
|
1784
1801
|
return _ts_generator(this, function(_state) {
|
|
1785
1802
|
switch(_state.label){
|
|
1786
1803
|
case 0:
|
|
1787
1804
|
lastPodAdElementCount = 0;
|
|
1805
|
+
isEdge = source === "edge";
|
|
1788
1806
|
return [
|
|
1789
1807
|
4,
|
|
1790
|
-
fetchVastXml(vastTagUrl)
|
|
1808
|
+
fetchVastXml(vastTagUrl, isEdge ? "omit" : "include", source)
|
|
1791
1809
|
];
|
|
1792
1810
|
case 1:
|
|
1793
1811
|
vastXml = _state.sent();
|
|
@@ -1810,7 +1828,6 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1810
1828
|
}
|
|
1811
1829
|
xmlDoc = parseXml(vastXml);
|
|
1812
1830
|
if (!xmlDoc) {
|
|
1813
|
-
console.error("[HlsAdPlayer] Pod VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
|
|
1814
1831
|
logFunnel("vast_parsed", {
|
|
1815
1832
|
adElementCount: 0,
|
|
1816
1833
|
reason: "xml_parse_error"
|
|
@@ -1882,12 +1899,24 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1882
1899
|
});
|
|
1883
1900
|
})();
|
|
1884
1901
|
};
|
|
1885
|
-
|
|
1902
|
+
candidates = adElements;
|
|
1903
|
+
if (isEdge) {
|
|
1904
|
+
candidates = adElements.filter(function(el) {
|
|
1905
|
+
return !isEdgeEmptySentinelAd(el);
|
|
1906
|
+
});
|
|
1907
|
+
if (candidates.length < adElements.length) {
|
|
1908
|
+
logFunnel("edge_empty_sentinel", {
|
|
1909
|
+
sentinelCount: adElements.length - candidates.length,
|
|
1910
|
+
adElementCount: adElements.length
|
|
1911
|
+
});
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
podElements = candidates.filter(function(el) {
|
|
1886
1915
|
return getAdSequence(el) !== void 0;
|
|
1887
1916
|
}).sort(function(a, b) {
|
|
1888
1917
|
return getAdSequence(a) - getAdSequence(b);
|
|
1889
1918
|
});
|
|
1890
|
-
buffet =
|
|
1919
|
+
buffet = candidates.filter(function(el) {
|
|
1891
1920
|
return getAdSequence(el) === void 0;
|
|
1892
1921
|
});
|
|
1893
1922
|
resolveAll = function resolveAll(elements) {
|
|
@@ -2044,7 +2073,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
2044
2073
|
lastPodAdElementCount = adElements.length;
|
|
2045
2074
|
return [
|
|
2046
2075
|
2,
|
|
2047
|
-
ads
|
|
2076
|
+
isEdge ? ads.filter(function(ad) {
|
|
2077
|
+
return ad.duration > 0;
|
|
2078
|
+
}) : ads
|
|
2048
2079
|
];
|
|
2049
2080
|
}
|
|
2050
2081
|
});
|
|
@@ -3045,13 +3076,14 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
3045
3076
|
contentVideo[AD_CONTAINER_PROP] = adContainerEl;
|
|
3046
3077
|
attachContainerHandlers();
|
|
3047
3078
|
},
|
|
3048
|
-
requestAds: function requestAds(vastTagUrl) {
|
|
3079
|
+
requestAds: function requestAds(vastTagUrl, requestOptions) {
|
|
3049
3080
|
return _async_to_generator(function() {
|
|
3050
|
-
var ads, preloaded, error;
|
|
3081
|
+
var _ref, source, ads, preloaded, error;
|
|
3051
3082
|
return _ts_generator(this, function(_state) {
|
|
3052
3083
|
switch(_state.label){
|
|
3053
3084
|
case 0:
|
|
3054
|
-
|
|
3085
|
+
source = (_ref = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.source) !== null && _ref !== void 0 ? _ref : "gam";
|
|
3086
|
+
console.log("[HlsAdPlayer] Requesting ads (".concat(source, "):"), redactUrl(vastTagUrl));
|
|
3055
3087
|
if (adPlaying) {
|
|
3056
3088
|
console.warn("[HlsAdPlayer] Cannot request new ads while an ad is playing");
|
|
3057
3089
|
return [
|
|
@@ -3096,7 +3128,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
3096
3128
|
case 2:
|
|
3097
3129
|
return [
|
|
3098
3130
|
4,
|
|
3099
|
-
fetchAndParsePod(vastTagUrl)
|
|
3131
|
+
fetchAndParsePod(vastTagUrl, source)
|
|
3100
3132
|
];
|
|
3101
3133
|
case 3:
|
|
3102
3134
|
ads = _state.sent();
|
|
@@ -3506,6 +3538,75 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
3506
3538
|
return podAds.reduce(function(total, ad) {
|
|
3507
3539
|
return total + (ad.duration > 0 ? ad.duration * 1e3 : 0);
|
|
3508
3540
|
}, 0);
|
|
3541
|
+
},
|
|
3542
|
+
limitPodToBudget: function limitPodToBudget(maxDurationMs, maxAds) {
|
|
3543
|
+
if (adPlaying) return podAds.length;
|
|
3544
|
+
var kept = [];
|
|
3545
|
+
var dropped = [];
|
|
3546
|
+
var totalMs = 0;
|
|
3547
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
3548
|
+
try {
|
|
3549
|
+
for(var _iterator = podAds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
3550
|
+
var ad = _step.value;
|
|
3551
|
+
var durationMs = Math.round(ad.duration * 1e3);
|
|
3552
|
+
if (kept.length < maxAds && totalMs + durationMs <= maxDurationMs) {
|
|
3553
|
+
kept.push(ad);
|
|
3554
|
+
totalMs += durationMs;
|
|
3555
|
+
} else {
|
|
3556
|
+
dropped.push(ad);
|
|
3557
|
+
}
|
|
3558
|
+
}
|
|
3559
|
+
} catch (err) {
|
|
3560
|
+
_didIteratorError = true;
|
|
3561
|
+
_iteratorError = err;
|
|
3562
|
+
} finally{
|
|
3563
|
+
try {
|
|
3564
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
3565
|
+
_iterator.return();
|
|
3566
|
+
}
|
|
3567
|
+
} finally{
|
|
3568
|
+
if (_didIteratorError) {
|
|
3569
|
+
throw _iteratorError;
|
|
3570
|
+
}
|
|
3571
|
+
}
|
|
3572
|
+
}
|
|
3573
|
+
if (dropped.length > 0) {
|
|
3574
|
+
logFunnel("pod_trimmed_to_budget", {
|
|
3575
|
+
keptCount: kept.length,
|
|
3576
|
+
droppedCount: dropped.length,
|
|
3577
|
+
keptDurationMs: totalMs,
|
|
3578
|
+
maxDurationMs: maxDurationMs,
|
|
3579
|
+
maxAds: maxAds
|
|
3580
|
+
});
|
|
3581
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
3582
|
+
try {
|
|
3583
|
+
for(var _iterator1 = dropped[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
3584
|
+
var ad1 = _step1.value;
|
|
3585
|
+
resolvedAds.add(ad1);
|
|
3586
|
+
fireTrackingPixels(ad1.trackingUrls.notUsed, {
|
|
3587
|
+
ad: ad1
|
|
3588
|
+
});
|
|
3589
|
+
}
|
|
3590
|
+
} catch (err) {
|
|
3591
|
+
_didIteratorError1 = true;
|
|
3592
|
+
_iteratorError1 = err;
|
|
3593
|
+
} finally{
|
|
3594
|
+
try {
|
|
3595
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
3596
|
+
_iterator1.return();
|
|
3597
|
+
}
|
|
3598
|
+
} finally{
|
|
3599
|
+
if (_didIteratorError1) {
|
|
3600
|
+
throw _iteratorError1;
|
|
3601
|
+
}
|
|
3602
|
+
}
|
|
3603
|
+
}
|
|
3604
|
+
}
|
|
3605
|
+
podAds = kept;
|
|
3606
|
+
podIndex = 0;
|
|
3607
|
+
currentAd = kept[0];
|
|
3608
|
+
currentAdMediaFile = void 0;
|
|
3609
|
+
return kept.length;
|
|
3509
3610
|
}
|
|
3510
3611
|
};
|
|
3511
3612
|
}
|