stormcloud-video-player 0.7.37 → 0.7.38

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.d.cts CHANGED
@@ -260,6 +260,10 @@ declare class StormcloudVideoPlayer {
260
260
  width: number;
261
261
  height: number;
262
262
  } | null;
263
+ getMaxHlsResolution(): {
264
+ width: number;
265
+ height: number;
266
+ } | null;
263
267
  getCurrentHlsSegmentDurationMs(): number | null;
264
268
  get videoElement(): HTMLVideoElement;
265
269
  resize(): void;
@@ -273,6 +277,11 @@ type StormcloudVideoPlayerProps = Omit<StormcloudVideoPlayerConfig, "videoElemen
273
277
  licenseKey?: string;
274
278
  swirlProjectId?: number;
275
279
  swirlShowcaseDemo?: boolean;
280
+ swirlOverlayApiBaseUrl?: string;
281
+ swirlOverlayCoordinateSpace?: {
282
+ width: number;
283
+ height: number;
284
+ } | null;
276
285
  adcisionChannelId?: number;
277
286
  disableOverlays?: boolean;
278
287
  showAdsControl?: boolean;
@@ -4007,6 +4016,7 @@ declare function getBrowserID(clientInfo: ClientInfo): Promise<string>;
4007
4016
  declare function sendInitialTracking(licenseKey?: string): Promise<void>;
4008
4017
  declare function sendHeartbeat(licenseKey?: string): Promise<void>;
4009
4018
 
