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.
package/lib/index.cjs CHANGED
@@ -586,6 +586,7 @@ var import_react = __toESM(require("react"), 1);
586
586
  var import_hls2 = __toESM(require("hls.js"), 1);
587
587
  // src/sdk/hlsAdPlayer.ts
588
588
  var import_hls = __toESM(require("hls.js"), 1);
589
+ var MAX_VAST_WRAPPER_DEPTH = 5;
589
590
  function createHlsAdPlayer(contentVideo, options) {
590
591
  var adPlaying = false;
591
592
  var originalMutedState = false;
@@ -743,25 +744,91 @@ function createHlsAdPlayer(contentVideo, options) {
743
744
  var url = mediaFile.url.toLowerCase();
744
745
  return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
745
746
  }
747
+ function createEmptyTrackingUrls() {
748
+ return {
749
+ impression: [],
750
+ start: [],
751
+ firstQuartile: [],
752
+ midpoint: [],
753
+ thirdQuartile: [],
754
+ complete: [],
755
+ mute: [],
756
+ unmute: [],
757
+ pause: [],
758
+ resume: [],
759
+ fullscreen: [],
760
+ exitFullscreen: [],
761
+ skip: [],
762
+ error: []
763
+ };
764
+ }
765
+ function extractTrackingUrls(xmlDoc) {
766
+ var trackingUrls = createEmptyTrackingUrls();
767
+ xmlDoc.querySelectorAll("Impression").forEach(function(el) {
768
+ var _el_textContent;
769
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
770
+ if (url) trackingUrls.impression.push(url);
771
+ });
772
+ xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
773
+ var _el_textContent;
774
+ var event = el.getAttribute("event");
775
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
776
+ if (event && url) {
777
+ var eventKey = event;
778
+ if (trackingUrls[eventKey]) {
779
+ trackingUrls[eventKey].push(url);
780
+ }
781
+ }
782
+ });
783
+ xmlDoc.querySelectorAll("Error").forEach(function(el) {
784
+ var _el_textContent;
785
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
786
+ if (url) trackingUrls.error.push(url);
787
+ });
788
+ return trackingUrls;
789
+ }
790
+ function mergeTrackingUrls(target, source) {
791
+ Object.keys(target).forEach(function(key) {
792
+ if (source[key] && source[key].length > 0) {
793
+ target[key] = target[key].concat(source[key]);
794
+ }
795
+ });
796
+ return target;
797
+ }
746
798
  function parseVastXml(xmlString) {
747
799
  try {
748
- var _xmlDoc_querySelector, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector2;
800
+ var _xmlDoc_querySelector, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent1, _xmlDoc_querySelector2, _xmlDoc_querySelector3;
749
801
  var parser = new DOMParser();
750
802
  var xmlDoc = parser.parseFromString(xmlString, "text/xml");
751
803
  var parserError = xmlDoc.querySelector("parsererror");
752
804
  if (parserError) {
753
805
  console.error("[HlsAdPlayer] XML parsing error (malformed VAST XML):", parserError.textContent);
754
- return null;
806
+ return {
807
+ type: "empty"
808
+ };
755
809
  }
756
810
  var adElement = xmlDoc.querySelector("Ad");
757
811
  if (!adElement) {
758
812
  console.warn("[HlsAdPlayer] No Ad element found in VAST XML");
759
- return null;
813
+ return {
814
+ type: "empty"
815
+ };
760
816
  }
761
817
  var adId = adElement.getAttribute("id") || "unknown";
762
818
  var title = ((_xmlDoc_querySelector = xmlDoc.querySelector("AdTitle")) === null || _xmlDoc_querySelector === void 0 ? void 0 : _xmlDoc_querySelector.textContent) || "Ad";
819
+ 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();
820
+ 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();
821
+ if (wrapperUri) {
822
+ console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(wrapperUri));
823
+ return {
824
+ type: "wrapper",
825
+ vastAdTagUri: wrapperUri,
826
+ trackingUrls: extractTrackingUrls(xmlDoc),
827
+ clickThrough: clickThrough
828
+ };
829
+ }
763
830
  var isNoAdAvailable = adId === "empty" || title.toLowerCase().includes("no ad available") || title.toLowerCase() === "no ad available";
764
- var durationText = ((_xmlDoc_querySelector1 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector1 === void 0 ? void 0 : _xmlDoc_querySelector1.textContent) || "00:00:30";
831
+ var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
765
832
  var durationParts = durationText.split(":");
766
833
  var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
767
834
  var mediaFileElements = xmlDoc.querySelectorAll("MediaFile");
@@ -801,57 +868,31 @@ function createHlsAdPlayer(contentVideo, options) {
801
868
  } else {
802
869
  console.warn("[HlsAdPlayer] No supported media files found in VAST XML");
803
870
  }
804
- return null;
871
+ return {
872
+ type: "empty"
873
+ };
805
874
  }
806
- var trackingUrls = {
807
- impression: [],
808
- start: [],
809
- firstQuartile: [],
810
- midpoint: [],
811
- thirdQuartile: [],
812
- complete: [],
813
- mute: [],
814
- unmute: [],
815
- pause: [],
816
- resume: [],
817
- fullscreen: [],
818
- exitFullscreen: [],
819
- skip: [],
820
- error: []
821
- };
822
- xmlDoc.querySelectorAll("Impression").forEach(function(el) {
823
- var _el_textContent;
824
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
825
- if (url) trackingUrls.impression.push(url);
826
- });
827
- xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
828
- var _el_textContent;
829
- var event = el.getAttribute("event");
830
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
831
- if (event && url) {
832
- var eventKey = event;
833
- if (trackingUrls[eventKey]) {
834
- trackingUrls[eventKey].push(url);
835
- }
836
- }
837
- });
838
- 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();
839
875
  return {
840
- id: adId,
841
- title: title,
842
- duration: duration,
843
- mediaFiles: mediaFiles,
844
- trackingUrls: trackingUrls,
845
- clickThrough: clickThrough
876
+ type: "inline",
877
+ ad: {
878
+ id: adId,
879
+ title: title,
880
+ duration: duration,
881
+ mediaFiles: mediaFiles,
882
+ trackingUrls: extractTrackingUrls(xmlDoc),
883
+ clickThrough: clickThrough
884
+ }
846
885
  };
