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,5 +1,5 @@
1
1
  import { Component } from 'react';
2
- import { a as StormcloudVideoPlayerConfig } from '../types-DNiBmPKK.cjs';
2
+ import { S as StormcloudVideoPlayerConfig } from '../types-BAP8n5mE.cjs';
3
3
 
4
4
  interface HlsPlayerProps extends StormcloudVideoPlayerConfig {
5
5
  onMount?: (player: any) => void;
@@ -863,6 +863,7 @@ function createHlsAdPlayer(contentVideo, options) {
863
863
  handleAdComplete();
864
864
  });
865
865
  adVideoElement.addEventListener("error", function(e) {
866
+ if (!adPlaying) return;
866
867
  console.error("[HlsAdPlayer] Ad video error:", e);
867
868
  if (currentAd) {
868
869
  fireTrackingPixels(currentAd.trackingUrls.error);
@@ -1064,15 +1065,15 @@ function createHlsAdPlayer(contentVideo, options) {
1064
1065
  adVideoElement.muted = originalMutedState;
1065
1066
  console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
1066
1067
  }
1068
+ mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1069
+ if (!mediaFile) {
1070
+ throw new Error("No media file available for ad");
1071
+ }
1067
1072
  if (adContainerEl) {
1068
1073
  adContainerEl.style.display = "flex";
1069
1074
  adContainerEl.style.pointerEvents = "auto";
1070
1075
  }
1071
1076
  emit("content_pause");
1072
- mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1073
- if (!mediaFile) {
1074
- throw new Error("No media file available for ad");
1075
- }
1076
1077
  isHlsAd = isHlsMediaFile(mediaFile);
1077
1078
  console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
1078
1079
  if (isHlsAd && import_hls.default.isSupported()) {
@@ -2360,9 +2361,20 @@ function initializePolyfills() {
2360
2361
  }
2361
2362
  // src/utils/vastEnvironmentSignals.ts
2362
2363
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2364
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
2365
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
2366
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
2363
2367
  var AIRY_APP_NAME = "AiryTV Movies & TV";
2364
2368
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
2365
2369
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2370
+ function getDefaultAppId() {
2371
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
2372
+ var ua = navigator.userAgent;
2373
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
2374
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
2375
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
2376
+ return AIRY_ANDROID_APP_ID;
2377
+ }
2366
2378
  var DEVICE_ID_STORAGE_KEYS = [
2367
2379
  "rdid",
2368
2380
  "ifa",
@@ -2389,7 +2401,7 @@ function resolveVastEnvironmentSignals(isCtv) {
2389
2401
  return _object_spread_props(_object_spread({
2390
2402
  isCtv: true,
2391
2403
  contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
2392
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
2404
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
2393
2405
  appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
2394
2406
  sessionId: getOrCreateCtvSessionId()
2395
2407
  }, deviceId ? {
@@ -2935,6 +2947,29 @@ function normalizeVastTagUrl(raw) {
2935
2947
  if (!raw) return raw;
2936
2948
  try {
2937
2949
  var url = new URL(raw);
2950
+ var anValue = url.searchParams.get("an");
2951
+ if (anValue !== null) {
2952
+ var orphanFragments = [];
2953
+ url.searchParams.forEach(function(_value, key) {
2954
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2955
+ orphanFragments.push(key.trim());
2956
+ }
2957
+ });
2958
+ if (orphanFragments.length > 0) {
2959
+ var reconstructed = [
2960
+ anValue.trimEnd()
2961
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
2962
+ url.searchParams.forEach(function(_value, key) {
2963
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2964
+ url.searchParams.delete(key);
2965
+ }
2966
+ });
2967
+ url.searchParams.set("an", reconstructed);
2968
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
2969
+ return prefix + val.replace(/\+/g, "%20");
2970
+ });
2971
+ }
2972
+ }
2938
2973
  removeBrokenAppNameOrphans(url.searchParams);
2939
2974
  return url.toString();
2940
2975
  } catch (unused) {
@@ -4342,7 +4377,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4342
4377
  key: "fetchAdConfiguration",
4343
4378
  value: function fetchAdConfiguration() {
4344
4379
  return _async_to_generator(function() {
4345
- 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;
4380
+ 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;
4346
4381
  return _ts_generator(this, function(_state) {
4347
4382
  switch(_state.label){
4348
4383
  case 0:
@@ -4426,9 +4461,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4426
4461
  data = _state.sent();
4427
4462
  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;
4428
4463
  if (imaPayload) {
4429
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4464
+ decodedPayload = imaPayload;
4465
+ try {
4466
+ decodedPayload = decodeURIComponent(imaPayload);
4467
+ } catch (unused) {
4468
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4469
+ }
4470
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4471
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4430
4472
  if (this.debug) {
4431
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4473
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4432
4474
  }
4433
4475
  } else {
4434
4476
  if (this.debug) {
@@ -4762,7 +4804,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4762
4804
  adTest: this.config.adTest,
4763
4805
  consent: this.consentSignals
4764
4806
  });
4765
- urls.push(palNonce.injectNonce(urlWithMacros));
4807
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
4808
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
4809
+ urls.push(finalUrl);
4766
4810
  }
4767
4811
  return urls;
4768
4812
  }