@therealtinhtute/baroiplayer 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.js +1 -1
- package/dist/core.mjs +2 -2
- package/dist/hooks-BCMilGRf.cjs +4 -0
- package/dist/hooks-BCMilGRf.cjs.map +1 -0
- package/dist/{hooks-BhW_i-9L.js → hooks-BPtHV1ZT.js} +793 -764
- package/dist/hooks-BPtHV1ZT.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/{minimal-components-BsqodtY8.cjs → minimal-components-BHJMuaL7.cjs} +2 -2
- package/dist/{minimal-components-BsqodtY8.cjs.map → minimal-components-BHJMuaL7.cjs.map} +1 -1
- package/dist/{minimal-components-B0bILe18.js → minimal-components-BmqRefl1.js} +2 -2
- package/dist/{minimal-components-B0bILe18.js.map → minimal-components-BmqRefl1.js.map} +1 -1
- package/dist/package.json +18 -4
- package/dist/src/hooks/use-enhanced-media-player.ts +12 -12
- package/dist/src/hooks/use-intelligent-preloading.ts +27 -22
- package/dist/src/hooks/use-media-player.ts +0 -2
- package/dist/src/hooks/use-memory-optimization.ts +19 -19
- package/dist/src/index-legacy.ts +2 -1
- package/dist/styles/globals.css +462 -0
- package/dist/styles/pixel-art.css +46 -0
- package/dist/styles/videojs.css +100 -0
- package/package.json +2 -2
- package/src/hooks/use-enhanced-media-player.ts +12 -12
- package/src/hooks/use-intelligent-preloading.ts +27 -22
- package/src/hooks/use-media-player.ts +0 -2
- package/src/hooks/use-memory-optimization.ts +19 -19
- package/src/index-legacy.ts +2 -1
- package/dist/hooks-BhW_i-9L.js.map +0 -1
- package/dist/hooks-DTXeB5Z-.cjs +0 -4
- package/dist/hooks-DTXeB5Z-.cjs.map +0 -1
package/dist/core.js
CHANGED
|
@@ -33,5 +33,5 @@ Test Suites:
|
|
|
33
33
|
`,t+=` Severity: ${n.severity.toUpperCase()}
|
|
34
34
|
|
|
35
35
|
`}),t+=`Time: ${new Date().toISOString()}
|
|
36
|
-
`,t+=`Total Violations: ${e.length}`,t}async sendAlert(e,t){switch(e.type){case"console":console.error(t);break;case"webhook":if(e.config.url){const r=await fetch(e.config.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:t,timestamp:Date.now()})});if(!r.ok)throw new Error(`Webhook failed: ${r.status}`)}break;case"slack":if(e.config.url){const r=await fetch(e.config.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:t,channel:e.config.channel,username:"BaroiPlayer Performance Monitor"})});if(!r.ok)throw new Error(`Slack webhook failed: ${r.status}`)}break;default:console.warn(`Unsupported alert channel: ${e.type}`)}}formatValue(e,t){switch(t){case"bytes":return this.formatBytes(e);case"ms":return`${e.toFixed(2)}ms`;case"score":return e.toFixed(3);case"percent":return`${e.toFixed(1)}%`;default:return e.toString()}}formatBytes(e){return e>=1024*1024?`${(e/1024/1024).toFixed(2)}MB`:e>=1024?`${(e/1024).toFixed(2)}KB`:`${e}B`}getUnitDisplay(e){return{bytes:"bytes",ms:"milliseconds",score:"score",percent:"percent"}[e]||e}addBudget(e){this.budgets.set(e.name,e)}removeBudget(e){this.budgets.delete(e)}updateBudget(e,t){const r=this.budgets.get(e);r&&this.budgets.set(e,{...r,...t})}getBudgets(){return Array.from(this.budgets.values())}getViolations(e){return e?this.violations.filter(t=>t.timestamp>=e):[...this.violations]}clearViolations(){this.violations=[]}getViolationSummary(){const e={},t={};return this.violations.forEach(r=>{const n=r.budget.category,i=r.budget.severity;e[n]=(e[n]||0)+1,t[i]=(t[i]||0)+1}),{total:this.violations.length,byCategory:e,bySeverity:t}}}const q=new R,B={preloadStrategy:"metadata",adaptiveBitrate:!0,maxPreloadSize:2*1024*1024,networkThresholds:{"2g":{maxBitrate:128,preload:!1},"3g":{maxBitrate:500,preload:!1},"4g":{maxBitrate:2e3,preload:!0},"5g":{maxBitrate:1e4,preload:!0}},bufferSize:10,enableServiceWorker:!0};class I{constructor(){u(this,"connection");u(this,"listeners",new Set);u(this,"currentInfo");if(typeof window>"u"||typeof navigator>"u"){this.connection=null,this.currentInfo={effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:!0};return}this.connection=navigator.connection||navigator.mozConnection||navigator.webkitConnection,this.currentInfo=this.getNetworkInfo(),this.initializeListeners()}getNetworkInfo(){if(typeof navigator>"u")return{effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:!0};const e=navigator.onLine;return this.connection?{effectiveType:this.connection.effectiveType||"unknown",downlink:this.connection.downlink||0,rtt:this.connection.rtt||0,saveData:this.connection.saveData||!1,isOnline:e}:{effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:e}}initializeListeners(){typeof window>"u"||(this.connection&&this.connection.addEventListener("change",this.handleNetworkChange.bind(this)),window.addEventListener("online",this.handleNetworkChange.bind(this)),window.addEventListener("offline",this.handleNetworkChange.bind(this)))}handleNetworkChange(){const e=this.getNetworkInfo();this.currentInfo=e,this.listeners.forEach(t=>t(e))}getCurrentNetworkInfo(){return{...this.currentInfo}}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async estimateBandwidth(){if(this.connection&&this.connection.downlink)return this.connection.downlink*1e3;try{const e=performance.now(),n=await(await fetch("/api/bandwidth-test?size=100kb")).blob(),s=(performance.now()-e)/1e3;return n.size*8/s/1e3}catch(e){return console.warn("Bandwidth estimation failed:",e),1e3}}}class L{constructor(e={}){u(this,"config");u(this,"networkMonitor");u(this,"loadingMetrics",new Map);u(this,"preloadCache",new Map);this.config={...B,...e},this.networkMonitor=new I,this.initializeNetworkMonitoring()}initializeNetworkMonitoring(){this.networkMonitor.subscribe(e=>{this.handleNetworkChange(e)})}handleNetworkChange(e){console.log("Network changed:",e),this.config.adaptiveBitrate&&this.adjustQualityForNetwork(e),(e.effectiveType==="2g"||e.saveData)&&this.clearPreloadCache()}async optimizeMediaLoading(e,t,r={}){const n=performance.now(),i=this.networkMonitor.getCurrentNetworkInfo(),s={loadStartTime:n,bytesLoaded:0,loadSpeed:0,networkType:i.effectiveType,quality:r.quality||"auto",bufferHealth:0,stallsCount:0,stallsDuration:0};this.loadingMetrics.set(e,s);try{const a=this.chooseLoadingStrategy(i,r);return a.shouldPreload&&await this.preloadMedia(e,a.preloadAmount),t.preload=a.preloadAttribute,this.monitorLoadingProgress(t,s),this.config.adaptiveBitrate&&a.suggestedQuality&&this.applyQualitySettings(t,a.suggestedQuality),s}catch(a){return console.error("Media loading optimization failed:",a),s}}chooseLoadingStrategy(e,t){const r=e.effectiveType==="unknown"?"4g":e.effectiveType,n=this.config.networkThresholds[r]||this.config.networkThresholds["4g"];return{shouldPreload:t.preload!==!1&&n.preload&&!e.saveData,preloadAmount:e.saveData?0:this.config.maxPreloadSize,preloadAttribute:this.getPreloadAttribute(e),suggestedQuality:this.getSuggestedQuality(e,n.maxBitrate),bufferTarget:this.getBufferTarget(e)}}getPreloadAttribute(e){return e.saveData||e.effectiveType==="2g"?"none":e.effectiveType==="3g"?"metadata":this.config.preloadStrategy}getSuggestedQuality(e,t){const r=e.downlink*1e3;return r>=t*2?"high":r>=t?"medium":"low"}getBufferTarget(e){switch(e.effectiveType){case"2g":return 2;case"3g":return 5;case"4g":return this.config.bufferSize;case"5g":return this.config.bufferSize*1.5;default:return this.config.bufferSize}}async preloadMedia(e,t){if(this.preloadCache.has(e))return;const r=this.fetchWithProgress(e,t);this.preloadCache.set(e,r);try{await r}catch(n){console.warn(`Preload failed for ${e}:`,n),this.preloadCache.delete(e)}}async fetchWithProgress(e,t){const r=await fetch(e,{headers:{Range:`bytes=0-${t-1}`}});if(!r.ok)throw new Error(`Failed to preload: ${r.status}`);const n=r.body?.getReader();if(!n)throw new Error("Response body not readable");const i=[];let s=0;try{for(;s<t;){const{done:a,value:c}=await n.read();if(a)break;i.push(c),s+=c.length}}finally{n.releaseLock()}return new Blob(i)}monitorLoadingProgress(e,t){let r=null;const n=()=>{if(e.buffered.length>0){const v=e.buffered.end(e.buffered.length-1),S=e.currentTime;t.bufferHealth=Math.min((v-S)/this.config.bufferSize,1)}},i=()=>{t.firstByteTime=performance.now()},s=()=>{t.loadCompleteTime=performance.now(),t.totalLoadTime=t.loadCompleteTime-t.loadStartTime,t.totalLoadTime&&t.bytesLoaded>0&&(t.loadSpeed=t.bytesLoaded/(t.totalLoadTime/1e3))},a=()=>{r===null&&(r=performance.now(),t.stallsCount++)},c=()=>{r!==null&&(t.stallsDuration+=performance.now()-r,r=null),n()},p=()=>{if(e.buffered.length>0){const v=e.buffered.end(0)*1e3;t.bytesLoaded=v}n()};e.addEventListener("loadstart",i),e.addEventListener("canplay",s),e.addEventListener("waiting",a),e.addEventListener("playing",c),e.addEventListener("progress",p),setTimeout(()=>{e.removeEventListener("loadstart",i),e.removeEventListener("canplay",s),e.removeEventListener("waiting",a),e.removeEventListener("playing",c),e.removeEventListener("progress",p)},300*1e3)}applyQualitySettings(e,t){console.log(`Applying quality setting: ${t} to`,e)}adjustQualityForNetwork(e){console.log("Adjusting quality for network conditions:",e.effectiveType)}clearPreloadCache(){this.preloadCache.clear()}getLoadingMetrics(e){return this.loadingMetrics.get(e)}getAllMetrics(){return Array.from(this.loadingMetrics.values())}getAverageLoadingTime(){const t=this.getAllMetrics().filter(n=>n.totalLoadTime!==void 0);return t.length===0?0:t.reduce((n,i)=>n+(i.totalLoadTime||0),0)/t.length}getNetworkPerformanceStats(){const e=new Map;return this.getAllMetrics().forEach(t=>{const r=t.networkType;e.has(r)||e.set(r,[]),e.get(r).push(t)}),Array.from(e.entries()).map(([t,r])=>({networkType:t,avgLoadTime:r.reduce((n,i)=>n+(i.totalLoadTime||0),0)/r.length,avgStalls:r.reduce((n,i)=>n+i.stallsCount,0)/r.length,avgBufferHealth:r.reduce((n,i)=>n+i.bufferHealth,0)/r.length}))}}const F=new L;function j(o){const[e]=d.useState(()=>o?new L(o):F),[t,r]=d.useState(null),[n,i]=d.useState([]);d.useEffect(()=>{const a=e.networkMonitor.subscribe(r);r(e.networkMonitor.getCurrentNetworkInfo());const c=setInterval(()=>{i(e.getAllMetrics())},1e3);return()=>{a(),clearInterval(c)}},[e]);const s=d.useCallback((a,c,p)=>e.optimizeMediaLoading(a,c,p),[e]);return{networkInfo:t,loadingMetrics:n,optimizeLoading:s,averageLoadTime:e.getAverageLoadingTime(),networkStats:e.getNetworkPerformanceStats()}}class Y{get(e){try{const t=localStorage.getItem(`baroi-player-${e}`);return t?JSON.parse(t):null}catch{return null}}set(e,t){try{localStorage.setItem(`baroi-player-${e}`,JSON.stringify(t))}catch(r){console.warn("Failed to store data:",r)}}remove(e){try{localStorage.removeItem(`baroi-player-${e}`)}catch(t){console.warn("Failed to remove data:",t)}}clear(){try{Object.keys(localStorage).forEach(e=>{e.startsWith("baroi-player-")&&localStorage.removeItem(e)})}catch(e){console.warn("Failed to clear data:",e)}}}class Q{track(e,t){console.log("Analytics:",e,t)}identify(e,t){console.log("Analytics identify:",e,t)}page(e,t){console.log("Analytics page:",e,t)}}const N=d.createContext(null);function x({children:o,services:e={}}){const t=d.useMemo(()=>{const r=e.logger||new m.ConsolePluginLogger("[BaroiPlayer]"),n=e.eventBus||new g.EventBus,i=e.pluginRegistry||new m.PluginRegistry(r),s=e.storage||new Y,a=e.analytics||new Q;return{eventBus:n,pluginRegistry:i,storage:s,analytics:a,logger:r}},[e]);return w.jsxRuntimeExports.jsx(N.Provider,{value:t,children:o})}function y(){const o=d.useContext(N);if(!o)throw new Error("useServices must be used within ServiceProvider");return o}function K(){return y().eventBus}function W(){return y().pluginRegistry}function J(){return y().storage}function G(){return y().analytics}function X(){return y().logger}function Z(o){return function(t){const r=y();return w.jsxRuntimeExports.jsx(o,{...t,services:r})}}function ee(o={}){return function({children:t}){return w.jsxRuntimeExports.jsx(x,{services:o.services,children:t})}}const l={SUBTITLES:"subtitles",PLAYLISTS:"playlists",ADVANCED_CONTROLS:"advanced_controls",ANALYTICS:"analytics",PICTURE_IN_PICTURE:"picture_in_picture",QUALITY_SELECTOR:"quality_selector",PLAYBACK_SPEED:"playback_speed",CHAPTERS:"chapters",THUMBNAILS:"thumbnails",KEYBOARD_SHORTCUTS:"keyboard_shortcuts"},D={enabledFeatures:[l.SUBTITLES,l.ADVANCED_CONTROLS,l.KEYBOARD_SHORTCUTS],loadingStrategy:"lazy",fallbackTimeout:5e3,retryAttempts:3},te={SubtitleSelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),PlaylistManager:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),QualitySelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.QualitySelector}))),PlaybackSpeedSelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PlaybackSpeedSelector}))),ChaptersPanel:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.ChaptersPanel}))),PictureInPictureButton:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PictureInPictureButton}))),AnalyticsTracker:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector})))};class C{static async isSupported(e){if(this.cache.has(e))return this.cache.get(e);const t=await this.checkFeatureSupport(e);return this.cache.set(e,t),t}static async checkFeatureSupport(e){if(typeof window>"u"||typeof document>"u")return!0;switch(e){case l.SUBTITLES:return"TextTrack"in window;case l.PICTURE_IN_PICTURE:return"pictureInPictureEnabled"in document;case l.ADVANCED_CONTROLS:return!0;case l.PLAYLISTS:return"MediaSession"in window;case l.ANALYTICS:return"IntersectionObserver"in window;case l.QUALITY_SELECTOR:return"MediaSource"in window;case l.PLAYBACK_SPEED:return!0;case l.CHAPTERS:return"TextTrack"in window;case l.THUMBNAILS:return"OffscreenCanvas"in window||"canvas"in document.createElement("canvas");case l.KEYBOARD_SHORTCUTS:return"KeyboardEvent"in window;default:return!1}}}u(C,"cache",new Map);class ${constructor(e={}){u(this,"config");u(this,"loadedFeatures",new Set);u(this,"loadingPromises",new Map);this.config={...D,...e}}async loadFeature(e){if(!this.config.enabledFeatures.includes(e))return null;if(this.loadedFeatures.has(e))return this.getLoadedFeature(e);if(this.loadingPromises.has(e))return this.loadingPromises.get(e);if(!await C.isSupported(e))return console.warn(`Feature ${e} is not supported in this browser`),null;const r=this.loadWithRetry(e);this.loadingPromises.set(e,r);try{const n=await r;return this.loadedFeatures.add(e),n}catch(n){return console.error(`Failed to load feature ${e}:`,n),this.loadingPromises.delete(e),null}}async loadWithRetry(e,t=1){try{return await this.loadFeatureModule(e)}catch(r){if(t<this.config.retryAttempts)return console.warn(`Loading feature ${e} failed, retrying (${t}/${this.config.retryAttempts})`),await new Promise(n=>setTimeout(n,1e3*t)),this.loadWithRetry(e,t+1);throw r}}async loadFeatureModule(e){switch(e){case l.SUBTITLES:return Promise.resolve().then(()=>require("./hooks-DTXeB5Z-.cjs")).then(t=>t.useEnhancedSubtitles$2);case l.PLAYLISTS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.ADVANCED_CONTROLS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.ANALYTICS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.PICTURE_IN_PICTURE:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.QUALITY_SELECTOR:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.PLAYBACK_SPEED:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.CHAPTERS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.THUMBNAILS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.KEYBOARD_SHORTCUTS:return Promise.resolve().then(()=>require("./hooks-DTXeB5Z-.cjs")).then(t=>t.useKeyboardControls$2);default:throw new Error(`Unknown feature: ${e}`)}}getLoadedFeature(e){return this.loadingPromises.get(e)}async preloadFeatures(e=this.config.enabledFeatures){const t=e.map(r=>this.loadFeature(r));await Promise.allSettled(t)}getLoadingState(){return{loaded:Array.from(this.loadedFeatures),loading:Array.from(this.loadingPromises.keys()),enabled:this.config.enabledFeatures}}}const E=new $;function U(o){const[e,t]=d.useState(null),[r,n]=d.useState(!1),[i,s]=d.useState(null),a=d.useCallback(async()=>{if(!(r||e)){n(!0),s(null);try{const c=await E.loadFeature(o);t(c)}catch(c){s(c)}finally{n(!1)}}},[o,r,e]);return d.useEffect(()=>{E.config.loadingStrategy==="immediate"&&a()},[a]),{feature:e,loading:r,error:i,load:a}}function re(o,e,t){return function(n){const{feature:i,loading:s,error:a}=U(e);if(s)return w.jsxRuntimeExports.jsx("div",{className:"h-8 animate-pulse rounded bg-gray-200"});if(a||!i){const c=t;return c?w.jsxRuntimeExports.jsx(c,{...n}):null}return w.jsxRuntimeExports.jsx(o,{...n})}}const ne="1.0.0";exports.AnalyticsPlugin=m.AnalyticsPlugin;exports.BasePlugin=m.BasePlugin;exports.ConsolePluginLogger=m.ConsolePluginLogger;exports.PLUGIN_SYSTEM_VERSION=m.PLUGIN_SYSTEM_VERSION;exports.PluginConflictError=m.PluginConflictError;exports.PluginDependencyError=m.PluginDependencyError;exports.PluginDevelopmentHelpers=m.PluginDevelopmentHelpers;exports.PluginError=m.PluginError;exports.PluginPerformanceMonitor=m.PluginPerformanceMonitor;exports.PluginRegistry=m.PluginRegistry;exports.PluginStorage=m.PluginStorage;exports.PluginValidator=m.PluginValidator;exports.createAnalyticsPlugin=m.createAnalyticsPlugin;exports.createPlugin=m.createPlugin;exports.defaultPerformanceMonitor=m.defaultPerformanceMonitor;exports.defaultPluginLogger=m.defaultPluginLogger;exports.EVENT_SYSTEM_VERSION=g.EVENT_SYSTEM_VERSION;exports.EventBus=g.EventBus;exports.EventDelegator=g.EventDelegator;exports.MiddlewareBuilder=g.MiddlewareBuilder;exports.commonMiddlewares=g.commonMiddlewares;exports.createMiddleware=g.createMiddleware;exports.defaultEventBus=g.defaultEventBus;exports.eventMiddlewares=g.eventMiddlewares;exports.useConditionalEventListener=g.useConditionalEventListener;exports.useEventBus=g.useEventBus;exports.useEventDebugger=g.useEventDebugger;exports.useEventEffect=g.useEventEffect;exports.useEventEmitter=g.useEventEmitter;exports.useEventHandlers=g.useEventHandlers;exports.useEventHistory=g.useEventHistory;exports.useEventListener=g.useEventListener;exports.useEventMetrics=g.useEventMetrics;exports.useEventOnce=g.useEventOnce;exports.useEventState=g.useEventState;exports.PerformanceDashboard=f.PerformanceDashboard;exports.PerformanceMonitor=f.PerformanceMonitor;exports.PerformanceRegressionDetector=f.PerformanceRegressionDetector;exports.defaultThresholds=f.defaultThresholds;exports.performanceMonitor=f.performanceMonitor;exports.usePerformanceMonitor=f.usePerformanceMonitor;exports.withPerformanceMonitoring=f.withPerformanceMonitoring;exports.CORE_ARCHITECTURE_VERSION=ne;exports.FEATURES=l;exports.FeatureDetector=C;exports.MediaLoadingOptimizer=L;exports.NetworkMonitor=I;exports.PerformanceBenchmark=M;exports.PerformanceBudgetMonitor=R;exports.PerformanceTestFramework=k;exports.ProgressiveLoader=$;exports.ServiceProvider=x;exports.createArchitecture=ee;exports.defaultMediaLoadingConfig=B;exports.defaultPerformanceBudgets=A;exports.defaultProgressiveConfig=D;exports.lazyComponents=te;exports.mediaLoadingOptimizer=F;exports.performanceBenchmark=T;exports.performanceBudgetMonitor=q;exports.performanceTestFramework=H;exports.performanceTestUtils=V;exports.progressiveLoader=E;exports.useAnalytics=G;exports.useLogger=X;exports.useMediaLoadingOptimizer=j;exports.usePluginRegistry=W;exports.useProgressiveFeature=U;exports.useServiceEventBus=K;exports.useServices=y;exports.useStorage=J;exports.withProgressiveFeature=re;exports.withServices=Z;
|
|
36
|
+
`,t+=`Total Violations: ${e.length}`,t}async sendAlert(e,t){switch(e.type){case"console":console.error(t);break;case"webhook":if(e.config.url){const r=await fetch(e.config.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:t,timestamp:Date.now()})});if(!r.ok)throw new Error(`Webhook failed: ${r.status}`)}break;case"slack":if(e.config.url){const r=await fetch(e.config.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:t,channel:e.config.channel,username:"BaroiPlayer Performance Monitor"})});if(!r.ok)throw new Error(`Slack webhook failed: ${r.status}`)}break;default:console.warn(`Unsupported alert channel: ${e.type}`)}}formatValue(e,t){switch(t){case"bytes":return this.formatBytes(e);case"ms":return`${e.toFixed(2)}ms`;case"score":return e.toFixed(3);case"percent":return`${e.toFixed(1)}%`;default:return e.toString()}}formatBytes(e){return e>=1024*1024?`${(e/1024/1024).toFixed(2)}MB`:e>=1024?`${(e/1024).toFixed(2)}KB`:`${e}B`}getUnitDisplay(e){return{bytes:"bytes",ms:"milliseconds",score:"score",percent:"percent"}[e]||e}addBudget(e){this.budgets.set(e.name,e)}removeBudget(e){this.budgets.delete(e)}updateBudget(e,t){const r=this.budgets.get(e);r&&this.budgets.set(e,{...r,...t})}getBudgets(){return Array.from(this.budgets.values())}getViolations(e){return e?this.violations.filter(t=>t.timestamp>=e):[...this.violations]}clearViolations(){this.violations=[]}getViolationSummary(){const e={},t={};return this.violations.forEach(r=>{const n=r.budget.category,i=r.budget.severity;e[n]=(e[n]||0)+1,t[i]=(t[i]||0)+1}),{total:this.violations.length,byCategory:e,bySeverity:t}}}const q=new R,B={preloadStrategy:"metadata",adaptiveBitrate:!0,maxPreloadSize:2*1024*1024,networkThresholds:{"2g":{maxBitrate:128,preload:!1},"3g":{maxBitrate:500,preload:!1},"4g":{maxBitrate:2e3,preload:!0},"5g":{maxBitrate:1e4,preload:!0}},bufferSize:10,enableServiceWorker:!0};class I{constructor(){u(this,"connection");u(this,"listeners",new Set);u(this,"currentInfo");if(typeof window>"u"||typeof navigator>"u"){this.connection=null,this.currentInfo={effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:!0};return}this.connection=navigator.connection||navigator.mozConnection||navigator.webkitConnection,this.currentInfo=this.getNetworkInfo(),this.initializeListeners()}getNetworkInfo(){if(typeof navigator>"u")return{effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:!0};const e=navigator.onLine;return this.connection?{effectiveType:this.connection.effectiveType||"unknown",downlink:this.connection.downlink||0,rtt:this.connection.rtt||0,saveData:this.connection.saveData||!1,isOnline:e}:{effectiveType:"unknown",downlink:0,rtt:0,saveData:!1,isOnline:e}}initializeListeners(){typeof window>"u"||(this.connection&&this.connection.addEventListener("change",this.handleNetworkChange.bind(this)),window.addEventListener("online",this.handleNetworkChange.bind(this)),window.addEventListener("offline",this.handleNetworkChange.bind(this)))}handleNetworkChange(){const e=this.getNetworkInfo();this.currentInfo=e,this.listeners.forEach(t=>t(e))}getCurrentNetworkInfo(){return{...this.currentInfo}}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async estimateBandwidth(){if(this.connection&&this.connection.downlink)return this.connection.downlink*1e3;try{const e=performance.now(),n=await(await fetch("/api/bandwidth-test?size=100kb")).blob(),s=(performance.now()-e)/1e3;return n.size*8/s/1e3}catch(e){return console.warn("Bandwidth estimation failed:",e),1e3}}}class L{constructor(e={}){u(this,"config");u(this,"networkMonitor");u(this,"loadingMetrics",new Map);u(this,"preloadCache",new Map);this.config={...B,...e},this.networkMonitor=new I,this.initializeNetworkMonitoring()}initializeNetworkMonitoring(){this.networkMonitor.subscribe(e=>{this.handleNetworkChange(e)})}handleNetworkChange(e){console.log("Network changed:",e),this.config.adaptiveBitrate&&this.adjustQualityForNetwork(e),(e.effectiveType==="2g"||e.saveData)&&this.clearPreloadCache()}async optimizeMediaLoading(e,t,r={}){const n=performance.now(),i=this.networkMonitor.getCurrentNetworkInfo(),s={loadStartTime:n,bytesLoaded:0,loadSpeed:0,networkType:i.effectiveType,quality:r.quality||"auto",bufferHealth:0,stallsCount:0,stallsDuration:0};this.loadingMetrics.set(e,s);try{const a=this.chooseLoadingStrategy(i,r);return a.shouldPreload&&await this.preloadMedia(e,a.preloadAmount),t.preload=a.preloadAttribute,this.monitorLoadingProgress(t,s),this.config.adaptiveBitrate&&a.suggestedQuality&&this.applyQualitySettings(t,a.suggestedQuality),s}catch(a){return console.error("Media loading optimization failed:",a),s}}chooseLoadingStrategy(e,t){const r=e.effectiveType==="unknown"?"4g":e.effectiveType,n=this.config.networkThresholds[r]||this.config.networkThresholds["4g"];return{shouldPreload:t.preload!==!1&&n.preload&&!e.saveData,preloadAmount:e.saveData?0:this.config.maxPreloadSize,preloadAttribute:this.getPreloadAttribute(e),suggestedQuality:this.getSuggestedQuality(e,n.maxBitrate),bufferTarget:this.getBufferTarget(e)}}getPreloadAttribute(e){return e.saveData||e.effectiveType==="2g"?"none":e.effectiveType==="3g"?"metadata":this.config.preloadStrategy}getSuggestedQuality(e,t){const r=e.downlink*1e3;return r>=t*2?"high":r>=t?"medium":"low"}getBufferTarget(e){switch(e.effectiveType){case"2g":return 2;case"3g":return 5;case"4g":return this.config.bufferSize;case"5g":return this.config.bufferSize*1.5;default:return this.config.bufferSize}}async preloadMedia(e,t){if(this.preloadCache.has(e))return;const r=this.fetchWithProgress(e,t);this.preloadCache.set(e,r);try{await r}catch(n){console.warn(`Preload failed for ${e}:`,n),this.preloadCache.delete(e)}}async fetchWithProgress(e,t){const r=await fetch(e,{headers:{Range:`bytes=0-${t-1}`}});if(!r.ok)throw new Error(`Failed to preload: ${r.status}`);const n=r.body?.getReader();if(!n)throw new Error("Response body not readable");const i=[];let s=0;try{for(;s<t;){const{done:a,value:c}=await n.read();if(a)break;i.push(c),s+=c.length}}finally{n.releaseLock()}return new Blob(i)}monitorLoadingProgress(e,t){let r=null;const n=()=>{if(e.buffered.length>0){const v=e.buffered.end(e.buffered.length-1),S=e.currentTime;t.bufferHealth=Math.min((v-S)/this.config.bufferSize,1)}},i=()=>{t.firstByteTime=performance.now()},s=()=>{t.loadCompleteTime=performance.now(),t.totalLoadTime=t.loadCompleteTime-t.loadStartTime,t.totalLoadTime&&t.bytesLoaded>0&&(t.loadSpeed=t.bytesLoaded/(t.totalLoadTime/1e3))},a=()=>{r===null&&(r=performance.now(),t.stallsCount++)},c=()=>{r!==null&&(t.stallsDuration+=performance.now()-r,r=null),n()},p=()=>{if(e.buffered.length>0){const v=e.buffered.end(0)*1e3;t.bytesLoaded=v}n()};e.addEventListener("loadstart",i),e.addEventListener("canplay",s),e.addEventListener("waiting",a),e.addEventListener("playing",c),e.addEventListener("progress",p),setTimeout(()=>{e.removeEventListener("loadstart",i),e.removeEventListener("canplay",s),e.removeEventListener("waiting",a),e.removeEventListener("playing",c),e.removeEventListener("progress",p)},300*1e3)}applyQualitySettings(e,t){console.log(`Applying quality setting: ${t} to`,e)}adjustQualityForNetwork(e){console.log("Adjusting quality for network conditions:",e.effectiveType)}clearPreloadCache(){this.preloadCache.clear()}getLoadingMetrics(e){return this.loadingMetrics.get(e)}getAllMetrics(){return Array.from(this.loadingMetrics.values())}getAverageLoadingTime(){const t=this.getAllMetrics().filter(n=>n.totalLoadTime!==void 0);return t.length===0?0:t.reduce((n,i)=>n+(i.totalLoadTime||0),0)/t.length}getNetworkPerformanceStats(){const e=new Map;return this.getAllMetrics().forEach(t=>{const r=t.networkType;e.has(r)||e.set(r,[]),e.get(r).push(t)}),Array.from(e.entries()).map(([t,r])=>({networkType:t,avgLoadTime:r.reduce((n,i)=>n+(i.totalLoadTime||0),0)/r.length,avgStalls:r.reduce((n,i)=>n+i.stallsCount,0)/r.length,avgBufferHealth:r.reduce((n,i)=>n+i.bufferHealth,0)/r.length}))}}const F=new L;function j(o){const[e]=d.useState(()=>o?new L(o):F),[t,r]=d.useState(null),[n,i]=d.useState([]);d.useEffect(()=>{const a=e.networkMonitor.subscribe(r);r(e.networkMonitor.getCurrentNetworkInfo());const c=setInterval(()=>{i(e.getAllMetrics())},1e3);return()=>{a(),clearInterval(c)}},[e]);const s=d.useCallback((a,c,p)=>e.optimizeMediaLoading(a,c,p),[e]);return{networkInfo:t,loadingMetrics:n,optimizeLoading:s,averageLoadTime:e.getAverageLoadingTime(),networkStats:e.getNetworkPerformanceStats()}}class Y{get(e){try{const t=localStorage.getItem(`baroi-player-${e}`);return t?JSON.parse(t):null}catch{return null}}set(e,t){try{localStorage.setItem(`baroi-player-${e}`,JSON.stringify(t))}catch(r){console.warn("Failed to store data:",r)}}remove(e){try{localStorage.removeItem(`baroi-player-${e}`)}catch(t){console.warn("Failed to remove data:",t)}}clear(){try{Object.keys(localStorage).forEach(e=>{e.startsWith("baroi-player-")&&localStorage.removeItem(e)})}catch(e){console.warn("Failed to clear data:",e)}}}class Q{track(e,t){console.log("Analytics:",e,t)}identify(e,t){console.log("Analytics identify:",e,t)}page(e,t){console.log("Analytics page:",e,t)}}const N=d.createContext(null);function x({children:o,services:e={}}){const t=d.useMemo(()=>{const r=e.logger||new m.ConsolePluginLogger("[BaroiPlayer]"),n=e.eventBus||new g.EventBus,i=e.pluginRegistry||new m.PluginRegistry(r),s=e.storage||new Y,a=e.analytics||new Q;return{eventBus:n,pluginRegistry:i,storage:s,analytics:a,logger:r}},[e]);return w.jsxRuntimeExports.jsx(N.Provider,{value:t,children:o})}function y(){const o=d.useContext(N);if(!o)throw new Error("useServices must be used within ServiceProvider");return o}function K(){return y().eventBus}function W(){return y().pluginRegistry}function J(){return y().storage}function G(){return y().analytics}function X(){return y().logger}function Z(o){return function(t){const r=y();return w.jsxRuntimeExports.jsx(o,{...t,services:r})}}function ee(o={}){return function({children:t}){return w.jsxRuntimeExports.jsx(x,{services:o.services,children:t})}}const l={SUBTITLES:"subtitles",PLAYLISTS:"playlists",ADVANCED_CONTROLS:"advanced_controls",ANALYTICS:"analytics",PICTURE_IN_PICTURE:"picture_in_picture",QUALITY_SELECTOR:"quality_selector",PLAYBACK_SPEED:"playback_speed",CHAPTERS:"chapters",THUMBNAILS:"thumbnails",KEYBOARD_SHORTCUTS:"keyboard_shortcuts"},D={enabledFeatures:[l.SUBTITLES,l.ADVANCED_CONTROLS,l.KEYBOARD_SHORTCUTS],loadingStrategy:"lazy",fallbackTimeout:5e3,retryAttempts:3},te={SubtitleSelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),PlaylistManager:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector}))),QualitySelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.QualitySelector}))),PlaybackSpeedSelector:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PlaybackSpeedSelector}))),ChaptersPanel:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.ChaptersPanel}))),PictureInPictureButton:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.PictureInPictureButton}))),AnalyticsTracker:d.lazy(()=>Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(o=>o.advancedFeatures).then(o=>({default:o.SubtitleSelector})))};class C{static async isSupported(e){if(this.cache.has(e))return this.cache.get(e);const t=await this.checkFeatureSupport(e);return this.cache.set(e,t),t}static async checkFeatureSupport(e){if(typeof window>"u"||typeof document>"u")return!0;switch(e){case l.SUBTITLES:return"TextTrack"in window;case l.PICTURE_IN_PICTURE:return"pictureInPictureEnabled"in document;case l.ADVANCED_CONTROLS:return!0;case l.PLAYLISTS:return"MediaSession"in window;case l.ANALYTICS:return"IntersectionObserver"in window;case l.QUALITY_SELECTOR:return"MediaSource"in window;case l.PLAYBACK_SPEED:return!0;case l.CHAPTERS:return"TextTrack"in window;case l.THUMBNAILS:return"OffscreenCanvas"in window||"canvas"in document.createElement("canvas");case l.KEYBOARD_SHORTCUTS:return"KeyboardEvent"in window;default:return!1}}}u(C,"cache",new Map);class ${constructor(e={}){u(this,"config");u(this,"loadedFeatures",new Set);u(this,"loadingPromises",new Map);this.config={...D,...e}}async loadFeature(e){if(!this.config.enabledFeatures.includes(e))return null;if(this.loadedFeatures.has(e))return this.getLoadedFeature(e);if(this.loadingPromises.has(e))return this.loadingPromises.get(e);if(!await C.isSupported(e))return console.warn(`Feature ${e} is not supported in this browser`),null;const r=this.loadWithRetry(e);this.loadingPromises.set(e,r);try{const n=await r;return this.loadedFeatures.add(e),n}catch(n){return console.error(`Failed to load feature ${e}:`,n),this.loadingPromises.delete(e),null}}async loadWithRetry(e,t=1){try{return await this.loadFeatureModule(e)}catch(r){if(t<this.config.retryAttempts)return console.warn(`Loading feature ${e} failed, retrying (${t}/${this.config.retryAttempts})`),await new Promise(n=>setTimeout(n,1e3*t)),this.loadWithRetry(e,t+1);throw r}}async loadFeatureModule(e){switch(e){case l.SUBTITLES:return Promise.resolve().then(()=>require("./hooks-BCMilGRf.cjs")).then(t=>t.useEnhancedSubtitles$2);case l.PLAYLISTS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.ADVANCED_CONTROLS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.ANALYTICS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.PICTURE_IN_PICTURE:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.QUALITY_SELECTOR:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.PLAYBACK_SPEED:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.CHAPTERS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.THUMBNAILS:return Promise.resolve().then(()=>require("./enhanced-components-CXnYiOt6.cjs")).then(t=>t.advancedFeatures);case l.KEYBOARD_SHORTCUTS:return Promise.resolve().then(()=>require("./hooks-BCMilGRf.cjs")).then(t=>t.useKeyboardControls$2);default:throw new Error(`Unknown feature: ${e}`)}}getLoadedFeature(e){return this.loadingPromises.get(e)}async preloadFeatures(e=this.config.enabledFeatures){const t=e.map(r=>this.loadFeature(r));await Promise.allSettled(t)}getLoadingState(){return{loaded:Array.from(this.loadedFeatures),loading:Array.from(this.loadingPromises.keys()),enabled:this.config.enabledFeatures}}}const E=new $;function U(o){const[e,t]=d.useState(null),[r,n]=d.useState(!1),[i,s]=d.useState(null),a=d.useCallback(async()=>{if(!(r||e)){n(!0),s(null);try{const c=await E.loadFeature(o);t(c)}catch(c){s(c)}finally{n(!1)}}},[o,r,e]);return d.useEffect(()=>{E.config.loadingStrategy==="immediate"&&a()},[a]),{feature:e,loading:r,error:i,load:a}}function re(o,e,t){return function(n){const{feature:i,loading:s,error:a}=U(e);if(s)return w.jsxRuntimeExports.jsx("div",{className:"h-8 animate-pulse rounded bg-gray-200"});if(a||!i){const c=t;return c?w.jsxRuntimeExports.jsx(c,{...n}):null}return w.jsxRuntimeExports.jsx(o,{...n})}}const ne="1.0.0";exports.AnalyticsPlugin=m.AnalyticsPlugin;exports.BasePlugin=m.BasePlugin;exports.ConsolePluginLogger=m.ConsolePluginLogger;exports.PLUGIN_SYSTEM_VERSION=m.PLUGIN_SYSTEM_VERSION;exports.PluginConflictError=m.PluginConflictError;exports.PluginDependencyError=m.PluginDependencyError;exports.PluginDevelopmentHelpers=m.PluginDevelopmentHelpers;exports.PluginError=m.PluginError;exports.PluginPerformanceMonitor=m.PluginPerformanceMonitor;exports.PluginRegistry=m.PluginRegistry;exports.PluginStorage=m.PluginStorage;exports.PluginValidator=m.PluginValidator;exports.createAnalyticsPlugin=m.createAnalyticsPlugin;exports.createPlugin=m.createPlugin;exports.defaultPerformanceMonitor=m.defaultPerformanceMonitor;exports.defaultPluginLogger=m.defaultPluginLogger;exports.EVENT_SYSTEM_VERSION=g.EVENT_SYSTEM_VERSION;exports.EventBus=g.EventBus;exports.EventDelegator=g.EventDelegator;exports.MiddlewareBuilder=g.MiddlewareBuilder;exports.commonMiddlewares=g.commonMiddlewares;exports.createMiddleware=g.createMiddleware;exports.defaultEventBus=g.defaultEventBus;exports.eventMiddlewares=g.eventMiddlewares;exports.useConditionalEventListener=g.useConditionalEventListener;exports.useEventBus=g.useEventBus;exports.useEventDebugger=g.useEventDebugger;exports.useEventEffect=g.useEventEffect;exports.useEventEmitter=g.useEventEmitter;exports.useEventHandlers=g.useEventHandlers;exports.useEventHistory=g.useEventHistory;exports.useEventListener=g.useEventListener;exports.useEventMetrics=g.useEventMetrics;exports.useEventOnce=g.useEventOnce;exports.useEventState=g.useEventState;exports.PerformanceDashboard=f.PerformanceDashboard;exports.PerformanceMonitor=f.PerformanceMonitor;exports.PerformanceRegressionDetector=f.PerformanceRegressionDetector;exports.defaultThresholds=f.defaultThresholds;exports.performanceMonitor=f.performanceMonitor;exports.usePerformanceMonitor=f.usePerformanceMonitor;exports.withPerformanceMonitoring=f.withPerformanceMonitoring;exports.CORE_ARCHITECTURE_VERSION=ne;exports.FEATURES=l;exports.FeatureDetector=C;exports.MediaLoadingOptimizer=L;exports.NetworkMonitor=I;exports.PerformanceBenchmark=M;exports.PerformanceBudgetMonitor=R;exports.PerformanceTestFramework=k;exports.ProgressiveLoader=$;exports.ServiceProvider=x;exports.createArchitecture=ee;exports.defaultMediaLoadingConfig=B;exports.defaultPerformanceBudgets=A;exports.defaultProgressiveConfig=D;exports.lazyComponents=te;exports.mediaLoadingOptimizer=F;exports.performanceBenchmark=T;exports.performanceBudgetMonitor=q;exports.performanceTestFramework=H;exports.performanceTestUtils=V;exports.progressiveLoader=E;exports.useAnalytics=G;exports.useLogger=X;exports.useMediaLoadingOptimizer=j;exports.usePluginRegistry=W;exports.useProgressiveFeature=U;exports.useServiceEventBus=K;exports.useServices=y;exports.useStorage=J;exports.withProgressiveFeature=re;exports.withServices=Z;
|
|
37
37
|
//# sourceMappingURL=core.js.map
|
package/dist/core.mjs
CHANGED
|
@@ -1055,7 +1055,7 @@ class W {
|
|
|
1055
1055
|
async loadFeatureModule(e) {
|
|
1056
1056
|
switch (e) {
|
|
1057
1057
|
case l.SUBTITLES:
|
|
1058
|
-
return import("./hooks-
|
|
1058
|
+
return import("./hooks-BPtHV1ZT.js").then((t) => t.x);
|
|
1059
1059
|
case l.PLAYLISTS:
|
|
1060
1060
|
return import("./enhanced-components-Da0TSvKe.js").then((t) => t.g);
|
|
1061
1061
|
// Use existing features
|
|
@@ -1080,7 +1080,7 @@ class W {
|
|
|
1080
1080
|
return import("./enhanced-components-Da0TSvKe.js").then((t) => t.g);
|
|
1081
1081
|
// Use existing features
|
|
1082
1082
|
case l.KEYBOARD_SHORTCUTS:
|
|
1083
|
-
return import("./hooks-
|
|
1083
|
+
return import("./hooks-BPtHV1ZT.js").then((t) => t.w);
|
|
1084
1084
|
default:
|
|
1085
1085
|
throw new Error(`Unknown feature: ${e}`);
|
|
1086
1086
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";const s=require("react"),E=require("./context-CwZnPdz0.cjs"),oe=require("./utils-Db13763z.cjs");function he(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const Q=he(s);function ve({enabled:e=!0,state:t,controls:n,seekStep:a=10,volumeStep:l=.1}){const c=i=>{if(!e)return;const f=i.target;if(!(f.tagName==="INPUT"||f.tagName==="TEXTAREA"||f.contentEditable==="true"))switch(i.code){case"Space":case"KeyK":i.preventDefault(),n.toggle();break;case"KeyM":i.preventDefault(),n.toggleMute();break;case"KeyF":i.preventDefault(),n.toggleFullscreen();break;case"ArrowLeft":i.preventDefault(),n.seek(Math.max(0,t.currentTime-a));break;case"ArrowRight":i.preventDefault(),n.seek(Math.min(t.duration,t.currentTime+a));break;case"ArrowUp":i.preventDefault(),n.setVolume(Math.min(1,t.volume+l));break;case"ArrowDown":i.preventDefault(),n.setVolume(Math.max(0,t.volume-l));break;case"Digit0":case"Digit1":case"Digit2":case"Digit3":case"Digit4":case"Digit5":case"Digit6":case"Digit7":case"Digit8":case"Digit9":i.preventDefault();const F=parseInt(i.code.replace("Digit",""),10)/10;n.seek(t.duration*F);break;case"Home":i.preventDefault(),n.seek(0);break;case"End":i.preventDefault(),n.seek(t.duration);break}};return s.useEffect(()=>{if(e)return document.addEventListener("keydown",c),()=>{document.removeEventListener("keydown",c)}},[e,c]),{handleKeyDown:c}}function ye(e,t){if(!t.optimistic)return e;switch(t.type){case"PLAY":return{...e,isPlaying:!0,error:null};case"PAUSE":return{...e,isPlaying:!1};case"SEEK":return{...e,currentTime:t.detail};case"SET_VOLUME":return{...e,volume:Math.max(0,Math.min(1,t.detail))};case"MUTE":return{...e,isMuted:!0};case"UNMUTE":return{...e,isMuted:!1};case"TOGGLE_MUTE":return{...e,isMuted:!e.isMuted};case"ENTER_FULLSCREEN":return{...e,isFullscreen:!0};case"EXIT_FULLSCREEN":return{...e,isFullscreen:!1};case"SET_PLAYBACK_RATE":return{...e,playbackRate:t.detail};case"TOGGLE_SUBTITLES":return{...e,subtitlesShowing:!e.subtitlesShowing};case"PREVIEW_TIME":return{...e,previewTime:t.detail};case"CLEAR_PREVIEW":return{...e,previewTime:null,previewImage:null,previewCoords:null};default:return e}}function ce(e){const t=s.useSyncExternalStore(e.subscribe,e.getState,e.getState),[n,a]=s.useOptimistic(t,ye),l=s.useCallback(async f=>{f.optimistic&&a(f),await e.dispatchOptimistic(f)},[e,a]),c=s.useMemo(()=>({togglePlayPause:async()=>{const f={type:n.isPlaying?"PAUSE":"PLAY",optimistic:!0,timestamp:Date.now()};await l(f)},setVolumeOptimistic:async f=>{const k={type:"SET_VOLUME",detail:Math.max(0,Math.min(1,f)),optimistic:!0,timestamp:Date.now()};await l(k)},seekOptimistic:async f=>{const k={type:"SEEK",detail:f,optimistic:!0,timestamp:Date.now()};await l(k)},toggleMuteOptimistic:async()=>{const f={type:"TOGGLE_MUTE",optimistic:!0,timestamp:Date.now()};await l(f)},toggleFullscreenOptimistic:async()=>{const f={type:n.isFullscreen?"EXIT_FULLSCREEN":"ENTER_FULLSCREEN",optimistic:!0,timestamp:Date.now()};await l(f)},setPlaybackRateOptimistic:async f=>{const k={type:"SET_PLAYBACK_RATE",detail:f,optimistic:!0,timestamp:Date.now()};await l(k)},toggleSubtitlesOptimistic:async()=>{const f={type:"TOGGLE_SUBTITLES",optimistic:!0,timestamp:Date.now()};await l(f)}}),[n,l]),i=s.useMemo(()=>({isPlaying:n.isPlaying,currentTime:n.currentTime,volume:n.volume,isMuted:n.isMuted,isFullscreen:n.isFullscreen,playbackRate:n.playbackRate,subtitlesShowing:n.subtitlesShowing,previewTime:n.previewTime,progress:n.duration>0?n.currentTime/n.duration:0,formattedTime:re(n.currentTime),formattedDuration:re(n.duration),canPlay:!n.isLoading&&!n.error,hasError:!!n.error,isBuffering:n.isLoading}),[n]);return{state:n,actualState:t,...i,...c,dispatchOptimistic:l}}function re(e){if(!e||!isFinite(e))return"0:00";const t=Math.floor(e/60),n=Math.floor(e%60),a=Math.floor(t/60);return a>0?`${a}:${String(t%60).padStart(2,"0")}:${String(n).padStart(2,"0")}`:`${t}:${String(n).padStart(2,"0")}`}function B(e,t){return((n,a=!1)=>{const l={type:e,detail:n,optimistic:a,timestamp:Date.now()};return a?t.dispatchOptimistic(l):(t.dispatch(l),Promise.resolve())})}function Te(e){const[t,n]=s.useState(e.getActionState());return s.useEffect(()=>e.subscribe(()=>{const l=e.getActionState();n(c=>JSON.stringify(c)!==JSON.stringify(l)?l:c)}),[e]),t}function ue(e){const t=s.useMemo(()=>({play:B(E.MediaActionTypes$1.PLAY,e),pause:B(E.MediaActionTypes$1.PAUSE,e),seek:B(E.MediaActionTypes$1.SEEK,e),setVolume:B(E.MediaActionTypes$1.SET_VOLUME,e),mute:B(E.MediaActionTypes$1.MUTE,e),unmute:B(E.MediaActionTypes$1.UNMUTE,e),toggleMute:B(E.MediaActionTypes$1.TOGGLE_MUTE,e),setDuration:B(E.MediaActionTypes$1.SET_DURATION,e),setCurrentTime:B(E.MediaActionTypes$1.SET_CURRENT_TIME,e),setBuffered:B(E.MediaActionTypes$1.SET_BUFFERED,e),setLoading:B(E.MediaActionTypes$1.SET_LOADING,e),setError:B(E.MediaActionTypes$1.SET_ERROR,e),enterFullscreen:B(E.MediaActionTypes$1.ENTER_FULLSCREEN,e),exitFullscreen:B(E.MediaActionTypes$1.EXIT_FULLSCREEN,e),enterPiP:B(E.MediaActionTypes$1.ENTER_PIP,e),exitPiP:B(E.MediaActionTypes$1.EXIT_PIP,e),setPlaybackRate:B(E.MediaActionTypes$1.SET_PLAYBACK_RATE,e),setSubtitleTrack:B(E.MediaActionTypes$1.SET_SUBTITLE_TRACK,e),setRendition:B(E.MediaActionTypes$1.SET_RENDITION,e),toggleSubtitles:B(E.MediaActionTypes$1.TOGGLE_SUBTITLES,e),previewTime:B(E.MediaActionTypes$1.PREVIEW_TIME,e),clearPreview:B(E.MediaActionTypes$1.CLEAR_PREVIEW,e)}),[e]),n=Te(e),a=s.useMemo(()=>({togglePlayPause:async c=>{c?await t.pause(!0):await t.play(!0)},seekWithPreview:async c=>{await t.previewTime(c,!0),await t.seek(c,!0)},adjustVolume:async(c,i)=>{const f=Math.max(0,Math.min(1,i+c));await t.setVolume(f,!0)},toggleFullscreenOptimistic:async c=>{c?await t.exitFullscreen(!0):await t.enterFullscreen(!0)}}),[t]),l=s.useCallback(async()=>{const{lastAction:c}=n;c&&n.error&&await e.dispatchOptimistic({...c,retryCount:(c.retryCount||0)+1})},[e,n]);return{...t,...a,actionState:n,retryLastAction:l,isLoading:n.pending,hasError:!!n.error,errorMessage:n.error,retryCount:n.retryCount}}function Ee(e){const t=s.useRef(null),n=s.useRef(null),[a,l]=s.useTransition(),[c,i]=s.useTransition();s.useRef(0);const f=s.useRef(0),k=s.useRef(0);s.useRef();const F=s.useRef(0),D=E.useMediaStore(),g="getOptimisticState"in D,r=E.useMediaSelector$1(o=>o.isPlaying),w=E.useMediaSelector$1(o=>o.currentTime),v=E.useMediaSelector$1(o=>o.duration),m=E.useMediaSelector$1(o=>o.volume),y=E.useMediaSelector$1(o=>o.isMuted),P=E.useMediaSelector$1(o=>o.isLoading),h=E.useMediaSelector$1(o=>o.isBuffering),d=E.useMediaSelector$1(o=>o.error),b=E.useMediaSelector$1(o=>o.buffered),T=E.useMediaSelector$1(o=>o.isFullscreen),M=D,S=g?ce(M):null,p=g?ue(M):null,[K,R]=s.useState({frameRate:0,averageRenderTime:0,droppedFrames:0,bufferHealth:0}),[I,A]=s.useOptimistic(m,(o,C)=>Math.max(0,Math.min(1,C)));s.useOptimistic(w,(o,C)=>Math.max(0,Math.min(v||0,C))),s.useEffect(()=>{const o=t.current;if(!o)return;const C={volume:e.volume,muted:e.muted,autoplay:e.autoPlay,loop:e.loop,preload:e.preload,crossOrigin:e.crossOrigin};Object.entries(C).forEach(([U,G])=>{G!==void 0&&(o[U]=G)}),o.setAttribute("preload",e.preloadStrategy==="eager"?"auto":"metadata"),e.bufferingStrategy==="aggressive"&&o.setAttribute("buffered","auto"),o instanceof HTMLVideoElement&&(o.style.willChange="transform",o.style.transform="translateZ(0)")},[e.volume,e.muted,e.autoPlay,e.loop,e.preload,e.crossOrigin,e.preloadStrategy,e.bufferingStrategy]);const L=s.useCallback(()=>{const o=t.current;if(!o)return;const C=performance.now();if(e.enableTimeUpdateThrottling!==!1){if(C-F.current<(e.timeUpdateThrottleMs||100))return;F.current=C}l(()=>{g&&p&&p.setCurrentTime(o.currentTime)})},[e.enableTimeUpdateThrottling,e.timeUpdateThrottleMs,g,p]),O=s.useCallback(()=>{l(()=>{g&&p&&p.play(!0)}),e.onPlay?.()},[g,p,e.onPlay]),V=s.useCallback(()=>{l(()=>{g&&p&&p.pause(!0)}),e.onPause?.()},[g,p,e.onPause]),$=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&(p.setVolume(o.volume,!0),o.muted?p.mute(!0):p.unmute(!0))})},[g,p]),u=s.useCallback(()=>{i(()=>{})},[]),_=s.useCallback(()=>{},[]),q=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&p.setBuffered(o.buffered)})},[g,p]),z=s.useCallback(()=>{const o=performance.now();if(o-k.current>0&&(f.current++,f.current>=60)){const U=Math.round(f.current*1e3/(o-k.current));R(G=>({...G,frameRate:U,droppedFrames:Math.max(0,60-U)})),f.current=0,k.current=o}},[]);s.useEffect(()=>{const o=t.current;if(!o)return;const C=[{event:"timeupdate",handler:L,passive:!0},{event:"play",handler:O},{event:"pause",handler:V},{event:"volumechange",handler:$},{event:"seeking",handler:u},{event:"seeked",handler:_},{event:"progress",handler:q,passive:!0},{event:"loadedmetadata",handler:()=>z()},{event:"loadeddata",handler:()=>z()}];C.forEach(({event:X,handler:Y,passive:ee})=>{const te=ee?{passive:!0}:{};o.addEventListener(X,Y,te)});let U;const G=()=>{z(),U=requestAnimationFrame(G)};return e.enablePerformanceMonitoring&&G(),()=>{C.forEach(({event:X,handler:Y})=>{o.removeEventListener(X,Y)}),U&&cancelAnimationFrame(U)}},[L,O,V,$,u,_,q,z,e.enablePerformanceMonitoring]);const Z=s.useMemo(()=>{const o=async()=>{const x=t.current;if(x)if(g&&p)await p.play(!0);else try{await x.play()}catch(H){console.error("Failed to play media:",H)}},C=()=>{const x=t.current;x&&(g&&p?p.pause(!0):x.pause())};return{play:o,pause:C,toggle:()=>{r?C():o()},seek:x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(x,v||0));g&&p?i(()=>{p.seek(W,!0)}):H.currentTime=W},setVolume:x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(1,x));g&&p?(A(W),l(()=>{p.setVolume(W,!0)})):H.volume=W},toggleMute:()=>{const x=t.current;x&&(g&&p?p.toggleMute(!0):x.muted=!x.muted)},enterFullscreen:async()=>{const x=n.current;if(!(!x||!document.fullscreenEnabled))try{await x.requestFullscreen(),g&&p&&p.enterFullscreen(!0)}catch(H){console.error("Failed to enter fullscreen:",H)}},exitFullscreen:async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),g&&p&&p.exitFullscreen(!0)}catch(x){console.error("Failed to exit fullscreen:",x)}}}},[r,v,g,p,l,i,A]),J=s.useMemo(()=>({isPlaying:S?.isPlaying??r,currentTime:S?.currentTime??w,duration:S?.duration??v,volume:S?.volume??I,isMuted:S?.isMuted??y,isLoading:S?.isBuffering??P,isBuffering:S?.isBuffering??h,error:S?.error??d,buffered:S?.buffered??b,isFullscreen:S?.isFullscreen??T,progress:v>0?w/v:0,isTransitioning:a||c,canPlay:!P&&!h&&!d}),[S,r,w,v,I,y,P,h,d,b,T,a,c]);return{mediaRef:t,containerRef:n,state:J,actualState:S?.actualState,controls:Z,performanceMetrics:K,isTransitioning:a||c,actions:S?.actions,actionState:S?.actionState,optimisticState:S,isEnhanced:g}}function be(e={}){const{maxMemoryUsage:t=100,cleanupInterval:n=3e4,enableGC:a=!0,monitorMemory:l=!0}=e;s.useRef();const c=s.useRef(new Set),i=s.useRef(new Map),f=s.useRef(new Set),k=s.useRef(new Set),F=s.useCallback(()=>{if(typeof window>"u"||!("memory"in performance))return{used:0,total:0,limit:0};const h=performance.memory;return{used:h.usedJSHeapSize,total:h.totalJSHeapSize,limit:h.jsHeapSizeLimit}},[]),[D,g]=s.useState({used:0,total:0,limit:0,usage:0,isHighUsage:!1});s.useEffect(()=>{if(!l)return;const h=()=>{const b=F(),T=b.used/1024/1024,M=T>t;g({...b,usage:T,isHighUsage:M}),M&&a&&r()};h();const d=v(h,n);return f.current.add(d),()=>{clearInterval(d),f.current.delete(d)}},[l,F,t,a,n]);const r=s.useCallback(()=>{f.current.forEach(h=>{clearTimeout(h)}),f.current.clear(),k.current.forEach(h=>{cancelAnimationFrame(h)}),k.current.clear(),c.current.forEach(h=>{h.disconnect()}),c.current.clear(),i.current.forEach((h,d)=>{h.forEach(({event:b,handler:T})=>{d.removeEventListener(b,T)})}),i.current.clear(),a&&"gc"in window&&window.gc()},[a]),w=s.useCallback((h,d,b,T)=>(h.addEventListener(d,b,T),i.current.has(h)||i.current.set(h,[]),i.current.get(h).push({event:d,handler:b}),()=>{h.removeEventListener(d,b);const M=i.current.get(h);if(M){const S=M.findIndex(p=>p.event===d&&p.handler===b);S>-1&&M.splice(S,1),M.length===0&&i.current.delete(h)}}),[]),v=s.useCallback((h,d)=>{const b=v(h,d);return f.current.add(b),()=>{clearInterval(b),f.current.delete(b)}},[]),m=s.useCallback((h,d)=>{const b=m(h,d);return f.current.add(b),()=>{clearTimeout(b),f.current.delete(b)}},[]),y=s.useCallback(h=>{const d=y(h);return k.current.add(d),()=>{cancelAnimationFrame(d),k.current.delete(d)}},[]),P=s.useCallback(h=>(c.current.add(h),()=>{h.disconnect(),c.current.delete(h)}),[]);return s.useEffect(()=>()=>{r()},[r]),{memoryStats:D,getMemoryUsage:F,performCleanup:r,addEventListener:w,setInterval:v,setTimeout:m,requestAnimationFrame:y,addObserver:P,formatBytes:h=>{if(h===0)return"0 Bytes";const d=1024,b=["Bytes","KB","MB","GB"],T=Math.floor(Math.log(h)/Math.log(d));return parseFloat((h/Math.pow(d,T)).toFixed(2))+" "+b[T]}}}function le({enabled:e=!0,state:t,controls:n,seekStep:a=10,volumeStep:l=.1}){const c=i=>{if(!e)return;const f=i.target;if(!(f.tagName==="INPUT"||f.tagName==="TEXTAREA"||f.contentEditable==="true"))switch(i.code){case"Space":case"KeyK":i.preventDefault(),n.toggle();break;case"KeyM":i.preventDefault(),n.toggleMute();break;case"KeyF":i.preventDefault(),n.toggleFullscreen();break;case"ArrowLeft":i.preventDefault(),n.seek(Math.max(0,t.currentTime-a));break;case"ArrowRight":i.preventDefault(),n.seek(Math.min(t.duration,t.currentTime+a));break;case"ArrowUp":i.preventDefault(),n.setVolume(Math.min(1,t.volume+l));break;case"ArrowDown":i.preventDefault(),n.setVolume(Math.max(0,t.volume-l));break;case"Digit0":case"Digit1":case"Digit2":case"Digit3":case"Digit4":case"Digit5":case"Digit6":case"Digit7":case"Digit8":case"Digit9":i.preventDefault();const F=parseInt(i.code.replace("Digit",""),10)/10;n.seek(t.duration*F);break;case"Home":i.preventDefault(),n.seek(0);break;case"End":i.preventDefault(),n.seek(t.duration);break}};return s.useEffect(()=>{if(e)return document.addEventListener("keydown",c),()=>{document.removeEventListener("keydown",c)}},[e,c]),{handleKeyDown:c}}const we=Object.freeze(Object.defineProperty({__proto__:null,useKeyboardControls:le},Symbol.toStringTag,{value:"Module"}));function Me(){const[e,t]=s.useState({isPlaying:!1,currentTime:0,duration:0,volume:1,isMuted:!1,isLoading:!1,isFullscreen:!1,error:null,buffered:null}),n=r=>{t(w=>({...w,...r}))};return{state:e,updateState:n,setPlaying:r=>{n({isPlaying:r})},setCurrentTime:r=>{n({currentTime:r})},setDuration:r=>{n({duration:r})},setVolume:r=>{n({volume:Math.max(0,Math.min(1,r))})},setMuted:r=>{n({isMuted:r})},setLoading:r=>{n({isLoading:r})},setFullscreen:r=>{n({isFullscreen:r})},setError:r=>{n({error:r})},setBuffered:r=>{n({buffered:r})}}}function de(e){const t=s.useRef(null),n=s.useRef(null),{state:a,setPlaying:l,setCurrentTime:c,setDuration:i,setVolume:f,setMuted:k,setLoading:F,setFullscreen:D,setError:g,setBuffered:r}=Me();s.useEffect(()=>{const u=t.current;u&&(e.volume!==void 0&&(u.volume=e.volume,f(e.volume)),e.muted!==void 0&&(u.muted=e.muted,k(e.muted)),e.autoPlay!==void 0&&(u.autoplay=e.autoPlay),e.loop!==void 0&&(u.loop=e.loop),e.preload!==void 0&&(u.preload=e.preload),e.crossOrigin!==void 0&&(u.crossOrigin=e.crossOrigin))},[e,f,k]);const w=()=>{l(!0),e.onPlay?.()},v=()=>{l(!1),e.onPause?.()},m=()=>{const u=t.current;u&&(c(u.currentTime),e.onTimeUpdate?.(u.currentTime))},y=()=>{const u=t.current;u&&(i(u.duration),e.onDurationChange?.(u.duration))},P=()=>{const u=t.current;u&&(f(u.volume),k(u.muted),e.onVolumeChange?.(u.volume))},h=()=>{F(!0),g(null),e.onLoadStart?.()},d=()=>{F(!1),e.onLoadedData?.()},b=()=>{const u=t.current;if(!u)return;const _=u.error?.message||"An error occurred while loading the media";g(_),F(!1),e.onError?.(_)},T=()=>{l(!1),e.onEnded?.()},M=()=>{const u=t.current;u&&r(u.buffered)};s.useEffect(()=>{const u=t.current;if(u)return u.addEventListener("play",w),u.addEventListener("pause",v),u.addEventListener("timeupdate",m),u.addEventListener("durationchange",y),u.addEventListener("volumechange",P),u.addEventListener("loadstart",h),u.addEventListener("loadeddata",d),u.addEventListener("error",b),u.addEventListener("ended",T),u.addEventListener("progress",M),()=>{u.removeEventListener("play",w),u.removeEventListener("pause",v),u.removeEventListener("timeupdate",m),u.removeEventListener("durationchange",y),u.removeEventListener("volumechange",P),u.removeEventListener("loadstart",h),u.removeEventListener("loadeddata",d),u.removeEventListener("error",b),u.removeEventListener("ended",T),u.removeEventListener("progress",M)}},[w,v,m,y,P,h,d,b,T,M]);const S=async()=>{const u=t.current;if(u)try{await u.play()}catch(_){console.error("Failed to play media:",_),g("Failed to play media")}},p=()=>{const u=t.current;u&&u.pause()},K=()=>{a.isPlaying?p():S()},R=u=>{const _=t.current;_&&(_.currentTime=Math.max(0,Math.min(u,_.duration||0)))},I=u=>{const _=t.current;if(!_)return;const q=Math.max(0,Math.min(1,u));_.volume=q},A=()=>{const u=t.current;u&&(u.muted=!u.muted)},L=async()=>{const u=n.current;if(!(!u||!document.fullscreenEnabled))try{await u.requestFullscreen(),D(!0)}catch(_){console.error("Failed to enter fullscreen:",_)}},O=async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),D(!1)}catch(u){console.error("Failed to exit fullscreen:",u)}},V=()=>{document.fullscreenElement?O():L()};return s.useEffect(()=>{const u=()=>{D(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",u),()=>{document.removeEventListener("fullscreenchange",u)}},[D]),{state:a,controls:{play:S,pause:p,toggle:K,seek:R,setVolume:I,toggleMute:A,enterFullscreen:L,exitFullscreen:O,toggleFullscreen:V},mediaRef:t,containerRef:n}}const j={mobile:768,desktop:1280};function se(){if(typeof window>"u")return"unknown";const e=window.navigator.userAgent.toLowerCase();return/iphone|ipad|ipod/.test(e)?"ios":/android/.test(e)?"android":/windows|mac|linux/.test(e)?"desktop":"unknown"}function ae(){return typeof window>"u"?!1:"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0}function ie(){return typeof window>"u"?!1:"vibrate"in navigator||"vibration"in navigator||"ondevicemotion"in window}function ne(){const[e,t]=Q.useState(()=>{if(typeof window>"u")return{isMobile:!1,isTablet:!1,isDesktop:!0,isTouchDevice:!1,platform:"unknown",supportsHaptics:!1,screenSize:{width:1920,height:1080},orientation:"landscape"};const n=window.innerWidth,a=window.innerHeight;return{isMobile:n<j.mobile,isTablet:n>=j.mobile&&n<j.desktop,isDesktop:n>=j.desktop,isTouchDevice:ae(),platform:se(),supportsHaptics:ie(),screenSize:{width:n,height:a},orientation:n>a?"landscape":"portrait"}});return Q.useEffect(()=>{const n=()=>{const i=window.innerWidth,f=window.innerHeight;t({isMobile:i<j.mobile,isTablet:i>=j.mobile&&i<j.desktop,isDesktop:i>=j.desktop,isTouchDevice:ae(),platform:se(),supportsHaptics:ie(),screenSize:{width:i,height:f},orientation:i>f?"landscape":"portrait"})};window.addEventListener("resize",n),window.addEventListener("orientationchange",n);const a=window.matchMedia(`(max-width: ${j.mobile-1}px)`),l=window.matchMedia(`(min-width: ${j.mobile}px) and (max-width: ${j.desktop-1}px)`),c=window.matchMedia(`(min-width: ${j.desktop}px)`);return a.addEventListener("change",n),l.addEventListener("change",n),c.addEventListener("change",n),()=>{window.removeEventListener("resize",n),window.removeEventListener("orientationchange",n),a.removeEventListener("change",n),l.removeEventListener("change",n),c.removeEventListener("change",n)}},[]),e}function Se(){const{platform:e,isMobile:t}=ne();Q.useEffect(()=>{if(t){if(e==="ios"){const n=a=>{a.touches.length>1&&a.preventDefault()};return document.addEventListener("touchstart",n,{passive:!1}),document.body.style.webkitOverflowScrolling="touch",()=>{document.removeEventListener("touchstart",n)}}e==="android"&&(document.body.style.touchAction="manipulation"),document.documentElement.style.setProperty("--webkit-transform","translateZ(0)"),document.documentElement.style.setProperty("--transform","translateZ(0)")}},[e,t])}function ke(){const{supportsHaptics:e}=ne();return{triggerHaptic:Q.useCallback((n="light")=>{if(!e)return;const l={light:[10],medium:[20],heavy:[30],success:[10,10,10],warning:[20,20],error:[50,20,50]}[n];"vibrate"in navigator&&navigator.vibrate(l)},[e]),supportsHaptics:e}}const Le={enabledGestures:["tap","double-tap","long-press","swipe-left","swipe-right","swipe-up","swipe-down","pinch-in","pinch-out"],tapThreshold:200,doubleTapThreshold:300,longPressThreshold:500,swipeThreshold:50,swipeVelocityThreshold:.5,pinchThreshold:.1,rotationThreshold:15,enableHapticFeedback:!0};function me(e,t,n={}){const a={...Le,...n},{isTouchDevice:l}=ne(),{triggerHaptic:c}=ke(),i=Q.useRef({isTracking:!1,touches:[],startTouches:[]}),f=v=>({id:v.identifier,x:v.clientX,y:v.clientY,timestamp:Date.now()}),k=(v,m)=>Math.sqrt(Math.pow(m.x-v.x,2)+Math.pow(m.y-v.y,2)),F=(v,m)=>{const y=Math.max(m.timestamp-v.timestamp,1);return{x:(m.x-v.x)/y,y:(m.y-v.y)/y}},D=(v,m,y,P={})=>({type:v,startPoint:{x:m.x,y:m.y},currentPoint:{x:y.x,y:y.y},duration:y.timestamp-m.timestamp,target:e.current,preventDefault:()=>{},...P}),g=Q.useCallback(v=>{if(!a.enabledGestures.length)return;const m=Array.from(v.touches).map(f),y=i.current;y.isTracking=!0,y.touches=m,y.startTouches=[...m],y.longPressTimer&&clearTimeout(y.longPressTimer),m.length===1&&a.enabledGestures.includes("long-press")&&(y.longPressTimer=setTimeout(()=>{if(y.touches.length===1&&m[0]){const P=D("long-press",m[0],m[0]);t(P),a.enableHapticFeedback&&c("heavy")}},a.longPressThreshold)),m.length===2&&m[0]&&m[1]&&(y.initialDistance=k(m[0],m[1]),y.initialScale=1,y.lastScale=1)},[a,t,c]),r=Q.useCallback(v=>{const m=i.current;if(!m.isTracking)return;const y=Array.from(v.touches).map(f);if(m.touches=y,y.length===2&&m.initialDistance&&y[0]&&y[1]){const P=k(y[0],y[1]),h=P/m.initialDistance;if(Math.abs(h-(m.lastScale||1))>a.pinchThreshold){const b=h>(m.lastScale||1)?"pinch-out":"pinch-in";if(a.enabledGestures.includes(b)){const T={x:(y[0].x+y[1].x)/2,y:(y[0].y+y[1].y)/2,timestamp:Date.now()},M={x:((m.startTouches[0]?.x??0)+(m.startTouches[1]?.x??0))/2,y:((m.startTouches[0]?.y??0)+(m.startTouches[1]?.y??0))/2,timestamp:m.startTouches[0]?.timestamp??Date.now()},S=D(b,M,T,{scale:h,distance:P});t(S),m.lastScale=h}}}if(m.longPressTimer&&y.length===1&&m.startTouches[0]&&y[0]){const P=m.startTouches[0],h=y[0];k(P,h)>a.swipeThreshold&&(clearTimeout(m.longPressTimer),m.longPressTimer=void 0)}},[a,t]),w=Q.useCallback(v=>{const m=i.current;if(!m.isTracking)return;const y=Array.from(v.changedTouches).map(f),P=Date.now();if(m.longPressTimer&&(clearTimeout(m.longPressTimer),m.longPressTimer=void 0),m.startTouches.length===1&&y.length===1&&m.startTouches[0]&&y[0]){const h=m.startTouches[0],d=y[0],b=k(h,d),T=d.timestamp-h.timestamp;if(b>a.swipeThreshold){const M=F(h,d),S=Math.abs(M.x),p=Math.abs(M.y);if(S>a.swipeVelocityThreshold||p>a.swipeVelocityThreshold){let K;if(S>p?K=M.x>0?"swipe-right":"swipe-left":K=M.y>0?"swipe-down":"swipe-up",a.enabledGestures.includes(K)){const R=D(K,h,d,{velocity:M,distance:b});t(R),a.enableHapticFeedback&&c("light")}}}else if(T<a.tapThreshold&&b<a.swipeThreshold)if(m.lastTap&&P-m.lastTap.timestamp<a.doubleTapThreshold&&k({...m.lastTap.point},d)<a.swipeThreshold){if(a.enabledGestures.includes("double-tap")){const M=D("double-tap",h,d);t(M),a.enableHapticFeedback&&c("medium")}m.lastTap=void 0}else{if(a.enabledGestures.includes("tap")){const M=D("tap",h,d);t(M),a.enableHapticFeedback&&c("light")}m.lastTap={timestamp:P,point:{x:d.x,y:d.y}}}}v.touches.length===0&&(m.isTracking=!1,m.touches=[],m.startTouches=[],m.initialDistance=void 0,m.initialScale=void 0,m.lastScale=void 0)},[a,t,c]);return Q.useEffect(()=>{const v=e.current;if(!(!v||!l))return v.addEventListener("touchstart",g,{passive:!1}),v.addEventListener("touchmove",r,{passive:!1}),v.addEventListener("touchend",w,{passive:!1}),v.addEventListener("touchcancel",w,{passive:!1}),()=>{v.removeEventListener("touchstart",g),v.removeEventListener("touchmove",r),v.removeEventListener("touchend",w),v.removeEventListener("touchcancel",w)}},[g,r,w,l]),{isGestureEnabled:l&&a.enabledGestures.length>0}}function Pe(e,t){const n=Q.useCallback(l=>{const{type:c,distance:i,scale:f}=l;switch(c){case"double-tap":t.onPlayPause?.();break;case"swipe-left":const k=Math.min((i||0)/10,30);t.onSeek?.("backward",k);break;case"swipe-right":const F=Math.min((i||0)/10,30);t.onSeek?.("forward",F);break;case"swipe-up":if(l.startPoint.x>(e.current?.clientWidth||0)/2){const D=Math.min((i||0)/100,.2);t.onVolumeChange?.("up",D)}break;case"swipe-down":if(l.startPoint.x>(e.current?.clientWidth||0)/2){const D=Math.min((i||0)/100,.2);t.onVolumeChange?.("down",D)}break;case"pinch-out":t.onZoom?.(f||1);break;case"pinch-in":t.onZoom?.(f||1);break;case"long-press":t.onToggleFullscreen?.();break}},[t,e]);return me(e,n,{enabledGestures:["tap","double-tap","long-press","swipe-left","swipe-right","swipe-up","swipe-down","pinch-in","pinch-out"],enableHapticFeedback:!0,swipeThreshold:30,swipeVelocityThreshold:.3})}function Ce(e){const t=s.useRef(null),[n,a]=s.useState({isPlaying:!1,currentTime:0,duration:0,volume:1,isMuted:!1,isFullscreen:!1,isLoading:!0,isSeeking:!1,isBuffering:!1,bufferedRanges:[]});return s.useEffect(()=>{const r=t.current;if(!r)return;const w=()=>{a(R=>({...R,currentTime:r.currentTime}))},v=()=>{a(R=>({...R,duration:r.duration}))},m=()=>{a(R=>({...R,isPlaying:!0,isBuffering:!1}))},y=()=>{a(R=>({...R,isPlaying:!1}))},P=()=>{a(R=>({...R,volume:r.volume,isMuted:r.muted}))},h=()=>{a(R=>({...R,isLoading:!0}))},d=()=>{a(R=>({...R,isLoading:!1}))},b=()=>{a(R=>({...R,isSeeking:!0}))},T=()=>{a(R=>({...R,isSeeking:!1}))},M=()=>{a(R=>({...R,isBuffering:!0}))},S=()=>{a(R=>({...R,isBuffering:!1,isLoading:!1}))},p=()=>{a(R=>({...R,isLoading:!1,isBuffering:!1}))},K=()=>{if(!r.buffered||r.buffered.length===0||r.duration===0){a(I=>({...I,bufferedRanges:[]}));return}const R=[];for(let I=0;I<r.buffered.length;I++){const A=r.buffered.start(I),L=r.buffered.end(I);R.push({start:A,end:L,percentage:(L-A)/r.duration*100})}a(I=>({...I,bufferedRanges:R}))};return r.addEventListener("timeupdate",w),r.addEventListener("loadedmetadata",v),r.addEventListener("play",m),r.addEventListener("pause",y),r.addEventListener("volumechange",P),r.addEventListener("loadstart",h),r.addEventListener("loadeddata",d),r.addEventListener("seeking",b),r.addEventListener("seeked",T),r.addEventListener("waiting",M),r.addEventListener("playing",S),r.addEventListener("canplay",p),r.addEventListener("progress",K),()=>{r.removeEventListener("timeupdate",w),r.removeEventListener("loadedmetadata",v),r.removeEventListener("play",m),r.removeEventListener("pause",y),r.removeEventListener("volumechange",P),r.removeEventListener("loadstart",h),r.removeEventListener("loadeddata",d),r.removeEventListener("seeking",b),r.removeEventListener("seeked",T),r.removeEventListener("waiting",M),r.removeEventListener("playing",S),r.removeEventListener("canplay",p),r.removeEventListener("progress",K)}},[]),{videoRef:t,state:n,controls:{togglePlay:()=>{const r=t.current;r&&(n.isPlaying?r.pause():r.play())},seekForward:(r=10)=>{const w=t.current;w&&(w.currentTime=Math.min(n.duration,w.currentTime+r))},seekBackward:(r=10)=>{const w=t.current;w&&(w.currentTime=Math.max(0,w.currentTime-r))},toggleMute:()=>{const r=t.current;r&&(r.muted=!n.isMuted)},setVolume:r=>{const w=t.current;w&&(w.volume=r,r>0&&n.isMuted&&(w.muted=!1))},toggleFullscreen:()=>{const r=e.current;r&&(n.isFullscreen?document.exitFullscreen&&document.exitFullscreen():r.requestFullscreen&&r.requestFullscreen(),a(w=>({...w,isFullscreen:!w.isFullscreen})))},seekTo:r=>{const w=t.current;!w||n.duration===0||(w.currentTime=Math.max(0,Math.min(n.duration,r)))}}}}function fe({subtitleSrc:e,subtitleTracks:t=[],defaultFontSize:n="medium",onLoadError:a}={}){const[l,c]=s.useState(!1),[i,f]=s.useState([]),[k,F]=s.useState(""),[D,g]=s.useState(null),[r,w]=s.useState(n),[v,m]=s.useState(null),[y,P]=s.useState(!1),h={small:"text-sm",medium:"text-base",large:"text-lg"},d=!!(e||t&&t.length>0),b=A=>{const L=A.split(":"),O=L[2]?parseFloat(L[2]):0,V=L[1]?parseInt(L[1],10)*60:0;return(L[0]?parseInt(L[0],10)*3600:0)+V+O},T=A=>{const[L,O]=A.split(","),V=(L||"").split(":"),$=O?parseInt(O,10)/1e3:0,u=V[2]?parseInt(V[2],10):0,_=V[1]?parseInt(V[1],10)*60:0;return(V[0]?parseInt(V[0],10)*3600:0)+_+u+$},M=async A=>{P(!0),m(null);try{const L=await fetch(A);if(!L.ok)throw new Error(`Failed to load subtitles: ${L.status} ${L.statusText}`);const O=await L.text(),V=[],$=O.split(`
|
|
2
|
+
`);let u=0;const _=O.includes("WEBVTT")||A.endsWith(".vtt"),q=A.endsWith(".srt")||/^\d+$/.test($[0]?.trim()||"");if(_)for(;u<$.length;){if($[u]?.includes("-->")){const[z,Z]=($[u]||"").split("-->").map(U=>U.trim()),J=b(z||""),o=b(Z||"");u++;let C="";for(;u<$.length&&$[u]?.trim()!=="";)C+=(C?" ":"")+$[u]?.trim(),u++;C&&V.push({start:J,end:o,text:C})}u++}else if(q)for(;u<$.length;){if(/^\d+$/.test($[u]?.trim()||"")&&(u++,$[u]?.includes("-->"))){const[z,Z]=($[u]||"").split("-->").map(U=>U.trim()),J=T(z||""),o=T(Z||"");u++;let C="";for(;u<$.length&&$[u]?.trim()!=="";)C+=(C?" ":"")+$[u]?.trim(),u++;C&&V.push({start:J,end:o,text:C})}u++}else throw new Error("Unsupported subtitle format. Only VTT and SRT are supported.");if(V.length===0)throw new Error("No subtitle cues found in file");f(V),P(!1)}catch(L){const O=L instanceof Error?L:new Error("Failed to load subtitles");console.error("Failed to load subtitles:",O),m(O),P(!1),f([]),a?.(O)}},S=A=>!l||i.length===0?"":i.find(O=>A>=O.start&&A<=O.end)?.text||"",p=()=>{c(A=>{const L=!A;if(L&&!v){if(i.length===0&&!y){const O=e||t[0]?.src;O&&(M(O),t[0]&&g(t[0].id))}}else L||F("");return L})},K=A=>{if(!A){c(!1),g(null),F("");return}const L=t.find(O=>O.id===A);L?.src&&(g(A),M(L.src),c(!0))},R=A=>{w(A)},I={fontSize:h[r],className:`${h[r]} font-medium`};return s.useEffect(()=>{l||F("")},[l]),s.useEffect(()=>{},[]),{subtitlesEnabled:l,currentSubtitle:k,subtitleCues:i,currentTrackId:D,fontSize:r,loadError:v,isLoading:y,hasSubtitles:d,toggleSubtitles:p,selectSubtitleTrack:K,changeSubtitleFontSize:R,setCurrentSubtitle:F,getCurrentSubtitle:S,getSubtitleStyles:I,availableTracks:t}}const Ae=Object.freeze(Object.defineProperty({__proto__:null,useEnhancedSubtitles:fe},Symbol.toStringTag,{value:"Module"}));function Fe(e,t){const[n,a]=s.useState(!0),[l,c]=s.useState(!1),i=s.useRef(null),f=()=>{a(!0),i.current&&clearTimeout(i.current),e&&!t&&(i.current=setTimeout(()=>{a(!1)},3e3))},k=()=>{f()},F=()=>{a(!0)},D=()=>{e&&a(!1)};return s.useEffect(()=>(f(),()=>{i.current&&clearTimeout(i.current)}),[f]),{controlsVisible:n,showVolumeSlider:l,setShowVolumeSlider:c,handleMouseMove:k,handleMouseEnter:F,handleMouseLeave:D}}function De({videoControls:e,toggleSubtitles:t,takeScreenshot:n,duration:a}){const l=c=>{const i=document.querySelector("video");if(i)switch(c.key.toLowerCase()){case" ":case"k":c.preventDefault(),e.togglePlay();break;case"j":c.preventDefault(),e.seekBackward();break;case"l":c.preventDefault(),e.seekForward();break;case"arrowleft":c.preventDefault(),i.currentTime=Math.max(0,i.currentTime-5);break;case"arrowright":c.preventDefault(),i.currentTime=Math.min(a,i.currentTime+5);break;case"arrowup":c.preventDefault(),i.volume=Math.min(1,i.volume+.1);break;case"arrowdown":c.preventDefault(),i.volume=Math.max(0,i.volume-.1);break;case"m":c.preventDefault(),e.toggleMute();break;case"f":c.preventDefault(),e.toggleFullscreen();break;case"c":c.preventDefault(),t();break;case"s":c.preventDefault(),n(c.ctrlKey||c.metaKey);break}};s.useEffect(()=>(document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)),[l])}function Re(e){return{takeScreenshot:(n=!1)=>{if(!e.current)return;const a=e.current,l=document.createElement("canvas");l.width=a.videoWidth,l.height=a.videoHeight;const c=l.getContext("2d");if(c)try{c.drawImage(a,0,0),l.toBlob(i=>{if(!i){console.error("Failed to create blob from canvas");return}if(n)if(navigator.clipboard&&window.ClipboardItem){const f=new ClipboardItem({"image/png":i});navigator.clipboard.write([f]).catch(k=>{console.error("Failed to copy to clipboard:",k)})}else console.warn("Clipboard API not supported");else{const f=URL.createObjectURL(i),k=document.createElement("a");k.href=f,k.download=`screenshot-${Date.now()}.png`,k.click(),URL.revokeObjectURL(f)}},"image/png")}catch(i){i instanceof Error&&i.message.includes("tainted")?(console.error("Canvas is tainted - video source may not have proper CORS headers. Try setting crossOrigin='anonymous' on the video element."),alert("Screenshot failed: The video source doesn't allow screenshots due to CORS policy. Please ensure the video server includes proper CORS headers or set crossOrigin='anonymous' on the video player.")):(console.error("Screenshot failed:",i),alert("Screenshot failed: "+(i instanceof Error?i.message:"Unknown error")))}}}}function N(e,t){return((n,a=!1)=>{const l={type:e,detail:n,optimistic:a,timestamp:Date.now()};return a?t.dispatchOptimistic(l):(t.dispatch(l),Promise.resolve())})}function pe(e){const[t,n]=s.useState(e.getActionState());return s.useEffect(()=>e.subscribe(()=>{const l=e.getActionState();n(c=>JSON.stringify(c)!==JSON.stringify(l)?l:c)}),[e]),t}function xe(e){const t=s.useMemo(()=>({play:N(E.MediaActionTypes.PLAY,e),pause:N(E.MediaActionTypes.PAUSE,e),seek:N(E.MediaActionTypes.SEEK,e),setVolume:N(E.MediaActionTypes.SET_VOLUME,e),mute:N(E.MediaActionTypes.MUTE,e),unmute:N(E.MediaActionTypes.UNMUTE,e),toggleMute:N(E.MediaActionTypes.TOGGLE_MUTE,e),setDuration:N(E.MediaActionTypes.SET_DURATION,e),setCurrentTime:N(E.MediaActionTypes.SET_CURRENT_TIME,e),setBuffered:N(E.MediaActionTypes.SET_BUFFERED,e),setLoading:N(E.MediaActionTypes.SET_LOADING,e),setError:N(E.MediaActionTypes.SET_ERROR,e),enterFullscreen:N(E.MediaActionTypes.ENTER_FULLSCREEN,e),exitFullscreen:N(E.MediaActionTypes.EXIT_FULLSCREEN,e),enterPiP:N(E.MediaActionTypes.ENTER_PIP,e),exitPiP:N(E.MediaActionTypes.EXIT_PIP,e),setPlaybackRate:N(E.MediaActionTypes.SET_PLAYBACK_RATE,e),setSubtitleTrack:N(E.MediaActionTypes.SET_SUBTITLE_TRACK,e),setRendition:N(E.MediaActionTypes.SET_RENDITION,e),toggleSubtitles:N(E.MediaActionTypes.TOGGLE_SUBTITLES,e),previewTime:N(E.MediaActionTypes.PREVIEW_TIME,e),clearPreview:N(E.MediaActionTypes.CLEAR_PREVIEW,e)}),[e]),n=pe(e),a=s.useMemo(()=>({togglePlayPause:async c=>{c?await t.pause(!0):await t.play(!0)},seekWithPreview:async c=>{await t.previewTime(c,!0),await t.seek(c,!0)},adjustVolume:async(c,i)=>{const f=Math.max(0,Math.min(1,i+c));await t.setVolume(f,!0)},toggleFullscreenOptimistic:async c=>{c?await t.exitFullscreen(!0):await t.enterFullscreen(!0)}}),[t]),l=s.useCallback(async()=>{const{lastAction:c}=n;c&&n.error&&await e.dispatchOptimistic({...c,retryCount:(c.retryCount||0)+1})},[e,n]);return{...t,...a,actionState:n,retryLastAction:l,isLoading:n.pending,hasError:!!n.error,errorMessage:n.error,retryCount:n.retryCount}}function Oe(){const[e,t]=s.useState({isPlaying:!1,currentTime:0,duration:0,volume:1,isMuted:!1,isLoading:!1,isFullscreen:!1,error:null,buffered:null}),n=r=>{t(w=>({...w,...r}))};return{state:e,updateState:n,setPlaying:r=>{n({isPlaying:r})},setCurrentTime:r=>{n({currentTime:r})},setDuration:r=>{n({duration:r})},setVolume:r=>{n({volume:Math.max(0,Math.min(1,r))})},setMuted:r=>{n({isMuted:r})},setLoading:r=>{n({isLoading:r})},setFullscreen:r=>{n({isFullscreen:r})},setError:r=>{n({error:r})},setBuffered:r=>{n({buffered:r})}}}function Ie(e){const t=s.useRef(null),n=s.useRef(null),[a,l]=s.useTransition(),[c,i]=s.useTransition();s.useRef(0);const f=s.useRef(0),k=s.useRef(0);s.useRef(void 0);const F=s.useRef(0),D=E.useMediaStore(),g="getOptimisticState"in D,r=E.useMediaSelector$1(o=>o.isPlaying),w=E.useMediaSelector$1(o=>o.currentTime),v=E.useMediaSelector$1(o=>o.duration),m=E.useMediaSelector$1(o=>o.volume),y=E.useMediaSelector$1(o=>o.isMuted),P=E.useMediaSelector$1(o=>o.isLoading),h=E.useMediaSelector$1(o=>o.isBuffering),d=E.useMediaSelector$1(o=>o.error),b=E.useMediaSelector$1(o=>o.buffered),T=E.useMediaSelector$1(o=>o.isFullscreen),M=D,S=g?ce(M):null,p=g?ue(M):null,[K,R]=s.useState({frameRate:0,averageRenderTime:0,droppedFrames:0,bufferHealth:0}),[I,A]=s.useOptimistic(m,(o,C)=>Math.max(0,Math.min(1,C)));s.useOptimistic(w,(o,C)=>Math.max(0,Math.min(v||0,C))),s.useEffect(()=>{const o=t.current;if(!o)return;const C={volume:e.volume,muted:e.muted,autoplay:e.autoPlay,loop:e.loop,preload:e.preload,crossOrigin:e.crossOrigin};Object.entries(C).forEach(([U,G])=>{G!==void 0&&(o[U]=G)}),o.setAttribute("preload",e.preloadStrategy==="eager"?"auto":"metadata"),e.bufferingStrategy==="aggressive"&&o.setAttribute("buffered","auto"),o instanceof HTMLVideoElement&&(o.style.willChange="transform",o.style.transform="translateZ(0)")},[e.volume,e.muted,e.autoPlay,e.loop,e.preload,e.crossOrigin,e.preloadStrategy,e.bufferingStrategy]);const L=s.useCallback(()=>{const o=t.current;if(!o)return;const C=performance.now();if(e.enableTimeUpdateThrottling!==!1){if(C-F.current<(e.timeUpdateThrottleMs||100))return;F.current=C}l(()=>{g&&p&&p.setCurrentTime(o.currentTime)})},[e.enableTimeUpdateThrottling,e.timeUpdateThrottleMs,g,p]),O=s.useCallback(()=>{l(()=>{g&&p&&p.play(!0)}),e.onPlay?.()},[g,p,e.onPlay]),V=s.useCallback(()=>{l(()=>{g&&p&&p.pause(!0)}),e.onPause?.()},[g,p,e.onPause]),$=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&(p.setVolume(o.volume,!0),o.muted?p.mute(!0):p.unmute(!0))})},[g,p]),u=s.useCallback(()=>{i(()=>{})},[]),_=s.useCallback(()=>{},[]),q=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&p.setBuffered(o.buffered)})},[g,p]),z=s.useCallback(()=>{const o=performance.now();if(o-k.current>0&&(f.current++,f.current>=60)){const U=Math.round(f.current*1e3/(o-k.current));R(G=>({...G,frameRate:U,droppedFrames:Math.max(0,60-U)})),f.current=0,k.current=o}},[]);s.useEffect(()=>{const o=t.current;if(!o)return;const C=[{event:"timeupdate",handler:L,passive:!0},{event:"play",handler:O},{event:"pause",handler:V},{event:"volumechange",handler:$},{event:"seeking",handler:u},{event:"seeked",handler:_},{event:"progress",handler:q,passive:!0},{event:"loadedmetadata",handler:()=>z()},{event:"loadeddata",handler:()=>z()}];C.forEach(({event:X,handler:Y,passive:ee})=>{const te=ee?{passive:!0}:{};o.addEventListener(X,Y,te)});let U;const G=()=>{z(),U=requestAnimationFrame(G)};return e.enablePerformanceMonitoring&&G(),()=>{C.forEach(({event:X,handler:Y})=>{o.removeEventListener(X,Y)}),U&&cancelAnimationFrame(U)}},[L,O,V,$,u,_,q,z,e.enablePerformanceMonitoring]);const Z=s.useMemo(()=>{const o=async()=>{const x=t.current;if(x)if(g&&p)await p.play(!0);else try{await x.play()}catch(H){console.error("Failed to play media:",H)}},C=()=>{const x=t.current;x&&(g&&p?p.pause(!0):x.pause())},U=()=>{r?C():o()},G=x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(x,v||0));g&&p?i(()=>{p.seek(W,!0)}):H.currentTime=W},X=x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(1,x));g&&p?(A(W),l(()=>{p.setVolume(W,!0)})):H.volume=W},Y=()=>{const x=t.current;x&&(g&&p?p.toggleMute(!0):x.muted=!x.muted)},ee=async()=>{const x=n.current;if(!(!x||!document.fullscreenEnabled))try{await x.requestFullscreen(),g&&p&&p.enterFullscreen(!0)}catch(H){console.error("Failed to enter fullscreen:",H)}},te=async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),g&&p&&p.exitFullscreen(!0)}catch(x){console.error("Failed to exit fullscreen:",x)}};return{play:o,pause:C,toggle:U,seek:G,setVolume:X,toggleMute:Y,enterFullscreen:ee,exitFullscreen:te,toggleFullscreen:()=>{document.fullscreenElement?te():ee()}}},[r,v,g,p,l,i,A]),J=s.useMemo(()=>({isPlaying:S?.state?.isPlaying??r,currentTime:S?.state?.currentTime??w,duration:S?.state?.duration??v,volume:S?.state?.volume??I,isMuted:S?.state?.isMuted??y,isLoading:S?.state?.isBuffering??P,isBuffering:S?.state?.isBuffering??h,error:S?.state?.error??d,buffered:S?.state?.buffered??b,isFullscreen:S?.state?.isFullscreen??T,progress:v>0?w/v:0,isTransitioning:a||c,canPlay:!P&&!h&&!d}),[S,r,w,v,I,y,P,h,d,b,T,a,c]);return{mediaRef:t,containerRef:n,state:J,actualState:S?.actualState,controls:Z,performanceMetrics:K,isTransitioning:a||c,actions:S,actionState:S?.state,optimisticState:S,isEnhanced:g}}const Ve=(e,t={})=>{const{trackUserBehavior:n=!0,adaptToNetwork:a=!0,strategy:l="balanced",maxPreloadItems:c=3,preloadRadius:i=2}=t,f=s.useRef({mouseMovements:0,scrollEvents:0,keyPresses:0,focusEvents:0,timeOnPage:0,engagementScore:0,lastInteraction:Date.now()}),k=s.useRef(null),F=s.useRef(new Set),D=s.useRef([]),g=s.useCallback(()=>{const d=f.current,b=Math.min(d.timeOnPage/6e4,1),T=Math.min((d.mouseMovements+d.scrollEvents+d.keyPresses)/100,1);return(b*.4+T*.6)*100},[]),r=s.useCallback((d,b=1)=>{const T=f.current;T[d]=typeof T[d]=="number"?T[d]+b:Date.now(),T.engagementScore=g(),T.lastInteraction=Date.now()},[g]),w=s.useCallback(()=>{if(!k.current||!a)return{type:"unknown",downlink:10,effectiveType:"4g",saveData:!1};const d=k.current;return{type:d.effectiveType||"4g",downlink:d.downlink||10,effectiveType:d.effectiveType||"4g",saveData:d.saveData||!1,rtt:d.rtt||100}},[a]),v=s.useCallback((d,b,T=0)=>{if(F.current.has(d.src))return{shouldPreload:!1,priority:"low",reason:"Already preloaded"};const M=Math.abs(b-T);if(M>i)return{shouldPreload:!1,priority:"low",reason:"Outside preload radius"};const S=f.current,p=w(),K=S.engagementScore,R=Date.now()-S.lastInteraction;if(p.saveData)return{shouldPreload:!1,priority:"low",reason:"Data saver mode"};let I=!1,A="medium",L="";switch(l){case"conservative":I=K>70&&p.effectiveType!=="2g"&&M===1,A=I?"medium":"low",L=I?"High engagement and optimal network":"Conservative strategy";break;case"aggressive":I=K>30&&p.effectiveType!=="slow-2g",A=K>70?"high":K>50?"medium":"low",L=I?"Aggressive preloading":"Low engagement";break;case"balanced":default:const O=p.effectiveType==="4g"?1:p.effectiveType==="3g"?.7:.3,V=K*O;I=V>40&&M<=2,A=V>70?"high":V>55?"medium":"low",L=I?`Balanced: score ${V.toFixed(1)}`:"Low adjusted score";break}if(I){const O=d.src.toLowerCase();(O.includes(".m3u8")||O.includes("hls"))&&(A=A==="low"?"medium":"high"),R<5e3&&(A="high",L+=" + Recent interaction"),(d.type?.includes("mp4")||d.type?.includes("webm")||O.includes(".mp4")||O.includes(".webm"))&&(A=A==="low"?"medium":A)}return{shouldPreload:I,priority:A,reason:L}},[l,i,w,g]),m=s.useCallback(async(d,b)=>{try{const T=document.createElement("link");T.rel="preload",T.href=d.src;const M=d.src.toLowerCase(),S=d.type?.toLowerCase()||"";M.includes(".m3u8")||M.includes("hls")?T.as="fetch":S.includes("mp4")||S.includes("webm")||M.includes(".mp4")||M.includes(".webm")?T.as="video":S.includes("mp3")||S.includes("wav")||S.includes("ogg")||M.includes(".mp3")||M.includes(".wav")||M.includes(".ogg")?T.as="audio":T.as="fetch",T.crossOrigin="anonymous",document.head.appendChild(T),F.current.add(d.src),console.debug(`Preloaded: ${d.src} (${b})`),setTimeout(()=>{document.head.contains(T)&&document.head.removeChild(T)},3e4)}catch(T){console.warn("Failed to preload source:",d.src,T)}},[]),y=s.useCallback(()=>{if(D.current.length===0)return;const b=[...D.current].sort((T,M)=>M.priority-T.priority).slice(0,c);D.current=[],b.forEach(({source:T,priority:M})=>{m(T,M)})},[c,m]),P=s.useCallback((d=0)=>{D.current=[],e.forEach((b,T)=>{const M=v(b,T,d);if(M.shouldPreload){const S=M.priority==="high"?3:M.priority==="medium"?2:1;D.current.push({source:b,priority:S})}}),y()},[e,v,y]);return s.useEffect(()=>{if(!n)return;const d=()=>r("mouseMovements"),b=()=>r("scrollEvents"),T=()=>r("keyPresses"),M=()=>r("focusEvents");document.addEventListener("mousemove",d,{passive:!0}),document.addEventListener("scroll",b,{passive:!0}),document.addEventListener("keydown",T,{passive:!0}),document.addEventListener("focusin",M,{passive:!0});const S=setInterval(()=>{r("timeOnPage",1)},1e3);return()=>{document.removeEventListener("mousemove",d),document.removeEventListener("scroll",b),document.removeEventListener("keydown",T),document.removeEventListener("focusin",M),clearInterval(S)}},[n,r]),s.useEffect(()=>{if(!a||!("connection"in navigator))return;const d=navigator.connection;k.current=d;const b=()=>{P()};return d.addEventListener("change",b),()=>{d.removeEventListener("change",b)}},[a,P]),s.useEffect(()=>{P()},[P]),s.useMemo(()=>({preloadAtIndex:d=>{P(d)},getUserBehavior:()=>({...f.current}),getNetworkConditions:w,clearCache:()=>{F.current.clear()},getStats:()=>({preloadedItems:F.current.size,engagementScore:f.current.engagementScore,queueLength:D.current.length,maxPreloadItems:c})}),[P,w,c])};function ge(e){const[t,n]=s.useState(!1),[a,l]=s.useState([]),[c,i]=s.useState(""),f=g=>{const r=g.split(":"),w=r[2]?parseFloat(r[2]):0,v=r[1]?parseInt(r[1],10)*60:0;return(r[0]?parseInt(r[0],10)*3600:0)+v+w},k=async g=>{try{const w=await(await fetch(g)).text(),v=[],m=w.split(`
|
|
3
|
+
`);let y=0;for(;y<m.length;){if(m[y]?.includes("-->")){const[P,h]=(m[y]||"").split("-->").map(M=>M.trim()),d=f(P||""),b=f(h||"");y++;let T="";for(;y<m.length&&m[y]?.trim()!=="";)T+=(T?" ":"")+m[y]?.trim(),y++;T&&v.push({start:d,end:b,text:T})}y++}l(v)}catch(r){console.error("Failed to load subtitles:",r)}},F=g=>!t||a.length===0?"":a.find(w=>g>=w.start&&g<=w.end)?.text||"",D=()=>{n(g=>{const r=!g;return r&&e&&a.length===0?k(e):r||i(""),r})};return s.useEffect(()=>{t||i("")},[t]),{subtitlesEnabled:t,currentSubtitle:c,toggleSubtitles:D,getCurrentSubtitle:F,setCurrentSubtitle:i}}function $e(e){return oe.showDeprecationWarning("useVideoPlayer","useMediaPlayer (the primary media player hook)"),de(e)}function Ue(e){return oe.showDeprecationWarning("useEnhancedSubtitles","useSubtitles (the current subtitle hook)"),ge(e)}exports.useDeviceInfo=ne;exports.useEnhancedMediaPlayer=Ee;exports.useEnhancedMediaPlayer$1=Ie;exports.useEnhancedSubtitles=fe;exports.useEnhancedSubtitles$1=Ue;exports.useEnhancedSubtitles$2=Ae;exports.useIntelligentPreloading=Ve;exports.useKeyboardControls=ve;exports.useKeyboardControls$1=le;exports.useKeyboardControls$2=we;exports.useKeyboardShortcuts=De;exports.useMediaActionState=pe;exports.useMediaActions=xe;exports.useMediaControls=Fe;exports.useMediaGestures=Pe;exports.useMediaPlayer=de;exports.useMediaState=Oe;exports.useMemoryOptimization=be;exports.useMobileOptimizations=Se;exports.useScreenshot=Re;exports.useSubtitles=ge;exports.useTouchGestures=me;exports.useVideoPlayer=Ce;exports.useVideoPlayer$1=$e;
|
|
4
|
+
//# sourceMappingURL=hooks-BCMilGRf.cjs.map
|