stormcloud-video-player 0.8.57 → 0.8.59

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.
Files changed (42) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/index.cjs +57 -81
  3. package/lib/index.cjs.map +1 -1
  4. package/lib/index.d.cts +1 -0
  5. package/lib/index.d.ts +1 -0
  6. package/lib/index.js +57 -81
  7. package/lib/index.js.map +1 -1
  8. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  9. package/lib/player/AdBreakOrchestrator.d.cts +1 -1
  10. package/lib/player/AdConfigManager.cjs +47 -76
  11. package/lib/player/AdConfigManager.cjs.map +1 -1
  12. package/lib/player/AdConfigManager.d.cts +2 -1
  13. package/lib/player/AdTimingService.d.cts +1 -1
  14. package/lib/player/HlsEngine.d.cts +1 -1
  15. package/lib/player/PlayerControls.d.cts +1 -1
  16. package/lib/player/Scte35CueManager.d.cts +1 -1
  17. package/lib/player/Scte35Parser.d.cts +1 -1
  18. package/lib/player/StormcloudVideoPlayer.cjs +53 -79
  19. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  20. package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
  21. package/lib/player/playerTypes.d.cts +1 -1
  22. package/lib/players/HlsPlayer.cjs +53 -79
  23. package/lib/players/HlsPlayer.cjs.map +1 -1
  24. package/lib/players/HlsPlayer.d.cts +1 -1
  25. package/lib/players/index.cjs +53 -79
  26. package/lib/players/index.cjs.map +1 -1
  27. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  28. package/lib/{types-cTqIKw_D.d.cts → types-52ASml2N.d.cts} +1 -0
  29. package/lib/ui/StormcloudVideoPlayer.cjs +57 -81
  30. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  31. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  32. package/lib/utils/ctvVastSignals.cjs +30 -36
  33. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  34. package/lib/utils/tracking.cjs.map +1 -1
  35. package/lib/utils/tracking.d.cts +1 -1
  36. package/lib/utils/vastEnvironmentSignals.cjs +16 -36
  37. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  38. package/lib/utils/vastEnvironmentSignals.d.cts +0 -3
  39. package/lib/utils/vastMacros.cjs +13 -34
  40. package/lib/utils/vastMacros.cjs.map +1 -1
  41. package/lib/utils/vastMacros.d.cts +1 -3
  42. package/package.json +1 -1
package/lib/index.cjs CHANGED
@@ -2736,34 +2736,8 @@ function ingestPlayerTracking(licenseKey, channel, body) {
2736
2736
  })();
2737
2737
  }
2738
2738
  // src/utils/vastEnvironmentSignals.ts
2739
- var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2740
- var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
2741
- var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
2742
- var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
2743
- var AIRY_APP_NAME = "AiryTV Movies & TV";
2744
- var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
2745
2739
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2746
2740
  var PLAYER_ID_STORAGE_KEY = "stormcloud.player.id";
