stormcloud-video-player 0.3.16 → 0.4.0

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.
Files changed (38) hide show
  1. package/README.md +158 -112
  2. package/dist/stormcloud-vp.min.js +1 -10
  3. package/lib/index.cjs +3805 -6041
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +19 -102
  6. package/lib/index.d.ts +19 -102
  7. package/lib/index.js +3814 -6042
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/StormcloudVideoPlayer.cjs +1497 -4885
  10. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  11. package/lib/player/StormcloudVideoPlayer.d.cts +9 -78
  12. package/lib/players/FilePlayer.cjs.map +1 -1
  13. package/lib/players/HlsPlayer.cjs +1497 -4885
  14. package/lib/players/HlsPlayer.cjs.map +1 -1
  15. package/lib/players/HlsPlayer.d.cts +1 -1
  16. package/lib/players/index.cjs +1499 -4887
  17. package/lib/players/index.cjs.map +1 -1
  18. package/lib/sdk/adstormPlayer.cjs +908 -0
  19. package/lib/sdk/adstormPlayer.cjs.map +1 -0
  20. package/lib/sdk/adstormPlayer.d.cts +9 -0
  21. package/lib/sdk/hlsAdPlayer.cjs +84 -74
  22. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  23. package/lib/sdk/hlsAdPlayer.d.cts +2 -2
  24. package/lib/{types-CryTJVCC.d.cts → types-Ca4ZDaWw.d.cts} +3 -8
  25. package/lib/ui/StormcloudVideoPlayer.cjs +1499 -4895
  26. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  27. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  28. package/lib/utils/browserCompat.cjs +1 -52
  29. package/lib/utils/browserCompat.cjs.map +1 -1
  30. package/lib/utils/browserCompat.d.cts +1 -6
  31. package/lib/utils/polyfills.cjs.map +1 -1
  32. package/lib/utils/tracking.cjs.map +1 -1
  33. package/lib/utils/tracking.d.cts +1 -1
  34. package/package.json +5 -1
  35. package/rollup.config.js +22 -0
  36. package/lib/sdk/ima.cjs +0 -1100
  37. package/lib/sdk/ima.cjs.map +0 -1
  38. package/lib/sdk/ima.d.cts +0 -12
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/sdk/adstormPlayer.cjs","../../src/sdk/adstormPlayer.ts"],"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","adstormPlayer_exports","createAdStormPlayer","exports","SUPPORTED_VIDEO_EXTENSIONS","UNSUPPORTED_VIDEO_EXTENSIONS","getFileExtension","url","pathname","URL","lastDot","lastIndexOf","slice","toLowerCase","ext","split","isUnsupportedFormat","indexOf","replaceFlvExtension","replace","isSupportedFormat","mimeType","includes","contentVideo","options","licenseKey","debug","adPlaying","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","adVideoElement","adContainerEl","currentAd","destroyed","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","log","args","console","emit","event","payload","set","Array","fn","error","warn","fireTrackingPixels","urls","length","forEach","img","Image","src","buildVastUrl","durationSeconds","metadata","baseUrl","defaultMetadata","video","codec","width","videoWidth","height","videoHeight","fps","bitrate","profile","pix_fmt","has_b_frames","audio","sample_rate","finalMetadata","metadataStr","encodeURIComponent","JSON","stringify","ceil","parseVastXml","xmlString","ads","parser","DOMParser","xmlDoc","parseFromString","parserError","querySelector","textContent","adElements","querySelectorAll","adElement","adId","getAttribute","title","durationText","durationParts","duration","parseInt","parseFloat","mediaFileElements","mediaFiles","mf","push","type","trim","originalUrl","trackingUrls","el","eventKey","clickThrough","id","selectBestMediaFile","mp4Files","filter","candidates","targetWidth","targetHeight","sort","a","b","diffA","abs","diffB","createAdVideoElement","document","createElement","style","position","left","top","objectFit","backgroundColor","zIndex","playsInline","muted","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","setupAdEventListeners","ad","addEventListener","progress","currentTime","handleAdComplete","e","handleAdError","opacity","setTimeout","display","pointerEvents","visibility","fetchVast","vastUrl","response","xmlText","fetch","headers","ok"],"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/adstormPlayer.ts\nvar adstormPlayer_exports = {};\n__export(adstormPlayer_exports, {\n createAdStormPlayer: () => createAdStormPlayer\n});\nmodule.exports = __toCommonJS(adstormPlayer_exports);\nvar SUPPORTED_VIDEO_EXTENSIONS = [\".mp4\", \".webm\", \".ogg\", \".m3u8\", \".ts\"];\nvar UNSUPPORTED_VIDEO_EXTENSIONS = [\".flv\", \".f4v\", \".swf\", \".wmv\", \".avi\", \".mov\", \".mkv\"];\nfunction getFileExtension(url) {\n try {\n const pathname = new URL(url, \"http://dummy\").pathname;\n const lastDot = pathname.lastIndexOf(\".\");\n if (lastDot === -1) return \"\";\n return pathname.slice(lastDot).toLowerCase();\n } catch {\n const lastDot = url.lastIndexOf(\".\");\n if (lastDot === -1) return \"\";\n const ext = url.slice(lastDot).split(/[?#]/)[0];\n return (ext || \"\").toLowerCase();\n }\n}\nfunction isUnsupportedFormat(url) {\n const ext = getFileExtension(url);\n return UNSUPPORTED_VIDEO_EXTENSIONS.indexOf(ext) !== -1;\n}\nfunction replaceFlvExtension(url) {\n const ext = getFileExtension(url);\n if (ext === \".flv\") {\n return url.replace(/\\.flv(\\?|$)/i, \".mp4$1\");\n }\n return url;\n}\nfunction isSupportedFormat(url, mimeType) {\n if (isUnsupportedFormat(url)) {\n return false;\n }\n const ext = getFileExtension(url);\n if (SUPPORTED_VIDEO_EXTENSIONS.indexOf(ext) !== -1) {\n return true;\n }\n if (ext === \"\" || ext === \".\") {\n return mimeType.includes(\"video/mp4\") || mimeType.includes(\"video/webm\") || mimeType.includes(\"m3u8\") || mimeType.includes(\"application/x-mpegurl\");\n }\n return false;\n}\nfunction createAdStormPlayer(contentVideo, options) {\n const { licenseKey, debug = false } = options;\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = /* @__PURE__ */ new Map();\n let adVideoElement;\n let adContainerEl;\n let currentAd;\n let destroyed = false;\n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n function log(...args) {\n if (debug) {\n console.log(\"[AdStormPlayer]\", ...args);\n }\n }\n function emit(event, payload) {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(`[AdStormPlayer] Error in event listener for ${event}:`, error);\n }\n }\n }\n function fireTrackingPixels(urls) {\n if (!urls || urls.length === 0) return;\n urls.forEach((url) => {\n try {\n const img = new Image(1, 1);\n img.src = url;\n log(\"Fired tracking pixel:\", url);\n } catch (error) {\n console.warn(\"[AdStormPlayer] Error firing tracking pixel:\", error);\n }\n });\n }\n function buildVastUrl(durationSeconds, metadata) {\n const baseUrl = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${licenseKey}/pod`;\n const defaultMetadata = {\n video: {\n codec: \"h264\",\n width: contentVideo.videoWidth || 1280,\n height: contentVideo.videoHeight || 720,\n fps: 29.97,\n bitrate: 5e3,\n profile: \"high\",\n pix_fmt: \"yuv420p\",\n has_b_frames: 0\n },\n audio: {\n codec: \"aac\",\n sample_rate: 48e3,\n bitrate: 128\n }\n };\n const finalMetadata = metadata || defaultMetadata;\n const metadataStr = encodeURIComponent(JSON.stringify(finalMetadata));\n return `${baseUrl}?duration=${Math.ceil(durationSeconds)}&metadata=${metadataStr}`;\n }\n function parseVastXml(xmlString) {\n const ads = [];\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\"[AdStormPlayer] XML parsing error:\", parserError.textContent);\n return [];\n }\n const adElements = xmlDoc.querySelectorAll(\"Ad\");\n adElements.forEach((adElement) => {\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n const durationText = adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseFloat(durationParts[2] || \"0\");\n const mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n mediaFileElements.forEach((mf) => {\n const type = mf.getAttribute(\"type\") || \"\";\n let url = mf.textContent?.trim() || \"\";\n const width = parseInt(mf.getAttribute(\"width\") || \"1920\", 10);\n const height = parseInt(mf.getAttribute(\"height\") || \"1080\", 10);\n const bitrate = mf.getAttribute(\"bitrate\") ? parseInt(mf.getAttribute(\"bitrate\"), 10) : void 0;\n if (!url) {\n log(`Skipping empty MediaFile URL`);\n return;\n }\n const originalUrl = url;\n url = replaceFlvExtension(url);\n if (url !== originalUrl) {\n log(`Converted FLV to MP4: ${originalUrl} -> ${url}`);\n }\n if (isUnsupportedFormat(url)) {\n const ext = getFileExtension(url);\n log(`Skipping unsupported format: ${url} (extension: ${ext}, declared type: ${type})`);\n return;\n }\n if (isSupportedFormat(url, type)) {\n mediaFiles.push({ url, type, width, height, bitrate });\n log(`Found media file: ${url} (${type}, ${width}x${height})`);\n } else {\n log(`Skipping incompatible media file: ${url} (type: ${type})`);\n }\n });\n if (mediaFiles.length === 0) {\n log(\"No valid media files found in ad:\", adId);\n return;\n }\n const trackingUrls = {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n error: []\n };\n adElement.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n adElement.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n const clickThrough = adElement.querySelector(\"ClickThrough\")?.textContent?.trim();\n ads.push({\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough\n });\n log(`Parsed ad: ${title}, duration: ${duration}s, media files: ${mediaFiles.length}`);\n });\n } catch (error) {\n console.error(\"[AdStormPlayer] Error parsing VAST XML:\", error);\n }\n return ads;\n }\n function selectBestMediaFile(mediaFiles) {\n if (mediaFiles.length === 0) return null;\n if (mediaFiles.length === 1) return mediaFiles[0];\n const mp4Files = mediaFiles.filter((mf) => mf.type.includes(\"video/mp4\"));\n const candidates = mp4Files.length > 0 ? mp4Files : mediaFiles;\n const targetWidth = contentVideo.videoWidth || 1280;\n const targetHeight = contentVideo.videoHeight || 720;\n candidates.sort((a, b) => {\n const diffA = Math.abs(a.width - targetWidth) + Math.abs(a.height - targetHeight);\n const diffB = Math.abs(b.width - targetWidth) + Math.abs(b.height - targetHeight);\n return diffA - diffB;\n });\n return candidates[0] || null;\n }\n function createAdVideoElement() {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.style.zIndex = \"15\";\n video.playsInline = true;\n video.muted = false;\n video.volume = originalMutedState ? 0 : originalVolume;\n return video;\n }\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n function setupAdEventListeners() {\n if (!adVideoElement || !currentAd) return;\n const ad = currentAd;\n adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!ad || !adVideoElement) return;\n const progress = adVideoElement.currentTime / ad.duration;\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(ad.trackingUrls.firstQuartile);\n }\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(ad.trackingUrls.midpoint);\n }\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(ad.trackingUrls.thirdQuartile);\n }\n });\n adVideoElement.addEventListener(\"playing\", () => {\n if (!ad || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(ad.trackingUrls.start);\n log(\"Ad started playing\");\n });\n adVideoElement.addEventListener(\"ended\", () => {\n if (!ad || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(ad.trackingUrls.complete);\n log(\"Ad completed\");\n handleAdComplete();\n });\n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[AdStormPlayer] Ad video error:\", e);\n if (ad) {\n fireTrackingPixels(ad.trackingUrls.error);\n }\n handleAdError();\n });\n }\n function handleAdComplete() {\n log(\"Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }, 300);\n }\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalVolume;\n emit(\"content_resume\");\n emit(\"all_ads_completed\");\n }\n function handleAdError() {\n log(\"Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalVolume;\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n emit(\"ad_error\");\n }\n async function fetchVast(durationSeconds) {\n const vastUrl = buildVastUrl(durationSeconds);\n log(\"Fetching VAST from:\", vastUrl);\n const response = await fetch(vastUrl, {\n headers: {\n \"Accept\": \"application/xml\"\n }\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.status} ${response.statusText}`);\n }\n const xmlText = await response.text();\n log(\"VAST response received, length:\", xmlText.length);\n return parseVastXml(xmlText);\n }\n return {\n initialize() {\n log(\"Initializing\");\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n container.style.transition = \"opacity 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n },\n async requestAds(duration) {\n log(\"Requesting ads for duration:\", duration);\n if (adPlaying) {\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n try {\n let durationSeconds = 30;\n const parsed = parseInt(duration, 10);\n if (!isNaN(parsed) && parsed > 0) {\n durationSeconds = parsed;\n }\n const ads = await fetchVast(durationSeconds);\n if (ads.length === 0) {\n log(\"No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.resolve();\n }\n currentAd = ads[0];\n log(`Ad loaded: ${currentAd.title}, duration: ${currentAd.duration}s`);\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n return Promise.resolve();\n } catch (error) {\n console.error(\"[AdStormPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n log(\"Starting ad playback\");\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n setupAdEventListeners();\n }\n trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n contentVideo.style.transition = \"opacity 0.3s ease-in-out\";\n contentVideo.style.opacity = \"0\";\n setTimeout(() => {\n contentVideo.style.visibility = \"hidden\";\n }, 300);\n contentVideo.muted = true;\n contentVideo.volume = 0;\n contentVideo.pause();\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n adVideoElement.volume = originalMutedState ? 0 : originalVolume;\n adVideoElement.muted = originalMutedState;\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n }\n emit(\"content_pause\");\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available\");\n }\n log(\"Playing media file:\", mediaFile.url);\n adVideoElement.src = mediaFile.url;\n await adVideoElement.play();\n return Promise.resolve();\n } catch (error) {\n console.error(\"[AdStormPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n async stop() {\n log(\"Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }, 300);\n }\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n currentAd = void 0;\n },\n destroy() {\n log(\"Destroying\");\n destroyed = true;\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalVolume;\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = void 0;\n }\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n adContainerEl = void 0;\n currentAd = void 0;\n listeners.clear();\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n log(`Resizing to ${width}x${height}`);\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n on(event, listener) {\n if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n listeners.get(event).add(listener);\n },\n off(event, listener) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted, volume) {\n const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n log(`updateOriginalMutedState: muted=${muted}, volume=${nextVolume}`);\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = Math.max(0, Math.min(1, volume));\n adVideoElement.muted = volume === 0;\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }, 300);\n }\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createAdStormPlayer\n});\n","import type { AdController } from \"../types\";\n\ninterface VastMediaFile {\n url: string;\n type: string;\n width: number;\n height: number;\n bitrate?: number | undefined;\n}\n\nconst SUPPORTED_VIDEO_EXTENSIONS = ['.mp4', '.webm', '.ogg', '.m3u8', '.ts'];\nconst UNSUPPORTED_VIDEO_EXTENSIONS = ['.flv', '.f4v', '.swf', '.wmv', '.avi', '.mov', '.mkv'];\n\nfunction getFileExtension(url: string): string {\n try {\n const pathname = new URL(url, 'http://dummy').pathname;\n const lastDot = pathname.lastIndexOf('.');\n if (lastDot === -1) return '';\n return pathname.slice(lastDot).toLowerCase();\n } catch {\n const lastDot = url.lastIndexOf('.');\n if (lastDot === -1) return '';\n const ext = url.slice(lastDot).split(/[?#]/)[0];\n return (ext || '').toLowerCase();\n }\n}\n\nfunction isUnsupportedFormat(url: string): boolean {\n const ext = getFileExtension(url);\n return UNSUPPORTED_VIDEO_EXTENSIONS.indexOf(ext) !== -1;\n}\n\nfunction replaceFlvExtension(url: string): string {\n const ext = getFileExtension(url);\n if (ext === '.flv') {\n return url.replace(/\\.flv(\\?|$)/i, '.mp4$1');\n }\n return url;\n}\n\nfunction isSupportedFormat(url: string, mimeType: string): boolean {\n if (isUnsupportedFormat(url)) {\n return false;\n }\n \n const ext = getFileExtension(url);\n \n if (SUPPORTED_VIDEO_EXTENSIONS.indexOf(ext) !== -1) {\n return true;\n }\n \n if (ext === '' || ext === '.') {\n return mimeType.includes('video/mp4') || \n mimeType.includes('video/webm') || \n mimeType.includes('m3u8') ||\n mimeType.includes('application/x-mpegurl');\n }\n \n return false;\n}\n\ninterface VastTrackingUrls {\n impression: string[];\n start: string[];\n firstQuartile: string[];\n midpoint: string[];\n thirdQuartile: string[];\n complete: string[];\n error: string[];\n}\n\ninterface VastAd {\n id: string;\n title: string;\n duration: number;\n mediaFiles: VastMediaFile[];\n trackingUrls: VastTrackingUrls;\n clickThrough?: string | undefined;\n}\n\ninterface AdStormMetadata {\n video?: {\n codec?: string;\n width?: number;\n height?: number;\n fps?: number;\n bitrate?: number;\n profile?: string;\n pix_fmt?: string;\n has_b_frames?: number;\n };\n audio?: {\n codec?: string;\n sample_rate?: number;\n bitrate?: number;\n };\n}\n\nexport interface AdStormPlayerOptions {\n licenseKey: string;\n debug?: boolean;\n}\n\nexport function createAdStormPlayer(\n contentVideo: HTMLVideoElement,\n options: AdStormPlayerOptions\n): AdController {\n const { licenseKey, debug = false } = options;\n \n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = new Map<string, Set<(payload?: any) => void>>();\n \n let adVideoElement: HTMLVideoElement | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let currentAd: VastAd | undefined;\n let destroyed = false;\n \n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n\n function log(...args: any[]): void {\n if (debug) {\n console.log(\"[AdStormPlayer]\", ...args);\n }\n }\n\n function emit(event: string, payload?: any): void {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(`[AdStormPlayer] Error in event listener for ${event}:`, error);\n }\n }\n }\n\n function fireTrackingPixels(urls: string[]): void {\n if (!urls || urls.length === 0) return;\n \n urls.forEach((url) => {\n try {\n const img = new Image(1, 1);\n img.src = url;\n log(\"Fired tracking pixel:\", url);\n } catch (error) {\n console.warn(\"[AdStormPlayer] Error firing tracking pixel:\", error);\n }\n });\n }\n\n function buildVastUrl(durationSeconds: number, metadata?: AdStormMetadata): string {\n const baseUrl = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${licenseKey}/pod`;\n \n const defaultMetadata: AdStormMetadata = {\n video: {\n codec: \"h264\",\n width: contentVideo.videoWidth || 1280,\n height: contentVideo.videoHeight || 720,\n fps: 29.97,\n bitrate: 5000,\n profile: \"high\",\n pix_fmt: \"yuv420p\",\n has_b_frames: 0,\n },\n audio: {\n codec: \"aac\",\n sample_rate: 48000,\n bitrate: 128,\n },\n };\n \n const finalMetadata = metadata || defaultMetadata;\n const metadataStr = encodeURIComponent(JSON.stringify(finalMetadata));\n \n return `${baseUrl}?duration=${Math.ceil(durationSeconds)}&metadata=${metadataStr}`;\n }\n\n function parseVastXml(xmlString: string): VastAd[] {\n const ads: VastAd[] = [];\n \n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n \n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\"[AdStormPlayer] XML parsing error:\", parserError.textContent);\n return [];\n }\n \n const adElements = xmlDoc.querySelectorAll(\"Ad\");\n \n adElements.forEach((adElement) => {\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n \n const durationText = adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration =\n parseInt(durationParts[0] || \"0\", 10) * 3600 +\n parseInt(durationParts[1] || \"0\", 10) * 60 +\n parseFloat(durationParts[2] || \"0\");\n \n const mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n \n mediaFileElements.forEach((mf) => {\n const type = mf.getAttribute(\"type\") || \"\";\n let url = mf.textContent?.trim() || \"\";\n const width = parseInt(mf.getAttribute(\"width\") || \"1920\", 10);\n const height = parseInt(mf.getAttribute(\"height\") || \"1080\", 10);\n const bitrate = mf.getAttribute(\"bitrate\") \n ? parseInt(mf.getAttribute(\"bitrate\")!, 10) \n : undefined;\n \n if (!url) {\n log(`Skipping empty MediaFile URL`);\n return;\n }\n \n const originalUrl = url;\n url = replaceFlvExtension(url);\n if (url !== originalUrl) {\n log(`Converted FLV to MP4: ${originalUrl} -> ${url}`);\n }\n \n if (isUnsupportedFormat(url)) {\n const ext = getFileExtension(url);\n log(`Skipping unsupported format: ${url} (extension: ${ext}, declared type: ${type})`);\n return;\n }\n \n if (isSupportedFormat(url, type)) {\n mediaFiles.push({ url, type, width, height, bitrate });\n log(`Found media file: ${url} (${type}, ${width}x${height})`);\n } else {\n log(`Skipping incompatible media file: ${url} (type: ${type})`);\n }\n });\n \n if (mediaFiles.length === 0) {\n log(\"No valid media files found in ad:\", adId);\n return;\n }\n \n const trackingUrls: VastTrackingUrls = {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n error: [],\n };\n \n adElement.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n \n adElement.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event as keyof VastTrackingUrls;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n \n const clickThrough = adElement.querySelector(\"ClickThrough\")?.textContent?.trim();\n \n ads.push({\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough,\n });\n \n log(`Parsed ad: ${title}, duration: ${duration}s, media files: ${mediaFiles.length}`);\n });\n \n } catch (error) {\n console.error(\"[AdStormPlayer] Error parsing VAST XML:\", error);\n }\n \n return ads;\n }\n\n function selectBestMediaFile(mediaFiles: VastMediaFile[]): VastMediaFile | null {\n if (mediaFiles.length === 0) return null;\n if (mediaFiles.length === 1) return mediaFiles[0]!;\n \n const mp4Files = mediaFiles.filter(mf => mf.type.includes(\"video/mp4\"));\n const candidates = mp4Files.length > 0 ? mp4Files : mediaFiles;\n \n const targetWidth = contentVideo.videoWidth || 1280;\n const targetHeight = contentVideo.videoHeight || 720;\n \n candidates.sort((a, b) => {\n const diffA = Math.abs(a.width - targetWidth) + Math.abs(a.height - targetHeight);\n const diffB = Math.abs(b.width - targetWidth) + Math.abs(b.height - targetHeight);\n return diffA - diffB;\n });\n \n return candidates[0] || null;\n }\n\n function createAdVideoElement(): HTMLVideoElement {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.style.zIndex = \"15\";\n video.playsInline = true;\n video.muted = false;\n video.volume = originalMutedState ? 0 : originalVolume;\n \n return video;\n }\n\n function setAdPlayingFlag(isPlaying: boolean): void {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n\n function setupAdEventListeners(): void {\n if (!adVideoElement || !currentAd) return;\n \n const ad = currentAd;\n \n adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!ad || !adVideoElement) return;\n \n const progress = adVideoElement.currentTime / ad.duration;\n \n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(ad.trackingUrls.firstQuartile);\n }\n \n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(ad.trackingUrls.midpoint);\n }\n \n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(ad.trackingUrls.thirdQuartile);\n }\n });\n \n adVideoElement.addEventListener(\"playing\", () => {\n if (!ad || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(ad.trackingUrls.start);\n log(\"Ad started playing\");\n });\n \n adVideoElement.addEventListener(\"ended\", () => {\n if (!ad || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(ad.trackingUrls.complete);\n log(\"Ad completed\");\n handleAdComplete();\n });\n \n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[AdStormPlayer] Ad video error:\", e);\n if (ad) {\n fireTrackingPixels(ad.trackingUrls.error);\n }\n handleAdError();\n });\n }\n\n function handleAdComplete(): void {\n log(\"Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n \n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }, 300);\n }\n \n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalVolume;\n \n emit(\"content_resume\");\n emit(\"all_ads_completed\");\n }\n\n function handleAdError(): void {\n log(\"Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n \n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalVolume;\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n \n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n \n emit(\"ad_error\");\n }\n\n async function fetchVast(durationSeconds: number): Promise<VastAd[]> {\n const vastUrl = buildVastUrl(durationSeconds);\n log(\"Fetching VAST from:\", vastUrl);\n \n const response = await fetch(vastUrl, {\n headers: {\n \"Accept\": \"application/xml\",\n },\n });\n \n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.status} ${response.statusText}`);\n }\n \n const xmlText = await response.text();\n log(\"VAST response received, length:\", xmlText.length);\n \n return parseVastXml(xmlText);\n }\n\n return {\n initialize() {\n log(\"Initializing\");\n \n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n container.style.transition = \"opacity 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n \n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n },\n\n async requestAds(duration: string) {\n log(\"Requesting ads for duration:\", duration);\n \n if (adPlaying) {\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n \n try {\n let durationSeconds = 30;\n const parsed = parseInt(duration, 10);\n if (!isNaN(parsed) && parsed > 0) {\n durationSeconds = parsed;\n }\n \n const ads = await fetchVast(durationSeconds);\n \n if (ads.length === 0) {\n log(\"No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.resolve();\n }\n \n currentAd = ads[0];\n log(`Ad loaded: ${currentAd!.title}, duration: ${currentAd!.duration}s`);\n \n fireTrackingPixels(currentAd!.trackingUrls.impression);\n trackingFired.impression = true;\n \n return Promise.resolve();\n } catch (error) {\n console.error(\"[AdStormPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n\n async play() {\n if (!currentAd) {\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n \n log(\"Starting ad playback\");\n \n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n setupAdEventListeners();\n }\n \n trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n \n contentVideo.style.transition = \"opacity 0.3s ease-in-out\";\n contentVideo.style.opacity = \"0\";\n setTimeout(() => {\n contentVideo.style.visibility = \"hidden\";\n }, 300);\n contentVideo.muted = true;\n contentVideo.volume = 0;\n contentVideo.pause();\n \n adPlaying = true;\n setAdPlayingFlag(true);\n \n if (adVideoElement) {\n adVideoElement.volume = originalMutedState ? 0 : originalVolume;\n adVideoElement.muted = originalMutedState;\n }\n \n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n }\n \n emit(\"content_pause\");\n \n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available\");\n }\n \n log(\"Playing media file:\", mediaFile.url);\n adVideoElement!.src = mediaFile.url;\n \n await adVideoElement!.play();\n \n return Promise.resolve();\n } catch (error) {\n console.error(\"[AdStormPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n\n async stop() {\n log(\"Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n \n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }, 300);\n }\n \n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n \n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n \n currentAd = undefined;\n },\n\n destroy() {\n log(\"Destroying\");\n destroyed = true;\n adPlaying = false;\n setAdPlayingFlag(false);\n \n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalVolume;\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n \n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = undefined;\n }\n \n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n \n adContainerEl = undefined;\n currentAd = undefined;\n listeners.clear();\n },\n\n isAdPlaying() {\n return adPlaying;\n },\n\n resize(width: number, height: number) {\n log(`Resizing to ${width}x${height}`);\n \n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n \n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n\n on(event: string, listener: (payload?: any) => void) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(listener);\n },\n\n off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\n },\n\n updateOriginalMutedState(muted: boolean, volume?: number) {\n const nextVolume =\n typeof volume === \"number\" && !Number.isNaN(volume)\n ? Math.max(0, Math.min(1, volume))\n : originalVolume;\n log(`updateOriginalMutedState: muted=${muted}, volume=${nextVolume}`);\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n\n getOriginalMutedState() {\n return originalMutedState;\n },\n\n getOriginalVolume() {\n return originalVolume;\n },\n\n setAdVolume(volume: number) {\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = Math.max(0, Math.min(1, volume));\n adVideoElement.muted = volume === 0;\n }\n },\n\n getAdVolume(): number {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n\n showPlaceholder() {\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n \n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n \n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }, 300);\n }\n },\n };\n}\n\n"]}
@@ -0,0 +1,9 @@
1
+ import { A as AdController } from '../types-Ca4ZDaWw.cjs';
2
+
3
+ interface AdStormPlayerOptions {
4
+ licenseKey: string;
5
+ debug?: boolean;
6
+ }
7
+ declare function createAdStormPlayer(contentVideo: HTMLVideoElement, options: AdStormPlayerOptions): AdController;
8
+
9
+ export { type AdStormPlayerOptions, createAdStormPlayer };
@@ -190,6 +190,41 @@ __export(hlsAdPlayer_exports, {
190
190
  });
