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.
@@ -350,6 +350,7 @@ module.exports = __toCommonJS(StormcloudVideoPlayer_exports);
350
350
  var import_hls2 = __toESM(require("hls.js"), 1);
351
351
  // src/sdk/hlsAdPlayer.ts
352
352
  var import_hls = __toESM(require("hls.js"), 1);
353
+ var MAX_VAST_WRAPPER_DEPTH = 5;
353
354
  function createHlsAdPlayer(contentVideo, options) {
354
355
  var adPlaying = false;
355
356
  var originalMutedState = false;
@@ -507,25 +508,91 @@ function createHlsAdPlayer(contentVideo, options) {
507
508
  var url = mediaFile.url.toLowerCase();
508
509
  return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
509
510
  }
511
+ function createEmptyTrackingUrls() {
512
+ return {
513
+ impression: [],
514
+ start: [],
515
+ firstQuartile: [],
516
+ midpoint: [],
517
+ thirdQuartile: [],
518
+ complete: [],
519
+ mute: [],
520
+ unmute: [],
521
+ pause: [],
522
+ resume: [],
523
+ fullscreen: [],
524
+ exitFullscreen: [],
525
+ skip: [],
526
+ error: []
527
+ };
528
+ }
529
+ function extractTrackingUrls(xmlDoc) {
530
+ var trackingUrls = createEmptyTrackingUrls();
531
+ xmlDoc.querySelectorAll("Impression").forEach(function(el) {
532
+ var _el_textContent;
533
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
534
+ if (url) trackingUrls.impression.push(url);
535
+ });
536
+ xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
537
+ var _el_textContent;
538
+ var event = el.getAttribute("event");
539
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
540
+ if (event && url) {
541
+ var eventKey = event;
542
+ if (trackingUrls[eventKey]) {
543
+ trackingUrls[eventKey].push(url);
544
+ }
545
+ }
546
+ });
547
+ xmlDoc.querySelectorAll("Error").forEach(function(el) {
548
+ var _el_textContent;
549
+ var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
550
+ if (url) trackingUrls.error.push(url);
551
+ });
552
+ return trackingUrls;
553
+ }
554
+ function mergeTrackingUrls(target, source) {
555
+ Object.keys(target).forEach(function(key) {
556
+ if (source[key] && source[key].length > 0) {
557
+ target[key] = target[key].concat(source[key]);
558
+ }
559
+ });
560
+ return target;
561
+ }
510
562
  function parseVastXml(xmlString) {
511
563
  try {
512
- var _xmlDoc_querySelector, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector2;
564
+ var _xmlDoc_querySelector, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent1, _xmlDoc_querySelector2, _xmlDoc_querySelector3;
513
565
  var parser = new DOMParser();
514
566
  var xmlDoc = parser.parseFromString(xmlString, "text/xml");
515
567
  var parserError = xmlDoc.querySelector("parsererror");
516
568
  if (parserError) {
517
569
  console.error("[HlsAdPlayer] XML parsing error (malformed VAST XML):", parserError.textContent);
518
- return null;
570
+ return {
571
+ type: "empty"
572
+ };
519
573
  }
520
574
  var adElement = xmlDoc.querySelector("Ad");
521
575
  if (!adElement) {
522
576
  console.warn("[HlsAdPlayer] No Ad element found in VAST XML");
523
- return null;
577
+ return {
578
+ type: "empty"
579
+ };
524
580
  }
525
581
  var adId = adElement.getAttribute("id") || "unknown";
526
582
  var title = ((_xmlDoc_querySelector = xmlDoc.querySelector("AdTitle")) === null || _xmlDoc_querySelector === void 0 ? void 0 : _xmlDoc_querySelector.textContent) || "Ad";
583
+ 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();
584
+ 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();
585
+ if (wrapperUri) {
586
+ console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(wrapperUri));
587
+ return {
588
+ type: "wrapper",
589
+ vastAdTagUri: wrapperUri,
590
+ trackingUrls: extractTrackingUrls(xmlDoc),
591
+ clickThrough: clickThrough
592
+ };
593
+ }
527
594
  var isNoAdAvailable = adId === "empty" || title.toLowerCase().includes("no ad available") || title.toLowerCase() === "no ad available";
528
- var durationText = ((_xmlDoc_querySelector1 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector1 === void 0 ? void 0 : _xmlDoc_querySelector1.textContent) || "00:00:30";
595
+ var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
529
596
  var durationParts = durationText.split(":");
530
597
  var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
531
598
  var mediaFileElements = xmlDoc.querySelectorAll("MediaFile");
@@ -565,57 +632,31 @@ function createHlsAdPlayer(contentVideo, options) {
565
632
  } else {
566
633
  console.warn("[HlsAdPlayer] No supported media files found in VAST XML");
567
634
  }
568
- return null;
569
- }
570
- var trackingUrls = {
571
- impression: [],
572
- start: [],
573
- firstQuartile: [],
574
- midpoint: [],
575
- thirdQuartile: [],
576
- complete: [],
577
- mute: [],
578
- unmute: [],
579
- pause: [],
580
- resume: [],
581
- fullscreen: [],
582
- exitFullscreen: [],
583
- skip: [],
584
- error: []
585
- };
586
- xmlDoc.querySelectorAll("Impression").forEach(function(el) {
587
- var _el_textContent;
588
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
589
- if (url) trackingUrls.impression.push(url);
590
- });
591
- xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
592
- var _el_textContent;
593
- var event = el.getAttribute("event");
594
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
595
- if (event && url) {
596
- var eventKey = event;
597
- if (trackingUrls[eventKey]) {
598
- trackingUrls[eventKey].push(url);
599
- }
600
- }
601
- });
602
- 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();
635
+ return {
636
+ type: "empty"
637
+ };
638
+ }
603
639
  return {
604
- id: adId,
605
- title: title,
606
- duration: duration,
607
- mediaFiles: mediaFiles,
608
- trackingUrls: trackingUrls,
609
- clickThrough: clickThrough
640
+ type: "inline",
641
+ ad: {
642
+ id: adId,
643
+ title: title,
644
+ duration: duration,
645
+ mediaFiles: mediaFiles,
646
+ trackingUrls: extractTrackingUrls(xmlDoc),
647
+ clickThrough: clickThrough
648
+ }
610
649
  };
