stormcloud-video-player 0.8.12 → 0.8.14

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.
@@ -1,4 +1,4 @@
1
- import { A as AdController } from '../types-BM5cceAy.cjs';
1
+ import { A as AdController } from '../types-CWWADkvd.cjs';
2
2
  import Hls from 'hls.js';
3
3
 
4
4
  declare function createHlsAdPlayer(contentVideo: HTMLVideoElement, options?: {
@@ -24,9 +24,7 @@ interface StormcloudVideoPlayerConfig {
24
24
  vmapUrl?: string;
25
25
  vastMode?: 'adstorm' | 'default';
26
26
  minSegmentsBeforePlay?: number;
27
- deviceId?: string;
28
- deviceIdType?: string;
29
- limitAdTracking?: boolean;
27
+ ctvAdRequest?: boolean;
30
28
  adTest?: boolean;
31
29
  }
32
30
  interface AdController {
@@ -2326,6 +2326,20 @@ function generateCorrelator() {
2326
2326
  return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
2327
2327
  }
2328
2328
  var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
2329
+ var CTV_UNSUPPORTED_PARAMS = [
2330
+ "description_url",
2331
+ "tfcd",
2332
+ "npa",
2333
+ "min_ad_duration",
2334
+ "max_ad_duration",
2335
+ "unviewed_position_start",
2336
+ "impl",
2337
+ "scor",
2338
+ "vad_type",
2339
+ "gdpr",
2340
+ "gdpr_consent",
2341
+ "us_privacy"
2342
+ ];
2329
2343
  function applyVastMacros(baseUrl, ctx) {
2330
2344
  var url;
2331
2345
  try {
@@ -2335,16 +2349,42 @@ function applyVastMacros(baseUrl, ctx) {
2335
2349
  }
2336
2350
  var params = url.searchParams;
2337
2351
  params.set("correlator", ctx.correlator);
2338
- params.set("scor", ctx.streamCorrelator);
2352
+ if (ctx.isCtv) {
2353
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2354
+ try {
2355
+ for(var _iterator = CTV_UNSUPPORTED_PARAMS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2356
+ var key = _step.value;
2357
+ params.delete(key);
2358
+ }
2359
+ } catch (err) {
2360
+ _didIteratorError = true;
2361
+ _iteratorError = err;
2362
+ } finally{
2363
+ try {
2364
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2365
+ _iterator.return();
2366
+ }
2367
+ } finally{
2368
+ if (_didIteratorError) {
2369
+ throw _iteratorError;
2370
+ }
2371
+ }
2372
+ }
2373
+ } else {
2374
+ params.set("scor", ctx.streamCorrelator);
2375
+ }
2339
2376
  if (ctx.pod != null) {
2340
2377
  params.set("pod", String(ctx.pod));
2341
2378
  }
2342
2379
  if (ctx.adPosition != null) {
2343
2380
  params.set("ppos", String(ctx.adPosition));
2344
2381
  }
2345
- if (ctx.pageUrl) {
2346
- params.set("url", ctx.pageUrl);
2347
- params.set("description_url", ctx.pageUrl);
2382
+ var requestUrl = ctx.contentUrl || ctx.pageUrl;
2383
+ if (requestUrl) {
2384
+ params.set("url", requestUrl);
2385
+ if (!ctx.isCtv) {
2386
+ params.set("description_url", requestUrl);
2387
+ }
2348
2388
  }
2349
2389
  if (ctx.adWillPlayMuted != null) {
2350
2390
  params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
@@ -2352,6 +2392,20 @@ function applyVastMacros(baseUrl, ctx) {
2352
2392
  if (ctx.adWillAutoPlay != null) {
2353
2393
  params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
2354
2394
  }
2395
+ if (ctx.appId) {
2396
+ params.set("msid", ctx.appId);
2397
+ }
2398
+ if (ctx.appName) {
2399
+ params.set("an", ctx.appName);
2400
+ }
2401
+ if (ctx.sessionId) {
2402
+ params.set("sid", ctx.sessionId);
2403
+ }
2404
+ if (ctx.deviceTypeHint != null) {
2405
+ params.set("dth", String(ctx.deviceTypeHint));
2406
+ } else if (ctx.isCtv) {
2407
+ params.set("dth", "5");
2408
+ }
2355
2409
  if (ctx.deviceId && ctx.deviceIdType) {
2356
2410
  params.set("rdid", ctx.deviceId);
2357
2411
  params.set("idtype", ctx.deviceIdType);
@@ -2361,15 +2415,17 @@ function applyVastMacros(baseUrl, ctx) {
2361
2415
  params.delete("idtype");
2362
2416
  params.delete("is_lat");
2363
2417
  }
2364
- var consent = ctx.consent;
2365
- if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
2366
- params.set("gdpr", consent.gdpr);
2367
- }
2368
- if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
2369
- params.set("gdpr_consent", consent.gdprConsent);
2370
- }
2371
- if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
2372
- params.set("us_privacy", consent.usPrivacy);
2418
+ if (!ctx.isCtv) {
2419
+ var consent = ctx.consent;
2420
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
2421
+ params.set("gdpr", consent.gdpr);
2422
+ }
2423
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
2424
+ params.set("gdpr_consent", consent.gdprConsent);
2425
+ }
2426
+ if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
2427
+ params.set("us_privacy", consent.usPrivacy);
2428
+ }
2373
2429
  }
2374
2430
  if (ctx.adTest) {
2375
2431
  params.set("adtest", "on");
@@ -2380,23 +2436,23 @@ function applyVastMacros(baseUrl, ctx) {
2380
2436
  staleKeys.push(key);
2381
2437
  }
2382
2438
  });
2383
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2439
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
2384
2440
  try {
2385
- for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2386
- var key = _step.value;
2387
- params.delete(key);
2441
+ for(var _iterator1 = staleKeys[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
2442
+ var key1 = _step1.value;
2443
+ params.delete(key1);
2388
2444
  }
2389
2445
  } catch (err) {
2390
- _didIteratorError = true;
2391
- _iteratorError = err;
2446
+ _didIteratorError1 = true;
2447
+ _iteratorError1 = err;
2392
2448
  } finally{
2393
2449
  try {
2394
- if (!_iteratorNormalCompletion && _iterator.return != null) {
2395
- _iterator.return();
2450
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
2451
+ _iterator1.return();
2396
2452
  }
2397
2453
  } finally{
2398
- if (_didIteratorError) {
2399
- throw _iteratorError;
2454
+ if (_didIteratorError1) {
2455
+ throw _iteratorError1;
2400
2456
  }
2401
2457
  }
2402
2458
  }
@@ -2636,6 +2692,262 @@ function logBrowserInfo() {
2636
2692
  userAgent: navigator.userAgent
2637
2693
  }));
2638
2694
  }
2695
+ // src/utils/ctvVastSignals.ts
2696
+ var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
2697
+ var AIRY_APP_NAME = "AiryTV Movies & TV";
2698
+ var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
2699
+ var DEVICE_ID_STORAGE_KEYS = [
2700
+ "rdid",
2701
+ "ifa",
2702
+ "advertisingId",
2703
+ "advertising_id",
2704
+ "deviceAdvertisingId",
2705
+ "aaid",
2706
+ "adid",
2707
+ "rida",
2708
+ "tifa"
2709
+ ];
2710
+ function resolveCtvVastSignals() {
2711
+ var _ref, _bridgeSignals_limitAdTracking;
2712
+ var bridgeSignals = readNativeBridgeSignals();
2713
+ var deviceId = bridgeSignals.deviceId || readStoredDeviceId();
2714
+ var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || inferDeviceIdType();
2715
+ return _object_spread_props(_object_spread({
2716
+ contentUrl: "https://".concat(AIRY_ANDROID_APP_ID, ".example.com"),
2717
+ appId: AIRY_ANDROID_APP_ID,
2718
+ appName: AIRY_APP_NAME,
2719
+ sessionId: getOrCreateCtvSessionId()
2720
+ }, deviceId ? {
2721
+ deviceId: deviceId
2722
+ } : {}, deviceId && deviceIdType ? {
2723
+ deviceIdType: deviceIdType
2724
+ } : {}, deviceId ? {
2725
+ limitAdTracking: (_ref = (_bridgeSignals_limitAdTracking = bridgeSignals.limitAdTracking) !== null && _bridgeSignals_limitAdTracking !== void 0 ? _bridgeSignals_limitAdTracking : readStoredLimitAdTracking()) !== null && _ref !== void 0 ? _ref : false
2726
+ } : {}), {
2727
+ deviceTypeHint: 5
2728
+ });
2729
+ }
2730
+ function getOrCreateCtvSessionId() {
2731
+ var existing = readStoredString(CTV_SESSION_STORAGE_KEY);
2732
+ if (existing) {
2733
+ return existing;
2734
+ }
2735
+ var sessionId = createUuid();
2736
+ try {
2737
+ var _window_localStorage;
2738
+ (_window_localStorage = window.localStorage) === null || _window_localStorage === void 0 ? void 0 : _window_localStorage.setItem(CTV_SESSION_STORAGE_KEY, sessionId);
2739
+ } catch (unused) {}
2740
+ return sessionId;
2741
+ }
2742
+ function createUuid() {
2743
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
2744
+ return crypto.randomUUID();
2745
+ }
2746
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(char) {
2747
+ var value = Math.floor(Math.random() * 16);
2748
+ var nibble = char === "x" ? value : value & 3 | 8;
2749
+ return nibble.toString(16);
2750
+ });
2751
+ }
2752
+ function readNativeBridgeSignals() {
2753
+ if (typeof window === "undefined") {
2754
+ return {};
2755
+ }
2756
+ var candidates = [
2757
+ window.__STORMCLOUD_CTV_AD_INFO__,
2758
+ window.__STORMCLOUD_CTV__,
2759
+ window.stormcloudCtv,
2760
+ window.AiryTV,
2761
+ window.Android
2762
+ ].filter(Boolean);
2763
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2764
+ try {
2765
+ for(var _iterator = candidates[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2766
+ var source = _step.value;
2767
+ var deviceId = readBridgeValue(source, [
2768
+ "rdid",
2769
+ "ifa",
2770
+ "advertisingId",
2771
+ "adId",
2772
+ "deviceId"
2773
+ ]) || void 0;
2774
+ if (!deviceId) continue;
2775
+ var deviceIdType = readBridgeValue(source, [
2776
+ "idtype",
2777
+ "deviceIdType",
2778
+ "advertisingIdType"
2779
+ ]) || inferDeviceIdType();
2780
+ var limitAdTracking = readBridgeBoolean(source, [
2781
+ "is_lat",
2782
+ "limitAdTracking",
2783
+ "limitedAdTracking",
2784
+ "lat"
2785
+ ]);
2786
+ return _object_spread({
2787
+ deviceId: deviceId
2788
+ }, deviceIdType ? {
2789
+ deviceIdType: deviceIdType
2790
+ } : {}, limitAdTracking != null ? {
2791
+ limitAdTracking: limitAdTracking
2792
+ } : {});
2793
+ }
2794
+ } catch (err) {
2795
+ _didIteratorError = true;
2796
+ _iteratorError = err;
2797
+ } finally{
2798
+ try {
2799
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2800
+ _iterator.return();
2801
+ }
2802
+ } finally{
2803
+ if (_didIteratorError) {
2804
+ throw _iteratorError;
2805
+ }
2806
+ }
2807
+ }
2808
+ return {};
2809
+ }
2810
+ function readBridgeValue(source, keys) {
2811
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2812
+ try {
2813
+ for(var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2814
+ var key = _step.value;
2815
+ var value = source === null || source === void 0 ? void 0 : source[key];
2816
+ if (typeof value === "string" && value) {
2817
+ return value;
2818
+ }
2819
+ if (typeof value === "function") {
2820
+ try {
2821
+ var result = value.call(source);
2822
+ if (typeof result === "string" && result) {
2823
+ return result;
2824
+ }
2825
+ } catch (unused) {}
2826
+ }
2827
+ }
2828
+ } catch (err) {
2829
+ _didIteratorError = true;
2830
+ _iteratorError = err;
2831
+ } finally{
2832
+ try {
2833
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2834
+ _iterator.return();
2835
+ }
2836
+ } finally{
2837
+ if (_didIteratorError) {
2838
+ throw _iteratorError;
2839
+ }
2840
+ }
2841
+ }
2842
+ return void 0;
2843
+ }
2844
+ function readBridgeBoolean(source, keys) {
2845
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2846
+ try {
2847
+ for(var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2848
+ var key = _step.value;
2849
+ var value = source === null || source === void 0 ? void 0 : source[key];
2850
+ var normalized = normalizeBoolean(value);
2851
+ if (normalized != null) {
2852
+ return normalized;
2853
+ }
2854
+ if (typeof value === "function") {
2855
+ try {
2856
+ var result = normalizeBoolean(value.call(source));
2857
+ if (result != null) {
2858
+ return result;
2859
+ }
2860
+ } catch (unused) {}
2861
+ }
2862
+ }
2863
+ } catch (err) {
2864
+ _didIteratorError = true;
2865
+ _iteratorError = err;
2866
+ } finally{
2867
+ try {
2868
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2869
+ _iterator.return();
2870
+ }
2871
+ } finally{
2872
+ if (_didIteratorError) {
2873
+ throw _iteratorError;
2874
+ }
2875
+ }
2876
+ }
2877
+ return void 0;
2878
+ }
2879
+ function readStoredDeviceId() {
2880
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2881
+ try {
2882
+ for(var _iterator = DEVICE_ID_STORAGE_KEYS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2883
+ var key = _step.value;
2884
+ var value = readStoredString(key);
2885
+ if (value) {
2886
+ return value;
2887
+ }
2888
+ }
2889
+ } catch (err) {
2890
+ _didIteratorError = true;
2891
+ _iteratorError = err;
2892
+ } finally{
2893
+ try {
2894
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2895
+ _iterator.return();
2896
+ }
2897
+ } finally{
2898
+ if (_didIteratorError) {
2899
+ throw _iteratorError;
2900
+ }
2901
+ }
2902
+ }
2903
+ return void 0;
2904
+ }
2905
+ function readStoredString(key) {
2906
+ if (typeof window === "undefined") {
2907
+ return void 0;
2908
+ }
2909
+ try {
2910
+ var _window_localStorage;
2911
+ var value = (_window_localStorage = window.localStorage) === null || _window_localStorage === void 0 ? void 0 : _window_localStorage.getItem(key);
2912
+ return value || void 0;
2913
+ } catch (unused) {
2914
+ return void 0;
2915
+ }
2916
+ }
2917
+ function readStoredLimitAdTracking() {
2918
+ return normalizeBoolean(readStoredString("limitAdTracking") || readStoredString("limitedAdTracking") || readStoredString("is_lat"));
2919
+ }
2920
+ function normalizeBoolean(value) {
2921
+ if (typeof value === "boolean") {
2922
+ return value;
2923
+ }
2924
+ if (typeof value === "number") {
2925
+ return value === 1;
2926
+ }
2927
+ if (typeof value === "string") {
2928
+ var normalized = value.toLowerCase();
2929
+ if (normalized === "1" || normalized === "true" || normalized === "yes") {
2930
+ return true;
2931
+ }
2932
+ if (normalized === "0" || normalized === "false" || normalized === "no") {
2933
+ return false;
2934
+ }
2935
+ }
2936
+ return void 0;
2937
+ }
2938
+ function inferDeviceIdType() {
2939
+ if (typeof navigator === "undefined") {
2940
+ return void 0;
2941
+ }
2942
+ var ua = navigator.userAgent;
2943
+ if (/Roku/i.test(ua)) return "rida";
2944
+ if (/Tizen|Samsung/i.test(ua)) return "tifa";
2945
+ if (/AppleTV/i.test(ua)) return "tvOS";
2946
+ if (/AFT|Fire TV|Amazon/i.test(ua)) return "afai";
2947
+ if (/Web0S|webOS|LG/i.test(ua)) return "lgudid";
2948
+ if (/Android|Google TV/i.test(ua)) return "aaid";
2949
+ return void 0;
2950
+ }
2639
2951
  // src/player/StormcloudVideoPlayer.ts