191
191
  module.exports = __toCommonJS(hlsAdPlayer_exports);
192
192
  var import_hls = __toESM(require("hls.js"), 1);
193
+ var UNSUPPORTED_VIDEO_EXTENSIONS = [
194
+ ".flv",
195
+ ".f4v",
196
+ ".swf",
197
+ ".wmv",
198
+ ".avi",
199
+ ".mov",
200
+ ".mkv",
201
+ ".mp4",
202
+ ".webm"
203
+ ];
204
+ function getFileExtension(url) {
205
+ try {
206
+ var pathname = new URL(url, "http://dummy").pathname;
207
+ var lastDot = pathname.lastIndexOf(".");
208
+ if (lastDot === -1) return "";
209
+ return pathname.slice(lastDot).toLowerCase();
210
+ } catch (e) {
211
+ var lastDot1 = url.lastIndexOf(".");
212
+ if (lastDot1 === -1) return "";
213
+ var ext = url.slice(lastDot1).split(/[?#]/)[0];
214
+ return (ext || "").toLowerCase();
215
+ }
216
+ }
217
+ function isUnsupportedForHls(url) {
218
+ var ext = getFileExtension(url);
219
+ return UNSUPPORTED_VIDEO_EXTENSIONS.indexOf(ext) !== -1;
220
+ }
221
+ function replaceFlvExtension(url) {
222
+ var ext = getFileExtension(url);
223
+ if (ext === ".flv") {
224
+ return url.replace(/\.flv(\?|$)/i, ".mp4$1");
225
+ }
226
+ return url;
227
+ }
193
228
  function createHlsAdPlayer(contentVideo, options) {
194
229
  var adPlaying = false;
195
230
  var originalMutedState = false;
@@ -202,8 +237,6 @@ function createHlsAdPlayer(contentVideo, options) {
202
237
  var adContainerEl;
203
238
  var currentAd;
204
239
  var sessionId;
205
- var preloadedAds = /* @__PURE__ */ new Map();
206
- var preloadingAds = /* @__PURE__ */ new Map();
207
240
  var destroyed = false;
208
241
  var pendingTimeouts = [];
209
242
  var trackingFired = {
@@ -245,6 +278,28 @@ function createHlsAdPlayer(contentVideo, options) {
245
278
  function generateSessionId() {
246
279
  return "session-".concat(Date.now(), "-").concat(Math.random().toString(36).substr(2, 9));
247
280
  }
281
+ function buildVastUrl(durationSeconds) {
282
+ var baseUrl = "https://adstorm.co/api-adstorm-dev/adstorm/vast/".concat(licenseKey, "/pod");
283
+ var metadata = {
284
+ video: {
285
+ codec: "h264",
286
+ width: contentVideo.videoWidth || 1280,
287
+ height: contentVideo.videoHeight || 720,
288
+ fps: 29.97,
289
+ bitrate: 5e3,
290
+ profile: "high",
291
+ pix_fmt: "yuv420p",
292
+ has_b_frames: 0
293
+ },
294
+ audio: {
295
+ codec: "aac",
296
+ sample_rate: 48e3,
297
+ bitrate: 128
298
+ }
299
+ };
300
+ var metadataStr = encodeURIComponent(JSON.stringify(metadata));
301
+ return "".concat(baseUrl, "?duration=").concat(Math.ceil(durationSeconds), "&metadata=").concat(metadataStr);
302
+ }
248
303
  function fireTrackingPixels(urls) {
249
304
  if (!urls || urls.length === 0) return;
250
305
  urls.forEach(function(url) {
@@ -368,6 +423,16 @@ function createHlsAdPlayer(contentVideo, options) {
368
423
  var width = mf.getAttribute("width") || "";
369
424
  var height = mf.getAttribute("height") || "";
370
425
  console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
426
+ var originalUrl = url;
427
+ url = replaceFlvExtension(url);
428
+ if (url !== originalUrl) {
429
+ console.log("[HlsAdPlayer] Converted FLV to MP4: ".concat(originalUrl, " -> ").concat(url));
430
+ }
431
+ if (isUnsupportedForHls(url)) {
432
+ var ext = getFileExtension(url);
433
+ console.log("[HlsAdPlayer] MediaFile ".concat(index, " ignored: unsupported format (extension: ").concat(ext, ", declared type: ").concat(type, ")"));
434
+ return;
435
+ }
371
436
  if (type === "application/x-mpegURL" || type.includes("m3u8")) {
372
437
  if (!url) {
373
438
  console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has HLS type but empty URL"));
@@ -441,7 +506,7 @@ function createHlsAdPlayer(contentVideo, options) {
441
506
  return null;
442
507
  }
443
508
  }
444
- function fetchAndParseVastAd(vastTagUrl) {
509
+ function fetchAndParseVastAd(url) {
445
510
  return _async_to_generator(function() {
446
511
  var response, vastXml;
447
512
  return _ts_generator(this, function(_state) {
@@ -449,7 +514,7 @@ function createHlsAdPlayer(contentVideo, options) {
449
514
  case 0:
450
515
  return [
451
516
  4,
452
- fetch(vastTagUrl)
517
+ fetch(url)
453
518
  ];
454
519
  case 1:
455
520
  response = _state.sent();
@@ -616,13 +681,13 @@ function createHlsAdPlayer(contentVideo, options) {
616
681
  adContainerEl = container;
617
682
  }
618
683
  },
619
- requestAds: function requestAds(vastTagUrl) {
684
+ requestAds: function requestAds(duration) {
620
685
  return _async_to_generator(function() {
621
- var ad, error;
686
+ var durationSeconds, parsed, vastUrl, ad, error;
622
687
  return _ts_generator(this, function(_state) {
623
688
  switch(_state.label){
624
689
  case 0:
625
- console.log("[HlsAdPlayer] Requesting ads:", vastTagUrl);
690
+ console.log("[HlsAdPlayer] Requesting ads for duration:", duration);
626
691
  if (adPlaying) {
627
692
  console.warn("[HlsAdPlayer] Cannot request new ads while an ad is playing");
628
693
  return [
@@ -634,31 +699,23 @@ function createHlsAdPlayer(contentVideo, options) {
634
699
  case 1:
635
700
  _state.trys.push([
636
701
  1,
637
- 5,
702
+ 3,
638
703
  ,
639
- 6
704
+ 4
640
705
  ]);
641
706
  sessionId = generateSessionId();
642
- if (!preloadedAds.has(vastTagUrl)) return [
643
- 3,
644
- 2
645
- ];
646
- ad = preloadedAds.get(vastTagUrl);
647
- preloadedAds.delete(vastTagUrl);
648
- console.log("[HlsAdPlayer] Using preloaded VAST response:", vastTagUrl);
649
- return [
650
- 3,
651
- 4
652
- ];
653
- case 2:
707
+ durationSeconds = 30;
708
+ parsed = parseInt(duration, 10);
709
+ if (!isNaN(parsed) && parsed > 0) {
710
+ durationSeconds = parsed;
711
+ }
712
+ vastUrl = buildVastUrl(durationSeconds);
654
713
  return [
655
714
  4,
656
- fetchAndParseVastAd(vastTagUrl)
715
+ fetchAndParseVastAd(vastUrl)
657
716
  ];
658
- case 3:
717
+ case 2:
659
718
  ad = _state.sent();
660
- _state.label = 4;
661
- case 4:
662
719
  if (!ad) {
663
720
  console.warn("[HlsAdPlayer] No ads available from VAST response");
664
721
  emit("ad_error");
@@ -675,7 +732,7 @@ function createHlsAdPlayer(contentVideo, options) {
675
732
  2,
676
733
  Promise.resolve()
677
734
  ];
678
- case 5:
735
+ case 3:
679
736
  error = _state.sent();
680
737
  console.error("[HlsAdPlayer] Error requesting ads:", error);
681
738
  emit("ad_error");
@@ -683,7 +740,7 @@ function createHlsAdPlayer(contentVideo, options) {
683
740
  2,
684
741
  Promise.reject(error)
685
742
  ];
686
- case 6:
743
+ case 4:
687
744
  return [
688
745
  2
689
746
  ];
@@ -691,51 +748,6 @@ function createHlsAdPlayer(contentVideo, options) {
691
748
  });
692
749
  })();
693
750
  },
694
- preloadAds: function preloadAds(vastTagUrl) {
695
- return _async_to_generator(function() {
696
- var inflight, preloadPromise;
697
- return _ts_generator(this, function(_state) {
698
- if (!vastTagUrl || vastTagUrl.trim() === "") {
699
- return [
700
- 2,
701
- Promise.resolve()
702
- ];
703
- }
704
- if (preloadedAds.has(vastTagUrl)) {
705
- return [
706
- 2,
707
- Promise.resolve()
708
- ];
709
- }
710
- inflight = preloadingAds.get(vastTagUrl);
711
- if (inflight) {
712
- return [
713
- 2,
714
- inflight
715
- ];
716
- }
717
- preloadPromise = fetchAndParseVastAd(vastTagUrl).then(function(ad) {
718
- if (ad) {
719
- preloadedAds.set(vastTagUrl, ad);
720
- console.log("[HlsAdPlayer] Cached VAST response for preloading:", vastTagUrl);
721
- }
722
- }).catch(function(error) {
723
- console.warn("[HlsAdPlayer] Failed to preload VAST response:", error);
724
- preloadedAds.delete(vastTagUrl);
725
- }).finally(function() {
726
- preloadingAds.delete(vastTagUrl);
727
- });
728
- preloadingAds.set(vastTagUrl, preloadPromise);
729
- return [
730
- 2,
731
- preloadPromise
732
- ];
733
- });
734
- })();
735
- },
736
- hasPreloadedAd: function hasPreloadedAd(vastTagUrl) {
737
- return preloadedAds.has(vastTagUrl);
738
- },
739
751
  play: function play() {
740
752
  return _async_to_generator(function() {
741
753
  var contentVolume, adVolume, mediaFile;
@@ -910,8 +922,6 @@ function createHlsAdPlayer(contentVideo, options) {
910
922
  adContainerEl = void 0;
911
923
  currentAd = void 0;
912
924
  listeners.clear();
913
- preloadedAds.clear();
914
- preloadingAds.clear();
915
925
  },
916
926
  isAdPlaying: function isAdPlaying() {
917
927
  return adPlaying;