611
650
  } catch (error) {
612
651
  console.error("[HlsAdPlayer] Error parsing VAST XML:", error);
613
- return null;
652
+ return {
653
+ type: "empty"
654
+ };
614
655
  }
615
656
  }
616
- function fetchAndParseVastAd(vastTagUrl) {
657
+ function fetchVastXml(vastTagUrl) {
617
658
  return _async_to_generator(function() {
618
- var response, vastXml;
659
+ var response;
619
660
  return _ts_generator(this, function(_state) {
620
661
  switch(_state.label){
621
662
  case 0:
@@ -636,20 +677,58 @@ function createHlsAdPlayer(contentVideo, options) {
636
677
  throw new Error("Failed to fetch VAST: ".concat(response.statusText));
637
678
  }
638
679
  return [
639
- 4,
680
+ 2,
640
681
  response.text()
641
682
  ];
642
- case 2:
683
+ }
684
+ });
685
+ })();
686
+ }
687
+ function fetchAndParseVastAd(_0) {
688
+ return _async_to_generator(function(vastTagUrl) {
689
+ var depth, accumulatedTracking, vastXml, parsed;
690
+ var _arguments = arguments;
691
+ return _ts_generator(this, function(_state) {
692
+ switch(_state.label){
693
+ case 0:
694
+ depth = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : 0, accumulatedTracking = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : createEmptyTrackingUrls();
695
+ return [
696
+ 4,
697
+ fetchVastXml(vastTagUrl)
698
+ ];
699
+ case 1:
643
700
  vastXml = _state.sent();
644
701
  console.log("[HlsAdPlayer] VAST XML received");
645
702
  console.log("[HlsAdPlayer] VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
703
+ parsed = parseVastXml(vastXml);
704
+ if (parsed.type === "empty") {
705
+ return [
706
+ 2,
707
+ null
708
+ ];
709
+ }
710
+ if (parsed.type === "wrapper") {
711
+ if (depth >= MAX_VAST_WRAPPER_DEPTH) {
712
+ console.warn("[HlsAdPlayer] VAST wrapper depth limit (".concat(MAX_VAST_WRAPPER_DEPTH, ") reached, aborting redirect chain"));
713
+ return [
714
+ 2,
715
+ null
716
+ ];
717
+ }
718
+ mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);
719
+ return [
720
+ 2,
721
+ fetchAndParseVastAd(parsed.vastAdTagUri, depth + 1, accumulatedTracking)
722
+ ];
723
+ }
724
+ mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);
646
725
  return [
647
726
  2,
648
- parseVastXml(vastXml)
727
+ parsed.ad
649
728
  ];
650
729
  }
651
730
  });
652
- })();
731
+ }).apply(this, arguments);
653
732
  }
