stormcloud-video-player 0.8.19 → 0.8.20

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.
Files changed (39) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/index.cjs +53 -9
  3. package/lib/index.cjs.map +1 -1
  4. package/lib/index.js +53 -9
  5. package/lib/index.js.map +1 -1
  6. package/lib/player/AdBreakOrchestrator.d.cts +1 -1
  7. package/lib/player/AdConfigManager.cjs +60 -5
  8. package/lib/player/AdConfigManager.cjs.map +1 -1
  9. package/lib/player/AdConfigManager.d.cts +1 -1
  10. package/lib/player/AdPreloadPool.d.cts +1 -1
  11. package/lib/player/AdTimingService.d.cts +1 -1
  12. package/lib/player/HlsEngine.d.cts +1 -1
  13. package/lib/player/PlayerControls.d.cts +1 -1
  14. package/lib/player/Scte35CueManager.d.cts +1 -1
  15. package/lib/player/Scte35Parser.d.cts +1 -1
  16. package/lib/player/StormcloudVideoPlayer.cjs +53 -9
  17. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  18. package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
  19. package/lib/player/playerTypes.d.cts +1 -1
  20. package/lib/players/HlsPlayer.cjs +53 -9
  21. package/lib/players/HlsPlayer.cjs.map +1 -1
  22. package/lib/players/HlsPlayer.d.cts +1 -1
  23. package/lib/players/index.cjs +53 -9
  24. package/lib/players/index.cjs.map +1 -1
  25. package/lib/sdk/hlsAdPlayer.cjs +5 -4
  26. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  27. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  28. package/lib/types-BAP8n5mE.d.cts +126 -0
  29. package/lib/ui/StormcloudVideoPlayer.cjs +53 -9
  30. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  31. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  32. package/lib/utils/ctvVastSignals.cjs +12 -1
  33. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  34. package/lib/utils/tracking.d.cts +1 -1
  35. package/lib/utils/vastEnvironmentSignals.cjs +12 -1
  36. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  37. package/lib/utils/vastMacros.cjs +48 -0
  38. package/lib/utils/vastMacros.cjs.map +1 -1
  39. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { S as Scte35Marker, a as StormcloudVideoPlayerConfig, A as AdController } from '../types-DNiBmPKK.cjs';
1
+ import { a as Scte35Marker, S as StormcloudVideoPlayerConfig, A as AdController } from '../types-BAP8n5mE.cjs';
2
2
  import { AdTimingService } from './AdTimingService.cjs';
3
3
  import { AdPreloadPool } from './AdPreloadPool.cjs';
4
4
  import { AdConfigManager } from './AdConfigManager.cjs';
