stormcloud-video-player 0.8.4 → 0.8.6

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,5 +1,5 @@
1
1
  import { Component } from 'react';
2
- import { S as StormcloudVideoPlayerConfig } from '../types-BmF_60m2.cjs';
2
+ import { S as StormcloudVideoPlayerConfig } from '../types-CUKMIqHL.cjs';
3
3
 
4
4
  interface HlsPlayerProps extends StormcloudVideoPlayerConfig {
5
5
  onMount?: (player: any) => void;
@@ -438,6 +438,7 @@ var import_react2 = require("react");
438
438
  var import_hls2 = __toESM(require("hls.js"), 1);
439
439
  // src/sdk/hlsAdPlayer.ts
440
440
  var import_hls = __toESM(require("hls.js"), 1);
441
+ var MAX_VAST_WRAPPER_DEPTH = 5;
441
442
  function createHlsAdPlayer(contentVideo, options) {
442
443
  var adPlaying = false;
443
444
  var originalMutedState = false;
@@ -595,25 +596,91 @@ function createHlsAdPlayer(contentVideo, options) {
595
596
  var url = mediaFile.url.toLowerCase();
596
597
  return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
597
598
  }
599
+ function createEmptyTrackingUrls() {
600
+ return {
601
+ impression: [],
602
+ start: [],
603
+ firstQuartile: [],
604
+ midpoint: [],
605
+ thirdQuartile: [],
606
+ complete: [],
607
+ mute: [],
608
+ unmute: [],
609
+ pause: [],
610
+ resume: [],
611
+ fullscreen: [],
612
+ exitFullscreen: [],
613
+ skip: [],
614
+ error: []
615
+ };
616
+ }
617
+ function extractTrackingUrls(xmlDoc) {
618
+ var trackingUrls = createEmptyTrackingUrls();
619
+ xmlDoc.querySelectorAll("Impression").forEach(function(el) {
620
+ var _el_textContent;
621
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
622
+ if (url) trackingUrls.impression.push(url);
623
+ });
624
+ xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
625
+ var _el_textContent;
626
+ var event = el.getAttribute("event");
627
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
628
+ if (event && url) {
629
+ var eventKey = event;
630
+ if (trackingUrls[eventKey]) {
631
+ trackingUrls[eventKey].push(url);
632
+ }
633
+ }
634
+ });
635
+ xmlDoc.querySelectorAll("Error").forEach(function(el) {
636
+ var _el_textContent;
637
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
638
+ if (url) trackingUrls.error.push(url);
639
+ });
640
+ return trackingUrls;
641
+ }
642
+ function mergeTrackingUrls(target, source) {
643
+ Object.keys(target).forEach(function(key) {
644
+ if (source[key] && source[key].length > 0) {
645
+ target[key] = target[key].concat(source[key]);
646
+ }
647
+ });
648
+ return target;
649
+ }
598
650
  function parseVastXml(xmlString) {
599
651
  try {
600
- var _xmlDoc_querySelector, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector2;
652
+ var _xmlDoc_querySelector, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent1, _xmlDoc_querySelector2, _xmlDoc_querySelector3;
601
653
  var parser = new DOMParser();
602
654
  var xmlDoc = parser.parseFromString(xmlString, "text/xml");
603
655
  var parserError = xmlDoc.querySelector("parsererror");
604
656
  if (parserError) {
605
657
  console.error("[HlsAdPlayer] XML parsing error (malformed VAST XML):", parserError.textContent);
606
- return null;
658
+ return {
659
+ type: "empty"
660
+ };
607
661
  }
608
662
  var adElement = xmlDoc.querySelector("Ad");
609
663
  if (!adElement) {
610
664
  console.warn("[HlsAdPlayer] No Ad element found in VAST XML");
611
- return null;
665
+ return {
666
+ type: "empty"
667
+ };
612
668
  }
613
669
  var adId = adElement.getAttribute("id") || "unknown";
614
670
  var title = ((_xmlDoc_querySelector = xmlDoc.querySelector("AdTitle")) === null || _xmlDoc_querySelector === void 0 ? void 0 : _xmlDoc_querySelector.textContent) || "Ad";
671
+ var clickThrough = (_xmlDoc_querySelector1 = xmlDoc.querySelector("ClickThrough")) === null || _xmlDoc_querySelector1 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent = _xmlDoc_querySelector1.textContent) === null || _xmlDoc_querySelector_textContent === void 0 ? void 0 : _xmlDoc_querySelector_textContent.trim();
672
+ var wrapperUri = (_xmlDoc_querySelector2 = xmlDoc.querySelector("VASTAdTagURI")) === null || _xmlDoc_querySelector2 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent1 = _xmlDoc_querySelector2.textContent) === null || _xmlDoc_querySelector_textContent1 === void 0 ? void 0 : _xmlDoc_querySelector_textContent1.trim();
673
+ if (wrapperUri) {
674
+ console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(wrapperUri));
675
+ return {
676
+ type: "wrapper",
677
+ vastAdTagUri: wrapperUri,
678
+ trackingUrls: extractTrackingUrls(xmlDoc),
679
+ clickThrough: clickThrough
680
+ };
681
+ }
615
682
  var isNoAdAvailable = adId === "empty" || title.toLowerCase().includes("no ad available") || title.toLowerCase() === "no ad available";
