stormcloud-video-player 0.7.36 → 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
  });
@@ -7197,7 +7277,8 @@ var OverlayRenderer = function OverlayRenderer(param) {
7197
7277
  var activeOverlays = useMemo(function() {
7198
7278
  if (showcaseMode) {
7199
7279
  return overlays.filter(function(o) {
7200
- return o.visible && showcasePhase < SHOWCASE_POP_OUT_END_MS;
7280
+ if (!o.visible) return false;
7281
+ return showcasePhase < SHOWCASE_POP_OUT_END_MS;
7201
7282
  });
7202
7283
  }
7203
7284
  return overlays.filter(function(o) {
@@ -7216,7 +7297,7 @@ var OverlayRenderer = function OverlayRenderer(param) {
7216
7297
  }, [
7217
7298
  activeOverlays
7218
7299
  ]);
7219
- useEffect(function() {
7300
+ useLayoutEffect(function() {
7220
7301
  var activeIds = new Set(activeOverlays.map(function(o) {
7221
7302
  return o.id;
7222
7303
  }));
@@ -7405,8 +7486,9 @@ var OverlayRenderer = function OverlayRenderer(param) {
7405
7486
  var height = overlay.height * scaleY;
7406
7487
  var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7407
7488
  var inShowcaseBeat = showcaseMode && activeBeatIds.has(overlay.id);
7408
- var opacity = inShowcaseBeat ? baseOpacity * showcaseOpacity(showcasePhase) : visible ? baseOpacity : 0;
7409
- var popScale = inShowcaseBeat ? showcaseScale(showcasePhase) : 1;
7489
+ var useShowcasePop = inShowcaseBeat;
7490
+ var opacity = useShowcasePop ? baseOpacity * showcaseOpacity(showcasePhase) : visible ? baseOpacity : 0;
7491
+ var popScale = useShowcasePop ? showcaseScale(showcasePhase) : 1;
7410
7492
  var sz = {
7411
7493
  w: width,
7412
7494
  h: height
@@ -7419,9 +7501,9 @@ var OverlayRenderer = function OverlayRenderer(param) {
7419
7501
  width: "".concat(width, "px"),
7420
7502
  height: "".concat(height, "px"),
7421
7503
  opacity: opacity,
7422
- transition: inShowcaseBeat ? "none" : "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7423
- transform: showcaseMode ? "scale(".concat(popScale, ")") : void 0,
7424
- transformOrigin: showcaseMode ? "center center" : void 0,
7504
+ transition: useShowcasePop ? "none" : "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7505
+ transform: showcaseMode && useShowcasePop ? "scale(".concat(popScale, ")") : void 0,
7506
+ transformOrigin: showcaseMode && useShowcasePop ? "center center" : void 0,
7425
7507
  zIndex: overlay.z_index,
7426
7508
  overflow: "hidden"
7427
7509
  },
@@ -7547,7 +7629,7 @@ var PANEL_BASE_RIGHT_OFFSET = 10;
7547
7629
  var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7548
7630
  var _ref;
7549
7631
  var _aiLiveContext_context;
7550
- 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, [
7551
7633
  "src",
7552
7634
  "autoplay",
7553
7635
  "muted",
@@ -7577,6 +7659,8 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7577
7659
  "disableFiller",
7578
7660
  "swirlProjectId",
7579
7661
  "swirlShowcaseDemo",
7662
+ "swirlOverlayApiBaseUrl",
7663
+ "swirlOverlayCoordinateSpace",
7580
7664
  "adcisionChannelId",
7581
7665
  "disableOverlays",
7582
7666
  "showAdsControl",
@@ -7613,13 +7697,21 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7613
7697
  var _React2_useState14 = _sliced_to_array(React2.useState(false), 2), showLicenseWarning = _React2_useState14[0], setShowLicenseWarning = _React2_useState14[1];
7614
7698
  var _React2_useState15 = _sliced_to_array(React2.useState(true), 2), controlsVisible = _React2_useState15[0], setControlsVisible = _React2_useState15[1];
7615
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
+ ]);
7616
7705
  var displayOverlays = React2.useMemo(function() {
7617
7706
  if (!swirlProjectId || !swirlShowcaseDemo) return overlays;
7618
- if (overlays.some(function(o) {
7707
+ if (overlays.some(scrollerLooksLikeMarketsStock)) return overlays;
7708
+ var hasOtherScroller = overlays.some(function(o) {
7619
7709
  return o.type === "scroller";
7620
- })) return overlays;
7710
+ });
7621
7711
  return _to_consumable_array(overlays).concat([
7622
- createDemoStockTickerOverlay(swirlProjectId)
7712
+ createDemoStockTickerOverlay(swirlProjectId, {
7713
+ stackAboveNews: hasOtherScroller
7714
+ })
7623
7715
  ]);
7624
7716
  }, [
7625
7717
  overlays,
@@ -7899,7 +7991,7 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7899
7991
  }
7900
7992
  var cancelled = false;
7901
7993
  var loadOverlays = function loadOverlays() {
7902
- fetchProjectOverlays(swirlProjectId).then(function(data) {
7994
+ fetchProjectOverlays(swirlProjectId, overlayApiBase).then(function(data) {
7903
7995
  if (!cancelled) setOverlays(data);
7904
7996
  }).catch(function(err) {
7905
7997
  if (!cancelled) {
@@ -7915,41 +8007,69 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7915
8007
  };
7916
8008
  }, [
7917
8009
  swirlProjectId,
7918
- adcisionChannelId
8010
+ adcisionChannelId,
8011
+ overlayApiBase
7919
8012
  ]);
7920
8013
  useEffect2(function() {
8014
+ var _playerRef_current;
7921
8015
  if (!swirlProjectId) return;
7922
- var player = playerRef.current;
7923
- if (!player) return;
7924
- var attempts = 0;
7925
- var maxAttempts = 30;
7926
8016
  var tryResolve = function tryResolve() {
7927
- var res = player.getMinHlsResolution();
7928
- if (res) {
7929
- 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
+ });
7930
8025
  return true;
7931
8026
  }
7932
- var video = player.videoElement;
7933
- 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) {
7934
8030
  setOverlayCoordSpace({
7935
- width: video.videoWidth,
7936
- height: video.videoHeight
8031
+ width: video2.videoWidth,
8032
+ height: video2.videoHeight
7937
8033
  });
7938
8034
  return true;
7939
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
+ }
7940
8046
  return false;
7941
8047
  };
7942
- if (tryResolve()) return;
8048
+ var attempts = 0;
8049
+ var maxAttempts = 40;
8050
+ tryResolve();
7943
8051
  var interval = setInterval(function() {
7944
8052
  attempts++;
7945
- if (tryResolve() || attempts >= maxAttempts) clearInterval(interval);
8053
+ if (!swirlOverlayCoordinateSpace) {
8054
+ tryResolve();
8055
+ }
8056
+ if (attempts >= maxAttempts) clearInterval(interval);
7946
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);
7947
8065
  return function() {
7948
- return clearInterval(interval);
8066
+ clearInterval(interval);
8067
+ video === null || video === void 0 ? void 0 : video.removeEventListener("loadedmetadata", onVideoDims);
7949
8068
  };
7950
8069
  }, [
7951
8070
  swirlProjectId,
7952
- criticalPropsKey
8071
+ criticalPropsKey,
8072
+ swirlOverlayCoordinateSpace
7953
8073
  ]);
7954
8074
  useEffect2(function() {
7955
8075
  if (!playerRef.current) return;
@@ -9751,6 +9871,8 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
9751
9871
  "children",
9752
9872
  "swirlProjectId",
9753
9873
  "swirlShowcaseDemo",
9874
+ "swirlOverlayApiBaseUrl",
9875
+ "swirlOverlayCoordinateSpace",
9754
9876
  "adcisionChannelId",
9755
9877
  "disableOverlays",
9756
9878
  "showAdsControl",
@@ -10976,5 +11098,5 @@ var createStormcloudPlayer = function createStormcloudPlayer(playerList, fallbac
10976
11098
  };
10977
11099
  var StormcloudPlayer = createStormcloudPlayer(players_default, players_default[players_default.length - 1]);
10978
11100
  var StormcloudPlayer_default = StormcloudPlayer;
10979
- 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 };
10980
11102
  //# sourceMappingURL=index.js.map