847
886
  } catch (error) {
848
887
  console.error("[HlsAdPlayer] Error parsing VAST XML:", error);
849
- return null;
888
+ return {
889
+ type: "empty"
890
+ };
850
891
  }
851
892
  }
852
- function fetchAndParseVastAd(vastTagUrl) {
893
+ function fetchVastXml(vastTagUrl) {
853
894
  return _async_to_generator(function() {
854
- var response, vastXml;
895
+ var response;
855
896
  return _ts_generator(this, function(_state) {
856
897
  switch(_state.label){
857
898
  case 0:
@@ -872,20 +913,58 @@ function createHlsAdPlayer(contentVideo, options) {
872
913
  throw new Error("Failed to fetch VAST: ".concat(response.statusText));
873
914
  }
874
915
  return [
875
- 4,
916
+ 2,
876
917
  response.text()
877
918
  ];
878
- case 2:
919
+ }
920
+ });
921
+ })();
922
+ }
923
+ function fetchAndParseVastAd(_0) {
924
+ return _async_to_generator(function(vastTagUrl) {
925
+ var depth, accumulatedTracking, vastXml, parsed;
926
+ var _arguments = arguments;
927
+ return _ts_generator(this, function(_state) {
928
+ switch(_state.label){
929
+ case 0:
930
+ depth = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : 0, accumulatedTracking = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : createEmptyTrackingUrls();
931
+ return [
932
+ 4,
933
+ fetchVastXml(vastTagUrl)
934
+ ];
935
+ case 1:
879
936
  vastXml = _state.sent();
880
937
  console.log("[HlsAdPlayer] VAST XML received");
881
938
  console.log("[HlsAdPlayer] VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
939
+ parsed = parseVastXml(vastXml);
940
+ if (parsed.type === "empty") {
941
+ return [
942
+ 2,
943
+ null
944
+ ];
945
+ }
946
+ if (parsed.type === "wrapper") {
947
+ if (depth >= MAX_VAST_WRAPPER_DEPTH) {
948
+ console.warn("[HlsAdPlayer] VAST wrapper depth limit (".concat(MAX_VAST_WRAPPER_DEPTH, ") reached, aborting redirect chain"));
949
+ return [
950
+ 2,
951
+ null
952
+ ];
953
+ }
954
+ mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);
955
+ return [
956
+ 2,
957
+ fetchAndParseVastAd(parsed.vastAdTagUri, depth + 1, accumulatedTracking)
958
+ ];
959
+ }
960
+ mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);
882
961
  return [
883
962
  2,
884
- parseVastXml(vastXml)
963
+ parsed.ad
885
964
  ];
886
965
  }
887
966
  });
888
- })();
967
+ }).apply(this, arguments);
889
968
  }
