stormcloud-video-player 0.8.19 → 0.8.21

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.
package/lib/index.cjs CHANGED
@@ -1011,6 +1011,7 @@ function createHlsAdPlayer(contentVideo, options) {
1011
1011
  handleAdComplete();
1012
1012
  });
1013
1013
  adVideoElement.addEventListener("error", function(e) {
1014
+ if (!adPlaying) return;
1014
1015
  console.error("[HlsAdPlayer] Ad video error:", e);
1015
1016
  if (currentAd) {
1016
1017
  fireTrackingPixels(currentAd.trackingUrls.error);
@@ -1212,15 +1213,15 @@ function createHlsAdPlayer(contentVideo, options) {
1212
1213
  adVideoElement.muted = originalMutedState;
1213
1214
  console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
1214
1215
  }
1216
+ mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1217
+ if (!mediaFile) {
1218
+ throw new Error("No media file available for ad");
1219
+ }
1215
1220
  if (adContainerEl) {
1216
1221
  adContainerEl.style.display = "flex";
1217
1222
  adContainerEl.style.pointerEvents = "auto";
1218
1223
  }
1219
1224
  emit("content_pause");
1220
- mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1221
- if (!mediaFile) {
1222
- throw new Error("No media file available for ad");
1223
- }
1224
1225
  isHlsAd = isHlsMediaFile(mediaFile);
1225
1226
  console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
1226
1227
  if (isHlsAd && import_hls.default.isSupported()) {
@@ -2532,9 +2533,20 @@ function initializePolyfills() {
2532
2533
  }
2533
2534
  // src/utils/vastEnvironmentSignals.ts
2534
2535
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2536
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
2537
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
2538
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
2535
2539
  var AIRY_APP_NAME = "AiryTV Movies & TV";
2536
2540
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
2537
2541
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2542
+ function getDefaultAppId() {
2543
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
2544
+ var ua = navigator.userAgent;
2545
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
2546
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
2547
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
2548
+ return AIRY_ANDROID_APP_ID;
2549
+ }
2538
2550
  var DEVICE_ID_STORAGE_KEYS = [
2539
2551
  "rdid",
2540
2552
  "ifa",
@@ -2561,7 +2573,7 @@ function resolveVastEnvironmentSignals(isCtv) {
2561
2573
  return _object_spread_props(_object_spread({
2562
2574
  isCtv: true,
2563
2575
  contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
2564
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
2576
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
2565
2577
  appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
2566
2578
  sessionId: getOrCreateCtvSessionId()
2567
2579
  }, deviceId ? {
@@ -2858,7 +2870,6 @@ var CTV_UNSUPPORTED_PARAMS = [
2858
2870
  "max_ad_duration",
2859
2871
  "unviewed_position_start",
2860
2872
  "impl",
2861
- "scor",
2862
2873
  "vad_type",
2863
2874
  "gdpr",
2864
2875
  "gdpr_consent",
@@ -3107,6 +3118,29 @@ function normalizeVastTagUrl(raw) {
3107
3118
  if (!raw) return raw;
3108
3119
  try {
3109
3120
  var url = new URL(raw);
3121
+ var anValue = url.searchParams.get("an");
3122
+ if (anValue !== null) {
3123
+ var orphanFragments = [];
3124
+ url.searchParams.forEach(function(_value, key) {
3125
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
3126
+ orphanFragments.push(key.trim());
3127
+ }
3128
+ });
3129
+ if (orphanFragments.length > 0) {
3130
+ var reconstructed = [
3131
+ anValue.trimEnd()
3132
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
3133
+ url.searchParams.forEach(function(_value, key) {
3134
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
3135
+ url.searchParams.delete(key);
3136
+ }
3137
+ });
3138
+ url.searchParams.set("an", reconstructed);
3139
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
3140
+ return prefix + val.replace(/\+/g, "%20");
3141
+ });
3142
+ }
3143
+ }
3110
3144
  removeBrokenAppNameOrphans(url.searchParams);
3111
3145
  return url.toString();
3112
3146
  } catch (unused) {
@@ -3124,6 +3158,7 @@ function applyVastMacros(baseUrl, ctx) {
3124
3158
  var params = url.searchParams;
3125
3159
  removeBrokenAppNameOrphans(params, ctx.appName);
3126
3160
  params.set("correlator", ctx.correlator);
3161
+ params.set("scor", ctx.streamCorrelator);
3127
3162
  if (ctx.isCtv) {
3128
3163
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
3129
3164
  try {
@@ -3145,8 +3180,6 @@ function applyVastMacros(baseUrl, ctx) {
3145
3180
  }
3146
3181
  }
3147
3182
  }
3148
- } else {
3149
- params.set("scor", ctx.streamCorrelator);
3150
3183
  }
3151
3184
  if (ctx.pod != null) {
3152
3185
  params.set("pod", String(ctx.pod));
@@ -4537,7 +4570,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4537
4570
  key: "fetchAdConfiguration",
4538
4571
  value: function fetchAdConfiguration() {
4539
4572
  return _async_to_generator(function() {
4540
- 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;
4573
+ 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;
4541
4574
  return _ts_generator(this, function(_state) {
4542
4575
  switch(_state.label){
4543
4576
  case 0:
@@ -4621,9 +4654,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4621
4654
  data = _state.sent();
4622
4655
  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;
4623
4656
  if (imaPayload) {
4624
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4657
+ decodedPayload = imaPayload;
4658
+ try {
4659
+ decodedPayload = decodeURIComponent(imaPayload);
4660
+ } catch (unused) {
4661
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4662
+ }
4663
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4664
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4625
4665
  if (this.debug) {
4626
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4666
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4627
4667
  }
4628
4668
  } else {
4629
4669
  if (this.debug) {
@@ -4957,7 +4997,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4957
4997
  adTest: this.config.adTest,
4958
4998
  consent: this.consentSignals
4959
4999
  });
4960
- urls.push(palNonce.injectNonce(urlWithMacros));
5000
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
5001
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
5002
+ urls.push(finalUrl);
4961
5003
  }
4962
5004
  return urls;
4963
5005
  }