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.
@@ -776,6 +776,7 @@ function createHlsAdPlayer(contentVideo, options) {
776
776
  handleAdComplete();
777
777
  });
778
778
  adVideoElement.addEventListener("error", function(e) {
779
+ if (!adPlaying) return;
779
780
  console.error("[HlsAdPlayer] Ad video error:", e);
780
781
  if (currentAd) {
781
782
  fireTrackingPixels(currentAd.trackingUrls.error);
@@ -977,15 +978,15 @@ function createHlsAdPlayer(contentVideo, options) {
977
978
  adVideoElement.muted = originalMutedState;
978
979
  console.log("[HlsAdPlayer] Set ad video volume to ".concat(adVideoElement.volume, ", muted: ").concat(adVideoElement.muted, ", originalMutedState: ").concat(originalMutedState, ", contentVolume: ").concat(contentVolume));
979
980
  }
981
+ mediaFile = selectBestMediaFile(currentAd.mediaFiles);
982
+ if (!mediaFile) {
983
+ throw new Error("No media file available for ad");
984
+ }
980
985
  if (adContainerEl) {
981
986
  adContainerEl.style.display = "flex";
982
987
  adContainerEl.style.pointerEvents = "auto";
983
988
  }
984
989
  emit("content_pause");
985
- mediaFile = selectBestMediaFile(currentAd.mediaFiles);
986
- if (!mediaFile) {
987
- throw new Error("No media file available for ad");
988
- }
989
990
  isHlsAd = isHlsMediaFile(mediaFile);
990
991
  console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad from: ").concat(mediaFile.url));
991
992
  if (isHlsAd && import_hls.default.isSupported()) {
@@ -2273,9 +2274,20 @@ function initializePolyfills() {
2273
2274
  }
2274
2275
  // src/utils/vastEnvironmentSignals.ts
2275
2276
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2277
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
2278
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
2279
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
2276
2280
  var AIRY_APP_NAME = "AiryTV Movies & TV";
2277
2281
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
2278
2282
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2283
+ function getDefaultAppId() {
2284
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
2285
+ var ua = navigator.userAgent;
2286
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
2287
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
2288
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
2289
+ return AIRY_ANDROID_APP_ID;
2290
+ }
2279
2291
  var DEVICE_ID_STORAGE_KEYS = [
2280
2292
  "rdid",
2281
2293
  "ifa",
@@ -2302,7 +2314,7 @@ function resolveVastEnvironmentSignals(isCtv) {
2302
2314
  return _object_spread_props(_object_spread({
2303
2315
  isCtv: true,
2304
2316
  contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
2305
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
2317
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
2306
2318
  appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
2307
2319
  sessionId: getOrCreateCtvSessionId()
2308
2320
  }, deviceId ? {
@@ -2599,7 +2611,6 @@ var CTV_UNSUPPORTED_PARAMS = [
2599
2611
  "max_ad_duration",
2600
2612
  "unviewed_position_start",
2601
2613
  "impl",
2602
- "scor",
2603
2614
  "vad_type",
2604
2615
  "gdpr",
2605
2616
  "gdpr_consent",
@@ -2848,6 +2859,29 @@ function normalizeVastTagUrl(raw) {
2848
2859
  if (!raw) return raw;
2849
2860
  try {
2850
2861
  var url = new URL(raw);
2862
+ var anValue = url.searchParams.get("an");
2863
+ if (anValue !== null) {
2864
+ var orphanFragments = [];
2865
+ url.searchParams.forEach(function(_value, key) {
2866
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2867
+ orphanFragments.push(key.trim());
2868
+ }
2869
+ });
2870
+ if (orphanFragments.length > 0) {
2871
+ var reconstructed = [
2872
+ anValue.trimEnd()
2873
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
2874
+ url.searchParams.forEach(function(_value, key) {
2875
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
2876
+ url.searchParams.delete(key);
2877
+ }
2878
+ });
2879
+ url.searchParams.set("an", reconstructed);
2880
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
2881
+ return prefix + val.replace(/\+/g, "%20");
2882
+ });
2883
+ }
2884
+ }
2851
2885
  removeBrokenAppNameOrphans(url.searchParams);
2852
2886
  return url.toString();
2853
2887
  } catch (unused) {
@@ -2865,6 +2899,7 @@ function applyVastMacros(baseUrl, ctx) {
2865
2899
  var params = url.searchParams;
2866
2900
  removeBrokenAppNameOrphans(params, ctx.appName);
2867
2901
  params.set("correlator", ctx.correlator);
2902
+ params.set("scor", ctx.streamCorrelator);
2868
2903
  if (ctx.isCtv) {
2869
2904
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2870
2905
  try {
@@ -2886,8 +2921,6 @@ function applyVastMacros(baseUrl, ctx) {
2886
2921
  }
2887
2922
  }
2888
2923
  }
2889
- } else {
2890
- params.set("scor", ctx.streamCorrelator);
2891
2924
  }
2892
2925
  if (ctx.pod != null) {
2893
2926
  params.set("pod", String(ctx.pod));
@@ -4255,7 +4288,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
4255
4288
  key: "fetchAdConfiguration",
4256
4289
  value: function fetchAdConfiguration() {
4257
4290
  return _async_to_generator(function() {
4258
- 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;
4291
+ 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;
4259
4292
  return _ts_generator(this, function(_state) {
4260
4293
  switch(_state.label){
4261
4294
  case 0:
@@ -4339,9 +4372,16 @@ var AdConfigManager = /*#__PURE__*/ function() {
4339
4372
  data = _state.sent();
4340
4373
  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;
4341
4374
  if (imaPayload) {
4342
- this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
4375
+ decodedPayload = imaPayload;
4376
+ try {
4377
+ decodedPayload = decodeURIComponent(imaPayload);
4378
+ } catch (unused) {
4379
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
4380
+ }
4381
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
4382
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
4343
4383
  if (this.debug) {
4344
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
4384
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
4345
4385
  }
4346
4386
  } else {
4347
4387
  if (this.debug) {
@@ -4675,7 +4715,9 @@ var AdConfigManager = /*#__PURE__*/ function() {
4675
4715
  adTest: this.config.adTest,
4676
4716
  consent: this.consentSignals
4677
4717
  });
4678
- urls.push(palNonce.injectNonce(urlWithMacros));
4718
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
4719
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
4720
+ urls.push(finalUrl);
4679
4721
  }
4680
4722
  return urls;
4681
4723
  }