2640
2952
  var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2641
2953
  function StormcloudVideoPlayer(config) {
@@ -5077,17 +5389,24 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5077
5389
  for(var i = 0; i < count; i++){
5078
5390
  this.adRequestPositionInBreak++;
5079
5391
  var adWillPlayMuted = this.inAdBreak ? this.adPlayer.getOriginalMutedState() : this.video.muted;
5392
+ var ctvSignals = this.config.ctvAdRequest ? resolveCtvVastSignals() : void 0;
5080
5393
  var urlWithMacros = applyVastMacros(baseUrl, {
5081
5394
  correlator: generateCorrelator(),
5082
5395
  streamCorrelator: this.streamCorrelator,
5083
5396
  pod: this.podCounter > 0 ? this.podCounter : void 0,
5084
5397
  adPosition: this.adRequestPositionInBreak,
5085
- pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
5398
+ isCtv: this.config.ctvAdRequest,
5399
+ contentUrl: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.contentUrl,
5400
+ pageUrl: !this.config.ctvAdRequest && typeof window !== "undefined" ? window.location.href : void 0,
5086
5401
  adWillPlayMuted: adWillPlayMuted,
5087
5402
  adWillAutoPlay: !!this.config.autoplay,
5088
- deviceId: this.config.deviceId,
5089
- deviceIdType: this.config.deviceIdType,
5090
- limitAdTracking: this.config.limitAdTracking,
5403
+ appId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.appId,
5404
+ appName: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.appName,
5405
+ sessionId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.sessionId,
5406
+ deviceId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceId,
5407
+ deviceIdType: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceIdType,
5408
+ limitAdTracking: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.limitAdTracking,
5409
+ deviceTypeHint: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceTypeHint,
5091
5410
  adTest: this.config.adTest,
5092
5411
  consent: this.consentSignals
5093
5412
  });
@@ -5671,21 +5990,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5671
5990
  currentMuted = this.video.muted;
5672
5991
  currentVolume = this.video.volume;
5673
5992
  this.adPlayer.updateOriginalMutedState(currentMuted, currentVolume);
5674
- if (!this.video.muted) {
5675
- this.video.muted = true;
5676
- if (this.config.debugAdTiming) {
5677
- console.log("[StormcloudVideoPlayer] Muted video in handleAdStart");
5678
- }
5679
- }
5680
5993
  this.inAdBreak = true;
5681
5994
  this.currentAdBreakStartWallClockMs = Date.now();
5682
5995
  this.adBreakPlayedDurationMs = 0;
5683
5996
  this.currentAdIndex = 0;
5684
5997
  this.totalAdsInBreak = 0;
5685
5998
  this.adPodQueue = [];
5686
- this.showAds = true;
5687
- this.showPlaceholderLayer();
5688
- this.adPlayer.showPlaceholder();
5999
+ this.showAds = false;
5689
6000
  if (this.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {
5690
6001
  this.expectedAdBreakDurationMs = adBreakDurationMs;
5691
6002
  }
@@ -7900,12 +8211,13 @@ var CRITICAL_PROPS = [
7900
8211
  "vmapUrl",
7901
8212
  "lowLatencyMode",
7902
8213
  "driftToleranceMs",
7903
- "vastMode"
8214
+ "vastMode",
8215
+ "ctvAdRequest"
7904
8216
  ];
7905
8217
  var CONTROLS_HIDE_DELAY = 3e3;
7906
8218
  var DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;
7907
8219
  var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7908
- 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, restVideoAttrs = _object_without_properties(props, [
8220
+ 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, [
7909
8221
  "src",
7910
8222
  "autoplay",
7911
8223
  "muted",
@@ -7935,7 +8247,8 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7935
8247
  "vastTagUrl",
7936
8248
  "isVmap",
7937
8249
  "vmapUrl",
7938
- "minSegmentsBeforePlay"
8250
+ "minSegmentsBeforePlay",
8251
+ "ctvAdRequest"
7939
8252
  ]);
7940
8253
  var videoRef = (0, import_react.useRef)(null);
7941
8254
  var playerRef = (0, import_react.useRef)(null);
@@ -8124,6 +8437,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
8124
8437
  if (isVmap !== void 0) cfg.isVmap = isVmap;
8125
8438
  if (vmapUrl !== void 0) cfg.vmapUrl = vmapUrl;
8126
8439
  if (minSegmentsBeforePlay !== void 0) cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;
8440
+ if (ctvAdRequest !== void 0) cfg.ctvAdRequest = ctvAdRequest;
8127
8441
  var player = new StormcloudVideoPlayer(cfg);
8128
8442
  playerRef.current = player;
8129
8443
  player.load().then(function() {