4019
+ declare const OVERLAY_API_BASE = "https://adstorm.co/api-adstorm-dev";
4010
4020
  interface OverlayCoordinateSpace {
4011
4021
  width: number;
4012
4022
  height: number;
@@ -4071,7 +4081,12 @@ interface SwirlOverlay {
4071
4081
  }
4072
4082
  declare function timeStringToSeconds(timeStr: string): number;
4073
4083
  declare function isOverlayActive(overlay: SwirlOverlay, currentTime: number): boolean;
4074
- declare function createDemoStockTickerOverlay(projectId: number): SwirlOverlay;
4084
+ declare function scrollerLooksLikeMarketsStock(o: SwirlOverlay): boolean;
4085
+ type DemoStockTickerOptions = {
4086
+ stackAboveNews?: boolean;
4087
+ };
4088
+ declare function createDemoStockTickerOverlay(projectId: number, opts?: DemoStockTickerOptions): SwirlOverlay;
4089
+ declare function normalizeSwirlOverlay(raw: SwirlOverlay & Record<string, unknown>): SwirlOverlay;
4075
4090
  declare function fetchProjectOverlays(projectId: number, apiBaseUrl?: string): Promise<SwirlOverlay[]>;
4076
4091
  declare function resolveImageUrl(imageUrl: string, apiBaseUrl?: string): string;
4077
4092
 
@@ -4132,4 +4147,4 @@ interface AdStormAdLayer extends AdController {
4132
4147
  }
4133
4148
  declare function createAdStormPlayer(contentVideo: HTMLVideoElement, options: AdStormPlayerOptions): AdStormAdLayer;
4134
4149
 
4135
- export { type AdBreak, type AdSchedule, type AdStormAdLayer, type AdStormLayerOptionsUpdate, type AdStormPlayerOptions, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type LateJoinPolicy, type OnProgressProps, type OverlayCoordinateSpace, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type SwirlOverlay, type SwirlOverlayType, type SwirlScrollerConfig, type TrackingData, type VastBidResponse, canPlay, createAdStormPlayer, createDemoStockTickerOverlay, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, fetchProjectOverlays, getBrowserConfigOverrides, getBrowserID, getClientInfo, initializePolyfills, isMediaStream, isOverlayActive, lazy, logBrowserInfo, merge, omit, parseQuery, players, randomString, resolveImageUrl, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, timeStringToSeconds };
4150
+ export { type AdBreak, type AdSchedule, type AdStormAdLayer, type AdStormLayerOptionsUpdate, type AdStormPlayerOptions, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, type DemoStockTickerOptions, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type LateJoinPolicy, OVERLAY_API_BASE, type OnProgressProps, type OverlayCoordinateSpace, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type SwirlOverlay, type SwirlOverlayType, type SwirlScrollerConfig, type TrackingData, type VastBidResponse, canPlay, createAdStormPlayer, createDemoStockTickerOverlay, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, fetchProjectOverlays, getBrowserConfigOverrides, getBrowserID, getClientInfo, initializePolyfills, isMediaStream, isOverlayActive, lazy, logBrowserInfo, merge, normalizeSwirlOverlay, omit, parseQuery, players, randomString, resolveImageUrl, scrollerLooksLikeMarketsStock, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, timeStringToSeconds };
package/lib/index.d.ts CHANGED
@@ -260,6 +260,10 @@ declare class StormcloudVideoPlayer {
260
260
  width: number;
261
261
  height: number;
262
262
  } | null;
263
+ getMaxHlsResolution(): {
264
+ width: number;
265
+ height: number;
266
+ } | null;
263
267
  getCurrentHlsSegmentDurationMs(): number | null;
264
268
  get videoElement(): HTMLVideoElement;
265
269
  resize(): void;
@@ -273,6 +277,11 @@ type StormcloudVideoPlayerProps = Omit<StormcloudVideoPlayerConfig, "videoElemen
273
277
  licenseKey?: string;
274
278
  swirlProjectId?: number;
275
279
  swirlShowcaseDemo?: boolean;
280
+ swirlOverlayApiBaseUrl?: string;
281
+ swirlOverlayCoordinateSpace?: {
282
+ width: number;
283
+ height: number;
284
+ } | null;
276
285
  adcisionChannelId?: number;
277
286
  disableOverlays?: boolean;
278
287
  showAdsControl?: boolean;
@@ -4007,6 +4016,7 @@ declare function getBrowserID(clientInfo: ClientInfo): Promise<string>;
4007
4016
  declare function sendInitialTracking(licenseKey?: string): Promise<void>;
4008
4017
  declare function sendHeartbeat(licenseKey?: string): Promise<void>;
4009
4018
 
4019
+ declare const OVERLAY_API_BASE = "https://adstorm.co/api-adstorm-dev";
4010
4020
  interface OverlayCoordinateSpace {
4011
4021
  width: number;
4012
4022
  height: number;
@@ -4071,7 +4081,12 @@ interface SwirlOverlay {
4071
4081
  }
4072
4082
  declare function timeStringToSeconds(timeStr: string): number;
4073
4083
  declare function isOverlayActive(overlay: SwirlOverlay, currentTime: number): boolean;
4074
- declare function createDemoStockTickerOverlay(projectId: number): SwirlOverlay;
4084
+ declare function scrollerLooksLikeMarketsStock(o: SwirlOverlay): boolean;
4085
+ type DemoStockTickerOptions = {
4086
+ stackAboveNews?: boolean;
4087
+ };
4088
+ declare function createDemoStockTickerOverlay(projectId: number, opts?: DemoStockTickerOptions): SwirlOverlay;
4089
+ declare function normalizeSwirlOverlay(raw: SwirlOverlay & Record<string, unknown>): SwirlOverlay;
4075
4090
  declare function fetchProjectOverlays(projectId: number, apiBaseUrl?: string): Promise<SwirlOverlay[]>;
4076
4091
  declare function resolveImageUrl(imageUrl: string, apiBaseUrl?: string): string;
4077
4092
 
@@ -4132,4 +4147,4 @@ interface AdStormAdLayer extends AdController {
4132
4147
  }
4133
4148
  declare function createAdStormPlayer(contentVideo: HTMLVideoElement, options: AdStormPlayerOptions): AdStormAdLayer;
4134
4149
 
4135
- export { type AdBreak, type AdSchedule, type AdStormAdLayer, type AdStormLayerOptionsUpdate, type AdStormPlayerOptions, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type LateJoinPolicy, type OnProgressProps, type OverlayCoordinateSpace, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type SwirlOverlay, type SwirlOverlayType, type SwirlScrollerConfig, type TrackingData, type VastBidResponse, canPlay, createAdStormPlayer, createDemoStockTickerOverlay, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, fetchProjectOverlays, getBrowserConfigOverrides, getBrowserID, getClientInfo, initializePolyfills, isMediaStream, isOverlayActive, lazy, logBrowserInfo, merge, omit, parseQuery, players, randomString, resolveImageUrl, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, timeStringToSeconds };
4150
+ export { type AdBreak, type AdSchedule, type AdStormAdLayer, type AdStormLayerOptionsUpdate, type AdStormPlayerOptions, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, type DemoStockTickerOptions, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type LateJoinPolicy, OVERLAY_API_BASE, type OnProgressProps, type OverlayCoordinateSpace, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type SwirlOverlay, type SwirlOverlayType, type SwirlScrollerConfig, type TrackingData, type VastBidResponse, canPlay, createAdStormPlayer, createDemoStockTickerOverlay, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, fetchProjectOverlays, getBrowserConfigOverrides, getBrowserID, getClientInfo, initializePolyfills, isMediaStream, isOverlayActive, lazy, logBrowserInfo, merge, normalizeSwirlOverlay, omit, parseQuery, players, randomString, resolveImageUrl, scrollerLooksLikeMarketsStock, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, timeStringToSeconds };
package/lib/index.js CHANGED
@@ -5514,6 +5514,46 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5514
5514
  return min;
5515
5515
  }
5516
5516
  },