890
969
  function createAdVideoElement() {
891
970
  var video = document.createElement("video");
@@ -2448,6 +2527,166 @@ function initializePolyfills() {
2448
2527
  polyfillTextEncoder();
2449
2528
  polyfillPromiseFinally();
2450
2529
  }
2530
+ // src/utils/vastMacros.ts
2531
+ function generateCorrelator() {
2532
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
2533
+ try {
2534
+ var _buf_, _buf_1;
2535
+ var buf = new Uint32Array(2);
2536
+ crypto.getRandomValues(buf);
2537
+ 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);
2538
+ if (value > 0) {
2539
+ return String(value);
2540
+ }
2541
+ } catch (unused) {}
2542
+ }
2543
+ return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
2544
+ }
2545
+ var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
2546
+ function applyVastMacros(baseUrl, ctx) {
2547
+ var url;
2548
+ try {
2549
+ url = new URL(baseUrl);
2550
+ } catch (unused) {
2551
+ return replaceCorrelatorFallback(baseUrl, ctx.correlator);
2552
+ }
2553
+ var params = url.searchParams;
2554
+ params.set("correlator", ctx.correlator);
2555
+ params.set("scor", ctx.streamCorrelator);
2556
+ if (ctx.pod != null) {
2557
+ params.set("pod", String(ctx.pod));
2558
+ }
2559
+ if (ctx.adPosition != null) {
2560
+ params.set("ppos", String(ctx.adPosition));
2561
+ }
2562
+ if (ctx.pageUrl) {
2563
+ params.set("url", ctx.pageUrl);
2564
+ params.set("description_url", ctx.pageUrl);
2565
+ }
2566
+ if (ctx.adWillPlayMuted != null) {
2567
+ params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
2568
+ }
2569
+ if (ctx.adWillAutoPlay != null) {
2570
+ params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
2571
+ }
2572
+ if (ctx.deviceId && ctx.deviceIdType) {
2573
+ params.set("rdid", ctx.deviceId);
2574
+ params.set("idtype", ctx.deviceIdType);
2575
+ params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
2576
+ } else {
2577
+ params.delete("rdid");
2578
+ params.delete("idtype");
2579
+ params.delete("is_lat");
2580
+ }
2581
+ var consent = ctx.consent;
2582
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
2583
+ params.set("gdpr", consent.gdpr);
2584
+ }
2585
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
2586
+ params.set("gdpr_consent", consent.gdprConsent);
2587
+ }
2588
+ if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
2589
+ params.set("us_privacy", consent.usPrivacy);
2590
+ }
2591
+ if (ctx.adTest) {
2592
+ params.set("adtest", "on");
2593
+ }
2594
+ var staleKeys = [];
2595
+ params.forEach(function(value, key) {
2596
+ if (UNEXPANDED_MACRO_PATTERN.test(value)) {
2597
+ staleKeys.push(key);
2598
+ }
2599
+ });
2600
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2601
+ try {
2602
+ for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2603
+ var key = _step.value;
2604
+ params.delete(key);
2605
+ }
2606
+ } catch (err) {
2607
+ _didIteratorError = true;
2608
+ _iteratorError = err;
2609
+ } finally{
2610
+ try {
2611
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2612
+ _iterator.return();
2613
+ }
2614
+ } finally{
2615
+ if (_didIteratorError) {
2616
+ throw _iteratorError;
2617
+ }
2618
+ }
2619
+ }
2620
+ return url.toString();
2621
+ }
2622
+ function replaceCorrelatorFallback(baseUrl, correlator) {
2623
+ var correlatorRegex = /([?&])correlator=([^&]*)/;
2624
+ if (correlatorRegex.test(baseUrl)) {
2625
+ return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
2626
+ }
2627
+ var sep = baseUrl.includes("?") ? "&" : "?";
2628
+ return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
2629
+ }
2630
+ function fetchConsentSignals() {
2631
+ var timeoutMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1500;
2632
+ var signals = {};
2633
+ if (typeof window === "undefined") {
2634
+ return Promise.resolve(signals);
2635
+ }
2636
+ var tasks = [];
2637
+ var tcfApi = window.__tcfapi;
2638
+ if (typeof tcfApi === "function") {
2639
+ tasks.push(new Promise(function(resolve) {
2640
+ var settled = false;
2641
+ try {
2642
+ tcfApi("addEventListener", 2, function(tcData, success) {
2643
+ if (settled) return;
2644
+ if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
2645
+ settled = true;
2646
+ signals.gdpr = tcData.gdprApplies ? "1" : "0";
2647
+ if (typeof tcData.tcString === "string" && tcData.tcString) {
2648
+ signals.gdprConsent = tcData.tcString;
2649
+ }
2650
+ try {
2651
+ tcfApi("removeEventListener", 2, function() {}, tcData.listenerId);
2652
+ } catch (unused) {}
2653
+ resolve();
2654
+ }
2655
+ });
2656
+ } catch (unused) {
2657
+ resolve();
2658
+ }
2659
+ setTimeout(function() {
2660
+ if (!settled) {
2661
+ settled = true;
2662
+ resolve();
2663
+ }
2664
+ }, timeoutMs);
2665
+ }));
2666
+ }
2667
+ var uspApi = window.__uspapi;
2668
+ if (typeof uspApi === "function") {
2669
+ tasks.push(new Promise(function(resolve) {
2670
+ try {
2671
+ uspApi("getUSPData", 1, function(data, success) {
2672
+ if (success && typeof (data === null || data === void 0 ? void 0 : data.uspString) === "string" && data.uspString) {
2673
+ signals.usPrivacy = data.uspString;
2674
+ }
2675
+ resolve();
2676
+ });
2677
+ } catch (unused) {
2678
+ resolve();
2679
+ }
2680
+ setTimeout(resolve, timeoutMs);
2681
+ }));
2682
+ }
2683
+ if (tasks.length === 0) {
2684
+ return Promise.resolve(signals);
2685
+ }
2686
+ return Promise.all(tasks).then(function() {
2687
+ return signals;
2688
+ });
2689
+ }
2451
2690
  // src/utils/browserCompat.ts