2747
- var LG_TEST_APP_ID = "com.hulu.plus";
2748
- var LG_TEST_APP_NAME = "Hulu";
2749
- var LG_TEST_CONTENT_URL = "https://www.hulu.com/live-tv";
2750
- var _lgTestDeviceId;
2751
- function getLgTestDeviceId() {
2752
- if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();
2753
- return _lgTestDeviceId;
2754
- }
2755
- function isLgWebOS() {
2756
- if (typeof navigator === "undefined") return false;
2757
- return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);
2758
- }
2759
- function getDefaultAppId() {
2760
- if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
2761
- var ua = navigator.userAgent;
2762
- if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
2763
- if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
2764
- if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
2765
- return AIRY_ANDROID_APP_ID;
2766
- }
2767
2741
  var DEVICE_ID_STORAGE_KEYS = [
2768
2742
  "rdid",
2769
2743
  "ifa",
@@ -2784,23 +2758,29 @@ function resolveVastEnvironmentSignals(isCtv) {
2784
2758
  var _ref;
2785
2759
  var bridgeSignals = readNativeBridgeSignals();
2786
2760
  var platformDevice = readPlatformNativeDeviceId();
2787
- var lg = isCtv && isLgWebOS();
2788
- var deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId || (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : void 0);
2789
- var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || readStoredString("idtype") || platformDevice.deviceIdType || inferDeviceIdType() || (lg ? "lgudid" : void 0);
2761
+ var realDeviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;
2762
+ var deviceId = realDeviceId;
2763
+ var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || readStoredString("idtype") || platformDevice.deviceIdType || inferDeviceIdType();
2790
2764
  var platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;
2791
2765
  var limitAdTracking = deviceId != null ? (_ref = platformLat !== null && platformLat !== void 0 ? platformLat : readStoredLimitAdTracking()) !== null && _ref !== void 0 ? _ref : false : void 0;
2766
+ if (!deviceId && isCtv) {
2767
+ var dpid = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);
2768
+ if (dpid) {
2769
+ var _ref1;
2770
+ deviceId = dpid;
2771
+ deviceIdType = "dpid";
2772
+ limitAdTracking = (_ref1 = platformLat !== null && platformLat !== void 0 ? platformLat : readStoredLimitAdTracking()) !== null && _ref1 !== void 0 ? _ref1 : false;
2773
+ }
2774
+ }
2792
2775
  if (isCtv) {
2793
2776
  return _object_spread_props(_object_spread({
2794
2777
  isCtv: true,
2795
- contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),
2796
- appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || (lg ? LG_TEST_APP_ID : getDefaultAppId()),
2797
- appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),
2798
2778
  sessionId: getOrCreateCtvSessionId()
2799
2779
  }, deviceId ? {
2800
2780
  deviceId: deviceId
2801
- } : {}, deviceIdType ? {
2781
+ } : {}, deviceId && deviceIdType ? {
2802
2782
  deviceIdType: deviceIdType
2803
- } : {}, limitAdTracking != null ? {
2783
+ } : {}, deviceId && limitAdTracking != null ? {
2804
2784
  limitAdTracking: limitAdTracking
2805
2785
  } : {}), {
2806
2786
  deviceTypeHint: 5
@@ -2810,9 +2790,9 @@ function resolveVastEnvironmentSignals(isCtv) {
2810
2790
  isCtv: false
2811
2791
  }, deviceId ? {
2812
2792
  deviceId: deviceId
2813
- } : {}, deviceIdType ? {
2793
+ } : {}, deviceId && deviceIdType ? {
2814
2794
  deviceIdType: deviceIdType
2815
- } : {}, limitAdTracking != null ? {
2795
+ } : {}, deviceId && limitAdTracking != null ? {
2816
2796
  limitAdTracking: limitAdTracking
2817
2797
  } : {});
2818
2798
  }
@@ -4072,7 +4052,6 @@ var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
4072
4052
  var INVALID_VAST_PARAM_KEY = /^\s|\s$/;
4073
4053
  var EXAMPLE_COM_URL = /example\.com/i;
4074
4054
  var CTV_UNSUPPORTED_PARAMS = [
4075
- "description_url",
4076
4055
  "tfcd",
4077
4056
  "npa",
4078
4057
  "min_ad_duration",
@@ -4163,18 +4142,6 @@ var INLINE_DEVICE_MACRO_REPLACEMENTS = [
4163
4142
  return ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
4164
4143
  }
4165
4144
  },
