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 { b as AdBreak, a as StormcloudVideoPlayerConfig, A as AdController } from '../types-DNiBmPKK.cjs';
1
+ import { b as AdBreak, S as StormcloudVideoPlayerConfig, A as AdController } from '../types-BAP8n5mE.cjs';
2
2
  import { PalNonceManager } from '../sdk/pal.cjs';
3
3
  import { VastConsentSignals } from '../utils/vastMacros.cjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { A as AdController, S as Scte35Marker } from '../types-DNiBmPKK.cjs';
1
+ import { A as AdController, a as Scte35Marker } from '../types-BAP8n5mE.cjs';
2
2
  import { AdTimingService } from './AdTimingService.cjs';
3
3
 
4
4
  interface AdPreloadPoolDeps {
@@ -1,4 +1,4 @@
1
- import { a as StormcloudVideoPlayerConfig, S as Scte35Marker, A as AdController } from '../types-DNiBmPKK.cjs';
1
+ import { S as StormcloudVideoPlayerConfig, a as Scte35Marker, A as AdController } from '../types-BAP8n5mE.cjs';
2
2
 
3
3
  interface AdTimingCallbacks {
4
4
  onAdStopTimerFired(): void;
@@ -1,5 +1,5 @@
1
1
  import Hls from 'hls.js';
2
- import { a as StormcloudVideoPlayerConfig, S as Scte35Marker } from '../types-DNiBmPKK.cjs';
2
+ import { S as StormcloudVideoPlayerConfig, a as Scte35Marker } from '../types-BAP8n5mE.cjs';
3
3
  import { Scte35CueContext } from './playerTypes.cjs';
4
4
  import { Scte35CueManager } from './Scte35CueManager.cjs';
5
5
  import { AdTimingService } from './AdTimingService.cjs';
@@ -1,4 +1,4 @@
1
- import { A as AdController } from '../types-DNiBmPKK.cjs';
1
+ import { A as AdController } from '../types-BAP8n5mE.cjs';
2
2
 
3
3
  declare function getAdAudioVolume(adPlayer: AdController): number;
4
4
  declare function toggleMute(video: HTMLVideoElement, adPlayer: AdController, debug: boolean): void;
@@ -1,4 +1,4 @@
1
- import { S as Scte35Marker } from '../types-DNiBmPKK.cjs';
1
+ import { a as Scte35Marker } from '../types-BAP8n5mE.cjs';
2
2
  import { Scte35CueSource, Scte35CueReadiness, Scte35CueContext } from './playerTypes.cjs';
3
3
 
4
4
  interface Scte35CueManagerCallbacks {
@@ -1,4 +1,4 @@
1
- import { S as Scte35Marker, I as Id3TagInfo } from '../types-DNiBmPKK.cjs';
1
+ import { a as Scte35Marker, I as Id3TagInfo } from '../types-BAP8n5mE.cjs';
2
2
 
3
3
  declare function parseCueOutDuration(value: string): number | undefined;
4
4
  declare function parseCueOutCont(value: string): {
@@ -776,6 +776,7 @@ function createHlsAdPlayer(contentVideo, options) {
776
776
  handleAdComplete();
777
777
  });
778
778
  adVideoElement.addEventListener("error", function(e) {
779
+ if (!adPlaying) return;
779
780
  console.error("[HlsAdPlayer] Ad video error:", e);
780
781
  if (currentAd) {
781
782
  fireTrackingPixels(currentAd.trackingUrls.error);
@@ -977,15 +978,15 @@ function createHlsAdPlayer(contentVideo, options) {
977
978
  adVideoElement.muted = originalMutedState;
978
979
  console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
979
980
  }
981
+ mediaFile = selectBestMediaFile(currentAd.mediaFiles);
982
+ if (!mediaFile) {
983
+ throw new Error("No media file available for ad");
984
+ }
980
985
  if (adContainerEl) {
981
986
  adContainerEl.style.display = "flex";
982
987
  adContainerEl.style.pointerEvents = "auto";
983
988
  }
984
989
  emit("content_pause");
985
- mediaFile = selectBestMediaFile(currentAd.mediaFiles);
986
- if (!mediaFile) {
987
- throw new Error("No media file available for ad");
988
- }
989
990
  isHlsAd = isHlsMediaFile(mediaFile);
990
991
  console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
991
992
  if (isHlsAd && import_hls.default.isSupported()) {
@@ -2273,9 +2274,20 @@ function initializePolyfills() {
2273
2274
  }
2274
2275
  // src/utils/vastEnvironmentSignals.ts
2275
2276
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2277
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
2278
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
2279
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
2276
2280
  var AIRY_APP_NAME = "AiryTV Movies & TV";
2277
2281
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
2278
2282
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2283
+ function getDefaultAppId() {
2284
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
2285
+ var ua = navigator.userAgent;
2286
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
2287
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
2288
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
2289
+ return AIRY_ANDROID_APP_ID;
2290
+ }
2279
2291
  var DEVICE_ID_STORAGE_KEYS = [
2280
2292
  "rdid",
2281
2293
  "ifa",
@@ -2302,7 +2314,7 @@ function resolveVastEnvironmentSignals(isCtv) {
2302
2314
  return _object_spread_props(_object_spread({
2303
2315
  isCtv: true,
2304
2316
  contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
2305
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
2317
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
2306
2318
  appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
2307
2319
  sessionId: getOrCreateCtvSessionId()
2308
2320
  }, deviceId ? {
@@ -2848,6 +2860,29 @@ function normalizeVastTagUrl(raw) {
2848
2860
  if (!raw) return raw;
2849
2861
  try {
2850
2862
  var url = new URL(raw);
2863
+ var anValue = url.searchParams.get("an");
2864
+ if (anValue !== null) {
2865
+ var orphanFragments = [];
2866
+ url.searchParams.forEach(function(_value, key) {
2867
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2868
+ orphanFragments.push(key.trim());
2869
+ }
2870
+ });
2871
+ if (orphanFragments.length > 0) {
2872
+ var reconstructed = [
2873
+ anValue.trimEnd()
2874
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
2875
+ url.searchParams.forEach(function(_value, key) {
2876
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2877
+ url.searchParams.delete(key);
2878
+ }
2879
+ });
2880
+ url.searchParams.set("an", reconstructed);
2881
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
2882
+ return prefix + val.replace(/\+/g, "%20");
2883
+ });
2884
+ }
2885
+ }
2851
2886
  removeBrokenAppNameOrphans(url.searchParams);
2852
2887
  return url.toString();
2853
2888
  } catch (unused) {
@@ -4255,7 +4290,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4255
4290
  key: "fetchAdConfiguration",
4256
4291
  value: function fetchAdConfiguration() {
4257
4292
  return _async_to_generator(function() {
4258
- 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;
4293
+ 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;
4259
4294
  return _ts_generator(this, function(_state) {
4260
4295
  switch(_state.label){
4261
4296
  case 0:
@@ -4339,9 +4374,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4339
4374
  data = _state.sent();
4340
4375
  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;
4341
4376
  if (imaPayload) {
4342
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4377
+ decodedPayload = imaPayload;
4378
+ try {
4379
+ decodedPayload = decodeURIComponent(imaPayload);
4380
+ } catch (unused) {
4381
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4382
+ }
4383
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4384
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4343
4385
  if (this.debug) {
4344
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4386
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4345
4387
  }
4346
4388
  } else {
4347
4389
  if (this.debug) {
@@ -4675,7 +4717,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4675
4717
  adTest: this.config.adTest,
4676
4718
  consent: this.consentSignals
4677
4719
  });
4678
- urls.push(palNonce.injectNonce(urlWithMacros));
4720
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
4721
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
4722
+ urls.push(finalUrl);
4679
4723
  }
4680
4724
  return urls;
4681
4725
  }