616
- var durationText = ((_xmlDoc_querySelector1 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector1 === void 0 ? void 0 : _xmlDoc_querySelector1.textContent) || "00:00:30";
683
+ var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
617
684
  var durationParts = durationText.split(":");
618
685
  var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
619
686
  var mediaFileElements = xmlDoc.querySelectorAll("MediaFile");
@@ -653,57 +720,31 @@ function createHlsAdPlayer(contentVideo, options) {
653
720
  } else {
654
721
  console.warn("[HlsAdPlayer] No supported media files found in VAST XML");
655
722
  }
656
- return null;
723
+ return {
724
+ type: "empty"
725
+ };
657
726
  }
658
- var trackingUrls = {
659
- impression: [],
660
- start: [],
661
- firstQuartile: [],
662
- midpoint: [],
663
- thirdQuartile: [],
664
- complete: [],
665
- mute: [],
666
- unmute: [],
667
- pause: [],
668
- resume: [],
669
- fullscreen: [],
670
- exitFullscreen: [],
671
- skip: [],
672
- error: []
673
- };
674
- xmlDoc.querySelectorAll("Impression").forEach(function(el) {
675
- var _el_textContent;
676
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
677
- if (url) trackingUrls.impression.push(url);
678
- });
679
- xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
680
- var _el_textContent;
681
- var event = el.getAttribute("event");
682
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
683
- if (event && url) {
684
- var eventKey = event;
685
- if (trackingUrls[eventKey]) {
686
- trackingUrls[eventKey].push(url);
687
- }
688
- }
689
- });
690
- var clickThrough = (_xmlDoc_querySelector2 = xmlDoc.querySelector("ClickThrough")) === null || _xmlDoc_querySelector2 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent = _xmlDoc_querySelector2.textContent) === null || _xmlDoc_querySelector_textContent === void 0 ? void 0 : _xmlDoc_querySelector_textContent.trim();
691
727
  return {
692
- id: adId,
693
- title: title,
694
- duration: duration,
695
- mediaFiles: mediaFiles,
696
- trackingUrls: trackingUrls,
697
- clickThrough: clickThrough
728
+ type: "inline",
729
+ ad: {
730
+ id: adId,
731
+ title: title,
732
+ duration: duration,
733
+ mediaFiles: mediaFiles,
734
+ trackingUrls: extractTrackingUrls(xmlDoc),
735
+ clickThrough: clickThrough
736
+ }
698
737
  };
699
738
  } catch (error) {
700
739
  console.error("[HlsAdPlayer] Error parsing VAST XML:", error);
701
- return null;
740
+ return {
741
+ type: "empty"
742
+ };
702
743
  }
703
744
  }