4166
- {
4167
- pattern: /%%MSID%%/gi,
4168
- getValue: function getValue(ctx) {
4169
- return ctx.appId;
4170
- }
4171
- },
4172
- {
4173
- pattern: /%%APP_NAME%%/gi,
4174
- getValue: function getValue(ctx) {
4175
- return ctx.appName;
4176
- }
4177
- },
4178
4145
  {
4179
4146
  pattern: /%%SESSION_ID%%/gi,
4180
4147
  getValue: function getValue(ctx) {
@@ -4365,7 +4332,7 @@ function applyVastMacros(baseUrl, ctx) {
4365
4332
  return replaceCorrelatorFallback(expandedUrl, ctx.correlator);
4366
4333
  }
4367
4334
  var params = url.searchParams;
4368
- removeBrokenAppNameOrphans(params, ctx.appName);
4335
+ removeBrokenAppNameOrphans(params);
4369
4336
  params.set("correlator", ctx.correlator);
4370
4337
  params.set("scor", ctx.streamCorrelator);
4371
4338
  if (ctx.isCtv) {
@@ -4404,18 +4371,14 @@ function applyVastMacros(baseUrl, ctx) {
4404
4371
  if (ctx.podMaxAds != null) {
4405
4372
  params.set("pmad", String(Math.max(1, Math.round(ctx.podMaxAds))));
4406
4373
  }
4407
- var requestUrl = ctx.contentUrl || ctx.pageUrl;
4408
- if (requestUrl) {
4409
- params.set("url", requestUrl);
4410
- if (!ctx.isCtv) {
4411
- params.set("description_url", requestUrl);
4412
- }
4413
- } else {
4414
- var existingUrl = params.get("url") || "";
4415
- if (EXAMPLE_COM_URL.test(existingUrl)) {
4416
- params.delete("url");
4417
- params.delete("description_url");
4418
- }
4374
+ if (!ctx.isCtv && ctx.pageUrl) {
4375
+ params.set("url", ctx.pageUrl);
4376
+ params.set("description_url", ctx.pageUrl);
4377
+ }
4378
+ var existingUrl = params.get("url") || "";
4379
+ if (EXAMPLE_COM_URL.test(existingUrl)) {
4380
+ params.delete("url");
4381
+ params.delete("description_url");
4419
4382
  }
4420
4383
  if (ctx.adWillPlayMuted != null) {
4421
4384
  params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
@@ -4423,13 +4386,6 @@ function applyVastMacros(baseUrl, ctx) {
4423
4386
  if (ctx.adWillAutoPlay != null) {
4424
4387
  params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
4425
4388
  }
4426
- if (ctx.appId) {
4427
- params.set("msid", ctx.appId);
4428
- }
4429
- if (ctx.appName) {
4430
- removeBrokenAppNameOrphans(params, ctx.appName);
4431
- params.set("an", ctx.appName);
4432
- }
4433
4389
  if (ctx.sessionId) {
4434
4390
  params.set("sid", ctx.sessionId);
4435
4391
  }
@@ -4454,6 +4410,9 @@ function applyVastMacros(baseUrl, ctx) {
4454
4410
  if (ctx.adTest) {
4455
4411
  params.set("adtest", "on");
4456
4412
  }
4413
+ if (ctx.programTitle) {
4414
+ params.set("ct_ti", ctx.programTitle);
4415
+ }
4457
4416
  var staleKeys = [];
4458
4417
  params.forEach(function(value, key) {
4459
4418
  if (isMacroPlaceholder2(value)) {
@@ -4480,7 +4439,7 @@ function applyVastMacros(baseUrl, ctx) {
4480
4439
  }
4481
4440
  }
4482
4441
  }
4483
- removeBrokenAppNameOrphans(params, ctx.appName);
4442
+ removeBrokenAppNameOrphans(params);
4484
4443
  return url.toString();
4485
4444
  }
4486
4445
  function replaceCorrelatorFallback(baseUrl, correlator) {
@@ -6011,13 +5970,25 @@ var AdConfigManager = /*#__PURE__*/ function() {
6011
5970
  };
6012
5971
  }
6013
5972
  },
5973
+ {
5974
+ key: "getPalDescriptionUrl",
5975
+ value: function getPalDescriptionUrl() {
5976
+ if (!this.apiVastTagUrl) return void 0;
5977
+ try {
5978
+ var params = new URL(this.apiVastTagUrl).searchParams;
5979
+ return params.get("description_url") || params.get("url") || void 0;
5980
+ } catch (unused) {
5981
+ return void 0;
5982
+ }
5983
+ }
5984
+ },
6014
5985
  {
6015
5986
  key: "generatePodVastUrl",
6016
5987
  value: function generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {
6017
5988
  var _podParams_maxDurationMs;
6018
5989
  var adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;
6019
5990
  var envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);
6020
- var urlWithMacros = applyVastMacros(baseUrl, {
5991
+ var urlWithMacros = applyVastMacros(baseUrl, _object_spread_props(_object_spread({
6021
5992
  correlator: this.viewCorrelator,
6022
5993
  streamCorrelator: this.streamCorrelator,
6023
5994
  pod: this.podCounter > 0 ? this.podCounter : void 0,
@@ -6025,20 +5996,20 @@ var AdConfigManager = /*#__PURE__*/ function() {
6025
5996
  podMinDurationMs: podParams.minDurationMs,
6026
5997
  podMaxDurationMs: podParams.maxDurationMs,
6027
5998
  isCtv: envSignals.isCtv,
6028
- contentUrl: envSignals.contentUrl,
6029
5999
  pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? toDevSafeUrl(window.location.href) : void 0,
6030
6000
  adWillPlayMuted: adWillPlayMuted,
6031
6001
  adWillAutoPlay: !!this.config.autoplay,
6032
- appId: envSignals.appId,
6033
- appName: envSignals.appName,
6034
6002
  sessionId: envSignals.sessionId,
6035
6003
  deviceId: envSignals.deviceId,
6036
6004
  deviceIdType: envSignals.deviceIdType,
6037
6005
  limitAdTracking: envSignals.limitAdTracking,
6038
6006
  deviceTypeHint: envSignals.deviceTypeHint,
6039
- adTest: this.config.adTest,
6007
+ adTest: this.config.adTest
6008
+ }, this.config.programTitle ? {
6009
+ programTitle: this.config.programTitle
6010
+ } : {}), {
6040
6011
  consent: this.consentSignals
6041
- });
6012
+ }));
6042
6013
  var finalUrl = palNonce.injectNonce(urlWithMacros);
6043
6014
  console.log("[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=".concat(this.podCounter, ", pmad=").concat(podParams.maxAds, ", pmnd=").concat(podParams.minDurationMs, ", pmxd=").concat((_podParams_maxDurationMs = podParams.maxDurationMs) !== null && _podParams_maxDurationMs !== void 0 ? _podParams_maxDurationMs : "?", "):"), finalUrl);
6044
6015
  return finalUrl;
@@ -9144,7 +9115,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
9144
9115
  // ───────────────────────────────────────────────────────────────
9145
9116
  function load() {
9146
9117
  return _async_to_generator(function() {
9147
- var _this, _this_config_lowLatencyMode, error, continueLiveStreamDuringAds;
9118
+ var _this, _this_config_lowLatencyMode, error, palDescriptionUrl, continueLiveStreamDuringAds;
9148
9119
  return _ts_generator(this, function(_state) {
9149
9120
  switch(_state.label){
9150
9121
  case 0:
@@ -9180,14 +9151,17 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
9180
9151
  4
9181
9152
  ];
9182
9153
  case 4:
9183
- this.palNonce.generateNonce({
9154
+ palDescriptionUrl = this.adConfig.getPalDescriptionUrl();
9155
+ this.palNonce.generateNonce(_object_spread({
9184
9156
  videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,
9185
9157
  videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,
9186
9158
  adWillAutoPlay: !!this.config.autoplay,
9187
9159
  adWillPlayMuted: true,
9188
9160
  playerVolume: 0,
9189
9161
  continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
9190
- }).catch(function() {});
9162
+ }, palDescriptionUrl ? {
9163
+ descriptionUrl: palDescriptionUrl
9164
+ } : {})).catch(function() {});
9191
9165
  fetchConsentSignals().then(function(signals) {
9192
9166
  _this.adConfig.consentSignals = signals;
9193
9167
  }).catch(function() {});
@@ -9911,7 +9885,7 @@ var CRITICAL_PROPS = [
9911
9885
  var CONTROLS_HIDE_DELAY = 3e3;
9912
9886
  var DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;
9913
9887
  var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
9914
- var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, isLiveStream = props.isLiveStream, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, vastMode = props.vastMode, vastTagUrl = props.vastTagUrl, isVmap = props.isVmap, vmapUrl = props.vmapUrl, minSegmentsBeforePlay = props.minSegmentsBeforePlay, ctvAdRequest = props.ctvAdRequest, restVideoAttrs = _object_without_properties(props, [
9888
+ var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, isLiveStream = props.isLiveStream, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, vastMode = props.vastMode, vastTagUrl = props.vastTagUrl, isVmap = props.isVmap, vmapUrl = props.vmapUrl, minSegmentsBeforePlay = props.minSegmentsBeforePlay, ctvAdRequest = props.ctvAdRequest, programTitle = props.programTitle, restVideoAttrs = _object_without_properties(props, [
9915
9889
  "src",
9916
9890
  "autoplay",
9917
9891
  "muted",
@@ -9942,7 +9916,8 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
9942
9916
  "isVmap",
9943
9917
  "vmapUrl",
9944
9918
  "minSegmentsBeforePlay",
9945
- "ctvAdRequest"
9919
+ "ctvAdRequest",
9920
+ "programTitle"
9946
9921
  ]);
9947
9922
  var videoRef = (0, import_react.useRef)(null);
9948
9923
  var playerRef = (0, import_react.useRef)(null);
@@ -10133,6 +10108,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
10133
10108
  if (vmapUrl !== void 0) cfg.vmapUrl = vmapUrl;
10134
10109
  if (minSegmentsBeforePlay !== void 0) cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;
10135
10110
  if (ctvAdRequest !== void 0) cfg.ctvAdRequest = ctvAdRequest;
10111
+ if (programTitle !== void 0) cfg.programTitle = programTitle;
10136
10112
  var player = new StormcloudVideoPlayer(cfg);
10137
10113
  playerRef.current = player;
10138
10114
  player.load().then(function() {