654
733
  function createAdVideoElement() {
655
734
  var video = document.createElement("video");
@@ -2188,6 +2267,166 @@ function initializePolyfills() {
2188
2267
  polyfillTextEncoder();
2189
2268
  polyfillPromiseFinally();
2190
2269
  }
2270
+ // src/utils/vastMacros.ts
2271
+ function generateCorrelator() {
2272
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
2273
+ try {
2274
+ var _buf_, _buf_1;
2275
+ var buf = new Uint32Array(2);
2276
+ crypto.getRandomValues(buf);
2277
+ 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);
2278
+ if (value > 0) {
2279
+ return String(value);
2280
+ }
2281
+ } catch (unused) {}
2282
+ }
2283
+ return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
2284
+ }
2285
+ var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
2286
+ function applyVastMacros(baseUrl, ctx) {
2287
+ var url;
2288
+ try {
2289
+ url = new URL(baseUrl);
2290
+ } catch (unused) {
2291
+ return replaceCorrelatorFallback(baseUrl, ctx.correlator);
2292
+ }
2293
+ var params = url.searchParams;
2294
+ params.set("correlator", ctx.correlator);
2295
+ params.set("scor", ctx.streamCorrelator);
2296
+ if (ctx.pod != null) {
2297
+ params.set("pod", String(ctx.pod));
2298
+ }
2299
+ if (ctx.adPosition != null) {
2300
+ params.set("ppos", String(ctx.adPosition));
2301
+ }
2302
+ if (ctx.pageUrl) {
2303
+ params.set("url", ctx.pageUrl);
2304
+ params.set("description_url", ctx.pageUrl);
2305
+ }
2306
+ if (ctx.adWillPlayMuted != null) {
2307
+ params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
2308
+ }
2309
+ if (ctx.adWillAutoPlay != null) {
2310
+ params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
2311
+ }
2312
+ if (ctx.deviceId && ctx.deviceIdType) {
2313
+ params.set("rdid", ctx.deviceId);
2314
+ params.set("idtype", ctx.deviceIdType);
2315
+ params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
2316
+ } else {
2317
+ params.delete("rdid");
2318
+ params.delete("idtype");
2319
+ params.delete("is_lat");
2320
+ }
2321
+ var consent = ctx.consent;
2322
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
2323
+ params.set("gdpr", consent.gdpr);
2324
+ }
2325
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
2326
+ params.set("gdpr_consent", consent.gdprConsent);
2327
+ }
2328
+ if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
2329
+ params.set("us_privacy", consent.usPrivacy);
2330
+ }
2331
+ if (ctx.adTest) {
2332
+ params.set("adtest", "on");
2333
+ }
2334
+ var staleKeys = [];
2335
+ params.forEach(function(value, key) {
2336
+ if (UNEXPANDED_MACRO_PATTERN.test(value)) {
2337
+ staleKeys.push(key);
2338
+ }
2339
+ });
2340
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2341
+ try {
2342
+ for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2343
+ var key = _step.value;
2344
+ params.delete(key);
2345
+ }
2346
+ } catch (err) {
2347
+ _didIteratorError = true;
2348
+ _iteratorError = err;
2349
+ } finally{
2350
+ try {
2351
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2352
+ _iterator.return();
2353
+ }
2354
+ } finally{
2355
+ if (_didIteratorError) {
2356
+ throw _iteratorError;
2357
+ }
2358
+ }
2359
+ }
2360
+ return url.toString();
2361
+ }
2362
+ function replaceCorrelatorFallback(baseUrl, correlator) {
2363
+ var correlatorRegex = /([?&])correlator=([^&]*)/;
2364
+ if (correlatorRegex.test(baseUrl)) {
2365
+ return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
2366
+ }
2367
+ var sep = baseUrl.includes("?") ? "&" : "?";
2368
+ return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
2369
+ }
2370
+ function fetchConsentSignals() {
2371
+ var timeoutMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1500;
2372
+ var signals = {};
2373
+ if (typeof window === "undefined") {
2374
+ return Promise.resolve(signals);
2375
+ }
2376
+ var tasks = [];
2377
+ var tcfApi = window.__tcfapi;
2378
+ if (typeof tcfApi === "function") {
2379
+ tasks.push(new Promise(function(resolve) {
2380
+ var settled = false;
2381
+ try {
2382
+ tcfApi("addEventListener", 2, function(tcData, success) {
2383
+ if (settled) return;
2384
+ if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
2385
+ settled = true;
2386
+ signals.gdpr = tcData.gdprApplies ? "1" : "0";
2387
+ if (typeof tcData.tcString === "string" && tcData.tcString) {
2388
+ signals.gdprConsent = tcData.tcString;
2389
+ }
2390
+ try {
2391
+ tcfApi("removeEventListener", 2, function() {}, tcData.listenerId);
2392
+ } catch (unused) {}
2393
+ resolve();
2394
+ }
2395
+ });
2396
+ } catch (unused) {
2397
+ resolve();
2398
+ }
2399
+ setTimeout(function() {
2400
+ if (!settled) {
2401
+ settled = true;
2402
+ resolve();
2403
+ }
2404
+ }, timeoutMs);
2405
+ }));
2406
+ }
2407
+ var uspApi = window.__uspapi;
2408
+ if (typeof uspApi === "function") {
2409
+ tasks.push(new Promise(function(resolve) {
2410
+ try {
2411
+ uspApi("getUSPData", 1, function(data, success) {
2412
+ if (success && typeof (data === null || data === void 0 ? void 0 : data.uspString) === "string" && data.uspString) {
2413
+ signals.usPrivacy = data.uspString;
2414
+ }
2415
+ resolve();
2416
+ });
2417
+ } catch (unused) {
2418
+ resolve();
2419
+ }
2420
+ setTimeout(resolve, timeoutMs);
2421
+ }));
2422
+ }
2423
+ if (tasks.length === 0) {
2424
+ return Promise.resolve(signals);
2425
+ }
2426
+ return Promise.all(tasks).then(function() {
2427
+ return signals;
2428
+ });
2429
+ }
2191
2430
  // src/utils/browserCompat.ts
