stormcloud-video-player 0.3.17 → 0.4.1
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/README.md +158 -112
- package/dist/stormcloud-vp.min.js +1 -1
- package/lib/index.cjs +4478 -6701
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +20 -102
- package/lib/index.d.ts +20 -102
- package/lib/index.js +3827 -6042
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +1506 -4885
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +9 -78
- package/lib/players/HlsPlayer.cjs +1506 -4885
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +1508 -4887
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/adstormPlayer.cjs +915 -0
- package/lib/sdk/adstormPlayer.cjs.map +1 -0
- package/lib/sdk/adstormPlayer.d.cts +9 -0
- package/lib/sdk/hlsAdPlayer.cjs +88 -74
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +2 -2
- package/lib/{types-CryTJVCC.d.cts → types-2vzNGNdf.d.cts} +4 -8
- package/lib/ui/StormcloudVideoPlayer.cjs +1508 -4895
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/browserCompat.cjs +1 -52
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/browserCompat.d.cts +1 -6
- package/lib/utils/tracking.d.cts +1 -1
- package/package.json +1 -1
- package/lib/sdk/ima.cjs +0 -1100
- package/lib/sdk/ima.cjs.map +0 -1
- 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","all","__export","target","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","adstormPlayer_exports","createAdStormPlayer","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","allowNativeHls","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","durationParts","parser","DOMParser","xmlDoc","parseFromString","parserError","querySelector","textContent","adElements","querySelectorAll","adElement","adId","getAttribute","title","durationText","duration","parseInt","parseFloat","mediaFileElements","mediaFiles","mf","push","type","trim","originalUrl","clickThrough","trackingUrls","el","eventKey","id","selectBestMediaFile","candidates","mp4Files","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","Error","status","statusText","text"],"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 allowNativeHls = 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 if (allowNativeHls) {\n contentVideo.pause();\n }\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 setAllowNativeHls(value) {\n allowNativeHls = value;\n log(`allowNativeHls set to: ${value}`);\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 let allowNativeHls = 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 \n if (allowNativeHls) {\n contentVideo.pause();\n }\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 setAllowNativeHls(value: boolean) {\n allowNativeHls = value;\n log(`allowNativeHls set to: ${value}`);\n },\n };\n}\n\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { A as AdController } from '../types-2vzNGNdf.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 };
|
package/lib/sdk/hlsAdPlayer.cjs
CHANGED
|
@@ -190,10 +190,46 @@ __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;
|
|
196
231
|
var originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));
|
|
232
|
+
var allowNativeHls = false;
|
|
197
233
|
var listeners = /* @__PURE__ */ new Map();
|
|
198
234
|
var licenseKey = options === null || options === void 0 ? void 0 : options.licenseKey;
|
|
199
235
|
var mainHlsInstance = options === null || options === void 0 ? void 0 : options.mainHlsInstance;
|
|
@@ -202,8 +238,6 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
202
238
|
var adContainerEl;
|
|
203
239
|
var currentAd;
|
|
204
240
|
var sessionId;
|
|
205
|
-
var preloadedAds = /* @__PURE__ */ new Map();
|
|
206
|
-
var preloadingAds = /* @__PURE__ */ new Map();
|
|
207
241
|
var destroyed = false;
|
|
208
242
|
var pendingTimeouts = [];
|
|
209
243
|
var trackingFired = {
|
|
@@ -245,6 +279,28 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
245
279
|
function generateSessionId() {
|
|
246
280
|
return "session-".concat(Date.now(), "-").concat(Math.random().toString(36).substr(2, 9));
|
|
247
281
|
}
|
|
282
|
+
function buildVastUrl(durationSeconds) {
|
|
283
|
+
var baseUrl = "https://adstorm.co/api-adstorm-dev/adstorm/vast/".concat(licenseKey, "/pod");
|
|
284
|
+
var metadata = {
|
|
285
|
+
video: {
|
|
286
|
+
codec: "h264",
|
|
287
|
+
width: contentVideo.videoWidth || 1280,
|
|
288
|
+
height: contentVideo.videoHeight || 720,
|
|
289
|
+
fps: 29.97,
|
|
290
|
+
bitrate: 5e3,
|
|
291
|
+
profile: "high",
|
|
292
|
+
pix_fmt: "yuv420p",
|
|
293
|
+
has_b_frames: 0
|
|
294
|
+
},
|
|
295
|
+
audio: {
|
|
296
|
+
codec: "aac",
|
|
297
|
+
sample_rate: 48e3,
|
|
298
|
+
bitrate: 128
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
var metadataStr = encodeURIComponent(JSON.stringify(metadata));
|
|
302
|
+
return "".concat(baseUrl, "?duration=").concat(Math.ceil(durationSeconds), "&metadata=").concat(metadataStr);
|
|
303
|
+
}
|
|
248
304
|
function fireTrackingPixels(urls) {
|
|
249
305
|
if (!urls || urls.length === 0) return;
|
|
250
306
|
urls.forEach(function(url) {
|
|
@@ -368,6 +424,16 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
368
424
|
var width = mf.getAttribute("width") || "";
|
|
369
425
|
var height = mf.getAttribute("height") || "";
|
|
370
426
|
console.log("[HlsAdPlayer] MediaFile ".concat(index, ': type="').concat(type, '", url="').concat(url, '", width="').concat(width, '", height="').concat(height, '"'));
|
|
427
|
+
var originalUrl = url;
|
|
428
|
+
url = replaceFlvExtension(url);
|
|
429
|
+
if (url !== originalUrl) {
|
|
430
|
+
console.log("[HlsAdPlayer] Converted FLV to MP4: ".concat(originalUrl, " -> ").concat(url));
|
|
431
|
+
}
|
|
432
|
+
if (isUnsupportedForHls(url)) {
|
|
433
|
+
var ext = getFileExtension(url);
|
|
434
|
+
console.log("[HlsAdPlayer] MediaFile ".concat(index, " ignored: unsupported format (extension: ").concat(ext, ", declared type: ").concat(type, ")"));
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
371
437
|
if (type === "application/x-mpegURL" || type.includes("m3u8")) {
|
|
372
438
|
if (!url) {
|
|
373
439
|
console.warn("[HlsAdPlayer] MediaFile ".concat(index, " has HLS type but empty URL"));
|
|
@@ -441,7 +507,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
441
507
|
return null;
|
|
442
508
|
}
|
|
443
509
|
}
|
|
444
|
-
function fetchAndParseVastAd(
|
|
510
|
+
function fetchAndParseVastAd(url) {
|
|
445
511
|
return _async_to_generator(function() {
|
|
446
512
|
var response, vastXml;
|
|
447
513
|
return _ts_generator(this, function(_state) {
|
|
@@ -449,7 +515,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
449
515
|
case 0:
|
|
450
516
|
return [
|
|
451
517
|
4,
|
|
452
|
-
fetch(
|
|
518
|
+
fetch(url)
|
|
453
519
|
];
|
|
454
520
|
case 1:
|
|
455
521
|
response = _state.sent();
|
|
@@ -616,13 +682,13 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
616
682
|
adContainerEl = container;
|
|
617
683
|
}
|
|
618
684
|
},
|
|
619
|
-
requestAds: function requestAds(
|
|
685
|
+
requestAds: function requestAds(duration) {
|
|
620
686
|
return _async_to_generator(function() {
|
|
621
|
-
var ad, error;
|
|
687
|
+
var durationSeconds, parsed, vastUrl, ad, error;
|
|
622
688
|
return _ts_generator(this, function(_state) {
|
|
623
689
|
switch(_state.label){
|
|
624
690
|
case 0:
|
|
625
|
-
console.log("[HlsAdPlayer] Requesting ads:",
|
|
691
|
+
console.log("[HlsAdPlayer] Requesting ads for duration:", duration);
|
|
626
692
|
if (adPlaying) {
|
|
627
693
|
console.warn("[HlsAdPlayer] Cannot request new ads while an ad is playing");
|
|
628
694
|
return [
|
|
@@ -634,31 +700,23 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
634
700
|
case 1:
|
|
635
701
|
_state.trys.push([
|
|
636
702
|
1,
|
|
637
|
-
|
|
703
|
+
3,
|
|
638
704
|
,
|
|
639
|
-
|
|
705
|
+
4
|
|
640
706
|
]);
|
|
641
707
|
sessionId = generateSessionId();
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
console.log("[HlsAdPlayer] Using preloaded VAST response:", vastTagUrl);
|
|
649
|
-
return [
|
|
650
|
-
3,
|
|
651
|
-
4
|
|
652
|
-
];
|
|
653
|
-
case 2:
|
|
708
|
+
durationSeconds = 30;
|
|
709
|
+
parsed = parseInt(duration, 10);
|
|
710
|
+
if (!isNaN(parsed) && parsed > 0) {
|
|
711
|
+
durationSeconds = parsed;
|
|
712
|
+
}
|
|
713
|
+
vastUrl = buildVastUrl(durationSeconds);
|
|
654
714
|
return [
|
|
655
715
|
4,
|
|
656
|
-
fetchAndParseVastAd(
|
|
716
|
+
fetchAndParseVastAd(vastUrl)
|
|
657
717
|
];
|
|
658
|
-
case
|
|
718
|
+
case 2:
|
|
659
719
|
ad = _state.sent();
|
|
660
|
-
_state.label = 4;
|
|
661
|
-
case 4:
|
|
662
720
|
if (!ad) {
|
|
663
721
|
console.warn("[HlsAdPlayer] No ads available from VAST response");
|
|
664
722
|
emit("ad_error");
|
|
@@ -675,7 +733,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
675
733
|
2,
|
|
676
734
|
Promise.resolve()
|
|
677
735
|
];
|
|
678
|
-
case
|
|
736
|
+
case 3:
|
|
679
737
|
error = _state.sent();
|
|
680
738
|
console.error("[HlsAdPlayer] Error requesting ads:", error);
|
|
681
739
|
emit("ad_error");
|
|
@@ -683,7 +741,7 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
683
741
|
2,
|
|
684
742
|
Promise.reject(error)
|
|
685
743
|
];
|
|
686
|
-
case
|
|
744
|
+
case 4:
|
|
687
745
|
return [
|
|
688
746
|
2
|
|
689
747
|
];
|
|
@@ -691,51 +749,6 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
691
749
|
});
|
|
692
750
|
})();
|
|
693
751
|
},
|
|
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
752
|
play: function play() {
|
|
740
753
|
return _async_to_generator(function() {
|
|
741
754
|
var contentVolume, adVolume, mediaFile;
|
|
@@ -910,8 +923,6 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
910
923
|
adContainerEl = void 0;
|
|
911
924
|
currentAd = void 0;
|
|
912
925
|
listeners.clear();
|
|
913
|
-
preloadedAds.clear();
|
|
914
|
-
preloadingAds.clear();
|
|
915
926
|
},
|
|
916
927
|
isAdPlaying: function isAdPlaying() {
|
|
917
928
|
return adPlaying;
|
|
@@ -986,6 +997,9 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
986
997
|
adContainerEl.style.display = "none";
|
|
987
998
|
adContainerEl.style.pointerEvents = "none";
|
|
988
999
|
}
|
|
1000
|
+
},
|
|
1001
|
+
setAllowNativeHls: function setAllowNativeHls(value) {
|
|
1002
|
+
allowNativeHls = value;
|
|
989
1003
|
}
|
|
990
1004
|
};
|
|
991
1005
|
}
|