2452
2691
  function getChromeVersion(ua) {
2453
2692
  var match = ua.match(/Chrome\/(\d+)/);
@@ -2696,6 +2935,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2696
2935
  this.preloadPoolLoopRunning = false;
2697
2936
  this.adDetectSentForCurrentBreak = false;
2698
2937
  this.palPlaybackStarted = false;
2938
+ this.streamCorrelator = generateCorrelator();
2939
+ this.consentSignals = {};
2940
+ this.podCounter = 0;
2941
+ this.podAssignedByPrefetch = false;
2942
+ this.adRequestPositionInBreak = 0;
2699
2943
  this.continuousFetchLoopRunning = false;
2700
2944
  initializePolyfills();
2701
2945
  var browserOverrides = getBrowserConfigOverrides();
@@ -2768,6 +3012,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2768
3012
  adWillPlayMuted: !!this.config.muted,
2769
3013
  continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
2770
3014
  }).catch(function() {});
3015
+ fetchConsentSignals().then(function(signals) {
3016
+ _this.consentSignals = signals;
3017
+ }).catch(function() {});
2771
3018
  this.initializeTracking();
2772
3019
  if (!this.shouldUseNativeHls()) return [
2773
3020
  3,
@@ -5064,25 +5311,35 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5064
5311
  return this.getRemainingAdMs();
5065
5312
  }
