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.
@@ -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 ? {
@@ -2686,7 +2698,6 @@ var CTV_UNSUPPORTED_PARAMS = [
2686
2698
  "max_ad_duration",
2687
2699
  "unviewed_position_start",
2688
2700
  "impl",
2689
- "scor",
2690
2701
  "vad_type",
2691
2702
  "gdpr",
2692
2703
  "gdpr_consent",
@@ -2935,6 +2946,29 @@ function normalizeVastTagUrl(raw) {
2935
2946
  if (!raw) return raw;
2936
2947
  try {
2937
2948
  var url = new URL(raw);
2949
+ var anValue = url.searchParams.get("an");
2950
+ if (anValue !== null) {
2951
+ var orphanFragments = [];
2952
+ url.searchParams.forEach(function(_value, key) {
2953
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2954
+ orphanFragments.push(key.trim());
2955
+ }
2956
+ });
2957
+ if (orphanFragments.length > 0) {
2958
+ var reconstructed = [
2959
+ anValue.trimEnd()
2960
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
2961
+ url.searchParams.forEach(function(_value, key) {
2962
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2963
+ url.searchParams.delete(key);
2964
+ }
2965
+ });
2966
+ url.searchParams.set("an", reconstructed);
2967
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
2968
+ return prefix + val.replace(/\+/g, "%20");
2969
+ });
2970
+ }
2971
+ }
2938
2972
  removeBrokenAppNameOrphans(url.searchParams);
2939
2973
  return url.toString();
2940
2974
  } catch (unused) {
@@ -2952,6 +2986,7 @@ function applyVastMacros(baseUrl, ctx) {
2952
2986
  var params = url.searchParams;
2953
2987
  removeBrokenAppNameOrphans(params, ctx.appName);
2954
2988
  params.set("correlator", ctx.correlator);
2989
+ params.set("scor", ctx.streamCorrelator);
2955
2990
  if (ctx.isCtv) {
2956
2991
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2957
2992
  try {
@@ -2973,8 +3008,6 @@ function applyVastMacros(baseUrl, ctx) {
2973
3008
  }
2974
3009
  }
2975
3010
  }
2976
- } else {
2977
- params.set("scor", ctx.streamCorrelator);
2978
3011
  }
2979
3012
  if (ctx.pod != null) {
2980
3013
  params.set("pod", String(ctx.pod));
@@ -4342,7 +4375,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4342
4375
  key: "fetchAdConfiguration",
4343
4376
  value: function fetchAdConfiguration() {
4344
4377
  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;
4378
+ 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
4379
  return _ts_generator(this, function(_state) {
4347
4380
  switch(_state.label){
4348
4381
  case 0:
@@ -4426,9 +4459,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4426
4459
  data = _state.sent();
4427
4460
  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
4461
  if (imaPayload) {
4429
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4462
+ decodedPayload = imaPayload;
4463
+ try {
4464
+ decodedPayload = decodeURIComponent(imaPayload);
4465
+ } catch (unused) {
4466
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4467
+ }
4468
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4469
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4430
4470
  if (this.debug) {
4431
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4471
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4432
4472
  }
4433
4473
  } else {
4434
4474
  if (this.debug) {
@@ -4762,7 +4802,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4762
4802
  adTest: this.config.adTest,
4763
4803
  consent: this.consentSignals
4764
4804
  });
4765
- urls.push(palNonce.injectNonce(urlWithMacros));
4805
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
4806
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
4807
+ urls.push(finalUrl);
4766
4808
  }
4767
4809
  return urls;
4768
4810
  }