5517
+ {
5518
+ key: "getMaxHlsResolution",
5519
+ value: function getMaxHlsResolution() {
5520
+ var _this_hls;
5521
+ var levels = (_this_hls = this.hls) === null || _this_hls === void 0 ? void 0 : _this_hls.levels;
5522
+ if (!levels || levels.length === 0) return null;
5523
+ var max = null;
5524
+ var maxPixels = 0;
5525
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
5526
+ try {
5527
+ for(var _iterator = levels[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5528
+ var level = _step.value;
5529
+ if (level.width && level.height) {
5530
+ var pixels = level.width * level.height;
5531
+ if (pixels > maxPixels) {
5532
+ maxPixels = pixels;
5533
+ max = {
5534
+ width: level.width,
5535
+ height: level.height
5536
+ };
5537
+ }
5538
+ }
5539
+ }
5540
+ } catch (err) {
5541
+ _didIteratorError = true;
5542
+ _iteratorError = err;
5543
+ } finally{
5544
+ try {
5545
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
5546
+ _iterator.return();
5547
+ }
5548
+ } finally{
5549
+ if (_didIteratorError) {
5550
+ throw _iteratorError;
5551
+ }
5552
+ }
5553
+ }
5554
+ return max;
5555
+ }
5556
+ },
5517
5557
  {
5518
5558
  key: "getCurrentHlsSegmentDurationMs",
5519
5559
  value: function getCurrentHlsSegmentDurationMs() {
@@ -5624,7 +5664,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5624
5664
  // src/ui/StormcloudVideoPlayer.tsx
5625
5665
  import { FaPlay, FaPause, FaVolumeUp, FaVolumeMute, FaVolumeDown, FaExpand, FaCompress, FaCog, FaTimes, FaCopy, FaLayerGroup } from "react-icons/fa";
5626
5666
  // src/ui/OverlayRenderer.tsx
5627
- import React, { useEffect, useRef, useState, useCallback, useMemo, useId } from "react";
5667
+ import React, { useEffect, useLayoutEffect, useRef, useState, useCallback, useMemo, useId } from "react";
5628
5668
  // src/utils/overlays.ts
5629
5669
  var OVERLAY_API_BASE = "https://adstorm.co/api-adstorm-dev";
5630
5670
  function timeStringToSeconds(timeStr) {
@@ -5661,7 +5701,15 @@ function isOverlayActive(overlay, currentTime) {
5661
5701
  if (durationSec <= 0) return false;
5662
5702
  return currentTime >= startSec && currentTime < startSec + durationSec;
5663
5703
  }
5664
- function createDemoStockTickerOverlay(projectId) {
5704
+ function scrollerLooksLikeMarketsStock(o) {
5705
+ var _ref, _ref1, _ref2, _ref3;
5706
+ if (o.type !== "scroller") return false;
5707
+ var cfg = o.scroller_config;
5708
+ var blob = "".concat(o.name, " ").concat((_ref = cfg === null || cfg === void 0 ? void 0 : cfg.label) !== null && _ref !== void 0 ? _ref : "", " ").concat((_ref1 = cfg === null || cfg === void 0 ? void 0 : cfg.label_line2) !== null && _ref1 !== void 0 ? _ref1 : "", " ").concat((_ref2 = cfg === null || cfg === void 0 ? void 0 : cfg.custom_text) !== null && _ref2 !== void 0 ? _ref2 : "", " ").concat((_ref3 = cfg === null || cfg === void 0 ? void 0 : cfg.preset) !== null && _ref3 !== void 0 ? _ref3 : "");
5709
+ return /\b(MARKETS?|NYSE|NASDAQ|DJIA|\bS&P\b|STOCK|AAPL|TSLA|NVDA|EQUITIES)\b/i.test(blob);
5710
+ }
5711
+ function createDemoStockTickerOverlay(projectId, opts) {
5712
+ var stack = (opts === null || opts === void 0 ? void 0 : opts.stackAboveNews) === true;
5665
5713
  return {
5666
5714
  id: -9001,
5667
5715
  project_id: projectId,
@@ -5669,13 +5717,13 @@ function createDemoStockTickerOverlay(projectId) {
5669
5717
  type: "scroller",
5670
5718
  visible: true,
5671
5719
  x: 144,
5672
- y: 950,
5720
+ y: stack ? 818 : 950,
5673
5721
  width: 1632,
5674
- height: 97,
5722
+ height: stack ? 78 : 97,
5675
5723
  opacity: 100,
5676
5724
  start_time: "00:00:00.000",
5677
5725
  duration: "24:00:00.000",
5678
- z_index: 120,
5726
+ z_index: stack ? 125 : 120,
5679
5727
  scroller_config: {
5680
5728
  use_custom_text: true,
5681
5729
  custom_text: "AAPL +1.24% \u2022 MSFT +0.42% \u2022 GOOGL \u22120.11% \u2022 TSLA +2.31% \u2022 NVDA +1.87% \u2022 AMZN +0.65% \u2022 META +0.38% \u2022 DJIA +0.52% \u2022 S&P 500 +0.33% \u2022 NDAQ +0.41%",
@@ -5697,17 +5745,43 @@ function createDemoStockTickerOverlay(projectId) {
5697
5745
  }
5698
5746
  };
5699
5747
  }
5748
+ function normalizeScrollerConfig(raw) {
5749
+ if (!raw || (typeof raw === "undefined" ? "undefined" : _type_of(raw)) !== "object") return void 0;
5750
+ var r = raw;
5751
+ var merged = _object_spread({}, raw);
5752
+ if (merged.use_custom_text === void 0 && typeof r.useCustomText === "boolean") {
5753
+ merged.use_custom_text = r.useCustomText;
5754
+ }
5755
+ if ((merged.custom_text === void 0 || merged.custom_text === "") && typeof r.customText === "string") {
5756
+ merged.custom_text = r.customText;
5757
+ }
5758
+ if (!merged.rss_url && typeof r.rssUrl === "string") {
5759
+ merged.rss_url = r.rssUrl;
5760
+ }
5761
+ return merged;
5762
+ }
5763
+ function normalizeSwirlOverlay(raw) {
5764
+ var o = _object_spread({}, raw);
5765
+ if (o.type === "scroller") {
5766
+ var _raw_scroller_config;
5767
+ var sc = (_raw_scroller_config = raw.scroller_config) !== null && _raw_scroller_config !== void 0 ? _raw_scroller_config : raw.scrollerConfig;
5768
+ var normalized = normalizeScrollerConfig(sc);
5769
+ if (normalized) o.scroller_config = normalized;
5770
+ }
5771
+ return o;
5772
+ }
5700
5773
  function fetchProjectOverlays(_0) {
5701
5774
  return _async_to_generator(function(projectId) {
5702
- var apiBaseUrl, response, data;
5775
+ var apiBaseUrl, base, response, data;
5703
5776
  var _arguments = arguments;
5704
5777
  return _ts_generator(this, function(_state) {
5705
5778
  switch(_state.label){
5706
5779
  case 0:
5707
5780
  apiBaseUrl = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : OVERLAY_API_BASE;
5781
+ base = apiBaseUrl.replace(/\/$/, "");
5708
5782
  return [
5709
5783
  4,
5710
- fetch("".concat(apiBaseUrl, "/adstorm/swirl/projects/").concat(projectId, "/overlays"))
5784
+ fetch("".concat(base, "/adstorm/swirl/projects/").concat(projectId, "/overlays"))
5711
5785
  ];
5712
5786
  case 1:
5713
5787
  response = _state.sent();
@@ -5720,9 +5794,15 @@ function fetchProjectOverlays(_0) {
5720
5794
  ];
5721
5795
  case 2:
5722
5796
  data = _state.sent();
5797
+ if (!Array.isArray(data)) return [
5798
+ 2,
5799
+ []
5800
+ ];
5723
5801
  return [
5724
5802
  2,
5725
- Array.isArray(data) ? data : []
5803
+ data.map(function(row) {
5804
+ return normalizeSwirlOverlay(row);
5805
+ })
5726
5806
  ];
5727
5807
  }
5728
5808
  });
@@ -7198,7 +7278,6 @@ var OverlayRenderer = function OverlayRenderer(param) {
7198
7278
  if (showcaseMode) {
7199
7279
  return overlays.filter(function(o) {
7200
7280
  if (!o.visible) return false;
7201
- if (o.type === "scroller") return true;
7202
7281
  return showcasePhase < SHOWCASE_POP_OUT_END_MS;
7203
7282
  });
7204
7283
  }
@@ -7218,7 +7297,7 @@ var OverlayRenderer = function OverlayRenderer(param) {
7218
7297
  }, [
7219
7298
  activeOverlays
7220
7299
  ]);
7221
- useEffect(function() {
7300
+ useLayoutEffect(function() {
7222
7301
  var activeIds = new Set(activeOverlays.map(function(o) {
7223
7302
  return o.id;
7224
7303
  }));
@@ -7406,10 +7485,9 @@ var OverlayRenderer = function OverlayRenderer(param) {
7406
7485
  var width = overlay.width * scaleX;
7407
7486
  var height = overlay.height * scaleY;
7408
7487
  var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7409
- var isScrollerTicker = overlay.type === "scroller";
7410
7488
  var inShowcaseBeat = showcaseMode && activeBeatIds.has(overlay.id);
7411
- var useShowcasePop = inShowcaseBeat && !isScrollerTicker;
7412
- var opacity = useShowcasePop ? baseOpacity * showcaseOpacity(showcasePhase) : inShowcaseBeat && isScrollerTicker ? baseOpacity : visible ? baseOpacity : 0;
7489
+ var useShowcasePop = inShowcaseBeat;
7490
+ var opacity = useShowcasePop ? baseOpacity * showcaseOpacity(showcasePhase) : visible ? baseOpacity : 0;
7413
7491
  var popScale = useShowcasePop ? showcaseScale(showcasePhase) : 1;
7414
7492
  var sz = {
7415
7493
  w: width,
@@ -7551,7 +7629,7 @@ var PANEL_BASE_RIGHT_OFFSET = 10;
7551
7629
  var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7552
7630
  var _ref;
7553
7631
  var _aiLiveContext_context;
7554
- var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, 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, minSegmentsBeforePlay = props.minSegmentsBeforePlay, disableAds = props.disableAds, disableFiller = props.disableFiller, swirlProjectId = props.swirlProjectId, swirlShowcaseDemo = props.swirlShowcaseDemo, adcisionChannelId = props.adcisionChannelId, disableOverlays = props.disableOverlays, showAdsControl = props.showAdsControl, showOverlaysControl = props.showOverlaysControl, showAiContextControl = props.showAiContextControl, showDebugControl = props.showDebugControl, restVideoAttrs = _object_without_properties(props, [
7632
+ var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, 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, minSegmentsBeforePlay = props.minSegmentsBeforePlay, disableAds = props.disableAds, disableFiller = props.disableFiller, swirlProjectId = props.swirlProjectId, swirlShowcaseDemo = props.swirlShowcaseDemo, swirlOverlayApiBaseUrl = props.swirlOverlayApiBaseUrl, swirlOverlayCoordinateSpace = props.swirlOverlayCoordinateSpace, adcisionChannelId = props.adcisionChannelId, disableOverlays = props.disableOverlays, showAdsControl = props.showAdsControl, showOverlaysControl = props.showOverlaysControl, showAiContextControl = props.showAiContextControl, showDebugControl = props.showDebugControl, restVideoAttrs = _object_without_properties(props, [
7555
7633
  "src",
7556
7634
  "autoplay",
7557
7635
  "muted",
@@ -7581,6 +7659,8 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7581
7659
  "disableFiller",
7582
7660
  "swirlProjectId",
7583
7661
  "swirlShowcaseDemo",
7662
+ "swirlOverlayApiBaseUrl",
7663
+ "swirlOverlayCoordinateSpace",
7584
7664
  "adcisionChannelId",
7585
7665
  "disableOverlays",
7586
7666
  "showAdsControl",
@@ -7617,13 +7697,21 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7617
7697
  var _React2_useState14 = _sliced_to_array(React2.useState(false), 2), showLicenseWarning = _React2_useState14[0], setShowLicenseWarning = _React2_useState14[1];
7618
7698
  var _React2_useState15 = _sliced_to_array(React2.useState(true), 2), controlsVisible = _React2_useState15[0], setControlsVisible = _React2_useState15[1];
7619
7699
  var _React2_useState16 = _sliced_to_array(React2.useState([]), 2), overlays = _React2_useState16[0], setOverlays = _React2_useState16[1];
7700
+ var overlayApiBase = React2.useMemo(function() {
7701
+ return (swirlOverlayApiBaseUrl === null || swirlOverlayApiBaseUrl === void 0 ? void 0 : swirlOverlayApiBaseUrl.replace(/\/$/, "")) || OVERLAY_API_BASE;
7702
+ }, [
7703
+ swirlOverlayApiBaseUrl
7704
+ ]);
7620
7705
  var displayOverlays = React2.useMemo(function() {
7621
7706
  if (!swirlProjectId || !swirlShowcaseDemo) return overlays;
7622
- if (overlays.some(function(o) {
7707
+ if (overlays.some(scrollerLooksLikeMarketsStock)) return overlays;
7708
+ var hasOtherScroller = overlays.some(function(o) {
7623
7709
  return o.type === "scroller";
7624
- })) return overlays;
7710
+ });
7625
7711
  return _to_consumable_array(overlays).concat([
7626
- createDemoStockTickerOverlay(swirlProjectId)
7712
+ createDemoStockTickerOverlay(swirlProjectId, {
7713
+ stackAboveNews: hasOtherScroller
7714
+ })
7627
7715
  ]);
7628
7716
  }, [
7629
7717
  overlays,
@@ -7903,7 +7991,7 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7903
7991
  }
7904
7992
  var cancelled = false;
7905
7993
  var loadOverlays = function loadOverlays() {
7906
- fetchProjectOverlays(swirlProjectId).then(function(data) {
7994
+ fetchProjectOverlays(swirlProjectId, overlayApiBase).then(function(data) {
7907
7995
  if (!cancelled) setOverlays(data);
7908
7996
  }).catch(function(err) {
7909
7997
  if (!cancelled) {
@@ -7919,41 +8007,69 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7919
8007
  };
7920
8008
  }, [
7921
8009
  swirlProjectId,
7922
- adcisionChannelId
8010
+ adcisionChannelId,
8011
+ overlayApiBase
7923
8012
  ]);
7924
8013
  useEffect2(function() {
8014
+ var _playerRef_current;
7925
8015
  if (!swirlProjectId) return;
7926
- var player = playerRef.current;
7927
- if (!player) return;
7928
- var attempts = 0;
7929
- var maxAttempts = 30;
7930
8016
  var tryResolve = function tryResolve() {
7931
- var res = player.getMinHlsResolution();
7932
- if (res) {
7933
- setOverlayCoordSpace(res);
8017
+ var _player_getMaxHlsResolution, _player_getMinHlsResolution;
8018
+ var player = playerRef.current;
8019
+ var fixed = swirlOverlayCoordinateSpace;
8020
+ if (fixed && fixed.width > 0 && fixed.height > 0) {
8021
+ setOverlayCoordSpace({
8022
+ width: fixed.width,
8023
+ height: fixed.height
8024
+ });
7934
8025
  return true;
7935
8026
  }
7936
- var video = player.videoElement;
7937
- if (video && video.videoWidth > 0 && video.videoHeight > 0) {
8027
+ if (!player) return false;
8028
+ var video2 = player.videoElement;
8029
+ if (video2 && video2.videoWidth > 0 && video2.videoHeight > 0) {
7938
8030
  setOverlayCoordSpace({
7939
- width: video.videoWidth,
7940
- height: video.videoHeight
8031
+ width: video2.videoWidth,
8032
+ height: video2.videoHeight
7941
8033
  });
7942
8034
  return true;
7943
8035
  }
8036
+ var maxRes = (_player_getMaxHlsResolution = player.getMaxHlsResolution) === null || _player_getMaxHlsResolution === void 0 ? void 0 : _player_getMaxHlsResolution.call(player);
8037
+ if (maxRes) {
8038
+ setOverlayCoordSpace(maxRes);
8039
+ return true;
8040
+ }
8041
+ var minRes = (_player_getMinHlsResolution = player.getMinHlsResolution) === null || _player_getMinHlsResolution === void 0 ? void 0 : _player_getMinHlsResolution.call(player);
8042
+ if (minRes) {
8043
+ setOverlayCoordSpace(minRes);
8044
+ return true;
8045
+ }
7944
8046
  return false;
7945
8047
  };
7946
- if (tryResolve()) return;
8048
+ var attempts = 0;
8049
+ var maxAttempts = 40;
8050
+ tryResolve();
7947
8051
  var interval = setInterval(function() {
7948
8052
  attempts++;
7949
- if (tryResolve() || attempts >= maxAttempts) clearInterval(interval);
8053
+ if (!swirlOverlayCoordinateSpace) {
8054
+ tryResolve();
8055
+ }
8056
+ if (attempts >= maxAttempts) clearInterval(interval);
7950
8057
  }, 300);
8058
+ var onVideoDims = function onVideoDims() {
8059
+ if (!swirlOverlayCoordinateSpace) {
8060
+ tryResolve();
8061
+ }
8062
+ };
8063
+ var video = (_playerRef_current = playerRef.current) === null || _playerRef_current === void 0 ? void 0 : _playerRef_current.videoElement;
8064
+ video === null || video === void 0 ? void 0 : video.addEventListener("loadedmetadata", onVideoDims);
7951
8065
  return function() {
7952
- return clearInterval(interval);
8066
+ clearInterval(interval);
8067
+ video === null || video === void 0 ? void 0 : video.removeEventListener("loadedmetadata", onVideoDims);
7953
8068
  };
7954
8069
  }, [
7955
8070
  swirlProjectId,
7956
- criticalPropsKey
8071
+ criticalPropsKey,
8072
+ swirlOverlayCoordinateSpace
7957
8073
  ]);
7958
8074
  useEffect2(function() {
7959
8075
  if (!playerRef.current) return;
@@ -9755,6 +9871,8 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
9755
9871
  "children",
9756
9872
  "swirlProjectId",
9757
9873
  "swirlShowcaseDemo",
9874
+ "swirlOverlayApiBaseUrl",
9875
+ "swirlOverlayCoordinateSpace",
9758
9876
  "adcisionChannelId",
9759
9877
  "disableOverlays",
9760
9878
  "showAdsControl",
@@ -10980,5 +11098,5 @@ var createStormcloudPlayer = function createStormcloudPlayer(playerList, fallbac
10980
11098
  };
10981
11099
  var StormcloudPlayer = createStormcloudPlayer(players_default, players_default[players_default.length - 1]);
10982
11100
  var StormcloudPlayer_default = StormcloudPlayer;
10983
- export { IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer_default as StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, canPlay, createAdStormPlayer, createDemoStockTickerOverlay, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, fetchProjectOverlays, getBrowserConfigOverrides, getBrowserID, getClientInfo, initializePolyfills, isMediaStream, isOverlayActive, lazy, logBrowserInfo, merge, omit, parseQuery, players_default as players, randomString, resolveImageUrl, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, timeStringToSeconds };
11101
+ export { IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, OVERLAY_API_BASE, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer_default as StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, canPlay, createAdStormPlayer, createDemoStockTickerOverlay, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, fetchProjectOverlays, getBrowserConfigOverrides, getBrowserID, getClientInfo, initializePolyfills, isMediaStream, isOverlayActive, lazy, logBrowserInfo, merge, normalizeSwirlOverlay, omit, parseQuery, players_default as players, randomString, resolveImageUrl, scrollerLooksLikeMarketsStock, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, timeStringToSeconds };
10984
11102
  //# sourceMappingURL=index.js.map