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.
@@ -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(trackingUrl));
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(trackingUrl));
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 === "gam") {
1548
- logFunnel("gam_http_request_sent", {
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 === "gam") {
1569
- logFunnel("gam_response_received", {
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
- podElements = adElements.filter(function(el) {
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 = adElements.filter(function(el) {
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
- console.log("[HlsAdPlayer] Requesting ads:", vastTagUrl);
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
  }