stormcloud-video-player 0.4.0 → 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.
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/ui/StormcloudVideoPlayer.cjs","../../src/ui/StormcloudVideoPlayer.tsx","../../src/sdk/adstormPlayer.ts","../../src/player/StormcloudVideoPlayer.ts","../../src/utils/polyfills.ts","../../src/utils/browserCompat.ts"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","StormcloudVideoPlayer_exports","StormcloudVideoPlayerComponent","exports","import_react","require","import_hls","SUPPORTED_VIDEO_EXTENSIONS","UNSUPPORTED_VIDEO_EXTENSIONS","getFileExtension","url","pathname","URL","lastDot","lastIndexOf","slice","toLowerCase","ext","split","replaceFlvExtension","isUnsupportedFormat","indexOf","replace","isSupportedFormat","mimeType","includes","licenseKey","options","debug","adPlaying","originalMutedState","originalVolume","Math","max","min","contentVideo","volume","listeners","Map","adVideoElement","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","type","trim","originalUrl","push","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","adContainerEl","opacity","setTimeout","pointerEvents","visibility","display","vastUrl","response","xmlText","fetch","headers","ok","Error","status","statusText","text","initialize","container","right","bottom","alignItems","justifyContent","transition","parentElement","appendChild","requestAds","parsed","Promise","reject","isNaN","fetchVast","resolve","play","mediaFile","pause","offsetHeight","stop","destroy","remove","removeChild","clear","isAdPlaying","resize","on","listener","has","Set","getOriginalMutedState","add","off","delete","updateOriginalMutedState","nextVolume","Number","getOriginalVolume","getAdVolume","showPlaceholder","hidePlaceholder","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","decodeURIComponent","values","String","getAll","callback","toString","parts","join","window","polyfillTextEncoder","TextEncoder","TextEncoderPolyfill","encoding","encode","utf8","i","charcode","charCodeAt","Uint8Array","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","result","polyfillStringStartsWith","startsWith","search","pos","substring","polyfillStringEndsWith","endsWith","polyfillStringIncludes","initializePolyfills","polyfillPromiseFinally","getChromeVersion","ua","match","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsModernJS","chromeVersion","webkitVersion","logBrowserInfo","browser","getBrowserConfigOverrides","overrides","allowNativeHls","StormcloudVideoPlayer","config","attached","inAdBreak","ptsDriftEmaMs","isLiveStream","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","browserOverrides","videoElement","debugAdTiming","adPlayer","createAdStormPlayer","load","attach","shouldUseNativeHls","lowLatencyMode","isLive","autoplay","catch","hls","Hls","enableWorker","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","loadSource","Events","MANIFEST_PARSED","level","details","live","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","minSegments","levels","some","minSegmentsBeforePlay","FRAG_BUFFERED","err","FRAG_PARSING_METADATA","_evt","data","id3Tags","samples","map","s","ptsSeconds","pts","tag","onId3Tag","FRAG_CHANGED","frag","tagList","isArray","entry","idx","parseCueOutDuration","onScte35Marker","raw","prog","parseCueOutCont","elapsed","attrs","parseAttributeList","hasScteOut","hasScteIn","klass","toNumber","ERROR","fatal","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","attachMedia","handleAdPodComplete","timeUpdateHandler","emptiedHandler","wasPaused","paused","streamType","getStreamType","canNative","canPlayType","updatePtsDrift","marker","parseScte35FromId3","decodeId3ValueToText","cueOutMatch","arg","dur","id3","cueOutContMatch","cont","cueInMatch","decoder","TextDecoder","decode","out","fromCharCode","durationMs","handleAdStart","num","d","elapsedMatch","durationMatch","res","regex","rawVal","val","n","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ms","floor","adStopTimerId","clearTimeout","ptsSecondsSample","sampleMs","isFinite","alpha","expectedAdBreakDurationMs","restoredMuted","restoredVolume","isShowingAds","shouldShowNativeControls","showCustomControls","toggleMute","currentMuted","newMutedState","setAdVolume","toggleFullscreen","fullscreenElement","requestFullscreen","exitFullscreen","isMuted","setMuted","setVolume","clampedVolume","isFullscreen","clientHeight","removeEventListener","getCurrentAdIndex","getTotalAdsInBreak","React","memo","props","driftToleranceMs","immediateManifestAds","hideLoadingIndicator","onVolumeToggle","onFullscreenToggle","onControlClick","onReady","wrapperClassName","wrapperStyle","className","controls","preload","poster","children","restVideoAttrs","useRef","useState","setAdStatus","setShouldShowNativeControls","setIsMuted","setIsFullscreen","setIsPlaying","setCurrentTime","setDuration","playbackRate","setPlaybackRate","showVolumeSlider","setShowVolumeSlider","showSpeedMenu","setShowSpeedMenu","isLoading","setIsLoading","isBuffering","setIsBuffering","showLicenseWarning","setShowLicenseWarning","innerWidth","innerHeight","viewportWidth","isPortrait","setViewportWidth","setIsPortrait","getResponsiveScale","seconds","minutes","padStart","remainingSeconds","videoRef","current","currentSrc","readyState","getBoundingClientRect","clickX","rect","newTime","newVolume","rate","useMemo","prop","cfg","player","showNative","criticalPropsKey","playerRef","currentIndex","prev","showAds","totalAds","setInterval","checkAdStatus","clearInterval","interval","useEffect","handleResize","currentTimeValue","durationValue","volumeValue","rateValue","updateStates","handleFullscreenChange","bufferingTimeoutRef","handleLoadStart","handleLoadedMetadata","handleLoadedData","handleCanPlay","handleCanPlayThrough","handleWaiting","handlePlaying","handlePause","handleEnded","import_jsx_runtime","jsxs","Fragment","jsx","overflow","minHeight","maxWidth","maxHeight","borderRadius","boxShadow","ref","aspectRatio","import_fa","FaSpinner","color","animation","transform","background","padding","backdropFilter","border","textAlign","margin","fontSize","fontWeight","marginBottom","textShadow","lineHeight","showCenterPlay","adStatus","onClick","handleCenterPlayClick","cursor","onMouseEnter","currentTarget","borderColor","onMouseLeave","FaPlay","size","marginLeft","shouldShowEnhancedControls","handleTimelineSeek","flexWrap","gap","responsiveScale","handlePlayPause","minWidth","FaPause","FaVolumeMute","FaVolumeDown","FaVolumeUp","flexDirection","onMouseDown","preventDefault","sliderElement","handleMouseMove","moveEvent","y","clientY","percentage","handleVolumeChange"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar StormcloudVideoPlayer_exports = {};\n__export(StormcloudVideoPlayer_exports, {\n StormcloudVideoPlayerComponent: () => StormcloudVideoPlayerComponent\n});\nmodule.exports = __toCommonJS(StormcloudVideoPlayer_exports);\nvar import_react = __toESM(require(\"react\"), 1);\n\n// src/player/StormcloudVideoPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/sdk/adstormPlayer.ts\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\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n if (/Web0S|webOS/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n }\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n if (chromeVersion < 50) {\n supportsModernJS = false;\n isLegacyTV = true;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (isSmartTV) {\n isLegacyTV = true;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS\n };\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n userAgent: navigator.userAgent\n });\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n return overrides;\n}\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n constructor(config) {\n this.attached = false;\n this.inAdBreak = false;\n this.ptsDriftEmaMs = 0;\n this.isLiveStream = false;\n this.nativeHlsMode = false;\n this.videoSrcProtection = null;\n this.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = false;\n initializePolyfills();\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...config, ...browserOverrides };\n this.video = config.videoElement;\n logBrowserInfo(config.debugAdTiming);\n if (!this.config.licenseKey) {\n console.warn(\"[StormcloudVideoPlayer] No license key provided - ads will not work\");\n }\n this.adPlayer = createAdStormPlayer(this.video, {\n licenseKey: this.config.licenseKey || \"\",\n debug: this.config.debugAdTiming ?? false\n });\n }\n async load() {\n if (!this.attached) {\n this.attach();\n }\n if (this.shouldUseNativeHls()) {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n this.isLiveStream = this.config.lowLatencyMode ?? false;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Using native HLS playback:\", {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls\n });\n }\n this.adPlayer.initialize();\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n return;\n }\n this.hls = new import_hls.default({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1,\n ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\n startPosition: -1\n });\n this.hls.on(import_hls.default.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n this.hls.on(import_hls.default.Events.MANIFEST_PARSED, async () => {\n this.isLiveStream = this.hls?.levels?.some(\n (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive: this.isLiveStream\n });\n }\n this.adPlayer.initialize();\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n });\n this.hls.on(import_hls.default.Events.FRAG_BUFFERED, async () => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n if (this.shouldAutoplayAfterBuffering) {\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete. Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n this.hls.on(import_hls.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n const id3Tags = (data?.samples || []).map((s) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n this.hls.on(import_hls.default.Events.FRAG_CHANGED, (_evt, data) => {\n const frag = data?.frag;\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) return;\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = this.parseCueOutDuration(value);\n this.onScte35Marker({\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value }\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = this.parseCueOutCont(value);\n this.onScte35Marker({\n type: \"progress\",\n ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n raw: { tag, value }\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value } });\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = this.parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs;\n const hasScteIn = \"SCTE35-IN\" in attrs;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = this.toNumber(attrs[\"DURATION\"]) ?? this.toNumber(attrs[\"PLANNED-DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n this.onScte35Marker({\n type: \"start\",\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { tag, value, attrs }\n });\n }\n if (hasScteIn) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value, attrs } });\n }\n }\n }\n });\n this.hls.on(import_hls.default.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case import_hls.default.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case import_hls.default.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.destroy();\n break;\n }\n }\n });\n this.hls.attachMedia(this.video);\n }\n attach() {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adPlayer.on(\"all_ads_completed\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad completed - ending ad break\");\n }\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n this.adPlayer.on(\"ad_error\", () => {\n console.error(\"[StormcloudVideoPlayer] Ad error occurred\");\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n this.adPlayer.on(\"content_pause\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content paused for ad\");\n }\n });\n this.adPlayer.on(\"content_resume\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content resuming after ad\");\n }\n });\n this.timeUpdateHandler = () => {\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n this.emptiedHandler = () => {\n if (this.nativeHlsMode && this.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Video src was cleared, restoring\");\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {\n });\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n shouldUseNativeHls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n onId3Tag(tag) {\n if (typeof tag.ptsSeconds === \"number\") {\n this.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = this.parseScte35FromId3(tag);\n if (marker) {\n this.onScte35Marker(marker);\n }\n }\n parseScte35FromId3(tag) {\n const text = this.decodeId3ValueToText(tag.value);\n if (!text) return void 0;\n const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = this.parseCueOutDuration(arg);\n return {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...dur !== void 0 ? { durationSeconds: dur } : {},\n raw: { id3: text }\n };\n }\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = this.parseCueOutCont(arg);\n return {\n type: \"progress\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n raw: { id3: text }\n };\n }\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n return {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n }\n return void 0;\n }\n decodeId3ValueToText(value) {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++) {\n out += String.fromCharCode(value[i]);\n }\n return out;\n } catch {\n return void 0;\n }\n }\n async onScte35Marker(marker) {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime\n });\n }\n if (marker.type === \"start\") {\n if (this.inAdBreak) {\n return;\n }\n this.inAdBreak = true;\n const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : 3e4;\n this.expectedAdBreakDurationMs = durationMs;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break:\", {\n durationMs,\n durationSeconds: marker.durationSeconds\n });\n }\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n await this.handleAdStart(marker);\n if (this.expectedAdBreakDurationMs != null) {\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.expectedAdBreakDurationMs = marker.durationSeconds * 1e3;\n }\n return;\n }\n if (marker.type === \"end\") {\n if (!this.inAdBreak) return;\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = void 0;\n this.clearAdStopTimer();\n if (this.adPlayer.isAdPlaying()) {\n await this.adPlayer.stop();\n }\n this.handleAdPodComplete();\n return;\n }\n }\n async handleAdStart(marker) {\n const durationSeconds = marker.durationSeconds ?? 30;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Requesting ads for duration:\", durationSeconds);\n }\n try {\n await this.adPlayer.requestAds(String(durationSeconds));\n await this.adPlayer.play();\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Ad request/play failed:\", error);\n }\n this.handleAdPodComplete();\n }\n }\n parseCueOutDuration(value) {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const d = parseFloat(match[1]);\n return Number.isNaN(d) ? void 0 : d;\n }\n return void 0;\n }\n parseCueOutCont(value) {\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n const res = {};\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return void 0;\n }\n parseAttributeList(value) {\n const attrs = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match;\n while ((match = regex.exec(value)) !== null) {\n const key = match[1] ?? \"\";\n let rawVal = match[3] ?? match[4] ?? \"\";\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n }\n toNumber(val) {\n if (val == null) return void 0;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? void 0 : n;\n }\n scheduleAdStopCountdown(remainingMs) {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.handleAdPodComplete();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.handleAdPodComplete();\n }, ms);\n }\n clearAdStopTimer() {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = void 0;\n }\n }\n updatePtsDrift(ptsSecondsSample) {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n handleAdPodComplete() {\n this.clearAdStopTimer();\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = void 0;\n this.adPlayer.stop().catch(() => {\n });\n const restoredMuted = this.adPlayer.getOriginalMutedState();\n const restoredVolume = this.adPlayer.getOriginalVolume();\n if (this.video.muted !== restoredMuted) {\n this.video.muted = restoredMuted;\n }\n if (Math.abs(this.video.volume - restoredVolume) > 0.01) {\n this.video.volume = restoredVolume;\n }\n if (this.video.paused) {\n this.video.play()?.catch(() => {\n });\n }\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad break complete\");\n }\n }\n isAdPlaying() {\n return this.inAdBreak && this.adPlayer.isAdPlaying();\n }\n isShowingAds() {\n return this.adPlayer.isAdPlaying();\n }\n getStreamType() {\n const url = this.config.src.toLowerCase();\n if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n return \"hls\";\n }\n return \"other\";\n }\n shouldShowNativeControls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n }\n toggleMute() {\n if (this.adPlayer.isAdPlaying()) {\n const currentMuted = this.video.muted;\n const newMutedState = !currentMuted;\n this.adPlayer.updateOriginalMutedState(newMutedState, this.video.volume);\n this.adPlayer.setAdVolume(newMutedState ? 0 : 1);\n } else {\n this.video.muted = !this.video.muted;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n }\n }\n toggleFullscreen() {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = this.video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container.requestFullscreen().then(() => resolve()).catch(reject);\n } else {\n document.exitFullscreen().then(() => resolve()).catch(reject);\n }\n });\n }\n isMuted() {\n return this.video.muted;\n }\n setMuted(muted) {\n this.video.muted = muted;\n this.adPlayer.updateOriginalMutedState(muted, this.video.volume);\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(muted ? 0 : 1);\n }\n }\n setVolume(volume) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(clampedVolume);\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n } else {\n this.video.volume = clampedVolume;\n this.video.muted = clampedVolume === 0;\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n }\n }\n isFullscreen() {\n return !!document.fullscreenElement;\n }\n isLive() {\n return this.isLiveStream;\n }\n get videoElement() {\n return this.video;\n }\n resize() {\n if (this.adPlayer && this.adPlayer.isAdPlaying()) {\n const width = this.video.clientWidth || 640;\n const height = this.video.clientHeight || 360;\n this.adPlayer.resize(width, height);\n }\n }\n destroy() {\n this.clearAdStopTimer();\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n this.hls?.destroy();\n this.adPlayer?.destroy();\n }\n getCurrentAdIndex() {\n return 0;\n }\n getTotalAdsInBreak() {\n return 1;\n }\n};\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar import_fa = require(\"react-icons/fa\");\nvar import_jsx_runtime = require(\"react/jsx-runtime\");\nvar CRITICAL_PROPS = [\n \"src\",\n \"allowNativeHls\",\n \"licenseKey\",\n \"lowLatencyMode\",\n \"driftToleranceMs\"\n];\nvar StormcloudVideoPlayerComponent = import_react.default.memo(\n (props) => {\n const {\n src,\n autoplay,\n muted,\n lowLatencyMode,\n allowNativeHls,\n driftToleranceMs,\n immediateManifestAds,\n debugAdTiming,\n showCustomControls,\n hideLoadingIndicator,\n onVolumeToggle,\n onFullscreenToggle,\n onControlClick,\n onReady,\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n controls,\n playsInline,\n preload,\n poster,\n children,\n licenseKey,\n minSegmentsBeforePlay,\n ...restVideoAttrs\n } = props;\n const videoRef = (0, import_react.useRef)(null);\n const playerRef = (0, import_react.useRef)(null);\n const bufferingTimeoutRef = (0, import_react.useRef)(null);\n const [adStatus, setAdStatus] = import_react.default.useState({ showAds: false, currentIndex: 0, totalAds: 0 });\n const [shouldShowNativeControls, setShouldShowNativeControls] = import_react.default.useState(true);\n const [isMuted, setIsMuted] = import_react.default.useState(false);\n const [isFullscreen, setIsFullscreen] = import_react.default.useState(false);\n const [isPlaying, setIsPlaying] = import_react.default.useState(false);\n const [currentTime, setCurrentTime] = import_react.default.useState(0);\n const [duration, setDuration] = import_react.default.useState(0);\n const [volume, setVolume] = import_react.default.useState(1);\n const [playbackRate, setPlaybackRate] = import_react.default.useState(1);\n const [showVolumeSlider, setShowVolumeSlider] = import_react.default.useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = import_react.default.useState(false);\n const [isLoading, setIsLoading] = import_react.default.useState(true);\n const [isBuffering, setIsBuffering] = import_react.default.useState(false);\n const [showCenterPlay, setShowCenterPlay] = import_react.default.useState(false);\n const [showLicenseWarning, setShowLicenseWarning] = import_react.default.useState(false);\n const [viewportWidth, setViewportWidth] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1920\n );\n const [isPortrait, setIsPortrait] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerHeight > window.innerWidth : false\n );\n const getResponsiveScale = () => {\n if (viewportWidth < 480) return 0.7;\n if (viewportWidth < 768) return 0.8;\n if (viewportWidth < 1024) return 0.9;\n return 1;\n };\n const responsiveScale = getResponsiveScale();\n const formatTime = (seconds) => {\n if (!isFinite(seconds)) return \"0:00:00\";\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor(seconds % 3600 / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n };\n const handlePlayPause = () => {\n if (videoRef.current) {\n if (videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n } else {\n videoRef.current.pause();\n setShowCenterPlay(true);\n }\n }\n };\n const handleCenterPlayClick = () => {\n if (videoRef.current && videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n }\n };\n const handleTimelineSeek = (e) => {\n if (videoRef.current && duration > 0 && isFinite(duration)) {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const progress = Math.max(0, Math.min(1, clickX / rect.width));\n const newTime = progress * duration;\n if (isFinite(newTime) && newTime >= 0 && newTime <= duration) {\n videoRef.current.currentTime = newTime;\n }\n }\n };\n const handleVolumeChange = (newVolume) => {\n if (playerRef.current && isFinite(newVolume)) {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n playerRef.current.setVolume(clampedVolume);\n }\n };\n const handlePlaybackRateChange = (rate) => {\n if (videoRef.current && isFinite(rate) && rate > 0) {\n videoRef.current.playbackRate = rate;\n }\n setShowSpeedMenu(false);\n };\n const isHlsStream = src?.toLowerCase().includes(\".m3u8\") || src?.toLowerCase().includes(\"/hls/\");\n const shouldShowEnhancedControls = showCustomControls && (isHlsStream ? allowNativeHls : true);\n const criticalPropsKey = (0, import_react.useMemo)(() => {\n return CRITICAL_PROPS.map((prop) => `${prop}:${props[prop]}`).join(\"|\");\n }, [\n src,\n allowNativeHls,\n licenseKey,\n lowLatencyMode,\n driftToleranceMs\n ]);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\") return;\n const el = videoRef.current;\n if (!el || !src) return;\n if (!licenseKey) {\n setShowLicenseWarning(true);\n setIsLoading(false);\n console.warn(\n \"StormcloudVideoPlayer: License key is required but not provided. Please set the licenseKey prop to use the player.\"\n );\n return;\n }\n setShowLicenseWarning(false);\n if (debugAdTiming) {\n console.log(\"[StormcloudUI] Initializing player, isLoading=true\");\n }\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {\n }\n playerRef.current = null;\n }\n const cfg = {\n src,\n videoElement: el\n };\n if (autoplay !== void 0) cfg.autoplay = autoplay;\n if (muted !== void 0) cfg.muted = muted;\n if (lowLatencyMode !== void 0) cfg.lowLatencyMode = lowLatencyMode;\n if (allowNativeHls !== void 0) cfg.allowNativeHls = allowNativeHls;\n if (driftToleranceMs !== void 0)\n cfg.driftToleranceMs = driftToleranceMs;\n if (immediateManifestAds !== void 0)\n cfg.immediateManifestAds = immediateManifestAds;\n if (debugAdTiming !== void 0) cfg.debugAdTiming = debugAdTiming;\n if (showCustomControls !== void 0)\n cfg.showCustomControls = showCustomControls;\n if (onVolumeToggle !== void 0) cfg.onVolumeToggle = onVolumeToggle;\n if (onFullscreenToggle !== void 0)\n cfg.onFullscreenToggle = onFullscreenToggle;\n if (onControlClick !== void 0) cfg.onControlClick = onControlClick;\n if (licenseKey !== void 0) cfg.licenseKey = licenseKey;\n if (minSegmentsBeforePlay !== void 0)\n cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;\n const player = new StormcloudVideoPlayer(cfg);\n playerRef.current = player;\n player.load().then(() => {\n const showNative = player.shouldShowNativeControls();\n setShouldShowNativeControls(showNative);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Player loaded successfully, waiting for video ready\"\n );\n }\n onReady?.(player);\n }).catch((error) => {\n console.error(\n \"StormcloudVideoPlayer: Failed to load player:\",\n error\n );\n setIsLoading(false);\n onReady?.(player);\n });\n return () => {\n try {\n player.destroy();\n } catch {\n }\n playerRef.current = null;\n };\n }, [criticalPropsKey]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n try {\n if (autoplay !== void 0 && playerRef.current.videoElement) {\n playerRef.current.videoElement.autoplay = autoplay;\n }\n if (muted !== void 0 && !playerRef.current.isShowingAds()) {\n playerRef.current.setMuted(muted);\n }\n } catch (error) {\n console.warn(\"Failed to update player properties:\", error);\n }\n }, [autoplay, muted]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n const checkAdStatus = () => {\n if (playerRef.current) {\n const showAds = playerRef.current.isShowingAds();\n const currentIndex = playerRef.current.getCurrentAdIndex();\n const totalAds = playerRef.current.getTotalAdsInBreak();\n setAdStatus((prev) => {\n if (prev.showAds !== showAds || prev.currentIndex !== currentIndex || prev.totalAds !== totalAds) {\n return { showAds, currentIndex, totalAds };\n }\n return prev;\n });\n }\n };\n const interval = setInterval(checkAdStatus, 100);\n return () => clearInterval(interval);\n }, []);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\" || !playerRef.current) return;\n const handleResize = () => {\n if (playerRef.current && videoRef.current) {\n if (typeof playerRef.current.resize === \"function\") {\n playerRef.current.resize();\n }\n }\n setViewportWidth(window.innerWidth);\n setIsPortrait(window.innerHeight > window.innerWidth);\n };\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current || !videoRef.current) return;\n const updateStates = () => {\n if (playerRef.current && videoRef.current) {\n setIsMuted(playerRef.current.isMuted());\n setIsPlaying(!videoRef.current.paused);\n const currentTimeValue = videoRef.current.currentTime;\n setCurrentTime(isFinite(currentTimeValue) ? currentTimeValue : 0);\n const durationValue = videoRef.current.duration;\n setDuration(isFinite(durationValue) ? durationValue : 0);\n const volumeValue = videoRef.current.volume;\n setVolume(\n isFinite(volumeValue) ? Math.max(0, Math.min(1, volumeValue)) : 1\n );\n const rateValue = videoRef.current.playbackRate;\n setPlaybackRate(\n isFinite(rateValue) && rateValue > 0 ? rateValue : 1\n );\n }\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n const interval = setInterval(updateStates, 200);\n const handleFullscreenChange = () => {\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () => {\n clearInterval(interval);\n document.removeEventListener(\n \"fullscreenchange\",\n handleFullscreenChange\n );\n };\n }, []);\n (0, import_react.useEffect)(() => {\n if (!videoRef.current) return;\n const handleLoadedMetadata = () => {\n if (videoRef.current) {\n const video2 = videoRef.current;\n void video2.offsetHeight;\n }\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadedmetadata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadedData = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadeddata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadStart = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadstart, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleCanPlay = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplay, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleCanPlayThrough = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplaythrough, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleWaiting = () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n }\n bufferingTimeoutRef.current = window.setTimeout(() => {\n setIsBuffering(true);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video buffering detected (after 300ms delay), readyState:\",\n videoRef.current?.readyState,\n \"- showing spinner, isBuffering=true\"\n );\n }\n }, 300);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: waiting, readyState:\",\n videoRef.current?.readyState,\n \"- buffering delay started (300ms)\"\n );\n }\n };\n const handlePlaying = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n setShowCenterPlay(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: playing, readyState:\",\n videoRef.current?.readyState,\n \"- playback started, isLoading=false, isBuffering=false\"\n );\n }\n };\n const handlePause = () => {\n if (playerRef.current && !playerRef.current.isShowingAds()) {\n setShowCenterPlay(true);\n } else {\n setShowCenterPlay(false);\n }\n };\n const handleEnded = () => {\n setShowCenterPlay(true);\n };\n const video = videoRef.current;\n video.addEventListener(\"loadstart\", handleLoadStart);\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n if (video.paused) {\n setShowCenterPlay(true);\n }\n return () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n video.removeEventListener(\"loadstart\", handleLoadStart);\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [debugAdTiming]);\n return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"style\", { children: `\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n \n .stormcloud-loading-hidden .stormcloud-loading-indicator {\n display: none !important;\n }\n \n .stormcloud-video-wrapper:fullscreen {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n .stormcloud-video-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n *:fullscreen {\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n }\n ` }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: `stormcloud-video-wrapper ${wrapperClassName || \"\"}`,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: isFullscreen ? \"fixed\" : \"relative\",\n top: isFullscreen ? 0 : void 0,\n left: isFullscreen ? 0 : void 0,\n overflow: \"hidden\",\n width: isFullscreen ? \"100vw\" : \"100%\",\n height: isFullscreen ? \"100vh\" : \"auto\",\n minHeight: isFullscreen ? \"100vh\" : \"auto\",\n maxWidth: isFullscreen ? \"100vw\" : \"100%\",\n maxHeight: isFullscreen ? \"100vh\" : \"none\",\n zIndex: isFullscreen ? 999999 : void 0,\n backgroundColor: isFullscreen ? \"#000\" : void 0,\n borderRadius: isFullscreen ? 0 : void 0,\n boxShadow: isFullscreen ? \"none\" : void 0,\n ...wrapperStyle\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"video\",\n {\n ref: videoRef,\n className,\n style: {\n display: \"block\",\n width: \"100%\",\n height: isFullscreen ? \"100%\" : \"auto\",\n maxWidth: \"100%\",\n maxHeight: isFullscreen ? \"100%\" : \"none\",\n objectFit: isFullscreen ? \"cover\" : \"contain\",\n backgroundColor: \"#000\",\n aspectRatio: isFullscreen ? \"unset\" : void 0,\n ...style\n },\n controls: shouldShowNativeControls && controls && !showCustomControls,\n playsInline,\n preload,\n poster,\n ...restVideoAttrs,\n children\n }\n ),\n (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaSpinner,\n {\n className: \"stormcloud-loading-indicator\",\n size: 42,\n color: \"white\",\n style: {\n position: \"absolute\",\n top: \"calc(50% - 21px)\",\n left: \"calc(50% - 21px)\",\n zIndex: 20,\n animation: \"spin 1s linear infinite\",\n filter: \"drop-shadow(0 3px 6px rgba(0, 0, 0, 0.8))\"\n }\n }\n ),\n showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 25,\n background: \"linear-gradient(135deg, rgba(220, 38, 38, 0.95) 0%, rgba(185, 28, 28, 0.9) 100%)\",\n color: \"white\",\n padding: \"24px 32px\",\n borderRadius: \"16px\",\n backdropFilter: \"blur(20px)\",\n border: \"2px solid rgba(255, 255, 255, 0.2)\",\n boxShadow: \"0 20px 60px rgba(0, 0, 0, 0.6), inset 0 2px 0 rgba(255, 255, 255, 0.2)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n margin: \"0 16px\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n fontSize: \"20px\",\n fontWeight: \"bold\",\n marginBottom: \"12px\",\n color: \"#ffffff\",\n textShadow: \"0 2px 4px rgba(0, 0, 0, 0.5)\"\n },\n children: \"License Key Required\"\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n color: \"rgba(255, 255, 255, 0.9)\",\n textShadow: \"0 1px 2px rgba(0, 0, 0, 0.3)\"\n },\n children: [\n \"Please provide a valid license key to use the Stormcloud Video Player.\",\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"br\", {}),\n \"Contact your administrator for licensing information.\"\n ]\n }\n )\n ]\n }\n ),\n showCenterPlay && !isLoading && !isBuffering && !showLicenseWarning && !adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: handleCenterPlayClick,\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 15,\n cursor: \"pointer\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\",\n borderRadius: \"50%\",\n width: \"100px\",\n height: \"100px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n border: \"3px solid rgba(255, 255, 255, 0.8)\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\"\n },\n onMouseEnter: (e) => {\n const target = e.currentTarget;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.95) 0%, rgba(40, 40, 40, 0.9) 100%)\";\n target.style.boxShadow = \"0 16px 48px rgba(0, 0, 0, 0.9), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.9)\";\n },\n onMouseLeave: (e) => {\n const target = e.currentTarget;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\";\n target.style.boxShadow = \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.8)\";\n },\n title: \"Play\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPlay,\n {\n size: 36,\n color: \"white\",\n style: {\n marginLeft: \"6px\",\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\"\n }\n }\n )\n }\n ),\n shouldShowEnhancedControls && !showLicenseWarning ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n background: \"linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.8) 100%)\",\n padding: \"20px 16px 16px\",\n zIndex: 10\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n width: \"100%\",\n height: \"8px\",\n background: \"linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%)\",\n borderRadius: \"8px\",\n marginBottom: \"16px\",\n cursor: \"pointer\",\n position: \"relative\",\n backdropFilter: \"blur(5px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n boxShadow: \"inset 0 2px 4px rgba(0, 0, 0, 0.2)\"\n },\n onClick: handleTimelineSeek,\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n height: \"100%\",\n background: \"linear-gradient(90deg, rgba(139, 92, 246, 0.9) 0%, rgba(59, 130, 246, 0.8) 50%, rgba(34, 197, 94, 0.9) 100%)\",\n borderRadius: \"8px\",\n width: `${duration > 0 ? currentTime / duration * 100 : 0}%`,\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 2px 8px rgba(139, 92, 246, 0.4)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"-6px\",\n right: `${duration > 0 ? 100 - currentTime / duration * 100 : 100}%`,\n width: \"20px\",\n height: \"20px\",\n background: \"linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(240, 240, 240, 0.9) 100%)\",\n borderRadius: \"50%\",\n border: \"3px solid rgba(139, 92, 246, 0.8)\",\n boxShadow: \"0 4px 16px rgba(139, 92, 246, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.8)\",\n transform: \"translateX(50%)\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"\n }\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n color: \"white\",\n flexWrap: viewportWidth < 768 ? \"wrap\" : \"nowrap\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`,\n flexWrap: viewportWidth < 480 ? \"wrap\" : \"nowrap\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: handlePlayPause,\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n backdropFilter: \"blur(12px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${10 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n minWidth: `${48 * responsiveScale}px`,\n minHeight: `${48 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n target.style.boxShadow = \"0 12px 48px rgba(0, 0, 0, 0.6), 0 6px 24px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n target.style.boxShadow = \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n },\n title: isPlaying ? \"Pause\" : \"Play\",\n children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPause,\n {\n size: Math.max(16, 20 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPlay,\n {\n size: Math.max(16, 20 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n )\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\"\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow = \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n },\n title: isMuted ? \"Unmute\" : \"Mute\",\n children: isMuted || volume === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeMute,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 0 0 transparent)\"\n }\n }\n ) : volume < 0.5 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeDown,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 0 0 transparent)\"\n }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeUp,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 0 0 transparent)\"\n }\n }\n )\n }\n ),\n showVolumeSlider && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false)\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.88) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(15px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"1px solid rgba(255, 255, 255, 0.15)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\",\n zIndex: 10,\n transition: \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\"\n },\n onMouseEnter: (e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow = \"0 16px 48px rgba(0, 0, 0, 0.6), 0 6px 16px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 0 24px rgba(59, 130, 246, 0.3)\";\n e.currentTarget.style.borderColor = \"rgba(59, 130, 246, 0.4)\";\n },\n onMouseLeave: (e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow = \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\";\n e.currentTarget.style.borderColor = \"rgba(255, 255, 255, 0.15)\";\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\"\n },\n onMouseEnter: (e) => {\n },\n onMouseLeave: (e) => {\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n const handleMouseMove = (moveEvent) => {\n if (!sliderElement) return;\n const rect2 = sliderElement.getBoundingClientRect();\n const y2 = moveEvent.clientY - rect2.top;\n const percentage2 = 1 - Math.max(0, Math.min(1, y2 / rect2.height));\n handleVolumeChange(percentage2);\n };\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n const rect = sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n onClick: (e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background: \"linear-gradient(180deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.15) 100%)\",\n borderRadius: \"4px\",\n boxShadow: \"inset 0 1px 3px rgba(0, 0, 0, 0.2)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: \"linear-gradient(180deg, rgba(96, 165, 250, 1) 0%, rgba(59, 130, 246, 0.95) 50%, rgba(37, 99, 235, 0.9) 100%)\",\n borderRadius: \"4px\",\n transition: \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow: \"0 0 8px rgba(59, 130, 246, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.3)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: `calc(${(isMuted ? 0 : volume) * 100}% - 7px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"14px\",\n height: \"14px\",\n background: \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n boxShadow: \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\",\n transition: \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\"\n },\n onMouseEnter: (e) => {\n e.currentTarget.style.boxShadow = \"0 3px 10px rgba(0, 0, 0, 0.4), 0 0 0 3px rgba(59, 130, 246, 0.5), 0 0 20px rgba(59, 130, 246, 0.6)\";\n e.currentTarget.style.cursor = \"grab\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.boxShadow = \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\";\n },\n onMouseDown: (e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n },\n onMouseUp: (e) => {\n e.currentTarget.style.cursor = \"grab\";\n }\n }\n )\n ]\n }\n )\n }\n )\n ] })\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n color: \"rgba(255, 255, 255, 0.9)\",\n display: viewportWidth < 480 ? \"none\" : \"block\"\n },\n children: [\n formatTime(currentTime),\n \" / \",\n formatTime(duration)\n ]\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n display: viewportWidth < 600 ? \"none\" : \"block\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n onClick: () => setShowSpeedMenu(!showSpeedMenu),\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px ${14 * responsiveScale}px`,\n borderRadius: `${14 * responsiveScale}px`,\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n fontWeight: \"700\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${56 * responsiveScale}px`,\n minHeight: `${40 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow = \"0 10px 32px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow = \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n },\n title: \"Playback Speed\",\n children: [\n playbackRate,\n \"x\"\n ]\n }\n ),\n showSpeedMenu && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n right: 0,\n marginBottom: \"12px\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.95) 100%)\",\n backdropFilter: \"blur(20px)\",\n borderRadius: \"12px\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n overflow: \"hidden\",\n minWidth: \"90px\",\n boxShadow: \"0 16px 48px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.1)\"\n },\n children: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map(\n (speed) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n onClick: () => handlePlaybackRateChange(speed),\n style: {\n display: \"block\",\n width: \"100%\",\n padding: \"10px 16px\",\n background: playbackRate === speed ? \"linear-gradient(135deg, rgba(99, 102, 241, 0.8) 0%, rgba(139, 92, 246, 0.6) 100%)\" : \"transparent\",\n border: \"none\",\n color: \"white\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n fontWeight: \"600\",\n textAlign: \"center\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n borderBottom: speed !== 2 ? \"1px solid rgba(255, 255, 255, 0.05)\" : \"none\"\n },\n onMouseEnter: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.05) 100%)\";\n }\n },\n onMouseLeave: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"transparent\";\n }\n },\n children: [\n speed,\n \"x\"\n ]\n },\n speed\n )\n )\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current.toggleFullscreen().catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow = \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n },\n title: isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaCompress,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaExpand,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n )\n }\n )\n ]\n }\n )\n ]\n }\n )\n ]\n }\n ) }) : showCustomControls && !showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: `${10 * responsiveScale}px`,\n right: `${10 * responsiveScale}px`,\n transform: \"none\",\n display: \"flex\",\n flexDirection: isPortrait ? \"column\" : \"row\",\n gap: `${10 * responsiveScale}px`,\n zIndex: 10\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\"\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n },\n onMouseEnter: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n },\n onMouseLeave: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow: \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`\n },\n title: isMuted ? \"Unmute\" : \"Mute\",\n children: isMuted || volume === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeMute,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n ) : volume < 0.5 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeDown,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeUp,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n )\n }\n ),\n showVolumeSlider && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false)\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.96) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(20px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.7)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\",\n zIndex: 10,\n transition: \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\"\n },\n onMouseEnter: (e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow = \"0 16px 48px rgba(0, 0, 0, 0.9), 0 6px 16px rgba(0, 0, 0, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 24px rgba(96, 165, 250, 0.4)\";\n e.currentTarget.style.borderColor = \"rgba(96, 165, 250, 0.8)\";\n },\n onMouseLeave: (e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow = \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\";\n e.currentTarget.style.borderColor = \"rgba(255, 255, 255, 0.7)\";\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\"\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n const handleMouseMove = (moveEvent) => {\n if (!sliderElement) return;\n const rect2 = sliderElement.getBoundingClientRect();\n const y2 = moveEvent.clientY - rect2.top;\n const percentage2 = 1 - Math.max(0, Math.min(1, y2 / rect2.height));\n handleVolumeChange(percentage2);\n };\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n const rect = sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n onClick: (e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background: \"linear-gradient(180deg, rgba(255, 255, 255, 0.85) 0%, rgba(255, 255, 255, 0.5) 100%)\",\n borderRadius: \"4px\",\n border: \"1px solid rgba(255, 255, 255, 0.4)\",\n boxShadow: \"inset 0 1px 3px rgba(0, 0, 0, 0.3)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: \"linear-gradient(180deg, rgba(125, 211, 252, 1) 0%, rgba(96, 165, 250, 0.98) 50%, rgba(59, 130, 246, 0.95) 100%)\",\n borderRadius: \"4px\",\n transition: \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow: \"0 0 12px rgba(96, 165, 250, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.4)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: `calc(${(isMuted ? 0 : volume) * 100}% - 8px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"16px\",\n height: \"16px\",\n background: \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n border: \"2px solid rgba(96, 165, 250, 0.9)\",\n boxShadow: \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\",\n transition: \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\"\n },\n onMouseEnter: (e) => {\n e.currentTarget.style.boxShadow = \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 3px rgba(96, 165, 250, 0.6), 0 0 24px rgba(96, 165, 250, 0.7)\";\n e.currentTarget.style.cursor = \"grab\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.boxShadow = \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\";\n },\n onMouseDown: (e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n },\n onMouseUp: (e) => {\n e.currentTarget.style.cursor = \"grab\";\n }\n }\n )\n ]\n }\n )\n }\n )\n ] })\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current.toggleFullscreen().catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n },\n onMouseEnter: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n },\n onMouseLeave: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow: \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`\n },\n title: isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaCompress,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaExpand,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n )\n }\n )\n ]\n }\n ),\n onControlClick && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: onControlClick,\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n cursor: \"pointer\"\n }\n }\n )\n ]\n }\n )\n ] });\n },\n (prevProps, nextProps) => {\n for (const prop of CRITICAL_PROPS) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const uiProps = [\n \"autoplay\",\n \"muted\",\n \"controls\",\n \"showCustomControls\",\n \"className\",\n \"style\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"playsInline\",\n \"preload\",\n \"poster\",\n \"children\"\n ];\n for (const prop of uiProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const callbackProps = [\n \"onReady\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\"\n ];\n for (const prop of callbackProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n return true;\n }\n);\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n StormcloudVideoPlayerComponent\n});\n","import React, { useEffect, useRef, useMemo } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport {\n FaPlay,\n FaPause,\n FaVolumeUp,\n FaVolumeMute,\n FaVolumeDown,\n FaExpand,\n FaCompress,\n FaSpinner,\n} from \"react-icons/fa\";\n\nexport type StormcloudVideoPlayerProps = Omit<\n StormcloudVideoPlayerConfig,\n \"videoElement\"\n> &\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n onReady?: (player: StormcloudVideoPlayer) => void;\n wrapperClassName?: string;\n wrapperStyle?: React.CSSProperties;\n licenseKey?: string;\n };\n\nconst CRITICAL_PROPS = [\n \"src\",\n \"allowNativeHls\",\n \"licenseKey\",\n \"lowLatencyMode\",\n \"driftToleranceMs\",\n] as const;\n\nexport const StormcloudVideoPlayerComponent: React.FC<StormcloudVideoPlayerProps> =\n React.memo(\n (props) => {\n const {\n src,\n autoplay,\n muted,\n lowLatencyMode,\n allowNativeHls,\n driftToleranceMs,\n immediateManifestAds,\n debugAdTiming,\n showCustomControls,\n hideLoadingIndicator,\n onVolumeToggle,\n onFullscreenToggle,\n onControlClick,\n onReady,\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n controls,\n playsInline,\n preload,\n poster,\n children,\n licenseKey,\n minSegmentsBeforePlay,\n ...restVideoAttrs\n } = props;\n\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const playerRef = useRef<StormcloudVideoPlayer | null>(null);\n const bufferingTimeoutRef = useRef<number | null>(null);\n const [adStatus, setAdStatus] = React.useState<{\n showAds: boolean;\n currentIndex: number;\n totalAds: number;\n }>({ showAds: false, currentIndex: 0, totalAds: 0 });\n\n const [shouldShowNativeControls, setShouldShowNativeControls] =\n React.useState(true);\n\n const [isMuted, setIsMuted] = React.useState(false);\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [currentTime, setCurrentTime] = React.useState(0);\n const [duration, setDuration] = React.useState(0);\n const [volume, setVolume] = React.useState(1);\n const [playbackRate, setPlaybackRate] = React.useState(1);\n const [showVolumeSlider, setShowVolumeSlider] = React.useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(true);\n const [isBuffering, setIsBuffering] = React.useState(false);\n const [showCenterPlay, setShowCenterPlay] = React.useState(false);\n const [showLicenseWarning, setShowLicenseWarning] = React.useState(false);\n const [viewportWidth, setViewportWidth] = React.useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1920\n );\n const [isPortrait, setIsPortrait] = React.useState(\n typeof window !== \"undefined\"\n ? window.innerHeight > window.innerWidth\n : false\n );\n\n const getResponsiveScale = () => {\n if (viewportWidth < 480) return 0.7;\n if (viewportWidth < 768) return 0.8;\n if (viewportWidth < 1024) return 0.9;\n return 1;\n };\n\n const responsiveScale = getResponsiveScale();\n\n const formatTime = (seconds: number): string => {\n if (!isFinite(seconds)) return \"0:00:00\";\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return `${hours}:${minutes\n .toString()\n .padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n };\n\n const handlePlayPause = () => {\n if (videoRef.current) {\n if (videoRef.current.paused) {\n const hasValidSource =\n videoRef.current.src ||\n (videoRef.current.currentSrc &&\n videoRef.current.currentSrc !== \"\") ||\n videoRef.current.readyState >= 1;\n\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n } else {\n videoRef.current.pause();\n setShowCenterPlay(true);\n }\n }\n };\n\n const handleCenterPlayClick = () => {\n if (videoRef.current && videoRef.current.paused) {\n const hasValidSource =\n videoRef.current.src ||\n (videoRef.current.currentSrc &&\n videoRef.current.currentSrc !== \"\") ||\n videoRef.current.readyState >= 1;\n\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n }\n };\n\n const handleTimelineSeek = (e: React.MouseEvent<HTMLDivElement>) => {\n if (videoRef.current && duration > 0 && isFinite(duration)) {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const progress = Math.max(0, Math.min(1, clickX / rect.width));\n const newTime = progress * duration;\n\n if (isFinite(newTime) && newTime >= 0 && newTime <= duration) {\n videoRef.current.currentTime = newTime;\n }\n }\n };\n\n const handleVolumeChange = (newVolume: number) => {\n if (playerRef.current && isFinite(newVolume)) {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n playerRef.current.setVolume(clampedVolume);\n }\n };\n\n const handlePlaybackRateChange = (rate: number) => {\n if (videoRef.current && isFinite(rate) && rate > 0) {\n videoRef.current.playbackRate = rate;\n }\n setShowSpeedMenu(false);\n };\n\n const isHlsStream =\n src?.toLowerCase().includes(\".m3u8\") ||\n src?.toLowerCase().includes(\"/hls/\");\n const shouldShowEnhancedControls =\n showCustomControls && (isHlsStream ? allowNativeHls : true);\n\n const criticalPropsKey = useMemo(() => {\n return CRITICAL_PROPS.map((prop) => `${prop}:${props[prop]}`).join(\"|\");\n }, [\n src,\n allowNativeHls,\n licenseKey,\n lowLatencyMode,\n driftToleranceMs,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const el = videoRef.current;\n if (!el || !src) return;\n\n if (!licenseKey) {\n setShowLicenseWarning(true);\n setIsLoading(false);\n console.warn(\n \"StormcloudVideoPlayer: License key is required but not provided. Please set the licenseKey prop to use the player.\"\n );\n return;\n }\n\n setShowLicenseWarning(false);\n\n if (debugAdTiming) {\n console.log(\"[StormcloudUI] Initializing player, isLoading=true\");\n }\n\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {}\n playerRef.current = null;\n }\n\n const cfg: StormcloudVideoPlayerConfig = {\n src,\n videoElement: el,\n } as StormcloudVideoPlayerConfig;\n if (autoplay !== undefined) cfg.autoplay = autoplay;\n if (muted !== undefined) cfg.muted = muted;\n if (lowLatencyMode !== undefined) cfg.lowLatencyMode = lowLatencyMode;\n if (allowNativeHls !== undefined) cfg.allowNativeHls = allowNativeHls;\n if (driftToleranceMs !== undefined)\n cfg.driftToleranceMs = driftToleranceMs;\n if (immediateManifestAds !== undefined)\n cfg.immediateManifestAds = immediateManifestAds;\n if (debugAdTiming !== undefined) cfg.debugAdTiming = debugAdTiming;\n if (showCustomControls !== undefined)\n cfg.showCustomControls = showCustomControls;\n if (onVolumeToggle !== undefined) cfg.onVolumeToggle = onVolumeToggle;\n if (onFullscreenToggle !== undefined)\n cfg.onFullscreenToggle = onFullscreenToggle;\n if (onControlClick !== undefined) cfg.onControlClick = onControlClick;\n if (licenseKey !== undefined) cfg.licenseKey = licenseKey;\n if (minSegmentsBeforePlay !== undefined)\n cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;\n\n const player = new StormcloudVideoPlayer(cfg);\n playerRef.current = player;\n player\n .load()\n .then(() => {\n const showNative = player.shouldShowNativeControls();\n setShouldShowNativeControls(showNative);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Player loaded successfully, waiting for video ready\"\n );\n }\n onReady?.(player);\n })\n .catch((error) => {\n console.error(\n \"StormcloudVideoPlayer: Failed to load player:\",\n error\n );\n setIsLoading(false);\n onReady?.(player);\n });\n\n return () => {\n try {\n player.destroy();\n } catch {}\n playerRef.current = null;\n };\n }, [criticalPropsKey]);\n\n useEffect(() => {\n if (!playerRef.current) return;\n\n try {\n if (autoplay !== undefined && playerRef.current.videoElement) {\n playerRef.current.videoElement.autoplay = autoplay;\n }\n if (muted !== undefined && !playerRef.current.isShowingAds()) {\n playerRef.current.setMuted(muted);\n }\n } catch (error) {\n console.warn(\"Failed to update player properties:\", error);\n }\n }, [autoplay, muted]);\n\n useEffect(() => {\n if (!playerRef.current) return;\n\n const checkAdStatus = () => {\n if (playerRef.current) {\n const showAds = playerRef.current.isShowingAds();\n const currentIndex = playerRef.current.getCurrentAdIndex();\n const totalAds = playerRef.current.getTotalAdsInBreak();\n\n setAdStatus((prev) => {\n if (\n prev.showAds !== showAds ||\n prev.currentIndex !== currentIndex ||\n prev.totalAds !== totalAds\n ) {\n return { showAds, currentIndex, totalAds };\n }\n return prev;\n });\n }\n };\n\n const interval = setInterval(checkAdStatus, 100);\n return () => clearInterval(interval);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !playerRef.current) return;\n\n const handleResize = () => {\n if (playerRef.current && videoRef.current) {\n if (typeof playerRef.current.resize === \"function\") {\n playerRef.current.resize();\n }\n }\n setViewportWidth(window.innerWidth);\n setIsPortrait(window.innerHeight > window.innerWidth);\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n useEffect(() => {\n if (!playerRef.current || !videoRef.current) return;\n\n const updateStates = () => {\n if (playerRef.current && videoRef.current) {\n setIsMuted(playerRef.current.isMuted());\n setIsPlaying(!videoRef.current.paused);\n\n const currentTimeValue = videoRef.current.currentTime;\n setCurrentTime(isFinite(currentTimeValue) ? currentTimeValue : 0);\n\n const durationValue = videoRef.current.duration;\n setDuration(isFinite(durationValue) ? durationValue : 0);\n\n const volumeValue = videoRef.current.volume;\n setVolume(\n isFinite(volumeValue) ? Math.max(0, Math.min(1, volumeValue)) : 1\n );\n\n const rateValue = videoRef.current.playbackRate;\n setPlaybackRate(\n isFinite(rateValue) && rateValue > 0 ? rateValue : 1\n );\n }\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n\n const interval = setInterval(updateStates, 200);\n\n const handleFullscreenChange = () => {\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n\n return () => {\n clearInterval(interval);\n document.removeEventListener(\n \"fullscreenchange\",\n handleFullscreenChange\n );\n };\n }, []);\n\n useEffect(() => {\n if (!videoRef.current) return;\n\n const handleLoadedMetadata = () => {\n if (videoRef.current) {\n const video = videoRef.current;\n void video.offsetHeight;\n }\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadedmetadata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleLoadedData = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadeddata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleLoadStart = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadstart, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplay, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n\n const handleCanPlayThrough = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplaythrough, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n\n const handleWaiting = () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n }\n\n bufferingTimeoutRef.current = window.setTimeout(() => {\n setIsBuffering(true);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video buffering detected (after 300ms delay), readyState:\",\n videoRef.current?.readyState,\n \"- showing spinner, isBuffering=true\"\n );\n }\n }, 300);\n\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: waiting, readyState:\",\n videoRef.current?.readyState,\n \"- buffering delay started (300ms)\"\n );\n }\n };\n\n const handlePlaying = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n setShowCenterPlay(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: playing, readyState:\",\n videoRef.current?.readyState,\n \"- playback started, isLoading=false, isBuffering=false\"\n );\n }\n };\n\n const handlePause = () => {\n if (playerRef.current && !playerRef.current.isShowingAds()) {\n setShowCenterPlay(true);\n } else {\n setShowCenterPlay(false);\n }\n };\n\n const handleEnded = () => {\n setShowCenterPlay(true);\n };\n\n const video = videoRef.current;\n video.addEventListener(\"loadstart\", handleLoadStart);\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n\n if (video.paused) {\n setShowCenterPlay(true);\n }\n\n return () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n\n video.removeEventListener(\"loadstart\", handleLoadStart);\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [debugAdTiming]);\n\n return (\n <>\n <style>\n {`\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n \n .stormcloud-loading-hidden .stormcloud-loading-indicator {\n display: none !important;\n }\n \n .stormcloud-video-wrapper:fullscreen {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n .stormcloud-video-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n *:fullscreen {\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n }\n `}\n </style>\n <div\n className={`stormcloud-video-wrapper ${wrapperClassName || \"\"}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: isFullscreen ? \"fixed\" : \"relative\",\n top: isFullscreen ? 0 : undefined,\n left: isFullscreen ? 0 : undefined,\n overflow: \"hidden\",\n width: isFullscreen ? \"100vw\" : \"100%\",\n height: isFullscreen ? \"100vh\" : \"auto\",\n minHeight: isFullscreen ? \"100vh\" : \"auto\",\n maxWidth: isFullscreen ? \"100vw\" : \"100%\",\n maxHeight: isFullscreen ? \"100vh\" : \"none\",\n zIndex: isFullscreen ? 999999 : undefined,\n backgroundColor: isFullscreen ? \"#000\" : undefined,\n borderRadius: isFullscreen ? 0 : undefined,\n boxShadow: isFullscreen ? \"none\" : undefined,\n ...wrapperStyle,\n }}\n >\n <video\n ref={videoRef}\n className={className}\n style={{\n display: \"block\",\n width: \"100%\",\n height: isFullscreen ? \"100%\" : \"auto\",\n maxWidth: \"100%\",\n maxHeight: isFullscreen ? \"100%\" : \"none\",\n objectFit: isFullscreen ? \"cover\" : \"contain\",\n backgroundColor: \"#000\",\n aspectRatio: isFullscreen ? \"unset\" : undefined,\n ...style,\n }}\n controls={\n shouldShowNativeControls && controls && !showCustomControls\n }\n playsInline={playsInline}\n preload={preload}\n poster={poster}\n {...restVideoAttrs}\n >\n {children}\n </video>\n\n {(isLoading || isBuffering) && !hideLoadingIndicator && (\n <FaSpinner\n className=\"stormcloud-loading-indicator\"\n size={42}\n color=\"white\"\n style={{\n position: \"absolute\",\n top: \"calc(50% - 21px)\",\n left: \"calc(50% - 21px)\",\n zIndex: 20,\n animation: \"spin 1s linear infinite\",\n filter: \"drop-shadow(0 3px 6px rgba(0, 0, 0, 0.8))\",\n }}\n />\n )}\n\n {showLicenseWarning && (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 25,\n background:\n \"linear-gradient(135deg, rgba(220, 38, 38, 0.95) 0%, rgba(185, 28, 28, 0.9) 100%)\",\n color: \"white\",\n padding: \"24px 32px\",\n borderRadius: \"16px\",\n backdropFilter: \"blur(20px)\",\n border: \"2px solid rgba(255, 255, 255, 0.2)\",\n boxShadow:\n \"0 20px 60px rgba(0, 0, 0, 0.6), inset 0 2px 0 rgba(255, 255, 255, 0.2)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n margin: \"0 16px\",\n }}\n >\n <div\n style={{\n fontSize: \"20px\",\n fontWeight: \"bold\",\n marginBottom: \"12px\",\n color: \"#ffffff\",\n textShadow: \"0 2px 4px rgba(0, 0, 0, 0.5)\",\n }}\n >\n License Key Required\n </div>\n <div\n style={{\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n color: \"rgba(255, 255, 255, 0.9)\",\n textShadow: \"0 1px 2px rgba(0, 0, 0, 0.3)\",\n }}\n >\n Please provide a valid license key to use the Stormcloud Video\n Player.\n <br />\n Contact your administrator for licensing information.\n </div>\n </div>\n )}\n\n {showCenterPlay &&\n !isLoading &&\n !isBuffering &&\n !showLicenseWarning &&\n !adStatus.showAds && (\n <div\n onClick={handleCenterPlayClick}\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 15,\n cursor: \"pointer\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\",\n borderRadius: \"50%\",\n width: \"100px\",\n height: \"100px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n border: \"3px solid rgba(255, 255, 255, 0.8)\",\n boxShadow:\n \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n onMouseEnter={(e) => {\n const target = e.currentTarget as HTMLElement;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.95) 0%, rgba(40, 40, 40, 0.9) 100%)\";\n target.style.boxShadow =\n \"0 16px 48px rgba(0, 0, 0, 0.9), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.9)\";\n }}\n onMouseLeave={(e) => {\n const target = e.currentTarget as HTMLElement;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\";\n target.style.boxShadow =\n \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.8)\";\n }}\n title=\"Play\"\n >\n <FaPlay\n size={36}\n color=\"white\"\n style={{\n marginLeft: \"6px\",\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n }}\n />\n </div>\n )}\n\n {shouldShowEnhancedControls && !showLicenseWarning ? (\n <>\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n background:\n \"linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.8) 100%)\",\n padding: \"20px 16px 16px\",\n zIndex: 10,\n }}\n >\n <div\n style={{\n width: \"100%\",\n height: \"8px\",\n background:\n \"linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%)\",\n borderRadius: \"8px\",\n marginBottom: \"16px\",\n cursor: \"pointer\",\n position: \"relative\",\n backdropFilter: \"blur(5px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n boxShadow: \"inset 0 2px 4px rgba(0, 0, 0, 0.2)\",\n }}\n onClick={handleTimelineSeek}\n >\n <div\n style={{\n height: \"100%\",\n background:\n \"linear-gradient(90deg, rgba(139, 92, 246, 0.9) 0%, rgba(59, 130, 246, 0.8) 50%, rgba(34, 197, 94, 0.9) 100%)\",\n borderRadius: \"8px\",\n width: `${\n duration > 0 ? (currentTime / duration) * 100 : 0\n }%`,\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 2px 8px rgba(139, 92, 246, 0.4)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n top: \"-6px\",\n right: `${\n duration > 0\n ? 100 - (currentTime / duration) * 100\n : 100\n }%`,\n width: \"20px\",\n height: \"20px\",\n background:\n \"linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(240, 240, 240, 0.9) 100%)\",\n borderRadius: \"50%\",\n border: \"3px solid rgba(139, 92, 246, 0.8)\",\n boxShadow:\n \"0 4px 16px rgba(139, 92, 246, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.8)\",\n transform: \"translateX(50%)\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n color: \"white\",\n flexWrap: viewportWidth < 768 ? \"wrap\" : \"nowrap\",\n gap: `${8 * responsiveScale}px`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`,\n flexWrap: viewportWidth < 480 ? \"wrap\" : \"nowrap\",\n }}\n >\n <button\n onClick={handlePlayPause}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n backdropFilter: \"blur(12px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${10 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n minWidth: `${48 * responsiveScale}px`,\n minHeight: `${48 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n target.style.boxShadow =\n \"0 12px 48px rgba(0, 0, 0, 0.6), 0 6px 24px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n target.style.boxShadow =\n \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n }}\n title={isPlaying ? \"Pause\" : \"Play\"}\n >\n {isPlaying ? (\n <FaPause\n size={Math.max(16, 20 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n ) : (\n <FaPlay\n size={Math.max(16, 20 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n )}\n </button>\n\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\",\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n >\n <button\n onClick={() => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow =\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n }}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted || volume === 0 ? (\n <FaVolumeMute\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 0 0 transparent)\",\n }}\n />\n ) : volume < 0.5 ? (\n <FaVolumeDown\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 0 0 transparent)\",\n }}\n />\n ) : (\n <FaVolumeUp\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 0 0 transparent)\",\n }}\n />\n )}\n </button>\n\n {showVolumeSlider && (\n <>\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9,\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.88) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(15px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"1px solid rgba(255, 255, 255, 0.15)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow:\n \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\",\n zIndex: 10,\n transition:\n \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\",\n }}\n onMouseEnter={(e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow =\n \"0 16px 48px rgba(0, 0, 0, 0.6), 0 6px 16px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 0 24px rgba(59, 130, 246, 0.3)\";\n e.currentTarget.style.borderColor =\n \"rgba(59, 130, 246, 0.4)\";\n }}\n onMouseLeave={(e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow =\n \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\";\n e.currentTarget.style.borderColor =\n \"rgba(255, 255, 255, 0.15)\";\n }}\n >\n <div\n style={{\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\",\n }}\n onMouseEnter={(e) => {\n // Hover effect removed\n }}\n onMouseLeave={(e) => {\n // Hover effect removed\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n\n const handleMouseMove = (\n moveEvent: MouseEvent\n ) => {\n if (!sliderElement) return;\n const rect =\n sliderElement.getBoundingClientRect();\n const y = moveEvent.clientY - rect.top;\n const percentage =\n 1 -\n Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n\n const rect =\n sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 -\n Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const rect =\n e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 -\n Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n >\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background:\n \"linear-gradient(180deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.15) 100%)\",\n borderRadius: \"4px\",\n boxShadow:\n \"inset 0 1px 3px rgba(0, 0, 0, 0.2)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background:\n \"linear-gradient(180deg, rgba(96, 165, 250, 1) 0%, rgba(59, 130, 246, 0.95) 50%, rgba(37, 99, 235, 0.9) 100%)\",\n borderRadius: \"4px\",\n transition:\n \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow:\n \"0 0 8px rgba(59, 130, 246, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: `calc(${\n (isMuted ? 0 : volume) * 100\n }% - 7px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"14px\",\n height: \"14px\",\n background:\n \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n boxShadow:\n \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\",\n transition:\n \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 3px 10px rgba(0, 0, 0, 0.4), 0 0 0 3px rgba(59, 130, 246, 0.5), 0 0 20px rgba(59, 130, 246, 0.6)\";\n e.currentTarget.style.cursor = \"grab\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\";\n }}\n onMouseDown={(e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n }}\n onMouseUp={(e) => {\n e.currentTarget.style.cursor = \"grab\";\n }}\n />\n </div>\n </div>\n </>\n )}\n </div>\n\n <div\n style={{\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n color: \"rgba(255, 255, 255, 0.9)\",\n display: viewportWidth < 480 ? \"none\" : \"block\",\n }}\n >\n {formatTime(currentTime)} / {formatTime(duration)}\n </div>\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`,\n }}\n >\n <div\n style={{\n position: \"relative\",\n display: viewportWidth < 600 ? \"none\" : \"block\",\n }}\n >\n <button\n onClick={() => setShowSpeedMenu(!showSpeedMenu)}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px ${\n 14 * responsiveScale\n }px`,\n borderRadius: `${14 * responsiveScale}px`,\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n fontWeight: \"700\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${56 * responsiveScale}px`,\n minHeight: `${40 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow =\n \"0 10px 32px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow =\n \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n }}\n title=\"Playback Speed\"\n >\n {playbackRate}x\n </button>\n\n {showSpeedMenu && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n right: 0,\n marginBottom: \"12px\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.95) 100%)\",\n backdropFilter: \"blur(20px)\",\n borderRadius: \"12px\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n overflow: \"hidden\",\n minWidth: \"90px\",\n boxShadow:\n \"0 16px 48px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.1)\",\n }}\n >\n {[0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map(\n (speed) => (\n <button\n key={speed}\n onClick={() =>\n handlePlaybackRateChange(speed)\n }\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"10px 16px\",\n background:\n playbackRate === speed\n ? \"linear-gradient(135deg, rgba(99, 102, 241, 0.8) 0%, rgba(139, 92, 246, 0.6) 100%)\"\n : \"transparent\",\n border: \"none\",\n color: \"white\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n fontWeight: \"600\",\n textAlign: \"center\",\n transition:\n \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n borderBottom:\n speed !== 2\n ? \"1px solid rgba(255, 255, 255, 0.05)\"\n : \"none\",\n }}\n onMouseEnter={(e) => {\n if (playbackRate !== speed) {\n (\n e.target as HTMLElement\n ).style.background =\n \"linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.05) 100%)\";\n }\n }}\n onMouseLeave={(e) => {\n if (playbackRate !== speed) {\n (\n e.target as HTMLElement\n ).style.background = \"transparent\";\n }\n }}\n >\n {speed}x\n </button>\n )\n )}\n </div>\n )}\n </div>\n\n <button\n onClick={() => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current\n .toggleFullscreen()\n .catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow =\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n }}\n title={\n isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\"\n }\n >\n {isFullscreen ? (\n <FaCompress\n size={Math.max(14, 16 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n ) : (\n <FaExpand\n size={Math.max(14, 16 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n )}\n </button>\n </div>\n </div>\n </div>\n </>\n ) : (\n showCustomControls &&\n !showLicenseWarning && (\n <div\n style={{\n position: \"absolute\",\n bottom: `${10 * responsiveScale}px`,\n right: `${10 * responsiveScale}px`,\n transform: \"none\",\n display: \"flex\",\n flexDirection: isPortrait ? \"column\" : \"row\",\n gap: `${10 * responsiveScale}px`,\n zIndex: 10,\n }}\n >\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\",\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n >\n <button\n onClick={() => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n }}\n onMouseEnter={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n }}\n onMouseLeave={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow:\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`,\n }}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted || volume === 0 ? (\n <FaVolumeMute\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n ) : volume < 0.5 ? (\n <FaVolumeDown\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n ) : (\n <FaVolumeUp\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n )}\n </button>\n\n {showVolumeSlider && (\n <>\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9,\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.96) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(20px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.7)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow:\n \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\",\n zIndex: 10,\n transition:\n \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\",\n }}\n onMouseEnter={(e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow =\n \"0 16px 48px rgba(0, 0, 0, 0.9), 0 6px 16px rgba(0, 0, 0, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 24px rgba(96, 165, 250, 0.4)\";\n e.currentTarget.style.borderColor =\n \"rgba(96, 165, 250, 0.8)\";\n }}\n onMouseLeave={(e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow =\n \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\";\n e.currentTarget.style.borderColor =\n \"rgba(255, 255, 255, 0.7)\";\n }}\n >\n <div\n style={{\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\",\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n\n const handleMouseMove = (\n moveEvent: MouseEvent\n ) => {\n if (!sliderElement) return;\n const rect =\n sliderElement.getBoundingClientRect();\n const y = moveEvent.clientY - rect.top;\n const percentage =\n 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n\n const rect =\n sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const rect =\n e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n >\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background:\n \"linear-gradient(180deg, rgba(255, 255, 255, 0.85) 0%, rgba(255, 255, 255, 0.5) 100%)\",\n borderRadius: \"4px\",\n border: \"1px solid rgba(255, 255, 255, 0.4)\",\n boxShadow: \"inset 0 1px 3px rgba(0, 0, 0, 0.3)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background:\n \"linear-gradient(180deg, rgba(125, 211, 252, 1) 0%, rgba(96, 165, 250, 0.98) 50%, rgba(59, 130, 246, 0.95) 100%)\",\n borderRadius: \"4px\",\n transition:\n \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow:\n \"0 0 12px rgba(96, 165, 250, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.4)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: `calc(${\n (isMuted ? 0 : volume) * 100\n }% - 8px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"16px\",\n height: \"16px\",\n background:\n \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n border: \"2px solid rgba(96, 165, 250, 0.9)\",\n boxShadow:\n \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\",\n transition:\n \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 3px rgba(96, 165, 250, 0.6), 0 0 24px rgba(96, 165, 250, 0.7)\";\n e.currentTarget.style.cursor = \"grab\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\";\n }}\n onMouseDown={(e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n }}\n onMouseUp={(e) => {\n e.currentTarget.style.cursor = \"grab\";\n }}\n />\n </div>\n </div>\n </>\n )}\n </div>\n\n <button\n onClick={() => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current.toggleFullscreen().catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n }}\n onMouseEnter={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n }}\n onMouseLeave={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow:\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`,\n }}\n title={\n isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\"\n }\n >\n {isFullscreen ? (\n <FaCompress\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n ) : (\n <FaExpand\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n )}\n </button>\n </div>\n )\n )}\n\n {onControlClick && (\n <div\n onClick={onControlClick}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n cursor: \"pointer\",\n }}\n />\n )}\n </div>\n </>\n );\n },\n (prevProps, nextProps) => {\n for (const prop of CRITICAL_PROPS) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n const uiProps = [\n \"autoplay\",\n \"muted\",\n \"controls\",\n \"showCustomControls\",\n \"className\",\n \"style\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"playsInline\",\n \"preload\",\n \"poster\",\n \"children\",\n ] as const;\n\n for (const prop of uiProps) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n const callbackProps = [\n \"onReady\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\",\n ] as const;\n for (const prop of callbackProps) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n return true;\n }\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","import Hls from \"hls.js\";\nimport type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n Id3TagInfo,\n AdController,\n} from \"../types\";\nimport { createAdStormPlayer } from \"../sdk/adstormPlayer\";\nimport { initializePolyfills } from \"../utils/polyfills\";\nimport { getBrowserConfigOverrides, logBrowserInfo } from \"../utils/browserCompat\";\n\nexport class StormcloudVideoPlayer {\n private readonly video: HTMLVideoElement;\n private readonly config: StormcloudVideoPlayerConfig;\n private hls?: Hls;\n private adPlayer: AdController;\n private attached = false;\n private inAdBreak = false;\n private expectedAdBreakDurationMs: number | undefined;\n private adStopTimerId: number | undefined;\n private ptsDriftEmaMs = 0;\n private isLiveStream: boolean = false;\n private nativeHlsMode: boolean = false;\n private videoSrcProtection: string | null = null;\n private bufferedSegmentsCount: number = 0;\n private shouldAutoplayAfterBuffering: boolean = false;\n private hasInitialBufferCompleted: boolean = false;\n private timeUpdateHandler?: (event: Event) => void;\n private emptiedHandler?: (event: Event) => void;\n\n constructor(config: StormcloudVideoPlayerConfig) {\n initializePolyfills();\n\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...config, ...browserOverrides };\n this.video = config.videoElement;\n\n logBrowserInfo(config.debugAdTiming);\n\n if (!this.config.licenseKey) {\n console.warn(\"[StormcloudVideoPlayer] No license key provided - ads will not work\");\n }\n\n this.adPlayer = createAdStormPlayer(this.video, {\n licenseKey: this.config.licenseKey || \"\",\n debug: this.config.debugAdTiming ?? false,\n });\n }\n\n async load(): Promise<void> {\n if (!this.attached) {\n this.attach();\n }\n\n if (this.shouldUseNativeHls()) {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n\n this.isLiveStream = this.config.lowLatencyMode ?? false;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Using native HLS playback:\", {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n });\n }\n\n this.adPlayer.initialize();\n\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n return;\n }\n\n this.hls = new Hls({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1.0,\n ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1000 * 1000,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\n startPosition: -1,\n });\n\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, async () => {\n this.isLiveStream =\n this.hls?.levels?.some(\n (level) =>\n level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive: this.isLiveStream,\n });\n }\n\n this.adPlayer.initialize();\n\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_BUFFERED, async () => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n\n if (this.shouldAutoplayAfterBuffering) {\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete. Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_PARSING_METADATA, (_evt, data: any) => {\n const id3Tags: Id3TagInfo[] = (data?.samples || []).map((s: any) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts,\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n\n this.hls.on(Hls.Events.FRAG_CHANGED, (_evt, data: any) => {\n const frag = data?.frag;\n const tagList: any[] | undefined = frag?.tagList;\n if (!Array.isArray(tagList)) return;\n\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n\n if (!tag) continue;\n \n if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = this.parseCueOutDuration(value);\n this.onScte35Marker({\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value },\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = this.parseCueOutCont(value);\n this.onScte35Marker({\n type: \"progress\",\n ...(prog?.duration !== undefined ? { durationSeconds: prog.duration } : {}),\n ...(prog?.elapsed !== undefined ? { ptsSeconds: prog.elapsed } : {}),\n raw: { tag, value },\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value } });\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = this.parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs;\n const hasScteIn = \"SCTE35-IN\" in attrs;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = this.toNumber(attrs[\"DURATION\"]) ?? this.toNumber(attrs[\"PLANNED-DURATION\"]);\n\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n this.onScte35Marker({\n type: \"start\",\n ...(duration !== undefined ? { durationSeconds: duration } : {}),\n raw: { tag, value, attrs },\n });\n }\n if (hasScteIn) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value, attrs } });\n }\n }\n }\n });\n\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.destroy();\n break;\n }\n }\n });\n\n this.hls.attachMedia(this.video);\n }\n\n private attach(): void {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n \n this.adPlayer.on(\"all_ads_completed\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad completed - ending ad break\");\n }\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n \n this.adPlayer.on(\"ad_error\", () => {\n console.error(\"[StormcloudVideoPlayer] Ad error occurred\");\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n \n this.adPlayer.on(\"content_pause\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content paused for ad\");\n }\n });\n \n this.adPlayer.on(\"content_resume\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content resuming after ad\");\n }\n });\n\n this.timeUpdateHandler = () => {\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n\n this.emptiedHandler = () => {\n if (this.nativeHlsMode && this.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Video src was cleared, restoring\");\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {});\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n\n private shouldUseNativeHls(): boolean {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n\n private onId3Tag(tag: Id3TagInfo): void {\n if (typeof tag.ptsSeconds === \"number\") {\n this.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = this.parseScte35FromId3(tag);\n if (marker) {\n this.onScte35Marker(marker);\n }\n }\n\n private parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n const text = this.decodeId3ValueToText(tag.value);\n if (!text) return undefined;\n\n const cueOutMatch =\n text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) ||\n text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = this.parseCueOutDuration(arg);\n return {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(dur !== undefined ? { durationSeconds: dur } : {}),\n raw: { id3: text },\n };\n }\n\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = this.parseCueOutCont(arg);\n return {\n type: \"progress\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(cont?.duration !== undefined ? { durationSeconds: cont.duration } : {}),\n raw: { id3: text },\n };\n }\n\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n return {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n };\n }\n\n return undefined;\n }\n\n private decodeId3ValueToText(value: string | Uint8Array): string | undefined {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++) {\n out += String.fromCharCode(value[i]!);\n }\n return out;\n } catch {\n return undefined;\n }\n }\n\n private async onScte35Marker(marker: Scte35Marker): Promise<void> {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime,\n });\n }\n\n if (marker.type === \"start\") {\n if (this.inAdBreak) {\n return;\n }\n\n this.inAdBreak = true;\n const durationMs = marker.durationSeconds != null\n ? marker.durationSeconds * 1000\n : 30000;\n \n this.expectedAdBreakDurationMs = durationMs;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break:\", {\n durationMs,\n durationSeconds: marker.durationSeconds,\n });\n }\n\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n\n await this.handleAdStart(marker);\n\n if (this.expectedAdBreakDurationMs != null) {\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n return;\n }\n\n if (marker.type === \"progress\" && this.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.expectedAdBreakDurationMs = marker.durationSeconds * 1000;\n }\n return;\n }\n\n if (marker.type === \"end\") {\n if (!this.inAdBreak) return;\n \n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.clearAdStopTimer();\n\n if (this.adPlayer.isAdPlaying()) {\n await this.adPlayer.stop();\n }\n\n this.handleAdPodComplete();\n return;\n }\n }\n\n private async handleAdStart(marker: Scte35Marker): Promise<void> {\n const durationSeconds = marker.durationSeconds ?? 30;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Requesting ads for duration:\", durationSeconds);\n }\n\n try {\n await this.adPlayer.requestAds(String(durationSeconds));\n \n await this.adPlayer.play();\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Ad request/play failed:\", error);\n }\n this.handleAdPodComplete();\n }\n }\n\n private parseCueOutDuration(value: string): number | undefined {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match =\n value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) ||\n value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const d = parseFloat(match[1]);\n return Number.isNaN(d) ? undefined : d;\n }\n return undefined;\n }\n\n private parseCueOutCont(value: string): { elapsed?: number; duration?: number } | undefined {\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n const res: { elapsed?: number; duration?: number } = {};\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return undefined;\n }\n\n private parseAttributeList(value: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n const key: string = (match[1] ?? \"\") as string;\n let rawVal: string = (match[3] ?? match[4] ?? \"\") as string;\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n }\n\n private toNumber(val: unknown): number | undefined {\n if (val == null) return undefined;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? undefined : n;\n }\n\n private scheduleAdStopCountdown(remainingMs: number): void {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.handleAdPodComplete();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.handleAdPodComplete();\n }, ms) as unknown as number;\n }\n\n private clearAdStopTimer(): void {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = undefined;\n }\n }\n\n private updatePtsDrift(ptsSecondsSample: number): void {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1000;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 60000) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n\n private handleAdPodComplete(): void {\n this.clearAdStopTimer();\n \n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n\n this.adPlayer.stop().catch(() => {});\n\n const restoredMuted = this.adPlayer.getOriginalMutedState();\n const restoredVolume = this.adPlayer.getOriginalVolume();\n\n if (this.video.muted !== restoredMuted) {\n this.video.muted = restoredMuted;\n }\n if (Math.abs(this.video.volume - restoredVolume) > 0.01) {\n this.video.volume = restoredVolume;\n }\n\n if (this.video.paused) {\n this.video.play()?.catch(() => {});\n }\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad break complete\");\n }\n }\n\n isAdPlaying(): boolean {\n return this.inAdBreak && this.adPlayer.isAdPlaying();\n }\n\n isShowingAds(): boolean {\n return this.adPlayer.isAdPlaying();\n }\n\n getStreamType(): \"hls\" | \"other\" {\n const url = this.config.src.toLowerCase();\n if (\n url.includes(\".m3u8\") ||\n url.includes(\"/hls/\") ||\n url.includes(\"application/vnd.apple.mpegurl\")\n ) {\n return \"hls\";\n }\n return \"other\";\n }\n\n shouldShowNativeControls(): boolean {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(\n this.config.allowNativeHls && !(this.config.showCustomControls ?? false)\n );\n }\n\n toggleMute(): void {\n if (this.adPlayer.isAdPlaying()) {\n const currentMuted = this.video.muted;\n const newMutedState = !currentMuted;\n\n this.adPlayer.updateOriginalMutedState(newMutedState, this.video.volume);\n this.adPlayer.setAdVolume(newMutedState ? 0 : 1);\n } else {\n this.video.muted = !this.video.muted;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n }\n }\n\n toggleFullscreen(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = this.video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container\n .requestFullscreen()\n .then(() => resolve())\n .catch(reject);\n } else {\n document.exitFullscreen().then(() => resolve()).catch(reject);\n }\n });\n }\n\n isMuted(): boolean {\n return this.video.muted;\n }\n\n setMuted(muted: boolean): void {\n this.video.muted = muted;\n this.adPlayer.updateOriginalMutedState(muted, this.video.volume);\n\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(muted ? 0 : 1);\n }\n }\n\n setVolume(volume: number): void {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(clampedVolume);\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n } else {\n this.video.volume = clampedVolume;\n this.video.muted = clampedVolume === 0;\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n }\n }\n\n isFullscreen(): boolean {\n return !!document.fullscreenElement;\n }\n\n isLive(): boolean {\n return this.isLiveStream;\n }\n\n get videoElement(): HTMLVideoElement {\n return this.video;\n }\n\n resize(): void {\n if (this.adPlayer && this.adPlayer.isAdPlaying()) {\n const width = this.video.clientWidth || 640;\n const height = this.video.clientHeight || 360;\n this.adPlayer.resize(width, height);\n }\n }\n\n destroy(): void {\n this.clearAdStopTimer();\n\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n\n this.hls?.destroy();\n this.adPlayer?.destroy();\n }\n\n getCurrentAdIndex(): number {\n return 0;\n }\n\n getTotalAdsInBreak(): number {\n return 1;\n }\n}\n","export function polyfillURLSearchParams(): void {\n if (typeof URLSearchParams !== 'undefined') {\n return;\n }\n\n class URLSearchParamsPolyfill {\n private params: Map<string, string[]>;\n\n constructor(init?: string | URLSearchParamsPolyfill) {\n this.params = new Map();\n\n if (typeof init === 'string') {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n\n private parseQueryString(query: string): void {\n const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n if (!cleanQuery) return;\n\n cleanQuery.split('&').forEach((param) => {\n const [key, value] = param.split('=');\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n this.append(decodedKey, decodedValue);\n }\n });\n }\n\n private safeDecodeURIComponent(str: string): string {\n try {\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n } catch (e) {\n return str;\n }\n }\n\n append(name: string, value: string): void {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n\n delete(name: string): void {\n this.params.delete(name);\n }\n\n get(name: string): string | null {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n }\n\n getAll(name: string): string[] {\n return this.params.get(name) || [];\n }\n\n has(name: string): boolean {\n return this.params.has(name);\n }\n\n set(name: string, value: string): void {\n this.params.set(name, [String(value)]);\n }\n\n forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n\n toString(): string {\n const parts: string[] = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join('&');\n }\n }\n\n // @ts-ignore\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n if (typeof TextEncoder !== 'undefined') {\n return;\n }\n\n class TextEncoderPolyfill {\n encoding = 'utf-8';\n\n encode(str: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 0x80) {\n utf8.push(charcode);\n } else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n } else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(\n 0xe0 | (charcode >> 12),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n } else {\n i++;\n charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charcode >> 18),\n 0x80 | ((charcode >> 12) & 0x3f),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n\n // @ts-ignore\n window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n Promise.prototype.finally = function (callback: () => void) {\n const constructor = this.constructor as PromiseConstructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) =>\n constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\n\nexport function polyfillObjectAssign(): void {\n if (typeof Object.assign !== 'function') {\n Object.assign = function (target: any, ...sources: any[]) {\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n const to = Object(target);\n\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n\n return to;\n };\n }\n}\n\nexport function polyfillArrayFrom(): void {\n if (!Array.from) {\n Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError('Array.from requires an array-like object');\n }\n\n const len = items.length >>> 0;\n const result = new Array(len);\n\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n\n return result;\n };\n }\n}\n\nexport function polyfillStringStartsWith(): void {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function (search: string, pos?: number) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\n\nexport function polyfillStringEndsWith(): void {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function (search: string, length?: number) {\n if (length === undefined || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\n\nexport function polyfillStringIncludes(): void {\n if (!String.prototype.includes) {\n String.prototype.includes = function (search: string, start?: number) {\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\n\nexport function initializePolyfills(): void {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsModernJS: boolean;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n\n if (/Web0S|webOS/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n }\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n\n if (chromeVersion < 50) {\n supportsModernJS = false;\n isLegacyTV = true;\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (isSmartTV) {\n isLegacyTV = true;\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS,\n };\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { allowNativeHls?: boolean } = {};\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n\n return overrides;\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/ui/StormcloudVideoPlayer.cjs","../../src/ui/StormcloudVideoPlayer.tsx","../../src/sdk/adstormPlayer.ts","../../src/player/StormcloudVideoPlayer.ts","../../src/utils/polyfills.ts","../../src/utils/browserCompat.ts"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","StormcloudVideoPlayer_exports","StormcloudVideoPlayerComponent","module","exports","import_react","require","import_hls","SUPPORTED_VIDEO_EXTENSIONS","UNSUPPORTED_VIDEO_EXTENSIONS","getFileExtension","url","pathname","URL","lastDot","lastIndexOf","slice","toLowerCase","ext","split","isUnsupportedFormat","indexOf","replace","isSupportedFormat","mimeType","includes","createAdStormPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","adVideoElement","adContainerEl","destroyed","allowNativeHls","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","log","args","debug","console","emit","event","payload","set","Array","fn","error","warn","fireTrackingPixels","urls","length","forEach","img","Image","src","buildVastUrl","durationSeconds","metadata","baseUrl","licenseKey","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","type","trim","originalUrl","replaceFlvExtension","push","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","currentAd","ad","addEventListener","progress","currentTime","e","opacity","setTimeout","display","pointerEvents","visibility","handleAdError","fetchVast","vastUrl","response","xmlText","fetch","headers","ok","Error","status","statusText","text","initialize","container","right","bottom","alignItems","justifyContent","transition","parentElement","appendChild","requestAds","parsed","Promise","reject","isNaN","resolve","play","mediaFile","pause","offsetHeight","stop","destroy","remove","removeChild","resize","on","listener","has","Set","off","delete","setAdVolume","updateOriginalMutedState","nextVolume","Number","getOriginalMutedState","getOriginalVolume","showPlaceholder","hidePlaceholder","setAllowNativeHls","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","startsWith","param","decodedKey","safeDecodeURIComponent","decodedValue","str","decodeURIComponent","values","String","getAll","callback","toString","parts","join","window","polyfillTextEncoder","TextEncoder","TextEncoderPolyfill","encoding","encode","utf8","i","charcode","charCodeAt","Uint8Array","polyfillPromiseFinally","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","result","polyfillStringStartsWith","search","pos","substring","endsWith","polyfillStringIncludes","polyfillStringEndsWith","initializePolyfills","getChromeVersion","ua","match","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsModernJS","chromeVersion","webkitVersion","logBrowserInfo","browser","getBrowserConfigOverrides","overrides","StormcloudVideoPlayer","config","attached","inAdBreak","ptsDriftEmaMs","isLiveStream","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","browserOverrides","videoElement","debugAdTiming","adPlayer","load","attach","shouldUseNativeHls","lowLatencyMode","isLive","autoplay","catch","hls","Hls","enableWorker","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","startPosition","Events","MEDIA_ATTACHED","level","details","live","nudgeMaxRetry","loadSource","MANIFEST_PARSED","minSegments","levels","some","minSegmentsBeforePlay","FRAG_BUFFERED","err","FRAG_PARSING_METADATA","_evt","data","id3Tags","samples","map","s","ptsSeconds","pts","tag","onId3Tag","FRAG_CHANGED","frag","tagList","isArray","entry","idx","parseCueOutDuration","onScte35Marker","raw","prog","parseCueOutCont","elapsed","attrs","parseAttributeList","hasScteOut","hasScteIn","klass","toNumber","ERROR","fatal","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","attachMedia","handleAdPodComplete","timeUpdateHandler","emptiedHandler","isAdPlaying","wasPaused","paused","streamType","getStreamType","canNative","canPlayType","updatePtsDrift","marker","parseScte35FromId3","decodeId3ValueToText","cueOutMatch","arg","dur","id3","cueOutContMatch","cont","cueInMatch","decoder","TextDecoder","decode","out","fromCharCode","durationMs","handleAdStart","num","d","elapsedMatch","durationMatch","res","regex","rawVal","val","n","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ms","floor","adStopTimerId","clearTimeout","ptsSecondsSample","sampleMs","isFinite","alpha","expectedAdBreakDurationMs","restoredMuted","restoredVolume","isShowingAds","shouldShowNativeControls","showCustomControls","toggleMute","currentMuted","newMutedState","toggleFullscreen","fullscreenElement","requestFullscreen","exitFullscreen","isMuted","setMuted","setVolume","clampedVolume","isFullscreen","clientHeight","removeEventListener","getCurrentAdIndex","getTotalAdsInBreak","React","memo","props","driftToleranceMs","immediateManifestAds","hideLoadingIndicator","onVolumeToggle","onFullscreenToggle","onControlClick","onReady","wrapperClassName","wrapperStyle","className","controls","preload","poster","children","restVideoAttrs","useRef","useState","setAdStatus","setShouldShowNativeControls","setIsMuted","setIsFullscreen","setIsPlaying","setCurrentTime","setDuration","playbackRate","setPlaybackRate","showVolumeSlider","setShowVolumeSlider","showSpeedMenu","setShowSpeedMenu","isLoading","setIsLoading","isBuffering","setIsBuffering","showLicenseWarning","setShowLicenseWarning","innerWidth","innerHeight","viewportWidth","isPortrait","setViewportWidth","setIsPortrait","getResponsiveScale","seconds","minutes","padStart","remainingSeconds","videoRef","current","currentSrc","readyState","getBoundingClientRect","clickX","rect","newTime","newVolume","rate","useMemo","prop","cfg","player","showNative","criticalPropsKey","playerRef","currentIndex","prev","showAds","totalAds","setInterval","checkAdStatus","clearInterval","interval","useEffect","handleResize","currentTimeValue","durationValue","volumeValue","rateValue","updateStates","handleFullscreenChange","bufferingTimeoutRef","handleLoadStart","handleLoadedMetadata","handleLoadedData","handleCanPlay","handleCanPlayThrough","handleWaiting","handlePlaying","handlePause","handleEnded","import_jsx_runtime","jsxs","Fragment","jsx","overflow","minHeight","maxWidth","maxHeight","borderRadius","boxShadow","ref","aspectRatio","import_fa","FaSpinner","color","animation","transform","background","padding","backdropFilter","border","textAlign","margin","fontSize","fontWeight","marginBottom","textShadow","lineHeight","showCenterPlay","adStatus","onClick","handleCenterPlayClick","cursor","onMouseEnter","currentTarget","borderColor","onMouseLeave","FaPlay","size","marginLeft","shouldShowEnhancedControls","handleTimelineSeek","flexWrap","gap","responsiveScale","handlePlayPause","minWidth","FaPause","FaVolumeMute","FaVolumeDown","FaVolumeUp","flexDirection","onMouseDown","preventDefault","sliderElement","handleMouseMove","moveEvent","y","clientY","percentage","handleVolumeChange"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar StormcloudVideoPlayer_exports = {};\n__export(StormcloudVideoPlayer_exports, {\n StormcloudVideoPlayerComponent: () => StormcloudVideoPlayerComponent\n});\nmodule.exports = __toCommonJS(StormcloudVideoPlayer_exports);\nvar import_react = __toESM(require(\"react\"), 1);\n\n// src/player/StormcloudVideoPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/sdk/adstormPlayer.ts\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\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n if (/Web0S|webOS/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n }\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n if (chromeVersion < 50) {\n supportsModernJS = false;\n isLegacyTV = true;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (isSmartTV) {\n isLegacyTV = true;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS\n };\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n userAgent: navigator.userAgent\n });\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n return overrides;\n}\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n constructor(config) {\n this.attached = false;\n this.inAdBreak = false;\n this.ptsDriftEmaMs = 0;\n this.isLiveStream = false;\n this.nativeHlsMode = false;\n this.videoSrcProtection = null;\n this.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = false;\n initializePolyfills();\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...config, ...browserOverrides };\n this.video = config.videoElement;\n logBrowserInfo(config.debugAdTiming);\n if (!this.config.licenseKey) {\n console.warn(\"[StormcloudVideoPlayer] No license key provided - ads will not work\");\n }\n this.adPlayer = createAdStormPlayer(this.video, {\n licenseKey: this.config.licenseKey || \"\",\n debug: this.config.debugAdTiming ?? false\n });\n }\n async load() {\n if (!this.attached) {\n this.attach();\n }\n if (this.shouldUseNativeHls()) {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n this.isLiveStream = this.config.lowLatencyMode ?? false;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Using native HLS playback:\", {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls\n });\n }\n this.adPlayer.initialize();\n this.adPlayer.setAllowNativeHls(!!this.config.allowNativeHls);\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n return;\n }\n this.hls = new import_hls.default({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1,\n ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\n startPosition: -1\n });\n this.hls.on(import_hls.default.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n this.hls.on(import_hls.default.Events.MANIFEST_PARSED, async () => {\n this.isLiveStream = this.hls?.levels?.some(\n (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive: this.isLiveStream\n });\n }\n this.adPlayer.initialize();\n this.adPlayer.setAllowNativeHls(!!this.config.allowNativeHls);\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n });\n this.hls.on(import_hls.default.Events.FRAG_BUFFERED, async () => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n if (this.shouldAutoplayAfterBuffering) {\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete. Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n this.hls.on(import_hls.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n const id3Tags = (data?.samples || []).map((s) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n this.hls.on(import_hls.default.Events.FRAG_CHANGED, (_evt, data) => {\n const frag = data?.frag;\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) return;\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = this.parseCueOutDuration(value);\n this.onScte35Marker({\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value }\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = this.parseCueOutCont(value);\n this.onScte35Marker({\n type: \"progress\",\n ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n raw: { tag, value }\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value } });\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = this.parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs;\n const hasScteIn = \"SCTE35-IN\" in attrs;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = this.toNumber(attrs[\"DURATION\"]) ?? this.toNumber(attrs[\"PLANNED-DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n this.onScte35Marker({\n type: \"start\",\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { tag, value, attrs }\n });\n }\n if (hasScteIn) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value, attrs } });\n }\n }\n }\n });\n this.hls.on(import_hls.default.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case import_hls.default.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case import_hls.default.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.destroy();\n break;\n }\n }\n });\n this.hls.attachMedia(this.video);\n }\n attach() {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adPlayer.on(\"all_ads_completed\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad completed - ending ad break\");\n }\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n this.adPlayer.on(\"ad_error\", () => {\n console.error(\"[StormcloudVideoPlayer] Ad error occurred\");\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n this.adPlayer.on(\"content_pause\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content paused for ad\");\n }\n });\n this.adPlayer.on(\"content_resume\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content resuming after ad\");\n }\n });\n this.timeUpdateHandler = () => {\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n this.emptiedHandler = () => {\n if (this.nativeHlsMode && this.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Video src was cleared, restoring\");\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {\n });\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n shouldUseNativeHls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n onId3Tag(tag) {\n if (typeof tag.ptsSeconds === \"number\") {\n this.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = this.parseScte35FromId3(tag);\n if (marker) {\n this.onScte35Marker(marker);\n }\n }\n parseScte35FromId3(tag) {\n const text = this.decodeId3ValueToText(tag.value);\n if (!text) return void 0;\n const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = this.parseCueOutDuration(arg);\n return {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...dur !== void 0 ? { durationSeconds: dur } : {},\n raw: { id3: text }\n };\n }\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = this.parseCueOutCont(arg);\n return {\n type: \"progress\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n raw: { id3: text }\n };\n }\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n return {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n }\n return void 0;\n }\n decodeId3ValueToText(value) {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++) {\n out += String.fromCharCode(value[i]);\n }\n return out;\n } catch {\n return void 0;\n }\n }\n async onScte35Marker(marker) {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime\n });\n }\n if (marker.type === \"start\") {\n if (this.inAdBreak) {\n return;\n }\n this.inAdBreak = true;\n const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : 3e4;\n this.expectedAdBreakDurationMs = durationMs;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break:\", {\n durationMs,\n durationSeconds: marker.durationSeconds\n });\n }\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n await this.handleAdStart(marker);\n if (this.expectedAdBreakDurationMs != null) {\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.expectedAdBreakDurationMs = marker.durationSeconds * 1e3;\n }\n return;\n }\n if (marker.type === \"end\") {\n if (!this.inAdBreak) return;\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = void 0;\n this.clearAdStopTimer();\n if (this.adPlayer.isAdPlaying()) {\n await this.adPlayer.stop();\n }\n this.handleAdPodComplete();\n return;\n }\n }\n async handleAdStart(marker) {\n const durationSeconds = marker.durationSeconds ?? 30;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Requesting ads for duration:\", durationSeconds);\n }\n try {\n await this.adPlayer.requestAds(String(durationSeconds));\n await this.adPlayer.play();\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Ad request/play failed:\", error);\n }\n this.handleAdPodComplete();\n }\n }\n parseCueOutDuration(value) {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const d = parseFloat(match[1]);\n return Number.isNaN(d) ? void 0 : d;\n }\n return void 0;\n }\n parseCueOutCont(value) {\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n const res = {};\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return void 0;\n }\n parseAttributeList(value) {\n const attrs = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match;\n while ((match = regex.exec(value)) !== null) {\n const key = match[1] ?? \"\";\n let rawVal = match[3] ?? match[4] ?? \"\";\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n }\n toNumber(val) {\n if (val == null) return void 0;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? void 0 : n;\n }\n scheduleAdStopCountdown(remainingMs) {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.handleAdPodComplete();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.handleAdPodComplete();\n }, ms);\n }\n clearAdStopTimer() {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = void 0;\n }\n }\n updatePtsDrift(ptsSecondsSample) {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n handleAdPodComplete() {\n this.clearAdStopTimer();\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = void 0;\n this.adPlayer.stop().catch(() => {\n });\n const restoredMuted = this.adPlayer.getOriginalMutedState();\n const restoredVolume = this.adPlayer.getOriginalVolume();\n if (this.video.muted !== restoredMuted) {\n this.video.muted = restoredMuted;\n }\n if (Math.abs(this.video.volume - restoredVolume) > 0.01) {\n this.video.volume = restoredVolume;\n }\n if (this.video.paused) {\n this.video.play()?.catch(() => {\n });\n }\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad break complete\");\n }\n }\n isAdPlaying() {\n return this.inAdBreak && this.adPlayer.isAdPlaying();\n }\n isShowingAds() {\n return this.adPlayer.isAdPlaying();\n }\n getStreamType() {\n const url = this.config.src.toLowerCase();\n if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n return \"hls\";\n }\n return \"other\";\n }\n shouldShowNativeControls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n }\n toggleMute() {\n if (this.adPlayer.isAdPlaying()) {\n const currentMuted = this.video.muted;\n const newMutedState = !currentMuted;\n this.adPlayer.updateOriginalMutedState(newMutedState, this.video.volume);\n this.adPlayer.setAdVolume(newMutedState ? 0 : 1);\n } else {\n this.video.muted = !this.video.muted;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n }\n }\n toggleFullscreen() {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = this.video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container.requestFullscreen().then(() => resolve()).catch(reject);\n } else {\n document.exitFullscreen().then(() => resolve()).catch(reject);\n }\n });\n }\n isMuted() {\n return this.video.muted;\n }\n setMuted(muted) {\n this.video.muted = muted;\n this.adPlayer.updateOriginalMutedState(muted, this.video.volume);\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(muted ? 0 : 1);\n }\n }\n setVolume(volume) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(clampedVolume);\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n } else {\n this.video.volume = clampedVolume;\n this.video.muted = clampedVolume === 0;\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n }\n }\n isFullscreen() {\n return !!document.fullscreenElement;\n }\n isLive() {\n return this.isLiveStream;\n }\n get videoElement() {\n return this.video;\n }\n resize() {\n if (this.adPlayer && this.adPlayer.isAdPlaying()) {\n const width = this.video.clientWidth || 640;\n const height = this.video.clientHeight || 360;\n this.adPlayer.resize(width, height);\n }\n }\n destroy() {\n this.clearAdStopTimer();\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n this.hls?.destroy();\n this.adPlayer?.destroy();\n }\n getCurrentAdIndex() {\n return 0;\n }\n getTotalAdsInBreak() {\n return 1;\n }\n};\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar import_fa = require(\"react-icons/fa\");\nvar import_jsx_runtime = require(\"react/jsx-runtime\");\nvar CRITICAL_PROPS = [\n \"src\",\n \"allowNativeHls\",\n \"licenseKey\",\n \"lowLatencyMode\",\n \"driftToleranceMs\"\n];\nvar StormcloudVideoPlayerComponent = import_react.default.memo(\n (props) => {\n const {\n src,\n autoplay,\n muted,\n lowLatencyMode,\n allowNativeHls,\n driftToleranceMs,\n immediateManifestAds,\n debugAdTiming,\n showCustomControls,\n hideLoadingIndicator,\n onVolumeToggle,\n onFullscreenToggle,\n onControlClick,\n onReady,\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n controls,\n playsInline,\n preload,\n poster,\n children,\n licenseKey,\n minSegmentsBeforePlay,\n ...restVideoAttrs\n } = props;\n const videoRef = (0, import_react.useRef)(null);\n const playerRef = (0, import_react.useRef)(null);\n const bufferingTimeoutRef = (0, import_react.useRef)(null);\n const [adStatus, setAdStatus] = import_react.default.useState({ showAds: false, currentIndex: 0, totalAds: 0 });\n const [shouldShowNativeControls, setShouldShowNativeControls] = import_react.default.useState(true);\n const [isMuted, setIsMuted] = import_react.default.useState(false);\n const [isFullscreen, setIsFullscreen] = import_react.default.useState(false);\n const [isPlaying, setIsPlaying] = import_react.default.useState(false);\n const [currentTime, setCurrentTime] = import_react.default.useState(0);\n const [duration, setDuration] = import_react.default.useState(0);\n const [volume, setVolume] = import_react.default.useState(1);\n const [playbackRate, setPlaybackRate] = import_react.default.useState(1);\n const [showVolumeSlider, setShowVolumeSlider] = import_react.default.useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = import_react.default.useState(false);\n const [isLoading, setIsLoading] = import_react.default.useState(true);\n const [isBuffering, setIsBuffering] = import_react.default.useState(false);\n const [showCenterPlay, setShowCenterPlay] = import_react.default.useState(false);\n const [showLicenseWarning, setShowLicenseWarning] = import_react.default.useState(false);\n const [viewportWidth, setViewportWidth] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1920\n );\n const [isPortrait, setIsPortrait] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerHeight > window.innerWidth : false\n );\n const getResponsiveScale = () => {\n if (viewportWidth < 480) return 0.7;\n if (viewportWidth < 768) return 0.8;\n if (viewportWidth < 1024) return 0.9;\n return 1;\n };\n const responsiveScale = getResponsiveScale();\n const formatTime = (seconds) => {\n if (!isFinite(seconds)) return \"0:00:00\";\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor(seconds % 3600 / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n };\n const handlePlayPause = () => {\n if (videoRef.current) {\n if (videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n } else {\n videoRef.current.pause();\n setShowCenterPlay(true);\n }\n }\n };\n const handleCenterPlayClick = () => {\n if (videoRef.current && videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n }\n };\n const handleTimelineSeek = (e) => {\n if (videoRef.current && duration > 0 && isFinite(duration)) {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const progress = Math.max(0, Math.min(1, clickX / rect.width));\n const newTime = progress * duration;\n if (isFinite(newTime) && newTime >= 0 && newTime <= duration) {\n videoRef.current.currentTime = newTime;\n }\n }\n };\n const handleVolumeChange = (newVolume) => {\n if (playerRef.current && isFinite(newVolume)) {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n playerRef.current.setVolume(clampedVolume);\n }\n };\n const handlePlaybackRateChange = (rate) => {\n if (videoRef.current && isFinite(rate) && rate > 0) {\n videoRef.current.playbackRate = rate;\n }\n setShowSpeedMenu(false);\n };\n const isHlsStream = src?.toLowerCase().includes(\".m3u8\") || src?.toLowerCase().includes(\"/hls/\");\n const shouldShowEnhancedControls = showCustomControls && (isHlsStream ? allowNativeHls : true);\n const criticalPropsKey = (0, import_react.useMemo)(() => {\n return CRITICAL_PROPS.map((prop) => `${prop}:${props[prop]}`).join(\"|\");\n }, [\n src,\n allowNativeHls,\n licenseKey,\n lowLatencyMode,\n driftToleranceMs\n ]);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\") return;\n const el = videoRef.current;\n if (!el || !src) return;\n if (!licenseKey) {\n setShowLicenseWarning(true);\n setIsLoading(false);\n console.warn(\n \"StormcloudVideoPlayer: License key is required but not provided. Please set the licenseKey prop to use the player.\"\n );\n return;\n }\n setShowLicenseWarning(false);\n if (debugAdTiming) {\n console.log(\"[StormcloudUI] Initializing player, isLoading=true\");\n }\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {\n }\n playerRef.current = null;\n }\n const cfg = {\n src,\n videoElement: el\n };\n if (autoplay !== void 0) cfg.autoplay = autoplay;\n if (muted !== void 0) cfg.muted = muted;\n if (lowLatencyMode !== void 0) cfg.lowLatencyMode = lowLatencyMode;\n if (allowNativeHls !== void 0) cfg.allowNativeHls = allowNativeHls;\n if (driftToleranceMs !== void 0)\n cfg.driftToleranceMs = driftToleranceMs;\n if (immediateManifestAds !== void 0)\n cfg.immediateManifestAds = immediateManifestAds;\n if (debugAdTiming !== void 0) cfg.debugAdTiming = debugAdTiming;\n if (showCustomControls !== void 0)\n cfg.showCustomControls = showCustomControls;\n if (onVolumeToggle !== void 0) cfg.onVolumeToggle = onVolumeToggle;\n if (onFullscreenToggle !== void 0)\n cfg.onFullscreenToggle = onFullscreenToggle;\n if (onControlClick !== void 0) cfg.onControlClick = onControlClick;\n if (licenseKey !== void 0) cfg.licenseKey = licenseKey;\n if (minSegmentsBeforePlay !== void 0)\n cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;\n const player = new StormcloudVideoPlayer(cfg);\n playerRef.current = player;\n player.load().then(() => {\n const showNative = player.shouldShowNativeControls();\n setShouldShowNativeControls(showNative);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Player loaded successfully, waiting for video ready\"\n );\n }\n onReady?.(player);\n }).catch((error) => {\n console.error(\n \"StormcloudVideoPlayer: Failed to load player:\",\n error\n );\n setIsLoading(false);\n onReady?.(player);\n });\n return () => {\n try {\n player.destroy();\n } catch {\n }\n playerRef.current = null;\n };\n }, [criticalPropsKey]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n try {\n if (autoplay !== void 0 && playerRef.current.videoElement) {\n playerRef.current.videoElement.autoplay = autoplay;\n }\n if (muted !== void 0 && !playerRef.current.isShowingAds()) {\n playerRef.current.setMuted(muted);\n }\n } catch (error) {\n console.warn(\"Failed to update player properties:\", error);\n }\n }, [autoplay, muted]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n const checkAdStatus = () => {\n if (playerRef.current) {\n const showAds = playerRef.current.isShowingAds();\n const currentIndex = playerRef.current.getCurrentAdIndex();\n const totalAds = playerRef.current.getTotalAdsInBreak();\n setAdStatus((prev) => {\n if (prev.showAds !== showAds || prev.currentIndex !== currentIndex || prev.totalAds !== totalAds) {\n return { showAds, currentIndex, totalAds };\n }\n return prev;\n });\n }\n };\n const interval = setInterval(checkAdStatus, 100);\n return () => clearInterval(interval);\n }, []);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\" || !playerRef.current) return;\n const handleResize = () => {\n if (playerRef.current && videoRef.current) {\n if (typeof playerRef.current.resize === \"function\") {\n playerRef.current.resize();\n }\n }\n setViewportWidth(window.innerWidth);\n setIsPortrait(window.innerHeight > window.innerWidth);\n };\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current || !videoRef.current) return;\n const updateStates = () => {\n if (playerRef.current && videoRef.current) {\n setIsMuted(playerRef.current.isMuted());\n setIsPlaying(!videoRef.current.paused);\n const currentTimeValue = videoRef.current.currentTime;\n setCurrentTime(isFinite(currentTimeValue) ? currentTimeValue : 0);\n const durationValue = videoRef.current.duration;\n setDuration(isFinite(durationValue) ? durationValue : 0);\n const volumeValue = videoRef.current.volume;\n setVolume(\n isFinite(volumeValue) ? Math.max(0, Math.min(1, volumeValue)) : 1\n );\n const rateValue = videoRef.current.playbackRate;\n setPlaybackRate(\n isFinite(rateValue) && rateValue > 0 ? rateValue : 1\n );\n }\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n const interval = setInterval(updateStates, 200);\n const handleFullscreenChange = () => {\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () => {\n clearInterval(interval);\n document.removeEventListener(\n \"fullscreenchange\",\n handleFullscreenChange\n );\n };\n }, []);\n (0, import_react.useEffect)(() => {\n if (!videoRef.current) return;\n const handleLoadedMetadata = () => {\n if (videoRef.current) {\n const video2 = videoRef.current;\n void video2.offsetHeight;\n }\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadedmetadata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadedData = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadeddata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadStart = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadstart, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleCanPlay = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplay, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleCanPlayThrough = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplaythrough, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleWaiting = () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n }\n bufferingTimeoutRef.current = window.setTimeout(() => {\n setIsBuffering(true);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video buffering detected (after 300ms delay), readyState:\",\n videoRef.current?.readyState,\n \"- showing spinner, isBuffering=true\"\n );\n }\n }, 300);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: waiting, readyState:\",\n videoRef.current?.readyState,\n \"- buffering delay started (300ms)\"\n );\n }\n };\n const handlePlaying = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n setShowCenterPlay(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: playing, readyState:\",\n videoRef.current?.readyState,\n \"- playback started, isLoading=false, isBuffering=false\"\n );\n }\n };\n const handlePause = () => {\n if (playerRef.current && !playerRef.current.isShowingAds()) {\n setShowCenterPlay(true);\n } else {\n setShowCenterPlay(false);\n }\n };\n const handleEnded = () => {\n setShowCenterPlay(true);\n };\n const video = videoRef.current;\n video.addEventListener(\"loadstart\", handleLoadStart);\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n if (video.paused) {\n setShowCenterPlay(true);\n }\n return () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n video.removeEventListener(\"loadstart\", handleLoadStart);\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [debugAdTiming]);\n return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"style\", { children: `\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n \n .stormcloud-loading-hidden .stormcloud-loading-indicator {\n display: none !important;\n }\n \n .stormcloud-video-wrapper:fullscreen {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n .stormcloud-video-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n *:fullscreen {\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n }\n ` }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: `stormcloud-video-wrapper ${wrapperClassName || \"\"}`,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: isFullscreen ? \"fixed\" : \"relative\",\n top: isFullscreen ? 0 : void 0,\n left: isFullscreen ? 0 : void 0,\n overflow: \"hidden\",\n width: isFullscreen ? \"100vw\" : \"100%\",\n height: isFullscreen ? \"100vh\" : \"auto\",\n minHeight: isFullscreen ? \"100vh\" : \"auto\",\n maxWidth: isFullscreen ? \"100vw\" : \"100%\",\n maxHeight: isFullscreen ? \"100vh\" : \"none\",\n zIndex: isFullscreen ? 999999 : void 0,\n backgroundColor: isFullscreen ? \"#000\" : void 0,\n borderRadius: isFullscreen ? 0 : void 0,\n boxShadow: isFullscreen ? \"none\" : void 0,\n ...wrapperStyle\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"video\",\n {\n ref: videoRef,\n className,\n style: {\n display: \"block\",\n width: \"100%\",\n height: isFullscreen ? \"100%\" : \"auto\",\n maxWidth: \"100%\",\n maxHeight: isFullscreen ? \"100%\" : \"none\",\n objectFit: isFullscreen ? \"cover\" : \"contain\",\n backgroundColor: \"#000\",\n aspectRatio: isFullscreen ? \"unset\" : void 0,\n ...style\n },\n controls: shouldShowNativeControls && controls && !showCustomControls,\n playsInline,\n preload,\n poster,\n ...restVideoAttrs,\n children\n }\n ),\n (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaSpinner,\n {\n className: \"stormcloud-loading-indicator\",\n size: 42,\n color: \"white\",\n style: {\n position: \"absolute\",\n top: \"calc(50% - 21px)\",\n left: \"calc(50% - 21px)\",\n zIndex: 20,\n animation: \"spin 1s linear infinite\",\n filter: \"drop-shadow(0 3px 6px rgba(0, 0, 0, 0.8))\"\n }\n }\n ),\n showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 25,\n background: \"linear-gradient(135deg, rgba(220, 38, 38, 0.95) 0%, rgba(185, 28, 28, 0.9) 100%)\",\n color: \"white\",\n padding: \"24px 32px\",\n borderRadius: \"16px\",\n backdropFilter: \"blur(20px)\",\n border: \"2px solid rgba(255, 255, 255, 0.2)\",\n boxShadow: \"0 20px 60px rgba(0, 0, 0, 0.6), inset 0 2px 0 rgba(255, 255, 255, 0.2)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n margin: \"0 16px\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n fontSize: \"20px\",\n fontWeight: \"bold\",\n marginBottom: \"12px\",\n color: \"#ffffff\",\n textShadow: \"0 2px 4px rgba(0, 0, 0, 0.5)\"\n },\n children: \"License Key Required\"\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n color: \"rgba(255, 255, 255, 0.9)\",\n textShadow: \"0 1px 2px rgba(0, 0, 0, 0.3)\"\n },\n children: [\n \"Please provide a valid license key to use the Stormcloud Video Player.\",\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"br\", {}),\n \"Contact your administrator for licensing information.\"\n ]\n }\n )\n ]\n }\n ),\n showCenterPlay && !isLoading && !isBuffering && !showLicenseWarning && !adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: handleCenterPlayClick,\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 15,\n cursor: \"pointer\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\",\n borderRadius: \"50%\",\n width: \"100px\",\n height: \"100px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n border: \"3px solid rgba(255, 255, 255, 0.8)\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\"\n },\n onMouseEnter: (e) => {\n const target = e.currentTarget;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.95) 0%, rgba(40, 40, 40, 0.9) 100%)\";\n target.style.boxShadow = \"0 16px 48px rgba(0, 0, 0, 0.9), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.9)\";\n },\n onMouseLeave: (e) => {\n const target = e.currentTarget;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\";\n target.style.boxShadow = \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.8)\";\n },\n title: \"Play\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPlay,\n {\n size: 36,\n color: \"white\",\n style: {\n marginLeft: \"6px\",\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\"\n }\n }\n )\n }\n ),\n shouldShowEnhancedControls && !showLicenseWarning ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n background: \"linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.8) 100%)\",\n padding: \"20px 16px 16px\",\n zIndex: 10\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n width: \"100%\",\n height: \"8px\",\n background: \"linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%)\",\n borderRadius: \"8px\",\n marginBottom: \"16px\",\n cursor: \"pointer\",\n position: \"relative\",\n backdropFilter: \"blur(5px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n boxShadow: \"inset 0 2px 4px rgba(0, 0, 0, 0.2)\"\n },\n onClick: handleTimelineSeek,\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n height: \"100%\",\n background: \"linear-gradient(90deg, rgba(139, 92, 246, 0.9) 0%, rgba(59, 130, 246, 0.8) 50%, rgba(34, 197, 94, 0.9) 100%)\",\n borderRadius: \"8px\",\n width: `${duration > 0 ? currentTime / duration * 100 : 0}%`,\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 2px 8px rgba(139, 92, 246, 0.4)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"-6px\",\n right: `${duration > 0 ? 100 - currentTime / duration * 100 : 100}%`,\n width: \"20px\",\n height: \"20px\",\n background: \"linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(240, 240, 240, 0.9) 100%)\",\n borderRadius: \"50%\",\n border: \"3px solid rgba(139, 92, 246, 0.8)\",\n boxShadow: \"0 4px 16px rgba(139, 92, 246, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.8)\",\n transform: \"translateX(50%)\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"\n }\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n color: \"white\",\n flexWrap: viewportWidth < 768 ? \"wrap\" : \"nowrap\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`,\n flexWrap: viewportWidth < 480 ? \"wrap\" : \"nowrap\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: handlePlayPause,\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n backdropFilter: \"blur(12px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${10 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n minWidth: `${48 * responsiveScale}px`,\n minHeight: `${48 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n target.style.boxShadow = \"0 12px 48px rgba(0, 0, 0, 0.6), 0 6px 24px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n target.style.boxShadow = \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n },\n title: isPlaying ? \"Pause\" : \"Play\",\n children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPause,\n {\n size: Math.max(16, 20 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPlay,\n {\n size: Math.max(16, 20 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n )\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\"\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow = \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n },\n title: isMuted ? \"Unmute\" : \"Mute\",\n children: isMuted || volume === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeMute,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 0 0 transparent)\"\n }\n }\n ) : volume < 0.5 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeDown,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 0 0 transparent)\"\n }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeUp,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 0 0 transparent)\"\n }\n }\n )\n }\n ),\n showVolumeSlider && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false)\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.88) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(15px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"1px solid rgba(255, 255, 255, 0.15)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\",\n zIndex: 10,\n transition: \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\"\n },\n onMouseEnter: (e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow = \"0 16px 48px rgba(0, 0, 0, 0.6), 0 6px 16px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 0 24px rgba(59, 130, 246, 0.3)\";\n e.currentTarget.style.borderColor = \"rgba(59, 130, 246, 0.4)\";\n },\n onMouseLeave: (e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow = \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\";\n e.currentTarget.style.borderColor = \"rgba(255, 255, 255, 0.15)\";\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\"\n },\n onMouseEnter: (e) => {\n },\n onMouseLeave: (e) => {\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n const handleMouseMove = (moveEvent) => {\n if (!sliderElement) return;\n const rect2 = sliderElement.getBoundingClientRect();\n const y2 = moveEvent.clientY - rect2.top;\n const percentage2 = 1 - Math.max(0, Math.min(1, y2 / rect2.height));\n handleVolumeChange(percentage2);\n };\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n const rect = sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n onClick: (e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background: \"linear-gradient(180deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.15) 100%)\",\n borderRadius: \"4px\",\n boxShadow: \"inset 0 1px 3px rgba(0, 0, 0, 0.2)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: \"linear-gradient(180deg, rgba(96, 165, 250, 1) 0%, rgba(59, 130, 246, 0.95) 50%, rgba(37, 99, 235, 0.9) 100%)\",\n borderRadius: \"4px\",\n transition: \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow: \"0 0 8px rgba(59, 130, 246, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.3)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: `calc(${(isMuted ? 0 : volume) * 100}% - 7px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"14px\",\n height: \"14px\",\n background: \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n boxShadow: \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\",\n transition: \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\"\n },\n onMouseEnter: (e) => {\n e.currentTarget.style.boxShadow = \"0 3px 10px rgba(0, 0, 0, 0.4), 0 0 0 3px rgba(59, 130, 246, 0.5), 0 0 20px rgba(59, 130, 246, 0.6)\";\n e.currentTarget.style.cursor = \"grab\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.boxShadow = \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\";\n },\n onMouseDown: (e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n },\n onMouseUp: (e) => {\n e.currentTarget.style.cursor = \"grab\";\n }\n }\n )\n ]\n }\n )\n }\n )\n ] })\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n color: \"rgba(255, 255, 255, 0.9)\",\n display: viewportWidth < 480 ? \"none\" : \"block\"\n },\n children: [\n formatTime(currentTime),\n \" / \",\n formatTime(duration)\n ]\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n display: viewportWidth < 600 ? \"none\" : \"block\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n onClick: () => setShowSpeedMenu(!showSpeedMenu),\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px ${14 * responsiveScale}px`,\n borderRadius: `${14 * responsiveScale}px`,\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n fontWeight: \"700\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${56 * responsiveScale}px`,\n minHeight: `${40 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow = \"0 10px 32px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow = \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n },\n title: \"Playback Speed\",\n children: [\n playbackRate,\n \"x\"\n ]\n }\n ),\n showSpeedMenu && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n right: 0,\n marginBottom: \"12px\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.95) 100%)\",\n backdropFilter: \"blur(20px)\",\n borderRadius: \"12px\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n overflow: \"hidden\",\n minWidth: \"90px\",\n boxShadow: \"0 16px 48px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.1)\"\n },\n children: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map(\n (speed) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n onClick: () => handlePlaybackRateChange(speed),\n style: {\n display: \"block\",\n width: \"100%\",\n padding: \"10px 16px\",\n background: playbackRate === speed ? \"linear-gradient(135deg, rgba(99, 102, 241, 0.8) 0%, rgba(139, 92, 246, 0.6) 100%)\" : \"transparent\",\n border: \"none\",\n color: \"white\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n fontWeight: \"600\",\n textAlign: \"center\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n borderBottom: speed !== 2 ? \"1px solid rgba(255, 255, 255, 0.05)\" : \"none\"\n },\n onMouseEnter: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.05) 100%)\";\n }\n },\n onMouseLeave: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"transparent\";\n }\n },\n children: [\n speed,\n \"x\"\n ]\n },\n speed\n )\n )\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current.toggleFullscreen().catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${2 * responsiveScale}px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`\n },\n onMouseEnter: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n },\n onMouseLeave: (e) => {\n const target = e.target;\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow = \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n },\n title: isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaCompress,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaExpand,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: { filter: \"drop-shadow(0 0 0 transparent)\" }\n }\n )\n }\n )\n ]\n }\n )\n ]\n }\n )\n ]\n }\n ) }) : showCustomControls && !showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: `${10 * responsiveScale}px`,\n right: `${10 * responsiveScale}px`,\n transform: \"none\",\n display: \"flex\",\n flexDirection: isPortrait ? \"column\" : \"row\",\n gap: `${10 * responsiveScale}px`,\n zIndex: 10\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\"\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n },\n onMouseEnter: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n },\n onMouseLeave: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow: \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`\n },\n title: isMuted ? \"Unmute\" : \"Mute\",\n children: isMuted || volume === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeMute,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n ) : volume < 0.5 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeDown,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaVolumeUp,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n )\n }\n ),\n showVolumeSlider && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false)\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.96) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(20px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.7)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\",\n zIndex: 10,\n transition: \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\"\n },\n onMouseEnter: (e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow = \"0 16px 48px rgba(0, 0, 0, 0.9), 0 6px 16px rgba(0, 0, 0, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 24px rgba(96, 165, 250, 0.4)\";\n e.currentTarget.style.borderColor = \"rgba(96, 165, 250, 0.8)\";\n },\n onMouseLeave: (e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow = \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\";\n e.currentTarget.style.borderColor = \"rgba(255, 255, 255, 0.7)\";\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\"\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n const handleMouseMove = (moveEvent) => {\n if (!sliderElement) return;\n const rect2 = sliderElement.getBoundingClientRect();\n const y2 = moveEvent.clientY - rect2.top;\n const percentage2 = 1 - Math.max(0, Math.min(1, y2 / rect2.height));\n handleVolumeChange(percentage2);\n };\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n const rect = sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n onClick: (e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage = 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background: \"linear-gradient(180deg, rgba(255, 255, 255, 0.85) 0%, rgba(255, 255, 255, 0.5) 100%)\",\n borderRadius: \"4px\",\n border: \"1px solid rgba(255, 255, 255, 0.4)\",\n boxShadow: \"inset 0 1px 3px rgba(0, 0, 0, 0.3)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: \"linear-gradient(180deg, rgba(125, 211, 252, 1) 0%, rgba(96, 165, 250, 0.98) 50%, rgba(59, 130, 246, 0.95) 100%)\",\n borderRadius: \"4px\",\n transition: \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow: \"0 0 12px rgba(96, 165, 250, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.4)\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: `calc(${(isMuted ? 0 : volume) * 100}% - 8px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"16px\",\n height: \"16px\",\n background: \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n border: \"2px solid rgba(96, 165, 250, 0.9)\",\n boxShadow: \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\",\n transition: \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\"\n },\n onMouseEnter: (e) => {\n e.currentTarget.style.boxShadow = \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 3px rgba(96, 165, 250, 0.6), 0 0 24px rgba(96, 165, 250, 0.7)\";\n e.currentTarget.style.cursor = \"grab\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.boxShadow = \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\";\n },\n onMouseDown: (e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n },\n onMouseUp: (e) => {\n e.currentTarget.style.cursor = \"grab\";\n }\n }\n )\n ]\n }\n )\n }\n )\n ] })\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current.toggleFullscreen().catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n },\n onMouseEnter: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n },\n onMouseLeave: (e) => {\n const target = e.currentTarget;\n target.style.boxShadow = \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background = \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n },\n style: {\n background: \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow: \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`\n },\n title: isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaCompress,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaExpand,\n {\n size: Math.max(14, 16 * responsiveScale),\n style: {\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\"\n }\n }\n )\n }\n )\n ]\n }\n ),\n onControlClick && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: onControlClick,\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n cursor: \"pointer\"\n }\n }\n )\n ]\n }\n )\n ] });\n },\n (prevProps, nextProps) => {\n for (const prop of CRITICAL_PROPS) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const uiProps = [\n \"autoplay\",\n \"muted\",\n \"controls\",\n \"showCustomControls\",\n \"className\",\n \"style\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"playsInline\",\n \"preload\",\n \"poster\",\n \"children\"\n ];\n for (const prop of uiProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const callbackProps = [\n \"onReady\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\"\n ];\n for (const prop of callbackProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n return true;\n }\n);\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n StormcloudVideoPlayerComponent\n});\n","import React, { useEffect, useRef, useMemo } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport {\n FaPlay,\n FaPause,\n FaVolumeUp,\n FaVolumeMute,\n FaVolumeDown,\n FaExpand,\n FaCompress,\n FaSpinner,\n} from \"react-icons/fa\";\n\nexport type StormcloudVideoPlayerProps = Omit<\n StormcloudVideoPlayerConfig,\n \"videoElement\"\n> &\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n onReady?: (player: StormcloudVideoPlayer) => void;\n wrapperClassName?: string;\n wrapperStyle?: React.CSSProperties;\n licenseKey?: string;\n };\n\nconst CRITICAL_PROPS = [\n \"src\",\n \"allowNativeHls\",\n \"licenseKey\",\n \"lowLatencyMode\",\n \"driftToleranceMs\",\n] as const;\n\nexport const StormcloudVideoPlayerComponent: React.FC<StormcloudVideoPlayerProps> =\n React.memo(\n (props) => {\n const {\n src,\n autoplay,\n muted,\n lowLatencyMode,\n allowNativeHls,\n driftToleranceMs,\n immediateManifestAds,\n debugAdTiming,\n showCustomControls,\n hideLoadingIndicator,\n onVolumeToggle,\n onFullscreenToggle,\n onControlClick,\n onReady,\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n controls,\n playsInline,\n preload,\n poster,\n children,\n licenseKey,\n minSegmentsBeforePlay,\n ...restVideoAttrs\n } = props;\n\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const playerRef = useRef<StormcloudVideoPlayer | null>(null);\n const bufferingTimeoutRef = useRef<number | null>(null);\n const [adStatus, setAdStatus] = React.useState<{\n showAds: boolean;\n currentIndex: number;\n totalAds: number;\n }>({ showAds: false, currentIndex: 0, totalAds: 0 });\n\n const [shouldShowNativeControls, setShouldShowNativeControls] =\n React.useState(true);\n\n const [isMuted, setIsMuted] = React.useState(false);\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [currentTime, setCurrentTime] = React.useState(0);\n const [duration, setDuration] = React.useState(0);\n const [volume, setVolume] = React.useState(1);\n const [playbackRate, setPlaybackRate] = React.useState(1);\n const [showVolumeSlider, setShowVolumeSlider] = React.useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(true);\n const [isBuffering, setIsBuffering] = React.useState(false);\n const [showCenterPlay, setShowCenterPlay] = React.useState(false);\n const [showLicenseWarning, setShowLicenseWarning] = React.useState(false);\n const [viewportWidth, setViewportWidth] = React.useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1920\n );\n const [isPortrait, setIsPortrait] = React.useState(\n typeof window !== \"undefined\"\n ? window.innerHeight > window.innerWidth\n : false\n );\n\n const getResponsiveScale = () => {\n if (viewportWidth < 480) return 0.7;\n if (viewportWidth < 768) return 0.8;\n if (viewportWidth < 1024) return 0.9;\n return 1;\n };\n\n const responsiveScale = getResponsiveScale();\n\n const formatTime = (seconds: number): string => {\n if (!isFinite(seconds)) return \"0:00:00\";\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return `${hours}:${minutes\n .toString()\n .padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n };\n\n const handlePlayPause = () => {\n if (videoRef.current) {\n if (videoRef.current.paused) {\n const hasValidSource =\n videoRef.current.src ||\n (videoRef.current.currentSrc &&\n videoRef.current.currentSrc !== \"\") ||\n videoRef.current.readyState >= 1;\n\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n } else {\n videoRef.current.pause();\n setShowCenterPlay(true);\n }\n }\n };\n\n const handleCenterPlayClick = () => {\n if (videoRef.current && videoRef.current.paused) {\n const hasValidSource =\n videoRef.current.src ||\n (videoRef.current.currentSrc &&\n videoRef.current.currentSrc !== \"\") ||\n videoRef.current.readyState >= 1;\n\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n }\n };\n\n const handleTimelineSeek = (e: React.MouseEvent<HTMLDivElement>) => {\n if (videoRef.current && duration > 0 && isFinite(duration)) {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const progress = Math.max(0, Math.min(1, clickX / rect.width));\n const newTime = progress * duration;\n\n if (isFinite(newTime) && newTime >= 0 && newTime <= duration) {\n videoRef.current.currentTime = newTime;\n }\n }\n };\n\n const handleVolumeChange = (newVolume: number) => {\n if (playerRef.current && isFinite(newVolume)) {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n playerRef.current.setVolume(clampedVolume);\n }\n };\n\n const handlePlaybackRateChange = (rate: number) => {\n if (videoRef.current && isFinite(rate) && rate > 0) {\n videoRef.current.playbackRate = rate;\n }\n setShowSpeedMenu(false);\n };\n\n const isHlsStream =\n src?.toLowerCase().includes(\".m3u8\") ||\n src?.toLowerCase().includes(\"/hls/\");\n const shouldShowEnhancedControls =\n showCustomControls && (isHlsStream ? allowNativeHls : true);\n\n const criticalPropsKey = useMemo(() => {\n return CRITICAL_PROPS.map((prop) => `${prop}:${props[prop]}`).join(\"|\");\n }, [\n src,\n allowNativeHls,\n licenseKey,\n lowLatencyMode,\n driftToleranceMs,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const el = videoRef.current;\n if (!el || !src) return;\n\n if (!licenseKey) {\n setShowLicenseWarning(true);\n setIsLoading(false);\n console.warn(\n \"StormcloudVideoPlayer: License key is required but not provided. Please set the licenseKey prop to use the player.\"\n );\n return;\n }\n\n setShowLicenseWarning(false);\n\n if (debugAdTiming) {\n console.log(\"[StormcloudUI] Initializing player, isLoading=true\");\n }\n\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {}\n playerRef.current = null;\n }\n\n const cfg: StormcloudVideoPlayerConfig = {\n src,\n videoElement: el,\n } as StormcloudVideoPlayerConfig;\n if (autoplay !== undefined) cfg.autoplay = autoplay;\n if (muted !== undefined) cfg.muted = muted;\n if (lowLatencyMode !== undefined) cfg.lowLatencyMode = lowLatencyMode;\n if (allowNativeHls !== undefined) cfg.allowNativeHls = allowNativeHls;\n if (driftToleranceMs !== undefined)\n cfg.driftToleranceMs = driftToleranceMs;\n if (immediateManifestAds !== undefined)\n cfg.immediateManifestAds = immediateManifestAds;\n if (debugAdTiming !== undefined) cfg.debugAdTiming = debugAdTiming;\n if (showCustomControls !== undefined)\n cfg.showCustomControls = showCustomControls;\n if (onVolumeToggle !== undefined) cfg.onVolumeToggle = onVolumeToggle;\n if (onFullscreenToggle !== undefined)\n cfg.onFullscreenToggle = onFullscreenToggle;\n if (onControlClick !== undefined) cfg.onControlClick = onControlClick;\n if (licenseKey !== undefined) cfg.licenseKey = licenseKey;\n if (minSegmentsBeforePlay !== undefined)\n cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;\n\n const player = new StormcloudVideoPlayer(cfg);\n playerRef.current = player;\n player\n .load()\n .then(() => {\n const showNative = player.shouldShowNativeControls();\n setShouldShowNativeControls(showNative);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Player loaded successfully, waiting for video ready\"\n );\n }\n onReady?.(player);\n })\n .catch((error) => {\n console.error(\n \"StormcloudVideoPlayer: Failed to load player:\",\n error\n );\n setIsLoading(false);\n onReady?.(player);\n });\n\n return () => {\n try {\n player.destroy();\n } catch {}\n playerRef.current = null;\n };\n }, [criticalPropsKey]);\n\n useEffect(() => {\n if (!playerRef.current) return;\n\n try {\n if (autoplay !== undefined && playerRef.current.videoElement) {\n playerRef.current.videoElement.autoplay = autoplay;\n }\n if (muted !== undefined && !playerRef.current.isShowingAds()) {\n playerRef.current.setMuted(muted);\n }\n } catch (error) {\n console.warn(\"Failed to update player properties:\", error);\n }\n }, [autoplay, muted]);\n\n useEffect(() => {\n if (!playerRef.current) return;\n\n const checkAdStatus = () => {\n if (playerRef.current) {\n const showAds = playerRef.current.isShowingAds();\n const currentIndex = playerRef.current.getCurrentAdIndex();\n const totalAds = playerRef.current.getTotalAdsInBreak();\n\n setAdStatus((prev) => {\n if (\n prev.showAds !== showAds ||\n prev.currentIndex !== currentIndex ||\n prev.totalAds !== totalAds\n ) {\n return { showAds, currentIndex, totalAds };\n }\n return prev;\n });\n }\n };\n\n const interval = setInterval(checkAdStatus, 100);\n return () => clearInterval(interval);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !playerRef.current) return;\n\n const handleResize = () => {\n if (playerRef.current && videoRef.current) {\n if (typeof playerRef.current.resize === \"function\") {\n playerRef.current.resize();\n }\n }\n setViewportWidth(window.innerWidth);\n setIsPortrait(window.innerHeight > window.innerWidth);\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n useEffect(() => {\n if (!playerRef.current || !videoRef.current) return;\n\n const updateStates = () => {\n if (playerRef.current && videoRef.current) {\n setIsMuted(playerRef.current.isMuted());\n setIsPlaying(!videoRef.current.paused);\n\n const currentTimeValue = videoRef.current.currentTime;\n setCurrentTime(isFinite(currentTimeValue) ? currentTimeValue : 0);\n\n const durationValue = videoRef.current.duration;\n setDuration(isFinite(durationValue) ? durationValue : 0);\n\n const volumeValue = videoRef.current.volume;\n setVolume(\n isFinite(volumeValue) ? Math.max(0, Math.min(1, volumeValue)) : 1\n );\n\n const rateValue = videoRef.current.playbackRate;\n setPlaybackRate(\n isFinite(rateValue) && rateValue > 0 ? rateValue : 1\n );\n }\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n\n const interval = setInterval(updateStates, 200);\n\n const handleFullscreenChange = () => {\n setIsFullscreen(\n document.fullscreenElement === videoRef.current?.parentElement\n );\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n\n return () => {\n clearInterval(interval);\n document.removeEventListener(\n \"fullscreenchange\",\n handleFullscreenChange\n );\n };\n }, []);\n\n useEffect(() => {\n if (!videoRef.current) return;\n\n const handleLoadedMetadata = () => {\n if (videoRef.current) {\n const video = videoRef.current;\n void video.offsetHeight;\n }\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadedmetadata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleLoadedData = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadeddata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleLoadStart = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadstart, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplay, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n\n const handleCanPlayThrough = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplaythrough, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n\n const handleWaiting = () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n }\n\n bufferingTimeoutRef.current = window.setTimeout(() => {\n setIsBuffering(true);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video buffering detected (after 300ms delay), readyState:\",\n videoRef.current?.readyState,\n \"- showing spinner, isBuffering=true\"\n );\n }\n }, 300);\n\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: waiting, readyState:\",\n videoRef.current?.readyState,\n \"- buffering delay started (300ms)\"\n );\n }\n };\n\n const handlePlaying = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n setShowCenterPlay(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: playing, readyState:\",\n videoRef.current?.readyState,\n \"- playback started, isLoading=false, isBuffering=false\"\n );\n }\n };\n\n const handlePause = () => {\n if (playerRef.current && !playerRef.current.isShowingAds()) {\n setShowCenterPlay(true);\n } else {\n setShowCenterPlay(false);\n }\n };\n\n const handleEnded = () => {\n setShowCenterPlay(true);\n };\n\n const video = videoRef.current;\n video.addEventListener(\"loadstart\", handleLoadStart);\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n\n if (video.paused) {\n setShowCenterPlay(true);\n }\n\n return () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n\n video.removeEventListener(\"loadstart\", handleLoadStart);\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [debugAdTiming]);\n\n return (\n <>\n <style>\n {`\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n \n .stormcloud-loading-hidden .stormcloud-loading-indicator {\n display: none !important;\n }\n \n .stormcloud-video-wrapper:fullscreen {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n .stormcloud-video-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n \n *:fullscreen {\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n }\n `}\n </style>\n <div\n className={`stormcloud-video-wrapper ${wrapperClassName || \"\"}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: isFullscreen ? \"fixed\" : \"relative\",\n top: isFullscreen ? 0 : undefined,\n left: isFullscreen ? 0 : undefined,\n overflow: \"hidden\",\n width: isFullscreen ? \"100vw\" : \"100%\",\n height: isFullscreen ? \"100vh\" : \"auto\",\n minHeight: isFullscreen ? \"100vh\" : \"auto\",\n maxWidth: isFullscreen ? \"100vw\" : \"100%\",\n maxHeight: isFullscreen ? \"100vh\" : \"none\",\n zIndex: isFullscreen ? 999999 : undefined,\n backgroundColor: isFullscreen ? \"#000\" : undefined,\n borderRadius: isFullscreen ? 0 : undefined,\n boxShadow: isFullscreen ? \"none\" : undefined,\n ...wrapperStyle,\n }}\n >\n <video\n ref={videoRef}\n className={className}\n style={{\n display: \"block\",\n width: \"100%\",\n height: isFullscreen ? \"100%\" : \"auto\",\n maxWidth: \"100%\",\n maxHeight: isFullscreen ? \"100%\" : \"none\",\n objectFit: isFullscreen ? \"cover\" : \"contain\",\n backgroundColor: \"#000\",\n aspectRatio: isFullscreen ? \"unset\" : undefined,\n ...style,\n }}\n controls={\n shouldShowNativeControls && controls && !showCustomControls\n }\n playsInline={playsInline}\n preload={preload}\n poster={poster}\n {...restVideoAttrs}\n >\n {children}\n </video>\n\n {(isLoading || isBuffering) && !hideLoadingIndicator && (\n <FaSpinner\n className=\"stormcloud-loading-indicator\"\n size={42}\n color=\"white\"\n style={{\n position: \"absolute\",\n top: \"calc(50% - 21px)\",\n left: \"calc(50% - 21px)\",\n zIndex: 20,\n animation: \"spin 1s linear infinite\",\n filter: \"drop-shadow(0 3px 6px rgba(0, 0, 0, 0.8))\",\n }}\n />\n )}\n\n {showLicenseWarning && (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 25,\n background:\n \"linear-gradient(135deg, rgba(220, 38, 38, 0.95) 0%, rgba(185, 28, 28, 0.9) 100%)\",\n color: \"white\",\n padding: \"24px 32px\",\n borderRadius: \"16px\",\n backdropFilter: \"blur(20px)\",\n border: \"2px solid rgba(255, 255, 255, 0.2)\",\n boxShadow:\n \"0 20px 60px rgba(0, 0, 0, 0.6), inset 0 2px 0 rgba(255, 255, 255, 0.2)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n margin: \"0 16px\",\n }}\n >\n <div\n style={{\n fontSize: \"20px\",\n fontWeight: \"bold\",\n marginBottom: \"12px\",\n color: \"#ffffff\",\n textShadow: \"0 2px 4px rgba(0, 0, 0, 0.5)\",\n }}\n >\n License Key Required\n </div>\n <div\n style={{\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n color: \"rgba(255, 255, 255, 0.9)\",\n textShadow: \"0 1px 2px rgba(0, 0, 0, 0.3)\",\n }}\n >\n Please provide a valid license key to use the Stormcloud Video\n Player.\n <br />\n Contact your administrator for licensing information.\n </div>\n </div>\n )}\n\n {showCenterPlay &&\n !isLoading &&\n !isBuffering &&\n !showLicenseWarning &&\n !adStatus.showAds && (\n <div\n onClick={handleCenterPlayClick}\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 15,\n cursor: \"pointer\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\",\n borderRadius: \"50%\",\n width: \"100px\",\n height: \"100px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n border: \"3px solid rgba(255, 255, 255, 0.8)\",\n boxShadow:\n \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n onMouseEnter={(e) => {\n const target = e.currentTarget as HTMLElement;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.95) 0%, rgba(40, 40, 40, 0.9) 100%)\";\n target.style.boxShadow =\n \"0 16px 48px rgba(0, 0, 0, 0.9), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.9)\";\n }}\n onMouseLeave={(e) => {\n const target = e.currentTarget as HTMLElement;\n target.style.transform = \"translate(-50%, -50%)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.8) 100%)\";\n target.style.boxShadow =\n \"0 12px 40px rgba(0, 0, 0, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.3)\";\n target.style.borderColor = \"rgba(255, 255, 255, 0.8)\";\n }}\n title=\"Play\"\n >\n <FaPlay\n size={36}\n color=\"white\"\n style={{\n marginLeft: \"6px\",\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n }}\n />\n </div>\n )}\n\n {shouldShowEnhancedControls && !showLicenseWarning ? (\n <>\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n background:\n \"linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.8) 100%)\",\n padding: \"20px 16px 16px\",\n zIndex: 10,\n }}\n >\n <div\n style={{\n width: \"100%\",\n height: \"8px\",\n background:\n \"linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%)\",\n borderRadius: \"8px\",\n marginBottom: \"16px\",\n cursor: \"pointer\",\n position: \"relative\",\n backdropFilter: \"blur(5px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n boxShadow: \"inset 0 2px 4px rgba(0, 0, 0, 0.2)\",\n }}\n onClick={handleTimelineSeek}\n >\n <div\n style={{\n height: \"100%\",\n background:\n \"linear-gradient(90deg, rgba(139, 92, 246, 0.9) 0%, rgba(59, 130, 246, 0.8) 50%, rgba(34, 197, 94, 0.9) 100%)\",\n borderRadius: \"8px\",\n width: `${\n duration > 0 ? (currentTime / duration) * 100 : 0\n }%`,\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 2px 8px rgba(139, 92, 246, 0.4)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n top: \"-6px\",\n right: `${\n duration > 0\n ? 100 - (currentTime / duration) * 100\n : 100\n }%`,\n width: \"20px\",\n height: \"20px\",\n background:\n \"linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(240, 240, 240, 0.9) 100%)\",\n borderRadius: \"50%\",\n border: \"3px solid rgba(139, 92, 246, 0.8)\",\n boxShadow:\n \"0 4px 16px rgba(139, 92, 246, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.8)\",\n transform: \"translateX(50%)\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n color: \"white\",\n flexWrap: viewportWidth < 768 ? \"wrap\" : \"nowrap\",\n gap: `${8 * responsiveScale}px`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`,\n flexWrap: viewportWidth < 480 ? \"wrap\" : \"nowrap\",\n }}\n >\n <button\n onClick={handlePlayPause}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n backdropFilter: \"blur(12px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${10 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n minWidth: `${48 * responsiveScale}px`,\n minHeight: `${48 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n target.style.boxShadow =\n \"0 12px 48px rgba(0, 0, 0, 0.6), 0 6px 24px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n target.style.boxShadow =\n \"0 8px 32px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n }}\n title={isPlaying ? \"Pause\" : \"Play\"}\n >\n {isPlaying ? (\n <FaPause\n size={Math.max(16, 20 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n ) : (\n <FaPlay\n size={Math.max(16, 20 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n )}\n </button>\n\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\",\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n >\n <button\n onClick={() => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow =\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n }}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted || volume === 0 ? (\n <FaVolumeMute\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 0 0 transparent)\",\n }}\n />\n ) : volume < 0.5 ? (\n <FaVolumeDown\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 0 0 transparent)\",\n }}\n />\n ) : (\n <FaVolumeUp\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 0 0 transparent)\",\n }}\n />\n )}\n </button>\n\n {showVolumeSlider && (\n <>\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9,\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.88) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(15px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"1px solid rgba(255, 255, 255, 0.15)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow:\n \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\",\n zIndex: 10,\n transition:\n \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\",\n }}\n onMouseEnter={(e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow =\n \"0 16px 48px rgba(0, 0, 0, 0.6), 0 6px 16px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 0 24px rgba(59, 130, 246, 0.3)\";\n e.currentTarget.style.borderColor =\n \"rgba(59, 130, 246, 0.4)\";\n }}\n onMouseLeave={(e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow =\n \"0 12px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15)\";\n e.currentTarget.style.borderColor =\n \"rgba(255, 255, 255, 0.15)\";\n }}\n >\n <div\n style={{\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\",\n }}\n onMouseEnter={(e) => {\n // Hover effect removed\n }}\n onMouseLeave={(e) => {\n // Hover effect removed\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n\n const handleMouseMove = (\n moveEvent: MouseEvent\n ) => {\n if (!sliderElement) return;\n const rect =\n sliderElement.getBoundingClientRect();\n const y = moveEvent.clientY - rect.top;\n const percentage =\n 1 -\n Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n\n const rect =\n sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 -\n Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const rect =\n e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 -\n Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n >\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background:\n \"linear-gradient(180deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.15) 100%)\",\n borderRadius: \"4px\",\n boxShadow:\n \"inset 0 1px 3px rgba(0, 0, 0, 0.2)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background:\n \"linear-gradient(180deg, rgba(96, 165, 250, 1) 0%, rgba(59, 130, 246, 0.95) 50%, rgba(37, 99, 235, 0.9) 100%)\",\n borderRadius: \"4px\",\n transition:\n \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow:\n \"0 0 8px rgba(59, 130, 246, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: `calc(${\n (isMuted ? 0 : volume) * 100\n }% - 7px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"14px\",\n height: \"14px\",\n background:\n \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n boxShadow:\n \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\",\n transition:\n \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 3px 10px rgba(0, 0, 0, 0.4), 0 0 0 3px rgba(59, 130, 246, 0.5), 0 0 20px rgba(59, 130, 246, 0.6)\";\n e.currentTarget.style.cursor = \"grab\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 2px rgba(59, 130, 246, 0.3), 0 0 12px rgba(59, 130, 246, 0.4)\";\n }}\n onMouseDown={(e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n }}\n onMouseUp={(e) => {\n e.currentTarget.style.cursor = \"grab\";\n }}\n />\n </div>\n </div>\n </>\n )}\n </div>\n\n <div\n style={{\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n color: \"rgba(255, 255, 255, 0.9)\",\n display: viewportWidth < 480 ? \"none\" : \"block\",\n }}\n >\n {formatTime(currentTime)} / {formatTime(duration)}\n </div>\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: `${12 * responsiveScale}px`,\n }}\n >\n <div\n style={{\n position: \"relative\",\n display: viewportWidth < 600 ? \"none\" : \"block\",\n }}\n >\n <button\n onClick={() => setShowSpeedMenu(!showSpeedMenu)}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px ${\n 14 * responsiveScale\n }px`,\n borderRadius: `${14 * responsiveScale}px`,\n fontSize: `${14 * responsiveScale}px`,\n fontFamily: \"monospace\",\n fontWeight: \"700\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${56 * responsiveScale}px`,\n minHeight: `${40 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow =\n \"0 10px 32px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow =\n \"0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n }}\n title=\"Playback Speed\"\n >\n {playbackRate}x\n </button>\n\n {showSpeedMenu && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n right: 0,\n marginBottom: \"12px\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(20, 20, 20, 0.95) 100%)\",\n backdropFilter: \"blur(20px)\",\n borderRadius: \"12px\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n overflow: \"hidden\",\n minWidth: \"90px\",\n boxShadow:\n \"0 16px 48px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.1)\",\n }}\n >\n {[0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map(\n (speed) => (\n <button\n key={speed}\n onClick={() =>\n handlePlaybackRateChange(speed)\n }\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"10px 16px\",\n background:\n playbackRate === speed\n ? \"linear-gradient(135deg, rgba(99, 102, 241, 0.8) 0%, rgba(139, 92, 246, 0.6) 100%)\"\n : \"transparent\",\n border: \"none\",\n color: \"white\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n fontWeight: \"600\",\n textAlign: \"center\",\n transition:\n \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n borderBottom:\n speed !== 2\n ? \"1px solid rgba(255, 255, 255, 0.05)\"\n : \"none\",\n }}\n onMouseEnter={(e) => {\n if (playbackRate !== speed) {\n (\n e.target as HTMLElement\n ).style.background =\n \"linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.05) 100%)\";\n }\n }}\n onMouseLeave={(e) => {\n if (playbackRate !== speed) {\n (\n e.target as HTMLElement\n ).style.background = \"transparent\";\n }\n }}\n >\n {speed}x\n </button>\n )\n )}\n </div>\n )}\n </div>\n\n <button\n onClick={() => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current\n .toggleFullscreen()\n .catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: `${\n 2 * responsiveScale\n }px solid rgba(255, 255, 255, 0.3)`,\n color: \"#ffffff\",\n cursor: \"pointer\",\n padding: `${8 * responsiveScale}px`,\n borderRadius: `${16 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow:\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\",\n minWidth: `${44 * responsiveScale}px`,\n minHeight: `${44 * responsiveScale}px`,\n }}\n onMouseEnter={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%)\";\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 5px 16px rgba(0, 0, 0, 0.4), inset 0 2px 0 rgba(255, 255, 255, 0.35)\";\n }}\n onMouseLeave={(e) => {\n const target = e.target as HTMLElement;\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0.6) 100%)\";\n target.style.boxShadow =\n \"0 6px 28px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.25)\";\n }}\n title={\n isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\"\n }\n >\n {isFullscreen ? (\n <FaCompress\n size={Math.max(14, 16 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n ) : (\n <FaExpand\n size={Math.max(14, 16 * responsiveScale)}\n style={{ filter: \"drop-shadow(0 0 0 transparent)\" }}\n />\n )}\n </button>\n </div>\n </div>\n </div>\n </>\n ) : (\n showCustomControls &&\n !showLicenseWarning && (\n <div\n style={{\n position: \"absolute\",\n bottom: `${10 * responsiveScale}px`,\n right: `${10 * responsiveScale}px`,\n transform: \"none\",\n display: \"flex\",\n flexDirection: isPortrait ? \"column\" : \"row\",\n gap: `${10 * responsiveScale}px`,\n zIndex: 10,\n }}\n >\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n padding: \"8px\",\n margin: \"-8px\",\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n >\n <button\n onClick={() => {\n if (playerRef.current) {\n playerRef.current.toggleMute();\n }\n if (onVolumeToggle) {\n onVolumeToggle();\n }\n }}\n onMouseEnter={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n }}\n onMouseLeave={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow:\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`,\n }}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted || volume === 0 ? (\n <FaVolumeMute\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n ) : volume < 0.5 ? (\n <FaVolumeDown\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n ) : (\n <FaVolumeUp\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n )}\n </button>\n\n {showVolumeSlider && (\n <>\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"60px\",\n height: \"20px\",\n marginBottom: \"-16px\",\n zIndex: 9,\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: \"4px\",\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.96) 0%, rgba(20, 20, 20, 0.92) 100%)\",\n backdropFilter: \"blur(20px)\",\n padding: \"10px 14px\",\n borderRadius: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.7)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"128px\",\n boxShadow:\n \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\",\n zIndex: 10,\n transition:\n \"transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\",\n }}\n onMouseEnter={(e) => {\n setShowVolumeSlider(true);\n e.currentTarget.style.boxShadow =\n \"0 16px 48px rgba(0, 0, 0, 0.9), 0 6px 16px rgba(0, 0, 0, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 24px rgba(96, 165, 250, 0.4)\";\n e.currentTarget.style.borderColor =\n \"rgba(96, 165, 250, 0.8)\";\n }}\n onMouseLeave={(e) => {\n setShowVolumeSlider(false);\n e.currentTarget.style.boxShadow =\n \"0 12px 40px rgba(0, 0, 0, 0.85), 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.35)\";\n e.currentTarget.style.borderColor =\n \"rgba(255, 255, 255, 0.7)\";\n }}\n >\n <div\n style={{\n position: \"relative\",\n width: \"8px\",\n height: \"104px\",\n cursor: \"pointer\",\n transition: \"transform 0.2s ease-in-out\",\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n const sliderElement = e.currentTarget;\n\n const handleMouseMove = (\n moveEvent: MouseEvent\n ) => {\n if (!sliderElement) return;\n const rect =\n sliderElement.getBoundingClientRect();\n const y = moveEvent.clientY - rect.top;\n const percentage =\n 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n };\n\n const handleMouseUp = () => {\n document.removeEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.removeEventListener(\n \"mouseup\",\n handleMouseUp\n );\n };\n\n document.addEventListener(\n \"mousemove\",\n handleMouseMove\n );\n document.addEventListener(\n \"mouseup\",\n handleMouseUp\n );\n\n const rect =\n sliderElement.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n onClick={(e) => {\n e.stopPropagation();\n const rect =\n e.currentTarget.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percentage =\n 1 - Math.max(0, Math.min(1, y / rect.height));\n handleVolumeChange(percentage);\n }}\n >\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n background:\n \"linear-gradient(180deg, rgba(255, 255, 255, 0.85) 0%, rgba(255, 255, 255, 0.5) 100%)\",\n borderRadius: \"4px\",\n border: \"1px solid rgba(255, 255, 255, 0.4)\",\n boxShadow: \"inset 0 1px 3px rgba(0, 0, 0, 0.3)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background:\n \"linear-gradient(180deg, rgba(125, 211, 252, 1) 0%, rgba(96, 165, 250, 0.98) 50%, rgba(59, 130, 246, 0.95) 100%)\",\n borderRadius: \"4px\",\n transition:\n \"height 0.15s ease-out, box-shadow 0.2s ease-in-out\",\n boxShadow:\n \"0 0 12px rgba(96, 165, 250, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.4)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: `calc(${\n (isMuted ? 0 : volume) * 100\n }% - 8px)`,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"16px\",\n height: \"16px\",\n background:\n \"linear-gradient(135deg, #ffffff 0%, #f0f9ff 100%)\",\n borderRadius: \"50%\",\n border: \"2px solid rgba(96, 165, 250, 0.9)\",\n boxShadow:\n \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\",\n transition:\n \"bottom 0.15s ease-out, transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out\",\n cursor: \"grab\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 3px rgba(96, 165, 250, 0.6), 0 0 24px rgba(96, 165, 250, 0.7)\";\n e.currentTarget.style.cursor = \"grab\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.boxShadow =\n \"0 3px 8px rgba(0, 0, 0, 0.5), 0 0 0 2px rgba(96, 165, 250, 0.4), 0 0 16px rgba(96, 165, 250, 0.5)\";\n }}\n onMouseDown={(e) => {\n e.currentTarget.style.cursor = \"grabbing\";\n }}\n onMouseUp={(e) => {\n e.currentTarget.style.cursor = \"grab\";\n }}\n />\n </div>\n </div>\n </>\n )}\n </div>\n\n <button\n onClick={() => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (playerRef.current) {\n playerRef.current.toggleFullscreen().catch((err) => {\n console.error(\"Fullscreen error:\", err);\n });\n }\n }}\n onMouseEnter={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 14px 48px rgba(0, 0, 0, 0.7), 0 0 0 3px rgba(255, 255, 255, 0.8), inset 0 2px 0 rgba(255, 255, 255, 0.4)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.75) 100%)\";\n }}\n onMouseLeave={(e) => {\n const target = e.currentTarget as HTMLButtonElement;\n target.style.boxShadow =\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\";\n target.style.background =\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\";\n }}\n style={{\n background:\n \"linear-gradient(135deg, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.65) 100%)\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backdropFilter: \"blur(20px)\",\n boxShadow:\n \"0 10px 36px rgba(0, 0, 0, 0.6), 0 0 0 2px rgba(255, 255, 255, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.3)\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n minWidth: `${46 * responsiveScale}px`,\n minHeight: `${46 * responsiveScale}px`,\n }}\n title={\n isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\"\n }\n >\n {isFullscreen ? (\n <FaCompress\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n ) : (\n <FaExpand\n size={Math.max(14, 16 * responsiveScale)}\n style={{\n filter: \"drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8))\",\n color: \"#ffffff\",\n }}\n />\n )}\n </button>\n </div>\n )\n )}\n\n {onControlClick && (\n <div\n onClick={onControlClick}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n cursor: \"pointer\",\n }}\n />\n )}\n </div>\n </>\n );\n },\n (prevProps, nextProps) => {\n for (const prop of CRITICAL_PROPS) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n const uiProps = [\n \"autoplay\",\n \"muted\",\n \"controls\",\n \"showCustomControls\",\n \"className\",\n \"style\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"playsInline\",\n \"preload\",\n \"poster\",\n \"children\",\n ] as const;\n\n for (const prop of uiProps) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n const callbackProps = [\n \"onReady\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\",\n ] as const;\n for (const prop of callbackProps) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n return true;\n }\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","import Hls from \"hls.js\";\nimport type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n Id3TagInfo,\n AdController,\n} from \"../types\";\nimport { createAdStormPlayer } from \"../sdk/adstormPlayer\";\nimport { initializePolyfills } from \"../utils/polyfills\";\nimport { getBrowserConfigOverrides, logBrowserInfo } from \"../utils/browserCompat\";\n\nexport class StormcloudVideoPlayer {\n private readonly video: HTMLVideoElement;\n private readonly config: StormcloudVideoPlayerConfig;\n private hls?: Hls;\n private adPlayer: AdController;\n private attached = false;\n private inAdBreak = false;\n private expectedAdBreakDurationMs: number | undefined;\n private adStopTimerId: number | undefined;\n private ptsDriftEmaMs = 0;\n private isLiveStream: boolean = false;\n private nativeHlsMode: boolean = false;\n private videoSrcProtection: string | null = null;\n private bufferedSegmentsCount: number = 0;\n private shouldAutoplayAfterBuffering: boolean = false;\n private hasInitialBufferCompleted: boolean = false;\n private timeUpdateHandler?: (event: Event) => void;\n private emptiedHandler?: (event: Event) => void;\n\n constructor(config: StormcloudVideoPlayerConfig) {\n initializePolyfills();\n\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...config, ...browserOverrides };\n this.video = config.videoElement;\n\n logBrowserInfo(config.debugAdTiming);\n\n if (!this.config.licenseKey) {\n console.warn(\"[StormcloudVideoPlayer] No license key provided - ads will not work\");\n }\n\n this.adPlayer = createAdStormPlayer(this.video, {\n licenseKey: this.config.licenseKey || \"\",\n debug: this.config.debugAdTiming ?? false,\n });\n }\n\n async load(): Promise<void> {\n if (!this.attached) {\n this.attach();\n }\n\n if (this.shouldUseNativeHls()) {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n\n this.isLiveStream = this.config.lowLatencyMode ?? false;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Using native HLS playback:\", {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n });\n }\n\n this.adPlayer.initialize();\n this.adPlayer.setAllowNativeHls(!!this.config.allowNativeHls);\n\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n return;\n }\n\n this.hls = new Hls({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1.0,\n ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1000 * 1000,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\n startPosition: -1,\n });\n\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, async () => {\n this.isLiveStream =\n this.hls?.levels?.some(\n (level) =>\n level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive: this.isLiveStream,\n });\n }\n\n this.adPlayer.initialize();\n this.adPlayer.setAllowNativeHls(!!this.config.allowNativeHls);\n\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_BUFFERED, async () => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n\n if (this.shouldAutoplayAfterBuffering) {\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete. Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_PARSING_METADATA, (_evt, data: any) => {\n const id3Tags: Id3TagInfo[] = (data?.samples || []).map((s: any) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts,\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n\n this.hls.on(Hls.Events.FRAG_CHANGED, (_evt, data: any) => {\n const frag = data?.frag;\n const tagList: any[] | undefined = frag?.tagList;\n if (!Array.isArray(tagList)) return;\n\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n\n if (!tag) continue;\n \n if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = this.parseCueOutDuration(value);\n this.onScte35Marker({\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value },\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = this.parseCueOutCont(value);\n this.onScte35Marker({\n type: \"progress\",\n ...(prog?.duration !== undefined ? { durationSeconds: prog.duration } : {}),\n ...(prog?.elapsed !== undefined ? { ptsSeconds: prog.elapsed } : {}),\n raw: { tag, value },\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value } });\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = this.parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs;\n const hasScteIn = \"SCTE35-IN\" in attrs;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = this.toNumber(attrs[\"DURATION\"]) ?? this.toNumber(attrs[\"PLANNED-DURATION\"]);\n\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n this.onScte35Marker({\n type: \"start\",\n ...(duration !== undefined ? { durationSeconds: duration } : {}),\n raw: { tag, value, attrs },\n });\n }\n if (hasScteIn) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value, attrs } });\n }\n }\n }\n });\n\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.destroy();\n break;\n }\n }\n });\n\n this.hls.attachMedia(this.video);\n }\n\n private attach(): void {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n \n this.adPlayer.on(\"all_ads_completed\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad completed - ending ad break\");\n }\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n \n this.adPlayer.on(\"ad_error\", () => {\n console.error(\"[StormcloudVideoPlayer] Ad error occurred\");\n if (this.inAdBreak) {\n this.handleAdPodComplete();\n }\n });\n \n this.adPlayer.on(\"content_pause\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content paused for ad\");\n }\n });\n \n this.adPlayer.on(\"content_resume\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Content resuming after ad\");\n }\n });\n\n this.timeUpdateHandler = () => {\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n\n this.emptiedHandler = () => {\n if (this.nativeHlsMode && this.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Video src was cleared, restoring\");\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {});\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n\n private shouldUseNativeHls(): boolean {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n\n private onId3Tag(tag: Id3TagInfo): void {\n if (typeof tag.ptsSeconds === \"number\") {\n this.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = this.parseScte35FromId3(tag);\n if (marker) {\n this.onScte35Marker(marker);\n }\n }\n\n private parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n const text = this.decodeId3ValueToText(tag.value);\n if (!text) return undefined;\n\n const cueOutMatch =\n text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) ||\n text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = this.parseCueOutDuration(arg);\n return {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(dur !== undefined ? { durationSeconds: dur } : {}),\n raw: { id3: text },\n };\n }\n\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = this.parseCueOutCont(arg);\n return {\n type: \"progress\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(cont?.duration !== undefined ? { durationSeconds: cont.duration } : {}),\n raw: { id3: text },\n };\n }\n\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n return {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n };\n }\n\n return undefined;\n }\n\n private decodeId3ValueToText(value: string | Uint8Array): string | undefined {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++) {\n out += String.fromCharCode(value[i]!);\n }\n return out;\n } catch {\n return undefined;\n }\n }\n\n private async onScte35Marker(marker: Scte35Marker): Promise<void> {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime,\n });\n }\n\n if (marker.type === \"start\") {\n if (this.inAdBreak) {\n return;\n }\n\n this.inAdBreak = true;\n const durationMs = marker.durationSeconds != null\n ? marker.durationSeconds * 1000\n : 30000;\n \n this.expectedAdBreakDurationMs = durationMs;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break:\", {\n durationMs,\n durationSeconds: marker.durationSeconds,\n });\n }\n\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n\n await this.handleAdStart(marker);\n\n if (this.expectedAdBreakDurationMs != null) {\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n return;\n }\n\n if (marker.type === \"progress\" && this.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.expectedAdBreakDurationMs = marker.durationSeconds * 1000;\n }\n return;\n }\n\n if (marker.type === \"end\") {\n if (!this.inAdBreak) return;\n \n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.clearAdStopTimer();\n\n if (this.adPlayer.isAdPlaying()) {\n await this.adPlayer.stop();\n }\n\n this.handleAdPodComplete();\n return;\n }\n }\n\n private async handleAdStart(marker: Scte35Marker): Promise<void> {\n const durationSeconds = marker.durationSeconds ?? 30;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Requesting ads for duration:\", durationSeconds);\n }\n\n try {\n await this.adPlayer.requestAds(String(durationSeconds));\n \n await this.adPlayer.play();\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.warn(\"[StormcloudVideoPlayer] Ad request/play failed:\", error);\n }\n this.handleAdPodComplete();\n }\n }\n\n private parseCueOutDuration(value: string): number | undefined {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match =\n value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) ||\n value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const d = parseFloat(match[1]);\n return Number.isNaN(d) ? undefined : d;\n }\n return undefined;\n }\n\n private parseCueOutCont(value: string): { elapsed?: number; duration?: number } | undefined {\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n const res: { elapsed?: number; duration?: number } = {};\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return undefined;\n }\n\n private parseAttributeList(value: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n const key: string = (match[1] ?? \"\") as string;\n let rawVal: string = (match[3] ?? match[4] ?? \"\") as string;\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n }\n\n private toNumber(val: unknown): number | undefined {\n if (val == null) return undefined;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? undefined : n;\n }\n\n private scheduleAdStopCountdown(remainingMs: number): void {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.handleAdPodComplete();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.handleAdPodComplete();\n }, ms) as unknown as number;\n }\n\n private clearAdStopTimer(): void {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = undefined;\n }\n }\n\n private updatePtsDrift(ptsSecondsSample: number): void {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1000;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 60000) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n\n private handleAdPodComplete(): void {\n this.clearAdStopTimer();\n \n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n\n this.adPlayer.stop().catch(() => {});\n\n const restoredMuted = this.adPlayer.getOriginalMutedState();\n const restoredVolume = this.adPlayer.getOriginalVolume();\n\n if (this.video.muted !== restoredMuted) {\n this.video.muted = restoredMuted;\n }\n if (Math.abs(this.video.volume - restoredVolume) > 0.01) {\n this.video.volume = restoredVolume;\n }\n\n if (this.video.paused) {\n this.video.play()?.catch(() => {});\n }\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad break complete\");\n }\n }\n\n isAdPlaying(): boolean {\n return this.inAdBreak && this.adPlayer.isAdPlaying();\n }\n\n isShowingAds(): boolean {\n return this.adPlayer.isAdPlaying();\n }\n\n getStreamType(): \"hls\" | \"other\" {\n const url = this.config.src.toLowerCase();\n if (\n url.includes(\".m3u8\") ||\n url.includes(\"/hls/\") ||\n url.includes(\"application/vnd.apple.mpegurl\")\n ) {\n return \"hls\";\n }\n return \"other\";\n }\n\n shouldShowNativeControls(): boolean {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(\n this.config.allowNativeHls && !(this.config.showCustomControls ?? false)\n );\n }\n\n toggleMute(): void {\n if (this.adPlayer.isAdPlaying()) {\n const currentMuted = this.video.muted;\n const newMutedState = !currentMuted;\n\n this.adPlayer.updateOriginalMutedState(newMutedState, this.video.volume);\n this.adPlayer.setAdVolume(newMutedState ? 0 : 1);\n } else {\n this.video.muted = !this.video.muted;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n }\n }\n\n toggleFullscreen(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = this.video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container\n .requestFullscreen()\n .then(() => resolve())\n .catch(reject);\n } else {\n document.exitFullscreen().then(() => resolve()).catch(reject);\n }\n });\n }\n\n isMuted(): boolean {\n return this.video.muted;\n }\n\n setMuted(muted: boolean): void {\n this.video.muted = muted;\n this.adPlayer.updateOriginalMutedState(muted, this.video.volume);\n\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(muted ? 0 : 1);\n }\n }\n\n setVolume(volume: number): void {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n if (this.adPlayer.isAdPlaying()) {\n this.adPlayer.setAdVolume(clampedVolume);\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n } else {\n this.video.volume = clampedVolume;\n this.video.muted = clampedVolume === 0;\n this.adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n }\n }\n\n isFullscreen(): boolean {\n return !!document.fullscreenElement;\n }\n\n isLive(): boolean {\n return this.isLiveStream;\n }\n\n get videoElement(): HTMLVideoElement {\n return this.video;\n }\n\n resize(): void {\n if (this.adPlayer && this.adPlayer.isAdPlaying()) {\n const width = this.video.clientWidth || 640;\n const height = this.video.clientHeight || 360;\n this.adPlayer.resize(width, height);\n }\n }\n\n destroy(): void {\n this.clearAdStopTimer();\n\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n\n this.hls?.destroy();\n this.adPlayer?.destroy();\n }\n\n getCurrentAdIndex(): number {\n return 0;\n }\n\n getTotalAdsInBreak(): number {\n return 1;\n }\n}\n","export function polyfillURLSearchParams(): void {\n if (typeof URLSearchParams !== 'undefined') {\n return;\n }\n\n class URLSearchParamsPolyfill {\n private params: Map<string, string[]>;\n\n constructor(init?: string | URLSearchParamsPolyfill) {\n this.params = new Map();\n\n if (typeof init === 'string') {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n\n private parseQueryString(query: string): void {\n const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n if (!cleanQuery) return;\n\n cleanQuery.split('&').forEach((param) => {\n const [key, value] = param.split('=');\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n this.append(decodedKey, decodedValue);\n }\n });\n }\n\n private safeDecodeURIComponent(str: string): string {\n try {\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n } catch (e) {\n return str;\n }\n }\n\n append(name: string, value: string): void {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n\n delete(name: string): void {\n this.params.delete(name);\n }\n\n get(name: string): string | null {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n }\n\n getAll(name: string): string[] {\n return this.params.get(name) || [];\n }\n\n has(name: string): boolean {\n return this.params.has(name);\n }\n\n set(name: string, value: string): void {\n this.params.set(name, [String(value)]);\n }\n\n forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n\n toString(): string {\n const parts: string[] = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join('&');\n }\n }\n\n // @ts-ignore\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n if (typeof TextEncoder !== 'undefined') {\n return;\n }\n\n class TextEncoderPolyfill {\n encoding = 'utf-8';\n\n encode(str: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 0x80) {\n utf8.push(charcode);\n } else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n } else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(\n 0xe0 | (charcode >> 12),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n } else {\n i++;\n charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charcode >> 18),\n 0x80 | ((charcode >> 12) & 0x3f),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n\n // @ts-ignore\n window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n Promise.prototype.finally = function (callback: () => void) {\n const constructor = this.constructor as PromiseConstructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) =>\n constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\n\nexport function polyfillObjectAssign(): void {\n if (typeof Object.assign !== 'function') {\n Object.assign = function (target: any, ...sources: any[]) {\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n const to = Object(target);\n\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n\n return to;\n };\n }\n}\n\nexport function polyfillArrayFrom(): void {\n if (!Array.from) {\n Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError('Array.from requires an array-like object');\n }\n\n const len = items.length >>> 0;\n const result = new Array(len);\n\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n\n return result;\n };\n }\n}\n\nexport function polyfillStringStartsWith(): void {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function (search: string, pos?: number) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\n\nexport function polyfillStringEndsWith(): void {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function (search: string, length?: number) {\n if (length === undefined || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\n\nexport function polyfillStringIncludes(): void {\n if (!String.prototype.includes) {\n String.prototype.includes = function (search: string, start?: number) {\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\n\nexport function initializePolyfills(): void {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsModernJS: boolean;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n\n if (/Web0S|webOS/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n }\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n\n if (chromeVersion < 50) {\n supportsModernJS = false;\n isLegacyTV = true;\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (isSmartTV) {\n isLegacyTV = true;\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS,\n };\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { allowNativeHls?: boolean } = {};\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n\n return overrides;\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n"]}