stormcloud-video-player 0.8.33 → 0.8.35
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/dist/stormcloud-vp.min.js +1 -1
- package/lib/index.cjs +143 -19
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +2 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +143 -19
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +36 -16
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +3 -7
- package/lib/player/AdConfigManager.cjs +36 -1
- package/lib/player/AdConfigManager.cjs.map +1 -1
- package/lib/player/AdConfigManager.d.cts +1 -1
- package/lib/player/AdTimingService.d.cts +1 -1
- package/lib/player/HlsEngine.d.cts +1 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +143 -19
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/HlsPlayer.cjs +143 -19
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +143 -19
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +62 -0
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/sdk/pal.cjs +38 -2
- package/lib/sdk/pal.cjs.map +1 -1
- package/lib/{types-CSHvCbhZ.d.cts → types-cTqIKw_D.d.cts} +1 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +143 -19
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/browserCompat.cjs +1 -0
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/browserCompat.d.cts +1 -0
- package/lib/utils/devUrl.cjs +102 -0
- package/lib/utils/devUrl.cjs.map +1 -0
- package/lib/utils/devUrl.d.cts +4 -0
- package/lib/utils/tracking.d.cts +1 -1
- package/package.json +1 -1
package/lib/sdk/pal.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/pal.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YACIA,IAAAA,CAAAA,KAAYC,OAAOC,IAAAA,CAAAA,SAAc,GAAA,OAAA;YACjCC,IAAAA,aAAmBF,OAAOG,wBAAwB;gBAClDC,IAAAA,MAAAA,IAAoBJ,IAAAA,GAAOK,mBAAmB;gBAC9CC,IAAAA,OAAeN,KAAAA,CAAAA,CAAOO,KAAAA,CAAAA,GAAS,CAACC,cAAc;gBAC9CC,IAAAA,GAAW,SAAA,CAAA,GAAA,CAAA,IAACC,IAAAA,IAAQC;gBACjB,IAAIC,GAAAA,IAAAA,CAAQD,IACfZ,GAAAA,OAAUW,QAAQE,MAAM;cAAEC,KAAKF,UAAAA,EAAG,CAACC,KAAK;gBAAEE,IAAAA,OAAAA,CAAY,UAAA,OAAA,CAAA,qBAAA,IAAA,OAAA,CAAA,SAAA;gBAAK,IAAA,MAAA,KAAA,QAAA,CAAA,OAAA,MAAA;gBAC/D,OAAA,GAAA,OAAA,MAAA,OAAA,KAAA,SAAA,OAAA,mBAAA;YACIC,YAAc,qBAACC,IAAIC,MAAMC,QAAQC;QACnC,IAAIF,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;4CAC7D,kCAAA,2BAAA;;;+BAAA,IAAIG,KACP,CADG,GACC,CAACd,aAAae,IAAI,CAACL,IAAII,QAAQA,QAAQF,QACzCnB,UAAUiB,IAAII,KAAK;wBAAEP,KAAK,SAALA;mCAAWI,IAAI,CAACG,IAAI;;sGAAEN,QAAAA,GAAY,CAAEK,CAAAA,OAAOjB,GAAAA,cAAiBe,MAAMG,IAAG,KAAMD,KAAKL,UAAU;+BAAC;gBAFpH,QAAK,YAAWV,kBAAkBa,0BAA7B,SAAA,6BAAA,QAAA,yBAAA;;kBAAA;8FAAA,gBAAA,WAAA;;yBAAA,6BAAA;8CAAA,CAAA;;;mCAAA,eAAA;;;;YAGP,sBAAA,KAAA;QACA,OAAOD;IACT;AACA,IAAIM,eAAe,sBAACC;WAAQR,YAAYhB,UAAU,CAAC,GAAG,cAAc,UAAA;QAAEyB,KAAAA,EAAO,KAAA,GAAA;6BAAK,IAAID","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/sdk/pal.ts\nvar pal_exports = {};\n__export(pal_exports, {\n createPalNonceManager: () => createPalNonceManager\n});\nmodule.exports = __toCommonJS(pal_exports);\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createPalNonceManager\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/pal.cjs","../../src/sdk/pal.ts","../../src/utils/devUrl.ts"],"names":["__getOwnPropDesc","Object","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","__defProp","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","pal_exports","createPalNonceManager","module","exports","PRIVATE_HOST_PATTERNS","isLocalDevHost","hostname","host","replace","toLowerCase","endsWith","some","pattern","test","toDevSafeUrl","rawUrl","url","URL","protocol"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/sdk/pal.ts\nvar pal_exports = {};\n__export(pal_exports, {\n createPalNonceManager: () => createPalNonceManager\n});\nmodule.exports = __toCommonJS(pal_exports);\n\n// src/utils/devUrl.ts\nvar PRIVATE_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/\n];\nfunction isLocalDevHost(hostname) {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\nfunction toDevSafeUrl(rawUrl) {\n if (!rawUrl) return rawUrl ?? \"\";\n let url;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createPalNonceManager\n});\n","import { toDevSafeUrl } from \"../utils/devUrl\";\n\ndeclare global {\n interface Window {\n goog?: any;\n }\n}\n\nconst PAL_SDK_URL =\n \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\n\nlet _nonceLoader: any | undefined;\nlet _palLoadPromise: Promise<void> | undefined;\n\nfunction loadPalSdk(): Promise<void> {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n\n if (_palLoadPromise) return _palLoadPromise;\n\n _palLoadPromise = new Promise<void>((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n ) as HTMLScriptElement | null;\n\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 10000\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n\n return _palLoadPromise;\n}\n\nfunction getOrCreateNonceLoader(): any {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\n\nexport interface PalNonceOptions {\n videoWidth?: number;\n videoHeight?: number;\n descriptionUrl?: string;\n ppid?: string;\n sessionId?: string;\n adWillAutoPlay?: boolean;\n adWillPlayMuted?: boolean;\n playerVolume?: number;\n continuousPlayback?: boolean;\n}\n\nexport interface PalNonceManager {\n generateNonce(options?: PalNonceOptions): Promise<string>;\n\n getCurrentNonce(): string;\n\n injectNonce(vastTagUrl: string): string;\n\n sendPlaybackStart(): void;\n\n sendPlaybackEnd(): void;\n\n sendAdClick(): void;\n\n sendAdTouch(event: MouseEvent | TouchEvent): void;\n\n reset(): void;\n}\n\nexport function createPalNonceManager(): PalNonceManager {\n let currentNonce = \"\";\n let currentNonceManager: any | undefined;\n\n return {\n async generateNonce(options: PalNonceOptions = {}): Promise<string> {\n try {\n await loadPalSdk();\n\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume =\n options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId,\n }, null, 2)\n );\n\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce() as string;\n\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = undefined;\n return \"\";\n }\n },\n\n getCurrentNonce(): string {\n return currentNonce;\n },\n\n injectNonce(vastTagUrl: string): string {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl\n .replace(/([?&])paln=[^&]*/g, \"\")\n .replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n\n sendPlaybackStart(): void {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {}\n },\n\n sendPlaybackEnd(): void {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {}\n },\n\n sendAdClick(): void {\n try {\n currentNonceManager?.sendAdClick();\n } catch {}\n },\n\n sendAdTouch(event: MouseEvent | TouchEvent): void {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {}\n },\n\n reset(): void {\n currentNonce = \"\";\n currentNonceManager = undefined;\n },\n };\n}\n","const PRIVATE_HOST_PATTERNS: RegExp[] = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/,\n];\n\nexport function isLocalDevHost(hostname: string): boolean {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\n\nexport function toDevSafeUrl(rawUrl: string | undefined): string {\n if (!rawUrl) return rawUrl ?? \"\";\n\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n"]}
|
|
@@ -405,6 +405,11 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
405
405
|
var preloadingAds = /* @__PURE__ */ new Map();
|
|
406
406
|
var destroyed = false;
|
|
407
407
|
var pendingTimeouts = [];
|
|
408
|
+
var STALL_TIMEOUT_MS = 4e3;
|
|
409
|
+
var STALL_CHECK_INTERVAL_MS = 1e3;
|
|
410
|
+
var stallWatchdogId;
|
|
411
|
+
var lastAdProgressTime = 0;
|
|
412
|
+
var lastAdProgressPosition = 0;
|
|
408
413
|
var trackingFired = {
|
|
409
414
|
impression: false,
|
|
410
415
|
start: false,
|
|
@@ -1037,6 +1042,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1037
1042
|
if (!adVideoElement || !currentAd) return;
|
|
1038
1043
|
adVideoElement.addEventListener("timeupdate", function() {
|
|
1039
1044
|
if (!currentAd || !adVideoElement) return;
|
|
1045
|
+
noteAdProgress();
|
|
1040
1046
|
var progress = adVideoElement.currentTime / currentAd.duration;
|
|
1041
1047
|
if (progress >= 0.25 && !trackingFired.firstQuartile) {
|
|
1042
1048
|
trackingFired.firstQuartile = true;
|
|
@@ -1052,6 +1058,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1052
1058
|
}
|
|
1053
1059
|
});
|
|
1054
1060
|
adVideoElement.addEventListener("playing", function() {
|
|
1061
|
+
startStallWatchdog();
|
|
1055
1062
|
if (!currentAd || trackingFired.start) return;
|
|
1056
1063
|
trackingFired.start = true;
|
|
1057
1064
|
fireTrackingPixels(currentAd.trackingUrls.start);
|
|
@@ -1192,8 +1199,52 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1192
1199
|
return false;
|
|
1193
1200
|
}
|
|
1194
1201
|
}
|
|
1202
|
+
function clearStallWatchdog() {
|
|
1203
|
+
if (stallWatchdogId != null) {
|
|
1204
|
+
clearInterval(stallWatchdogId);
|
|
1205
|
+
stallWatchdogId = void 0;
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
function noteAdProgress() {
|
|
1209
|
+
lastAdProgressTime = Date.now();
|
|
1210
|
+
if (adVideoElement) {
|
|
1211
|
+
lastAdProgressPosition = adVideoElement.currentTime;
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
function handleAdStall() {
|
|
1215
|
+
console.warn("[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame");
|
|
1216
|
+
clearStallWatchdog();
|
|
1217
|
+
if (currentAd) {
|
|
1218
|
+
fireTrackingPixels(currentAd.trackingUrls.error);
|
|
1219
|
+
}
|
|
1220
|
+
if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {
|
|
1221
|
+
return;
|
|
1222
|
+
}
|
|
1223
|
+
handleAdError();
|
|
1224
|
+
}
|
|
1225
|
+
function startStallWatchdog() {
|
|
1226
|
+
clearStallWatchdog();
|
|
1227
|
+
noteAdProgress();
|
|
1228
|
+
stallWatchdogId = window.setInterval(function() {
|
|
1229
|
+
if (!adPlaying || !adVideoElement) {
|
|
1230
|
+
return;
|
|
1231
|
+
}
|
|
1232
|
+
if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {
|
|
1233
|
+
noteAdProgress();
|
|
1234
|
+
return;
|
|
1235
|
+
}
|
|
1236
|
+
if (adVideoElement.paused) {
|
|
1237
|
+
noteAdProgress();
|
|
1238
|
+
return;
|
|
1239
|
+
}
|
|
1240
|
+
if (Date.now() - lastAdProgressTime >= STALL_TIMEOUT_MS) {
|
|
1241
|
+
handleAdStall();
|
|
1242
|
+
}
|
|
1243
|
+
}, STALL_CHECK_INTERVAL_MS);
|
|
1244
|
+
}
|
|
1195
1245
|
function handleAdComplete() {
|
|
1196
1246
|
console.log("[HlsAdPlayer] Handling ad completion");
|
|
1247
|
+
clearStallWatchdog();
|
|
1197
1248
|
adPlaying = false;
|
|
1198
1249
|
setAdPlayingFlag(false);
|
|
1199
1250
|
contentVideo.muted = true;
|
|
@@ -1201,6 +1252,10 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1201
1252
|
adContainerEl.style.display = "none";
|
|
1202
1253
|
adContainerEl.style.pointerEvents = "none";
|
|
1203
1254
|
}
|
|
1255
|
+
if (!(options === null || options === void 0 ? void 0 : options.continueLiveStreamDuringAds)) {
|
|
1256
|
+
contentVideo.style.visibility = "visible";
|
|
1257
|
+
contentVideo.style.opacity = "1";
|
|
1258
|
+
}
|
|
1204
1259
|
if (options === null || options === void 0 ? void 0 : options.continueLiveStreamDuringAds) {
|
|
1205
1260
|
if (contentVideo.paused) {
|
|
1206
1261
|
console.log("[HlsAdPlayer] Content video paused in live mode, resuming playback");
|
|
@@ -1213,6 +1268,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1213
1268
|
}
|
|
1214
1269
|
function handleAdError() {
|
|
1215
1270
|
console.log("[HlsAdPlayer] Handling ad error");
|
|
1271
|
+
clearStallWatchdog();
|
|
1216
1272
|
adPlaying = false;
|
|
1217
1273
|
setAdPlayingFlag(false);
|
|
1218
1274
|
contentVideo.muted = true;
|
|
@@ -1220,6 +1276,10 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1220
1276
|
adContainerEl.style.display = "none";
|
|
1221
1277
|
adContainerEl.style.pointerEvents = "none";
|
|
1222
1278
|
}
|
|
1279
|
+
if (!(options === null || options === void 0 ? void 0 : options.continueLiveStreamDuringAds)) {
|
|
1280
|
+
contentVideo.style.visibility = "visible";
|
|
1281
|
+
contentVideo.style.opacity = "1";
|
|
1282
|
+
}
|
|
1223
1283
|
emit("ad_error");
|
|
1224
1284
|
}
|
|
1225
1285
|
return {
|
|
@@ -1417,6 +1477,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1417
1477
|
var previousMutedState;
|
|
1418
1478
|
return _ts_generator(this, function(_state) {
|
|
1419
1479
|
console.log("[HlsAdPlayer] Stopping ad");
|
|
1480
|
+
clearStallWatchdog();
|
|
1420
1481
|
adPlaying = false;
|
|
1421
1482
|
setAdPlayingFlag(false);
|
|
1422
1483
|
previousMutedState = contentVideo.muted;
|
|
@@ -1455,6 +1516,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1455
1516
|
destroy: function destroy() {
|
|
1456
1517
|
console.log("[HlsAdPlayer] Destroying");
|
|
1457
1518
|
destroyed = true;
|
|
1519
|
+
clearStallWatchdog();
|
|
1458
1520
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1459
1521
|
try {
|
|
1460
1522
|
for(var _iterator = pendingTimeouts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
@@ -1599,6 +1661,41 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
1599
1661
|
}
|
|
1600
1662
|
};
|
|
1601
1663
|
}
|
|
1664
|
+
// src/utils/devUrl.ts
|
|
1665
|
+
var PRIVATE_HOST_PATTERNS = [
|
|
1666
|
+
/^localhost$/i,
|
|
1667
|
+
/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,
|
|
1668
|
+
/^0\.0\.0\.0$/,
|
|
1669
|
+
/^::1$/,
|
|
1670
|
+
/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,
|
|
1671
|
+
/^192\.168\.\d{1,3}\.\d{1,3}$/,
|
|
1672
|
+
/^172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}$/
|
|
1673
|
+
];
|
|
1674
|
+
function isLocalDevHost(hostname) {
|
|
1675
|
+
var host = hostname.replace(/^\[/, "").replace(/\]$/, "").toLowerCase();
|
|
1676
|
+
if (!host) return false;
|
|
1677
|
+
if (host.endsWith(".local") || host.endsWith(".localhost")) return true;
|
|
1678
|
+
return PRIVATE_HOST_PATTERNS.some(function(pattern) {
|
|
1679
|
+
return pattern.test(host);
|
|
1680
|
+
});
|
|
1681
|
+
}
|
|
1682
|
+
function toDevSafeUrl(rawUrl) {
|
|
1683
|
+
if (!rawUrl) return rawUrl !== null && rawUrl !== void 0 ? rawUrl : "";
|
|
1684
|
+
var url;
|
|
1685
|
+
try {
|
|
1686
|
+
url = new URL(rawUrl);
|
|
1687
|
+
} catch (unused) {
|
|
1688
|
+
return rawUrl;
|
|
1689
|
+
}
|
|
1690
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
1691
|
+
return rawUrl;
|
|
1692
|
+
}
|
|
1693
|
+
if (!isLocalDevHost(url.hostname)) {
|
|
1694
|
+
return rawUrl;
|
|
1695
|
+
}
|
|
1696
|
+
var cleanPath = url.pathname.replace(/\/{2,}/g, "/") || "/index.html";
|
|
1697
|
+
return "file://".concat(cleanPath);
|
|
1698
|
+
}
|
|
1602
1699
|
// src/sdk/pal.ts
|
|
1603
1700
|
var PAL_SDK_URL = "https://imasdk.googleapis.com/pal/sdkloader/pal.js";
|
|
1604
1701
|
var _nonceLoader;
|
|
@@ -1685,12 +1782,12 @@ function createPalNonceManager() {
|
|
|
1685
1782
|
request.adWillPlayMuted = (_options_adWillPlayMuted = options.adWillPlayMuted) !== null && _options_adWillPlayMuted !== void 0 ? _options_adWillPlayMuted : false;
|
|
1686
1783
|
request.playerVolume = (_options_playerVolume = options.playerVolume) !== null && _options_playerVolume !== void 0 ? _options_playerVolume : request.adWillPlayMuted ? 0 : 1;
|
|
1687
1784
|
request.continuousPlayback = (_options_continuousPlayback = options.continuousPlayback) !== null && _options_continuousPlayback !== void 0 ? _options_continuousPlayback : true;
|
|
1688
|
-
request.descriptionUrl = options.descriptionUrl || (typeof window !== "undefined" ? window.location.href : "");
|
|
1785
|
+
request.descriptionUrl = toDevSafeUrl(options.descriptionUrl || (typeof window !== "undefined" ? window.location.href : ""));
|
|
1689
1786
|
request.iconsSupported = true;
|
|
1690
1787
|
request.playerType = "StormcloudVideoPlayer";
|
|
1691
1788
|
request.playerVersion = "1.0";
|
|
1692
1789
|
request.supportedApiFrameworks = "2,7,9";
|
|
1693
|
-
request.url = options.descriptionUrl || (typeof window !== "undefined" ? window.location.href : "");
|
|
1790
|
+
request.url = toDevSafeUrl(options.descriptionUrl || (typeof window !== "undefined" ? window.location.href : ""));
|
|
1694
1791
|
request.videoWidth = options.videoWidth || 640;
|
|
1695
1792
|
request.videoHeight = options.videoHeight || 480;
|
|
1696
1793
|
if (options.ppid) request.ppid = options.ppid;
|
|
@@ -3811,6 +3908,7 @@ function getBrowserConfigOverrides() {
|
|
|
3811
3908
|
var overrides = {};
|
|
3812
3909
|
if (browser.isSmartTV) {
|
|
3813
3910
|
overrides.allowNativeHls = true;
|
|
3911
|
+
overrides.pauseContentDuringAds = true;
|
|
3814
3912
|
}
|
|
3815
3913
|
return overrides;
|
|
3816
3914
|
}
|
|
@@ -5309,7 +5407,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
|
|
|
5309
5407
|
podMaxDurationMs: podParams.maxDurationMs,
|
|
5310
5408
|
isCtv: envSignals.isCtv,
|
|
5311
5409
|
contentUrl: envSignals.contentUrl,
|
|
5312
|
-
pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? window.location.href : void 0,
|
|
5410
|
+
pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? toDevSafeUrl(window.location.href) : void 0,
|
|
5313
5411
|
adWillPlayMuted: adWillPlayMuted,
|
|
5314
5412
|
adWillAutoPlay: !!this.config.autoplay,
|
|
5315
5413
|
appId: envSignals.appId,
|
|
@@ -6693,12 +6791,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
6693
6791
|
// ───────────────────────────────────────────────────────────────
|
|
6694
6792
|
// IMA event listeners
|
|
6695
6793
|
// ───────────────────────────────────────────────────────────────
|
|
6696
|
-
|
|
6697
|
-
* Produces the next pod ad-request URL for the current break. Every request
|
|
6698
|
-
* (initial and continuous-fetch top-up) carries pod macros (pmad/pmnd/pmxd,
|
|
6699
|
-
* no ppos); pmxd tracks the remaining break time so top-up pods only ask for
|
|
6700
|
-
* what still fits.
|
|
6701
|
-
*/ key: "nextAdRequestUrl",
|
|
6794
|
+
key: "nextAdRequestUrl",
|
|
6702
6795
|
value: function nextAdRequestUrl(baseVastUrl) {
|
|
6703
6796
|
var remaining = Math.min(this.timing.getWallClockRemainingAdMs(), this.timing.getDurationBudgetRemainingMs());
|
|
6704
6797
|
var breakDurationMs = remaining > 0 ? remaining : void 0;
|
|
@@ -7827,7 +7920,9 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7827
7920
|
if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {
|
|
7828
7921
|
this.host.video.volume = restoredVolume;
|
|
7829
7922
|
}
|
|
7830
|
-
|
|
7923
|
+
this.host.video.style.visibility = "visible";
|
|
7924
|
+
this.host.video.style.opacity = "1";
|
|
7925
|
+
if (this.host.isLiveStream()) {
|
|
7831
7926
|
var liveSyncPos = this.host.getLiveSyncPosition();
|
|
7832
7927
|
if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {
|
|
7833
7928
|
if (this.debug) {
|
|
@@ -7835,16 +7930,39 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
|
|
|
7835
7930
|
}
|
|
7836
7931
|
this.host.video.currentTime = liveSyncPos;
|
|
7837
7932
|
}
|
|
7838
|
-
|
|
7839
|
-
|
|
7840
|
-
|
|
7841
|
-
|
|
7842
|
-
|
|
7843
|
-
|
|
7933
|
+
}
|
|
7934
|
+
this.resumeContentPlayback();
|
|
7935
|
+
}
|
|
7936
|
+
},
|
|
7937
|
+
{
|
|
7938
|
+
key: "resumeContentPlayback",
|
|
7939
|
+
value: function resumeContentPlayback() {
|
|
7940
|
+
var _this = this;
|
|
7941
|
+
var attempt = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
|
|
7942
|
+
var maxAttempts = 3;
|
|
7943
|
+
if (!this.host.video.paused) {
|
|
7944
|
+
if (this.debug && attempt === 0) {
|
|
7945
|
+
console.log("[StormcloudVideoPlayer] Content video already playing after ads");
|
|
7844
7946
|
}
|
|
7845
|
-
|
|
7846
|
-
|
|
7847
|
-
|
|
7947
|
+
return;
|
|
7948
|
+
}
|
|
7949
|
+
if (this.debug) {
|
|
7950
|
+
console.log("[StormcloudVideoPlayer] Resuming content playback after ads (attempt ".concat(attempt + 1, "/").concat(maxAttempts, ")"));
|
|
7951
|
+
}
|
|
7952
|
+
var playResult = this.host.video.play();
|
|
7953
|
+
if (playResult && typeof playResult.catch === "function") {
|
|
7954
|
+
playResult.catch(function(error) {
|
|
7955
|
+
if (attempt + 1 >= maxAttempts) {
|
|
7956
|
+
if (_this.debug) {
|
|
7957
|
+
console.warn("[StormcloudVideoPlayer] Failed to resume content playback after ads:", error);
|
|
7958
|
+
}
|
|
7959
|
+
return;
|
|
7960
|
+
}
|
|
7961
|
+
var backoffMs = 250 * (attempt + 1);
|
|
7962
|
+
window.setTimeout(function() {
|
|
7963
|
+
_this.resumeContentPlayback(attempt + 1);
|
|
7964
|
+
}, backoffMs);
|
|
7965
|
+
});
|
|
7848
7966
|
}
|
|
7849
7967
|
}
|
|
7850
7968
|
},
|
|
@@ -7958,6 +8076,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
7958
8076
|
shouldContinueLiveStreamDuringAds: function shouldContinueLiveStreamDuringAds() {
|
|
7959
8077
|
return _this.shouldContinueLiveStreamDuringAds();
|
|
7960
8078
|
},
|
|
8079
|
+
isLiveStream: function isLiveStream() {
|
|
8080
|
+
return _this.hlsEngine.isLiveStream;
|
|
8081
|
+
},
|
|
7961
8082
|
getLiveSyncPosition: function getLiveSyncPosition() {
|
|
7962
8083
|
return _this.hlsEngine.getLiveSyncPosition();
|
|
7963
8084
|
},
|
|
@@ -8180,6 +8301,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
8180
8301
|
{
|
|
8181
8302
|
key: "shouldContinueLiveStreamDuringAds",
|
|
8182
8303
|
value: function shouldContinueLiveStreamDuringAds() {
|
|
8304
|
+
if (this.config.pauseContentDuringAds) {
|
|
8305
|
+
return false;
|
|
8306
|
+
}
|
|
8183
8307
|
if (this.hlsEngine.isLiveStream) {
|
|
8184
8308
|
return true;
|
|
8185
8309
|
}
|