@mottosports/motto-video-player 1.0.1-rc.81 → 1.0.1-rc.82

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":["../src/index.ts","#style-inject:#style-inject","../src/styles.css","../src/Player.tsx","../src/hooks/useShakaPlayer.ts","../src/utils/devices.ts","../package.json","../src/utils/licenseCache.ts","../src/hooks/useQualityControl.ts","../src/hooks/useSkipControls.ts","../src/hooks/useMuxAnalytics.ts","../src/hooks/useShakaUI.ts","../src/icons/SkipBackIcon.tsx","../src/icons/SkipForwardIcon.tsx","../src/icons/BigPlayIcon.tsx","../src/utils/renderIcon.ts","../src/hooks/useEventHandlers.ts","../src/hooks/usePosterFallback.ts","../src/hooks/useLiveIndicator.ts","../src/hooks/useKeyboardControls.ts","../src/hooks/useAdEvents.ts","../src/utils/scriptLoader.ts","../src/components/Loading.tsx","../src/components/ErrorScreen.tsx","../src/components/Title.tsx","../src/Video.tsx","../src/api/video.ts","../src/api/event.ts","../src/api/creative-work.ts","../src/helper.ts","../src/messages/useMessages.tsx","../src/messages/en.json","../src/messages/es.json","../src/messages/ar.json","../src/messages/de.json","../src/messages/fr.json","../src/messages/it.json","../src/messages/ja.json","../src/messages/ko.json","../src/messages/pt.json","../src/messages/ru.json","../src/messages/zh.json","../src/messages/nl.json","../src/messages/fa.json","../src/Event.tsx","../src/CreativeWork.tsx","../src/QueryProvider.tsx"],"sourcesContent":["// Import Shaka Player default control styles to ensure proper styling without needing external CDN links\nimport 'shaka-player/dist/controls.css';\n// Import library specific (Tailwind-based) overrides after the base Shaka styles so that our custom\n// styles take precedence.\nimport './styles.css';\nexport { Player } from './Player';\nexport { Video } from './Video';\nexport { Event } from './Event';\nexport { CreativeWork } from './CreativeWork';\nexport { QueryProvider, queryClient } from './QueryProvider';\nexport { SkipBackIcon, SkipForwardIcon, BigPlayIcon } from './icons';\nexport type { PlayerProps, PlayerEvents, IconSizes } from './types';\nexport type { VideoProps } from './Video';\nexport type { EventProps } from './Event';\nexport type { CreativeWorkProps } from './CreativeWork';\nexport type { VideoData } from './api/video';\nexport type { EventData, EventsSortDirection } from './api/event';\nexport type { CreativeWorkData, CreativeWorksSortDirection } from './api/creative-work'; ","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@layer components {\\n video::-webkit-media-controls {\\n display: none !important;\\n }\\n video::-webkit-media-controls-panel {\\n display: none !important;\\n }\\n video::-webkit-media-controls-play-button {\\n display: none !important;\\n }\\n video::-webkit-media-controls-timeline {\\n display: none !important;\\n }\\n video::-webkit-media-controls-current-time-display {\\n display: none !important;\\n }\\n video::-webkit-media-controls-time-remaining-display {\\n display: none !important;\\n }\\n video::-webkit-media-controls-mute-button {\\n display: none !important;\\n }\\n video::-webkit-media-controls-volume-slider {\\n display: none !important;\\n }\\n video::-webkit-media-controls-fullscreen-button {\\n display: none !important;\\n }\\n video::-webkit-media-controls-overlay-play-button {\\n display: none !important;\\n }\\n video::-moz-media-controls {\\n display: none !important;\\n }\\n video {\\n outline: none !important;\\n }\\n video[controls] {\\n -webkit-appearance: none !important;\\n appearance: none !important;\\n }\\n video::-webkit-media-controls-enclosure {\\n display: none !important;\\n }\\n video::-webkit-media-controls-start-playback-button {\\n display: none !important;\\n }\\n video[controls]::-webkit-media-controls,\\n video[controls]::-webkit-media-controls-panel,\\n video[controls]::-webkit-media-controls-play-button,\\n video[controls]::-webkit-media-controls-timeline,\\n video[controls]::-webkit-media-controls-current-time-display,\\n video[controls]::-webkit-media-controls-time-remaining-display,\\n video[controls]::-webkit-media-controls-mute-button,\\n video[controls]::-webkit-media-controls-volume-slider,\\n video[controls]::-webkit-media-controls-fullscreen-button,\\n video[controls]::-webkit-media-controls-overlay-play-button,\\n video[controls]::-webkit-media-controls-enclosure,\\n video[controls]::-webkit-media-controls-start-playback-button {\\n display: none !important;\\n visibility: hidden !important;\\n opacity: 0 !important;\\n pointer-events: none !important;\\n }\\n video[controls]::-moz-media-controls {\\n display: none !important;\\n visibility: hidden !important;\\n opacity: 0 !important;\\n }\\n .motto-video-container {\\n @apply relative w-full;\\n min-height: 300px;\\n }\\n @supports (aspect-ratio: 16/9) {\\n .motto-video-container {\\n min-height: auto;\\n }\\n }\\n .motto-video-responsive {\\n @apply absolute top-0 left-0 w-full h-full;\\n }\\n .motto-skip-button {\\n @apply absolute top-1/2 -translate-y-1/2 bg-black/70 text-white border-0 rounded-full w-16 h-16 text-2xl cursor-pointer flex items-center justify-center transition-all duration-200 z-10 opacity-80 hover:opacity-100 hover:scale-110 active:scale-95;\\n }\\n .motto-skip-button-back {\\n @apply left-5;\\n }\\n .motto-skip-button-forward {\\n @apply right-5;\\n }\\n}\\n.shaka-seek-bar-container {\\n height: 6px !important;\\n width: 100% !important;\\n margin: 8px 0 !important;\\n border-radius: 4px !important;\\n position: relative !important;\\n border-top: none !important;\\n border-bottom: none !important;\\n box-shadow: none !important;\\n}\\n.shaka-seek-bar {\\n height: 6px !important;\\n width: 100% !important;\\n -webkit-appearance: none !important;\\n appearance: none !important;\\n background: transparent !important;\\n cursor: pointer !important;\\n border: none !important;\\n outline: none !important;\\n position: absolute !important;\\n top: 0 !important;\\n left: 0 !important;\\n border-radius: 4px !important;\\n}\\n.shaka-seek-bar::-webkit-slider-runnable-track {\\n height: 6px !important;\\n background: transparent !important;\\n border-radius: 4px !important;\\n border: none !important;\\n}\\n.shaka-seek-bar::-moz-range-track {\\n height: 6px !important;\\n background: transparent !important;\\n border-radius: 4px !important;\\n border: none !important;\\n}\\n.shaka-seek-bar::-webkit-slider-thumb {\\n -webkit-appearance: none !important;\\n appearance: none !important;\\n width: 16px !important;\\n height: 16px !important;\\n border-radius: 50% !important;\\n background: #ffffff !important;\\n cursor: pointer !important;\\n border: 2px solid #ffffff !important;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3) !important;\\n margin-top: -4px !important;\\n}\\n.shaka-seek-bar::-moz-range-thumb {\\n width: 16px !important;\\n height: 16px !important;\\n border-radius: 50% !important;\\n background: #ffffff !important;\\n cursor: pointer !important;\\n border: 2px solid #ffffff !important;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3) !important;\\n margin-top: -4px !important;\\n}\\n.motto-skip-back-button,\\n.motto-skip-forward-button,\\n.motto-native-skip-button {\\n background: transparent !important;\\n border: none !important;\\n padding: 4px !important;\\n margin: 0px !important;\\n cursor: pointer !important;\\n color: #ffffff !important;\\n transition: all 0.2s ease !important;\\n min-width: 32px !important;\\n height: 32px !important;\\n display: flex !important;\\n align-items: center !important;\\n justify-content: center !important;\\n border-radius: 4px !important;\\n width: 25px;\\n}\\n.motto-skip-back-button:hover,\\n.motto-skip-forward-button:hover,\\n.motto-native-skip-button:hover {\\n opacity: 0.8 !important;\\n background: transparent !important;\\n transform: scale(1.05) !important;\\n}\\n.motto-skip-back-button:active,\\n.motto-skip-forward-button:active,\\n.motto-native-skip-button:active {\\n transform: scale(0.95) !important;\\n}\\n.motto-skip-back-button svg,\\n.motto-skip-forward-button svg,\\n.motto-native-skip-button svg {\\n width: 24px !important;\\n height: 24px !important;\\n}\\n.shaka-spinner-svg {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-spinner-path {\\n stroke: white !important;\\n fill: none !important;\\n}\\n.shaka-spinner-container {\\n color: white !important;\\n}\\n.shaka-buffering-spinner {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-buffering-spinner svg {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-buffering-spinner path {\\n stroke: white !important;\\n fill: none !important;\\n}\\n[data-shaka-player-container] .shaka-spinner,\\n[data-shaka-player-container] .spinner {\\n color: white !important;\\n border-color: white !important;\\n}\\n.material-icons.shaka-spinner {\\n color: white !important;\\n}\\n.shaka-controls-container .shaka-spinner,\\n.shaka-video-container .shaka-spinner {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-controls-container .shaka-spinner svg,\\n.shaka-video-container .shaka-spinner svg {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-controls-container .shaka-spinner path,\\n.shaka-video-container .shaka-spinner path {\\n stroke: white !important;\\n}\\n.motto-video-loading-overlay {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n background:\\n linear-gradient(\\n 135deg,\\n #1a1a1a 0%,\\n #2d2d2d 100%);\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n z-index: 10;\\n transition: opacity 0.3s ease;\\n}\\n.motto-video-loading-overlay.hidden {\\n opacity: 0;\\n pointer-events: none;\\n}\\n.motto-video-loading-content {\\n text-align: center;\\n color: white;\\n}\\n.motto-video-loading-icon {\\n width: 64px;\\n height: 64px;\\n margin-bottom: 16px;\\n opacity: 0.7;\\n}\\n.motto-video-loading-text {\\n font-size: 16px;\\n font-weight: 500;\\n margin-bottom: 8px;\\n}\\n.motto-video-loading-subtext {\\n font-size: 14px;\\n opacity: 0.7;\\n}\\n@keyframes pulse-live {\\n 0% {\\n opacity: 1;\\n transform: scale(1);\\n }\\n 50% {\\n opacity: 0.7;\\n transform: scale(1.1);\\n }\\n 100% {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n.shaka-play-button {\\n background: rgba(255, 255, 255, 0.1) !important;\\n border: none !important;\\n color: white !important;\\n padding: 10px !important;\\n border-radius: 100% !important;\\n transition: all 0.2s ease !important;\\n display: flex !important;\\n align-items: center !important;\\n justify-content: center !important;\\n min-width: 55px !important;\\n height: 55px !important;\\n}\\n.shaka-play-button-container {\\n background: transparent;\\n transition: all 0.2s ease !important;\\n}\\n.motto-video-container:not(.no-cursor) .shaka-play-button-container {\\n background: rgba(0, 0, 0, 0.3);\\n transition: all 0.s ease !important;\\n}\\n.shaka-play-button:hover {\\n background: rgba(255, 255, 255, 0.2) !important;\\n transform: scale(1.05) !important;\\n}\\n.shaka-play-button:active {\\n transform: scale(0.95) !important;\\n}\\n.shaka-play-button > * {\\n display: none !important;\\n}\\n.shaka-play-button::after {\\n content: \\\"\\\" !important;\\n width: 35px !important;\\n height: 35px !important;\\n background-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"white\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M4.5 5.653c0-1.427 1.529-2.33 2.779-1.643l11.54 6.347c1.295.712 1.295 2.573 0 3.286L7.28 19.99c-1.25.687-2.779-.217-2.779-1.643V5.653Z\\\" clip-rule=\\\"evenodd\\\" /></svg>') !important;\\n background-repeat: no-repeat !important;\\n background-size: contain !important;\\n background-position: center !important;\\n display: block !important;\\n}\\n.shaka-play-button[aria-label*=Play]::after {\\n background-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"white\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M4.5 5.653c0-1.427 1.529-2.33 2.779-1.643l11.54 6.347c1.295.712 1.295 2.573 0 3.286L7.28 19.99c-1.25.687-2.779-.217-2.779-1.643V5.653Z\\\" clip-rule=\\\"evenodd\\\" /></svg>') !important;\\n}\\n.shaka-play-button[aria-label*=Pause]::after {\\n background-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"white\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M6.75 5.25a.75.75 0 0 1 .75-.75H9a.75.75 0 0 1 .75.75v13.5a.75.75 0 0 1-.75.75H7.5a.75.75 0 0 1-.75-.75V5.25Zm7.5 0A.75.75 0 0 1 15 4.5h1.5a.75.75 0 0 1 .75.75v13.5a.75.75 0 0 1-.75.75H15a.75.75 0 0 1-.75-.75V5.25Z\\\" clip-rule=\\\"evenodd\\\" /></svg>') !important;\\n}\\n.motto-video-container {\\n background: #111111;\\n}\\n.motto-video-container video {\\n width: 100% !important;\\n height: 100% !important;\\n margin-left: auto !important;\\n margin-right: auto !important;\\n}\\nhtml[dir=rtl] .shaka-controls-container,\\nhtml[dir=rtl] .shaka-bottom-controls,\\nhtml[dir=rtl] .shaka-controls-button-panel {\\n direction: ltr !important;\\n}\\nhtml[dir=rtl] .shaka-overflow-menu,\\nhtml[dir=rtl] .shaka-settings-menu {\\n direction: rtl !important;\\n text-align: right !important;\\n}\\nhtml[dir=rtl] .shaka-overflow-menu .shaka-overflow-button .material-svg-icon:not(:first-child) {\\n margin-right: 12px !important;\\n margin-left: 0 !important;\\n}\\nhtml[dir=rtl] .shaka-overflow-menu .shaka-overflow-button .material-svg-icon:first-child {\\n margin-right: 0 !important;\\n margin-left: 12px !important;\\n}\\n.shaka-hidden-fast-forward-container,\\n.shaka-hidden-rewind-container {\\n pointer-events: none !important;\\n display: none !important;\\n}\\n\")","import React, { forwardRef, useEffect, useRef, useImperativeHandle, useCallback, useState } from 'react';\nimport shaka from 'shaka-player/dist/shaka-player.ui';\nimport { PlayerProps } from './types';\nimport { \n useShakaPlayer, \n useQualityControl, \n useSkipControls, \n useMuxAnalytics, \n useShakaUI,\n useEventHandlers,\n useLiveIndicator,\n useKeyboardControls,\n useAdEvents\n} from './hooks';\nimport './styles.css';\nimport { twMerge } from 'tailwind-merge';\nimport { getRequiredScriptLoaders, loadScripts, waitForGlobals } from './utils/scriptLoader';\nimport { Loading } from './components';\n\n// Declare google namespace for IMA SDK\ndeclare global {\n namespace google {\n namespace ima {\n class AdsRequest {\n adTagUrl: string;\n }\n }\n }\n}\n\nexport const Player = forwardRef<HTMLVideoElement, PlayerProps>(\n ({ \n src, \n managedMode = false,\n autoPlay = false, \n loop = false, \n muted = false, \n controls = true,\n poster,\n width,\n height,\n aspectRatio = 16/9,\n shakaConfig,\n drmConfig,\n muxConfig,\n system73Config,\n imaConfig,\n chromecastConfig,\n qualityConfig,\n seekbarConfig,\n iconSizes,\n events,\n locale = 'en',\n containerClassName,\n liveThresholdSeconds = 15,\n publicKey,\n auth,\n ...videoProps\n }, ref) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isScriptsLoaded, setIsScriptsLoaded] = useState(false);\n const [isInitialLoading, setIsInitialLoading] = useState(true);\n const [bfResetKey, setBfResetKey] = useState(0);\n\n // Compute playlist presence for managed mode optimization\n // In managed mode, we only reinitialize when playlist presence changes, not on URL changes\n const hasPlaylist = !!src && (\n typeof src === 'string' ||\n !!(\n src.url ||\n src.drm?.widevine?.playlistUrl ||\n src.drm?.playready?.playlistUrl ||\n src.drm?.fairplay?.playlistUrl\n )\n );\n\n // Assign the ref early so parent components can access the video element\n useImperativeHandle(ref, () => videoRef.current!, []);\n\n // Initialize custom hooks\n const { playerRef, initializePlayer, loadManifest, destroyPlayer, isRetrying } = useShakaPlayer({\n src,\n shakaConfig,\n drmConfig,\n onError: events?.onError,\n onPlayerReady: events?.onPlayerReady,\n muxConfig,\n onMuxReady: events?.onMuxReady,\n onMuxDataUpdate: events?.onMuxDataUpdate,\n publicKey,\n mottoToken: auth?.mottoToken,\n hasAds: !!imaConfig?.adTagUrl,\n hasSystem73: !!system73Config?.apiKey,\n apiToken: auth?.apiToken\n });\n\n const { \n initializeMux, \n updateMuxData, \n handleMuxError, \n destroyMux \n } = useMuxAnalytics(playerRef, muxConfig, events?.onMuxReady, events?.onMuxDataUpdate);\n\n const { \n getAvailableQualities, \n setQuality, \n setupQualityTracking, \n configureQuality \n } = useQualityControl(playerRef, qualityConfig, events?.onQualityChange);\n\n const { \n skipBack, \n skipForward, \n skipDuration, \n shouldShowSkipControls \n } = useSkipControls(videoRef, events?.onSkipBack, events?.onSkipForward);\n\n // Keyboard controls for desktop (arrow keys + spacebar)\n useKeyboardControls(videoRef, {\n skipBack,\n skipForward,\n enabled: true\n });\n\n const { setupEventListeners, cleanupEventListeners } = useEventHandlers(videoRef, {\n onPlay: events?.onPlay,\n onPause: events?.onPause,\n onEnded: events?.onEnded,\n onLoadStart: events?.onLoadStart,\n onCanPlay: events?.onCanPlay\n });\n\n const { uiRef, initializeUI, destroyUI } = useShakaUI(\n playerRef,\n containerRef,\n videoRef,\n controls,\n chromecastConfig,\n seekbarConfig,\n events?.onSkipBack,\n events?.onSkipForward,\n iconSizes,\n locale\n );\n\n // Live indicator hook\n const { getLiveStatus, seekToLiveEdge } = useLiveIndicator(containerRef, playerRef, {\n enabled: true,\n indicatorColor: '#ff0000',\n indicatorSize: 8,\n showPulseAnimation: true,\n liveThresholdSeconds,\n onLiveStatusChange: events?.onLiveStatusChange\n });\n\n // Ad events hook\n const { setupAdEventListeners, cleanupAdEventListeners } = useAdEvents(playerRef, {\n onAdStart: events?.onAdStart,\n onAdComplete: events?.onAdComplete,\n onAdError: events?.onAdError,\n onAdSkipped: events?.onAdSkipped,\n onAdPaused: events?.onAdPaused,\n onAdResumed: events?.onAdResumed,\n onAdProgress: events?.onAdProgress,\n onAllAdsCompleted: events?.onAllAdsCompleted\n });\n\n // System73 wrapper initialization\n const initializeSystem73 = useCallback((playerConfig: any) => {\n if (!system73Config?.apiKey || !window.S73ShakaPlayerWrapper) {\n return null;\n }\n\n console.log('Initializing System73 SDK...');\n \n try {\n // Create System73 wrapper using the API key from props\n const s73Config = {\n apiKey: system73Config.apiKey,\n contentSteeringEndpoint: system73Config.contentSteeringEndpoint,\n channelId: system73Config.channelId\n };\n\n const wrapper = window.S73ShakaPlayerWrapper(s73Config, { shaka });\n wrapper.wrapPlayerConfig(playerConfig);\n \n console.log('System73 SDK initialized with config:', s73Config);\n return wrapper;\n \n } catch (error) {\n console.error('Error initializing System73 SDK:', error);\n return null;\n }\n }, [system73Config]);\n\n // Initialize ads using proper Shaka UI ad container - following official docs\n const initializeAds = useCallback(async () => {\n if (!imaConfig?.adTagUrl || !playerRef.current || !videoRef.current || !uiRef.current) {\n return;\n }\n\n // Double-check that google.ima is available\n if (!window.google?.ima) {\n console.error('Google IMA SDK not available when trying to initialize ads');\n return;\n }\n \n try {\n const player = playerRef.current;\n const video = videoRef.current;\n const ui = uiRef.current;\n \n // Get the proper ad container from Shaka UI controls - as per official docs\n const controls = ui.getControls();\n const container = controls.getClientSideAdContainer();\n \n const adManager = player.getAdManager();\n if (!adManager) {\n console.error('Ad manager not available');\n return;\n }\n\n // Get google reference\n const google = window.google;\n \n // Configure ads rendering settings for autoplay if needed\n let adsRenderingSettings = null;\n if (imaConfig.adsRenderingSettings) {\n adsRenderingSettings = imaConfig.adsRenderingSettings;\n } else if (autoPlay) {\n // Create default settings optimized for autoplay\n adsRenderingSettings = new (google.ima as any).AdsRenderingSettings();\n adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n }\n \n // Initialize client-side ads with proper container and settings\n adManager.initClientSide(container, video, adsRenderingSettings);\n \n // Request ads (this starts the async VAST fetch)\n const adsRequest = new google.ima.AdsRequest();\n adsRequest.adTagUrl = imaConfig.adTagUrl;\n adManager.requestClientSideAds(adsRequest);\n \n // Setup detailed ad event listeners\n setupAdEventListeners();\n \n // Wait to allow VAST to load before loading manifest\n // This ensures the ad request starts before video content loads\n await new Promise(resolve => setTimeout(resolve, 1000));\n \n // Load the manifest - IMA will intercept playback for preroll ads\n await loadManifest();\n \n } catch (error) {\n console.error('Error initializing ads:', error);\n }\n }, [imaConfig, autoPlay, setupAdEventListeners, loadManifest]);\n\n // Load required scripts first\n useEffect(() => {\n const loadRequiredScripts = async () => {\n try {\n const scriptLoaders = getRequiredScriptLoaders(!!imaConfig?.adTagUrl, !!system73Config?.apiKey);\n await loadScripts(scriptLoaders);\n \n // Wait for global variables to be available\n const globalsToWait = [];\n if (imaConfig?.adTagUrl) {\n globalsToWait.push('google');\n }\n if (system73Config?.apiKey) {\n globalsToWait.push('S73ShakaPlayerWrapper');\n }\n \n if (globalsToWait.length > 0) {\n await waitForGlobals(globalsToWait);\n }\n \n setIsScriptsLoaded(true);\n } catch (error) {\n console.error('Error loading required scripts:', error);\n // Set as loaded anyway to prevent blocking, but log the error\n setIsScriptsLoaded(true);\n }\n };\n\n loadRequiredScripts();\n }, [imaConfig?.adTagUrl, system73Config?.apiKey]);\n\n // Reinitialize on back/forward cache restore without double-initializing on first load\n useEffect(() => {\n const onPageShow = (e: any) => {\n if (e && e.persisted) {\n setBfResetKey((k) => k + 1);\n }\n };\n window.addEventListener('pageshow', onPageShow);\n return () => window.removeEventListener('pageshow', onPageShow);\n }, []);\n\n // Main initialization - only runs after scripts are loaded\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !isScriptsLoaded) return;\n\n const initialize = async () => {\n try {\n console.log('🚀 [Player] Starting initialization...');\n \n // Reset initial loading state on (re)initialize\n setIsInitialLoading(true);\n\n // Initialize System73 wrapper first if configured\n let system73Wrapper = null;\n if (system73Config?.apiKey && window.S73ShakaPlayerWrapper) {\n console.log('📦 [System73] Step 1: Initializing System73 wrapper with config');\n // Create a copy of shakaConfig to avoid modifying the original\n const playerConfig = { ...shakaConfig };\n system73Wrapper = initializeSystem73(playerConfig);\n \n // If System73 wrapper was created successfully, update shakaConfig\n if (system73Wrapper) {\n // The wrapper has already modified the playerConfig\n shakaConfig = playerConfig;\n console.log('✅ [System73] Step 1 complete: Wrapper created and config modified');\n }\n }\n\n console.log('🎬 [Shaka] Step 2: Initializing Shaka Player (auto-load:', !system73Config?.apiKey && !imaConfig?.adTagUrl, ')');\n // Initialize player (will skip auto-load if System73 or ads are configured)\n await initializePlayer(video);\n console.log('✅ [Shaka] Step 2 complete: Player initialized');\n \n // Wrap the player with System73 after initialization\n if (system73Wrapper && playerRef.current) {\n console.log('🔗 [System73] Step 3: Wrapping Shaka player with System73');\n system73Wrapper.wrapPlayer(playerRef.current);\n console.log('✅ [System73] Step 3 complete: Player wrapped');\n \n // Only load the manifest here if we don't have ads\n // (ads will handle manifest loading after VAST fetch)\n if (!imaConfig?.adTagUrl) {\n console.log('📺 [System73] Step 4: Loading manifest');\n await loadManifest();\n console.log('✅ [System73] Step 4 complete: Manifest loaded');\n } else {\n console.log('⏭️ [System73] Skipping manifest load - ads will handle it');\n }\n }\n \n console.log('📋 [Player] Setting up event listeners and quality tracking');\n // Setup event listeners\n setupEventListeners();\n \n // Setup quality tracking\n const cleanupQuality = setupQualityTracking();\n \n // Configure quality settings\n configureQuality();\n \n console.log('🎨 [UI] Initializing Shaka UI');\n // Initialize UI\n await initializeUI();\n console.log('✅ [UI] UI initialized');\n \n // Initialize ads after UI is ready (ads will load manifest after VAST loads)\n if (imaConfig?.adTagUrl && window.google?.ima) {\n console.log('📢 [Ads] Initializing ads (will load manifest after VAST fetch)');\n await initializeAds();\n console.log('✅ [Ads] Ads initialized and manifest loaded');\n }\n\n console.log('✨ [Player] Initialization complete!');\n } catch (error) {\n console.error('❌ [Player] Error during initialization:', error);\n handleMuxError(error);\n }\n };\n\n initialize();\n\n // Cleanup function\n return () => {\n cleanupEventListeners();\n cleanupAdEventListeners();\n destroyUI();\n destroyMux();\n destroyPlayer();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [managedMode ? hasPlaylist : src, isScriptsLoaded, bfResetKey, managedMode]);\n\n // Manage initial loading spinner using media events (attach once)\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const onLoadStart = () => {\n setIsInitialLoading(true);\n };\n const onCanPlay = () => {\n setIsInitialLoading(false);\n };\n const onPlaying = () => {\n setIsInitialLoading(false);\n };\n\n video.addEventListener('loadstart', onLoadStart);\n video.addEventListener('canplay', onCanPlay);\n video.addEventListener('playing', onPlaying);\n\n return () => {\n video.removeEventListener('loadstart', onLoadStart);\n video.removeEventListener('canplay', onCanPlay);\n video.removeEventListener('playing', onPlaying);\n };\n }, []);\n\n // Update video properties when they change\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.autoplay = autoPlay;\n video.loop = loop;\n video.controls = false; // Always disable native controls since we use Shaka UI\n if (poster) video.poster = poster;\n }, [autoPlay, loop, muted, poster, imaConfig?.adTagUrl]);\n\n // Additional safeguard to ensure native controls are always disabled\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n \n // Aggressively disable native controls to prevent overlapping with Shaka UI\n video.controls = false;\n video.setAttribute('controls', 'false');\n \n // Remove the controls attribute completely\n video.removeAttribute('controls');\n \n // Set up a MutationObserver to watch for the controls attribute being added back\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes' && mutation.attributeName === 'controls') {\n // If controls attribute is added back, immediately remove it\n if (video.hasAttribute('controls')) {\n video.removeAttribute('controls');\n video.controls = false;\n }\n }\n });\n });\n \n // Start observing\n observer.observe(video, {\n attributes: true,\n attributeFilter: ['controls']\n });\n \n // Cleanup function\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n ...videoRef.current!,\n // Custom methods for quality control\n getAvailableQualities,\n setQuality,\n // Skip methods\n skipBack,\n skipForward,\n // Mux methods\n updateMuxData,\n // Live status methods\n getLiveStatus,\n seekToLiveEdge,\n // Access to underlying instances\n getPlayer: () => playerRef.current,\n getMuxMonitor: () => null\n }), [getAvailableQualities, setQuality, skipBack, skipForward, updateMuxData, getLiveStatus, seekToLiveEdge]);\n\n // Determine if we're using responsive sizing\n const isResponsive = !width && !height;\n \n // Container classes for responsive or fixed sizing\n const containerClasses = twMerge(containerClassName, 'motto-video-container relative bg-[#111111] ');\n \n // Container styles - handle both responsive and fixed sizing\n const containerStyle: React.CSSProperties = isResponsive \n ? { \n aspectRatio: aspectRatio.toString(),\n }\n : { width, height };\n\n // Video classes for responsive or fixed sizing \n const videoClasses = isResponsive\n ? 'motto-video-responsive w-full'\n : 'w-full h-full ';\n \n // Video styles for fixed sizing\n const videoStyle: React.CSSProperties = isResponsive\n ? {}\n : { width, height };\n\n // Filter out controls prop to prevent conflicts with native HTML5 controls\n const filteredVideoProps = { ...videoProps };\n delete (filteredVideoProps as any).controls;\n\n return (\n <div \n ref={containerRef}\n className={containerClasses}\n style={containerStyle}\n >\n <video\n ref={videoRef}\n className={videoClasses}\n width={isResponsive ? undefined : width}\n height={isResponsive ? undefined : height}\n style={videoStyle}\n controls={false}\n playsInline={true}\n {...filteredVideoProps}\n />\n\n {isInitialLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center z-20 pointer-events-none\">\n <Loading className=\"bg-transparent\" />\n </div>\n )}\n </div>\n );\n }\n);\n\nPlayer.displayName = 'Player'; ","import { useRef, useCallback, useState } from 'react';\nimport shaka from 'shaka-player/dist/shaka-player.ui';\nimport { isAppleDevice, isPlayReadySupported, supportsWidevinePersistentLicenses } from '../utils/devices';\nimport { Playlist } from '../api';\nimport { MuxAnalyticsConfig } from '../types';\nimport initShakaPlayerMux from '@mux/mux-data-shakaplayer';\nimport { version } from '../../package.json';\nimport {\n PersistentSessionMetadata,\n storePersistentLicense,\n retrievePersistentLicense,\n clearAllPersistentLicenses\n} from '../utils/licenseCache';\n\n\n\ninterface DRMConfig {\n clearKeys?: { [keyId: string]: string };\n servers?: { [keySystem: string]: string };\n}\n\ninterface UseShakaPlayerProps {\n src: Playlist | string;\n shakaConfig?: any;\n drmConfig?: DRMConfig;\n onError?: (error: Error) => void;\n onPlayerReady?: (player: any) => void;\n muxConfig?: MuxAnalyticsConfig;\n onMuxReady?: () => void;\n onMuxDataUpdate?: (data: any) => void;\n publicKey?: string;\n mottoToken?: string;\n hasAds?: boolean;\n hasSystem73?: boolean;\n apiToken?: string;\n}\n\n// Helper to normalize src to a Playlist-like object\nconst normalizeSource = (src: Playlist | string): Playlist => {\n if (typeof src === 'string') {\n return {\n id: '',\n url: src,\n format: 'auto',\n drm: {}\n } as Playlist;\n }\n return src;\n};\n\nexport const useShakaPlayer = ({\n src,\n shakaConfig,\n drmConfig,\n onError,\n onPlayerReady,\n muxConfig,\n onMuxReady,\n onMuxDataUpdate,\n publicKey,\n mottoToken,\n hasAds = false,\n hasSystem73 = false,\n apiToken\n}: UseShakaPlayerProps) => {\n const playerRef = useRef<any>(null);\n const [isRetrying, setIsRetrying] = useState(false);\n const videoElementRef = useRef<HTMLVideoElement | null>(null);\n\n // Lifecycle coordination to prevent init/destroy races\n const destroyInProgressRef = useRef<Promise<void> | null>(null);\n const isDestroyingRef = useRef<boolean>(false);\n const initSequenceRef = useRef<number>(0);\n const activeInitIdRef = useRef<number | null>(null);\n\n /* DRM related state */\n const waitingForKeyTimerRef = useRef<number | null>(null);\n const waitingForKeyHandlerRef = useRef<((e: Event) => void) | null>(null);\n const playbackResumedHandlerRef = useRef<((e: Event) => void) | null>(null);\n const usingPersistentLicenseRef = useRef<boolean>(false);\n const storedPersistentThisLoadRef = useRef<boolean>(false);\n const drmExpirationHandlerRef = useRef<((e: Event) => void) | null>(null);\n\n // Helper function to determine the correct manifest URL based on DRM support\n const getManifestUrl = useCallback(() => {\n const playlistSrc = normalizeSource(src);\n let manifestUrl = playlistSrc.url;\n const isDRM = Boolean(playlistSrc.drm?.widevine || playlistSrc.drm?.fairplay || playlistSrc.drm?.playready);\n\n if (isDRM) {\n const isPlayReady = isPlayReadySupported();\n if(isAppleDevice() && playlistSrc.drm?.fairplay?.certificateUrl) {\n manifestUrl = playlistSrc.drm.fairplay.playlistUrl;\n } else if(isPlayReady && playlistSrc.drm?.playready?.licenseUrl) {\n manifestUrl = playlistSrc.drm.playready.playlistUrl;\n } else {\n manifestUrl = playlistSrc.drm?.widevine?.playlistUrl || \"\";\n }\n }\n\n return manifestUrl;\n }, [src]);\n\n // Internal function to handle the actual player initialization logic\n const initializePlayerInternal = useCallback(async (video: HTMLVideoElement) => {\n try {\n // Serialize with any pending destroy to avoid MediaSource races\n if (destroyInProgressRef.current) {\n try {\n await destroyInProgressRef.current;\n } catch {\n // Ignore destroy errors here; we'll proceed with a clean init\n }\n }\n\n const myInitId = ++initSequenceRef.current;\n activeInitIdRef.current = myInitId;\n\n // Store video element reference for retry functionality\n videoElementRef.current = video;\n // Install polyfills\n shaka.polyfill.installAll();\n\n // Check for browser support\n if (!shaka.Player.isBrowserSupported()) {\n throw new Error('Browser not supported by Shaka Player');\n }\n \n // If a destroy was requested meanwhile, abort early\n if (isDestroyingRef.current) {\n return;\n }\n\n // Create player instance first, then attach the video element.\n const player = new (shaka.Player as any)();\n playerRef.current = player;\n\n // Attach to the video element (recommended approach since Shaka v4).\n await (player as any).attach(video);\n\n // Configure default settings for expanding DVR window in live streams\n // This ensures the DVR window grows from the origin rather than sliding forward\n const defaultConfig = {\n manifest: {\n // Override availability window to allow DVR window to grow from start\n // Set to a very large value (24 hours in seconds) to effectively allow unlimited growth\n availabilityWindowOverride: 86400, // 24 hours in seconds\n },\n streaming: {\n // Allow seeking to any point within the availability window\n safeSeekOffset: 5, // 5 seconds from live edge to prevent buffering\n // Increase tolerance for manifest timing inaccuracies in live streams\n inaccurateManifestTolerance: 2,\n }\n };\n\n // Apply default config first\n player.configure(defaultConfig);\n\n // Configure player with user-provided config (can override defaults)\n if (shakaConfig) {\n player.configure(shakaConfig);\n }\n \n const playlistSrc = normalizeSource(src);\n const manifestUrl = getManifestUrl();\n let playlistId = playlistSrc.id;\n const isDRM = Boolean(playlistSrc.drm?.widevine || playlistSrc.drm?.fairplay || playlistSrc.drm?.playready);\n\n // Reset per-load storage guard\n storedPersistentThisLoadRef.current = false;\n\n // If init was superseded, tear down the created player and exit\n if (activeInitIdRef.current !== myInitId || isDestroyingRef.current) {\n try { await player.destroy(); } catch {}\n if (playerRef.current === player) playerRef.current = null;\n return;\n }\n\n // Handle persistent licenses for DRM content\n let storedSessionsMetadata: PersistentSessionMetadata[] = [];\n if (isDRM && playlistId) {\n storedSessionsMetadata = retrievePersistentLicense(playlistId, playlistSrc.drm?.licenseCacheKey ?? \"\");\n }\n\n if (isDRM) {\n const drmConfig: any = {\n servers: {\n 'com.widevine.alpha': playlistSrc.drm?.widevine?.licenseUrl,\n 'com.microsoft.playready': playlistSrc.drm?.playready?.licenseUrl,\n 'com.apple.fps': playlistSrc.drm?.fairplay?.licenseUrl,\n },\n keySystemsMapping: {\n // Fall back or reroute to the platform's recommended PlayReady CDM if needed\n 'com.microsoft.playready': 'com.microsoft.playready.recommendation'\n },\n ...(playlistSrc.drm?.fairplay && {\n advanced: {\n 'com.apple.fps': {\n serverCertificateUri: playlistSrc.drm.fairplay.certificateUrl,\n }\n }\n })\n };\n\n drmConfig.advanced = {\n ...drmConfig.advanced,\n 'com.widevine.alpha': {\n ...drmConfig.advanced?.['com.widevine.alpha'],\n sessionType: supportsWidevinePersistentLicenses() ? 'persistent-license' : 'temporary'\n },\n 'com.microsoft.playready': {\n ...drmConfig.advanced?.['com.microsoft.playready'],\n sessionType: 'persistent-license' // PlayReady seems to always require persistent-license (temporary won't work, not compatible with license server response)\n },\n 'com.apple.fps': {\n ...drmConfig.advanced?.['com.apple.fps'],\n sessionType: 'temporary' // FairPlay always uses temporary sessions - Safari won't play with persistent-license\n }\n };\n\n // Configure persistent session settings if we have stored sessions\n if (storedSessionsMetadata.length > 0) {\n drmConfig.persistentSessionOnlinePlayback = true;\n drmConfig.persistentSessionsMetadata = storedSessionsMetadata.map(session => ({\n sessionId: session.sessionId,\n initData: new Uint8Array(session.initData),\n initDataType: session.initDataType\n }));\n }\n\n usingPersistentLicenseRef.current = storedSessionsMetadata.length > 0;\n\n player.configure({ drm: drmConfig });\n\n // Detect situations where the browser is waiting for a decryption key but none becomes usable\n // This can happen when a persisted license is invalid/stale. We listen for 'waitingforkey'\n // and, if playback does not resume shortly, clear cached licenses and reload.\n const clearWaitingForKeyTimer = () => {\n if (waitingForKeyTimerRef.current !== null) {\n window.clearTimeout(waitingForKeyTimerRef.current);\n waitingForKeyTimerRef.current = null;\n }\n };\n\n const onPlaybackResumed = () => {\n clearWaitingForKeyTimer();\n };\n\n const onWaitingForKey = () => {\n // Only attempt recovery when we intentionally tried to use a cached persistent license\n if (!usingPersistentLicenseRef.current) return;\n // Avoid stacking multiple timers or looping retries\n if (isRetrying) return;\n clearWaitingForKeyTimer();\n\n // Give the player a short window to provide/refresh keys normally\n waitingForKeyTimerRef.current = window.setTimeout(async () => {\n try {\n if (isRetrying) return;\n\n // If we are still stuck without keys, clear cached persistent licenses and retry\n console.warn('Stuck waiting for decryption key; attempting license cache reset and reload...');\n const clearedCount = clearAllPersistentLicenses();\n\n if (clearedCount > 0 && playerRef.current) {\n setIsRetrying(true);\n await playerRef.current.load(getManifestUrl());\n console.log('Reloaded manifest after clearing cached licenses');\n } else {\n console.warn('No cached licenses found to clear, skipping reload');\n }\n } catch (e) {\n console.error('Failed during recovery from waitingforkey state:', e);\n onError?.(e as Error);\n } finally {\n setIsRetrying(false);\n clearWaitingForKeyTimer();\n }\n }, 3000);\n };\n\n // Attach listeners to the video element\n try {\n (video as any).addEventListener('waitingforkey', onWaitingForKey as any);\n video.addEventListener('playing', onPlaybackResumed);\n video.addEventListener('ended', onPlaybackResumed);\n video.addEventListener('pause', onPlaybackResumed);\n waitingForKeyHandlerRef.current = onWaitingForKey;\n playbackResumedHandlerRef.current = onPlaybackResumed;\n } catch (e) {\n console.warn('Failed to attach waitingforkey/playback listeners:', e);\n }\n\n // Register request filter for DRM token\n const netEngine = player.getNetworkingEngine();\n if (netEngine) {\n netEngine.registerRequestFilter((type: any, request: any) => {\n switch (type) {\n case (shaka as any).net.NetworkingEngine.RequestType.LICENSE:\n if (publicKey) {\n request.headers[\"authorization\"] = `Bearer ${publicKey}`;\n }\n if (mottoToken) {\n request.headers[\"x-motto-token\"] = mottoToken;\n }\n break;\n case (shaka as any).net.NetworkingEngine.RequestType.MANIFEST:\n case (shaka as any).net.NetworkingEngine.RequestType.SEGMENT:\n // Allow cross-site credentials so that cookies can be set from the manifest to the segments for JWT validation\n request.allowCrossSiteCredentials = true\n break;\n }\n });\n\n // Register response filter for FairPlay base64 decoding\n netEngine.registerResponseFilter((type: any, response: any) => {\n if (type === (shaka as any).net.NetworkingEngine.RequestType.LICENSE) {\n const ks = player.keySystem && player.keySystem();\n if (ks === 'com.apple.fps') {\n const responseText = (shaka as any).util.StringUtils.fromUTF8(response.data);\n response.data = (shaka as any).util.Uint8ArrayUtils.fromBase64(responseText).buffer;\n }\n }\n });\n }\n }\n\n // Register apiToken authorization header for manifest requests (works for both DRM and non-DRM content)\n if (apiToken) {\n const netEngine = player.getNetworkingEngine();\n if (netEngine) {\n netEngine.registerRequestFilter((type: any, request: any) => {\n if (type === (shaka as any).net.NetworkingEngine.RequestType.MANIFEST) {\n request.headers[\"authorization\"] = `Bearer ${apiToken}`;\n }\n });\n }\n }\n\n // Persist licenses after Shaka signals license expiration updates, which occur\n // only after successful license acquisition/refresh. This avoids caching on errors\n // or during the initial clear (unencrypted) segment playback.\n if (isDRM && playlistId) {\n const onDRMSessionUpdate = () => {\n try {\n if (storedPersistentThisLoadRef.current) return;\n const activeDrmSessions = player.getActiveSessionsMetadata?.();\n if (!activeDrmSessions) return;\n\n const persistentSessions = activeDrmSessions.filter(\n (session: any) => session.sessionType === 'persistent-license'\n );\n\n if (persistentSessions.length > 0) {\n const sessionsToStore: PersistentSessionMetadata[] = persistentSessions.map((session: any) => ({\n sessionId: session.sessionId,\n initData: session.initData,\n initDataType: session.initDataType,\n keySystem: session.keySystem || 'com.widevine.alpha'\n }));\n storePersistentLicense(playlistId, playlistSrc.drm?.licenseCacheKey ?? \"\", sessionsToStore);\n storedPersistentThisLoadRef.current = true;\n }\n } catch (e) {\n console.warn('Failed to persist licenses on expiration update:', e);\n }\n };\n\n try {\n player.addEventListener('drmsessionupdate', onDRMSessionUpdate as any);\n drmExpirationHandlerRef.current = onDRMSessionUpdate as any;\n } catch (e) {\n console.warn('Failed to attach drmsessionupdate listener:', e);\n }\n }\n // Set up error handling\n player?.addEventListener('error', (event: any) => {\n const error = event.detail;\n\n // Ignore Shaka's LOAD_INTERRUPTED (code 7000) since it indicates a\n // benign race between load/unload calls when the source changes.\n if (error?.code === 7000) {\n return;\n }\n\n // Check if error code is in the 6000-6999 range (DRM-related errors)\n // and trigger license clearing and retry\n if (error?.code >= 6000 && error?.code < 7000 && !isRetrying && videoElementRef.current) {\n console.warn(`DRM error detected (code: ${error.code}), checking for cached licenses...`);\n \n // Clear all cached licenses and check if any were actually cleared\n const clearedCount = clearAllPersistentLicenses();\n \n // Only retry if we actually cleared some licenses\n if (clearedCount > 0) {\n console.warn(`Cleared ${clearedCount} cached licenses, retrying...`);\n setIsRetrying(true);\n \n // Use setTimeout to avoid blocking and allow the error to be processed\n setTimeout(async () => {\n try {\n // Get the video element and current manifest URL\n const video = videoElementRef.current;\n const currentPlayer = playerRef.current;\n \n if (video && currentPlayer) {\n console.log('Reloading manifest after license cache clear...');\n \n // Simply reload the manifest with the current player instance\n // This will trigger new license requests without the cached licenses\n await currentPlayer.load(getManifestUrl());\n \n console.log('Manifest reloaded successfully');\n }\n } catch (retryError) {\n console.error('Failed to retry after license clear:', retryError);\n onError?.(retryError as Error);\n } finally {\n setIsRetrying(false);\n }\n }, 500); // Give a bit more time for the error to be processed\n return;\n } else {\n console.warn(`No cached licenses found to clear for error code ${error.code}, not retrying to avoid infinite loop`);\n }\n }\n\n console.error('Shaka Player Error:', error);\n onError?.(new Error(`Shaka Player Error: ${error.message || 'Unknown error'}`));\n });\n\n // Initialize Mux BEFORE loading so it can hook into networking engine\n if (muxConfig) {\n try {\n const playerInitTime = initShakaPlayerMux.utils.now();\n \n const muxOptions = {\n debug: muxConfig.debug || false,\n disableCookies: muxConfig.disableCookies || false,\n respectDoNotTrack: muxConfig.respectDoNotTrack || false,\n automaticErrorTracking: muxConfig.automaticErrorTracking !== false,\n ...(muxConfig.beaconCollectionDomain && { beaconCollectionDomain: muxConfig.beaconCollectionDomain }),\n ...(muxConfig.errorTranslator && { errorTranslator: muxConfig.errorTranslator }),\n data: {\n env_key: muxConfig.envKey,\n player_name: muxConfig?.metadata?.player_name,\n player_version: version,\n player_init_time: playerInitTime,\n video_title: muxConfig?.metadata?.video_title ?? \"\",\n video_id: muxConfig?.metadata?.video_id ?? \"\",\n viewer_user_id: muxConfig?.metadata?.viewer_user_id ?? \"\",\n ...muxConfig.metadata,\n }\n };\n\n initShakaPlayerMux(player, muxOptions, shaka);\n onMuxReady?.();\n } catch (error) {\n console.error('Failed to initialize Mux Analytics:', error);\n }\n }\n \n // Load the manifest only if we don't have ads (ads will trigger load after they're set up)\n // Final guard before load to avoid racing with teardown\n if (activeInitIdRef.current !== myInitId || isDestroyingRef.current) {\n try { await player.destroy(); } catch {}\n if (playerRef.current === player) playerRef.current = null;\n return;\n }\n \n // Skip loading if we have ads or System73 - they need to be initialized first\n if (!hasAds && !hasSystem73) {\n console.log('📺 [Shaka] Auto-loading manifest:', manifestUrl);\n await player.load(manifestUrl);\n console.log('✅ [Shaka] Manifest auto-loaded successfully');\n } else {\n console.log('⏭️ [Shaka] Skipping auto-load (hasAds:', hasAds, ', hasSystem73:', hasSystem73, ')');\n }\n \n onPlayerReady?.(player);\n\n return player;\n } catch (error) {\n // Filter out benign load interruptions that occur when the component\n // switches source before the previous load completes.\n if ((error as any)?.code === 7000) {\n return;\n }\n\n console.error('Error initializing Shaka Player:', error);\n onError?.(error as Error);\n throw error;\n }\n }, [shakaConfig, drmConfig, src, onError, onPlayerReady, muxConfig, onMuxReady, isRetrying, getManifestUrl, apiToken]);\n\n // Public initializePlayer function that components will use\n const initializePlayer = useCallback(async (video: HTMLVideoElement) => {\n return initializePlayerInternal(video);\n }, [initializePlayerInternal]);\n\n // Public method to load the manifest after ads are set up\n const loadManifest = useCallback(async () => {\n const player = playerRef.current;\n if (!player) {\n console.warn('⚠️ [Shaka] Cannot load manifest: player not initialized');\n return;\n }\n\n try {\n const manifestUrl = getManifestUrl();\n console.log('📺 [Shaka] Loading manifest:', manifestUrl);\n await player.load(manifestUrl);\n console.log('✅ [Shaka] Manifest loaded successfully');\n } catch (error) {\n // Filter out benign load interruptions\n if ((error as any)?.code === 7000) {\n return;\n }\n console.error('❌ [Shaka] Error loading manifest:', error);\n onError?.(error as Error);\n throw error;\n }\n }, [getManifestUrl, onError]);\n\n const destroyPlayer = useCallback(async () => {\n const playerInstance = playerRef.current;\n if (playerInstance) {\n try {\n isDestroyingRef.current = true;\n activeInitIdRef.current = null;\n // Clean up video element listeners and timers\n if (videoElementRef.current) {\n try {\n if (waitingForKeyHandlerRef.current) {\n (videoElementRef.current as any).removeEventListener('waitingforkey', waitingForKeyHandlerRef.current as any);\n }\n if (playbackResumedHandlerRef.current) {\n videoElementRef.current.removeEventListener('playing', playbackResumedHandlerRef.current);\n videoElementRef.current.removeEventListener('ended', playbackResumedHandlerRef.current);\n videoElementRef.current.removeEventListener('pause', playbackResumedHandlerRef.current);\n }\n } catch (e) {\n console.warn('Error removing media event listeners:', e);\n }\n }\n if (waitingForKeyTimerRef.current !== null) {\n window.clearTimeout(waitingForKeyTimerRef.current);\n waitingForKeyTimerRef.current = null;\n }\n\n // Clean up DRM-related player listeners\n try {\n if (drmExpirationHandlerRef.current && playerInstance.removeEventListener) {\n playerInstance.removeEventListener('drmsessionupdate', drmExpirationHandlerRef.current as any);\n }\n } catch (e) {\n console.warn('Error removing DRM expiration listener:', e);\n } finally {\n drmExpirationHandlerRef.current = null;\n }\n // Ensure only one destroy runs and let init await it\n const performDestroy = async () => {\n try {\n await playerInstance.destroy();\n } finally {\n // After Shaka teardown, also clear the HTMLVideoElement src to drop any object URL\n try {\n if (videoElementRef.current) {\n videoElementRef.current.removeAttribute('src');\n // Calling load() ensures the element releases previous MediaSource eagerly\n videoElementRef.current.load();\n }\n } catch {}\n }\n };\n destroyInProgressRef.current = performDestroy();\n await destroyInProgressRef.current;\n } catch (error) {\n console.warn('Error destroying Shaka Player:', error);\n } finally {\n if (playerRef.current === playerInstance) {\n playerRef.current = null;\n }\n storedPersistentThisLoadRef.current = false;\n isDestroyingRef.current = false;\n destroyInProgressRef.current = null;\n }\n }\n }, [playerRef]);\n\n return {\n playerRef,\n initializePlayer,\n loadManifest,\n destroyPlayer,\n isRetrying\n };\n}; ","export const isAppleDevice = () => {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const isIOS = /iPad|iPhone|iPod/.test(ua) || (navigator.platform === 'MacIntel' && (navigator as any).maxTouchPoints > 1);\n const isSafari = /Safari/.test(ua) && !/Chrome|CriOS|FxiOS|Edg/.test(ua);\n const isMacSafari = /Macintosh/.test(ua) && isSafari;\n return isIOS || isMacSafari;\n};\n\nexport const isPlayReadySupported = (): boolean => {\n // Check if we're in a browser environment\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n return false;\n }\n\n // Check if EME API is supported\n if (!navigator.requestMediaKeySystemAccess) {\n return false;\n }\n\n // Check if we're on a browser that actually supports PlayReady\n const userAgent = navigator.userAgent || '';\n const isXbox = /Xbox/.test(userAgent);\n const isEdge = /Edg/.test(userAgent);\n const isIE = /Trident|MSIE/.test(userAgent);\n const isWindows = /Windows/.test(userAgent);\n \n // PlayReady is only supported on Windows with Microsoft browsers or Xbox\n // Edge on macOS does NOT support PlayReady, only Edge on Windows does\n // Chrome on any platform uses Widevine, not PlayReady\n return isXbox || ((isEdge || isIE) && isWindows);\n};\n\n/**\n * Detects if the current browser is Chrome 64+ on macOS, Windows.\n * Persistent license caching for Widevine only works on these specific browsers\n * @returns true if Chrome 64+ on macOS/Windows/Android, false otherwise\n *\n * IMPORTANT UPDATE: Temporarily disabled everywhere, since there are some issues with persistent licenses on web.\n * Specifically, sometimes the page needs to be reloaded multiple times before playback works.\n * We don't know why yet, and have no time to investigate.\n */\nexport const supportsWidevinePersistentLicenses = (): boolean => {\n // TODO: Re-enable once issues are resolved\n return false;\n\n // Check if we're in a browser environment\n if (typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent || '';\n \n // Check if it's Chrome (not Chromium-based browsers like Edge)\n const isChromeMatch = userAgent.match(/Chrome\\/(\\d+)/);\n if (!isChromeMatch) {\n return false;\n }\n \n // Make sure it's not Edge, Opera, or other Chromium-based browsers\n if (/Edg|OPR|Opera/.test(userAgent)) {\n return false;\n }\n \n // Extract Chrome version\n const chromeVersion = parseInt(isChromeMatch[1], 10);\n if (chromeVersion < 64) {\n return false;\n }\n \n // Check if it's macOS, Windows, or Android\n const isMacOS = /Mac OS X|Macintosh/.test(userAgent);\n const isWindows = /Windows/.test(userAgent);\n\n // Tested on Android, with mixed results. Sometimes it works, sometimes it doesn't.\n\n return isMacOS || isWindows;\n};","{\n \"name\": \"@mottosports/motto-video-player\",\n \"version\": \"1.0.1-rc.81\",\n \"description\": \"React video player component for the Motto platform, powered by Shaka Player\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"NODE_ENV=development tsup --watch\",\n \"dev:hot\": \"NODE_ENV=development tsup --watch --onSuccess \\\"echo 'Hot reload ready! Package rebuilt successfully.'\\\"\",\n \"clean\": \"rm -rf dist\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"keywords\": [\n \"video\",\n \"player\",\n \"react\",\n \"component\",\n \"motto\",\n \"shaka\",\n \"adaptive-streaming\",\n \"dash\",\n \"hls\",\n \"drm\"\n ],\n \"author\": \"Motto UI Components\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@mux/mux-data-shakaplayer\": \"^5.14.7\",\n \"@tanstack/react-query\": \"^5.80.3\",\n \"shaka-player\": \"^4.16.0\",\n \"tailwind-merge\": \"^3.3.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.29\",\n \"@types/react\": \"^18.2.79\",\n \"@types/react-dom\": \"^19.1.5\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.0\",\n \"react-dom\": \">=16.8.0\",\n \"tailwindcss\": \">=3.0.0\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/motto-ui-components/motto-players.git\",\n \"directory\": \"packages/motto-video-player\"\n },\n \"homepage\": \"https://github.com/motto-ui-components/motto-players#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/motto-ui-components/motto-players/issues\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","// Persistent license storage utilities with LRU eviction for quota management\n\nexport interface PersistentSessionMetadata {\n sessionId: string;\n initData: ArrayBuffer;\n initDataType: string;\n keySystem: string;\n}\n\nexport interface StoredSessionData {\n sessionId: string;\n initData: string; // Base64 encoded\n initDataType: string;\n keySystem: string;\n timestamp: number;\n}\n\ninterface LicenseCacheEntry {\n key: string;\n data: StoredSessionData[];\n}\n\nconst PERSISTENT_LICENSE_PREFIX = 'motto_lic_';\nconst LICENSE_EXPIRY_MS = 2 * 60 * 60 * 1000; // 2 hours\nconst LICENSE_MAX_RETRY_ATTEMPTS = 10; // Maximum number of LRU evictions to attempt\n\n/**\n * Gets all license cache keys from localStorage\n */\nconst getAllLicenseCacheKeys = (): string[] => {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(PERSISTENT_LICENSE_PREFIX)) {\n keys.push(key);\n }\n }\n return keys;\n};\n\n/**\n * Gets all license cache entries\n */\nconst getAllLicenseCacheEntries = (): LicenseCacheEntry[] => {\n const keys = getAllLicenseCacheKeys();\n const entries: LicenseCacheEntry[] = [];\n \n for (const key of keys) {\n try {\n const stored = localStorage.getItem(key);\n if (stored) {\n const data: StoredSessionData[] = JSON.parse(stored);\n entries.push({ key, data });\n }\n } catch (error) {\n console.warn(`Failed to parse license cache entry for key ${key}:`, error);\n // Remove corrupted entries\n localStorage.removeItem(key);\n }\n }\n \n return entries;\n};\n\n/**\n * Removes the least recently used license cache entry\n * @returns true if an entry was removed, false if no entries exist\n */\nconst evictLRUEntry = (): boolean => {\n const entries = getAllLicenseCacheEntries();\n \n if (entries.length === 0) {\n return false;\n }\n \n // Sort by oldest timestamp in each entry (oldest first)\n entries.sort((a, b) => {\n const oldestA = Math.min(...a.data.map(session => session.timestamp));\n const oldestB = Math.min(...b.data.map(session => session.timestamp));\n return oldestA - oldestB;\n });\n \n // Remove the oldest entry\n const lruEntry = entries[0];\n localStorage.removeItem(lruEntry.key);\n \n console.log(`Evicted LRU license cache entry: ${lruEntry.key}`);\n return true;\n};\n\n/**\n * Attempts to store data in localStorage with LRU eviction on quota exceeded\n */\nconst storeWithQuotaHandling = (key: string, data: string): boolean => {\n let attempts = 0;\n \n while (attempts < LICENSE_MAX_RETRY_ATTEMPTS) {\n try {\n localStorage.setItem(key, data);\n return true;\n } catch (error) {\n // Check if this is a quota exceeded error\n if (error instanceof DOMException && (\n error.code === 22 || // QUOTA_EXCEEDED_ERR\n error.name === 'QuotaExceededError' ||\n error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n )) {\n console.warn(`QuotaExceededError on attempt ${attempts + 1}, attempting LRU eviction...`);\n \n // Try to evict an LRU entry\n if (!evictLRUEntry()) {\n console.error('No more entries to evict, storage operation failed');\n return false;\n }\n \n attempts++;\n } else {\n // Non-quota error, don't retry\n console.error('Failed to store license cache data:', error);\n return false;\n }\n }\n }\n \n console.error(`Failed to store license cache data after ${LICENSE_MAX_RETRY_ATTEMPTS} eviction attempts`);\n return false;\n};\n\n/**\n * Shared function to manage persistent license storage by:\n * 1. Loading existing sessions from localStorage\n * 2. Filtering out expired sessions\n * 3. Merging with new sessions (if provided)\n * 4. Updating localStorage with the cleaned data (with quota handling)\n */\nexport const managePersistentLicenseStorage = (\n playlistId: string,\n licenseCacheKey: string,\n newSessionMetadata?: PersistentSessionMetadata[]\n): StoredSessionData[] => {\n try {\n const storageKey = `${PERSISTENT_LICENSE_PREFIX}${playlistId}_${licenseCacheKey}`;\n const stored = localStorage.getItem(storageKey);\n let existingSessions: StoredSessionData[] = [];\n\n if (stored) {\n try {\n existingSessions = JSON.parse(stored);\n } catch (parseError) {\n console.warn('Failed to parse existing persistent license data:', parseError);\n existingSessions = [];\n }\n }\n \n const now = Date.now();\n \n // Filter out expired sessions\n let validSessions = existingSessions.filter(session => \n now - session.timestamp < LICENSE_EXPIRY_MS\n );\n \n // If new sessions are provided, merge them with existing valid sessions\n if (newSessionMetadata && newSessionMetadata.length > 0) {\n const newSessions: StoredSessionData[] = newSessionMetadata.map(session => {\n const uint8Array = new Uint8Array(session.initData);\n const binaryString = Array.from(uint8Array).map(byte => String.fromCharCode(byte)).join('');\n return {\n sessionId: session.sessionId,\n initData: btoa(binaryString),\n initDataType: session.initDataType,\n keySystem: session.keySystem,\n timestamp: now\n };\n });\n \n // Remove any existing sessions with the same sessionId to avoid duplicates\n const newSessionIds = new Set(newSessions.map(s => s.sessionId));\n validSessions = validSessions.filter(session => !newSessionIds.has(session.sessionId));\n \n // Add new sessions\n validSessions = [...validSessions, ...newSessions];\n }\n \n // Update localStorage with the cleaned/merged data using quota handling\n if (validSessions.length === 0) {\n localStorage.removeItem(storageKey);\n } else {\n const dataToStore = JSON.stringify(validSessions);\n const success = storeWithQuotaHandling(storageKey, dataToStore);\n \n if (!success) {\n console.error(`Failed to store license cache for ${storageKey} after quota handling`);\n // Return the sessions even if storage failed\n return validSessions;\n }\n }\n \n return validSessions;\n } catch (error) {\n console.warn('Failed to manage persistent license storage:', error);\n return [];\n }\n};\n\n/**\n * Stores persistent license sessions for a playlist\n */\nexport const storePersistentLicense = (\n playlistId: string,\n licenseCacheKey: string,\n sessionMetadata: PersistentSessionMetadata[]\n): void => {\n managePersistentLicenseStorage(playlistId, licenseCacheKey, sessionMetadata);\n};\n\n/**\n * Retrieves persistent license sessions for a playlist\n */\nexport const retrievePersistentLicense = (\n playlistId: string,\n licenseCacheKey: string\n): PersistentSessionMetadata[] => {\n try {\n const validSessions = managePersistentLicenseStorage(playlistId, licenseCacheKey);\n \n return validSessions.map(session => ({\n sessionId: session.sessionId,\n initData: Uint8Array.from(atob(session.initData), c => c.charCodeAt(0)).buffer,\n initDataType: session.initDataType,\n keySystem: session.keySystem\n }));\n } catch (error) {\n console.warn('Failed to retrieve persistent license:', error);\n return [];\n }\n};\n\n/**\n * Clears all cached persistent licenses from localStorage\n * @returns The number of license cache entries that were cleared\n */\nexport const clearAllPersistentLicenses = (): number => {\n try {\n const keys = getAllLicenseCacheKeys();\n \n for (const key of keys) {\n localStorage.removeItem(key);\n }\n \n console.log(`Cleared ${keys.length} persistent license cache entries`);\n return keys.length;\n } catch (error) {\n console.error('Failed to clear persistent licenses:', error);\n return 0;\n }\n};\n","import { useCallback, useRef } from 'react';\n\ninterface QualityConfig {\n enableAdaptation?: boolean;\n selectedQuality?: number;\n availableQualities?: Array<{\n height: number;\n bandwidth: number;\n label: string;\n }>;\n}\n\ninterface Quality {\n height: number;\n bandwidth: number;\n label: string;\n}\n\nexport const useQualityControl = (\n playerRef: React.RefObject<any>,\n qualityConfig?: QualityConfig,\n onQualityChange?: (quality: { height: number; bandwidth: number }) => void\n) => {\n const getAvailableQualities = useCallback((): Quality[] => {\n if (!playerRef.current) return [];\n \n const tracks = playerRef.current.getVariantTracks();\n const qualities = tracks\n .filter((track: any, index: any, self: any) => \n index === self.findIndex((t: any) => t.height === track.height)\n )\n .map((track: any) => ({\n height: track.height || 0,\n bandwidth: track.bandwidth || 0,\n label: `${track.height}p`\n }))\n .sort((a: any, b: any) => b.height - a.height);\n \n return qualities;\n }, [playerRef]);\n\n const setQuality = useCallback((height: number) => {\n if (!playerRef.current) return;\n \n if (height === 0) {\n // Enable adaptive streaming\n playerRef.current.configure({\n abr: { enabled: true, \n switchInterval: 2, // quicker re-checks\n clearBufferSwitch: true,\n safeMarginSwitch: 10 // leave ~10 s in front of the playhead }\n }\n })\n } else {\n // Disable adaptive streaming and select specific quality\n playerRef.current.configure({\n abr: { enabled: false,\n switchInterval: 2, // quicker re-checks\n clearBufferSwitch: true,\n safeMarginSwitch: 10 // leave ~10 s in front of the playhead } \n }\n });\n \n const tracks = playerRef.current.getVariantTracks();\n const targetTrack = tracks.find((track: any) => track.height === height);\n if (targetTrack) {\n playerRef.current.selectVariantTrack(targetTrack, /* clearBuffer= */ true);\n }\n }\n }, [playerRef]);\n\n const setupQualityTracking = useCallback(() => {\n if (!playerRef.current || !onQualityChange) return;\n\n const handleQualityChange = () => {\n const activeTrack = playerRef.current.getVariantTracks().find((track: any) => track.active);\n if (activeTrack) {\n onQualityChange({\n height: activeTrack.height || 0,\n bandwidth: activeTrack.bandwidth || 0\n });\n }\n };\n\n playerRef.current.addEventListener('variantchanged', handleQualityChange);\n \n return () => {\n playerRef.current?.removeEventListener('variantchanged', handleQualityChange);\n };\n }, [playerRef, onQualityChange]);\n\n const configureQuality = useCallback(() => {\n if (!playerRef.current || !qualityConfig) return;\n\n if (qualityConfig.enableAdaptation !== undefined) {\n playerRef.current.configure({\n abr: { enabled: qualityConfig.enableAdaptation }\n });\n }\n\n if (qualityConfig.selectedQuality !== undefined) {\n setQuality(qualityConfig.selectedQuality);\n }\n }, [playerRef, qualityConfig, setQuality]);\n\n return {\n getAvailableQualities,\n setQuality,\n setupQualityTracking,\n configureQuality\n };\n}; ","import { useCallback } from 'react';\n\nexport const useSkipControls = (\n videoRef: React.RefObject<HTMLVideoElement>,\n onSkipBack?: (newTime: number) => void,\n onSkipForward?: (newTime: number) => void\n) => {\n // Hardcoded skip duration of 15 seconds\n const skipDuration = 15;\n\n const skipBack = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n \n const newTime = Math.max(0, video.currentTime - skipDuration);\n video.currentTime = newTime;\n onSkipBack?.(newTime);\n }, [videoRef, onSkipBack]);\n\n const skipForward = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n \n const newTime = Math.min(video.duration || 0, video.currentTime + skipDuration);\n video.currentTime = newTime;\n onSkipForward?.(newTime);\n }, [videoRef, onSkipForward]);\n\n // Always show skip controls\n const shouldShowSkipControls = useCallback(() => {\n return true;\n }, []);\n\n return {\n skipBack,\n skipForward,\n skipDuration,\n shouldShowSkipControls\n };\n}; ","import { useCallback, useRef } from 'react';\nimport initShakaPlayerMux from '@mux/mux-data-shakaplayer';\nimport shaka from 'shaka-player/dist/shaka-player.ui';\nimport { MuxAnalyticsConfig } from '../types';\nimport { version } from '../../package.json';\n\nexport const useMuxAnalytics = (\n playerRef: React.RefObject<any>,\n muxConfig?: MuxAnalyticsConfig,\n onMuxReady?: () => void,\n onMuxDataUpdate?: (data: any) => void,\n) => {\n const shakaPlayerMuxRef = useRef<any>(null);\n\n const initializeMux = useCallback(() => {\n if (!muxConfig || !playerRef.current) return;\n\n try {\n const playerInitTime = initShakaPlayerMux.utils.now();\n \n // Prepare Mux options\n const muxOptions = {\n debug: muxConfig.debug || false,\n disableCookies: muxConfig.disableCookies || false,\n respectDoNotTrack: muxConfig.respectDoNotTrack || false,\n automaticErrorTracking: muxConfig.automaticErrorTracking !== false,\n ...(muxConfig.beaconCollectionDomain && { beaconCollectionDomain: muxConfig.beaconCollectionDomain }),\n ...(muxConfig.errorTranslator && { errorTranslator: muxConfig.errorTranslator }),\n data: {\n env_key: muxConfig.envKey,\n player_name: muxConfig?.metadata?.player_name,\n player_version: version,\n player_init_time: playerInitTime,\n video_title: muxConfig?.metadata?.video_title ?? \"\",\n video_id: muxConfig?.metadata?.video_id ?? \"\",\n viewer_user_id: muxConfig?.metadata?.viewer_user_id ?? \"\",\n ...muxConfig.metadata,\n }\n };\n\n // Initialize Mux monitoring\n shakaPlayerMuxRef.current = initShakaPlayerMux(playerRef.current, muxOptions, shaka);\n \n onMuxReady?.();\n } catch (error) {\n console.error('Failed to initialize Mux Analytics:', error);\n }\n }, [muxConfig, onMuxReady, playerRef]);\n\n const updateMuxData = useCallback((data: any) => {\n if ((playerRef.current as any)?.mux?.updateData) {\n try {\n (playerRef.current as any).mux.updateData(data);\n onMuxDataUpdate?.(data);\n } catch (error) {\n console.error('Failed to update Mux data:', error);\n }\n }\n }, [onMuxDataUpdate, playerRef]);\n\n const handleMuxError = useCallback((error: any) => {\n if (shakaPlayerMuxRef.current?.loadErrorHandler) {\n shakaPlayerMuxRef.current.loadErrorHandler(error);\n }\n }, []);\n\n const destroyMux = useCallback(() => {\n // Clean up Mux monitoring\n if ((playerRef.current as any)?.mux?.destroy) {\n try {\n (playerRef.current as any).mux.destroy();\n } catch (error) {\n console.error('Error destroying Mux:', error);\n }\n }\n \n if (shakaPlayerMuxRef.current) {\n shakaPlayerMuxRef.current = null;\n }\n }, [playerRef]);\n\n return {\n initializeMux,\n updateMuxData,\n handleMuxError,\n destroyMux,\n shakaPlayerMuxRef\n };\n}; ","import { useCallback, useRef } from 'react';\nimport { ui as ShakaUI } from 'shaka-player/dist/shaka-player.ui';\nimport { SkipBackIcon, SkipForwardIcon, BigPlayIcon } from '../icons';\nimport { renderIcon } from '../utils/renderIcon';\n\ninterface ChromecastConfig {\n receiverApplicationId?: string;\n}\n\ninterface IconSizes {\n skipButtons?: number;\n bigPlayButton?: number;\n}\n\n// Custom Skip Back Button Element\nclass SkipBackButton {\n private button_: HTMLButtonElement;\n private parent: HTMLElement;\n private controls: any;\n private eventManager: any;\n\n constructor(parent: HTMLElement, controls: any, onSkipBack?: (newTime: number) => void, iconSize = 24) {\n this.parent = parent;\n this.controls = controls;\n this.eventManager = { listen: (element: HTMLElement, event: string, handler: () => void) => {\n element.addEventListener(event, handler);\n }};\n\n this.button_ = document.createElement('button');\n this.button_.className = 'shaka-button motto-native-skip-button';\n this.button_.innerHTML = renderIcon(SkipBackIcon, { size: iconSize });\n this.button_.title = 'Skip back 15 seconds';\n this.button_.setAttribute('aria-label', 'Skip back 15 seconds');\n \n this.parent.appendChild(this.button_);\n\n this.eventManager.listen(this.button_, 'click', () => {\n const video = this.controls.getVideo();\n if (video) {\n const newTime = Math.max(0, video.currentTime - 15);\n video.currentTime = newTime;\n onSkipBack?.(newTime);\n }\n });\n }\n\n // Shaka UI will call `release` when the controls are destroyed.\n // Provide a no-op implementation to avoid TypeErrors.\n public release() {\n /* Optionally detach listeners / clean up DOM here */\n }\n}\n\n// Custom Skip Forward Button Element \nclass SkipForwardButton {\n private button_: HTMLButtonElement;\n private parent: HTMLElement;\n private controls: any;\n private eventManager: any;\n\n constructor(parent: HTMLElement, controls: any, onSkipForward?: (newTime: number) => void, iconSize = 24) {\n this.parent = parent;\n this.controls = controls;\n this.eventManager = { listen: (element: HTMLElement, event: string, handler: () => void) => {\n element.addEventListener(event, handler);\n }};\n\n this.button_ = document.createElement('button');\n this.button_.className = 'shaka-button motto-native-skip-button';\n this.button_.innerHTML = renderIcon(SkipForwardIcon, { size: iconSize });\n this.button_.title = 'Skip forward 15 seconds';\n this.button_.setAttribute('aria-label', 'Skip forward 15 seconds');\n \n this.parent.appendChild(this.button_);\n\n this.eventManager.listen(this.button_, 'click', () => {\n const video = this.controls.getVideo();\n if (video) {\n const newTime = Math.min(video.duration || 0, video.currentTime + 15);\n video.currentTime = newTime;\n onSkipForward?.(newTime);\n }\n });\n }\n\n public release() {\n /* Clean-up logic if needed */\n }\n}\n\n// Factory classes for the custom elements\nclass SkipBackButtonFactory {\n constructor(private onSkipBack?: (newTime: number) => void, private iconSize?: number) {}\n \n create(rootElement: HTMLElement, controls: any) {\n return new SkipBackButton(rootElement, controls, this.onSkipBack, this.iconSize);\n }\n}\n\nclass SkipForwardButtonFactory {\n constructor(private onSkipForward?: (newTime: number) => void, private iconSize?: number) {}\n \n create(rootElement: HTMLElement, controls: any) {\n return new SkipForwardButton(rootElement, controls, this.onSkipForward, this.iconSize);\n }\n}\n\ninterface SeekbarColors {\n base?: string;\n buffered?: string;\n played?: string;\n}\n\nexport const useShakaUI = (\n playerRef: React.RefObject<any>,\n containerRef: React.RefObject<HTMLDivElement>,\n videoRef: React.RefObject<HTMLVideoElement>,\n controls: boolean,\n chromecastConfig?: ChromecastConfig,\n seekbarColors?: SeekbarColors,\n onSkipBack?: (newTime: number) => void,\n onSkipForward?: (newTime: number) => void,\n iconSizes?: IconSizes,\n locale: string = 'en'\n) => {\n const uiRef = useRef<any>(null);\n const registeredElements = useRef<Set<string>>(new Set());\n\n const initializeUI = useCallback(async () => {\n if (!controls || !containerRef.current || !playerRef.current || !videoRef.current) {\n return null;\n }\n\n // Register custom elements if not already registered\n if (!registeredElements.current.has('skip_back_button')) {\n ShakaUI.Controls.registerElement('skip_back_button', new SkipBackButtonFactory(onSkipBack, iconSizes?.skipButtons));\n registeredElements.current.add('skip_back_button');\n }\n \n if (!registeredElements.current.has('skip_forward_button')) {\n ShakaUI.Controls.registerElement('skip_forward_button', new SkipForwardButtonFactory(onSkipForward, iconSizes?.skipButtons));\n registeredElements.current.add('skip_forward_button');\n }\n\n // Create UI with Shaka Player controls using default configuration\n const ui = new ShakaUI.Overlay(playerRef.current, containerRef.current, videoRef.current);\n uiRef.current = ui;\n \n // Configure localization if locale is not 'en'\n if (locale !== 'en') {\n try {\n ui.getControls().getLocalization().changeLocale([locale])\n console.log(`Set locale to '${locale}'`);\n\n } catch (error) {\n console.warn(`Failed to set locale to '${locale}', falling back to 'en':`, error);\n }\n }\n\n // Detect mobile to conditionally include volume control\n const isMobile = window.innerWidth <= 767;\n \n const controlPanelElements = [\n ...(isMobile ? [] : ['skip_back_button']), \n ...(isMobile ? [] : ['play_pause']), \n ...(isMobile ? [] : ['skip_forward_button']), \n 'mute',\n ...(isMobile ? [] : ['volume']), // Only include volume on desktop\n 'time_and_duration',\n 'spacer',\n 'fullscreen',\n 'cast', // Always show cast button\n 'overflow_menu',\n ];\n\n // Configure UI settings with custom control panel layout\n const uiConfig: any = {\n seekBarColors: {\n base: seekbarColors?.base || 'rgba(255, 255, 255, 0.3)', // Unbuffered track\n buffered: seekbarColors?.buffered || 'rgba(255, 255, 255, 0.5)', // Buffered but not played\n played: seekbarColors?.played || '#ffffff', // Progress/played portion (white)\n },\n controlPanelElements: controlPanelElements,\n addBigPlayButton: isMobile,\n // For now, Chromecast via Shaka must use the Motto receiver that runs on the legacy cast SDK (2.0), because\n // Shaka does not support the newer Cast SDK (3.0+) in its native integration.\n castReceiverAppId: 'EC900D4D',\n castAndroidReceiverCompatible: true, // Enable Android TV compatibility\n overflowMenuButtons: [\n 'quality',\n 'picture_in_picture',\n 'playback_rate'\n ]\n };\n\n ui.configure(uiConfig);\n\n // Custom SVG replacement for big play button on mobile\n if (isMobile) {\n const customizeBigPlayButton = () => {\n const bigPlayButton = containerRef.current?.querySelector('.shaka-big-play-button');\n if (bigPlayButton && !bigPlayButton.hasAttribute('data-customized')) {\n // Use custom size if provided, otherwise use default\n const buttonSize = iconSizes?.bigPlayButton || 40;\n \n // Clear existing content and add custom SVG\n bigPlayButton.innerHTML = renderIcon(BigPlayIcon, { size: buttonSize });\n \n // Mark as customized to avoid re-processing\n bigPlayButton.setAttribute('data-customized', 'true');\n \n // Ensure the button is properly styled\n const buttonElement = bigPlayButton as HTMLElement;\n buttonElement.style.display = 'flex';\n buttonElement.style.alignItems = 'center';\n buttonElement.style.justifyContent = 'center';\n }\n };\n\n // Apply customization\n setTimeout(customizeBigPlayButton, 100);\n\n // Watch for changes and reapply customization\n const observer = new MutationObserver(() => {\n customizeBigPlayButton();\n });\n\n if (containerRef.current) {\n observer.observe(containerRef.current, {\n childList: true,\n subtree: true,\n attributes: false\n });\n }\n }\n\n // Seekbar styling is now handled by CSS with proper background\n\n return ui;\n }, [controls, containerRef, playerRef, videoRef, chromecastConfig, seekbarColors, onSkipBack, onSkipForward, iconSizes, locale]);\n\n const destroyUI = useCallback(async () => {\n const uiInstance = uiRef.current;\n if (uiInstance) {\n try {\n await uiInstance.destroy();\n } catch (error) {\n console.error('Error destroying UI:', error);\n } finally {\n if (uiRef.current === uiInstance) {\n uiRef.current = null;\n }\n }\n }\n }, []);\n\n return {\n uiRef,\n initializeUI,\n destroyUI\n };\n}; ","import React from 'react';\n\ninterface SkipBackIconProps {\n size?: number;\n className?: string;\n}\n\nexport const SkipBackIcon: React.FC<SkipBackIconProps> = ({ size = 24, className = '' }) => {\n return (\n <svg \n width={size} \n height={size} \n strokeWidth=\"2\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path \n d=\"M3 13C3 17.9706 7.02944 22 12 22C16.9706 22 21 17.9706 21 13C21 8.02944 16.9706 4 12 4\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M9 9L9 16\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M15 9L13 9C12.4477 9 12 9.44772 12 10L12 11.5C12 12.0523 12.4477 12.5 13 12.5L14 12.5C14.5523 12.5 15 12.9477 15 13.5L15 15C15 15.5523 14.5523 16 14 16L12 16\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M12 4L4.5 4M4.5 4L6.5 2M4.5 4L6.5 6\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}; ","import React from 'react';\n\ninterface SkipForwardIconProps {\n size?: number;\n className?: string;\n}\n\nexport const SkipForwardIcon: React.FC<SkipForwardIconProps> = ({ size = 24, className = '' }) => {\n return (\n <svg \n width={size} \n height={size} \n strokeWidth=\"2\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path \n d=\"M21 13C21 17.9706 16.9706 22 12 22C7.02944 22 3 17.9706 3 13C3 8.02944 7.02944 4 12 4\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M12 4H19.5M19.5 4L17.5 2M19.5 4L17.5 6\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M9 9L9 16\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M15 9L13 9C12.4477 9 12 9.44772 12 10L12 11.5C12 12.0523 12.4477 12.5 13 12.5L14 12.5C14.5523 12.5 15 12.9477 15 13.5L15 15C15 15.5523 14.5523 16 14 16L12 16\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}; ","import React from 'react';\n\ninterface BigPlayIconProps {\n size?: number;\n className?: string;\n}\n\nexport const BigPlayIcon: React.FC<BigPlayIconProps> = ({ size = 40, className = '' }) => {\n return (\n <svg \n width={size} \n height={size} \n viewBox=\"0 0 24 24\" \n fill=\"currentColor\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path \n fillRule=\"evenodd\" \n d=\"M4.5 5.653c0-1.427 1.529-2.33 2.779-1.643l11.54 6.347c1.295.712 1.295 2.573 0 3.286L7.28 19.99c-1.25.687-2.779-.217-2.779-1.643V5.653Z\" \n clipRule=\"evenodd\" \n />\n </svg>\n );\n}; ","import { renderToStaticMarkup } from 'react-dom/server';\nimport { createElement } from 'react';\n\n/**\n * Renders a React component to an HTML string for use in Shaka UI buttons\n */\nexport const renderIcon = (Component: React.ComponentType<any>, props: any = {}) => {\n return renderToStaticMarkup(createElement(Component, props));\n}; ","import { useCallback } from 'react';\n\ninterface EventHandlers {\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n}\n\nexport const useEventHandlers = (\n videoRef: React.RefObject<HTMLVideoElement>,\n handlers: EventHandlers\n) => {\n const setupEventListeners = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const { onPlay, onPause, onEnded, onLoadStart, onCanPlay } = handlers;\n\n if (onPlay) video.addEventListener('play', onPlay);\n if (onPause) video.addEventListener('pause', onPause);\n if (onEnded) video.addEventListener('ended', onEnded);\n if (onLoadStart) video.addEventListener('loadstart', onLoadStart);\n if (onCanPlay) video.addEventListener('canplay', onCanPlay);\n }, [videoRef, handlers]);\n\n const cleanupEventListeners = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const { onPlay, onPause, onEnded, onLoadStart, onCanPlay } = handlers;\n\n if (onPlay) video.removeEventListener('play', onPlay);\n if (onPause) video.removeEventListener('pause', onPause);\n if (onEnded) video.removeEventListener('ended', onEnded);\n if (onLoadStart) video.removeEventListener('loadstart', onLoadStart);\n if (onCanPlay) video.removeEventListener('canplay', onCanPlay);\n }, [videoRef, handlers]);\n\n return {\n setupEventListeners,\n cleanupEventListeners\n };\n}; ","import { useEffect, useState, useRef } from 'react';\n\ninterface UsePosterFallbackOptions {\n enabled?: boolean;\n fallbackPoster?: string;\n showLoadingOverlay?: boolean;\n}\n\nexport const usePosterFallback = (\n playerRef: React.RefObject<any>,\n options: UsePosterFallbackOptions = {}\n) => {\n const [isLoading, setIsLoading] = useState(true);\n const [showOverlay, setShowOverlay] = useState(true);\n const [hasStartedPlaying, setHasStartedPlaying] = useState(false);\n const { enabled = true, fallbackPoster, showLoadingOverlay = true } = options;\n\n useEffect(() => {\n if (!playerRef.current || !enabled) {\n return;\n }\n\n const handleLoadStart = () => {\n setIsLoading(true);\n setShowOverlay(true);\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n // Keep overlay visible until user interaction or autoplay starts\n if (!hasStartedPlaying) {\n setShowOverlay(true);\n }\n };\n\n const handlePlay = () => {\n setHasStartedPlaying(true);\n setShowOverlay(false);\n };\n\n const handleLoadedMetadata = () => {\n setIsLoading(false);\n };\n\n // Add event listeners\n const video = playerRef.current;\n if (video) {\n video.addEventListener('loadstart', handleLoadStart);\n video.addEventListener('canplay', handleCanPlay);\n video.addEventListener('play', handlePlay);\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n\n return () => {\n video.removeEventListener('loadstart', handleLoadStart);\n video.removeEventListener('canplay', handleCanPlay);\n video.removeEventListener('play', handlePlay);\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n };\n }\n }, [playerRef, enabled, hasStartedPlaying]);\n\n const hideOverlay = () => {\n setShowOverlay(false);\n };\n\n return {\n isLoading,\n showOverlay: showLoadingOverlay && showOverlay,\n hideOverlay,\n hasStartedPlaying\n };\n}; ","import { useEffect, useRef } from 'react';\n\ninterface UseLiveIndicatorOptions {\n enabled?: boolean;\n indicatorColor?: string;\n indicatorSize?: number;\n showPulseAnimation?: boolean;\n liveThresholdSeconds?: number;\n onLiveStatusChange?: (status: LiveStatus) => void;\n}\n\nexport interface LiveStatus {\n isLive: boolean;\n isNearEdge: boolean;\n liveEdge?: number;\n}\n\nexport const useLiveIndicator = (\n containerRef: React.RefObject<HTMLElement>,\n playerRef: React.RefObject<any>,\n options: UseLiveIndicatorOptions = {}\n) => {\n const observerRef = useRef<MutationObserver | null>(null);\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n const lastStatusRef = useRef<{ isLive: boolean; isNearEdge: boolean } | null>(null);\n const {\n enabled = true,\n indicatorColor = '#ff0000',\n indicatorSize = 8,\n showPulseAnimation = true,\n liveThresholdSeconds = 15,\n onLiveStatusChange\n } = options;\n\n const getLiveStatus = (player: any): LiveStatus => {\n if (!player) {\n return { isLive: false, isNearEdge: false };\n }\n\n try {\n // Use stable public API to check if stream is live\n if (typeof player.isLive !== 'function') {\n return { isLive: false, isNearEdge: false };\n }\n\n const isLiveStream = player.isLive();\n if (!isLiveStream) return { isLive: false, isNearEdge: false };\n\n // Get the seek range using stable public API\n const videoElement = player.getMediaElement?.();\n if (!videoElement) return { isLive: true, isNearEdge: false };\n\n // Use stable public API to get seek range\n if (typeof player.seekRange !== 'function') {\n return { isLive: true, isNearEdge: false };\n }\n\n const seekRange = player.seekRange();\n if (!seekRange || seekRange.end === undefined) {\n return { isLive: true, isNearEdge: false };\n }\n\n const liveEdge = seekRange.end;\n const currentTime = videoElement.currentTime;\n const timeBehindLive = liveEdge - currentTime;\n\n // Consider \"near live edge\" if within the threshold\n return {\n isLive: true,\n isNearEdge: timeBehindLive <= liveThresholdSeconds,\n liveEdge\n };\n } catch (error) {\n console.error('Error checking live status:', error);\n return { isLive: false, isNearEdge: false };\n }\n };\n\n const seekToLiveEdge = () => {\n const player = playerRef.current;\n if (!player) return;\n\n try {\n // Use stable public API to get seek range\n if (typeof player.seekRange !== 'function') return;\n\n const seekRange = player.seekRange();\n if (!seekRange || seekRange.end === undefined) return;\n\n const liveEdge = seekRange.end;\n const videoElement = player.getMediaElement?.();\n if (videoElement) {\n videoElement.currentTime = liveEdge;\n }\n } catch (error) {\n console.error('Error seeking to live edge:', error);\n }\n };\n\n useEffect(() => {\n if (!containerRef.current || !enabled) {\n return;\n }\n\n const updateLiveIndicator = (currentTimeElement: Element, status: LiveStatus) => {\n const parent = currentTimeElement.parentElement;\n if (!parent) return;\n\n const existingContainer = parent.querySelector('.live-indicator-container');\n const isCurrentlyNearEdge = existingContainer?.getAttribute('data-near-edge') === 'true';\n\n // If status matches current state, no update needed\n if (existingContainer && status.isNearEdge === isCurrentlyNearEdge) {\n return;\n }\n\n // Remove existing container if present\n if (existingContainer) {\n existingContainer.remove();\n }\n\n // Create a container for indicator + text\n const container = document.createElement('span');\n container.className = 'live-indicator-container';\n container.setAttribute('data-near-edge', status.isNearEdge.toString());\n container.style.cssText = `\n display: inline-flex;\n align-items: center;\n width: 80px;\n ${!status.isNearEdge ? 'cursor: pointer;' : ''}\n `;\n\n // Create the circle indicator\n const indicator = document.createElement('span');\n indicator.className = 'live-indicator-dot';\n indicator.style.cssText = `\n display: inline-block;\n width: ${indicatorSize}px;\n height: ${indicatorSize}px;\n background-color: ${status.isNearEdge ? indicatorColor : '#888888'};\n border-radius: 50%;\n margin-right: 6px;\n ${status.isNearEdge && showPulseAnimation ? 'animation: pulse-live 2s infinite;' : ''}\n `;\n\n // Create text\n const liveText = document.createElement('span');\n liveText.className = 'live-indicator-text';\n liveText.textContent = status.isNearEdge ? 'LIVE' : 'GO TO LIVE';\n\n container.appendChild(indicator);\n container.appendChild(liveText);\n\n // Add click handler for \"GO TO LIVE\"\n if (!status.isNearEdge) {\n container.addEventListener('click', seekToLiveEdge);\n }\n\n // Insert container as sibling - before time when LIVE, after time when GO TO LIVE\n if (status.isNearEdge) {\n parent.insertBefore(container, currentTimeElement);\n (currentTimeElement as HTMLElement).style.display = 'none';\n } else {\n // Insert after the time element\n currentTimeElement.insertAdjacentElement('afterend', container);\n (currentTimeElement as HTMLElement).style.display = '';\n }\n };\n\n const removeLiveIndicator = (currentTimeElement: Element) => {\n const parent = currentTimeElement.parentElement;\n if (!parent) return;\n\n const container = parent.querySelector('.live-indicator-container');\n if (container) {\n container.remove();\n (currentTimeElement as HTMLElement).style.display = '';\n }\n };\n\n const checkForLiveContent = () => {\n const currentTimeElements = containerRef.current?.querySelectorAll('.shaka-current-time');\n const status = getLiveStatus(playerRef.current);\n\n // Call callback if status changed\n const lastStatus = lastStatusRef.current;\n if (\n onLiveStatusChange &&\n (!lastStatus || lastStatus.isLive !== status.isLive || lastStatus.isNearEdge !== status.isNearEdge)\n ) {\n onLiveStatusChange(status);\n lastStatusRef.current = { isLive: status.isLive, isNearEdge: status.isNearEdge };\n }\n\n currentTimeElements?.forEach((element) => {\n if (status.isLive) {\n updateLiveIndicator(element, status);\n } else {\n removeLiveIndicator(element);\n }\n });\n };\n\n // Initial check\n checkForLiveContent();\n\n // Set up interval to check periodically (since we need to check live edge position)\n intervalRef.current = setInterval(checkForLiveContent, 1000);\n\n // Set up mutation observer to watch for changes in the DOM\n observerRef.current = new MutationObserver((mutations) => {\n let shouldCheck = false;\n \n mutations.forEach((mutation) => {\n // Check if any nodes were added or text content changed\n if (mutation.type === 'childList' || mutation.type === 'characterData') {\n shouldCheck = true;\n }\n \n // Check if any of the added nodes contain current time elements\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n if (element.classList?.contains('shaka-current-time') || \n element.querySelector?.('.shaka-current-time')) {\n shouldCheck = true;\n }\n }\n });\n });\n \n if (shouldCheck) {\n // Debounce the check to avoid excessive calls\n setTimeout(checkForLiveContent, 100);\n }\n });\n\n // Start observing\n observerRef.current.observe(containerRef.current, {\n childList: true,\n subtree: true,\n characterData: true,\n characterDataOldValue: true\n });\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [containerRef, enabled, indicatorColor, indicatorSize, showPulseAnimation, liveThresholdSeconds]);\n\n return {\n seekToLiveEdge,\n getLiveStatus: () => getLiveStatus(playerRef.current)\n };\n}; ","import { useCallback, useEffect } from 'react';\n\ninterface UseKeyboardControlsOptions {\n skipBack?: () => void;\n skipForward?: () => void;\n enabled?: boolean;\n}\n\nexport const useKeyboardControls = (\n videoRef: React.RefObject<HTMLVideoElement>,\n options: UseKeyboardControlsOptions = {}\n) => {\n const { skipBack, skipForward, enabled = true } = options;\n\n // Detect if we're on desktop (not mobile)\n const isDesktop = useCallback(() => {\n return window.innerWidth > 767 && !/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n }, []);\n\n const handleKeydown = useCallback((event: KeyboardEvent) => {\n if (!enabled || !isDesktop() || !videoRef.current) return;\n\n // Don't handle keyboard events if user is typing in an input\n const activeElement = document.activeElement;\n if (activeElement && (\n activeElement.tagName === 'INPUT' ||\n activeElement.tagName === 'TEXTAREA' ||\n (activeElement as HTMLElement).isContentEditable\n )) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n skipBack?.();\n break;\n \n case 'ArrowRight':\n event.preventDefault();\n skipForward?.();\n break;\n \n case ' ':\n case 'Space':\n event.preventDefault();\n if (videoRef.current.paused) {\n videoRef.current.play();\n } else {\n videoRef.current.pause();\n }\n break;\n }\n }, [enabled, videoRef, skipBack, skipForward, isDesktop]);\n\n useEffect(() => {\n if (!enabled || !isDesktop()) return;\n\n // Add event listener to document to catch keyboard events globally\n document.addEventListener('keydown', handleKeydown);\n\n return () => {\n document.removeEventListener('keydown', handleKeydown);\n };\n }, [handleKeydown, enabled, isDesktop]);\n\n return {\n isDesktop: isDesktop()\n };\n}; ","import { useCallback, useRef } from 'react';\n\ninterface AdEventHandlers {\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n}\n\nexport const useAdEvents = (\n playerRef: React.RefObject<any>,\n handlers: AdEventHandlers\n) => {\n // Store listener references for cleanup\n const listenersRef = useRef<Array<{ event: string; listener: (event: any) => void }>>([]);\n\n const setupAdEventListeners = useCallback(() => {\n const player = playerRef.current;\n if (!player) return;\n\n const adManager = player.getAdManager();\n if (!adManager) return;\n\n // Get the AdsManager instance to listen to ad events\n // Note: We need to listen to the LOADED event first to get access to the AdsManager\n const onAdsManagerLoaded = (event: any) => {\n const adsManager = event.getAdsManager();\n \n // Ad started\n const onAdStarted = () => {\n console.log('Ad started');\n handlers.onAdStart?.();\n };\n\n // Ad completed\n const onAdComplete = () => {\n console.log('Ad completed');\n handlers.onAdComplete?.();\n };\n\n // Ad error\n const onAdError = (adErrorEvent: any) => {\n console.error('Ad error:', adErrorEvent.getError());\n handlers.onAdError?.(adErrorEvent.getError());\n };\n\n // Ad skipped\n const onAdSkipped = () => {\n console.log('Ad skipped');\n handlers.onAdSkipped?.();\n };\n\n // Ad paused\n const onAdPaused = () => {\n console.log('Ad paused');\n handlers.onAdPaused?.();\n };\n\n // Ad resumed\n const onAdResumed = () => {\n console.log('Ad resumed');\n handlers.onAdResumed?.();\n };\n\n // Ad progress\n const onAdProgress = (adProgressData: any) => {\n handlers.onAdProgress?.(adProgressData);\n };\n\n // All ads completed\n const onAllAdsCompleted = () => {\n console.log('All ads completed');\n handlers.onAllAdsCompleted?.();\n };\n\n // Store listeners for cleanup\n const adEventListeners: Array<{ event: any; listener: any }> = [];\n\n // Register event listeners if handlers are provided\n if (window.google?.ima) {\n const AdEvent = window.google.ima.AdEvent.Type;\n const AdErrorEvent = window.google.ima.AdErrorEvent.Type;\n\n if (handlers.onAdStart) {\n adsManager.addEventListener(AdEvent.STARTED, onAdStarted);\n adEventListeners.push({ event: AdEvent.STARTED, listener: onAdStarted });\n }\n\n if (handlers.onAdComplete) {\n adsManager.addEventListener(AdEvent.COMPLETE, onAdComplete);\n adEventListeners.push({ event: AdEvent.COMPLETE, listener: onAdComplete });\n }\n\n if (handlers.onAdError) {\n adsManager.addEventListener(AdErrorEvent.AD_ERROR, onAdError);\n adEventListeners.push({ event: AdErrorEvent.AD_ERROR, listener: onAdError });\n }\n\n if (handlers.onAdSkipped) {\n adsManager.addEventListener(AdEvent.SKIPPED, onAdSkipped);\n adEventListeners.push({ event: AdEvent.SKIPPED, listener: onAdSkipped });\n }\n\n if (handlers.onAdPaused) {\n adsManager.addEventListener(AdEvent.PAUSED, onAdPaused);\n adEventListeners.push({ event: AdEvent.PAUSED, listener: onAdPaused });\n }\n\n if (handlers.onAdResumed) {\n adsManager.addEventListener(AdEvent.RESUMED, onAdResumed);\n adEventListeners.push({ event: AdEvent.RESUMED, listener: onAdResumed });\n }\n\n if (handlers.onAdProgress) {\n adsManager.addEventListener(AdEvent.AD_PROGRESS, onAdProgress);\n adEventListeners.push({ event: AdEvent.AD_PROGRESS, listener: onAdProgress });\n }\n\n if (handlers.onAllAdsCompleted) {\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, onAllAdsCompleted);\n adEventListeners.push({ event: AdEvent.ALL_ADS_COMPLETED, listener: onAllAdsCompleted });\n }\n\n // Store the adsManager and its listeners for cleanup\n listenersRef.current.push({\n adsManager,\n listeners: adEventListeners\n } as any);\n }\n };\n\n // Listen for when ads are loaded\n try {\n // Shaka's ad manager uses events for tracking\n player.addEventListener('ad-started', () => {\n console.log('Shaka ad-started event');\n handlers.onAdStart?.();\n });\n\n player.addEventListener('ad-complete', () => {\n console.log('Shaka ad-complete event');\n handlers.onAdComplete?.();\n });\n\n player.addEventListener('ad-skipped', () => {\n console.log('Shaka ad-skipped event');\n handlers.onAdSkipped?.();\n });\n\n player.addEventListener('ad-error', (event: any) => {\n console.error('Shaka ad-error event:', event);\n handlers.onAdError?.(event);\n });\n\n // Store Shaka listeners\n listenersRef.current.push({\n type: 'shaka',\n player: player,\n events: ['ad-started', 'ad-complete', 'ad-skipped', 'ad-error']\n } as any);\n\n } catch (error) {\n console.warn('Error setting up ad event listeners:', error);\n }\n }, [playerRef, handlers]);\n\n const cleanupAdEventListeners = useCallback(() => {\n try {\n // Clean up all stored listeners\n listenersRef.current.forEach((listenerGroup: any) => {\n if (listenerGroup.type === 'shaka' && listenerGroup.player) {\n // Clean up Shaka player listeners\n listenerGroup.events.forEach((eventName: string) => {\n try {\n listenerGroup.player.removeEventListener(eventName, () => {});\n } catch (e) {\n console.warn(`Error removing ${eventName} listener:`, e);\n }\n });\n } else if (listenerGroup.adsManager && listenerGroup.listeners) {\n // Clean up IMA AdsManager listeners\n listenerGroup.listeners.forEach(({ event, listener }: any) => {\n try {\n listenerGroup.adsManager.removeEventListener(event, listener);\n } catch (e) {\n console.warn('Error removing ad listener:', e);\n }\n });\n }\n });\n\n // Clear the listeners array\n listenersRef.current = [];\n } catch (error) {\n console.warn('Error cleaning up ad event listeners:', error);\n }\n }, []);\n\n return {\n setupAdEventListeners,\n cleanupAdEventListeners\n };\n};\n\n","/**\n * Script loader utility for dynamically loading external scripts\n */\n\ninterface ScriptConfig {\n src: string;\n id: string;\n type?: string;\n }\n \n const SCRIPT_CONFIGS: Record<string, ScriptConfig> = {\n ima: {\n src: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n id: 'ima-sdk',\n type: 'text/javascript'\n },\n system73: {\n src: '//cdn.s73cloud.com/4/s73-sdk-shakaplayer.js',\n id: 'system73-sdk',\n type: 'application/javascript'\n }\n };\n \n /**\n * Load a script dynamically\n */\n function loadScript(config: ScriptConfig): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script is already loaded\n if (document.getElementById(config.id)) {\n resolve();\n return;\n }\n \n const script = document.createElement('script');\n script.id = config.id;\n script.src = config.src;\n script.type = config.type || 'text/javascript';\n script.async = true;\n \n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load script: ${config.src}`));\n \n document.head.appendChild(script);\n });\n }\n \n /**\n * Get required script loaders based on configuration\n */\n export function getRequiredScriptLoaders(needsIma: boolean, needsSystem73: boolean): Promise<void>[] {\n const loaders: Promise<void>[] = [];\n \n if (needsIma) {\n loaders.push(loadScript(SCRIPT_CONFIGS.ima));\n }\n \n if (needsSystem73) {\n loaders.push(loadScript(SCRIPT_CONFIGS.system73));\n }\n \n return loaders;\n }\n \n /**\n * Load multiple scripts in parallel\n */\n export async function loadScripts(scriptLoaders: Promise<void>[]): Promise<void> {\n if (scriptLoaders.length === 0) {\n return;\n }\n \n try {\n await Promise.all(scriptLoaders);\n } catch (error) {\n console.error('Error loading scripts:', error);\n throw error;\n }\n }\n \n /**\n * Check if a script is already loaded\n */\n export function isScriptLoaded(scriptName: keyof typeof SCRIPT_CONFIGS): boolean {\n const config = SCRIPT_CONFIGS[scriptName];\n return !!document.getElementById(config.id);\n }\n \n /**\n * Wait for a global variable to be available (useful for waiting for SDK initialization)\n */\n export function waitForGlobal(globalName: string, timeout: number = 5000): Promise<any> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now();\n \n function checkGlobal() {\n const global = (window as any)[globalName];\n if (global) {\n resolve(global);\n return;\n }\n \n if (Date.now() - startTime > timeout) {\n reject(new Error(`Timeout waiting for global: ${globalName}`));\n return;\n }\n \n setTimeout(checkGlobal, 100);\n }\n \n checkGlobal();\n });\n }\n \n /**\n * Wait for multiple globals to be available\n */\n export async function waitForGlobals(globalNames: string[], timeout: number = 5000): Promise<void> {\n const promises = globalNames.map(name => waitForGlobal(name, timeout));\n await Promise.all(promises);\n } ","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\ninterface LoadingProps {\n className?: string;\n}\n\nexport const Loading: React.FC<LoadingProps> = ({ className }) => (\n <div\n className={twMerge(\n \"relative bg-[#151515] md:rounded-2xl! overflow-hidden aspect-video text-white w-full h-full flex justify-center items-center text-[10px]\",\n className\n )}\n role=\"status\"\n >\n {/* Spinner inspired by Shaka Player's buffering indicator */}\n <div className=\" flex justify-center items-center\">\n <svg\n className=\"shaka-spinner-svg animate-spin h-12 w-12\"\n viewBox=\"0 0 64 64\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n className=\"shaka-spinner-path\"\n cx=\"32\"\n cy=\"32\"\n r=\"28\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n stroke=\"currentColor\"\n fill=\"none\"\n /* Create a gap so rotation is visible */\n strokeDasharray=\"176\"\n strokeDashoffset=\"120\"\n />\n </svg>\n </div>\n {/* <span className=\"sr-only\">Loading...</span> */}\n </div>\n); ","import React from 'react';\n\ninterface ErrorScreenProps {\n title?: string;\n description?: string;\n}\n\nexport const ErrorScreen: React.FC<ErrorScreenProps> = ({ title, description }) => (\n <div className=\"w-full h-full md:rounded-2xl! aspect-video bg-black flex\">\n <div className=\"bg-[#151515] text-white w-full h-full flex justify-center items-center\">\n <svg\n className=\"w-24 h-24 m-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{ width: 96 }}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <div>\n <h3 className=\"text-2xl mb-2\">{title || \"Playback Error\"}</h3>\n <div className=\"text-lg\">{description || \"Unable to play the video. Please try again later.\"}</div>\n </div>\n </div>\n </div>\n); ","import React from 'react';\n\ninterface TitleProps {\n title: string;\n}\n\nexport const Title: React.FC<TitleProps> = ({ title }) => (\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-4\">\n <h2 className=\"text-white text-xl font-semibold\">{title}</h2>\n </div>\n); ","import React, { useEffect } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { useQuery } from '@tanstack/react-query';\nimport { Player } from './Player';\nimport type { PlayerProps } from './types';\nimport { fetchVideoData, type VideoData } from './api';\nimport { Loading, ErrorScreen, Title } from './components';\n\n// Import helper functions\nimport { findHLSPlaylist, getErrorType } from './helper';\nimport useMessages, { type Translations } from './messages/useMessages';\n\nexport interface VideoProps extends Omit<PlayerProps, 'src'> {\n videoId?: string;\n publicKey?: string;\n videoData?: VideoData;\n refetchInterval?: number;\n playerName?: string;\n locale?: string;\n events?: {\n onVideoData?: (video: VideoData) => void;\n onEmptyPlaylists?: () => void;\n onError?: (error: Error) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n onPlayerReady?: () => void;\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n };\n children?: React.ReactNode;\n className?: string;\n auth?: {\n mottoToken?: string;\n userId?: string;\n };\n settings?: {\n backgroundImageUrl?: string;\n };\n // TanStack Query options\n queryOptions?: {\n enabled?: boolean;\n staleTime?: number;\n cacheTime?: number;\n retry?: number;\n retryDelay?: number;\n };\n adsEnabled?: boolean;\n}\n\nexport const Video: React.FC<VideoProps> = ({\n videoId,\n publicKey,\n videoData: providedVideoData,\n refetchInterval = 0,\n playerName,\n locale = 'en',\n events,\n children,\n className,\n auth,\n settings,\n queryOptions = {},\n adsEnabled = false,\n ...props\n}) => {\n // Use TanStack Query for data fetching\n const {\n data,\n isLoading,\n error,\n refetch\n } = useQuery<VideoData>({\n queryKey: ['video', videoId, publicKey, auth?.mottoToken, adsEnabled, locale],\n queryFn: () => fetchVideoData(videoId!, publicKey!, auth?.mottoToken, adsEnabled, locale),\n enabled: !!videoId && !!publicKey && !providedVideoData,\n refetchInterval: refetchInterval > 0 ? refetchInterval : false,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000, // 10 minutes (was cacheTime in v4)\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const video = providedVideoData || data;\n const { t } = useMessages(locale);\n \n // Find HLS playlist using helper function\n const activePlaylist = findHLSPlaylist(video);\n const activePlaylistUrl = (\n activePlaylist?.url ??\n activePlaylist?.drm?.widevine?.playlistUrl ??\n activePlaylist?.drm?.playready?.playlistUrl ??\n activePlaylist?.drm?.fairplay?.playlistUrl);\n const activePlaylistHasUrl = !!activePlaylistUrl;\n\n // Notify parent of video data\n useEffect(() => {\n if (events?.onVideoData && video) {\n events.onVideoData(video);\n }\n }, [video, events]);\n\n // Loading state\n if (isLoading || (!providedVideoData && !video)) {\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Handle empty playlists\n if (!isLoading && video && !activePlaylistHasUrl && events?.onEmptyPlaylists) {\n events.onEmptyPlaylists();\n }\n\n // Error state\n if (error || video?.error) {\n const errorKey = video?.error ? getErrorType(undefined, video) : 'API_ERROR';\n const errorObj = error || new Error(video?.error || 'Unknown error');\n \n if (events?.onError) {\n events.onError(errorObj);\n }\n\n // Use localized error messages\n const title = t(errorKey as keyof Translations) || t('DEFAULT_ERROR');\n const description = t(`${errorKey}_DESCRIPTION` as keyof Translations) || t('DEFAULT_ERROR_DESCRIPTION');\n\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full\">\n <ErrorScreen\n title={title}\n description={description}\n />\n {children}\n </div>\n </div>\n );\n }\n\n // No playable source or missing playlist\n if (!activePlaylist || !activePlaylistHasUrl) {\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full bg-[#151515]\">\n <Title title={video?.name || \"\"} />\n {children}\n </div>\n </div>\n );\n }\n\n // Render video player with source\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full\">\n <Player\n {...props}\n src={activePlaylist}\n managedMode={true}\n className={twMerge(\"video-player-container\", className)}\n events={events}\n locale={locale}\n containerClassName=\"w-full h-full\"\n publicKey={publicKey}\n auth={auth}\n {...(adsEnabled && video?.ad?.adTagUrl ? { imaConfig: { adTagUrl: video?.ad?.adTagUrl } } : {})}\n >\n {children}\n </Player>\n </div>\n </div>\n );\n}; ","export interface VideoData {\n id: string;\n name?: string;\n description?: string;\n playlists?: Playlist[];\n error?: string;\n ad?: {\n adTagUrl?: string;\n };\n}\n\nexport interface DVRSettings {\n window_size_seconds: number;\n}\n\nexport interface Widevine {\n playlistUrl: string;\n licenseUrl: string;\n}\n\nexport interface Fairplay {\n certificateUrl: string;\n licenseUrl: string;\n playlistUrl: string;\n}\n\nexport interface Playready {\n playlistUrl: string;\n licenseUrl: string;\n}\n\nexport interface DRM {\n token?: string;\n licenseCacheKey?: string;\n widevine?: Widevine;\n fairplay?: Fairplay;\n playready?: Playready;\n}\n\nexport interface Playlist {\n id: string;\n url: string;\n format: string;\n dvr_settings?: DVRSettings;\n drm: DRM;\n};\n\n/**\n * Fetches video data from the Motto Streaming API\n * @param videoId - The ID of the video to fetch\n * @param publicKey - The public key for authentication\n * @param mottoToken - Optional motto token for authenticated requests\n * @param adsEnabled - Optional flag to enable ads\n * @param locale - Optional locale for localization\n * @returns Promise<VideoData> - The video data\n */\nexport const fetchVideoData = async (\n videoId: string, \n publicKey: string, \n mottoToken?: string,\n adsEnabled: boolean = false,\n locale: string = 'en'\n): Promise<VideoData> => {\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.streaming.video.v1.VideoService/GetVideo\";\n const url = new URL(endpoint);\n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify({ videoId, enable_ads: adsEnabled, locale }));\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n ...(Boolean(mottoToken) && { 'x-motto-token': mottoToken })\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch video: ${response.statusText}`);\n }\n\n const data = await response.json() as { video: VideoData };\n return data.video;\n};\n\n/**\n * Fetches multiple videos data from the Motto Streaming API\n * @param publicKey - The public key for authentication\n * @param videoIds - Array of video IDs to fetch\n * @param mottoToken - Optional motto token for authenticated requests\n * @returns Promise<VideoData[]> - Array of video data\n */\nexport async function fetchVideosList(\n publicKey: string,\n videoIds: string[],\n mottoToken?: string,\n skip: number = 0,\n limit: number = 0,\n adsEnabled: boolean = true,\n locale: string = 'en'\n): Promise<VideoData[]> {\n if (!videoIds || videoIds.length === 0) {\n return [];\n }\n\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.streaming.video.v1.VideoService/BatchGetVideos\";\n const url = new URL(endpoint);\n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify({ videoIds, enable_ads: adsEnabled, locale }));\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n ...(Boolean(mottoToken) && { 'x-motto-token': mottoToken })\n },\n }).catch((err) => {\n throw new Error(`Failed to fetch videos: ${err}`);\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch videos list: ${response.status}`);\n }\n\n const data = (await response.json()) as { videos: VideoData[] };\n return data.videos;\n} ","export interface EventData {\n id: string;\n title: string;\n description?: string;\n startTime: string;\n endTime?: string;\n posterUrl?: string;\n videoIds?: string[];\n error?: string;\n}\n\n\n\nexport enum EventsSortDirection {\n ASC = 'asc',\n DESC = 'desc'\n}\n\nexport async function fetchEventData(\n publicKey: string,\n eventId: string,\n unused?: any,\n filter?: string,\n order?: EventsSortDirection,\n locale?: string\n): Promise<EventData> {\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.cms.event.v1.EventService/GetEvent\";\n const url = new URL(endpoint);\n \n // Build the message object\n const message: any = { eventId };\n if (locale?.length) message.locale = locale;\n if (filter) message.filter = filter;\n if (order) message.order = order;\n \n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify(message));\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n },\n }).catch((err) => {\n throw new Error(`Failed to fetch event: ${err}`);\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch event data: ${response.status}`);\n }\n\n const data = (await response.json()) as { event: EventData };\n return data.event;\n}\n\n ","export interface CreativeWorkData {\n id: string;\n title: string;\n description?: string;\n releaseTime: string;\n endTime?: string;\n posterUrl?: string;\n videoIds?: string[];\n error?: string;\n}\n\nexport enum CreativeWorksSortDirection {\n ASC = 'asc',\n DESC = 'desc'\n}\n\nexport async function fetchCreativeWorkData(\n publicKey: string,\n creativeWorkId: string,\n unused?: any,\n filter?: string,\n order?: CreativeWorksSortDirection,\n locale?: string\n): Promise<CreativeWorkData> {\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.cms.creative_work.v1.CreativeWorkService/GetCreativeWork\";\n const url = new URL(endpoint);\n \n // Build the message object\n const message: any = { creativeWorkId };\n if (locale?.length) message.locale = locale;\n if (filter) message.filter = filter;\n if (order) message.order = order;\n \n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify(message));\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n },\n }).catch((err) => {\n throw new Error(`Failed to fetch creative work: ${err}`);\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch creative work data: ${response.status}`);\n }\n\n const data = (await response.json()) as { creativeWork: CreativeWorkData };\n return data.creativeWork;\n} ","import type { Playlist, VideoData } from './api';\n\nconst defaultError = {\n title: \"Playback Error\",\n description: \"Unable to play the video. Please try again later.\",\n};\n\nexport const errorTypes: Record<\n \"api\" | \"default\" | string,\n {\n title: string;\n description: string;\n }\n> = {\n api: {\n title: \"Failed to Retrieve Video Info\",\n description:\n \"Error fetching video details. Check your videoId and internet connection and try again.\",\n },\n ERROR_CODE_NOT_AUTHENTICATED: {\n title: \"Authorisation\",\n description: \"You don't have permission to play this video. \",\n },\n ERROR_CODE_GEO_BLOCKED: {\n title: \"Geoblocking Restriction\",\n description:\n \"Sorry, this video is not available in your region due to geoblocking restrictions.\",\n },\n ERROR_CODE_NOT_ENTITLED: {\n title: \"Not entitled\",\n description: \"Sorry, you are not entitled to play this video.\",\n },\n ERROR_CODE_VPN_BLOCKED: {\n title: \"VPN BLOCKED\",\n description: \"This video is not available due to the use of a VPN.\",\n },\n ERROR_CODE_UNSPECIFIED: defaultError,\n ERROR_CODE_SIGNATURE_MISMATCH: defaultError,\n ERROR_CODE_INVALID_DOMAIN: defaultError,\n default: defaultError,\n};\n\nexport const getMediaTypeFromSource = (\n source: string\n): \"video/mp4\" | \"application/vnd.apple.mpegurl\" | \"video/x-flv\" => {\n if (source.includes(\".mp4\")) {\n return \"video/mp4\";\n }\n if (source.includes(\".m3u8\")) {\n return \"application/vnd.apple.mpegurl\";\n }\n return \"video/x-flv\"; // Default return\n};\n\nexport const getSourceObject = ({\n source,\n}: {\n source: string;\n}): {\n src: string;\n type: string;\n withCredentials: boolean;\n} => {\n const mediaType = getMediaTypeFromSource(source);\n\n return {\n src: source,\n type: mediaType,\n withCredentials: false, // Set to false as per the original comment about CORS issues\n };\n};\n\nexport const formatTime = (seconds = 0): string => {\n const ss = seconds < 0 ? 0 : seconds;\n let s: number | string = Math.floor(ss % 60);\n let m: number | string = Math.floor((ss / 60) % 60);\n let h: number | string = Math.floor(ss / 3600);\n\n if (isNaN(ss) || ss === Infinity) {\n s = \"-\";\n m = \"-\";\n h = \"-\";\n }\n\n h = Number(h) > 0 ? `${h}:` : \"\";\n m = `${Number(m) < 10 ? `0${m}` : m}:`;\n s = Number(s) < 10 ? `0${s}` : s;\n\n return h + m + s;\n};\n\nexport const findHLSPlaylist = (video?: VideoData): Playlist | undefined => {\n return video?.playlists?.find((playlist) => {\n return playlist.format === 'HLS' || \n playlist.format === 'hls' || \n playlist.format === 'PLAYLIST_FORMAT_HLS';\n });\n};\n\nexport const getErrorType = (error?: string | Error, video?: VideoData) => {\n if (video?.error && errorTypes[video.error]) {\n return video.error;\n }\n return 'DEFAULT_ERROR';\n};\n","import { useState, useEffect } from 'react';\n\n// Import JSON files as modules\nimport en from './en.json';\nimport es from './es.json';\nimport ar from './ar.json';\nimport de from './de.json';\nimport fr from './fr.json';\nimport it from './it.json';\nimport ja from './ja.json';\nimport ko from './ko.json';\nimport pt from './pt.json';\nimport ru from './ru.json';\nimport zh from './zh.json';\nimport nl from './nl.json';\nimport fa from './fa.json';\n\n// Define the available languages\nconst availableLanguages = {\n en,\n es,\n ar,\n de,\n fr,\n it,\n ja,\n ko,\n pt,\n ru,\n zh,\n nl,\n fa\n};\n\ntype Language = keyof typeof availableLanguages;\n\n// Base translations type - this represents all possible keys that can exist\nexport type Translations = {\n \"DAYS\": string\n \"HOURS\": string\n \"MINUTES\": string\n \"SECONDS\": string\n \"STARTING_SOON\": string\n \"EVENT_NOT_STARTED\": string\n \"DEFAULT_ERROR\": string\n \"DEFAULT_ERROR_DESCRIPTION\": string\n \"API_ERROR\": string\n \"API_ERROR_DESCRIPTION\": string\n \"ERROR_CODE_NOT_AUTHENTICATED\": string\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": string\n \"ERROR_CODE_GEO_BLOCKED\": string\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": string\n \"ERROR_CODE_NOT_ENTITLED\": string\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": string\n \"ERROR_CODE_VPN_BLOCKED\": string\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": string\n}\n\n// Partial translations type for individual language files (allows missing keys)\ntype PartialTranslations = Partial<Translations>;\n\n// Function to get the browser's language setting\nconst getBrowserLanguage = (): Language => {\n const language = navigator.language.split('-')[0] as Language;\n return availableLanguages[language] ? language : 'en';\n};\n\nconst useMessages = (locale: string) => {\n const [language, setLanguage] = useState<Language>('en');\n const [translations, setTranslations] = useState<PartialTranslations>(availableLanguages.en);\n\n useEffect(() => {\n const lang = !!availableLanguages?.[locale as Language] ? locale as Language : getBrowserLanguage();;\n setLanguage(lang);\n setTranslations(availableLanguages[lang] as PartialTranslations);\n }, [locale]);\n\n // Translation function with English fallback\n const t = (key: keyof Translations): string => {\n // Try current language first\n if (translations[key]) {\n return translations[key];\n }\n \n // Fallback to English if key not found in current language\n if (language !== 'en' && availableLanguages.en[key]) {\n return availableLanguages.en[key];\n }\n \n // Return empty string if not found in either current language or English\n return '';\n };\n\n // Function to change the language manually\n const changeLanguage = (lng: Language) => {\n if (availableLanguages[lng]) {\n setLanguage(lng);\n setTranslations(availableLanguages[lng] as PartialTranslations);\n }\n };\n\n return { t, language, changeLanguage };\n};\n\nexport default useMessages;\n","{\n \"DAYS\": \"days\",\n \"HOURS\": \"hours\",\n \"MINUTES\": \"min\",\n \"SECONDS\": \"sec\",\n \"STARTING_SOON\": \"Starting soon...\",\n \"EVENT_NOT_STARTED\": \"This event has not started...\",\n \"DEFAULT_ERROR\": \"Playback Error\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Unable to play the video. Please try again later.\",\n \"API_ERROR\": \"Failed to Retrieve Video Info\",\n \"API_ERROR_DESCRIPTION\": \"Error fetching video details. Check your videoId and internet connection and try again.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Authorisation\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"You don't have permission to play this video.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Geoblocking Restriction\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Sorry, this video is not available in your region due to geoblocking restrictions.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Not entitled\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Sorry, you are not entitled to play this video.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOCKED\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"This video is not available due to the use of a VPN.\"\n}\n","{\n \"DAYS\": \"días\",\n \"HOURS\": \"horas\",\n \"MINUTES\": \"min\",\n \"SECONDS\": \"seg\",\n \"STARTING_SOON\": \"En instantes...\",\n \"EVENT_NOT_STARTED\": \"Este evento aún no ha comenzado...\",\n \"DEFAULT_ERROR\": \"Error de reproducción\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"No se puede reproducir el video. Por favor, inténtelo de nuevo más tarde.\",\n \"API_ERROR\": \"Error al recuperar información del video\",\n \"API_ERROR_DESCRIPTION\": \"Error al obtener detalles del video. Verifique su videoId y conexión a internet e inténtelo de nuevo.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorización\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"No tienes permiso para reproducir este video.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restricción geográfica\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Lo siento, este video no está disponible en tu región debido a restricciones geográficas.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"No autorizado\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Lo siento, no estás autorizado para reproducir este video.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOQUEADO\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Este video no está disponible debido al uso de una VPN.\"\n}\n ","{\n \"DAYS\": \"أيام\",\n \"HOURS\": \"ساعات\",\n \"MINUTES\": \"دقائق\",\n \"SECONDS\": \"ثواني\",\n \"STARTING_SOON\": \"يبدأ قريبا...\",\n \"EVENT_NOT_STARTED\": \"هذا الحدث لم يبدأ بعد...\",\n \"DEFAULT_ERROR\": \"خطأ في التشغيل\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"غير قادر على تشغيل الفيديو. يرجى المحاولة مرة أخرى لاحقًا.\",\n \"API_ERROR\": \"فشل في استرجاع معلومات الفيديو\",\n \"API_ERROR_DESCRIPTION\": \"خطأ في جلب تفاصيل الفيديو. تحقق من معرف الفيديو واتصال الإنترنت وحاول مرة أخرى.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"تفويض\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"ليس لديك إذن لتشغيل هذا الفيديو.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"قيود الجغرافيا\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"عذرًا، هذا الفيديو غير متاح في منطقتك بسبب قيود الجغرافيا.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"غير مخول\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"عذرًا، ليس لديك الحق في تشغيل هذا الفيديو.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"تم حظر VPN\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"هذا الفيديو غير متاح بسبب استخدام VPN.\"\n}","{\n \"DAYS\": \"Tage\",\n \"HOURS\": \"Stunden\",\n \"MINUTES\": \"Min\",\n \"SECONDS\": \"Sek\",\n \"STARTING_SOON\": \"Beginnt bald...\",\n \"DEFAULT_ERROR\": \"Wiedergabefehler\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Das Video kann nicht abgespielt werden. Bitte versuchen Sie es später erneut.\",\n \"API_ERROR\": \"Fehler beim Abrufen der Videoinformationen\",\n \"API_ERROR_DESCRIPTION\": \"Fehler beim Abrufen der Videodetails. Überprüfen Sie Ihre videoId und Internetverbindung und versuchen Sie es erneut.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorisierung\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Sie haben keine Berechtigung, dieses Video abzuspielen.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Geoblocking-Beschränkung\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Entschuldigung, dieses Video ist in Ihrer Region aufgrund von Geoblocking-Beschränkungen nicht verfügbar.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Nicht berechtigt\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Entschuldigung, Sie sind nicht berechtigt, dieses Video abzuspielen.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOCKIERT\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Dieses Video ist aufgrund der Verwendung eines VPN nicht verfügbar.\"\n}\n ","{\n \"DAYS\": \"jours\",\n \"HOURS\": \"heures\",\n \"MINUTES\": \"minutes\",\n \"SECONDS\": \"secondes\",\n \"STARTING_SOON\": \"Commence bientôt...\",\n \"EVENT_NOT_STARTED\": \"Cet événement n'a pas commencé...\",\n \"DEFAULT_ERROR\": \"Erreur de lecture\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Impossible de lire la vidéo. Veuillez réessayer plus tard.\",\n \"API_ERROR\": \"Échec de la récupération des informations vidéo\",\n \"API_ERROR_DESCRIPTION\": \"Erreur lors de la récupération des détails de la vidéo. Vérifiez votre videoId et votre connexion Internet, puis réessayez.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorisation\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Vous n'avez pas la permission de lire cette vidéo.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restriction de géoblocage\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Désolé, cette vidéo n'est pas disponible dans votre région en raison de restrictions de géoblocage.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Non autorisé\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Désolé, vous n'êtes pas autorisé à lire cette vidéo.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOQUÉ\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Cette vidéo n'est pas disponible en raison de l'utilisation d'un VPN.\"\n}","{\n \"DAYS\": \"giorni\",\n \"HOURS\": \"ore\",\n \"MINUTES\": \"minuti\",\n \"SECONDS\": \"secondi\",\n \"STARTING_SOON\": \"Inizia presto...\",\n \"DEFAULT_ERROR\": \"Errore di riproduzione\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Impossibile riprodurre il video. Per favore riprova più tardi.\",\n \"API_ERROR\": \"Errore nel recupero delle informazioni video\",\n \"API_ERROR_DESCRIPTION\": \"Errore nel recupero dei dettagli del video. Controlla il tuo videoId e la connessione internet e riprova.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorizzazione\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Non hai il permesso di riprodurre questo video.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restrizione geoblocking\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Spiacenti, questo video non è disponibile nella tua regione a causa di restrizioni geografiche.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Non autorizzato\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Spiacenti, non sei autorizzato a riprodurre questo video.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOCCATA\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Questo video non è disponibile a causa dell'uso di una VPN.\"\n}\n","{\n \"DAYS\": \"日\",\n \"HOURS\": \"時間\",\n \"MINUTES\": \"分\",\n \"SECONDS\": \"秒\",\n \"STARTING_SOON\": \"まもなく開始...\",\n \"DEFAULT_ERROR\": \"再生エラー\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"ビデオを再生できません。後でもう一度お試しください。\",\n \"API_ERROR\": \"ビデオ情報の取得に失敗しました\",\n \"API_ERROR_DESCRIPTION\": \"ビデオの詳細を取得中にエラーが発生しました。videoIdとインターネット接続を確認して、もう一度お試しください。\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"認証\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"このビデオを再生する権限がありません。\",\n \"ERROR_CODE_GEO_BLOCKED\": \"地域制限\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"申し訳ありませんが、地域制限のためこのビデオはご利用いただけません。\",\n \"ERROR_CODE_NOT_ENTITLED\": \"権利なし\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"申し訳ありませんが、このビデオを再生する権利がありません。\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPNブロック\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"VPNの使用により、このビデオはご利用いただけません。\"\n}","{\n \"DAYS\": \"일\",\n \"HOURS\": \"시간\",\n \"MINUTES\": \"분\",\n \"SECONDS\": \"초\",\n \"STARTING_SOON\": \"곧 시작...\",\n \"DEFAULT_ERROR\": \"재생 오류\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"비디오를 재생할 수 없습니다. 나중에 다시 시도해 주세요.\",\n \"API_ERROR\": \"비디오 정보 가져오기 실패\",\n \"API_ERROR_DESCRIPTION\": \"비디오 세부 정보를 가져오는 중 오류가 발생했습니다. videoId와 인터넷 연결을 확인하고 다시 시도해 주세요.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"인증\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"이 비디오를 재생할 권한이 없습니다.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"지역 제한\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"죄송합니다. 이 비디오는 지역 제한으로 인해 귀하의 지역에서 사용할 수 없습니다.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"권한 없음\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"죄송합니다. 이 비디오를 재생할 권한이 없습니다.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN 차단됨\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"VPN 사용으로 인해 이 비디오를 사용할 수 없습니다.\"\n}","{\n \"DAYS\": \"dias\",\n \"HOURS\": \"horas\",\n \"MINUTES\": \"minutos\",\n \"SECONDS\": \"segundos\",\n \"STARTING_SOON\": \"Começando em breve...\",\n \"DEFAULT_ERROR\": \"Playback Error\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Não foi possível reproduzir o vídeo. Por favor, tente novamente mais tarde.\",\n \"API_ERROR\": \"Falha ao Recuperar Informações do Vídeo\",\n \"API_ERROR_DESCRIPTION\": \"Erro ao buscar detalhes do vídeo. Verifique seu videoId e conexão com a internet e tente novamente.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorização\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Você não tem permissão para reproduzir este vídeo.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restrição de Geoblocking\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Desculpe, este vídeo não está disponível em sua região devido a restrições de geoblocking.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Não autorizado\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Desculpe, você não está autorizado a reproduzir este vídeo.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOQUEADO\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Este vídeo não está disponível devido ao uso de uma VPN.\"\n}","{\n \"DAYS\": \"дней\",\n \"HOURS\": \"часов\",\n \"MINUTES\": \"мин\",\n \"SECONDS\": \"сек\",\n \"STARTING_SOON\": \"Скоро начнется...\",\n \"DEFAULT_ERROR\": \"Ошибка воспроизведения\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Не удалось воспроизвести видео. Пожалуйста, попробуйте позже.\",\n \"API_ERROR\": \"Не удалось получить информацию о видео\",\n \"API_ERROR_DESCRIPTION\": \"Ошибка при получении деталей видео. Проверьте ваш videoId и подключение к интернету, затем попробуйте снова.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Авторизация\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"У вас нет разрешения на воспроизведение этого видео.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Географическое ограничение\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Извините, это видео недоступно в вашем регионе из-за географических ограничений.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Нет прав\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Извините, у вас нет прав на воспроизведение этого видео.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN заблокирован\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Это видео недоступно из-за использования VPN.\"\n}","{\n \"DAYS\": \"天\",\n \"HOURS\": \"小时\",\n \"MINUTES\": \"分钟\",\n \"SECONDS\": \"秒\",\n \"STARTING_SOON\": \"即将开始...\",\n \"DEFAULT_ERROR\": \"播放错误\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"无法播放视频。请稍后再试。\",\n \"API_ERROR\": \"获取视频信息失败\",\n \"API_ERROR_DESCRIPTION\": \"获取视频详情时出错。请检查您的视频ID和互联网连接,然后重试。\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"授权\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"您没有权限播放此视频。\",\n \"ERROR_CODE_GEO_BLOCKED\": \"地理封锁限制\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"抱歉,由于地理封锁限制,此视频在您的地区不可用。\",\n \"ERROR_CODE_NOT_ENTITLED\": \"无权播放\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"抱歉,您无权播放此视频。\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN被封锁\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"由于使用VPN,此视频不可用。\"\n}\n ","{\n \"DAYS\": \"dagen\",\n \"HOURS\": \"uren\",\n \"MINUTES\": \"min\",\n \"SECONDS\": \"sec\",\n \"STARTING_SOON\": \"Begint binnenkort...\",\n \"EVENT_NOT_STARTED\": \"Dit evenement is nog niet begonnen...\",\n \"DEFAULT_ERROR\": \"Afspelfout\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Kan de video niet afspelen. Probeer het later opnieuw.\",\n \"API_ERROR\": \"Kan videogegevens niet ophalen\",\n \"API_ERROR_DESCRIPTION\": \"Fout bij het ophalen van videogegevens. Controleer uw video-ID en internetverbinding en probeer het opnieuw.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorisatie\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"U heeft geen toestemming om deze video af te spelen.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Geoblocking Beperking\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Sorry, deze video is niet beschikbaar in uw regio vanwege geoblocking beperkingen.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Geen recht\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Sorry, u heeft geen recht om deze video af te spelen.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN GEBLOKKEERD\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Deze video is niet beschikbaar vanwege het gebruik van een VPN.\"\n}\n","{\n \"DAYS\": \"روزها\",\n \"HOURS\": \"ساعت‌ها\",\n \"MINUTES\": \"دقیقه‌ها\",\n \"SECONDS\": \"ثانیه‌ها\",\n \"STARTING_SOON\": \"به زودی شروع می‌شود...\",\n \"EVENT_NOT_STARTED\": \"این رویداد هنوز شروع نشده است...\",\n \"DEFAULT_ERROR\": \"خطای پخش\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"امکان پخش ویدیو وجود ندارد. لطفاً بعداً دوباره تلاش کنید.\",\n \"API_ERROR\": \"خطا در بازیابی اطلاعات ویدیو\",\n \"API_ERROR_DESCRIPTION\": \"خطا در دریافت جزئیات ویدیو. ویدیوId و اتصال اینترنت خود را بررسی کرده و دوباره تلاش کنید.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"مجوز\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"شما اجازه پخش این ویدیو را ندارید.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"محدودیت جغرافیایی\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"متاسفیم، این ویدیو به دلیل محدودیت‌های جغرافیایی در منطقه شما در دسترس نیست.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"عدم دسترسی\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"متاسفیم، شما اجازه پخش این ویدیو را ندارید.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"مسدود شدن VPN\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"این ویدیو به دلیل استفاده از VPN در دسترس نیست.\"\n}","import React, { CSSProperties, useCallback, useEffect, useRef, useState } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { useQuery } from '@tanstack/react-query';\nimport { Player } from './Player';\nimport type { PlayerProps } from './types';\nimport { fetchEventData, type EventData, EventsSortDirection } from './api/event';\nimport { fetchVideosList, Playlist, type VideoData } from './api/video';\nimport { Loading, ErrorScreen } from './components';\nimport { findHLSPlaylist } from './helper';\nimport useMessages, { type Translations } from './messages/useMessages';\n\n\nexport interface EventProps extends Omit<PlayerProps, 'src' | 'drmConfig'> {\n publicKey: string;\n eventId: string;\n hideTitle?: boolean;\n locale?: string;\n filter?: string;\n order?: EventsSortDirection;\n events?: {\n onEventData?: (event: EventData) => void;\n onVideoData?: (video: VideoData) => void;\n onEmptyPlaylists?: () => void;\n onError?: (error: Error) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n onPlayerReady?: () => void;\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n };\n className?: string;\n settings?: {\n backgroundImageUrl?: string;\n showCountdownAnimation?: boolean;\n };\n auth?: {\n mottoToken?: string;\n userId?: string;\n };\n // TanStack Query options\n queryOptions?: {\n enabled?: boolean;\n staleTime?: number;\n cacheTime?: number;\n retry?: number;\n retryDelay?: number;\n };\n adsEnabled?: boolean;\n}\n\nexport const Event: React.FC<EventProps> = ({\n publicKey,\n eventId,\n events,\n hideTitle,\n locale = 'en',\n order,\n filter,\n className,\n settings,\n auth,\n queryOptions = {},\n adsEnabled = false,\n ...props\n}) => {\n // Event data fetching\n const {\n data: eventData,\n isLoading: isEventLoading,\n error: eventError\n } = useQuery<EventData>({\n queryKey: ['event', publicKey, eventId, filter, order, locale],\n queryFn: () => fetchEventData(publicKey, eventId, undefined, filter, order, locale),\n enabled: !!publicKey && !!eventId,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000, // 10 minutes\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [activePlaylist, setActivePlaylist] = useState<Playlist | null>();\n const [activeVideoId, setActiveVideoId] = useState<string | null>();\n const videoIds = eventData?.videoIds ?? [];\n // Videos list fetching\n const {\n data: videosData,\n isLoading: videosIsLoading,\n error: videosError, \n } = useQuery<VideoData[]>({\n queryKey: ['videos-list', publicKey, videoIds, auth?.mottoToken, adsEnabled, locale],\n queryFn: () => fetchVideosList(publicKey, videoIds, auth?.mottoToken, 0, 0, adsEnabled, locale),\n enabled: !!publicKey && videoIds.length > 0,\n refetchInterval: activePlaylist === null ? 30000 : false,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000,\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000,\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [loadingApisState, setLoadingApisState] = useState(true);\n\n // Process videos data to find active playlist\n useEffect(() => {\n if (videosData !== undefined) {\n setLoadingApisState(false);\n\n const videosWithPlaylists = videosData.filter(\n (video) => video.playlists && video.playlists.length > 0\n );\n\n if (videosWithPlaylists.length > 0) {\n let hlsPlaylistFound = false;\n // Iterate to find the first HLS playlist\n for (const video of videosWithPlaylists) {\n const activePlaylist = findHLSPlaylist(video);\n const activePlaylistUrl = (\n activePlaylist?.url ??\n activePlaylist?.drm?.widevine?.playlistUrl ??\n activePlaylist?.drm?.playready?.playlistUrl ??\n activePlaylist?.drm?.fairplay?.playlistUrl);\n const activePlaylistHasUrl = !!activePlaylistUrl;\n\n if (activePlaylist && activePlaylistHasUrl) {\n setActivePlaylist(activePlaylist);\n setActiveVideoId(video.id);\n hlsPlaylistFound = true;\n break;\n }\n }\n if (!hlsPlaylistFound) {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else if (eventData && (!eventData.videoIds || eventData.videoIds.length === 0)) {\n setLoadingApisState(false);\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n }, [videosData, eventData]);\n \n const { t } = useMessages(locale);\n\n // Notify parent of event data\n useEffect(() => {\n if (events?.onEventData && eventData) {\n events.onEventData(eventData);\n }\n }, [eventData, events]);\n\n // Notify parent of video data\n useEffect(() => {\n if (events?.onVideoData && activeVideoId && videosData) {\n const activeVideo = videosData.find((video) => video.id === activeVideoId);\n if (activeVideo) {\n events.onVideoData(activeVideo);\n }\n }\n }, [activeVideoId, videosData, events]);\n\n // All state and hooks must be defined before any conditional returns\n const [error, setError] = useState<Error | null>(null);\n const [loadingPlaylist, setLoadingPlaylist] = useState(true);\n const videosDataError = videosData?.some((video) => !!video.error);\n\n // Error handling\n useEffect(() => {\n // Defer error evaluation until loading states settle to avoid flashing error\n if (isEventLoading || videosIsLoading || loadingApisState) {\n return;\n }\n\n const hasPlayablePlaylist = Boolean(activePlaylist);\n\n if (eventError || videosError || (videosDataError && !hasPlayablePlaylist)) {\n const firstVideoError = videosData?.find((video) => !!video.error)?.error;\n const errorObj =\n eventError ||\n videosError ||\n (firstVideoError && new Error(firstVideoError)) ||\n new Error('default');\n\n setError(errorObj);\n if (events?.onError) {\n events.onError(errorObj);\n }\n } else {\n setError(null);\n }\n }, [\n eventError,\n videosError,\n videosDataError,\n videosData,\n events,\n activePlaylist,\n isEventLoading,\n videosIsLoading,\n loadingApisState\n ]);\n \n // Loading state management\n useEffect(() => {\n const eventLoadedWithNoVideos =\n !isEventLoading &&\n eventData &&\n eventData.videoIds &&\n (!eventData.videoIds || eventData?.videoIds?.length === 0) &&\n !loadingApisState;\n\n const allApisLoadedWithPotentialVideos =\n !isEventLoading &&\n !videosIsLoading &&\n eventData &&\n !loadingApisState;\n\n if (eventLoadedWithNoVideos || allApisLoadedWithPotentialVideos) {\n setLoadingPlaylist(false);\n }\n }, [isEventLoading, videosIsLoading, eventData, loadingApisState]);\n\n \n // Error state\n if (error) {\n const title = t(error.message as keyof Translations)?.length ? \n t(error.message as keyof Translations) : t(\"DEFAULT_ERROR\"); \n const description = t(`${error.message}_DESCRIPTION` as keyof Translations)?.length ? \n t(`${error.message}_DESCRIPTION` as keyof Translations) : t(\"DEFAULT_ERROR_DESCRIPTION\");\n\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full\">\n <ErrorScreen\n title={title}\n description={description}\n />\n </div>\n </div>\n );\n }\n \n // Handle empty playlists\n if (!loadingPlaylist && eventData && !activePlaylist && events?.onEmptyPlaylists) {\n events.onEmptyPlaylists();\n }\n\n // Loading state\n if (loadingPlaylist) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full aspect-video bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Active video player\n if (activePlaylist && activeVideoId && videosData ) {\n const activeVideo = videosData.find((video) => video.id === activeVideoId);\n console.log('activeVideo?.ad?.adTagUrl', activeVideo?.ad?.adTagUrl );\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <Player\n {...props}\n src={activePlaylist}\n managedMode={true}\n className={twMerge(className, \"peer aspect-video\")}\n events={events}\n locale={locale}\n containerClassName=\"w-full h-full\"\n publicKey={publicKey}\n auth={auth}\n {...(adsEnabled && activeVideo ? { imaConfig: { adTagUrl: activeVideo?.ad?.adTagUrl } } : {})}\n />\n </div>\n {!hideTitle && eventData && (\n <TitleAndDescription \n title={eventData.title} \n description={eventData.description || ''} \n startTime={eventData.startTime} \n locale={locale} \n />\n )}\n </div>\n );\n }\n\n // Pre-event countdown\n if (eventData) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <PreEvent \n event={eventData} \n hideTitle={hideTitle} \n locale={locale} \n backgroundImageUrl={settings?.backgroundImageUrl} \n showAnimation={settings?.showCountdownAnimation} \n />\n </div>\n </div>\n );\n }\n\n return null;\n};\n\n// Pre-event countdown component\nfunction PreEvent({ \n event, \n locale = 'en', \n hideTitle, \n backgroundImageUrl, \n showAnimation = true \n}: { \n event: EventData; \n locale?: string; \n hideTitle?: boolean; \n backgroundImageUrl?: string; \n showAnimation?: boolean;\n}): JSX.Element {\n const date = new Date(event.startTime);\n const now = new Date();\n const [remainingTime, setRemainingTime] = useState(\n date.getTime() - now.getTime()\n );\n const shouldBeStarted = remainingTime < 0;\n const { t } = useMessages(locale);\n useEffect(() => {\n const interval = setInterval(() => {\n if (remainingTime < 0) {\n clearInterval(interval);\n } else {\n setRemainingTime(date.getTime() - new Date().getTime());\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [date, remainingTime]);\n\n const renderCountdown = useCallback(() => {\n if (shouldBeStarted) {\n return <span className=\"text-base-content text-xl\">{t(\"EVENT_NOT_STARTED\")}</span>;\n }\n\n const seconds = Math.floor(remainingTime / 1000) % 60;\n const minutes = Math.floor(remainingTime / 1000 / 60) % 60;\n const hours = Math.floor(remainingTime / 1000 / 60 / 60) % 24;\n const days = Math.floor(remainingTime / 1000 / 60 / 60 / 24);\n\n return (\n <div className=\"grid grid-flow-col gap-1 md:gap-5 text-center auto-cols-max\">\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"font-mono text-lg md:text-5xl\">\n <span \n aria-live=\"polite\" \n aria-label={days.toString()}\n >\n {days.toString()}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"DAYS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": hours } as CSSProperties} \n aria-live=\"polite\" \n aria-label={hours.toString()}\n >\n {hours?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"HOURS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": minutes } as CSSProperties} \n aria-live=\"polite\" \n aria-label={minutes.toString()}\n >\n {minutes?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"MINUTES\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": seconds } as CSSProperties} \n aria-live=\"polite\" \n aria-label={seconds.toString()}\n >\n {seconds?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"SECONDS\")}</span>\n </div>\n </div>\n );\n }, [remainingTime, shouldBeStarted, t]);\n\n return (\n <>\n {event?.posterUrl ? (\n <>\n <div \n className=\"relative overflow-hidden bg-base-200 aspect-video text-base-content w-full h-full flex justify-center items-center flex-col bg-no-repeat bg-cover md:rounded-2xl\" \n style={{ \n backgroundImage: `url(${event.posterUrl})`, \n backgroundRepeat: 'no-repeat', \n backgroundSize: 'cover' \n }}\n >\n {/* <div className=\"absolute inset-0 bg-black bg-opacity-40\"></div> */}\n <div className=\"relative z-10\">\n {renderCountdown()}\n </div>\n </div>\n {!hideTitle && (\n <TitleAndDescription \n title={event.title} \n description={event.description || ''} \n startTime={event.startTime} \n locale={locale} \n />\n )}\n </>\n ) : (\n <>\n <div \n className=\"relative overflow-hidden md:rounded-2xl bg-base-200 aspect-video text-base-content flex flex-col justify-center items-center w-full h-full bg-cover bg-center bg-no-repeat\" \n style={{\n backgroundImage: backgroundImageUrl ? `url(${backgroundImageUrl})` : '',\n }}\n >\n {/* {backgroundImageUrl && <div className=\"absolute inset-0 bg-black bg-opacity-40\"></div>} */}\n <div className=\"relative z-10\">\n {renderCountdown()}\n </div>\n </div>\n {!hideTitle && (\n <TitleAndDescription \n title={event.title} \n description={event.description || ''} \n startTime={event.startTime} \n locale={locale} \n />\n )}\n </>\n )}\n </>\n );\n}\n\n// Title and description component\nconst TitleAndDescription = ({ \n title, \n description, \n startTime, \n locale = 'en', \n className \n}: { \n title: string; \n description: string; \n startTime: string; \n locale?: string; \n className?: string;\n}) => {\n return (\n <div className={twMerge(\"mt-3 mb-6 m-event-details-ctn px-4 text-left w-full\", className)}>\n <div className=\"text-base md:text-xl m-event-title text-base-content font-medium\">{title}</div>\n {startTime ? (\n <div className=\"text-xs md:text-base text-base-content/70 m-event-start-time\">\n {new Date(startTime || \"\").toLocaleDateString(locale || \"default\", {\n month: \"long\",\n year: \"numeric\",\n day: \"numeric\",\n })}{\" \"}\n - {new Date(startTime || \"\").toLocaleTimeString(locale || \"default\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </div>\n ) : null}\n {description && (\n <div className=\"text-xs md:text-xs text-base-content/60 uppercase\">{description}</div>\n )}\n </div>\n );\n}; ","import React, { CSSProperties, useEffect, useState } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { useQuery } from '@tanstack/react-query';\nimport { Player } from './Player';\nimport type { PlayerProps } from './types';\nimport { fetchCreativeWorkData, type CreativeWorkData, CreativeWorksSortDirection } from './api/creative-work';\nimport { fetchVideosList, Playlist, type VideoData } from './api/video';\nimport { Loading, ErrorScreen } from './components';\nimport { findHLSPlaylist } from './helper';\nimport useMessages, { type Translations } from './messages/useMessages';\n\nexport interface CreativeWorkProps extends Omit<PlayerProps, 'src'> {\n publicKey: string;\n creativeWorkId: string;\n hideTitle?: boolean;\n locale?: string;\n filter?: string;\n order?: CreativeWorksSortDirection;\n events?: {\n onCreativeWorkData?: (creativeWork: CreativeWorkData) => void;\n onVideoData?: (video: VideoData) => void;\n onEmptyPlaylists?: () => void;\n onError?: (error: Error) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n onPlayerReady?: () => void;\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n };\n className?: string;\n settings?: {\n backgroundImageUrl?: string;\n showCountdownAnimation?: boolean;\n };\n auth?: {\n mottoToken?: string;\n userId?: string;\n };\n // TanStack Query options\n queryOptions?: {\n enabled?: boolean;\n staleTime?: number;\n cacheTime?: number;\n retry?: number;\n retryDelay?: number;\n };\n adsEnabled?: boolean;\n}\n\nexport const CreativeWork: React.FC<CreativeWorkProps> = ({\n publicKey,\n creativeWorkId,\n events,\n hideTitle,\n locale = 'en',\n order,\n filter,\n className,\n settings,\n auth,\n queryOptions = {},\n adsEnabled = false,\n ...props\n}) => {\n // CreativeWork data fetching\n const {\n data: creativeWorkData,\n isLoading: isCreativeWorkLoading,\n error: creativeWorkError\n } = useQuery<CreativeWorkData>({\n queryKey: ['creative-work', publicKey, creativeWorkId, filter, order, locale],\n queryFn: () => fetchCreativeWorkData(publicKey, creativeWorkId, undefined, filter, order, locale),\n enabled: !!publicKey && !!creativeWorkId,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000, // 10 minutes\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [activePlaylist, setActivePlaylist] = useState<Playlist | null>();\n const [activeVideoId, setActiveVideoId] = useState<string | null>();\n const [showCountDown, setShowCountDown] = useState(false);\n const videoIds = creativeWorkData?.videoIds ?? [];\n\n // Videos list fetching\n const {\n data: videosData,\n isLoading: videosIsLoading,\n error: videosError, \n } = useQuery<VideoData[]>({\n queryKey: ['videos-list', publicKey, videoIds, auth?.mottoToken, adsEnabled, locale],\n queryFn: () => fetchVideosList(publicKey, videoIds, auth?.mottoToken, 0, 0, adsEnabled, locale),\n enabled: !!publicKey && videoIds.length > 0,\n refetchInterval: activePlaylist === null ? 30000 : false,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000,\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000,\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [loadingApisState, setLoadingApisState] = useState(true);\n\n // Process videos data to find active playlist\n useEffect(() => {\n if (videosData !== undefined) {\n setLoadingApisState(false);\n\n const videosWithPlaylists = videosData.filter(\n (video) => video.playlists && video.playlists.length > 0\n );\n\n if (videosWithPlaylists.length > 0) {\n let hlsPlaylistFound = false;\n // Iterate to find the first HLS playlist\n for (const video of videosWithPlaylists) {\n const activePlaylist = findHLSPlaylist(video);\n const activePlaylistUrl = (\n activePlaylist?.url ??\n activePlaylist?.drm?.widevine?.playlistUrl ??\n activePlaylist?.drm?.playready?.playlistUrl ??\n activePlaylist?.drm?.fairplay?.playlistUrl);\n const activePlaylistHasUrl = !!activePlaylistUrl;\n\n if (activePlaylist && activePlaylistHasUrl) {\n setActivePlaylist(activePlaylist);\n setActiveVideoId(video.id);\n hlsPlaylistFound = true;\n break;\n }\n }\n if (!hlsPlaylistFound) {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else if (creativeWorkData && (!creativeWorkData.videoIds || creativeWorkData.videoIds.length === 0)) {\n setLoadingApisState(false);\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n }, [videosData, creativeWorkData]);\n \n const { t } = useMessages(locale);\n\n // Notify parent of creative work data\n useEffect(() => {\n if (events?.onCreativeWorkData && creativeWorkData) {\n events.onCreativeWorkData(creativeWorkData);\n }\n if (creativeWorkData && !creativeWorkData?.videoIds?.length) {\n setShowCountDown(true);\n }\n }, [creativeWorkData, events]);\n\n // Notify parent of video data\n useEffect(() => {\n if (events?.onVideoData && activeVideoId && videosData) {\n const activeVideo = videosData.find((video) => video.id === activeVideoId);\n if (activeVideo) {\n events.onVideoData(activeVideo);\n }\n }\n }, [activeVideoId, videosData, events]);\n\n const [error, setError] = useState<Error | null>(null);\n const videosDataError = videosData?.some((video) => !!video.error);\n\n // Error handling\n useEffect(() => {\n if (creativeWorkError || videosError || videosDataError) {\n const errorObj = creativeWorkError || videosError || \n (videosData?.find((video) => !!video.error)?.error && \n new Error(videosData?.find((video) => !!video.error)?.error)) || \n new Error('default');\n \n setError(errorObj);\n if (events?.onError) {\n events.onError(errorObj);\n }\n } else {\n setError(null);\n }\n }, [creativeWorkError, videosError, videosDataError, videosData, events]);\n\n // Error state\n if (error) {\n const title = t(error.message as keyof Translations)?.length ? \n t(error.message as keyof Translations) : t(\"DEFAULT_ERROR\"); \n const description = t(`${error.message}_DESCRIPTION` as keyof Translations)?.length ? \n t(`${error.message}_DESCRIPTION` as keyof Translations) : t(\"DEFAULT_ERROR_DESCRIPTION\");\n \n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <ErrorScreen\n title={title}\n description={description}\n />\n </div>\n </div>\n );\n }\n\n const [loadingPlaylist, setLoadingPlaylist] = useState(true);\n \n // Loading state management\n useEffect(() => {\n const creativeWorkLoadedWithNoVideos =\n !isCreativeWorkLoading &&\n creativeWorkData &&\n creativeWorkData.videoIds &&\n creativeWorkData.videoIds.length === 0;\n\n const creativeWorkLoadedWithNoData =\n !isCreativeWorkLoading && creativeWorkData && !creativeWorkData.videoIds;\n\n const isEventsFinished =\n !videosIsLoading &&\n videosData &&\n videosData.length > 0 &&\n videosData.every((video) => video.playlists && video.playlists.length === 0);\n\n if (\n creativeWorkLoadedWithNoVideos ||\n creativeWorkLoadedWithNoData ||\n isEventsFinished\n ) {\n setLoadingPlaylist(false);\n if (events?.onEmptyPlaylists) {\n events.onEmptyPlaylists();\n }\n } else if (activePlaylist) {\n setLoadingPlaylist(false);\n }\n }, [\n isCreativeWorkLoading,\n creativeWorkData,\n videosIsLoading,\n videosData,\n activePlaylist,\n events,\n ]);\n\n // Loading state\n if (isCreativeWorkLoading || videosIsLoading || loadingApisState) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full aspect-video bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Show countdown if creative work hasn't started yet\n if (showCountDown && creativeWorkData) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full bg-base-200 text-base-content flex justify-center items-center flex-col\">\n <PreCreativeWork \n creativeWork={creativeWorkData} \n locale={locale} \n hideTitle={hideTitle}\n backgroundImageUrl={settings?.backgroundImageUrl} \n showAnimation={settings?.showCountdownAnimation} \n />\n </div>\n </div>\n );\n }\n\n // Show player if we have an active playlist\n if (activeVideoId && activePlaylist && !loadingPlaylist) {\n const activeVideo = videosData?.find((video) => video.id === activeVideoId);\n \n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <Player\n {...props}\n className={twMerge(className, \"peer aspect-video\")}\n managedMode={true}\n events={{\n ...events,\n }}\n src={activePlaylist}\n locale={locale}\n containerClassName=\"w-full h-full\"\n publicKey={publicKey}\n auth={auth}\n {...(adsEnabled && activeVideo?.ad?.adTagUrl ? { imaConfig: { adTagUrl: activeVideo?.ad?.adTagUrl } } : {})}\n />\n {!hideTitle && (\n <TitleAndDescription\n title={creativeWorkData?.title || ''}\n description={creativeWorkData?.description || ''}\n releaseTime={creativeWorkData?.releaseTime || ''}\n locale={locale}\n className=\"mt-3 mb-6 m-event-details-ctn px-4\"\n />\n )}\n </div>\n </div>\n );\n }\n\n // Loading state for playlist\n if (loadingPlaylist) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full aspect-video bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Empty state\n return null;\n};\n\nfunction PreCreativeWork({ \n creativeWork, \n locale = 'en', \n hideTitle, \n backgroundImageUrl, \n showAnimation = true \n}: { \n creativeWork: CreativeWorkData; \n locale?: string; \n hideTitle?: boolean; \n backgroundImageUrl?: string; \n showAnimation?: boolean;\n}): JSX.Element {\n const date = new Date(creativeWork.releaseTime);\n const now = new Date();\n const [remainingTime, setRemainingTime] = useState(\n date.getTime() - now.getTime()\n );\n const shouldBeStarted = remainingTime < 0;\n const { t } = useMessages(locale);\n\n useEffect(() => {\n const interval = setInterval(() => {\n if (remainingTime < 0) {\n clearInterval(interval);\n } else {\n setRemainingTime(date.getTime() - new Date().getTime());\n }\n }, 1000);\n\n return () => { clearInterval(interval); };\n }, [date, remainingTime]);\n\n const renderCountdown = () => {\n if (shouldBeStarted) {\n return <span className=\"text-base-content text-xl\">{t(\"EVENT_NOT_STARTED\")}</span>;\n }\n\n const seconds = Math.floor(remainingTime / 1000) % 60;\n const minutes = Math.floor(remainingTime / 1000 / 60) % 60;\n const hours = Math.floor(remainingTime / 1000 / 60 / 60) % 24;\n const days = Math.floor(remainingTime / 1000 / 60 / 60 / 24);\n\n return (\n <div className=\"grid grid-flow-col md:gap-5 gap-1 text-center auto-cols-max\">\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"font-mono text-lg md:text-5xl\">\n <span \n aria-live=\"polite\" \n aria-label={days.toString()}\n >\n {days.toString()}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"DAYS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": hours } as CSSProperties} \n aria-live=\"polite\" \n aria-label={hours.toString()}\n >\n {hours?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"HOURS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": minutes } as CSSProperties} \n aria-live=\"polite\" \n aria-label={minutes.toString()}\n >\n {minutes?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"MINUTES\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": seconds } as CSSProperties} \n aria-live=\"polite\" \n aria-label={seconds.toString()}\n >\n {seconds?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"SECONDS\")}</span>\n </div>\n </div>\n );\n };\n\n return (\n <>\n <div \n className=\"relative overflow-hidden md:rounded-2xl bg-base-200 aspect-video text-base-content flex flex-col justify-center items-center w-full h-full bg-cover bg-center bg-no-repeat\" \n style={{\n backgroundImage: backgroundImageUrl ? `url(${backgroundImageUrl})` : '',\n }}\n >\n {backgroundImageUrl && <div className=\"absolute inset-0 bg-black bg-opacity-40\"></div>}\n <div className=\"relative z-10\">\n {renderCountdown()}\n </div>\n </div>\n {!hideTitle && (\n <TitleAndDescription\n title={creativeWork.title}\n description={creativeWork.description || ''}\n releaseTime={creativeWork.releaseTime}\n locale={locale}\n />\n )}\n </>\n );\n}\n\nconst TitleAndDescription = ({ \n title, \n description, \n releaseTime, \n locale = 'en', \n className \n}: { \n title: string; \n description: string; \n releaseTime: string; \n locale?: string; \n className?: string;\n}) => {\n return (\n <div className={twMerge(\"mt-3 mb-6 m-event-details-ctn px-4 text-left w-full\", className)}>\n <div className=\"text-base md:text-xl m-event-title text-base-content font-medium\">{title}</div>\n {releaseTime ? (\n <div className=\"text-sm md:text-base text-base-content/70 m-event-start-time\">\n {new Date(releaseTime || \"\").toLocaleDateString(locale || \"default\", {\n month: \"long\",\n year: \"numeric\",\n day: \"numeric\",\n })}{\" \"}\n - {new Date(releaseTime || \"\").toLocaleTimeString(locale || \"default\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </div>\n ) : null}\n {description && (\n <div className=\"text-xs md:text-sm text-base-content/60 uppercase\">{description}</div>\n )}\n </div>\n );\n}; ","import React from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\n// Create a client\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n retry: 3,\n refetchOnWindowFocus: false,\n },\n },\n});\n\ninterface QueryProviderProps {\n children: React.ReactNode;\n}\n\nexport const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => {\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n};\n\nexport { queryClient }; "],"mappings":"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","names":["useEffect","useRef","useCallback","useState","shaka","drmConfig","video","useCallback","useCallback","useCallback","useRef","initShakaPlayerMux","shaka","useRef","useCallback","initShakaPlayerMux","shaka","useCallback","useRef","jsx","jsxs","jsx","useRef","useCallback","useCallback","useState","useEffect","useRef","useCallback","useEffect","useCallback","useRef","twMerge","jsx","jsx","jsxs","jsx","jsx","jsxs","useRef","useState","useCallback","shaka","controls","useEffect","twMerge","useEffect","twMerge","useState","useEffect","useState","useEffect","jsx","jsxs","useEffect","twMerge","useCallback","useEffect","useState","twMerge","useQuery","jsx","jsxs","useQuery","useState","useEffect","activePlaylist","twMerge","useCallback","useEffect","useState","twMerge","useQuery","Fragment","jsx","jsxs","useQuery","useState","useEffect","activePlaylist","twMerge","TitleAndDescription","jsx"]}
1
+ {"version":3,"sources":["../src/index.ts","#style-inject:#style-inject","../src/styles.css","../src/Player.tsx","../src/hooks/useShakaPlayer.ts","../src/utils/devices.ts","../package.json","../src/utils/licenseCache.ts","../src/hooks/useQualityControl.ts","../src/hooks/useSkipControls.ts","../src/hooks/useMuxAnalytics.ts","../src/hooks/useShakaUI.ts","../src/icons/SkipBackIcon.tsx","../src/icons/SkipForwardIcon.tsx","../src/icons/BigPlayIcon.tsx","../src/utils/renderIcon.ts","../src/hooks/useEventHandlers.ts","../src/hooks/usePosterFallback.ts","../src/hooks/useLiveIndicator.ts","../src/hooks/useKeyboardControls.ts","../src/hooks/useAdEvents.ts","../src/utils/scriptLoader.ts","../src/components/Loading.tsx","../src/components/ErrorScreen.tsx","../src/components/Title.tsx","../src/Video.tsx","../src/api/video.ts","../src/api/event.ts","../src/api/creative-work.ts","../src/helper.ts","../src/messages/useMessages.tsx","../src/messages/en.json","../src/messages/es.json","../src/messages/ar.json","../src/messages/de.json","../src/messages/fr.json","../src/messages/it.json","../src/messages/ja.json","../src/messages/ko.json","../src/messages/pt.json","../src/messages/ru.json","../src/messages/zh.json","../src/messages/nl.json","../src/messages/fa.json","../src/Event.tsx","../src/CreativeWork.tsx","../src/QueryProvider.tsx"],"sourcesContent":["// Import Shaka Player default control styles to ensure proper styling without needing external CDN links\nimport 'shaka-player/dist/controls.css';\n// Import library specific (Tailwind-based) overrides after the base Shaka styles so that our custom\n// styles take precedence.\nimport './styles.css';\nexport { Player } from './Player';\nexport { Video } from './Video';\nexport { Event } from './Event';\nexport { CreativeWork } from './CreativeWork';\nexport { QueryProvider, queryClient } from './QueryProvider';\nexport { SkipBackIcon, SkipForwardIcon, BigPlayIcon } from './icons';\nexport type { PlayerProps, PlayerEvents, IconSizes, TimeUpdateData } from './types';\nexport type { VideoProps } from './Video';\nexport type { EventProps } from './Event';\nexport type { CreativeWorkProps } from './CreativeWork';\nexport type { VideoData } from './api/video';\nexport type { EventData, EventsSortDirection } from './api/event';\nexport type { CreativeWorkData, CreativeWorksSortDirection } from './api/creative-work'; ","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@layer components {\\n video::-webkit-media-controls {\\n display: none !important;\\n }\\n video::-webkit-media-controls-panel {\\n display: none !important;\\n }\\n video::-webkit-media-controls-play-button {\\n display: none !important;\\n }\\n video::-webkit-media-controls-timeline {\\n display: none !important;\\n }\\n video::-webkit-media-controls-current-time-display {\\n display: none !important;\\n }\\n video::-webkit-media-controls-time-remaining-display {\\n display: none !important;\\n }\\n video::-webkit-media-controls-mute-button {\\n display: none !important;\\n }\\n video::-webkit-media-controls-volume-slider {\\n display: none !important;\\n }\\n video::-webkit-media-controls-fullscreen-button {\\n display: none !important;\\n }\\n video::-webkit-media-controls-overlay-play-button {\\n display: none !important;\\n }\\n video::-moz-media-controls {\\n display: none !important;\\n }\\n video {\\n outline: none !important;\\n }\\n video[controls] {\\n -webkit-appearance: none !important;\\n appearance: none !important;\\n }\\n video::-webkit-media-controls-enclosure {\\n display: none !important;\\n }\\n video::-webkit-media-controls-start-playback-button {\\n display: none !important;\\n }\\n video[controls]::-webkit-media-controls,\\n video[controls]::-webkit-media-controls-panel,\\n video[controls]::-webkit-media-controls-play-button,\\n video[controls]::-webkit-media-controls-timeline,\\n video[controls]::-webkit-media-controls-current-time-display,\\n video[controls]::-webkit-media-controls-time-remaining-display,\\n video[controls]::-webkit-media-controls-mute-button,\\n video[controls]::-webkit-media-controls-volume-slider,\\n video[controls]::-webkit-media-controls-fullscreen-button,\\n video[controls]::-webkit-media-controls-overlay-play-button,\\n video[controls]::-webkit-media-controls-enclosure,\\n video[controls]::-webkit-media-controls-start-playback-button {\\n display: none !important;\\n visibility: hidden !important;\\n opacity: 0 !important;\\n pointer-events: none !important;\\n }\\n video[controls]::-moz-media-controls {\\n display: none !important;\\n visibility: hidden !important;\\n opacity: 0 !important;\\n }\\n .motto-video-container {\\n @apply relative w-full;\\n min-height: 300px;\\n }\\n @supports (aspect-ratio: 16/9) {\\n .motto-video-container {\\n min-height: auto;\\n }\\n }\\n .motto-video-responsive {\\n @apply absolute top-0 left-0 w-full h-full;\\n }\\n .motto-skip-button {\\n @apply absolute top-1/2 -translate-y-1/2 bg-black/70 text-white border-0 rounded-full w-16 h-16 text-2xl cursor-pointer flex items-center justify-center transition-all duration-200 z-10 opacity-80 hover:opacity-100 hover:scale-110 active:scale-95;\\n }\\n .motto-skip-button-back {\\n @apply left-5;\\n }\\n .motto-skip-button-forward {\\n @apply right-5;\\n }\\n}\\n.shaka-seek-bar-container {\\n height: 6px !important;\\n width: 100% !important;\\n margin: 8px 0 !important;\\n border-radius: 4px !important;\\n position: relative !important;\\n border-top: none !important;\\n border-bottom: none !important;\\n box-shadow: none !important;\\n}\\n.shaka-seek-bar {\\n height: 6px !important;\\n width: 100% !important;\\n -webkit-appearance: none !important;\\n appearance: none !important;\\n background: transparent !important;\\n cursor: pointer !important;\\n border: none !important;\\n outline: none !important;\\n position: absolute !important;\\n top: 0 !important;\\n left: 0 !important;\\n border-radius: 4px !important;\\n}\\n.shaka-seek-bar::-webkit-slider-runnable-track {\\n height: 6px !important;\\n background: transparent !important;\\n border-radius: 4px !important;\\n border: none !important;\\n}\\n.shaka-seek-bar::-moz-range-track {\\n height: 6px !important;\\n background: transparent !important;\\n border-radius: 4px !important;\\n border: none !important;\\n}\\n.shaka-seek-bar::-webkit-slider-thumb {\\n -webkit-appearance: none !important;\\n appearance: none !important;\\n width: 16px !important;\\n height: 16px !important;\\n border-radius: 50% !important;\\n background: #ffffff !important;\\n cursor: pointer !important;\\n border: 2px solid #ffffff !important;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3) !important;\\n margin-top: -4px !important;\\n}\\n.shaka-seek-bar::-moz-range-thumb {\\n width: 16px !important;\\n height: 16px !important;\\n border-radius: 50% !important;\\n background: #ffffff !important;\\n cursor: pointer !important;\\n border: 2px solid #ffffff !important;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3) !important;\\n margin-top: -4px !important;\\n}\\n.motto-skip-back-button,\\n.motto-skip-forward-button,\\n.motto-native-skip-button {\\n background: transparent !important;\\n border: none !important;\\n padding: 4px !important;\\n margin: 0px !important;\\n cursor: pointer !important;\\n color: #ffffff !important;\\n transition: all 0.2s ease !important;\\n min-width: 32px !important;\\n height: 32px !important;\\n display: flex !important;\\n align-items: center !important;\\n justify-content: center !important;\\n border-radius: 4px !important;\\n width: 25px;\\n}\\n.motto-skip-back-button:hover,\\n.motto-skip-forward-button:hover,\\n.motto-native-skip-button:hover {\\n opacity: 0.8 !important;\\n background: transparent !important;\\n transform: scale(1.05) !important;\\n}\\n.motto-skip-back-button:active,\\n.motto-skip-forward-button:active,\\n.motto-native-skip-button:active {\\n transform: scale(0.95) !important;\\n}\\n.motto-skip-back-button svg,\\n.motto-skip-forward-button svg,\\n.motto-native-skip-button svg {\\n width: 24px !important;\\n height: 24px !important;\\n}\\n.shaka-spinner-svg {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-spinner-path {\\n stroke: white !important;\\n fill: none !important;\\n}\\n.shaka-spinner-container {\\n color: white !important;\\n}\\n.shaka-buffering-spinner {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-buffering-spinner svg {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-buffering-spinner path {\\n stroke: white !important;\\n fill: none !important;\\n}\\n[data-shaka-player-container] .shaka-spinner,\\n[data-shaka-player-container] .spinner {\\n color: white !important;\\n border-color: white !important;\\n}\\n.material-icons.shaka-spinner {\\n color: white !important;\\n}\\n.shaka-controls-container .shaka-spinner,\\n.shaka-video-container .shaka-spinner {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-controls-container .shaka-spinner svg,\\n.shaka-video-container .shaka-spinner svg {\\n color: white !important;\\n fill: white !important;\\n}\\n.shaka-controls-container .shaka-spinner path,\\n.shaka-video-container .shaka-spinner path {\\n stroke: white !important;\\n}\\n.motto-video-loading-overlay {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n background:\\n linear-gradient(\\n 135deg,\\n #1a1a1a 0%,\\n #2d2d2d 100%);\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n z-index: 10;\\n transition: opacity 0.3s ease;\\n}\\n.motto-video-loading-overlay.hidden {\\n opacity: 0;\\n pointer-events: none;\\n}\\n.motto-video-loading-content {\\n text-align: center;\\n color: white;\\n}\\n.motto-video-loading-icon {\\n width: 64px;\\n height: 64px;\\n margin-bottom: 16px;\\n opacity: 0.7;\\n}\\n.motto-video-loading-text {\\n font-size: 16px;\\n font-weight: 500;\\n margin-bottom: 8px;\\n}\\n.motto-video-loading-subtext {\\n font-size: 14px;\\n opacity: 0.7;\\n}\\n@keyframes pulse-live {\\n 0% {\\n opacity: 1;\\n transform: scale(1);\\n }\\n 50% {\\n opacity: 0.7;\\n transform: scale(1.1);\\n }\\n 100% {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n.shaka-play-button {\\n background: rgba(255, 255, 255, 0.1) !important;\\n border: none !important;\\n color: white !important;\\n padding: 10px !important;\\n border-radius: 100% !important;\\n transition: all 0.2s ease !important;\\n display: flex !important;\\n align-items: center !important;\\n justify-content: center !important;\\n min-width: 55px !important;\\n height: 55px !important;\\n}\\n.shaka-play-button-container {\\n background: transparent;\\n transition: all 0.2s ease !important;\\n}\\n.motto-video-container:not(.no-cursor) .shaka-play-button-container {\\n background: rgba(0, 0, 0, 0.3);\\n transition: all 0.s ease !important;\\n}\\n.shaka-play-button:hover {\\n background: rgba(255, 255, 255, 0.2) !important;\\n transform: scale(1.05) !important;\\n}\\n.shaka-play-button:active {\\n transform: scale(0.95) !important;\\n}\\n.shaka-play-button > * {\\n display: none !important;\\n}\\n.shaka-play-button::after {\\n content: \\\"\\\" !important;\\n width: 35px !important;\\n height: 35px !important;\\n background-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"white\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M4.5 5.653c0-1.427 1.529-2.33 2.779-1.643l11.54 6.347c1.295.712 1.295 2.573 0 3.286L7.28 19.99c-1.25.687-2.779-.217-2.779-1.643V5.653Z\\\" clip-rule=\\\"evenodd\\\" /></svg>') !important;\\n background-repeat: no-repeat !important;\\n background-size: contain !important;\\n background-position: center !important;\\n display: block !important;\\n}\\n.shaka-play-button[aria-label*=Play]::after {\\n background-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"white\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M4.5 5.653c0-1.427 1.529-2.33 2.779-1.643l11.54 6.347c1.295.712 1.295 2.573 0 3.286L7.28 19.99c-1.25.687-2.779-.217-2.779-1.643V5.653Z\\\" clip-rule=\\\"evenodd\\\" /></svg>') !important;\\n}\\n.shaka-play-button[aria-label*=Pause]::after {\\n background-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"white\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M6.75 5.25a.75.75 0 0 1 .75-.75H9a.75.75 0 0 1 .75.75v13.5a.75.75 0 0 1-.75.75H7.5a.75.75 0 0 1-.75-.75V5.25Zm7.5 0A.75.75 0 0 1 15 4.5h1.5a.75.75 0 0 1 .75.75v13.5a.75.75 0 0 1-.75.75H15a.75.75 0 0 1-.75-.75V5.25Z\\\" clip-rule=\\\"evenodd\\\" /></svg>') !important;\\n}\\n.motto-video-container {\\n background: #111111;\\n}\\n.motto-video-container video {\\n width: 100% !important;\\n height: 100% !important;\\n margin-left: auto !important;\\n margin-right: auto !important;\\n}\\nhtml[dir=rtl] .shaka-controls-container,\\nhtml[dir=rtl] .shaka-bottom-controls,\\nhtml[dir=rtl] .shaka-controls-button-panel {\\n direction: ltr !important;\\n}\\nhtml[dir=rtl] .shaka-overflow-menu,\\nhtml[dir=rtl] .shaka-settings-menu {\\n direction: rtl !important;\\n text-align: right !important;\\n}\\nhtml[dir=rtl] .shaka-overflow-menu .shaka-overflow-button .material-svg-icon:not(:first-child) {\\n margin-right: 12px !important;\\n margin-left: 0 !important;\\n}\\nhtml[dir=rtl] .shaka-overflow-menu .shaka-overflow-button .material-svg-icon:first-child {\\n margin-right: 0 !important;\\n margin-left: 12px !important;\\n}\\n.shaka-hidden-fast-forward-container,\\n.shaka-hidden-rewind-container {\\n pointer-events: none !important;\\n display: none !important;\\n}\\n\")","import React, { forwardRef, useEffect, useRef, useImperativeHandle, useCallback, useState } from 'react';\nimport shaka from 'shaka-player/dist/shaka-player.ui';\nimport { PlayerProps } from './types';\nimport { \n useShakaPlayer, \n useQualityControl, \n useSkipControls, \n useMuxAnalytics, \n useShakaUI,\n useEventHandlers,\n useLiveIndicator,\n useKeyboardControls,\n useAdEvents\n} from './hooks';\nimport './styles.css';\nimport { twMerge } from 'tailwind-merge';\nimport { getRequiredScriptLoaders, loadScripts, waitForGlobals } from './utils/scriptLoader';\nimport { Loading } from './components';\n\n// Declare google namespace for IMA SDK\ndeclare global {\n namespace google {\n namespace ima {\n class AdsRequest {\n adTagUrl: string;\n }\n }\n }\n}\n\nexport const Player = forwardRef<HTMLVideoElement, PlayerProps>(\n ({ \n src, \n managedMode = false,\n autoPlay = false, \n loop = false, \n muted = false, \n controls = true,\n poster,\n width,\n height,\n aspectRatio = 16/9,\n shakaConfig,\n drmConfig,\n muxConfig,\n system73Config,\n imaConfig,\n chromecastConfig,\n qualityConfig,\n seekbarConfig,\n iconSizes,\n events,\n locale = 'en',\n containerClassName,\n liveThresholdSeconds = 15,\n publicKey,\n auth,\n ...videoProps\n }, ref) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isScriptsLoaded, setIsScriptsLoaded] = useState(false);\n const [isInitialLoading, setIsInitialLoading] = useState(true);\n const [bfResetKey, setBfResetKey] = useState(0);\n\n // Compute playlist presence for managed mode optimization\n // In managed mode, we only reinitialize when playlist presence changes, not on URL changes\n const hasPlaylist = !!src && (\n typeof src === 'string' ||\n !!(\n src.url ||\n src.drm?.widevine?.playlistUrl ||\n src.drm?.playready?.playlistUrl ||\n src.drm?.fairplay?.playlistUrl\n )\n );\n\n // Assign the ref early so parent components can access the video element\n useImperativeHandle(ref, () => videoRef.current!, []);\n\n // Initialize custom hooks\n const { playerRef, initializePlayer, loadManifest, destroyPlayer, isRetrying } = useShakaPlayer({\n src,\n shakaConfig,\n drmConfig,\n onError: events?.onError,\n onPlayerReady: events?.onPlayerReady,\n muxConfig,\n onMuxReady: events?.onMuxReady,\n onMuxDataUpdate: events?.onMuxDataUpdate,\n publicKey,\n mottoToken: auth?.mottoToken,\n hasAds: !!imaConfig?.adTagUrl,\n hasSystem73: !!system73Config?.apiKey,\n apiToken: auth?.apiToken\n });\n\n const { \n initializeMux, \n updateMuxData, \n handleMuxError, \n destroyMux \n } = useMuxAnalytics(playerRef, muxConfig, events?.onMuxReady, events?.onMuxDataUpdate);\n\n const { \n getAvailableQualities, \n setQuality, \n setupQualityTracking, \n configureQuality \n } = useQualityControl(playerRef, qualityConfig, events?.onQualityChange);\n\n const { \n skipBack, \n skipForward, \n skipDuration, \n shouldShowSkipControls \n } = useSkipControls(videoRef, events?.onSkipBack, events?.onSkipForward);\n\n // Keyboard controls for desktop (arrow keys + spacebar)\n useKeyboardControls(videoRef, {\n skipBack,\n skipForward,\n enabled: true\n });\n\n const { setupEventListeners, cleanupEventListeners } = useEventHandlers(videoRef, playerRef, {\n onPlay: events?.onPlay,\n onPause: events?.onPause,\n onEnded: events?.onEnded,\n onLoadStart: events?.onLoadStart,\n onCanPlay: events?.onCanPlay,\n onTimeUpdate: events?.onTimeUpdate\n });\n\n const { uiRef, initializeUI, destroyUI } = useShakaUI(\n playerRef,\n containerRef,\n videoRef,\n controls,\n chromecastConfig,\n seekbarConfig,\n events?.onSkipBack,\n events?.onSkipForward,\n iconSizes,\n locale\n );\n\n // Live indicator hook\n const { getLiveStatus, seekToLiveEdge } = useLiveIndicator(containerRef, playerRef, {\n enabled: true,\n indicatorColor: '#ff0000',\n indicatorSize: 8,\n showPulseAnimation: true,\n liveThresholdSeconds,\n onLiveStatusChange: events?.onLiveStatusChange\n });\n\n // Ad events hook\n const { setupAdEventListeners, cleanupAdEventListeners } = useAdEvents(playerRef, {\n onAdStart: events?.onAdStart,\n onAdComplete: events?.onAdComplete,\n onAdError: events?.onAdError,\n onAdSkipped: events?.onAdSkipped,\n onAdPaused: events?.onAdPaused,\n onAdResumed: events?.onAdResumed,\n onAdProgress: events?.onAdProgress,\n onAllAdsCompleted: events?.onAllAdsCompleted\n });\n\n // System73 wrapper initialization\n const initializeSystem73 = useCallback((playerConfig: any) => {\n if (!system73Config?.apiKey || !window.S73ShakaPlayerWrapper) {\n return null;\n }\n\n console.log('Initializing System73 SDK...');\n \n try {\n // Create System73 wrapper using the API key from props\n const s73Config = {\n apiKey: system73Config.apiKey,\n contentSteeringEndpoint: system73Config.contentSteeringEndpoint,\n channelId: system73Config.channelId\n };\n\n const wrapper = window.S73ShakaPlayerWrapper(s73Config, { shaka });\n wrapper.wrapPlayerConfig(playerConfig);\n \n console.log('System73 SDK initialized with config:', s73Config);\n return wrapper;\n \n } catch (error) {\n console.error('Error initializing System73 SDK:', error);\n return null;\n }\n }, [system73Config]);\n\n // Initialize ads using proper Shaka UI ad container - following official docs\n const initializeAds = useCallback(async () => {\n if (!imaConfig?.adTagUrl || !playerRef.current || !videoRef.current || !uiRef.current) {\n return;\n }\n\n // Double-check that google.ima is available\n if (!window.google?.ima) {\n console.error('Google IMA SDK not available when trying to initialize ads');\n return;\n }\n \n try {\n const player = playerRef.current;\n const video = videoRef.current;\n const ui = uiRef.current;\n \n // Get the proper ad container from Shaka UI controls - as per official docs\n const controls = ui.getControls();\n const container = controls.getClientSideAdContainer();\n \n const adManager = player.getAdManager();\n if (!adManager) {\n console.error('Ad manager not available');\n return;\n }\n\n // Get google reference\n const google = window.google;\n \n // Configure ads rendering settings for autoplay if needed\n let adsRenderingSettings = null;\n if (imaConfig.adsRenderingSettings) {\n adsRenderingSettings = imaConfig.adsRenderingSettings;\n } else if (autoPlay) {\n // Create default settings optimized for autoplay\n adsRenderingSettings = new (google.ima as any).AdsRenderingSettings();\n adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n }\n \n // Initialize client-side ads with proper container and settings\n adManager.initClientSide(container, video, adsRenderingSettings);\n \n // Request ads (this starts the async VAST fetch)\n const adsRequest = new google.ima.AdsRequest();\n adsRequest.adTagUrl = imaConfig.adTagUrl;\n adManager.requestClientSideAds(adsRequest);\n \n // Setup detailed ad event listeners\n setupAdEventListeners();\n \n // Wait to allow VAST to load before loading manifest\n // This ensures the ad request starts before video content loads\n await new Promise(resolve => setTimeout(resolve, 1000));\n \n // Load the manifest - IMA will intercept playback for preroll ads\n await loadManifest();\n \n } catch (error) {\n console.error('Error initializing ads:', error);\n }\n }, [imaConfig, autoPlay, setupAdEventListeners, loadManifest]);\n\n // Load required scripts first\n useEffect(() => {\n const loadRequiredScripts = async () => {\n try {\n const scriptLoaders = getRequiredScriptLoaders(!!imaConfig?.adTagUrl, !!system73Config?.apiKey);\n await loadScripts(scriptLoaders);\n \n // Wait for global variables to be available\n const globalsToWait = [];\n if (imaConfig?.adTagUrl) {\n globalsToWait.push('google');\n }\n if (system73Config?.apiKey) {\n globalsToWait.push('S73ShakaPlayerWrapper');\n }\n \n if (globalsToWait.length > 0) {\n await waitForGlobals(globalsToWait);\n }\n \n setIsScriptsLoaded(true);\n } catch (error) {\n console.error('Error loading required scripts:', error);\n // Set as loaded anyway to prevent blocking, but log the error\n setIsScriptsLoaded(true);\n }\n };\n\n loadRequiredScripts();\n }, [imaConfig?.adTagUrl, system73Config?.apiKey]);\n\n // Reinitialize on back/forward cache restore without double-initializing on first load\n useEffect(() => {\n const onPageShow = (e: any) => {\n if (e && e.persisted) {\n setBfResetKey((k) => k + 1);\n }\n };\n window.addEventListener('pageshow', onPageShow);\n return () => window.removeEventListener('pageshow', onPageShow);\n }, []);\n\n // Main initialization - only runs after scripts are loaded\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !isScriptsLoaded) return;\n\n const initialize = async () => {\n try {\n console.log('🚀 [Player] Starting initialization...');\n \n // Reset initial loading state on (re)initialize\n setIsInitialLoading(true);\n\n // Initialize System73 wrapper first if configured\n let system73Wrapper = null;\n if (system73Config?.apiKey && window.S73ShakaPlayerWrapper) {\n console.log('📦 [System73] Step 1: Initializing System73 wrapper with config');\n // Create a copy of shakaConfig to avoid modifying the original\n const playerConfig = { ...shakaConfig };\n system73Wrapper = initializeSystem73(playerConfig);\n \n // If System73 wrapper was created successfully, update shakaConfig\n if (system73Wrapper) {\n // The wrapper has already modified the playerConfig\n shakaConfig = playerConfig;\n console.log('✅ [System73] Step 1 complete: Wrapper created and config modified');\n }\n }\n\n console.log('🎬 [Shaka] Step 2: Initializing Shaka Player (auto-load:', !system73Config?.apiKey && !imaConfig?.adTagUrl, ')');\n // Initialize player (will skip auto-load if System73 or ads are configured)\n await initializePlayer(video);\n console.log('✅ [Shaka] Step 2 complete: Player initialized');\n \n // Wrap the player with System73 after initialization\n if (system73Wrapper && playerRef.current) {\n console.log('🔗 [System73] Step 3: Wrapping Shaka player with System73');\n system73Wrapper.wrapPlayer(playerRef.current);\n console.log('✅ [System73] Step 3 complete: Player wrapped');\n \n // Only load the manifest here if we don't have ads\n // (ads will handle manifest loading after VAST fetch)\n if (!imaConfig?.adTagUrl) {\n console.log('📺 [System73] Step 4: Loading manifest');\n await loadManifest();\n console.log('✅ [System73] Step 4 complete: Manifest loaded');\n } else {\n console.log('⏭️ [System73] Skipping manifest load - ads will handle it');\n }\n }\n \n console.log('📋 [Player] Setting up event listeners and quality tracking');\n // Setup event listeners\n setupEventListeners();\n \n // Setup quality tracking\n const cleanupQuality = setupQualityTracking();\n \n // Configure quality settings\n configureQuality();\n \n console.log('🎨 [UI] Initializing Shaka UI');\n // Initialize UI\n await initializeUI();\n console.log('✅ [UI] UI initialized');\n \n // Initialize ads after UI is ready (ads will load manifest after VAST loads)\n if (imaConfig?.adTagUrl && window.google?.ima) {\n console.log('📢 [Ads] Initializing ads (will load manifest after VAST fetch)');\n await initializeAds();\n console.log('✅ [Ads] Ads initialized and manifest loaded');\n }\n\n console.log('✨ [Player] Initialization complete!');\n } catch (error) {\n console.error('❌ [Player] Error during initialization:', error);\n handleMuxError(error);\n }\n };\n\n initialize();\n\n // Cleanup function\n return () => {\n cleanupEventListeners();\n cleanupAdEventListeners();\n destroyUI();\n destroyMux();\n destroyPlayer();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [managedMode ? hasPlaylist : src, isScriptsLoaded, bfResetKey, managedMode]);\n\n // Manage initial loading spinner using media events (attach once)\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const onLoadStart = () => {\n setIsInitialLoading(true);\n };\n const onCanPlay = () => {\n setIsInitialLoading(false);\n };\n const onPlaying = () => {\n setIsInitialLoading(false);\n };\n\n video.addEventListener('loadstart', onLoadStart);\n video.addEventListener('canplay', onCanPlay);\n video.addEventListener('playing', onPlaying);\n\n return () => {\n video.removeEventListener('loadstart', onLoadStart);\n video.removeEventListener('canplay', onCanPlay);\n video.removeEventListener('playing', onPlaying);\n };\n }, []);\n\n // Update video properties when they change\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.autoplay = autoPlay;\n video.loop = loop;\n video.controls = false; // Always disable native controls since we use Shaka UI\n if (poster) video.poster = poster;\n }, [autoPlay, loop, muted, poster, imaConfig?.adTagUrl]);\n\n // Additional safeguard to ensure native controls are always disabled\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n \n // Aggressively disable native controls to prevent overlapping with Shaka UI\n video.controls = false;\n video.setAttribute('controls', 'false');\n \n // Remove the controls attribute completely\n video.removeAttribute('controls');\n \n // Set up a MutationObserver to watch for the controls attribute being added back\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes' && mutation.attributeName === 'controls') {\n // If controls attribute is added back, immediately remove it\n if (video.hasAttribute('controls')) {\n video.removeAttribute('controls');\n video.controls = false;\n }\n }\n });\n });\n \n // Start observing\n observer.observe(video, {\n attributes: true,\n attributeFilter: ['controls']\n });\n \n // Cleanup function\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n ...videoRef.current!,\n // Custom methods for quality control\n getAvailableQualities,\n setQuality,\n // Skip methods\n skipBack,\n skipForward,\n // Mux methods\n updateMuxData,\n // Live status methods\n getLiveStatus,\n seekToLiveEdge,\n // Access to underlying instances\n getPlayer: () => playerRef.current,\n getMuxMonitor: () => null\n }), [getAvailableQualities, setQuality, skipBack, skipForward, updateMuxData, getLiveStatus, seekToLiveEdge]);\n\n // Determine if we're using responsive sizing\n const isResponsive = !width && !height;\n \n // Container classes for responsive or fixed sizing\n const containerClasses = twMerge(containerClassName, 'motto-video-container relative bg-[#111111] ');\n \n // Container styles - handle both responsive and fixed sizing\n const containerStyle: React.CSSProperties = isResponsive \n ? { \n aspectRatio: aspectRatio.toString(),\n }\n : { width, height };\n\n // Video classes for responsive or fixed sizing \n const videoClasses = isResponsive\n ? 'motto-video-responsive w-full'\n : 'w-full h-full ';\n \n // Video styles for fixed sizing\n const videoStyle: React.CSSProperties = isResponsive\n ? {}\n : { width, height };\n\n // Filter out controls prop to prevent conflicts with native HTML5 controls\n const filteredVideoProps = { ...videoProps };\n delete (filteredVideoProps as any).controls;\n\n return (\n <div \n ref={containerRef}\n className={containerClasses}\n style={containerStyle}\n >\n <video\n ref={videoRef}\n className={videoClasses}\n width={isResponsive ? undefined : width}\n height={isResponsive ? undefined : height}\n style={videoStyle}\n controls={false}\n playsInline={true}\n {...filteredVideoProps}\n />\n\n {isInitialLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center z-20 pointer-events-none\">\n <Loading className=\"bg-transparent\" />\n </div>\n )}\n </div>\n );\n }\n);\n\nPlayer.displayName = 'Player'; ","import { useRef, useCallback, useState } from 'react';\nimport shaka from 'shaka-player/dist/shaka-player.ui';\nimport { isAppleDevice, isPlayReadySupported, supportsWidevinePersistentLicenses } from '../utils/devices';\nimport { Playlist } from '../api';\nimport { MuxAnalyticsConfig } from '../types';\nimport initShakaPlayerMux from '@mux/mux-data-shakaplayer';\nimport { version } from '../../package.json';\nimport {\n PersistentSessionMetadata,\n storePersistentLicense,\n retrievePersistentLicense,\n clearAllPersistentLicenses\n} from '../utils/licenseCache';\n\n\n\ninterface DRMConfig {\n clearKeys?: { [keyId: string]: string };\n servers?: { [keySystem: string]: string };\n}\n\ninterface UseShakaPlayerProps {\n src: Playlist | string;\n shakaConfig?: any;\n drmConfig?: DRMConfig;\n onError?: (error: Error) => void;\n onPlayerReady?: (player: any) => void;\n muxConfig?: MuxAnalyticsConfig;\n onMuxReady?: () => void;\n onMuxDataUpdate?: (data: any) => void;\n publicKey?: string;\n mottoToken?: string;\n hasAds?: boolean;\n hasSystem73?: boolean;\n apiToken?: string;\n}\n\n// Helper to normalize src to a Playlist-like object\nconst normalizeSource = (src: Playlist | string): Playlist => {\n if (typeof src === 'string') {\n return {\n id: '',\n url: src,\n format: 'auto',\n drm: {}\n } as Playlist;\n }\n return src;\n};\n\nexport const useShakaPlayer = ({\n src,\n shakaConfig,\n drmConfig,\n onError,\n onPlayerReady,\n muxConfig,\n onMuxReady,\n onMuxDataUpdate,\n publicKey,\n mottoToken,\n hasAds = false,\n hasSystem73 = false,\n apiToken\n}: UseShakaPlayerProps) => {\n const playerRef = useRef<any>(null);\n const [isRetrying, setIsRetrying] = useState(false);\n const videoElementRef = useRef<HTMLVideoElement | null>(null);\n\n // Lifecycle coordination to prevent init/destroy races\n const destroyInProgressRef = useRef<Promise<void> | null>(null);\n const isDestroyingRef = useRef<boolean>(false);\n const initSequenceRef = useRef<number>(0);\n const activeInitIdRef = useRef<number | null>(null);\n\n /* DRM related state */\n const waitingForKeyTimerRef = useRef<number | null>(null);\n const waitingForKeyHandlerRef = useRef<((e: Event) => void) | null>(null);\n const playbackResumedHandlerRef = useRef<((e: Event) => void) | null>(null);\n const usingPersistentLicenseRef = useRef<boolean>(false);\n const storedPersistentThisLoadRef = useRef<boolean>(false);\n const drmExpirationHandlerRef = useRef<((e: Event) => void) | null>(null);\n\n // Helper function to determine the correct manifest URL based on DRM support\n const getManifestUrl = useCallback(() => {\n const playlistSrc = normalizeSource(src);\n let manifestUrl = playlistSrc.url;\n const isDRM = Boolean(playlistSrc.drm?.widevine || playlistSrc.drm?.fairplay || playlistSrc.drm?.playready);\n\n if (isDRM) {\n const isPlayReady = isPlayReadySupported();\n if(isAppleDevice() && playlistSrc.drm?.fairplay?.certificateUrl) {\n manifestUrl = playlistSrc.drm.fairplay.playlistUrl;\n } else if(isPlayReady && playlistSrc.drm?.playready?.licenseUrl) {\n manifestUrl = playlistSrc.drm.playready.playlistUrl;\n } else {\n manifestUrl = playlistSrc.drm?.widevine?.playlistUrl || \"\";\n }\n }\n\n return manifestUrl;\n }, [src]);\n\n // Internal function to handle the actual player initialization logic\n const initializePlayerInternal = useCallback(async (video: HTMLVideoElement) => {\n try {\n // Serialize with any pending destroy to avoid MediaSource races\n if (destroyInProgressRef.current) {\n try {\n await destroyInProgressRef.current;\n } catch {\n // Ignore destroy errors here; we'll proceed with a clean init\n }\n }\n\n const myInitId = ++initSequenceRef.current;\n activeInitIdRef.current = myInitId;\n\n // Store video element reference for retry functionality\n videoElementRef.current = video;\n // Install polyfills\n shaka.polyfill.installAll();\n\n // Check for browser support\n if (!shaka.Player.isBrowserSupported()) {\n throw new Error('Browser not supported by Shaka Player');\n }\n \n // If a destroy was requested meanwhile, abort early\n if (isDestroyingRef.current) {\n return;\n }\n\n // Create player instance first, then attach the video element.\n const player = new (shaka.Player as any)();\n playerRef.current = player;\n\n // Attach to the video element (recommended approach since Shaka v4).\n await (player as any).attach(video);\n\n // Configure default settings for expanding DVR window in live streams\n // This ensures the DVR window grows from the origin rather than sliding forward\n const defaultConfig = {\n manifest: {\n // Override availability window to allow DVR window to grow from start\n // Set to a very large value (24 hours in seconds) to effectively allow unlimited growth\n availabilityWindowOverride: 86400, // 24 hours in seconds\n },\n streaming: {\n // Allow seeking to any point within the availability window\n safeSeekOffset: 5, // 5 seconds from live edge to prevent buffering\n // Increase tolerance for manifest timing inaccuracies in live streams\n inaccurateManifestTolerance: 2,\n }\n };\n\n // Apply default config first\n player.configure(defaultConfig);\n\n // Configure player with user-provided config (can override defaults)\n if (shakaConfig) {\n player.configure(shakaConfig);\n }\n \n const playlistSrc = normalizeSource(src);\n const manifestUrl = getManifestUrl();\n let playlistId = playlistSrc.id;\n const isDRM = Boolean(playlistSrc.drm?.widevine || playlistSrc.drm?.fairplay || playlistSrc.drm?.playready);\n\n // Reset per-load storage guard\n storedPersistentThisLoadRef.current = false;\n\n // If init was superseded, tear down the created player and exit\n if (activeInitIdRef.current !== myInitId || isDestroyingRef.current) {\n try { await player.destroy(); } catch {}\n if (playerRef.current === player) playerRef.current = null;\n return;\n }\n\n // Handle persistent licenses for DRM content\n let storedSessionsMetadata: PersistentSessionMetadata[] = [];\n if (isDRM && playlistId) {\n storedSessionsMetadata = retrievePersistentLicense(playlistId, playlistSrc.drm?.licenseCacheKey ?? \"\");\n }\n\n if (isDRM) {\n const drmConfig: any = {\n servers: {\n 'com.widevine.alpha': playlistSrc.drm?.widevine?.licenseUrl,\n 'com.microsoft.playready': playlistSrc.drm?.playready?.licenseUrl,\n 'com.apple.fps': playlistSrc.drm?.fairplay?.licenseUrl,\n },\n keySystemsMapping: {\n // Fall back or reroute to the platform's recommended PlayReady CDM if needed\n 'com.microsoft.playready': 'com.microsoft.playready.recommendation'\n },\n ...(playlistSrc.drm?.fairplay && {\n advanced: {\n 'com.apple.fps': {\n serverCertificateUri: playlistSrc.drm.fairplay.certificateUrl,\n }\n }\n })\n };\n\n drmConfig.advanced = {\n ...drmConfig.advanced,\n 'com.widevine.alpha': {\n ...drmConfig.advanced?.['com.widevine.alpha'],\n sessionType: supportsWidevinePersistentLicenses() ? 'persistent-license' : 'temporary'\n },\n 'com.microsoft.playready': {\n ...drmConfig.advanced?.['com.microsoft.playready'],\n sessionType: 'persistent-license' // PlayReady seems to always require persistent-license (temporary won't work, not compatible with license server response)\n },\n 'com.apple.fps': {\n ...drmConfig.advanced?.['com.apple.fps'],\n sessionType: 'temporary' // FairPlay always uses temporary sessions - Safari won't play with persistent-license\n }\n };\n\n // Configure persistent session settings if we have stored sessions\n if (storedSessionsMetadata.length > 0) {\n drmConfig.persistentSessionOnlinePlayback = true;\n drmConfig.persistentSessionsMetadata = storedSessionsMetadata.map(session => ({\n sessionId: session.sessionId,\n initData: new Uint8Array(session.initData),\n initDataType: session.initDataType\n }));\n }\n\n usingPersistentLicenseRef.current = storedSessionsMetadata.length > 0;\n\n player.configure({ drm: drmConfig });\n\n // Detect situations where the browser is waiting for a decryption key but none becomes usable\n // This can happen when a persisted license is invalid/stale. We listen for 'waitingforkey'\n // and, if playback does not resume shortly, clear cached licenses and reload.\n const clearWaitingForKeyTimer = () => {\n if (waitingForKeyTimerRef.current !== null) {\n window.clearTimeout(waitingForKeyTimerRef.current);\n waitingForKeyTimerRef.current = null;\n }\n };\n\n const onPlaybackResumed = () => {\n clearWaitingForKeyTimer();\n };\n\n const onWaitingForKey = () => {\n // Only attempt recovery when we intentionally tried to use a cached persistent license\n if (!usingPersistentLicenseRef.current) return;\n // Avoid stacking multiple timers or looping retries\n if (isRetrying) return;\n clearWaitingForKeyTimer();\n\n // Give the player a short window to provide/refresh keys normally\n waitingForKeyTimerRef.current = window.setTimeout(async () => {\n try {\n if (isRetrying) return;\n\n // If we are still stuck without keys, clear cached persistent licenses and retry\n console.warn('Stuck waiting for decryption key; attempting license cache reset and reload...');\n const clearedCount = clearAllPersistentLicenses();\n\n if (clearedCount > 0 && playerRef.current) {\n setIsRetrying(true);\n await playerRef.current.load(getManifestUrl());\n console.log('Reloaded manifest after clearing cached licenses');\n } else {\n console.warn('No cached licenses found to clear, skipping reload');\n }\n } catch (e) {\n console.error('Failed during recovery from waitingforkey state:', e);\n onError?.(e as Error);\n } finally {\n setIsRetrying(false);\n clearWaitingForKeyTimer();\n }\n }, 3000);\n };\n\n // Attach listeners to the video element\n try {\n (video as any).addEventListener('waitingforkey', onWaitingForKey as any);\n video.addEventListener('playing', onPlaybackResumed);\n video.addEventListener('ended', onPlaybackResumed);\n video.addEventListener('pause', onPlaybackResumed);\n waitingForKeyHandlerRef.current = onWaitingForKey;\n playbackResumedHandlerRef.current = onPlaybackResumed;\n } catch (e) {\n console.warn('Failed to attach waitingforkey/playback listeners:', e);\n }\n\n // Register request filter for DRM token\n const netEngine = player.getNetworkingEngine();\n if (netEngine) {\n netEngine.registerRequestFilter((type: any, request: any) => {\n switch (type) {\n case (shaka as any).net.NetworkingEngine.RequestType.LICENSE:\n if (publicKey) {\n request.headers[\"authorization\"] = `Bearer ${publicKey}`;\n }\n if (mottoToken) {\n request.headers[\"x-motto-token\"] = mottoToken;\n }\n break;\n case (shaka as any).net.NetworkingEngine.RequestType.MANIFEST:\n case (shaka as any).net.NetworkingEngine.RequestType.SEGMENT:\n // Allow cross-site credentials so that cookies can be set from the manifest to the segments for JWT validation\n request.allowCrossSiteCredentials = true\n break;\n }\n });\n\n // Register response filter for FairPlay base64 decoding\n netEngine.registerResponseFilter((type: any, response: any) => {\n if (type === (shaka as any).net.NetworkingEngine.RequestType.LICENSE) {\n const ks = player.keySystem && player.keySystem();\n if (ks === 'com.apple.fps') {\n const responseText = (shaka as any).util.StringUtils.fromUTF8(response.data);\n response.data = (shaka as any).util.Uint8ArrayUtils.fromBase64(responseText).buffer;\n }\n }\n });\n }\n }\n\n // Register apiToken authorization header for manifest requests (works for both DRM and non-DRM content)\n if (apiToken) {\n const netEngine = player.getNetworkingEngine();\n if (netEngine) {\n netEngine.registerRequestFilter((type: any, request: any) => {\n if (type === (shaka as any).net.NetworkingEngine.RequestType.MANIFEST) {\n request.headers[\"authorization\"] = `Bearer ${apiToken}`;\n }\n });\n }\n }\n\n // Persist licenses after Shaka signals license expiration updates, which occur\n // only after successful license acquisition/refresh. This avoids caching on errors\n // or during the initial clear (unencrypted) segment playback.\n if (isDRM && playlistId) {\n const onDRMSessionUpdate = () => {\n try {\n if (storedPersistentThisLoadRef.current) return;\n const activeDrmSessions = player.getActiveSessionsMetadata?.();\n if (!activeDrmSessions) return;\n\n const persistentSessions = activeDrmSessions.filter(\n (session: any) => session.sessionType === 'persistent-license'\n );\n\n if (persistentSessions.length > 0) {\n const sessionsToStore: PersistentSessionMetadata[] = persistentSessions.map((session: any) => ({\n sessionId: session.sessionId,\n initData: session.initData,\n initDataType: session.initDataType,\n keySystem: session.keySystem || 'com.widevine.alpha'\n }));\n storePersistentLicense(playlistId, playlistSrc.drm?.licenseCacheKey ?? \"\", sessionsToStore);\n storedPersistentThisLoadRef.current = true;\n }\n } catch (e) {\n console.warn('Failed to persist licenses on expiration update:', e);\n }\n };\n\n try {\n player.addEventListener('drmsessionupdate', onDRMSessionUpdate as any);\n drmExpirationHandlerRef.current = onDRMSessionUpdate as any;\n } catch (e) {\n console.warn('Failed to attach drmsessionupdate listener:', e);\n }\n }\n // Set up error handling\n player?.addEventListener('error', (event: any) => {\n const error = event.detail;\n\n // Ignore Shaka's LOAD_INTERRUPTED (code 7000) since it indicates a\n // benign race between load/unload calls when the source changes.\n if (error?.code === 7000) {\n return;\n }\n\n // Check if error code is in the 6000-6999 range (DRM-related errors)\n // and trigger license clearing and retry\n if (error?.code >= 6000 && error?.code < 7000 && !isRetrying && videoElementRef.current) {\n console.warn(`DRM error detected (code: ${error.code}), checking for cached licenses...`);\n \n // Clear all cached licenses and check if any were actually cleared\n const clearedCount = clearAllPersistentLicenses();\n \n // Only retry if we actually cleared some licenses\n if (clearedCount > 0) {\n console.warn(`Cleared ${clearedCount} cached licenses, retrying...`);\n setIsRetrying(true);\n \n // Use setTimeout to avoid blocking and allow the error to be processed\n setTimeout(async () => {\n try {\n // Get the video element and current manifest URL\n const video = videoElementRef.current;\n const currentPlayer = playerRef.current;\n \n if (video && currentPlayer) {\n console.log('Reloading manifest after license cache clear...');\n \n // Simply reload the manifest with the current player instance\n // This will trigger new license requests without the cached licenses\n await currentPlayer.load(getManifestUrl());\n \n console.log('Manifest reloaded successfully');\n }\n } catch (retryError) {\n console.error('Failed to retry after license clear:', retryError);\n onError?.(retryError as Error);\n } finally {\n setIsRetrying(false);\n }\n }, 500); // Give a bit more time for the error to be processed\n return;\n } else {\n console.warn(`No cached licenses found to clear for error code ${error.code}, not retrying to avoid infinite loop`);\n }\n }\n\n console.error('Shaka Player Error:', error);\n onError?.(new Error(`Shaka Player Error: ${error.message || 'Unknown error'}`));\n });\n\n // Initialize Mux BEFORE loading so it can hook into networking engine\n if (muxConfig) {\n try {\n const playerInitTime = initShakaPlayerMux.utils.now();\n \n const muxOptions = {\n debug: muxConfig.debug || false,\n disableCookies: muxConfig.disableCookies || false,\n respectDoNotTrack: muxConfig.respectDoNotTrack || false,\n automaticErrorTracking: muxConfig.automaticErrorTracking !== false,\n ...(muxConfig.beaconCollectionDomain && { beaconCollectionDomain: muxConfig.beaconCollectionDomain }),\n ...(muxConfig.errorTranslator && { errorTranslator: muxConfig.errorTranslator }),\n data: {\n env_key: muxConfig.envKey,\n player_name: muxConfig?.metadata?.player_name,\n player_version: version,\n player_init_time: playerInitTime,\n video_title: muxConfig?.metadata?.video_title ?? \"\",\n video_id: muxConfig?.metadata?.video_id ?? \"\",\n viewer_user_id: muxConfig?.metadata?.viewer_user_id ?? \"\",\n ...muxConfig.metadata,\n }\n };\n\n initShakaPlayerMux(player, muxOptions, shaka);\n onMuxReady?.();\n } catch (error) {\n console.error('Failed to initialize Mux Analytics:', error);\n }\n }\n \n // Load the manifest only if we don't have ads (ads will trigger load after they're set up)\n // Final guard before load to avoid racing with teardown\n if (activeInitIdRef.current !== myInitId || isDestroyingRef.current) {\n try { await player.destroy(); } catch {}\n if (playerRef.current === player) playerRef.current = null;\n return;\n }\n \n // Skip loading if we have ads or System73 - they need to be initialized first\n if (!hasAds && !hasSystem73) {\n console.log('📺 [Shaka] Auto-loading manifest:', manifestUrl);\n await player.load(manifestUrl);\n console.log('✅ [Shaka] Manifest auto-loaded successfully');\n } else {\n console.log('⏭️ [Shaka] Skipping auto-load (hasAds:', hasAds, ', hasSystem73:', hasSystem73, ')');\n }\n \n onPlayerReady?.(player);\n\n return player;\n } catch (error) {\n // Filter out benign load interruptions that occur when the component\n // switches source before the previous load completes.\n if ((error as any)?.code === 7000) {\n return;\n }\n\n console.error('Error initializing Shaka Player:', error);\n onError?.(error as Error);\n throw error;\n }\n }, [shakaConfig, drmConfig, src, onError, onPlayerReady, muxConfig, onMuxReady, isRetrying, getManifestUrl, apiToken]);\n\n // Public initializePlayer function that components will use\n const initializePlayer = useCallback(async (video: HTMLVideoElement) => {\n return initializePlayerInternal(video);\n }, [initializePlayerInternal]);\n\n // Public method to load the manifest after ads are set up\n const loadManifest = useCallback(async () => {\n const player = playerRef.current;\n if (!player) {\n console.warn('⚠️ [Shaka] Cannot load manifest: player not initialized');\n return;\n }\n\n try {\n const manifestUrl = getManifestUrl();\n console.log('📺 [Shaka] Loading manifest:', manifestUrl);\n await player.load(manifestUrl);\n console.log('✅ [Shaka] Manifest loaded successfully');\n } catch (error) {\n // Filter out benign load interruptions\n if ((error as any)?.code === 7000) {\n return;\n }\n console.error('❌ [Shaka] Error loading manifest:', error);\n onError?.(error as Error);\n throw error;\n }\n }, [getManifestUrl, onError]);\n\n const destroyPlayer = useCallback(async () => {\n const playerInstance = playerRef.current;\n if (playerInstance) {\n try {\n isDestroyingRef.current = true;\n activeInitIdRef.current = null;\n // Clean up video element listeners and timers\n if (videoElementRef.current) {\n try {\n if (waitingForKeyHandlerRef.current) {\n (videoElementRef.current as any).removeEventListener('waitingforkey', waitingForKeyHandlerRef.current as any);\n }\n if (playbackResumedHandlerRef.current) {\n videoElementRef.current.removeEventListener('playing', playbackResumedHandlerRef.current);\n videoElementRef.current.removeEventListener('ended', playbackResumedHandlerRef.current);\n videoElementRef.current.removeEventListener('pause', playbackResumedHandlerRef.current);\n }\n } catch (e) {\n console.warn('Error removing media event listeners:', e);\n }\n }\n if (waitingForKeyTimerRef.current !== null) {\n window.clearTimeout(waitingForKeyTimerRef.current);\n waitingForKeyTimerRef.current = null;\n }\n\n // Clean up DRM-related player listeners\n try {\n if (drmExpirationHandlerRef.current && playerInstance.removeEventListener) {\n playerInstance.removeEventListener('drmsessionupdate', drmExpirationHandlerRef.current as any);\n }\n } catch (e) {\n console.warn('Error removing DRM expiration listener:', e);\n } finally {\n drmExpirationHandlerRef.current = null;\n }\n // Ensure only one destroy runs and let init await it\n const performDestroy = async () => {\n try {\n await playerInstance.destroy();\n } finally {\n // After Shaka teardown, also clear the HTMLVideoElement src to drop any object URL\n try {\n if (videoElementRef.current) {\n videoElementRef.current.removeAttribute('src');\n // Calling load() ensures the element releases previous MediaSource eagerly\n videoElementRef.current.load();\n }\n } catch {}\n }\n };\n destroyInProgressRef.current = performDestroy();\n await destroyInProgressRef.current;\n } catch (error) {\n console.warn('Error destroying Shaka Player:', error);\n } finally {\n if (playerRef.current === playerInstance) {\n playerRef.current = null;\n }\n storedPersistentThisLoadRef.current = false;\n isDestroyingRef.current = false;\n destroyInProgressRef.current = null;\n }\n }\n }, [playerRef]);\n\n return {\n playerRef,\n initializePlayer,\n loadManifest,\n destroyPlayer,\n isRetrying\n };\n}; ","export const isAppleDevice = () => {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const isIOS = /iPad|iPhone|iPod/.test(ua) || (navigator.platform === 'MacIntel' && (navigator as any).maxTouchPoints > 1);\n const isSafari = /Safari/.test(ua) && !/Chrome|CriOS|FxiOS|Edg/.test(ua);\n const isMacSafari = /Macintosh/.test(ua) && isSafari;\n return isIOS || isMacSafari;\n};\n\nexport const isPlayReadySupported = (): boolean => {\n // Check if we're in a browser environment\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n return false;\n }\n\n // Check if EME API is supported\n if (!navigator.requestMediaKeySystemAccess) {\n return false;\n }\n\n // Check if we're on a browser that actually supports PlayReady\n const userAgent = navigator.userAgent || '';\n const isXbox = /Xbox/.test(userAgent);\n const isEdge = /Edg/.test(userAgent);\n const isIE = /Trident|MSIE/.test(userAgent);\n const isWindows = /Windows/.test(userAgent);\n \n // PlayReady is only supported on Windows with Microsoft browsers or Xbox\n // Edge on macOS does NOT support PlayReady, only Edge on Windows does\n // Chrome on any platform uses Widevine, not PlayReady\n return isXbox || ((isEdge || isIE) && isWindows);\n};\n\n/**\n * Detects if the current browser is Chrome 64+ on macOS, Windows.\n * Persistent license caching for Widevine only works on these specific browsers\n * @returns true if Chrome 64+ on macOS/Windows/Android, false otherwise\n *\n * IMPORTANT UPDATE: Temporarily disabled everywhere, since there are some issues with persistent licenses on web.\n * Specifically, sometimes the page needs to be reloaded multiple times before playback works.\n * We don't know why yet, and have no time to investigate.\n */\nexport const supportsWidevinePersistentLicenses = (): boolean => {\n // TODO: Re-enable once issues are resolved\n return false;\n\n // Check if we're in a browser environment\n if (typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent || '';\n \n // Check if it's Chrome (not Chromium-based browsers like Edge)\n const isChromeMatch = userAgent.match(/Chrome\\/(\\d+)/);\n if (!isChromeMatch) {\n return false;\n }\n \n // Make sure it's not Edge, Opera, or other Chromium-based browsers\n if (/Edg|OPR|Opera/.test(userAgent)) {\n return false;\n }\n \n // Extract Chrome version\n const chromeVersion = parseInt(isChromeMatch[1], 10);\n if (chromeVersion < 64) {\n return false;\n }\n \n // Check if it's macOS, Windows, or Android\n const isMacOS = /Mac OS X|Macintosh/.test(userAgent);\n const isWindows = /Windows/.test(userAgent);\n\n // Tested on Android, with mixed results. Sometimes it works, sometimes it doesn't.\n\n return isMacOS || isWindows;\n};","{\n \"name\": \"@mottosports/motto-video-player\",\n \"version\": \"1.0.1-rc.82\",\n \"description\": \"React video player component for the Motto platform, powered by Shaka Player\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"NODE_ENV=development tsup --watch\",\n \"dev:hot\": \"NODE_ENV=development tsup --watch --onSuccess \\\"echo 'Hot reload ready! Package rebuilt successfully.'\\\"\",\n \"clean\": \"rm -rf dist\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"keywords\": [\n \"video\",\n \"player\",\n \"react\",\n \"component\",\n \"motto\",\n \"shaka\",\n \"adaptive-streaming\",\n \"dash\",\n \"hls\",\n \"drm\"\n ],\n \"author\": \"Motto UI Components\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@mux/mux-data-shakaplayer\": \"^5.14.7\",\n \"@tanstack/react-query\": \"^5.80.3\",\n \"shaka-player\": \"^4.16.0\",\n \"tailwind-merge\": \"^3.3.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.29\",\n \"@types/react\": \"^18.2.79\",\n \"@types/react-dom\": \"^19.1.5\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.0\",\n \"react-dom\": \">=16.8.0\",\n \"tailwindcss\": \">=3.0.0\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/motto-ui-components/motto-players.git\",\n \"directory\": \"packages/motto-video-player\"\n },\n \"homepage\": \"https://github.com/motto-ui-components/motto-players#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/motto-ui-components/motto-players/issues\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","// Persistent license storage utilities with LRU eviction for quota management\n\nexport interface PersistentSessionMetadata {\n sessionId: string;\n initData: ArrayBuffer;\n initDataType: string;\n keySystem: string;\n}\n\nexport interface StoredSessionData {\n sessionId: string;\n initData: string; // Base64 encoded\n initDataType: string;\n keySystem: string;\n timestamp: number;\n}\n\ninterface LicenseCacheEntry {\n key: string;\n data: StoredSessionData[];\n}\n\nconst PERSISTENT_LICENSE_PREFIX = 'motto_lic_';\nconst LICENSE_EXPIRY_MS = 2 * 60 * 60 * 1000; // 2 hours\nconst LICENSE_MAX_RETRY_ATTEMPTS = 10; // Maximum number of LRU evictions to attempt\n\n/**\n * Gets all license cache keys from localStorage\n */\nconst getAllLicenseCacheKeys = (): string[] => {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(PERSISTENT_LICENSE_PREFIX)) {\n keys.push(key);\n }\n }\n return keys;\n};\n\n/**\n * Gets all license cache entries\n */\nconst getAllLicenseCacheEntries = (): LicenseCacheEntry[] => {\n const keys = getAllLicenseCacheKeys();\n const entries: LicenseCacheEntry[] = [];\n \n for (const key of keys) {\n try {\n const stored = localStorage.getItem(key);\n if (stored) {\n const data: StoredSessionData[] = JSON.parse(stored);\n entries.push({ key, data });\n }\n } catch (error) {\n console.warn(`Failed to parse license cache entry for key ${key}:`, error);\n // Remove corrupted entries\n localStorage.removeItem(key);\n }\n }\n \n return entries;\n};\n\n/**\n * Removes the least recently used license cache entry\n * @returns true if an entry was removed, false if no entries exist\n */\nconst evictLRUEntry = (): boolean => {\n const entries = getAllLicenseCacheEntries();\n \n if (entries.length === 0) {\n return false;\n }\n \n // Sort by oldest timestamp in each entry (oldest first)\n entries.sort((a, b) => {\n const oldestA = Math.min(...a.data.map(session => session.timestamp));\n const oldestB = Math.min(...b.data.map(session => session.timestamp));\n return oldestA - oldestB;\n });\n \n // Remove the oldest entry\n const lruEntry = entries[0];\n localStorage.removeItem(lruEntry.key);\n \n console.log(`Evicted LRU license cache entry: ${lruEntry.key}`);\n return true;\n};\n\n/**\n * Attempts to store data in localStorage with LRU eviction on quota exceeded\n */\nconst storeWithQuotaHandling = (key: string, data: string): boolean => {\n let attempts = 0;\n \n while (attempts < LICENSE_MAX_RETRY_ATTEMPTS) {\n try {\n localStorage.setItem(key, data);\n return true;\n } catch (error) {\n // Check if this is a quota exceeded error\n if (error instanceof DOMException && (\n error.code === 22 || // QUOTA_EXCEEDED_ERR\n error.name === 'QuotaExceededError' ||\n error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n )) {\n console.warn(`QuotaExceededError on attempt ${attempts + 1}, attempting LRU eviction...`);\n \n // Try to evict an LRU entry\n if (!evictLRUEntry()) {\n console.error('No more entries to evict, storage operation failed');\n return false;\n }\n \n attempts++;\n } else {\n // Non-quota error, don't retry\n console.error('Failed to store license cache data:', error);\n return false;\n }\n }\n }\n \n console.error(`Failed to store license cache data after ${LICENSE_MAX_RETRY_ATTEMPTS} eviction attempts`);\n return false;\n};\n\n/**\n * Shared function to manage persistent license storage by:\n * 1. Loading existing sessions from localStorage\n * 2. Filtering out expired sessions\n * 3. Merging with new sessions (if provided)\n * 4. Updating localStorage with the cleaned data (with quota handling)\n */\nexport const managePersistentLicenseStorage = (\n playlistId: string,\n licenseCacheKey: string,\n newSessionMetadata?: PersistentSessionMetadata[]\n): StoredSessionData[] => {\n try {\n const storageKey = `${PERSISTENT_LICENSE_PREFIX}${playlistId}_${licenseCacheKey}`;\n const stored = localStorage.getItem(storageKey);\n let existingSessions: StoredSessionData[] = [];\n\n if (stored) {\n try {\n existingSessions = JSON.parse(stored);\n } catch (parseError) {\n console.warn('Failed to parse existing persistent license data:', parseError);\n existingSessions = [];\n }\n }\n \n const now = Date.now();\n \n // Filter out expired sessions\n let validSessions = existingSessions.filter(session => \n now - session.timestamp < LICENSE_EXPIRY_MS\n );\n \n // If new sessions are provided, merge them with existing valid sessions\n if (newSessionMetadata && newSessionMetadata.length > 0) {\n const newSessions: StoredSessionData[] = newSessionMetadata.map(session => {\n const uint8Array = new Uint8Array(session.initData);\n const binaryString = Array.from(uint8Array).map(byte => String.fromCharCode(byte)).join('');\n return {\n sessionId: session.sessionId,\n initData: btoa(binaryString),\n initDataType: session.initDataType,\n keySystem: session.keySystem,\n timestamp: now\n };\n });\n \n // Remove any existing sessions with the same sessionId to avoid duplicates\n const newSessionIds = new Set(newSessions.map(s => s.sessionId));\n validSessions = validSessions.filter(session => !newSessionIds.has(session.sessionId));\n \n // Add new sessions\n validSessions = [...validSessions, ...newSessions];\n }\n \n // Update localStorage with the cleaned/merged data using quota handling\n if (validSessions.length === 0) {\n localStorage.removeItem(storageKey);\n } else {\n const dataToStore = JSON.stringify(validSessions);\n const success = storeWithQuotaHandling(storageKey, dataToStore);\n \n if (!success) {\n console.error(`Failed to store license cache for ${storageKey} after quota handling`);\n // Return the sessions even if storage failed\n return validSessions;\n }\n }\n \n return validSessions;\n } catch (error) {\n console.warn('Failed to manage persistent license storage:', error);\n return [];\n }\n};\n\n/**\n * Stores persistent license sessions for a playlist\n */\nexport const storePersistentLicense = (\n playlistId: string,\n licenseCacheKey: string,\n sessionMetadata: PersistentSessionMetadata[]\n): void => {\n managePersistentLicenseStorage(playlistId, licenseCacheKey, sessionMetadata);\n};\n\n/**\n * Retrieves persistent license sessions for a playlist\n */\nexport const retrievePersistentLicense = (\n playlistId: string,\n licenseCacheKey: string\n): PersistentSessionMetadata[] => {\n try {\n const validSessions = managePersistentLicenseStorage(playlistId, licenseCacheKey);\n \n return validSessions.map(session => ({\n sessionId: session.sessionId,\n initData: Uint8Array.from(atob(session.initData), c => c.charCodeAt(0)).buffer,\n initDataType: session.initDataType,\n keySystem: session.keySystem\n }));\n } catch (error) {\n console.warn('Failed to retrieve persistent license:', error);\n return [];\n }\n};\n\n/**\n * Clears all cached persistent licenses from localStorage\n * @returns The number of license cache entries that were cleared\n */\nexport const clearAllPersistentLicenses = (): number => {\n try {\n const keys = getAllLicenseCacheKeys();\n \n for (const key of keys) {\n localStorage.removeItem(key);\n }\n \n console.log(`Cleared ${keys.length} persistent license cache entries`);\n return keys.length;\n } catch (error) {\n console.error('Failed to clear persistent licenses:', error);\n return 0;\n }\n};\n","import { useCallback, useRef } from 'react';\n\ninterface QualityConfig {\n enableAdaptation?: boolean;\n selectedQuality?: number;\n availableQualities?: Array<{\n height: number;\n bandwidth: number;\n label: string;\n }>;\n}\n\ninterface Quality {\n height: number;\n bandwidth: number;\n label: string;\n}\n\nexport const useQualityControl = (\n playerRef: React.RefObject<any>,\n qualityConfig?: QualityConfig,\n onQualityChange?: (quality: { height: number; bandwidth: number }) => void\n) => {\n const getAvailableQualities = useCallback((): Quality[] => {\n if (!playerRef.current) return [];\n \n const tracks = playerRef.current.getVariantTracks();\n const qualities = tracks\n .filter((track: any, index: any, self: any) => \n index === self.findIndex((t: any) => t.height === track.height)\n )\n .map((track: any) => ({\n height: track.height || 0,\n bandwidth: track.bandwidth || 0,\n label: `${track.height}p`\n }))\n .sort((a: any, b: any) => b.height - a.height);\n \n return qualities;\n }, [playerRef]);\n\n const setQuality = useCallback((height: number) => {\n if (!playerRef.current) return;\n \n if (height === 0) {\n // Enable adaptive streaming\n playerRef.current.configure({\n abr: { enabled: true, \n switchInterval: 2, // quicker re-checks\n clearBufferSwitch: true,\n safeMarginSwitch: 10 // leave ~10 s in front of the playhead }\n }\n })\n } else {\n // Disable adaptive streaming and select specific quality\n playerRef.current.configure({\n abr: { enabled: false,\n switchInterval: 2, // quicker re-checks\n clearBufferSwitch: true,\n safeMarginSwitch: 10 // leave ~10 s in front of the playhead } \n }\n });\n \n const tracks = playerRef.current.getVariantTracks();\n const targetTrack = tracks.find((track: any) => track.height === height);\n if (targetTrack) {\n playerRef.current.selectVariantTrack(targetTrack, /* clearBuffer= */ true);\n }\n }\n }, [playerRef]);\n\n const setupQualityTracking = useCallback(() => {\n if (!playerRef.current || !onQualityChange) return;\n\n const handleQualityChange = () => {\n const activeTrack = playerRef.current.getVariantTracks().find((track: any) => track.active);\n if (activeTrack) {\n onQualityChange({\n height: activeTrack.height || 0,\n bandwidth: activeTrack.bandwidth || 0\n });\n }\n };\n\n playerRef.current.addEventListener('variantchanged', handleQualityChange);\n \n return () => {\n playerRef.current?.removeEventListener('variantchanged', handleQualityChange);\n };\n }, [playerRef, onQualityChange]);\n\n const configureQuality = useCallback(() => {\n if (!playerRef.current || !qualityConfig) return;\n\n if (qualityConfig.enableAdaptation !== undefined) {\n playerRef.current.configure({\n abr: { enabled: qualityConfig.enableAdaptation }\n });\n }\n\n if (qualityConfig.selectedQuality !== undefined) {\n setQuality(qualityConfig.selectedQuality);\n }\n }, [playerRef, qualityConfig, setQuality]);\n\n return {\n getAvailableQualities,\n setQuality,\n setupQualityTracking,\n configureQuality\n };\n}; ","import { useCallback } from 'react';\n\nexport const useSkipControls = (\n videoRef: React.RefObject<HTMLVideoElement>,\n onSkipBack?: (newTime: number) => void,\n onSkipForward?: (newTime: number) => void\n) => {\n // Hardcoded skip duration of 15 seconds\n const skipDuration = 15;\n\n const skipBack = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n \n const newTime = Math.max(0, video.currentTime - skipDuration);\n video.currentTime = newTime;\n onSkipBack?.(newTime);\n }, [videoRef, onSkipBack]);\n\n const skipForward = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n \n const newTime = Math.min(video.duration || 0, video.currentTime + skipDuration);\n video.currentTime = newTime;\n onSkipForward?.(newTime);\n }, [videoRef, onSkipForward]);\n\n // Always show skip controls\n const shouldShowSkipControls = useCallback(() => {\n return true;\n }, []);\n\n return {\n skipBack,\n skipForward,\n skipDuration,\n shouldShowSkipControls\n };\n}; ","import { useCallback, useRef } from 'react';\nimport initShakaPlayerMux from '@mux/mux-data-shakaplayer';\nimport shaka from 'shaka-player/dist/shaka-player.ui';\nimport { MuxAnalyticsConfig } from '../types';\nimport { version } from '../../package.json';\n\nexport const useMuxAnalytics = (\n playerRef: React.RefObject<any>,\n muxConfig?: MuxAnalyticsConfig,\n onMuxReady?: () => void,\n onMuxDataUpdate?: (data: any) => void,\n) => {\n const shakaPlayerMuxRef = useRef<any>(null);\n\n const initializeMux = useCallback(() => {\n if (!muxConfig || !playerRef.current) return;\n\n try {\n const playerInitTime = initShakaPlayerMux.utils.now();\n \n // Prepare Mux options\n const muxOptions = {\n debug: muxConfig.debug || false,\n disableCookies: muxConfig.disableCookies || false,\n respectDoNotTrack: muxConfig.respectDoNotTrack || false,\n automaticErrorTracking: muxConfig.automaticErrorTracking !== false,\n ...(muxConfig.beaconCollectionDomain && { beaconCollectionDomain: muxConfig.beaconCollectionDomain }),\n ...(muxConfig.errorTranslator && { errorTranslator: muxConfig.errorTranslator }),\n data: {\n env_key: muxConfig.envKey,\n player_name: muxConfig?.metadata?.player_name,\n player_version: version,\n player_init_time: playerInitTime,\n video_title: muxConfig?.metadata?.video_title ?? \"\",\n video_id: muxConfig?.metadata?.video_id ?? \"\",\n viewer_user_id: muxConfig?.metadata?.viewer_user_id ?? \"\",\n ...muxConfig.metadata,\n }\n };\n\n // Initialize Mux monitoring\n shakaPlayerMuxRef.current = initShakaPlayerMux(playerRef.current, muxOptions, shaka);\n \n onMuxReady?.();\n } catch (error) {\n console.error('Failed to initialize Mux Analytics:', error);\n }\n }, [muxConfig, onMuxReady, playerRef]);\n\n const updateMuxData = useCallback((data: any) => {\n if ((playerRef.current as any)?.mux?.updateData) {\n try {\n (playerRef.current as any).mux.updateData(data);\n onMuxDataUpdate?.(data);\n } catch (error) {\n console.error('Failed to update Mux data:', error);\n }\n }\n }, [onMuxDataUpdate, playerRef]);\n\n const handleMuxError = useCallback((error: any) => {\n if (shakaPlayerMuxRef.current?.loadErrorHandler) {\n shakaPlayerMuxRef.current.loadErrorHandler(error);\n }\n }, []);\n\n const destroyMux = useCallback(() => {\n // Clean up Mux monitoring\n if ((playerRef.current as any)?.mux?.destroy) {\n try {\n (playerRef.current as any).mux.destroy();\n } catch (error) {\n console.error('Error destroying Mux:', error);\n }\n }\n \n if (shakaPlayerMuxRef.current) {\n shakaPlayerMuxRef.current = null;\n }\n }, [playerRef]);\n\n return {\n initializeMux,\n updateMuxData,\n handleMuxError,\n destroyMux,\n shakaPlayerMuxRef\n };\n}; ","import { useCallback, useRef } from 'react';\nimport { ui as ShakaUI } from 'shaka-player/dist/shaka-player.ui';\nimport { SkipBackIcon, SkipForwardIcon, BigPlayIcon } from '../icons';\nimport { renderIcon } from '../utils/renderIcon';\n\ninterface ChromecastConfig {\n receiverApplicationId?: string;\n}\n\ninterface IconSizes {\n skipButtons?: number;\n bigPlayButton?: number;\n}\n\n// Custom Skip Back Button Element\nclass SkipBackButton {\n private button_: HTMLButtonElement;\n private parent: HTMLElement;\n private controls: any;\n private eventManager: any;\n\n constructor(parent: HTMLElement, controls: any, onSkipBack?: (newTime: number) => void, iconSize = 24) {\n this.parent = parent;\n this.controls = controls;\n this.eventManager = { listen: (element: HTMLElement, event: string, handler: () => void) => {\n element.addEventListener(event, handler);\n }};\n\n this.button_ = document.createElement('button');\n this.button_.className = 'shaka-button motto-native-skip-button';\n this.button_.innerHTML = renderIcon(SkipBackIcon, { size: iconSize });\n this.button_.title = 'Skip back 15 seconds';\n this.button_.setAttribute('aria-label', 'Skip back 15 seconds');\n \n this.parent.appendChild(this.button_);\n\n this.eventManager.listen(this.button_, 'click', () => {\n const video = this.controls.getVideo();\n if (video) {\n const newTime = Math.max(0, video.currentTime - 15);\n video.currentTime = newTime;\n onSkipBack?.(newTime);\n }\n });\n }\n\n // Shaka UI will call `release` when the controls are destroyed.\n // Provide a no-op implementation to avoid TypeErrors.\n public release() {\n /* Optionally detach listeners / clean up DOM here */\n }\n}\n\n// Custom Skip Forward Button Element \nclass SkipForwardButton {\n private button_: HTMLButtonElement;\n private parent: HTMLElement;\n private controls: any;\n private eventManager: any;\n\n constructor(parent: HTMLElement, controls: any, onSkipForward?: (newTime: number) => void, iconSize = 24) {\n this.parent = parent;\n this.controls = controls;\n this.eventManager = { listen: (element: HTMLElement, event: string, handler: () => void) => {\n element.addEventListener(event, handler);\n }};\n\n this.button_ = document.createElement('button');\n this.button_.className = 'shaka-button motto-native-skip-button';\n this.button_.innerHTML = renderIcon(SkipForwardIcon, { size: iconSize });\n this.button_.title = 'Skip forward 15 seconds';\n this.button_.setAttribute('aria-label', 'Skip forward 15 seconds');\n \n this.parent.appendChild(this.button_);\n\n this.eventManager.listen(this.button_, 'click', () => {\n const video = this.controls.getVideo();\n if (video) {\n const newTime = Math.min(video.duration || 0, video.currentTime + 15);\n video.currentTime = newTime;\n onSkipForward?.(newTime);\n }\n });\n }\n\n public release() {\n /* Clean-up logic if needed */\n }\n}\n\n// Factory classes for the custom elements\nclass SkipBackButtonFactory {\n constructor(private onSkipBack?: (newTime: number) => void, private iconSize?: number) {}\n \n create(rootElement: HTMLElement, controls: any) {\n return new SkipBackButton(rootElement, controls, this.onSkipBack, this.iconSize);\n }\n}\n\nclass SkipForwardButtonFactory {\n constructor(private onSkipForward?: (newTime: number) => void, private iconSize?: number) {}\n \n create(rootElement: HTMLElement, controls: any) {\n return new SkipForwardButton(rootElement, controls, this.onSkipForward, this.iconSize);\n }\n}\n\ninterface SeekbarColors {\n base?: string;\n buffered?: string;\n played?: string;\n}\n\nexport const useShakaUI = (\n playerRef: React.RefObject<any>,\n containerRef: React.RefObject<HTMLDivElement>,\n videoRef: React.RefObject<HTMLVideoElement>,\n controls: boolean,\n chromecastConfig?: ChromecastConfig,\n seekbarColors?: SeekbarColors,\n onSkipBack?: (newTime: number) => void,\n onSkipForward?: (newTime: number) => void,\n iconSizes?: IconSizes,\n locale: string = 'en'\n) => {\n const uiRef = useRef<any>(null);\n const registeredElements = useRef<Set<string>>(new Set());\n\n const initializeUI = useCallback(async () => {\n if (!controls || !containerRef.current || !playerRef.current || !videoRef.current) {\n return null;\n }\n\n // Register custom elements if not already registered\n if (!registeredElements.current.has('skip_back_button')) {\n ShakaUI.Controls.registerElement('skip_back_button', new SkipBackButtonFactory(onSkipBack, iconSizes?.skipButtons));\n registeredElements.current.add('skip_back_button');\n }\n \n if (!registeredElements.current.has('skip_forward_button')) {\n ShakaUI.Controls.registerElement('skip_forward_button', new SkipForwardButtonFactory(onSkipForward, iconSizes?.skipButtons));\n registeredElements.current.add('skip_forward_button');\n }\n\n // Create UI with Shaka Player controls using default configuration\n const ui = new ShakaUI.Overlay(playerRef.current, containerRef.current, videoRef.current);\n uiRef.current = ui;\n \n // Configure localization if locale is not 'en'\n if (locale !== 'en') {\n try {\n ui.getControls().getLocalization().changeLocale([locale])\n console.log(`Set locale to '${locale}'`);\n\n } catch (error) {\n console.warn(`Failed to set locale to '${locale}', falling back to 'en':`, error);\n }\n }\n\n // Detect mobile to conditionally include volume control\n const isMobile = window.innerWidth <= 767;\n \n const controlPanelElements = [\n ...(isMobile ? [] : ['skip_back_button']), \n ...(isMobile ? [] : ['play_pause']), \n ...(isMobile ? [] : ['skip_forward_button']), \n 'mute',\n ...(isMobile ? [] : ['volume']), // Only include volume on desktop\n 'time_and_duration',\n 'spacer',\n 'fullscreen',\n 'cast', // Always show cast button\n 'overflow_menu',\n ];\n\n // Configure UI settings with custom control panel layout\n const uiConfig: any = {\n seekBarColors: {\n base: seekbarColors?.base || 'rgba(255, 255, 255, 0.3)', // Unbuffered track\n buffered: seekbarColors?.buffered || 'rgba(255, 255, 255, 0.5)', // Buffered but not played\n played: seekbarColors?.played || '#ffffff', // Progress/played portion (white)\n },\n controlPanelElements: controlPanelElements,\n addBigPlayButton: isMobile,\n // For now, Chromecast via Shaka must use the Motto receiver that runs on the legacy cast SDK (2.0), because\n // Shaka does not support the newer Cast SDK (3.0+) in its native integration.\n castReceiverAppId: 'EC900D4D',\n castAndroidReceiverCompatible: true, // Enable Android TV compatibility\n overflowMenuButtons: [\n 'quality',\n 'picture_in_picture',\n 'playback_rate'\n ]\n };\n\n ui.configure(uiConfig);\n\n // Custom SVG replacement for big play button on mobile\n if (isMobile) {\n const customizeBigPlayButton = () => {\n const bigPlayButton = containerRef.current?.querySelector('.shaka-big-play-button');\n if (bigPlayButton && !bigPlayButton.hasAttribute('data-customized')) {\n // Use custom size if provided, otherwise use default\n const buttonSize = iconSizes?.bigPlayButton || 40;\n \n // Clear existing content and add custom SVG\n bigPlayButton.innerHTML = renderIcon(BigPlayIcon, { size: buttonSize });\n \n // Mark as customized to avoid re-processing\n bigPlayButton.setAttribute('data-customized', 'true');\n \n // Ensure the button is properly styled\n const buttonElement = bigPlayButton as HTMLElement;\n buttonElement.style.display = 'flex';\n buttonElement.style.alignItems = 'center';\n buttonElement.style.justifyContent = 'center';\n }\n };\n\n // Apply customization\n setTimeout(customizeBigPlayButton, 100);\n\n // Watch for changes and reapply customization\n const observer = new MutationObserver(() => {\n customizeBigPlayButton();\n });\n\n if (containerRef.current) {\n observer.observe(containerRef.current, {\n childList: true,\n subtree: true,\n attributes: false\n });\n }\n }\n\n // Seekbar styling is now handled by CSS with proper background\n\n return ui;\n }, [controls, containerRef, playerRef, videoRef, chromecastConfig, seekbarColors, onSkipBack, onSkipForward, iconSizes, locale]);\n\n const destroyUI = useCallback(async () => {\n const uiInstance = uiRef.current;\n if (uiInstance) {\n try {\n await uiInstance.destroy();\n } catch (error) {\n console.error('Error destroying UI:', error);\n } finally {\n if (uiRef.current === uiInstance) {\n uiRef.current = null;\n }\n }\n }\n }, []);\n\n return {\n uiRef,\n initializeUI,\n destroyUI\n };\n}; ","import React from 'react';\n\ninterface SkipBackIconProps {\n size?: number;\n className?: string;\n}\n\nexport const SkipBackIcon: React.FC<SkipBackIconProps> = ({ size = 24, className = '' }) => {\n return (\n <svg \n width={size} \n height={size} \n strokeWidth=\"2\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path \n d=\"M3 13C3 17.9706 7.02944 22 12 22C16.9706 22 21 17.9706 21 13C21 8.02944 16.9706 4 12 4\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M9 9L9 16\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M15 9L13 9C12.4477 9 12 9.44772 12 10L12 11.5C12 12.0523 12.4477 12.5 13 12.5L14 12.5C14.5523 12.5 15 12.9477 15 13.5L15 15C15 15.5523 14.5523 16 14 16L12 16\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M12 4L4.5 4M4.5 4L6.5 2M4.5 4L6.5 6\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}; ","import React from 'react';\n\ninterface SkipForwardIconProps {\n size?: number;\n className?: string;\n}\n\nexport const SkipForwardIcon: React.FC<SkipForwardIconProps> = ({ size = 24, className = '' }) => {\n return (\n <svg \n width={size} \n height={size} \n strokeWidth=\"2\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path \n d=\"M21 13C21 17.9706 16.9706 22 12 22C7.02944 22 3 17.9706 3 13C3 8.02944 7.02944 4 12 4\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M12 4H19.5M19.5 4L17.5 2M19.5 4L17.5 6\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M9 9L9 16\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n <path \n d=\"M15 9L13 9C12.4477 9 12 9.44772 12 10L12 11.5C12 12.0523 12.4477 12.5 13 12.5L14 12.5C14.5523 12.5 15 12.9477 15 13.5L15 15C15 15.5523 14.5523 16 14 16L12 16\" \n stroke=\"currentColor\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}; ","import React from 'react';\n\ninterface BigPlayIconProps {\n size?: number;\n className?: string;\n}\n\nexport const BigPlayIcon: React.FC<BigPlayIconProps> = ({ size = 40, className = '' }) => {\n return (\n <svg \n width={size} \n height={size} \n viewBox=\"0 0 24 24\" \n fill=\"currentColor\" \n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path \n fillRule=\"evenodd\" \n d=\"M4.5 5.653c0-1.427 1.529-2.33 2.779-1.643l11.54 6.347c1.295.712 1.295 2.573 0 3.286L7.28 19.99c-1.25.687-2.779-.217-2.779-1.643V5.653Z\" \n clipRule=\"evenodd\" \n />\n </svg>\n );\n}; ","import { renderToStaticMarkup } from 'react-dom/server';\nimport { createElement } from 'react';\n\n/**\n * Renders a React component to an HTML string for use in Shaka UI buttons\n */\nexport const renderIcon = (Component: React.ComponentType<any>, props: any = {}) => {\n return renderToStaticMarkup(createElement(Component, props));\n}; ","import { useCallback, useRef } from 'react';\nimport { TimeUpdateData } from '../types';\n\ninterface EventHandlers {\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n onTimeUpdate?: (timeData: TimeUpdateData) => void;\n}\n\nexport const useEventHandlers = (\n videoRef: React.RefObject<HTMLVideoElement>,\n playerRef: React.RefObject<any>,\n handlers: EventHandlers\n) => {\n const timeUpdateHandlerRef = useRef<(() => void) | null>(null);\n\n const setupEventListeners = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const { onPlay, onPause, onEnded, onLoadStart, onCanPlay, onTimeUpdate } = handlers;\n\n if (onPlay) video.addEventListener('play', onPlay);\n if (onPause) video.addEventListener('pause', onPause);\n if (onEnded) video.addEventListener('ended', onEnded);\n if (onLoadStart) video.addEventListener('loadstart', onLoadStart);\n if (onCanPlay) video.addEventListener('canplay', onCanPlay);\n \n // Handle timeupdate with comprehensive data\n if (onTimeUpdate) {\n const handleTimeUpdate = () => {\n const player = playerRef.current;\n const currentTime = video.currentTime;\n const duration = video.duration;\n \n // Check if it's a live stream\n const isLive = player && typeof player.isLive === 'function' ? player.isLive() : false;\n \n const timeData: TimeUpdateData = {\n currentTime,\n duration,\n isLive\n };\n \n if (isLive && player && typeof player.seekRange === 'function') {\n // For live streams, provide additional data\n const seekRange = player.seekRange();\n if (seekRange && seekRange.end !== undefined) {\n timeData.liveEdge = seekRange.end;\n timeData.timeBehindLive = seekRange.end - currentTime;\n }\n } else if (duration && isFinite(duration) && duration > 0) {\n // For regular videos, provide progress percentage\n timeData.progress = (currentTime / duration) * 100;\n }\n \n onTimeUpdate(timeData);\n };\n \n timeUpdateHandlerRef.current = handleTimeUpdate;\n video.addEventListener('timeupdate', handleTimeUpdate);\n }\n }, [videoRef, playerRef, handlers]);\n\n const cleanupEventListeners = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const { onPlay, onPause, onEnded, onLoadStart, onCanPlay } = handlers;\n\n if (onPlay) video.removeEventListener('play', onPlay);\n if (onPause) video.removeEventListener('pause', onPause);\n if (onEnded) video.removeEventListener('ended', onEnded);\n if (onLoadStart) video.removeEventListener('loadstart', onLoadStart);\n if (onCanPlay) video.removeEventListener('canplay', onCanPlay);\n \n if (timeUpdateHandlerRef.current) {\n video.removeEventListener('timeupdate', timeUpdateHandlerRef.current);\n timeUpdateHandlerRef.current = null;\n }\n }, [videoRef, handlers]);\n\n return {\n setupEventListeners,\n cleanupEventListeners\n };\n}; ","import { useEffect, useState, useRef } from 'react';\n\ninterface UsePosterFallbackOptions {\n enabled?: boolean;\n fallbackPoster?: string;\n showLoadingOverlay?: boolean;\n}\n\nexport const usePosterFallback = (\n playerRef: React.RefObject<any>,\n options: UsePosterFallbackOptions = {}\n) => {\n const [isLoading, setIsLoading] = useState(true);\n const [showOverlay, setShowOverlay] = useState(true);\n const [hasStartedPlaying, setHasStartedPlaying] = useState(false);\n const { enabled = true, fallbackPoster, showLoadingOverlay = true } = options;\n\n useEffect(() => {\n if (!playerRef.current || !enabled) {\n return;\n }\n\n const handleLoadStart = () => {\n setIsLoading(true);\n setShowOverlay(true);\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n // Keep overlay visible until user interaction or autoplay starts\n if (!hasStartedPlaying) {\n setShowOverlay(true);\n }\n };\n\n const handlePlay = () => {\n setHasStartedPlaying(true);\n setShowOverlay(false);\n };\n\n const handleLoadedMetadata = () => {\n setIsLoading(false);\n };\n\n // Add event listeners\n const video = playerRef.current;\n if (video) {\n video.addEventListener('loadstart', handleLoadStart);\n video.addEventListener('canplay', handleCanPlay);\n video.addEventListener('play', handlePlay);\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n\n return () => {\n video.removeEventListener('loadstart', handleLoadStart);\n video.removeEventListener('canplay', handleCanPlay);\n video.removeEventListener('play', handlePlay);\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n };\n }\n }, [playerRef, enabled, hasStartedPlaying]);\n\n const hideOverlay = () => {\n setShowOverlay(false);\n };\n\n return {\n isLoading,\n showOverlay: showLoadingOverlay && showOverlay,\n hideOverlay,\n hasStartedPlaying\n };\n}; ","import { useEffect, useRef } from 'react';\n\ninterface UseLiveIndicatorOptions {\n enabled?: boolean;\n indicatorColor?: string;\n indicatorSize?: number;\n showPulseAnimation?: boolean;\n liveThresholdSeconds?: number;\n onLiveStatusChange?: (status: LiveStatus) => void;\n}\n\nexport interface LiveStatus {\n isLive: boolean;\n isNearEdge: boolean;\n liveEdge?: number;\n}\n\nexport const useLiveIndicator = (\n containerRef: React.RefObject<HTMLElement>,\n playerRef: React.RefObject<any>,\n options: UseLiveIndicatorOptions = {}\n) => {\n const observerRef = useRef<MutationObserver | null>(null);\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n const lastStatusRef = useRef<{ isLive: boolean; isNearEdge: boolean } | null>(null);\n const {\n enabled = true,\n indicatorColor = '#ff0000',\n indicatorSize = 8,\n showPulseAnimation = true,\n liveThresholdSeconds = 15,\n onLiveStatusChange\n } = options;\n\n const getLiveStatus = (player: any): LiveStatus => {\n if (!player) {\n return { isLive: false, isNearEdge: false };\n }\n\n try {\n // Use stable public API to check if stream is live\n if (typeof player.isLive !== 'function') {\n return { isLive: false, isNearEdge: false };\n }\n\n const isLiveStream = player.isLive();\n if (!isLiveStream) return { isLive: false, isNearEdge: false };\n\n // Get the seek range using stable public API\n const videoElement = player.getMediaElement?.();\n if (!videoElement) return { isLive: true, isNearEdge: false };\n\n // Use stable public API to get seek range\n if (typeof player.seekRange !== 'function') {\n return { isLive: true, isNearEdge: false };\n }\n\n const seekRange = player.seekRange();\n if (!seekRange || seekRange.end === undefined) {\n return { isLive: true, isNearEdge: false };\n }\n\n const liveEdge = seekRange.end;\n const currentTime = videoElement.currentTime;\n const timeBehindLive = liveEdge - currentTime;\n\n // Consider \"near live edge\" if within the threshold\n return {\n isLive: true,\n isNearEdge: timeBehindLive <= liveThresholdSeconds,\n liveEdge\n };\n } catch (error) {\n console.error('Error checking live status:', error);\n return { isLive: false, isNearEdge: false };\n }\n };\n\n const seekToLiveEdge = () => {\n const player = playerRef.current;\n if (!player) return;\n\n try {\n // Use stable public API to get seek range\n if (typeof player.seekRange !== 'function') return;\n\n const seekRange = player.seekRange();\n if (!seekRange || seekRange.end === undefined) return;\n\n const liveEdge = seekRange.end;\n const videoElement = player.getMediaElement?.();\n if (videoElement) {\n videoElement.currentTime = liveEdge;\n }\n } catch (error) {\n console.error('Error seeking to live edge:', error);\n }\n };\n\n useEffect(() => {\n if (!containerRef.current || !enabled) {\n return;\n }\n\n const updateLiveIndicator = (currentTimeElement: Element, status: LiveStatus) => {\n const parent = currentTimeElement.parentElement;\n if (!parent) return;\n\n const existingContainer = parent.querySelector('.live-indicator-container');\n const isCurrentlyNearEdge = existingContainer?.getAttribute('data-near-edge') === 'true';\n\n // If status matches current state, no update needed\n if (existingContainer && status.isNearEdge === isCurrentlyNearEdge) {\n return;\n }\n\n // Remove existing container if present\n if (existingContainer) {\n existingContainer.remove();\n }\n\n // Create a container for indicator + text\n const container = document.createElement('span');\n container.className = 'live-indicator-container';\n container.setAttribute('data-near-edge', status.isNearEdge.toString());\n container.style.cssText = `\n display: inline-flex;\n align-items: center;\n width: 80px;\n ${!status.isNearEdge ? 'cursor: pointer;' : ''}\n `;\n\n // Create the circle indicator\n const indicator = document.createElement('span');\n indicator.className = 'live-indicator-dot';\n indicator.style.cssText = `\n display: inline-block;\n width: ${indicatorSize}px;\n height: ${indicatorSize}px;\n background-color: ${status.isNearEdge ? indicatorColor : '#888888'};\n border-radius: 50%;\n margin-right: 6px;\n ${status.isNearEdge && showPulseAnimation ? 'animation: pulse-live 2s infinite;' : ''}\n `;\n\n // Create text\n const liveText = document.createElement('span');\n liveText.className = 'live-indicator-text';\n liveText.textContent = status.isNearEdge ? 'LIVE' : 'GO TO LIVE';\n\n container.appendChild(indicator);\n container.appendChild(liveText);\n\n // Add click handler for \"GO TO LIVE\"\n if (!status.isNearEdge) {\n container.addEventListener('click', seekToLiveEdge);\n }\n\n // Insert container as sibling - before time when LIVE, after time when GO TO LIVE\n if (status.isNearEdge) {\n parent.insertBefore(container, currentTimeElement);\n (currentTimeElement as HTMLElement).style.display = 'none';\n } else {\n // Insert after the time element\n currentTimeElement.insertAdjacentElement('afterend', container);\n (currentTimeElement as HTMLElement).style.display = '';\n }\n };\n\n const removeLiveIndicator = (currentTimeElement: Element) => {\n const parent = currentTimeElement.parentElement;\n if (!parent) return;\n\n const container = parent.querySelector('.live-indicator-container');\n if (container) {\n container.remove();\n (currentTimeElement as HTMLElement).style.display = '';\n }\n };\n\n const checkForLiveContent = () => {\n const currentTimeElements = containerRef.current?.querySelectorAll('.shaka-current-time');\n const status = getLiveStatus(playerRef.current);\n\n // Call callback if status changed\n const lastStatus = lastStatusRef.current;\n if (\n onLiveStatusChange &&\n (!lastStatus || lastStatus.isLive !== status.isLive || lastStatus.isNearEdge !== status.isNearEdge)\n ) {\n onLiveStatusChange(status);\n lastStatusRef.current = { isLive: status.isLive, isNearEdge: status.isNearEdge };\n }\n\n currentTimeElements?.forEach((element) => {\n if (status.isLive) {\n updateLiveIndicator(element, status);\n } else {\n removeLiveIndicator(element);\n }\n });\n };\n\n // Initial check\n checkForLiveContent();\n\n // Set up interval to check periodically (since we need to check live edge position)\n intervalRef.current = setInterval(checkForLiveContent, 1000);\n\n // Set up mutation observer to watch for changes in the DOM\n observerRef.current = new MutationObserver((mutations) => {\n let shouldCheck = false;\n \n mutations.forEach((mutation) => {\n // Check if any nodes were added or text content changed\n if (mutation.type === 'childList' || mutation.type === 'characterData') {\n shouldCheck = true;\n }\n \n // Check if any of the added nodes contain current time elements\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n if (element.classList?.contains('shaka-current-time') || \n element.querySelector?.('.shaka-current-time')) {\n shouldCheck = true;\n }\n }\n });\n });\n \n if (shouldCheck) {\n // Debounce the check to avoid excessive calls\n setTimeout(checkForLiveContent, 100);\n }\n });\n\n // Start observing\n observerRef.current.observe(containerRef.current, {\n childList: true,\n subtree: true,\n characterData: true,\n characterDataOldValue: true\n });\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [containerRef, enabled, indicatorColor, indicatorSize, showPulseAnimation, liveThresholdSeconds]);\n\n return {\n seekToLiveEdge,\n getLiveStatus: () => getLiveStatus(playerRef.current)\n };\n}; ","import { useCallback, useEffect } from 'react';\n\ninterface UseKeyboardControlsOptions {\n skipBack?: () => void;\n skipForward?: () => void;\n enabled?: boolean;\n}\n\nexport const useKeyboardControls = (\n videoRef: React.RefObject<HTMLVideoElement>,\n options: UseKeyboardControlsOptions = {}\n) => {\n const { skipBack, skipForward, enabled = true } = options;\n\n // Detect if we're on desktop (not mobile)\n const isDesktop = useCallback(() => {\n return window.innerWidth > 767 && !/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n }, []);\n\n const handleKeydown = useCallback((event: KeyboardEvent) => {\n if (!enabled || !isDesktop() || !videoRef.current) return;\n\n // Don't handle keyboard events if user is typing in an input\n const activeElement = document.activeElement;\n if (activeElement && (\n activeElement.tagName === 'INPUT' ||\n activeElement.tagName === 'TEXTAREA' ||\n (activeElement as HTMLElement).isContentEditable\n )) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n skipBack?.();\n break;\n \n case 'ArrowRight':\n event.preventDefault();\n skipForward?.();\n break;\n \n case ' ':\n case 'Space':\n event.preventDefault();\n if (videoRef.current.paused) {\n videoRef.current.play();\n } else {\n videoRef.current.pause();\n }\n break;\n }\n }, [enabled, videoRef, skipBack, skipForward, isDesktop]);\n\n useEffect(() => {\n if (!enabled || !isDesktop()) return;\n\n // Add event listener to document to catch keyboard events globally\n document.addEventListener('keydown', handleKeydown);\n\n return () => {\n document.removeEventListener('keydown', handleKeydown);\n };\n }, [handleKeydown, enabled, isDesktop]);\n\n return {\n isDesktop: isDesktop()\n };\n}; ","import { useCallback, useRef } from 'react';\n\ninterface AdEventHandlers {\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n}\n\nexport const useAdEvents = (\n playerRef: React.RefObject<any>,\n handlers: AdEventHandlers\n) => {\n // Store listener references for cleanup\n const listenersRef = useRef<Array<{ event: string; listener: (event: any) => void }>>([]);\n\n const setupAdEventListeners = useCallback(() => {\n const player = playerRef.current;\n if (!player) return;\n\n const adManager = player.getAdManager();\n if (!adManager) return;\n\n // Get the AdsManager instance to listen to ad events\n // Note: We need to listen to the LOADED event first to get access to the AdsManager\n const onAdsManagerLoaded = (event: any) => {\n const adsManager = event.getAdsManager();\n \n // Ad started\n const onAdStarted = () => {\n console.log('Ad started');\n handlers.onAdStart?.();\n };\n\n // Ad completed\n const onAdComplete = () => {\n console.log('Ad completed');\n handlers.onAdComplete?.();\n };\n\n // Ad error\n const onAdError = (adErrorEvent: any) => {\n console.error('Ad error:', adErrorEvent.getError());\n handlers.onAdError?.(adErrorEvent.getError());\n };\n\n // Ad skipped\n const onAdSkipped = () => {\n console.log('Ad skipped');\n handlers.onAdSkipped?.();\n };\n\n // Ad paused\n const onAdPaused = () => {\n console.log('Ad paused');\n handlers.onAdPaused?.();\n };\n\n // Ad resumed\n const onAdResumed = () => {\n console.log('Ad resumed');\n handlers.onAdResumed?.();\n };\n\n // Ad progress\n const onAdProgress = (adProgressData: any) => {\n handlers.onAdProgress?.(adProgressData);\n };\n\n // All ads completed\n const onAllAdsCompleted = () => {\n console.log('All ads completed');\n handlers.onAllAdsCompleted?.();\n };\n\n // Store listeners for cleanup\n const adEventListeners: Array<{ event: any; listener: any }> = [];\n\n // Register event listeners if handlers are provided\n if (window.google?.ima) {\n const AdEvent = window.google.ima.AdEvent.Type;\n const AdErrorEvent = window.google.ima.AdErrorEvent.Type;\n\n if (handlers.onAdStart) {\n adsManager.addEventListener(AdEvent.STARTED, onAdStarted);\n adEventListeners.push({ event: AdEvent.STARTED, listener: onAdStarted });\n }\n\n if (handlers.onAdComplete) {\n adsManager.addEventListener(AdEvent.COMPLETE, onAdComplete);\n adEventListeners.push({ event: AdEvent.COMPLETE, listener: onAdComplete });\n }\n\n if (handlers.onAdError) {\n adsManager.addEventListener(AdErrorEvent.AD_ERROR, onAdError);\n adEventListeners.push({ event: AdErrorEvent.AD_ERROR, listener: onAdError });\n }\n\n if (handlers.onAdSkipped) {\n adsManager.addEventListener(AdEvent.SKIPPED, onAdSkipped);\n adEventListeners.push({ event: AdEvent.SKIPPED, listener: onAdSkipped });\n }\n\n if (handlers.onAdPaused) {\n adsManager.addEventListener(AdEvent.PAUSED, onAdPaused);\n adEventListeners.push({ event: AdEvent.PAUSED, listener: onAdPaused });\n }\n\n if (handlers.onAdResumed) {\n adsManager.addEventListener(AdEvent.RESUMED, onAdResumed);\n adEventListeners.push({ event: AdEvent.RESUMED, listener: onAdResumed });\n }\n\n if (handlers.onAdProgress) {\n adsManager.addEventListener(AdEvent.AD_PROGRESS, onAdProgress);\n adEventListeners.push({ event: AdEvent.AD_PROGRESS, listener: onAdProgress });\n }\n\n if (handlers.onAllAdsCompleted) {\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, onAllAdsCompleted);\n adEventListeners.push({ event: AdEvent.ALL_ADS_COMPLETED, listener: onAllAdsCompleted });\n }\n\n // Store the adsManager and its listeners for cleanup\n listenersRef.current.push({\n adsManager,\n listeners: adEventListeners\n } as any);\n }\n };\n\n // Listen for when ads are loaded\n try {\n // Shaka's ad manager uses events for tracking\n player.addEventListener('ad-started', () => {\n console.log('Shaka ad-started event');\n handlers.onAdStart?.();\n });\n\n player.addEventListener('ad-complete', () => {\n console.log('Shaka ad-complete event');\n handlers.onAdComplete?.();\n });\n\n player.addEventListener('ad-skipped', () => {\n console.log('Shaka ad-skipped event');\n handlers.onAdSkipped?.();\n });\n\n player.addEventListener('ad-error', (event: any) => {\n console.error('Shaka ad-error event:', event);\n handlers.onAdError?.(event);\n });\n\n // Store Shaka listeners\n listenersRef.current.push({\n type: 'shaka',\n player: player,\n events: ['ad-started', 'ad-complete', 'ad-skipped', 'ad-error']\n } as any);\n\n } catch (error) {\n console.warn('Error setting up ad event listeners:', error);\n }\n }, [playerRef, handlers]);\n\n const cleanupAdEventListeners = useCallback(() => {\n try {\n // Clean up all stored listeners\n listenersRef.current.forEach((listenerGroup: any) => {\n if (listenerGroup.type === 'shaka' && listenerGroup.player) {\n // Clean up Shaka player listeners\n listenerGroup.events.forEach((eventName: string) => {\n try {\n listenerGroup.player.removeEventListener(eventName, () => {});\n } catch (e) {\n console.warn(`Error removing ${eventName} listener:`, e);\n }\n });\n } else if (listenerGroup.adsManager && listenerGroup.listeners) {\n // Clean up IMA AdsManager listeners\n listenerGroup.listeners.forEach(({ event, listener }: any) => {\n try {\n listenerGroup.adsManager.removeEventListener(event, listener);\n } catch (e) {\n console.warn('Error removing ad listener:', e);\n }\n });\n }\n });\n\n // Clear the listeners array\n listenersRef.current = [];\n } catch (error) {\n console.warn('Error cleaning up ad event listeners:', error);\n }\n }, []);\n\n return {\n setupAdEventListeners,\n cleanupAdEventListeners\n };\n};\n\n","/**\n * Script loader utility for dynamically loading external scripts\n */\n\ninterface ScriptConfig {\n src: string;\n id: string;\n type?: string;\n }\n \n const SCRIPT_CONFIGS: Record<string, ScriptConfig> = {\n ima: {\n src: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n id: 'ima-sdk',\n type: 'text/javascript'\n },\n system73: {\n src: '//cdn.s73cloud.com/4/s73-sdk-shakaplayer.js',\n id: 'system73-sdk',\n type: 'application/javascript'\n }\n };\n \n /**\n * Load a script dynamically\n */\n function loadScript(config: ScriptConfig): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script is already loaded\n if (document.getElementById(config.id)) {\n resolve();\n return;\n }\n \n const script = document.createElement('script');\n script.id = config.id;\n script.src = config.src;\n script.type = config.type || 'text/javascript';\n script.async = true;\n \n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load script: ${config.src}`));\n \n document.head.appendChild(script);\n });\n }\n \n /**\n * Get required script loaders based on configuration\n */\n export function getRequiredScriptLoaders(needsIma: boolean, needsSystem73: boolean): Promise<void>[] {\n const loaders: Promise<void>[] = [];\n \n if (needsIma) {\n loaders.push(loadScript(SCRIPT_CONFIGS.ima));\n }\n \n if (needsSystem73) {\n loaders.push(loadScript(SCRIPT_CONFIGS.system73));\n }\n \n return loaders;\n }\n \n /**\n * Load multiple scripts in parallel\n */\n export async function loadScripts(scriptLoaders: Promise<void>[]): Promise<void> {\n if (scriptLoaders.length === 0) {\n return;\n }\n \n try {\n await Promise.all(scriptLoaders);\n } catch (error) {\n console.error('Error loading scripts:', error);\n throw error;\n }\n }\n \n /**\n * Check if a script is already loaded\n */\n export function isScriptLoaded(scriptName: keyof typeof SCRIPT_CONFIGS): boolean {\n const config = SCRIPT_CONFIGS[scriptName];\n return !!document.getElementById(config.id);\n }\n \n /**\n * Wait for a global variable to be available (useful for waiting for SDK initialization)\n */\n export function waitForGlobal(globalName: string, timeout: number = 5000): Promise<any> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now();\n \n function checkGlobal() {\n const global = (window as any)[globalName];\n if (global) {\n resolve(global);\n return;\n }\n \n if (Date.now() - startTime > timeout) {\n reject(new Error(`Timeout waiting for global: ${globalName}`));\n return;\n }\n \n setTimeout(checkGlobal, 100);\n }\n \n checkGlobal();\n });\n }\n \n /**\n * Wait for multiple globals to be available\n */\n export async function waitForGlobals(globalNames: string[], timeout: number = 5000): Promise<void> {\n const promises = globalNames.map(name => waitForGlobal(name, timeout));\n await Promise.all(promises);\n } ","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\ninterface LoadingProps {\n className?: string;\n}\n\nexport const Loading: React.FC<LoadingProps> = ({ className }) => (\n <div\n className={twMerge(\n \"relative bg-[#151515] md:rounded-2xl! overflow-hidden aspect-video text-white w-full h-full flex justify-center items-center text-[10px]\",\n className\n )}\n role=\"status\"\n >\n {/* Spinner inspired by Shaka Player's buffering indicator */}\n <div className=\" flex justify-center items-center\">\n <svg\n className=\"shaka-spinner-svg animate-spin h-12 w-12\"\n viewBox=\"0 0 64 64\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n className=\"shaka-spinner-path\"\n cx=\"32\"\n cy=\"32\"\n r=\"28\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n stroke=\"currentColor\"\n fill=\"none\"\n /* Create a gap so rotation is visible */\n strokeDasharray=\"176\"\n strokeDashoffset=\"120\"\n />\n </svg>\n </div>\n {/* <span className=\"sr-only\">Loading...</span> */}\n </div>\n); ","import React from 'react';\n\ninterface ErrorScreenProps {\n title?: string;\n description?: string;\n}\n\nexport const ErrorScreen: React.FC<ErrorScreenProps> = ({ title, description }) => (\n <div className=\"w-full h-full md:rounded-2xl! aspect-video bg-black flex\">\n <div className=\"bg-[#151515] text-white w-full h-full flex justify-center items-center\">\n <svg\n className=\"w-24 h-24 m-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{ width: 96 }}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <div>\n <h3 className=\"text-2xl mb-2\">{title || \"Playback Error\"}</h3>\n <div className=\"text-lg\">{description || \"Unable to play the video. Please try again later.\"}</div>\n </div>\n </div>\n </div>\n); ","import React from 'react';\n\ninterface TitleProps {\n title: string;\n}\n\nexport const Title: React.FC<TitleProps> = ({ title }) => (\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-4\">\n <h2 className=\"text-white text-xl font-semibold\">{title}</h2>\n </div>\n); ","import React, { useEffect } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { useQuery } from '@tanstack/react-query';\nimport { Player } from './Player';\nimport type { PlayerProps } from './types';\nimport { fetchVideoData, type VideoData } from './api';\nimport { Loading, ErrorScreen, Title } from './components';\n\n// Import helper functions\nimport { findHLSPlaylist, getErrorType } from './helper';\nimport useMessages, { type Translations } from './messages/useMessages';\n\nexport interface VideoProps extends Omit<PlayerProps, 'src'> {\n videoId?: string;\n publicKey?: string;\n videoData?: VideoData;\n refetchInterval?: number;\n playerName?: string;\n locale?: string;\n events?: {\n onVideoData?: (video: VideoData) => void;\n onEmptyPlaylists?: () => void;\n onError?: (error: Error) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n onPlayerReady?: () => void;\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n };\n children?: React.ReactNode;\n className?: string;\n auth?: {\n mottoToken?: string;\n userId?: string;\n };\n settings?: {\n backgroundImageUrl?: string;\n };\n // TanStack Query options\n queryOptions?: {\n enabled?: boolean;\n staleTime?: number;\n cacheTime?: number;\n retry?: number;\n retryDelay?: number;\n };\n adsEnabled?: boolean;\n}\n\nexport const Video: React.FC<VideoProps> = ({\n videoId,\n publicKey,\n videoData: providedVideoData,\n refetchInterval = 0,\n playerName,\n locale = 'en',\n events,\n children,\n className,\n auth,\n settings,\n queryOptions = {},\n adsEnabled = false,\n ...props\n}) => {\n // Use TanStack Query for data fetching\n const {\n data,\n isLoading,\n error,\n refetch\n } = useQuery<VideoData>({\n queryKey: ['video', videoId, publicKey, auth?.mottoToken, adsEnabled, locale],\n queryFn: () => fetchVideoData(videoId!, publicKey!, auth?.mottoToken, adsEnabled, locale),\n enabled: !!videoId && !!publicKey && !providedVideoData,\n refetchInterval: refetchInterval > 0 ? refetchInterval : false,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000, // 10 minutes (was cacheTime in v4)\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const video = providedVideoData || data;\n const { t } = useMessages(locale);\n \n // Find HLS playlist using helper function\n const activePlaylist = findHLSPlaylist(video);\n const activePlaylistUrl = (\n activePlaylist?.url ??\n activePlaylist?.drm?.widevine?.playlistUrl ??\n activePlaylist?.drm?.playready?.playlistUrl ??\n activePlaylist?.drm?.fairplay?.playlistUrl);\n const activePlaylistHasUrl = !!activePlaylistUrl;\n\n // Notify parent of video data\n useEffect(() => {\n if (events?.onVideoData && video) {\n events.onVideoData(video);\n }\n }, [video, events]);\n\n // Loading state\n if (isLoading || (!providedVideoData && !video)) {\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Handle empty playlists\n if (!isLoading && video && !activePlaylistHasUrl && events?.onEmptyPlaylists) {\n events.onEmptyPlaylists();\n }\n\n // Error state\n if (error || video?.error) {\n const errorKey = video?.error ? getErrorType(undefined, video) : 'API_ERROR';\n const errorObj = error || new Error(video?.error || 'Unknown error');\n \n if (events?.onError) {\n events.onError(errorObj);\n }\n\n // Use localized error messages\n const title = t(errorKey as keyof Translations) || t('DEFAULT_ERROR');\n const description = t(`${errorKey}_DESCRIPTION` as keyof Translations) || t('DEFAULT_ERROR_DESCRIPTION');\n\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full\">\n <ErrorScreen\n title={title}\n description={description}\n />\n {children}\n </div>\n </div>\n );\n }\n\n // No playable source or missing playlist\n if (!activePlaylist || !activePlaylistHasUrl) {\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full bg-[#151515]\">\n <Title title={video?.name || \"\"} />\n {children}\n </div>\n </div>\n );\n }\n\n // Render video player with source\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full\">\n <Player\n {...props}\n src={activePlaylist}\n managedMode={true}\n className={twMerge(\"video-player-container\", className)}\n events={events}\n locale={locale}\n containerClassName=\"w-full h-full\"\n publicKey={publicKey}\n auth={auth}\n {...(adsEnabled && video?.ad?.adTagUrl ? { imaConfig: { adTagUrl: video?.ad?.adTagUrl } } : {})}\n >\n {children}\n </Player>\n </div>\n </div>\n );\n}; ","export interface VideoData {\n id: string;\n name?: string;\n description?: string;\n playlists?: Playlist[];\n error?: string;\n ad?: {\n adTagUrl?: string;\n };\n}\n\nexport interface DVRSettings {\n window_size_seconds: number;\n}\n\nexport interface Widevine {\n playlistUrl: string;\n licenseUrl: string;\n}\n\nexport interface Fairplay {\n certificateUrl: string;\n licenseUrl: string;\n playlistUrl: string;\n}\n\nexport interface Playready {\n playlistUrl: string;\n licenseUrl: string;\n}\n\nexport interface DRM {\n token?: string;\n licenseCacheKey?: string;\n widevine?: Widevine;\n fairplay?: Fairplay;\n playready?: Playready;\n}\n\nexport interface Playlist {\n id: string;\n url: string;\n format: string;\n dvr_settings?: DVRSettings;\n drm: DRM;\n};\n\n/**\n * Fetches video data from the Motto Streaming API\n * @param videoId - The ID of the video to fetch\n * @param publicKey - The public key for authentication\n * @param mottoToken - Optional motto token for authenticated requests\n * @param adsEnabled - Optional flag to enable ads\n * @param locale - Optional locale for localization\n * @returns Promise<VideoData> - The video data\n */\nexport const fetchVideoData = async (\n videoId: string, \n publicKey: string, \n mottoToken?: string,\n adsEnabled: boolean = false,\n locale: string = 'en'\n): Promise<VideoData> => {\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.streaming.video.v1.VideoService/GetVideo\";\n const url = new URL(endpoint);\n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify({ videoId, enable_ads: adsEnabled, locale }));\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n ...(Boolean(mottoToken) && { 'x-motto-token': mottoToken })\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch video: ${response.statusText}`);\n }\n\n const data = await response.json() as { video: VideoData };\n return data.video;\n};\n\n/**\n * Fetches multiple videos data from the Motto Streaming API\n * @param publicKey - The public key for authentication\n * @param videoIds - Array of video IDs to fetch\n * @param mottoToken - Optional motto token for authenticated requests\n * @returns Promise<VideoData[]> - Array of video data\n */\nexport async function fetchVideosList(\n publicKey: string,\n videoIds: string[],\n mottoToken?: string,\n skip: number = 0,\n limit: number = 0,\n adsEnabled: boolean = true,\n locale: string = 'en'\n): Promise<VideoData[]> {\n if (!videoIds || videoIds.length === 0) {\n return [];\n }\n\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.streaming.video.v1.VideoService/BatchGetVideos\";\n const url = new URL(endpoint);\n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify({ videoIds, enable_ads: adsEnabled, locale }));\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n ...(Boolean(mottoToken) && { 'x-motto-token': mottoToken })\n },\n }).catch((err) => {\n throw new Error(`Failed to fetch videos: ${err}`);\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch videos list: ${response.status}`);\n }\n\n const data = (await response.json()) as { videos: VideoData[] };\n return data.videos;\n} ","export interface EventData {\n id: string;\n title: string;\n description?: string;\n startTime: string;\n endTime?: string;\n posterUrl?: string;\n videoIds?: string[];\n error?: string;\n}\n\n\n\nexport enum EventsSortDirection {\n ASC = 'asc',\n DESC = 'desc'\n}\n\nexport async function fetchEventData(\n publicKey: string,\n eventId: string,\n unused?: any,\n filter?: string,\n order?: EventsSortDirection,\n locale?: string\n): Promise<EventData> {\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.cms.event.v1.EventService/GetEvent\";\n const url = new URL(endpoint);\n \n // Build the message object\n const message: any = { eventId };\n if (locale?.length) message.locale = locale;\n if (filter) message.filter = filter;\n if (order) message.order = order;\n \n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify(message));\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n },\n }).catch((err) => {\n throw new Error(`Failed to fetch event: ${err}`);\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch event data: ${response.status}`);\n }\n\n const data = (await response.json()) as { event: EventData };\n return data.event;\n}\n\n ","export interface CreativeWorkData {\n id: string;\n title: string;\n description?: string;\n releaseTime: string;\n endTime?: string;\n posterUrl?: string;\n videoIds?: string[];\n error?: string;\n}\n\nexport enum CreativeWorksSortDirection {\n ASC = 'asc',\n DESC = 'desc'\n}\n\nexport async function fetchCreativeWorkData(\n publicKey: string,\n creativeWorkId: string,\n unused?: any,\n filter?: string,\n order?: CreativeWorksSortDirection,\n locale?: string\n): Promise<CreativeWorkData> {\n const endpoint = \"https://cda.mottostreaming.com/motto.cda.cms.creative_work.v1.CreativeWorkService/GetCreativeWork\";\n const url = new URL(endpoint);\n \n // Build the message object\n const message: any = { creativeWorkId };\n if (locale?.length) message.locale = locale;\n if (filter) message.filter = filter;\n if (order) message.order = order;\n \n url.searchParams.set(\"encoding\", \"json\");\n url.searchParams.set(\"message\", JSON.stringify(message));\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${publicKey}`,\n },\n }).catch((err) => {\n throw new Error(`Failed to fetch creative work: ${err}`);\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch creative work data: ${response.status}`);\n }\n\n const data = (await response.json()) as { creativeWork: CreativeWorkData };\n return data.creativeWork;\n} ","import type { Playlist, VideoData } from './api';\n\nconst defaultError = {\n title: \"Playback Error\",\n description: \"Unable to play the video. Please try again later.\",\n};\n\nexport const errorTypes: Record<\n \"api\" | \"default\" | string,\n {\n title: string;\n description: string;\n }\n> = {\n api: {\n title: \"Failed to Retrieve Video Info\",\n description:\n \"Error fetching video details. Check your videoId and internet connection and try again.\",\n },\n ERROR_CODE_NOT_AUTHENTICATED: {\n title: \"Authorisation\",\n description: \"You don't have permission to play this video. \",\n },\n ERROR_CODE_GEO_BLOCKED: {\n title: \"Geoblocking Restriction\",\n description:\n \"Sorry, this video is not available in your region due to geoblocking restrictions.\",\n },\n ERROR_CODE_NOT_ENTITLED: {\n title: \"Not entitled\",\n description: \"Sorry, you are not entitled to play this video.\",\n },\n ERROR_CODE_VPN_BLOCKED: {\n title: \"VPN BLOCKED\",\n description: \"This video is not available due to the use of a VPN.\",\n },\n ERROR_CODE_UNSPECIFIED: defaultError,\n ERROR_CODE_SIGNATURE_MISMATCH: defaultError,\n ERROR_CODE_INVALID_DOMAIN: defaultError,\n default: defaultError,\n};\n\nexport const getMediaTypeFromSource = (\n source: string\n): \"video/mp4\" | \"application/vnd.apple.mpegurl\" | \"video/x-flv\" => {\n if (source.includes(\".mp4\")) {\n return \"video/mp4\";\n }\n if (source.includes(\".m3u8\")) {\n return \"application/vnd.apple.mpegurl\";\n }\n return \"video/x-flv\"; // Default return\n};\n\nexport const getSourceObject = ({\n source,\n}: {\n source: string;\n}): {\n src: string;\n type: string;\n withCredentials: boolean;\n} => {\n const mediaType = getMediaTypeFromSource(source);\n\n return {\n src: source,\n type: mediaType,\n withCredentials: false, // Set to false as per the original comment about CORS issues\n };\n};\n\nexport const formatTime = (seconds = 0): string => {\n const ss = seconds < 0 ? 0 : seconds;\n let s: number | string = Math.floor(ss % 60);\n let m: number | string = Math.floor((ss / 60) % 60);\n let h: number | string = Math.floor(ss / 3600);\n\n if (isNaN(ss) || ss === Infinity) {\n s = \"-\";\n m = \"-\";\n h = \"-\";\n }\n\n h = Number(h) > 0 ? `${h}:` : \"\";\n m = `${Number(m) < 10 ? `0${m}` : m}:`;\n s = Number(s) < 10 ? `0${s}` : s;\n\n return h + m + s;\n};\n\nexport const findHLSPlaylist = (video?: VideoData): Playlist | undefined => {\n return video?.playlists?.find((playlist) => {\n return playlist.format === 'HLS' || \n playlist.format === 'hls' || \n playlist.format === 'PLAYLIST_FORMAT_HLS';\n });\n};\n\nexport const getErrorType = (error?: string | Error, video?: VideoData) => {\n if (video?.error && errorTypes[video.error]) {\n return video.error;\n }\n return 'DEFAULT_ERROR';\n};\n","import { useState, useEffect } from 'react';\n\n// Import JSON files as modules\nimport en from './en.json';\nimport es from './es.json';\nimport ar from './ar.json';\nimport de from './de.json';\nimport fr from './fr.json';\nimport it from './it.json';\nimport ja from './ja.json';\nimport ko from './ko.json';\nimport pt from './pt.json';\nimport ru from './ru.json';\nimport zh from './zh.json';\nimport nl from './nl.json';\nimport fa from './fa.json';\n\n// Define the available languages\nconst availableLanguages = {\n en,\n es,\n ar,\n de,\n fr,\n it,\n ja,\n ko,\n pt,\n ru,\n zh,\n nl,\n fa\n};\n\ntype Language = keyof typeof availableLanguages;\n\n// Base translations type - this represents all possible keys that can exist\nexport type Translations = {\n \"DAYS\": string\n \"HOURS\": string\n \"MINUTES\": string\n \"SECONDS\": string\n \"STARTING_SOON\": string\n \"EVENT_NOT_STARTED\": string\n \"DEFAULT_ERROR\": string\n \"DEFAULT_ERROR_DESCRIPTION\": string\n \"API_ERROR\": string\n \"API_ERROR_DESCRIPTION\": string\n \"ERROR_CODE_NOT_AUTHENTICATED\": string\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": string\n \"ERROR_CODE_GEO_BLOCKED\": string\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": string\n \"ERROR_CODE_NOT_ENTITLED\": string\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": string\n \"ERROR_CODE_VPN_BLOCKED\": string\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": string\n}\n\n// Partial translations type for individual language files (allows missing keys)\ntype PartialTranslations = Partial<Translations>;\n\n// Function to get the browser's language setting\nconst getBrowserLanguage = (): Language => {\n const language = navigator.language.split('-')[0] as Language;\n return availableLanguages[language] ? language : 'en';\n};\n\nconst useMessages = (locale: string) => {\n const [language, setLanguage] = useState<Language>('en');\n const [translations, setTranslations] = useState<PartialTranslations>(availableLanguages.en);\n\n useEffect(() => {\n const lang = !!availableLanguages?.[locale as Language] ? locale as Language : getBrowserLanguage();;\n setLanguage(lang);\n setTranslations(availableLanguages[lang] as PartialTranslations);\n }, [locale]);\n\n // Translation function with English fallback\n const t = (key: keyof Translations): string => {\n // Try current language first\n if (translations[key]) {\n return translations[key];\n }\n \n // Fallback to English if key not found in current language\n if (language !== 'en' && availableLanguages.en[key]) {\n return availableLanguages.en[key];\n }\n \n // Return empty string if not found in either current language or English\n return '';\n };\n\n // Function to change the language manually\n const changeLanguage = (lng: Language) => {\n if (availableLanguages[lng]) {\n setLanguage(lng);\n setTranslations(availableLanguages[lng] as PartialTranslations);\n }\n };\n\n return { t, language, changeLanguage };\n};\n\nexport default useMessages;\n","{\n \"DAYS\": \"days\",\n \"HOURS\": \"hours\",\n \"MINUTES\": \"min\",\n \"SECONDS\": \"sec\",\n \"STARTING_SOON\": \"Starting soon...\",\n \"EVENT_NOT_STARTED\": \"This event has not started...\",\n \"DEFAULT_ERROR\": \"Playback Error\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Unable to play the video. Please try again later.\",\n \"API_ERROR\": \"Failed to Retrieve Video Info\",\n \"API_ERROR_DESCRIPTION\": \"Error fetching video details. Check your videoId and internet connection and try again.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Authorisation\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"You don't have permission to play this video.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Geoblocking Restriction\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Sorry, this video is not available in your region due to geoblocking restrictions.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Not entitled\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Sorry, you are not entitled to play this video.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOCKED\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"This video is not available due to the use of a VPN.\"\n}\n","{\n \"DAYS\": \"días\",\n \"HOURS\": \"horas\",\n \"MINUTES\": \"min\",\n \"SECONDS\": \"seg\",\n \"STARTING_SOON\": \"En instantes...\",\n \"EVENT_NOT_STARTED\": \"Este evento aún no ha comenzado...\",\n \"DEFAULT_ERROR\": \"Error de reproducción\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"No se puede reproducir el video. Por favor, inténtelo de nuevo más tarde.\",\n \"API_ERROR\": \"Error al recuperar información del video\",\n \"API_ERROR_DESCRIPTION\": \"Error al obtener detalles del video. Verifique su videoId y conexión a internet e inténtelo de nuevo.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorización\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"No tienes permiso para reproducir este video.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restricción geográfica\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Lo siento, este video no está disponible en tu región debido a restricciones geográficas.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"No autorizado\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Lo siento, no estás autorizado para reproducir este video.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOQUEADO\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Este video no está disponible debido al uso de una VPN.\"\n}\n ","{\n \"DAYS\": \"أيام\",\n \"HOURS\": \"ساعات\",\n \"MINUTES\": \"دقائق\",\n \"SECONDS\": \"ثواني\",\n \"STARTING_SOON\": \"يبدأ قريبا...\",\n \"EVENT_NOT_STARTED\": \"هذا الحدث لم يبدأ بعد...\",\n \"DEFAULT_ERROR\": \"خطأ في التشغيل\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"غير قادر على تشغيل الفيديو. يرجى المحاولة مرة أخرى لاحقًا.\",\n \"API_ERROR\": \"فشل في استرجاع معلومات الفيديو\",\n \"API_ERROR_DESCRIPTION\": \"خطأ في جلب تفاصيل الفيديو. تحقق من معرف الفيديو واتصال الإنترنت وحاول مرة أخرى.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"تفويض\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"ليس لديك إذن لتشغيل هذا الفيديو.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"قيود الجغرافيا\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"عذرًا، هذا الفيديو غير متاح في منطقتك بسبب قيود الجغرافيا.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"غير مخول\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"عذرًا، ليس لديك الحق في تشغيل هذا الفيديو.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"تم حظر VPN\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"هذا الفيديو غير متاح بسبب استخدام VPN.\"\n}","{\n \"DAYS\": \"Tage\",\n \"HOURS\": \"Stunden\",\n \"MINUTES\": \"Min\",\n \"SECONDS\": \"Sek\",\n \"STARTING_SOON\": \"Beginnt bald...\",\n \"DEFAULT_ERROR\": \"Wiedergabefehler\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Das Video kann nicht abgespielt werden. Bitte versuchen Sie es später erneut.\",\n \"API_ERROR\": \"Fehler beim Abrufen der Videoinformationen\",\n \"API_ERROR_DESCRIPTION\": \"Fehler beim Abrufen der Videodetails. Überprüfen Sie Ihre videoId und Internetverbindung und versuchen Sie es erneut.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorisierung\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Sie haben keine Berechtigung, dieses Video abzuspielen.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Geoblocking-Beschränkung\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Entschuldigung, dieses Video ist in Ihrer Region aufgrund von Geoblocking-Beschränkungen nicht verfügbar.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Nicht berechtigt\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Entschuldigung, Sie sind nicht berechtigt, dieses Video abzuspielen.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOCKIERT\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Dieses Video ist aufgrund der Verwendung eines VPN nicht verfügbar.\"\n}\n ","{\n \"DAYS\": \"jours\",\n \"HOURS\": \"heures\",\n \"MINUTES\": \"minutes\",\n \"SECONDS\": \"secondes\",\n \"STARTING_SOON\": \"Commence bientôt...\",\n \"EVENT_NOT_STARTED\": \"Cet événement n'a pas commencé...\",\n \"DEFAULT_ERROR\": \"Erreur de lecture\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Impossible de lire la vidéo. Veuillez réessayer plus tard.\",\n \"API_ERROR\": \"Échec de la récupération des informations vidéo\",\n \"API_ERROR_DESCRIPTION\": \"Erreur lors de la récupération des détails de la vidéo. Vérifiez votre videoId et votre connexion Internet, puis réessayez.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorisation\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Vous n'avez pas la permission de lire cette vidéo.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restriction de géoblocage\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Désolé, cette vidéo n'est pas disponible dans votre région en raison de restrictions de géoblocage.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Non autorisé\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Désolé, vous n'êtes pas autorisé à lire cette vidéo.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOQUÉ\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Cette vidéo n'est pas disponible en raison de l'utilisation d'un VPN.\"\n}","{\n \"DAYS\": \"giorni\",\n \"HOURS\": \"ore\",\n \"MINUTES\": \"minuti\",\n \"SECONDS\": \"secondi\",\n \"STARTING_SOON\": \"Inizia presto...\",\n \"DEFAULT_ERROR\": \"Errore di riproduzione\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Impossibile riprodurre il video. Per favore riprova più tardi.\",\n \"API_ERROR\": \"Errore nel recupero delle informazioni video\",\n \"API_ERROR_DESCRIPTION\": \"Errore nel recupero dei dettagli del video. Controlla il tuo videoId e la connessione internet e riprova.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorizzazione\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Non hai il permesso di riprodurre questo video.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restrizione geoblocking\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Spiacenti, questo video non è disponibile nella tua regione a causa di restrizioni geografiche.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Non autorizzato\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Spiacenti, non sei autorizzato a riprodurre questo video.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOCCATA\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Questo video non è disponibile a causa dell'uso di una VPN.\"\n}\n","{\n \"DAYS\": \"日\",\n \"HOURS\": \"時間\",\n \"MINUTES\": \"分\",\n \"SECONDS\": \"秒\",\n \"STARTING_SOON\": \"まもなく開始...\",\n \"DEFAULT_ERROR\": \"再生エラー\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"ビデオを再生できません。後でもう一度お試しください。\",\n \"API_ERROR\": \"ビデオ情報の取得に失敗しました\",\n \"API_ERROR_DESCRIPTION\": \"ビデオの詳細を取得中にエラーが発生しました。videoIdとインターネット接続を確認して、もう一度お試しください。\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"認証\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"このビデオを再生する権限がありません。\",\n \"ERROR_CODE_GEO_BLOCKED\": \"地域制限\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"申し訳ありませんが、地域制限のためこのビデオはご利用いただけません。\",\n \"ERROR_CODE_NOT_ENTITLED\": \"権利なし\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"申し訳ありませんが、このビデオを再生する権利がありません。\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPNブロック\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"VPNの使用により、このビデオはご利用いただけません。\"\n}","{\n \"DAYS\": \"일\",\n \"HOURS\": \"시간\",\n \"MINUTES\": \"분\",\n \"SECONDS\": \"초\",\n \"STARTING_SOON\": \"곧 시작...\",\n \"DEFAULT_ERROR\": \"재생 오류\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"비디오를 재생할 수 없습니다. 나중에 다시 시도해 주세요.\",\n \"API_ERROR\": \"비디오 정보 가져오기 실패\",\n \"API_ERROR_DESCRIPTION\": \"비디오 세부 정보를 가져오는 중 오류가 발생했습니다. videoId와 인터넷 연결을 확인하고 다시 시도해 주세요.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"인증\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"이 비디오를 재생할 권한이 없습니다.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"지역 제한\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"죄송합니다. 이 비디오는 지역 제한으로 인해 귀하의 지역에서 사용할 수 없습니다.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"권한 없음\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"죄송합니다. 이 비디오를 재생할 권한이 없습니다.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN 차단됨\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"VPN 사용으로 인해 이 비디오를 사용할 수 없습니다.\"\n}","{\n \"DAYS\": \"dias\",\n \"HOURS\": \"horas\",\n \"MINUTES\": \"minutos\",\n \"SECONDS\": \"segundos\",\n \"STARTING_SOON\": \"Começando em breve...\",\n \"DEFAULT_ERROR\": \"Playback Error\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Não foi possível reproduzir o vídeo. Por favor, tente novamente mais tarde.\",\n \"API_ERROR\": \"Falha ao Recuperar Informações do Vídeo\",\n \"API_ERROR_DESCRIPTION\": \"Erro ao buscar detalhes do vídeo. Verifique seu videoId e conexão com a internet e tente novamente.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorização\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"Você não tem permissão para reproduzir este vídeo.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Restrição de Geoblocking\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Desculpe, este vídeo não está disponível em sua região devido a restrições de geoblocking.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Não autorizado\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Desculpe, você não está autorizado a reproduzir este vídeo.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN BLOQUEADO\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Este vídeo não está disponível devido ao uso de uma VPN.\"\n}","{\n \"DAYS\": \"дней\",\n \"HOURS\": \"часов\",\n \"MINUTES\": \"мин\",\n \"SECONDS\": \"сек\",\n \"STARTING_SOON\": \"Скоро начнется...\",\n \"DEFAULT_ERROR\": \"Ошибка воспроизведения\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Не удалось воспроизвести видео. Пожалуйста, попробуйте позже.\",\n \"API_ERROR\": \"Не удалось получить информацию о видео\",\n \"API_ERROR_DESCRIPTION\": \"Ошибка при получении деталей видео. Проверьте ваш videoId и подключение к интернету, затем попробуйте снова.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Авторизация\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"У вас нет разрешения на воспроизведение этого видео.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Географическое ограничение\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Извините, это видео недоступно в вашем регионе из-за географических ограничений.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Нет прав\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Извините, у вас нет прав на воспроизведение этого видео.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN заблокирован\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Это видео недоступно из-за использования VPN.\"\n}","{\n \"DAYS\": \"天\",\n \"HOURS\": \"小时\",\n \"MINUTES\": \"分钟\",\n \"SECONDS\": \"秒\",\n \"STARTING_SOON\": \"即将开始...\",\n \"DEFAULT_ERROR\": \"播放错误\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"无法播放视频。请稍后再试。\",\n \"API_ERROR\": \"获取视频信息失败\",\n \"API_ERROR_DESCRIPTION\": \"获取视频详情时出错。请检查您的视频ID和互联网连接,然后重试。\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"授权\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"您没有权限播放此视频。\",\n \"ERROR_CODE_GEO_BLOCKED\": \"地理封锁限制\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"抱歉,由于地理封锁限制,此视频在您的地区不可用。\",\n \"ERROR_CODE_NOT_ENTITLED\": \"无权播放\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"抱歉,您无权播放此视频。\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN被封锁\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"由于使用VPN,此视频不可用。\"\n}\n ","{\n \"DAYS\": \"dagen\",\n \"HOURS\": \"uren\",\n \"MINUTES\": \"min\",\n \"SECONDS\": \"sec\",\n \"STARTING_SOON\": \"Begint binnenkort...\",\n \"EVENT_NOT_STARTED\": \"Dit evenement is nog niet begonnen...\",\n \"DEFAULT_ERROR\": \"Afspelfout\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"Kan de video niet afspelen. Probeer het later opnieuw.\",\n \"API_ERROR\": \"Kan videogegevens niet ophalen\",\n \"API_ERROR_DESCRIPTION\": \"Fout bij het ophalen van videogegevens. Controleer uw video-ID en internetverbinding en probeer het opnieuw.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"Autorisatie\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"U heeft geen toestemming om deze video af te spelen.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"Geoblocking Beperking\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"Sorry, deze video is niet beschikbaar in uw regio vanwege geoblocking beperkingen.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"Geen recht\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"Sorry, u heeft geen recht om deze video af te spelen.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"VPN GEBLOKKEERD\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"Deze video is niet beschikbaar vanwege het gebruik van een VPN.\"\n}\n","{\n \"DAYS\": \"روزها\",\n \"HOURS\": \"ساعت‌ها\",\n \"MINUTES\": \"دقیقه‌ها\",\n \"SECONDS\": \"ثانیه‌ها\",\n \"STARTING_SOON\": \"به زودی شروع می‌شود...\",\n \"EVENT_NOT_STARTED\": \"این رویداد هنوز شروع نشده است...\",\n \"DEFAULT_ERROR\": \"خطای پخش\",\n \"DEFAULT_ERROR_DESCRIPTION\": \"امکان پخش ویدیو وجود ندارد. لطفاً بعداً دوباره تلاش کنید.\",\n \"API_ERROR\": \"خطا در بازیابی اطلاعات ویدیو\",\n \"API_ERROR_DESCRIPTION\": \"خطا در دریافت جزئیات ویدیو. ویدیوId و اتصال اینترنت خود را بررسی کرده و دوباره تلاش کنید.\",\n \"ERROR_CODE_NOT_AUTHENTICATED\": \"مجوز\",\n \"ERROR_CODE_NOT_AUTHENTICATED_DESCRIPTION\": \"شما اجازه پخش این ویدیو را ندارید.\",\n \"ERROR_CODE_GEO_BLOCKED\": \"محدودیت جغرافیایی\",\n \"ERROR_CODE_GEO_BLOCKED_DESCRIPTION\": \"متاسفیم، این ویدیو به دلیل محدودیت‌های جغرافیایی در منطقه شما در دسترس نیست.\",\n \"ERROR_CODE_NOT_ENTITLED\": \"عدم دسترسی\",\n \"ERROR_CODE_NOT_ENTITLED_DESCRIPTION\": \"متاسفیم، شما اجازه پخش این ویدیو را ندارید.\",\n \"ERROR_CODE_VPN_BLOCKED\": \"مسدود شدن VPN\",\n \"ERROR_CODE_VPN_BLOCKED_DESCRIPTION\": \"این ویدیو به دلیل استفاده از VPN در دسترس نیست.\"\n}","import React, { CSSProperties, useCallback, useEffect, useRef, useState } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { useQuery } from '@tanstack/react-query';\nimport { Player } from './Player';\nimport type { PlayerProps } from './types';\nimport { fetchEventData, type EventData, EventsSortDirection } from './api/event';\nimport { fetchVideosList, Playlist, type VideoData } from './api/video';\nimport { Loading, ErrorScreen } from './components';\nimport { findHLSPlaylist } from './helper';\nimport useMessages, { type Translations } from './messages/useMessages';\n\n\nexport interface EventProps extends Omit<PlayerProps, 'src' | 'drmConfig'> {\n publicKey: string;\n eventId: string;\n hideTitle?: boolean;\n locale?: string;\n filter?: string;\n order?: EventsSortDirection;\n events?: {\n onEventData?: (event: EventData) => void;\n onVideoData?: (video: VideoData) => void;\n onEmptyPlaylists?: () => void;\n onError?: (error: Error) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n onPlayerReady?: () => void;\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n };\n className?: string;\n settings?: {\n backgroundImageUrl?: string;\n showCountdownAnimation?: boolean;\n };\n auth?: {\n mottoToken?: string;\n userId?: string;\n };\n // TanStack Query options\n queryOptions?: {\n enabled?: boolean;\n staleTime?: number;\n cacheTime?: number;\n retry?: number;\n retryDelay?: number;\n };\n adsEnabled?: boolean;\n}\n\nexport const Event: React.FC<EventProps> = ({\n publicKey,\n eventId,\n events,\n hideTitle,\n locale = 'en',\n order,\n filter,\n className,\n settings,\n auth,\n queryOptions = {},\n adsEnabled = false,\n ...props\n}) => {\n // Event data fetching\n const {\n data: eventData,\n isLoading: isEventLoading,\n error: eventError\n } = useQuery<EventData>({\n queryKey: ['event', publicKey, eventId, filter, order, locale],\n queryFn: () => fetchEventData(publicKey, eventId, undefined, filter, order, locale),\n enabled: !!publicKey && !!eventId,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000, // 10 minutes\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [activePlaylist, setActivePlaylist] = useState<Playlist | null>();\n const [activeVideoId, setActiveVideoId] = useState<string | null>();\n const videoIds = eventData?.videoIds ?? [];\n // Videos list fetching\n const {\n data: videosData,\n isLoading: videosIsLoading,\n error: videosError, \n } = useQuery<VideoData[]>({\n queryKey: ['videos-list', publicKey, videoIds, auth?.mottoToken, adsEnabled, locale],\n queryFn: () => fetchVideosList(publicKey, videoIds, auth?.mottoToken, 0, 0, adsEnabled, locale),\n enabled: !!publicKey && videoIds.length > 0,\n refetchInterval: activePlaylist === null ? 30000 : false,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000,\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000,\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [loadingApisState, setLoadingApisState] = useState(true);\n\n // Process videos data to find active playlist\n useEffect(() => {\n if (videosData !== undefined) {\n setLoadingApisState(false);\n\n const videosWithPlaylists = videosData.filter(\n (video) => video.playlists && video.playlists.length > 0\n );\n\n if (videosWithPlaylists.length > 0) {\n let hlsPlaylistFound = false;\n // Iterate to find the first HLS playlist\n for (const video of videosWithPlaylists) {\n const activePlaylist = findHLSPlaylist(video);\n const activePlaylistUrl = (\n activePlaylist?.url ??\n activePlaylist?.drm?.widevine?.playlistUrl ??\n activePlaylist?.drm?.playready?.playlistUrl ??\n activePlaylist?.drm?.fairplay?.playlistUrl);\n const activePlaylistHasUrl = !!activePlaylistUrl;\n\n if (activePlaylist && activePlaylistHasUrl) {\n setActivePlaylist(activePlaylist);\n setActiveVideoId(video.id);\n hlsPlaylistFound = true;\n break;\n }\n }\n if (!hlsPlaylistFound) {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else if (eventData && (!eventData.videoIds || eventData.videoIds.length === 0)) {\n setLoadingApisState(false);\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n }, [videosData, eventData]);\n \n const { t } = useMessages(locale);\n\n // Notify parent of event data\n useEffect(() => {\n if (events?.onEventData && eventData) {\n events.onEventData(eventData);\n }\n }, [eventData, events]);\n\n // Notify parent of video data\n useEffect(() => {\n if (events?.onVideoData && activeVideoId && videosData) {\n const activeVideo = videosData.find((video) => video.id === activeVideoId);\n if (activeVideo) {\n events.onVideoData(activeVideo);\n }\n }\n }, [activeVideoId, videosData, events]);\n\n // All state and hooks must be defined before any conditional returns\n const [error, setError] = useState<Error | null>(null);\n const [loadingPlaylist, setLoadingPlaylist] = useState(true);\n const videosDataError = videosData?.some((video) => !!video.error);\n\n // Error handling\n useEffect(() => {\n // Defer error evaluation until loading states settle to avoid flashing error\n if (isEventLoading || videosIsLoading || loadingApisState) {\n return;\n }\n\n const hasPlayablePlaylist = Boolean(activePlaylist);\n\n if (eventError || videosError || (videosDataError && !hasPlayablePlaylist)) {\n const firstVideoError = videosData?.find((video) => !!video.error)?.error;\n const errorObj =\n eventError ||\n videosError ||\n (firstVideoError && new Error(firstVideoError)) ||\n new Error('default');\n\n setError(errorObj);\n if (events?.onError) {\n events.onError(errorObj);\n }\n } else {\n setError(null);\n }\n }, [\n eventError,\n videosError,\n videosDataError,\n videosData,\n events,\n activePlaylist,\n isEventLoading,\n videosIsLoading,\n loadingApisState\n ]);\n \n // Loading state management\n useEffect(() => {\n const eventLoadedWithNoVideos =\n !isEventLoading &&\n eventData &&\n eventData.videoIds &&\n (!eventData.videoIds || eventData?.videoIds?.length === 0) &&\n !loadingApisState;\n\n const allApisLoadedWithPotentialVideos =\n !isEventLoading &&\n !videosIsLoading &&\n eventData &&\n !loadingApisState;\n\n if (eventLoadedWithNoVideos || allApisLoadedWithPotentialVideos) {\n setLoadingPlaylist(false);\n }\n }, [isEventLoading, videosIsLoading, eventData, loadingApisState]);\n\n \n // Error state\n if (error) {\n const title = t(error.message as keyof Translations)?.length ? \n t(error.message as keyof Translations) : t(\"DEFAULT_ERROR\"); \n const description = t(`${error.message}_DESCRIPTION` as keyof Translations)?.length ? \n t(`${error.message}_DESCRIPTION` as keyof Translations) : t(\"DEFAULT_ERROR_DESCRIPTION\");\n\n return (\n <div className={twMerge(\"md:rounded-2xl overflow-hidden aspect-video\", className)}>\n <div className=\"relative w-full h-full\">\n <ErrorScreen\n title={title}\n description={description}\n />\n </div>\n </div>\n );\n }\n \n // Handle empty playlists\n if (!loadingPlaylist && eventData && !activePlaylist && events?.onEmptyPlaylists) {\n events.onEmptyPlaylists();\n }\n\n // Loading state\n if (loadingPlaylist) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full aspect-video bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Active video player\n if (activePlaylist && activeVideoId && videosData ) {\n const activeVideo = videosData.find((video) => video.id === activeVideoId);\n console.log('activeVideo?.ad?.adTagUrl', activeVideo?.ad?.adTagUrl );\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <Player\n {...props}\n src={activePlaylist}\n managedMode={true}\n className={twMerge(className, \"peer aspect-video\")}\n events={events}\n locale={locale}\n containerClassName=\"w-full h-full\"\n publicKey={publicKey}\n auth={auth}\n {...(adsEnabled && activeVideo ? { imaConfig: { adTagUrl: activeVideo?.ad?.adTagUrl } } : {})}\n />\n </div>\n {!hideTitle && eventData && (\n <TitleAndDescription \n title={eventData.title} \n description={eventData.description || ''} \n startTime={eventData.startTime} \n locale={locale} \n />\n )}\n </div>\n );\n }\n\n // Pre-event countdown\n if (eventData) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <PreEvent \n event={eventData} \n hideTitle={hideTitle} \n locale={locale} \n backgroundImageUrl={settings?.backgroundImageUrl} \n showAnimation={settings?.showCountdownAnimation} \n />\n </div>\n </div>\n );\n }\n\n return null;\n};\n\n// Pre-event countdown component\nfunction PreEvent({ \n event, \n locale = 'en', \n hideTitle, \n backgroundImageUrl, \n showAnimation = true \n}: { \n event: EventData; \n locale?: string; \n hideTitle?: boolean; \n backgroundImageUrl?: string; \n showAnimation?: boolean;\n}): JSX.Element {\n const date = new Date(event.startTime);\n const now = new Date();\n const [remainingTime, setRemainingTime] = useState(\n date.getTime() - now.getTime()\n );\n const shouldBeStarted = remainingTime < 0;\n const { t } = useMessages(locale);\n useEffect(() => {\n const interval = setInterval(() => {\n if (remainingTime < 0) {\n clearInterval(interval);\n } else {\n setRemainingTime(date.getTime() - new Date().getTime());\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [date, remainingTime]);\n\n const renderCountdown = useCallback(() => {\n if (shouldBeStarted) {\n return <span className=\"text-base-content text-xl\">{t(\"EVENT_NOT_STARTED\")}</span>;\n }\n\n const seconds = Math.floor(remainingTime / 1000) % 60;\n const minutes = Math.floor(remainingTime / 1000 / 60) % 60;\n const hours = Math.floor(remainingTime / 1000 / 60 / 60) % 24;\n const days = Math.floor(remainingTime / 1000 / 60 / 60 / 24);\n\n return (\n <div className=\"grid grid-flow-col gap-1 md:gap-5 text-center auto-cols-max\">\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"font-mono text-lg md:text-5xl\">\n <span \n aria-live=\"polite\" \n aria-label={days.toString()}\n >\n {days.toString()}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"DAYS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": hours } as CSSProperties} \n aria-live=\"polite\" \n aria-label={hours.toString()}\n >\n {hours?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"HOURS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": minutes } as CSSProperties} \n aria-live=\"polite\" \n aria-label={minutes.toString()}\n >\n {minutes?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"MINUTES\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": seconds } as CSSProperties} \n aria-live=\"polite\" \n aria-label={seconds.toString()}\n >\n {seconds?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"SECONDS\")}</span>\n </div>\n </div>\n );\n }, [remainingTime, shouldBeStarted, t]);\n\n return (\n <>\n {event?.posterUrl ? (\n <>\n <div \n className=\"relative overflow-hidden bg-base-200 aspect-video text-base-content w-full h-full flex justify-center items-center flex-col bg-no-repeat bg-cover md:rounded-2xl\" \n style={{ \n backgroundImage: `url(${event.posterUrl})`, \n backgroundRepeat: 'no-repeat', \n backgroundSize: 'cover' \n }}\n >\n {/* <div className=\"absolute inset-0 bg-black bg-opacity-40\"></div> */}\n <div className=\"relative z-10\">\n {renderCountdown()}\n </div>\n </div>\n {!hideTitle && (\n <TitleAndDescription \n title={event.title} \n description={event.description || ''} \n startTime={event.startTime} \n locale={locale} \n />\n )}\n </>\n ) : (\n <>\n <div \n className=\"relative overflow-hidden md:rounded-2xl bg-base-200 aspect-video text-base-content flex flex-col justify-center items-center w-full h-full bg-cover bg-center bg-no-repeat\" \n style={{\n backgroundImage: backgroundImageUrl ? `url(${backgroundImageUrl})` : '',\n }}\n >\n {/* {backgroundImageUrl && <div className=\"absolute inset-0 bg-black bg-opacity-40\"></div>} */}\n <div className=\"relative z-10\">\n {renderCountdown()}\n </div>\n </div>\n {!hideTitle && (\n <TitleAndDescription \n title={event.title} \n description={event.description || ''} \n startTime={event.startTime} \n locale={locale} \n />\n )}\n </>\n )}\n </>\n );\n}\n\n// Title and description component\nconst TitleAndDescription = ({ \n title, \n description, \n startTime, \n locale = 'en', \n className \n}: { \n title: string; \n description: string; \n startTime: string; \n locale?: string; \n className?: string;\n}) => {\n return (\n <div className={twMerge(\"mt-3 mb-6 m-event-details-ctn px-4 text-left w-full\", className)}>\n <div className=\"text-base md:text-xl m-event-title text-base-content font-medium\">{title}</div>\n {startTime ? (\n <div className=\"text-xs md:text-base text-base-content/70 m-event-start-time\">\n {new Date(startTime || \"\").toLocaleDateString(locale || \"default\", {\n month: \"long\",\n year: \"numeric\",\n day: \"numeric\",\n })}{\" \"}\n - {new Date(startTime || \"\").toLocaleTimeString(locale || \"default\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </div>\n ) : null}\n {description && (\n <div className=\"text-xs md:text-xs text-base-content/60 uppercase\">{description}</div>\n )}\n </div>\n );\n}; ","import React, { CSSProperties, useEffect, useState } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { useQuery } from '@tanstack/react-query';\nimport { Player } from './Player';\nimport type { PlayerProps } from './types';\nimport { fetchCreativeWorkData, type CreativeWorkData, CreativeWorksSortDirection } from './api/creative-work';\nimport { fetchVideosList, Playlist, type VideoData } from './api/video';\nimport { Loading, ErrorScreen } from './components';\nimport { findHLSPlaylist } from './helper';\nimport useMessages, { type Translations } from './messages/useMessages';\n\nexport interface CreativeWorkProps extends Omit<PlayerProps, 'src'> {\n publicKey: string;\n creativeWorkId: string;\n hideTitle?: boolean;\n locale?: string;\n filter?: string;\n order?: CreativeWorksSortDirection;\n events?: {\n onCreativeWorkData?: (creativeWork: CreativeWorkData) => void;\n onVideoData?: (video: VideoData) => void;\n onEmptyPlaylists?: () => void;\n onError?: (error: Error) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoadStart?: () => void;\n onCanPlay?: () => void;\n onPlayerReady?: () => void;\n onAdStart?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n onAdPaused?: () => void;\n onAdResumed?: () => void;\n onAdProgress?: (adProgressData: any) => void;\n onAllAdsCompleted?: () => void;\n };\n className?: string;\n settings?: {\n backgroundImageUrl?: string;\n showCountdownAnimation?: boolean;\n };\n auth?: {\n mottoToken?: string;\n userId?: string;\n };\n // TanStack Query options\n queryOptions?: {\n enabled?: boolean;\n staleTime?: number;\n cacheTime?: number;\n retry?: number;\n retryDelay?: number;\n };\n adsEnabled?: boolean;\n}\n\nexport const CreativeWork: React.FC<CreativeWorkProps> = ({\n publicKey,\n creativeWorkId,\n events,\n hideTitle,\n locale = 'en',\n order,\n filter,\n className,\n settings,\n auth,\n queryOptions = {},\n adsEnabled = false,\n ...props\n}) => {\n // CreativeWork data fetching\n const {\n data: creativeWorkData,\n isLoading: isCreativeWorkLoading,\n error: creativeWorkError\n } = useQuery<CreativeWorkData>({\n queryKey: ['creative-work', publicKey, creativeWorkId, filter, order, locale],\n queryFn: () => fetchCreativeWorkData(publicKey, creativeWorkId, undefined, filter, order, locale),\n enabled: !!publicKey && !!creativeWorkId,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000, // 10 minutes\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [activePlaylist, setActivePlaylist] = useState<Playlist | null>();\n const [activeVideoId, setActiveVideoId] = useState<string | null>();\n const [showCountDown, setShowCountDown] = useState(false);\n const videoIds = creativeWorkData?.videoIds ?? [];\n\n // Videos list fetching\n const {\n data: videosData,\n isLoading: videosIsLoading,\n error: videosError, \n } = useQuery<VideoData[]>({\n queryKey: ['videos-list', publicKey, videoIds, auth?.mottoToken, adsEnabled, locale],\n queryFn: () => fetchVideosList(publicKey, videoIds, auth?.mottoToken, 0, 0, adsEnabled, locale),\n enabled: !!publicKey && videoIds.length > 0,\n refetchInterval: activePlaylist === null ? 30000 : false,\n staleTime: queryOptions.staleTime ?? 5 * 60 * 1000,\n gcTime: queryOptions.cacheTime ?? 10 * 60 * 1000,\n retry: queryOptions.retry ?? 3,\n retryDelay: queryOptions.retryDelay ?? ((attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000))\n });\n\n const [loadingApisState, setLoadingApisState] = useState(true);\n\n // Process videos data to find active playlist\n useEffect(() => {\n if (videosData !== undefined) {\n setLoadingApisState(false);\n\n const videosWithPlaylists = videosData.filter(\n (video) => video.playlists && video.playlists.length > 0\n );\n\n if (videosWithPlaylists.length > 0) {\n let hlsPlaylistFound = false;\n // Iterate to find the first HLS playlist\n for (const video of videosWithPlaylists) {\n const activePlaylist = findHLSPlaylist(video);\n const activePlaylistUrl = (\n activePlaylist?.url ??\n activePlaylist?.drm?.widevine?.playlistUrl ??\n activePlaylist?.drm?.playready?.playlistUrl ??\n activePlaylist?.drm?.fairplay?.playlistUrl);\n const activePlaylistHasUrl = !!activePlaylistUrl;\n\n if (activePlaylist && activePlaylistHasUrl) {\n setActivePlaylist(activePlaylist);\n setActiveVideoId(video.id);\n hlsPlaylistFound = true;\n break;\n }\n }\n if (!hlsPlaylistFound) {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else {\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n } else if (creativeWorkData && (!creativeWorkData.videoIds || creativeWorkData.videoIds.length === 0)) {\n setLoadingApisState(false);\n setActivePlaylist(null);\n setActiveVideoId(null);\n }\n }, [videosData, creativeWorkData]);\n \n const { t } = useMessages(locale);\n\n // Notify parent of creative work data\n useEffect(() => {\n if (events?.onCreativeWorkData && creativeWorkData) {\n events.onCreativeWorkData(creativeWorkData);\n }\n if (creativeWorkData && !creativeWorkData?.videoIds?.length) {\n setShowCountDown(true);\n }\n }, [creativeWorkData, events]);\n\n // Notify parent of video data\n useEffect(() => {\n if (events?.onVideoData && activeVideoId && videosData) {\n const activeVideo = videosData.find((video) => video.id === activeVideoId);\n if (activeVideo) {\n events.onVideoData(activeVideo);\n }\n }\n }, [activeVideoId, videosData, events]);\n\n const [error, setError] = useState<Error | null>(null);\n const videosDataError = videosData?.some((video) => !!video.error);\n\n // Error handling\n useEffect(() => {\n if (creativeWorkError || videosError || videosDataError) {\n const errorObj = creativeWorkError || videosError || \n (videosData?.find((video) => !!video.error)?.error && \n new Error(videosData?.find((video) => !!video.error)?.error)) || \n new Error('default');\n \n setError(errorObj);\n if (events?.onError) {\n events.onError(errorObj);\n }\n } else {\n setError(null);\n }\n }, [creativeWorkError, videosError, videosDataError, videosData, events]);\n\n // Error state\n if (error) {\n const title = t(error.message as keyof Translations)?.length ? \n t(error.message as keyof Translations) : t(\"DEFAULT_ERROR\"); \n const description = t(`${error.message}_DESCRIPTION` as keyof Translations)?.length ? \n t(`${error.message}_DESCRIPTION` as keyof Translations) : t(\"DEFAULT_ERROR_DESCRIPTION\");\n \n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <ErrorScreen\n title={title}\n description={description}\n />\n </div>\n </div>\n );\n }\n\n const [loadingPlaylist, setLoadingPlaylist] = useState(true);\n \n // Loading state management\n useEffect(() => {\n const creativeWorkLoadedWithNoVideos =\n !isCreativeWorkLoading &&\n creativeWorkData &&\n creativeWorkData.videoIds &&\n creativeWorkData.videoIds.length === 0;\n\n const creativeWorkLoadedWithNoData =\n !isCreativeWorkLoading && creativeWorkData && !creativeWorkData.videoIds;\n\n const isEventsFinished =\n !videosIsLoading &&\n videosData &&\n videosData.length > 0 &&\n videosData.every((video) => video.playlists && video.playlists.length === 0);\n\n if (\n creativeWorkLoadedWithNoVideos ||\n creativeWorkLoadedWithNoData ||\n isEventsFinished\n ) {\n setLoadingPlaylist(false);\n if (events?.onEmptyPlaylists) {\n events.onEmptyPlaylists();\n }\n } else if (activePlaylist) {\n setLoadingPlaylist(false);\n }\n }, [\n isCreativeWorkLoading,\n creativeWorkData,\n videosIsLoading,\n videosData,\n activePlaylist,\n events,\n ]);\n\n // Loading state\n if (isCreativeWorkLoading || videosIsLoading || loadingApisState) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full aspect-video bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Show countdown if creative work hasn't started yet\n if (showCountDown && creativeWorkData) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full bg-base-200 text-base-content flex justify-center items-center flex-col\">\n <PreCreativeWork \n creativeWork={creativeWorkData} \n locale={locale} \n hideTitle={hideTitle}\n backgroundImageUrl={settings?.backgroundImageUrl} \n showAnimation={settings?.showCountdownAnimation} \n />\n </div>\n </div>\n );\n }\n\n // Show player if we have an active playlist\n if (activeVideoId && activePlaylist && !loadingPlaylist) {\n const activeVideo = videosData?.find((video) => video.id === activeVideoId);\n \n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full h-full\">\n <Player\n {...props}\n className={twMerge(className, \"peer aspect-video\")}\n managedMode={true}\n events={{\n ...events,\n }}\n src={activePlaylist}\n locale={locale}\n containerClassName=\"w-full h-full\"\n publicKey={publicKey}\n auth={auth}\n {...(adsEnabled && activeVideo?.ad?.adTagUrl ? { imaConfig: { adTagUrl: activeVideo?.ad?.adTagUrl } } : {})}\n />\n {!hideTitle && (\n <TitleAndDescription\n title={creativeWorkData?.title || ''}\n description={creativeWorkData?.description || ''}\n releaseTime={creativeWorkData?.releaseTime || ''}\n locale={locale}\n className=\"mt-3 mb-6 m-event-details-ctn px-4\"\n />\n )}\n </div>\n </div>\n );\n }\n\n // Loading state for playlist\n if (loadingPlaylist) {\n return (\n <div className={twMerge(\"\", className)}>\n <div className=\"relative w-full aspect-video bg-[#151515]\">\n <Loading />\n </div>\n </div>\n );\n }\n\n // Empty state\n return null;\n};\n\nfunction PreCreativeWork({ \n creativeWork, \n locale = 'en', \n hideTitle, \n backgroundImageUrl, \n showAnimation = true \n}: { \n creativeWork: CreativeWorkData; \n locale?: string; \n hideTitle?: boolean; \n backgroundImageUrl?: string; \n showAnimation?: boolean;\n}): JSX.Element {\n const date = new Date(creativeWork.releaseTime);\n const now = new Date();\n const [remainingTime, setRemainingTime] = useState(\n date.getTime() - now.getTime()\n );\n const shouldBeStarted = remainingTime < 0;\n const { t } = useMessages(locale);\n\n useEffect(() => {\n const interval = setInterval(() => {\n if (remainingTime < 0) {\n clearInterval(interval);\n } else {\n setRemainingTime(date.getTime() - new Date().getTime());\n }\n }, 1000);\n\n return () => { clearInterval(interval); };\n }, [date, remainingTime]);\n\n const renderCountdown = () => {\n if (shouldBeStarted) {\n return <span className=\"text-base-content text-xl\">{t(\"EVENT_NOT_STARTED\")}</span>;\n }\n\n const seconds = Math.floor(remainingTime / 1000) % 60;\n const minutes = Math.floor(remainingTime / 1000 / 60) % 60;\n const hours = Math.floor(remainingTime / 1000 / 60 / 60) % 24;\n const days = Math.floor(remainingTime / 1000 / 60 / 60 / 24);\n\n return (\n <div className=\"grid grid-flow-col md:gap-5 gap-1 text-center auto-cols-max\">\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"font-mono text-lg md:text-5xl\">\n <span \n aria-live=\"polite\" \n aria-label={days.toString()}\n >\n {days.toString()}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"DAYS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": hours } as CSSProperties} \n aria-live=\"polite\" \n aria-label={hours.toString()}\n >\n {hours?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"HOURS\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": minutes } as CSSProperties} \n aria-live=\"polite\" \n aria-label={minutes.toString()}\n >\n {minutes?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"MINUTES\")}</span>\n </div>\n <div className=\"flex flex-col p-2 bg-neutral rounded-box text-neutral-content\">\n <span className=\"countdown font-mono text-lg md:text-5xl\">\n <span \n style={{ \"--value\": seconds } as CSSProperties} \n aria-live=\"polite\" \n aria-label={seconds.toString()}\n >\n {seconds?.toString()?.padStart(2, '0')}\n </span>\n </span>\n <span className=\"text-xs uppercase tracking-widest mt-1\">{t(\"SECONDS\")}</span>\n </div>\n </div>\n );\n };\n\n return (\n <>\n <div \n className=\"relative overflow-hidden md:rounded-2xl bg-base-200 aspect-video text-base-content flex flex-col justify-center items-center w-full h-full bg-cover bg-center bg-no-repeat\" \n style={{\n backgroundImage: backgroundImageUrl ? `url(${backgroundImageUrl})` : '',\n }}\n >\n {backgroundImageUrl && <div className=\"absolute inset-0 bg-black bg-opacity-40\"></div>}\n <div className=\"relative z-10\">\n {renderCountdown()}\n </div>\n </div>\n {!hideTitle && (\n <TitleAndDescription\n title={creativeWork.title}\n description={creativeWork.description || ''}\n releaseTime={creativeWork.releaseTime}\n locale={locale}\n />\n )}\n </>\n );\n}\n\nconst TitleAndDescription = ({ \n title, \n description, \n releaseTime, \n locale = 'en', \n className \n}: { \n title: string; \n description: string; \n releaseTime: string; \n locale?: string; \n className?: string;\n}) => {\n return (\n <div className={twMerge(\"mt-3 mb-6 m-event-details-ctn px-4 text-left w-full\", className)}>\n <div className=\"text-base md:text-xl m-event-title text-base-content font-medium\">{title}</div>\n {releaseTime ? (\n <div className=\"text-sm md:text-base text-base-content/70 m-event-start-time\">\n {new Date(releaseTime || \"\").toLocaleDateString(locale || \"default\", {\n month: \"long\",\n year: \"numeric\",\n day: \"numeric\",\n })}{\" \"}\n - {new Date(releaseTime || \"\").toLocaleTimeString(locale || \"default\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </div>\n ) : null}\n {description && (\n <div className=\"text-xs md:text-sm text-base-content/60 uppercase\">{description}</div>\n )}\n </div>\n );\n}; ","import React from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\n// Create a client\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n retry: 3,\n refetchOnWindowFocus: false,\n },\n },\n});\n\ninterface QueryProviderProps {\n children: React.ReactNode;\n}\n\nexport const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => {\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n};\n\nexport { queryClient }; "],"mappings":"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","names":["useEffect","useRef","useCallback","useState","shaka","drmConfig","video","useCallback","useCallback","useCallback","useRef","initShakaPlayerMux","shaka","useRef","useCallback","initShakaPlayerMux","shaka","useCallback","useRef","jsx","jsxs","jsx","useRef","useCallback","useCallback","useRef","useState","useEffect","useRef","useCallback","useEffect","useCallback","useRef","twMerge","jsx","jsx","jsxs","jsx","jsx","jsxs","useRef","useState","useCallback","shaka","controls","useEffect","twMerge","useEffect","twMerge","useState","useEffect","useState","useEffect","jsx","jsxs","useEffect","twMerge","useCallback","useEffect","useState","twMerge","useQuery","jsx","jsxs","useQuery","useState","useEffect","activePlaylist","twMerge","useCallback","useEffect","useState","twMerge","useQuery","Fragment","jsx","jsxs","useQuery","useState","useEffect","activePlaylist","twMerge","TitleAndDescription","jsx"]}