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 { a as StormcloudVideoPlayerConfig } from '../types-DNiBmPKK.cjs';
1
+ import { S as StormcloudVideoPlayerConfig } from '../types-BAP8n5mE.cjs';
2
2
 
3
3
  declare class StormcloudVideoPlayer {
4
4
  private readonly video;
@@ -1,4 +1,4 @@
1
- import { S as Scte35Marker } from '../types-DNiBmPKK.cjs';
1
+ import { a as Scte35Marker } from '../types-BAP8n5mE.cjs';
2
2
 
3
3
  type Scte35CueSource = "manifest" | "id3" | "ts";
4
4
  type Scte35CueReadiness = "early" | "playback";
@@ -827,6 +827,7 @@ function createHlsAdPlayer(contentVideo, options) {
827
827
  handleAdComplete();
828
828
  });
829
829
  adVideoElement.addEventListener("error", function(e) {
830
+ if (!adPlaying) return;
830
831
  console.error("[HlsAdPlayer] Ad video error:", e);
831
832
  if (currentAd) {
832
833
  fireTrackingPixels(currentAd.trackingUrls.error);
@@ -1028,15 +1029,15 @@ function createHlsAdPlayer(contentVideo, options) {
1028
1029
  adVideoElement.muted = originalMutedState;
1029
1030
  console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
1030
1031
  }
1032
+ mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1033
+ if (!mediaFile) {
1034
+ throw new Error("No media file available for ad");
1035
+ }
1031
1036
  if (adContainerEl) {
1032
1037
  adContainerEl.style.display = "flex";
1033
1038
  adContainerEl.style.pointerEvents = "auto";
1034
1039
  }
1035
1040
  emit("content_pause");
1036
- mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1037
- if (!mediaFile) {
1038
- throw new Error("No media file available for ad");
1039
- }
1040
1041
  isHlsAd = isHlsMediaFile(mediaFile);
1041
1042
  console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
1042
1043
  if (isHlsAd && import_hls.default.isSupported()) {
@@ -2324,9 +2325,20 @@ function initializePolyfills() {
2324
2325
  }
2325
2326
  // src/utils/vastEnvironmentSignals.ts
2326
2327
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2328
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
2329
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
2330
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
2327
2331
  var AIRY_APP_NAME = "AiryTV Movies & TV";
2328
2332
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
2329
2333
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2334
+ function getDefaultAppId() {
2335
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
2336
+ var ua = navigator.userAgent;
2337
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
2338
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
2339
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
2340
+ return AIRY_ANDROID_APP_ID;
2341
+ }
2330
2342
  var DEVICE_ID_STORAGE_KEYS = [
2331
2343
  "rdid",
2332
2344
  "ifa",
@@ -2353,7 +2365,7 @@ function resolveVastEnvironmentSignals(isCtv) {
2353
2365
  return _object_spread_props(_object_spread({
2354
2366
  isCtv: true,
2355
2367
  contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
2356
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
2368
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
2357
2369
  appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
2358
2370
  sessionId: getOrCreateCtvSessionId()
2359
2371
  }, deviceId ? {
@@ -2899,6 +2911,29 @@ function normalizeVastTagUrl(raw) {
2899
2911
  if (!raw) return raw;
2900
2912
  try {
2901
2913
  var url = new URL(raw);
2914
+ var anValue = url.searchParams.get("an");
2915
+ if (anValue !== null) {
2916
+ var orphanFragments = [];
2917
+ url.searchParams.forEach(function(_value, key) {
2918
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2919
+ orphanFragments.push(key.trim());
2920
+ }
2921
+ });
2922
+ if (orphanFragments.length > 0) {
2923
+ var reconstructed = [
2924
+ anValue.trimEnd()
2925
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
2926
+ url.searchParams.forEach(function(_value, key) {
2927
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2928
+ url.searchParams.delete(key);
2929
+ }
2930
+ });
2931
+ url.searchParams.set("an", reconstructed);
2932
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
2933
+ return prefix + val.replace(/\+/g, "%20");
2934
+ });
2935
+ }
2936
+ }
2902
2937
  removeBrokenAppNameOrphans(url.searchParams);
2903
2938
  return url.toString();
2904
2939
  } catch (unused) {
@@ -4306,7 +4341,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4306
4341
  key: "fetchAdConfiguration",
4307
4342
  value: function fetchAdConfiguration() {
4308
4343
  return _async_to_generator(function() {
4309
- 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;
4344
+ 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;
4310
4345
  return _ts_generator(this, function(_state) {
4311
4346
  switch(_state.label){
4312
4347
  case 0:
@@ -4390,9 +4425,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4390
4425
  data = _state.sent();
4391
4426
  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;
4392
4427
  if (imaPayload) {
4393
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4428
+ decodedPayload = imaPayload;
4429
+ try {
4430
+ decodedPayload = decodeURIComponent(imaPayload);
4431
+ } catch (unused) {
4432
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4433
+ }
4434
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4435
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4394
4436
  if (this.debug) {
4395
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4437
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4396
4438
  }
4397
4439
  } else {
4398
4440
  if (this.debug) {
@@ -4726,7 +4768,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4726
4768
  adTest: this.config.adTest,
4727
4769
  consent: this.consentSignals
4728
4770
  });
4729
- urls.push(palNonce.injectNonce(urlWithMacros));
4771
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
4772
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
4773
+ urls.push(finalUrl);
4730
4774
  }
4731
4775
  return urls;
4732
4776
  }