704
- function fetchAndParseVastAd(vastTagUrl) {
745
+ function fetchVastXml(vastTagUrl) {
705
746
  return _async_to_generator(function() {
706
- var response, vastXml;
747
+ var response;
707
748
  return _ts_generator(this, function(_state) {
708
749
  switch(_state.label){
709
750
  case 0:
@@ -724,20 +765,58 @@ function createHlsAdPlayer(contentVideo, options) {
724
765
  throw new Error("Failed to fetch VAST: ".concat(response.statusText));
725
766
  }
726
767
  return [
727
- 4,
768
+ 2,
728
769
  response.text()
729
770
  ];
730
- case 2:
771
+ }
772
+ });
773
+ })();
774
+ }
775
+ function fetchAndParseVastAd(_0) {
776
+ return _async_to_generator(function(vastTagUrl) {
777
+ var depth, accumulatedTracking, vastXml, parsed;
778
+ var _arguments = arguments;
779
+ return _ts_generator(this, function(_state) {
780
+ switch(_state.label){
781
+ case 0:
782
+ depth = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : 0, accumulatedTracking = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : createEmptyTrackingUrls();
783
+ return [
784
+ 4,
785
+ fetchVastXml(vastTagUrl)
786
+ ];
787
+ case 1:
731
788
  vastXml = _state.sent();
732
789
  console.log("[HlsAdPlayer] VAST XML received");
733
790
  console.log("[HlsAdPlayer] VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
791
+ parsed = parseVastXml(vastXml);
792
+ if (parsed.type === "empty") {
793
+ return [
794
+ 2,
795
+ null
796
+ ];
797
+ }
798
+ if (parsed.type === "wrapper") {
799
+ if (depth >= MAX_VAST_WRAPPER_DEPTH) {
800
+ console.warn("[HlsAdPlayer] VAST wrapper depth limit (".concat(MAX_VAST_WRAPPER_DEPTH, ") reached, aborting redirect chain"));
801
+ return [
802
+ 2,
803
+ null
804
+ ];
805
+ }
806
+ mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);
807
+ return [
808
+ 2,
809
+ fetchAndParseVastAd(parsed.vastAdTagUri, depth + 1, accumulatedTracking)
810
+ ];
811
+ }
812
+ mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);
734
813
  return [
735
814
  2,
736
- parseVastXml(vastXml)
815
+ parsed.ad
737
816
  ];
738
817
  }
739
818
  });
740
- })();
819
+ }).apply(this, arguments);
741
820
  }