5066
5313
  },
5314
+ {
5315
+ key: "beginNewAdPod",
5316
+ value: function beginNewAdPod() {
5317
+ this.podCounter++;
5318
+ this.adRequestPositionInBreak = 0;
5319
+ }
5320
+ },
5067
5321
  {
5068
5322
  key: "generateVastUrlsWithCorrelators",
5069
5323
  value: function generateVastUrlsWithCorrelators(baseUrl, count) {
5070
5324
  var urls = [];
5071
- var baseTimestamp = Date.now();
5072
5325
  for(var i = 0; i < count; i++){
5073
- var timestamp = baseTimestamp + i;
5074
- var random = Math.floor(Math.random() * 1e12);
5075
- var uniqueCorrelator = "".concat(timestamp, "_").concat(random, "_").concat(i);
5076
- var urlWithCorrelator = void 0;
5077
- var correlatorRegex = /([?&])correlator=([^&]*)/;
5078
- if (correlatorRegex.test(baseUrl)) {
5079
- urlWithCorrelator = baseUrl.replace(correlatorRegex, "$1correlator=".concat(uniqueCorrelator));
5080
- } else if (baseUrl.includes("?")) {
5081
- urlWithCorrelator = "".concat(baseUrl, "&correlator=").concat(uniqueCorrelator);
5082
- } else {
5083
- urlWithCorrelator = "".concat(baseUrl, "?correlator=").concat(uniqueCorrelator);
5084
- }
5085
- urls.push(this.palNonce.injectNonce(urlWithCorrelator));
5326
+ this.adRequestPositionInBreak++;
5327
+ var adWillPlayMuted = this.inAdBreak ? this.adPlayer.getOriginalMutedState() : this.video.muted;
5328
+ var urlWithMacros = applyVastMacros(baseUrl, {
5329
+ correlator: generateCorrelator(),
5330
+ streamCorrelator: this.streamCorrelator,
5331
+ pod: this.podCounter > 0 ? this.podCounter : void 0,
5332
+ adPosition: this.adRequestPositionInBreak,
5333
+ pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
5334
+ adWillPlayMuted: adWillPlayMuted,
5335
+ adWillAutoPlay: !!this.config.autoplay,
5336
+ deviceId: this.config.deviceId,
5337
+ deviceIdType: this.config.deviceIdType,
5338
+ limitAdTracking: this.config.limitAdTracking,
5339
+ adTest: this.config.adTest,
5340
+ consent: this.consentSignals
5341
+ });
5342
+ urls.push(this.palNonce.injectNonce(urlWithMacros));
5086
5343
  }
5087
5344
  return urls;
5088
5345
  }
@@ -5152,6 +5409,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5152
5409
  }
5153
5410
  return;
5154
5411
  }
5412
+ this.beginNewAdPod();
5413
+ this.podAssignedByPrefetch = true;
5155
5414
  var urlsToPregenerate = 5;
5156
5415
  var generatedUrls = this.generateVastUrlsWithCorrelators(baseVastUrl, urlsToPregenerate);
5157
5416
  this.pendingAdBreak = _object_spread_props(_object_spread({
@@ -5189,6 +5448,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5189
5448
  }
5190
5449
  this.pendingAdBreak = null;
5191
5450
  this.pendingScte35CueKey = void 0;
5451
+ this.podAssignedByPrefetch = false;
5192
5452
  }
5193
5453
  },
5194
5454
  {
@@ -5625,6 +5885,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5625
5885
  this.continuousFetchingActive = true;
5626
5886
  this.isShowingPlaceholder = false;
5627
5887
  this.totalAdRequestsInBreak = 0;
5888
+ if (this.podAssignedByPrefetch) {
5889
+ this.podAssignedByPrefetch = false;
5890
+ } else {
5891
+ this.beginNewAdPod();
5892
+ }
5628
5893
  currentMuted = this.video.muted;
5629
5894
  currentVolume = this.video.volume;
5630
5895
  this.adPlayer.updateOriginalMutedState(currentMuted, currentVolume);