2192
2431
  function getChromeVersion(ua) {
2193
2432
  var match = ua.match(/Chrome\/(\d+)/);
@@ -2413,6 +2652,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2413
2652
  this.preloadPoolLoopRunning = false;
2414
2653
  this.adDetectSentForCurrentBreak = false;
2415
2654
  this.palPlaybackStarted = false;
2655
+ this.streamCorrelator = generateCorrelator();
2656
+ this.consentSignals = {};
2657
+ this.podCounter = 0;
2658
+ this.podAssignedByPrefetch = false;
2659
+ this.adRequestPositionInBreak = 0;
2416
2660
  this.continuousFetchLoopRunning = false;
2417
2661
  initializePolyfills();
2418
2662
  var browserOverrides = getBrowserConfigOverrides();
@@ -2485,6 +2729,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2485
2729
  adWillPlayMuted: !!this.config.muted,
2486
2730
  continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
2487
2731
  }).catch(function() {});
2732
+ fetchConsentSignals().then(function(signals) {
2733
+ _this.consentSignals = signals;
2734
+ }).catch(function() {});
2488
2735
  this.initializeTracking();
2489
2736
  if (!this.shouldUseNativeHls()) return [
2490
2737
  3,
@@ -4781,25 +5028,35 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4781
5028
  return this.getRemainingAdMs();
4782
5029
  }