742
821
  function createAdVideoElement() {
743
822
  var video = document.createElement("video");
@@ -2276,6 +2355,166 @@ function initializePolyfills() {
2276
2355
  polyfillTextEncoder();
2277
2356
  polyfillPromiseFinally();
2278
2357
  }
2358
+ // src/utils/vastMacros.ts
2359
+ function generateCorrelator() {
2360
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
2361
+ try {
2362
+ var _buf_, _buf_1;
2363
+ var buf = new Uint32Array(2);
2364
+ crypto.getRandomValues(buf);
2365
+ var value = ((_buf_ = buf[0]) !== null && _buf_ !== void 0 ? _buf_ : 0) * 2097152 + (((_buf_1 = buf[1]) !== null && _buf_1 !== void 0 ? _buf_1 : 0) & 2097151);
2366
+ if (value > 0) {
2367
+ return String(value);
2368
+ }
2369
+ } catch (unused) {}
2370
+ }
2371
+ return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
2372
+ }
2373
+ var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
2374
+ function applyVastMacros(baseUrl, ctx) {
2375
+ var url;
2376
+ try {
2377
+ url = new URL(baseUrl);
2378
+ } catch (unused) {
2379
+ return replaceCorrelatorFallback(baseUrl, ctx.correlator);
2380
+ }
2381
+ var params = url.searchParams;
2382
+ params.set("correlator", ctx.correlator);
2383
+ params.set("scor", ctx.streamCorrelator);
2384
+ if (ctx.pod != null) {
2385
+ params.set("pod", String(ctx.pod));
2386
+ }
2387
+ if (ctx.adPosition != null) {
2388
+ params.set("ppos", String(ctx.adPosition));
2389
+ }
2390
+ if (ctx.pageUrl) {
2391
+ params.set("url", ctx.pageUrl);
2392
+ params.set("description_url", ctx.pageUrl);
2393
+ }
2394
+ if (ctx.adWillPlayMuted != null) {
2395
+ params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
2396
+ }
2397
+ if (ctx.adWillAutoPlay != null) {
2398
+ params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
2399
+ }
2400
+ if (ctx.deviceId && ctx.deviceIdType) {
2401
+ params.set("rdid", ctx.deviceId);
2402
+ params.set("idtype", ctx.deviceIdType);
2403
+ params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
2404
+ } else {
2405
+ params.delete("rdid");
2406
+ params.delete("idtype");
2407
+ params.delete("is_lat");
2408
+ }
2409
+ var consent = ctx.consent;
2410
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
2411
+ params.set("gdpr", consent.gdpr);
2412
+ }
2413
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
2414
+ params.set("gdpr_consent", consent.gdprConsent);
2415
+ }
2416
+ if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
2417
+ params.set("us_privacy", consent.usPrivacy);
2418
+ }
2419
+ if (ctx.adTest) {
2420
+ params.set("adtest", "on");
2421
+ }
2422
+ var staleKeys = [];
2423
+ params.forEach(function(value, key) {
2424
+ if (UNEXPANDED_MACRO_PATTERN.test(value)) {
2425
+ staleKeys.push(key);
2426
+ }
2427
+ });
2428
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2429
+ try {
2430
+ for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2431
+ var key = _step.value;
2432
+ params.delete(key);
2433
+ }
2434
+ } catch (err) {
2435
+ _didIteratorError = true;
2436
+ _iteratorError = err;
2437
+ } finally{
2438
+ try {
2439
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2440
+ _iterator.return();
2441
+ }
2442
+ } finally{
2443
+ if (_didIteratorError) {
2444
+ throw _iteratorError;
2445
+ }
2446
+ }
2447
+ }
2448
+ return url.toString();
2449
+ }
2450
+ function replaceCorrelatorFallback(baseUrl, correlator) {
2451
+ var correlatorRegex = /([?&])correlator=([^&]*)/;
2452
+ if (correlatorRegex.test(baseUrl)) {
2453
+ return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
2454
+ }
2455
+ var sep = baseUrl.includes("?") ? "&" : "?";
2456
+ return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
2457
+ }
2458
+ function fetchConsentSignals() {
2459
+ var timeoutMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1500;
2460
+ var signals = {};
2461
+ if (typeof window === "undefined") {
2462
+ return Promise.resolve(signals);
2463
+ }
2464
+ var tasks = [];
2465
+ var tcfApi = window.__tcfapi;
2466
+ if (typeof tcfApi === "function") {
2467
+ tasks.push(new Promise(function(resolve) {
2468
+ var settled = false;
2469
+ try {
2470
+ tcfApi("addEventListener", 2, function(tcData, success) {
2471
+ if (settled) return;
2472
+ if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
2473
+ settled = true;
2474
+ signals.gdpr = tcData.gdprApplies ? "1" : "0";
2475
+ if (typeof tcData.tcString === "string" && tcData.tcString) {
2476
+ signals.gdprConsent = tcData.tcString;
2477
+ }
2478
+ try {
2479
+ tcfApi("removeEventListener", 2, function() {}, tcData.listenerId);
2480
+ } catch (unused) {}
2481
+ resolve();
2482
+ }
2483
+ });
2484
+ } catch (unused) {
2485
+ resolve();
2486
+ }
2487
+ setTimeout(function() {
2488
+ if (!settled) {
2489
+ settled = true;
2490
+ resolve();
2491
+ }
2492
+ }, timeoutMs);
2493
+ }));
2494
+ }
2495
+ var uspApi = window.__uspapi;
2496
+ if (typeof uspApi === "function") {
2497
+ tasks.push(new Promise(function(resolve) {
2498
+ try {
2499
+ uspApi("getUSPData", 1, function(data, success) {
2500
+ if (success && typeof (data === null || data === void 0 ? void 0 : data.uspString) === "string" && data.uspString) {
2501
+ signals.usPrivacy = data.uspString;
2502
+ }
2503
+ resolve();
2504
+ });
2505
+ } catch (unused) {
2506
+ resolve();
2507
+ }
2508
+ setTimeout(resolve, timeoutMs);
2509
+ }));
2510
+ }
2511
+ if (tasks.length === 0) {
2512
+ return Promise.resolve(signals);
2513
+ }
2514
+ return Promise.all(tasks).then(function() {
2515
+ return signals;
2516
+ });
2517
+ }
2279
2518
  // src/utils/browserCompat.ts
2280
2519
  function getChromeVersion(ua) {
2281
2520
  var match = ua.match(/Chrome\/(\d+)/);
@@ -2501,6 +2740,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2501
2740
  this.preloadPoolLoopRunning = false;
2502
2741
  this.adDetectSentForCurrentBreak = false;
2503
2742
  this.palPlaybackStarted = false;
2743
+ this.streamCorrelator = generateCorrelator();
2744
+ this.consentSignals = {};
2745
+ this.podCounter = 0;
2746
+ this.podAssignedByPrefetch = false;
2747
+ this.adRequestPositionInBreak = 0;
2504
2748
  this.continuousFetchLoopRunning = false;
2505
2749
  initializePolyfills();
2506
2750
  var browserOverrides = getBrowserConfigOverrides();
@@ -2573,6 +2817,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2573
2817
  adWillPlayMuted: !!this.config.muted,
2574
2818
  continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
2575
2819
  }).catch(function() {});
