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.
@@ -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 ? {
@@ -2650,7 +2662,6 @@ var CTV_UNSUPPORTED_PARAMS = [
2650
2662
  "max_ad_duration",
2651
2663
  "unviewed_position_start",
2652
2664
  "impl",
2653
- "scor",
2654
2665
  "vad_type",
2655
2666
  "gdpr",
2656
2667
  "gdpr_consent",
@@ -2899,6 +2910,29 @@ function normalizeVastTagUrl(raw) {
2899
2910
  if (!raw) return raw;
2900
2911
  try {
2901
2912
  var url = new URL(raw);
2913
+ var anValue = url.searchParams.get("an");
2914
+ if (anValue !== null) {
2915
+ var orphanFragments = [];
2916
+ url.searchParams.forEach(function(_value, key) {
2917
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2918
+ orphanFragments.push(key.trim());
2919
+ }
2920
+ });
2921
+ if (orphanFragments.length > 0) {
2922
+ var reconstructed = [
2923
+ anValue.trimEnd()
2924
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
2925
+ url.searchParams.forEach(function(_value, key) {
2926
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2927
+ url.searchParams.delete(key);
2928
+ }
2929
+ });
2930
+ url.searchParams.set("an", reconstructed);
2931
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
2932
+ return prefix + val.replace(/\+/g, "%20");
2933
+ });
2934
+ }
2935
+ }
2902
2936
  removeBrokenAppNameOrphans(url.searchParams);
2903
2937
  return url.toString();
2904
2938
  } catch (unused) {
@@ -2916,6 +2950,7 @@ function applyVastMacros(baseUrl, ctx) {
2916
2950
  var params = url.searchParams;
2917
2951
  removeBrokenAppNameOrphans(params, ctx.appName);
2918
2952
  params.set("correlator", ctx.correlator);
2953
+ params.set("scor", ctx.streamCorrelator);
2919
2954
  if (ctx.isCtv) {
2920
2955
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2921
2956
  try {
@@ -2937,8 +2972,6 @@ function applyVastMacros(baseUrl, ctx) {
2937
2972
  }
2938
2973
  }
2939
2974
  }
2940
- } else {
2941
- params.set("scor", ctx.streamCorrelator);
2942
2975
  }
2943
2976
  if (ctx.pod != null) {
2944
2977
  params.set("pod", String(ctx.pod));
@@ -4306,7 +4339,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4306
4339
  key: "fetchAdConfiguration",
4307
4340
  value: function fetchAdConfiguration() {
4308
4341
  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;
4342
+ 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
4343
  return _ts_generator(this, function(_state) {
4311
4344
  switch(_state.label){
4312
4345
  case 0:
@@ -4390,9 +4423,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4390
4423
  data = _state.sent();
4391
4424
  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
4425
  if (imaPayload) {
4393
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4426
+ decodedPayload = imaPayload;
4427
+ try {
4428
+ decodedPayload = decodeURIComponent(imaPayload);
4429
+ } catch (unused) {
4430
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4431
+ }
4432
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4433
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4394
4434
  if (this.debug) {
4395
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4435
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4396
4436
  }
4397
4437
  } else {
4398
4438
  if (this.debug) {
@@ -4726,7 +4766,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4726
4766
  adTest: this.config.adTest,
4727
4767
  consent: this.consentSignals
4728
4768
  });
4729
- urls.push(palNonce.injectNonce(urlWithMacros));
4769
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
4770
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
4771
+ urls.push(finalUrl);
4730
4772
  }
4731
4773
  return urls;
4732
4774
  }