4783
5030
  },
5031
+ {
5032
+ key: "beginNewAdPod",
5033
+ value: function beginNewAdPod() {
5034
+ this.podCounter++;
5035
+ this.adRequestPositionInBreak = 0;
5036
+ }
5037
+ },
4784
5038
  {
4785
5039
  key: "generateVastUrlsWithCorrelators",
4786
5040
  value: function generateVastUrlsWithCorrelators(baseUrl, count) {
4787
5041
  var urls = [];
4788
- var baseTimestamp = Date.now();
4789
5042
  for(var i = 0; i < count; i++){
4790
- var timestamp = baseTimestamp + i;
4791
- var random = Math.floor(Math.random() * 1e12);
4792
- var uniqueCorrelator = "".concat(timestamp, "_").concat(random, "_").concat(i);
4793
- var urlWithCorrelator = void 0;
4794
- var correlatorRegex = /([?&])correlator=([^&]*)/;
4795
- if (correlatorRegex.test(baseUrl)) {
4796
- urlWithCorrelator = baseUrl.replace(correlatorRegex, "$1correlator=".concat(uniqueCorrelator));
4797
- } else if (baseUrl.includes("?")) {
4798
- urlWithCorrelator = "".concat(baseUrl, "&correlator=").concat(uniqueCorrelator);
4799
- } else {
4800
- urlWithCorrelator = "".concat(baseUrl, "?correlator=").concat(uniqueCorrelator);
4801
- }
4802
- urls.push(this.palNonce.injectNonce(urlWithCorrelator));
5043
+ this.adRequestPositionInBreak++;
5044
+ var adWillPlayMuted = this.inAdBreak ? this.adPlayer.getOriginalMutedState() : this.video.muted;
5045
+ var urlWithMacros = applyVastMacros(baseUrl, {
5046
+ correlator: generateCorrelator(),
5047
+ streamCorrelator: this.streamCorrelator,
5048
+ pod: this.podCounter > 0 ? this.podCounter : void 0,
5049
+ adPosition: this.adRequestPositionInBreak,
5050
+ pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
5051
+ adWillPlayMuted: adWillPlayMuted,
5052
+ adWillAutoPlay: !!this.config.autoplay,
5053
+ deviceId: this.config.deviceId,
5054
+ deviceIdType: this.config.deviceIdType,
5055
+ limitAdTracking: this.config.limitAdTracking,
5056
+ adTest: this.config.adTest,
5057
+ consent: this.consentSignals
5058
+ });
5059
+ urls.push(this.palNonce.injectNonce(urlWithMacros));
4803
5060
  }
4804
5061
  return urls;
4805
5062
  }
@@ -4869,6 +5126,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4869
5126
  }
4870
5127
  return;
4871
5128
  }
5129
+ this.beginNewAdPod();
5130
+ this.podAssignedByPrefetch = true;
4872
5131
  var urlsToPregenerate = 5;
4873
5132
  var generatedUrls = this.generateVastUrlsWithCorrelators(baseVastUrl, urlsToPregenerate);
4874
5133
  this.pendingAdBreak = _object_spread_props(_object_spread({
@@ -4906,6 +5165,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4906
5165
  }
4907
5166
  this.pendingAdBreak = null;
4908
5167
  this.pendingScte35CueKey = void 0;
5168
+ this.podAssignedByPrefetch = false;
4909
5169
  }
4910
5170
  },
4911
5171
  {
@@ -5342,6 +5602,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5342
5602
  this.continuousFetchingActive = true;
5343
5603
  this.isShowingPlaceholder = false;
5344
5604
  this.totalAdRequestsInBreak = 0;
5605
+ if (this.podAssignedByPrefetch) {
5606
+ this.podAssignedByPrefetch = false;
5607
+ } else {
5608
+ this.beginNewAdPod();
5609
+ }
5345
5610
  currentMuted = this.video.muted;
5346
5611
  currentVolume = this.video.volume;
5347
5612
  this.adPlayer.updateOriginalMutedState(currentMuted, currentVolume);