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.js CHANGED
@@ -797,6 +797,7 @@ function createHlsAdPlayer(contentVideo, options) {
797
797
  handleAdComplete();
798
798
  });
799
799
  adVideoElement.addEventListener("error", function(e) {
800
+ if (!adPlaying) return;
800
801
  console.error("[HlsAdPlayer] Ad video error:", e);
801
802
  if (currentAd) {
802
803
  fireTrackingPixels(currentAd.trackingUrls.error);
@@ -998,15 +999,15 @@ function createHlsAdPlayer(contentVideo, options) {
998
999
  adVideoElement.muted = originalMutedState;
999
1000
  console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
1000
1001
  }
1002
+ mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1003
+ if (!mediaFile) {
1004
+ throw new Error("No media file available for ad");
1005
+ }
1001
1006
  if (adContainerEl) {
1002
1007
  adContainerEl.style.display = "flex";
1003
1008
  adContainerEl.style.pointerEvents = "auto";
1004
1009
  }
1005
1010
  emit("content_pause");
1006
- mediaFile = selectBestMediaFile(currentAd.mediaFiles);
1007
- if (!mediaFile) {
1008
- throw new Error("No media file available for ad");
1009
- }
1010
1011
  isHlsAd = isHlsMediaFile(mediaFile);
1011
1012
  console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
1012
1013
  if (isHlsAd && Hls.isSupported()) {
@@ -2320,9 +2321,20 @@ function initializePolyfills() {
2320
2321
  }
2321
2322
  // src/utils/vastEnvironmentSignals.ts
2322
2323
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2324
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
2325
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
2326
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
2323
2327
  var AIRY_APP_NAME = "AiryTV Movies & TV";
2324
2328
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
2325
2329
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2330
+ function getDefaultAppId() {
2331
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
2332
+ var ua = navigator.userAgent;
2333
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
2334
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
2335
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
2336
+ return AIRY_ANDROID_APP_ID;
2337
+ }
2326
2338
  var DEVICE_ID_STORAGE_KEYS = [
2327
2339
  "rdid",
2328
2340
  "ifa",
@@ -2349,7 +2361,7 @@ function resolveVastEnvironmentSignals(isCtv) {
2349
2361
  return _object_spread_props(_object_spread({
2350
2362
  isCtv: true,
2351
2363
  contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
2352
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
2364
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
2353
2365
  appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
2354
2366
  sessionId: getOrCreateCtvSessionId()
2355
2367
  }, deviceId ? {
@@ -2646,7 +2658,6 @@ var CTV_UNSUPPORTED_PARAMS = [
2646
2658
  "max_ad_duration",
2647
2659
  "unviewed_position_start",
2648
2660
  "impl",
2649
- "scor",
2650
2661
  "vad_type",
2651
2662
  "gdpr",
2652
2663
  "gdpr_consent",
@@ -2895,6 +2906,29 @@ function normalizeVastTagUrl(raw) {
2895
2906
  if (!raw) return raw;
2896
2907
  try {
2897
2908
  var url = new URL(raw);
2909
+ var anValue = url.searchParams.get("an");
2910
+ if (anValue !== null) {
2911
+ var orphanFragments = [];
2912
+ url.searchParams.forEach(function(_value, key) {
2913
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2914
+ orphanFragments.push(key.trim());
2915
+ }
2916
+ });
2917
+ if (orphanFragments.length > 0) {
2918
+ var reconstructed = [
2919
+ anValue.trimEnd()
2920
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
2921
+ url.searchParams.forEach(function(_value, key) {
2922
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2923
+ url.searchParams.delete(key);
2924
+ }
2925
+ });
2926
+ url.searchParams.set("an", reconstructed);
2927
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
2928
+ return prefix + val.replace(/\+/g, "%20");
2929
+ });
2930
+ }
2931
+ }
2898
2932
  removeBrokenAppNameOrphans(url.searchParams);
2899
2933
  return url.toString();
2900
2934
  } catch (unused) {
@@ -2912,6 +2946,7 @@ function applyVastMacros(baseUrl, ctx) {
2912
2946
  var params = url.searchParams;
2913
2947
  removeBrokenAppNameOrphans(params, ctx.appName);
2914
2948
  params.set("correlator", ctx.correlator);
2949
+ params.set("scor", ctx.streamCorrelator);
2915
2950
  if (ctx.isCtv) {
2916
2951
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2917
2952
  try {
@@ -2933,8 +2968,6 @@ function applyVastMacros(baseUrl, ctx) {
2933
2968
  }
2934
2969
  }
2935
2970
  }
2936
- } else {
2937
- params.set("scor", ctx.streamCorrelator);
2938
2971
  }
2939
2972
  if (ctx.pod != null) {
2940
2973
  params.set("pod", String(ctx.pod));
@@ -4328,7 +4361,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4328
4361
  key: "fetchAdConfiguration",
4329
4362
  value: function fetchAdConfiguration() {
4330
4363
  return _async_to_generator(function() {
4331
- 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;
4364
+ 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;
4332
4365
  return _ts_generator(this, function(_state) {
4333
4366
  switch(_state.label){
4334
4367
  case 0:
@@ -4412,9 +4445,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4412
4445
  data = _state.sent();
4413
4446
  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;
4414
4447
  if (imaPayload) {
4415
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4448
+ decodedPayload = imaPayload;
4449
+ try {
4450
+ decodedPayload = decodeURIComponent(imaPayload);
4451
+ } catch (unused) {
4452
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4453
+ }
4454
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4455
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4416
4456
  if (this.debug) {
4417
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4457
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4418
4458
  }
4419
4459
  } else {
4420
4460
  if (this.debug) {
@@ -4748,7 +4788,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4748
4788
  adTest: this.config.adTest,
4749
4789
  consent: this.consentSignals
4750
4790
  });
4751
- urls.push(palNonce.injectNonce(urlWithMacros));
4791
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
4792
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
4793
+ urls.push(finalUrl);
4752
4794
  }
4753
4795
  return urls;
4754
4796
  }