@@ -7,6 +7,9 @@ function _array_like_to_array(arr, len) {
7
7
  function _array_with_holes(arr) {
8
8
  if (Array.isArray(arr)) return arr;
9
9
  }
10
+ function _array_without_holes(arr) {
11
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
12
+ }
10
13
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
11
14
  try {
12
15
  var info = gen[key](arg);
@@ -68,6 +71,9 @@ function _define_property(obj, key, value) {
68
71
  }
69
72
  return obj;
70
73
  }
74
+ function _iterable_to_array(iter) {
75
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
76
+ }
71
77
  function _iterable_to_array_limit(arr, i) {
72
78
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
73
79
  if (_i == null) return;
@@ -95,6 +101,9 @@ function _iterable_to_array_limit(arr, i) {
95
101
  function _non_iterable_rest() {
96
102
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
97
103
  }
104
+ function _non_iterable_spread() {
105
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
106
+ }
98
107
  function _object_spread(target) {
99
108
  for(var i = 1; i < arguments.length; i++){
100
109
  var source = arguments[i] != null ? arguments[i] : {};
@@ -137,6 +146,9 @@ function _object_spread_props(target, source) {
137
146
  function _sliced_to_array(arr, i) {
138
147
  return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
139
148
  }
149
+ function _to_consumable_array(arr) {
150
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
151
+ }
140
152
  function _type_of(obj) {
141
153
  "@swc/helpers - typeof";
142
154
  return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
@@ -316,9 +328,20 @@ __export(AdConfigManager_exports, {
316
328
  module.exports = __toCommonJS(AdConfigManager_exports);
317
329
  // src/utils/vastEnvironmentSignals.ts
318
330
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
331
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
332
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
333
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
319
334
  var AIRY_APP_NAME = "AiryTV Movies & TV";
320
335
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
321
336
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
337
+ function getDefaultAppId() {
338
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
339
+ var ua = navigator.userAgent;
340
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
341
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
342
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
343
+ return AIRY_ANDROID_APP_ID;
344
+ }
322
345
  var DEVICE_ID_STORAGE_KEYS = [
323
346
  "rdid",
324
347
  "ifa",
@@ -345,7 +368,7 @@ function resolveVastEnvironmentSignals(isCtv) {
345
368
  return _object_spread_props(_object_spread({
346
369
  isCtv: true,
347
370
  contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
348
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
371
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
349
372
  appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
350
373
  sessionId: getOrCreateCtvSessionId()
351
374
  }, deviceId ? {
@@ -891,6 +914,29 @@ function normalizeVastTagUrl(raw) {
891
914
  if (!raw) return raw;
892
915
  try {
893
916
  var url = new URL(raw);
917
+ var anValue = url.searchParams.get("an");
918
+ if (anValue !== null) {
919
+ var orphanFragments = [];
920
+ url.searchParams.forEach(function(_value, key) {
921
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
922
+ orphanFragments.push(key.trim());
923
+ }
924
+ });
925
+ if (orphanFragments.length > 0) {
926
+ var reconstructed = [
927
+ anValue.trimEnd()
928
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
929
+ url.searchParams.forEach(function(_value, key) {
930
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
931
+ url.searchParams.delete(key);
932
+ }
933
+ });
934
+ url.searchParams.set("an", reconstructed);
935
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
936
+ return prefix + val.replace(/\+/g, "%20");
937
+ });
938
+ }
939
+ }
894
940
  removeBrokenAppNameOrphans(url.searchParams);
895
941
  return url.toString();
896
942
  } catch (unused) {
@@ -1517,7 +1563,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
1517
1563
  key: "fetchAdConfiguration",
1518
1564
  value: function fetchAdConfiguration() {
1519
1565
  return _async_to_generator(function() {
1520
- var _data_response_ima_publisherdeskima, _data_response_ima, _data_response, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response1, vastMode, vastEndpoint, apiUrl, headers, response, data, imaPayload, numberAds;
1566
+ var _data_response_ima_publisherdeskima, _data_response_ima, _data_response, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response1, vastMode, vastEndpoint, apiUrl, headers, response, data, imaPayload, decodedPayload, numberAds;
1521
1567
  return _ts_generator(this, function(_state) {
1522
1568
  switch(_state.label){
1523
1569
  case 0:
@@ -1601,9 +1647,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
1601
1647
  data = _state.sent();
1602
1648
  imaPayload = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : (_data_response_ima = _data_response.ima) === null || _data_response_ima === void 0 ? void 0 : (_data_response_ima_publisherdeskima = _data_response_ima["publisherdesk.ima"]) === null || _data_response_ima_publisherdeskima === void 0 ? void 0 : _data_response_ima_publisherdeskima.payload;
1603
1649
  if (imaPayload) {
1604
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
1650
+ decodedPayload = imaPayload;
1651
+ try {
1652
+ decodedPayload = decodeURIComponent(imaPayload);
1653
+ } catch (unused) {
1654
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
1655
+ }
1656
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
1657
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
1605
1658
  if (this.debug) {
1606
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
1659
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
1607
1660
  }
1608
1661
  } else {
1609
1662
  if (this.debug) {
@@ -1937,7 +1990,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
1937
1990
  adTest: this.config.adTest,
1938
1991
  consent: this.consentSignals
1939
1992
  });
1940
- urls.push(palNonce.injectNonce(urlWithMacros));
1993
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
1994
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
1995
+ urls.push(finalUrl);
1941
1996
  }
1942
1997
  return urls;
1943
1998
  }