2820
+ fetchConsentSignals().then(function(signals) {
2821
+ _this.consentSignals = signals;
2822
+ }).catch(function() {});
2576
2823
  this.initializeTracking();
2577
2824
  if (!this.shouldUseNativeHls()) return [
2578
2825
  3,
@@ -4869,25 +5116,35 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4869
5116
  return this.getRemainingAdMs();
4870
5117
  }
4871
5118
  },
5119
+ {
5120
+ key: "beginNewAdPod",
5121
+ value: function beginNewAdPod() {
5122
+ this.podCounter++;
5123
+ this.adRequestPositionInBreak = 0;
5124
+ }
5125
+ },
4872
5126
  {
4873
5127
  key: "generateVastUrlsWithCorrelators",
4874
5128
  value: function generateVastUrlsWithCorrelators(baseUrl, count) {
4875
5129
  var urls = [];
4876
- var baseTimestamp = Date.now();
4877
5130
  for(var i = 0; i < count; i++){
4878
- var timestamp = baseTimestamp + i;
4879
- var random = Math.floor(Math.random() * 1e12);
4880
- var uniqueCorrelator = "".concat(timestamp, "_").concat(random, "_").concat(i);
4881
- var urlWithCorrelator = void 0;
4882
- var correlatorRegex = /([?&])correlator=([^&]*)/;
4883
- if (correlatorRegex.test(baseUrl)) {
4884
- urlWithCorrelator = baseUrl.replace(correlatorRegex, "$1correlator=".concat(uniqueCorrelator));
4885
- } else if (baseUrl.includes("?")) {
4886
- urlWithCorrelator = "".concat(baseUrl, "&correlator=").concat(uniqueCorrelator);
4887
- } else {
4888
- urlWithCorrelator = "".concat(baseUrl, "?correlator=").concat(uniqueCorrelator);
4889
- }
4890
- urls.push(this.palNonce.injectNonce(urlWithCorrelator));
5131
+ this.adRequestPositionInBreak++;
5132
+ var adWillPlayMuted = this.inAdBreak ? this.adPlayer.getOriginalMutedState() : this.video.muted;
5133
+ var urlWithMacros = applyVastMacros(baseUrl, {
5134
+ correlator: generateCorrelator(),
5135
+ streamCorrelator: this.streamCorrelator,
5136
+ pod: this.podCounter > 0 ? this.podCounter : void 0,
5137
+ adPosition: this.adRequestPositionInBreak,
5138
+ pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
5139
+ adWillPlayMuted: adWillPlayMuted,
5140
+ adWillAutoPlay: !!this.config.autoplay,
5141
+ deviceId: this.config.deviceId,
5142
+ deviceIdType: this.config.deviceIdType,
5143
+ limitAdTracking: this.config.limitAdTracking,
5144
+ adTest: this.config.adTest,
5145
+ consent: this.consentSignals
5146
+ });
5147
+ urls.push(this.palNonce.injectNonce(urlWithMacros));
4891
5148
  }
4892
5149
  return urls;
4893
5150
  }
@@ -4957,6 +5214,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4957
5214
  }
4958
5215
  return;
4959
5216
  }
5217
+ this.beginNewAdPod();
5218
+ this.podAssignedByPrefetch = true;
4960
5219
  var urlsToPregenerate = 5;
4961
5220
  var generatedUrls = this.generateVastUrlsWithCorrelators(baseVastUrl, urlsToPregenerate);
4962
5221
  this.pendingAdBreak = _object_spread_props(_object_spread({
@@ -4994,6 +5253,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4994
5253
  }
4995
5254
  this.pendingAdBreak = null;
4996
5255
  this.pendingScte35CueKey = void 0;
5256
+ this.podAssignedByPrefetch = false;
4997
5257
  }
4998
5258
  },
4999
5259
  {
@@ -5430,6 +5690,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5430
5690
  this.continuousFetchingActive = true;
5431
5691
  this.isShowingPlaceholder = false;
5432
5692
  this.totalAdRequestsInBreak = 0;
5693
+ if (this.podAssignedByPrefetch) {
5694
+ this.podAssignedByPrefetch = false;
5695
+ } else {
5696
+ this.beginNewAdPod();
5697
+ }
5433
5698
  currentMuted = this.video.muted;
5434
5699
  currentVolume = this.video.volume;
5435
5700
  this.adPlayer.updateOriginalMutedState(currentMuted, currentVolume);