@therealtinhtute/baroiplayer 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +1 -7
  3. package/dist/index.mjs +1 -2
  4. package/dist/package.json +1 -1
  5. package/package.json +1 -1
  6. package/dist/context/media.js +0 -2
  7. package/dist/context/media.js.map +0 -1
  8. package/dist/context/media.mjs +0 -15
  9. package/dist/context/media.mjs.map +0 -1
  10. package/dist/context/store.js +0 -2
  11. package/dist/context/store.js.map +0 -1
  12. package/dist/context/store.mjs +0 -5
  13. package/dist/context/store.mjs.map +0 -1
  14. package/dist/context-Af84FynT.js +0 -1179
  15. package/dist/context-Af84FynT.js.map +0 -1
  16. package/dist/context-CwZnPdz0.cjs +0 -23
  17. package/dist/context-CwZnPdz0.cjs.map +0 -1
  18. package/dist/core-events-B5W_j8yU.js +0 -480
  19. package/dist/core-events-B5W_j8yU.js.map +0 -1
  20. package/dist/core-events-CN0-Vhhq.cjs +0 -2
  21. package/dist/core-events-CN0-Vhhq.cjs.map +0 -1
  22. package/dist/core-plugins-Bq9KLany.js +0 -696
  23. package/dist/core-plugins-Bq9KLany.js.map +0 -1
  24. package/dist/core-plugins-CPDSHMiQ.cjs +0 -2
  25. package/dist/core-plugins-CPDSHMiQ.cjs.map +0 -1
  26. package/dist/core.js +0 -37
  27. package/dist/core.js.map +0 -1
  28. package/dist/core.mjs +0 -1217
  29. package/dist/core.mjs.map +0 -1
  30. package/dist/enhanced-components-CXnYiOt6.cjs +0 -2
  31. package/dist/enhanced-components-CXnYiOt6.cjs.map +0 -1
  32. package/dist/enhanced-components-Da0TSvKe.js +0 -1073
  33. package/dist/enhanced-components-Da0TSvKe.js.map +0 -1
  34. package/dist/hooks-BCMilGRf.cjs +0 -4
  35. package/dist/hooks-BCMilGRf.cjs.map +0 -1
  36. package/dist/hooks-BPtHV1ZT.js +0 -2042
  37. package/dist/hooks-BPtHV1ZT.js.map +0 -1
  38. package/dist/index.js.map +0 -1
  39. package/dist/index.mjs.map +0 -1
  40. package/dist/minimal-components-BHJMuaL7.cjs +0 -2
  41. package/dist/minimal-components-BHJMuaL7.cjs.map +0 -1
  42. package/dist/minimal-components-BmqRefl1.js +0 -2002
  43. package/dist/minimal-components-BmqRefl1.js.map +0 -1
  44. package/dist/mona-loading.gif +0 -0
  45. package/dist/performance-monitor--rzKTlbj.js +0 -302
  46. package/dist/performance-monitor--rzKTlbj.js.map +0 -1
  47. package/dist/performance-monitor-cjIvZE2D.cjs +0 -2
  48. package/dist/performance-monitor-cjIvZE2D.cjs.map +0 -1
  49. package/dist/src/adapters/videojs-adapter.d.ts.map +0 -1
  50. package/dist/src/adapters/videojs-adapter.js +0 -350
  51. package/dist/src/assets/mona-loading.gif +0 -0
  52. package/dist/src/components/AnimateLoading.d.ts.map +0 -1
  53. package/dist/src/components/AnimateLoading.js +0 -41
  54. package/dist/src/components/LoadingState.d.ts.map +0 -1
  55. package/dist/src/components/LoadingState.js +0 -111
  56. package/dist/src/components/accessibility/keyboard-help-overlay.d.ts.map +0 -1
  57. package/dist/src/components/accessibility/keyboard-help-overlay.js +0 -90
  58. package/dist/src/components/audio-player.d.ts.map +0 -1
  59. package/dist/src/components/audio-player.js +0 -31
  60. package/dist/src/components/basic/index.d.ts.map +0 -1
  61. package/dist/src/components/basic/index.js +0 -29
  62. package/dist/src/components/enhanced/advanced-features.d.ts.map +0 -1
  63. package/dist/src/components/enhanced/advanced-features.js +0 -64
  64. package/dist/src/components/enhanced/debug-panel.d.ts.map +0 -1
  65. package/dist/src/components/enhanced/debug-panel.js +0 -94
  66. package/dist/src/components/enhanced/enhanced-controls.d.ts.map +0 -1
  67. package/dist/src/components/enhanced/enhanced-controls.js +0 -233
  68. package/dist/src/components/enhanced/enhanced-media-player.d.ts.map +0 -1
  69. package/dist/src/components/enhanced/enhanced-media-player.js +0 -316
  70. package/dist/src/components/enhanced/error-handling.d.ts.map +0 -1
  71. package/dist/src/components/enhanced/error-handling.js +0 -153
  72. package/dist/src/components/enhanced/index.d.ts.map +0 -1
  73. package/dist/src/components/enhanced/index.js +0 -10
  74. package/dist/src/components/enhanced/media-player-enhanced.d.ts.map +0 -1
  75. package/dist/src/components/enhanced/media-player-enhanced.js +0 -250
  76. package/dist/src/components/examples/basic-video-player.d.ts.map +0 -1
  77. package/dist/src/components/examples/basic-video-player.js +0 -16
  78. package/dist/src/components/examples/custom-controls-example.d.ts.map +0 -1
  79. package/dist/src/components/examples/custom-controls-example.js +0 -12
  80. package/dist/src/components/examples/enhanced-controls-example.d.ts.map +0 -1
  81. package/dist/src/components/examples/enhanced-controls-example.js +0 -18
  82. package/dist/src/components/examples/enhanced-media-player-example.d.ts.map +0 -1
  83. package/dist/src/components/examples/enhanced-media-player-example.js +0 -13
  84. package/dist/src/components/examples/loading-states-demo.d.ts.map +0 -1
  85. package/dist/src/components/examples/loading-states-demo.js +0 -41
  86. package/dist/src/components/examples/react-19-demo.d.ts.map +0 -1
  87. package/dist/src/components/examples/react-19-demo.js +0 -104
  88. package/dist/src/components/examples/volume-orientation-demo.d.ts.map +0 -1
  89. package/dist/src/components/examples/volume-orientation-demo.js +0 -31
  90. package/dist/src/components/icon-demo.d.ts.map +0 -1
  91. package/dist/src/components/icon-demo.js +0 -16
  92. package/dist/src/components/icons/index.d.ts.map +0 -1
  93. package/dist/src/components/icons/index.js +0 -59
  94. package/dist/src/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +0 -1
  95. package/dist/src/components/icons/svg-icons/ArrowLeftIcon.js +0 -3
  96. package/dist/src/components/icons/svg-icons/ArrowRightIcon.d.ts.map +0 -1
  97. package/dist/src/components/icons/svg-icons/ArrowRightIcon.js +0 -3
  98. package/dist/src/components/icons/svg-icons/AudioIcon.d.ts.map +0 -1
  99. package/dist/src/components/icons/svg-icons/AudioIcon.js +0 -4
  100. package/dist/src/components/icons/svg-icons/BackwardIcon.d.ts.map +0 -1
  101. package/dist/src/components/icons/svg-icons/BackwardIcon.js +0 -3
  102. package/dist/src/components/icons/svg-icons/CameraIcon.d.ts.map +0 -1
  103. package/dist/src/components/icons/svg-icons/CameraIcon.js +0 -4
  104. package/dist/src/components/icons/svg-icons/CheckIcon.d.ts.map +0 -1
  105. package/dist/src/components/icons/svg-icons/CheckIcon.js +0 -4
  106. package/dist/src/components/icons/svg-icons/EnablePiPIcon.d.ts.map +0 -1
  107. package/dist/src/components/icons/svg-icons/EnablePiPIcon.js +0 -5
  108. package/dist/src/components/icons/svg-icons/ForwardIcon.d.ts.map +0 -1
  109. package/dist/src/components/icons/svg-icons/ForwardIcon.js +0 -3
  110. package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +0 -1
  111. package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.js +0 -3
  112. package/dist/src/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +0 -1
  113. package/dist/src/components/icons/svg-icons/FullscreenExitIcon.js +0 -3
  114. package/dist/src/components/icons/svg-icons/LoadingIcon.d.ts.map +0 -1
  115. package/dist/src/components/icons/svg-icons/LoadingIcon.js +0 -3
  116. package/dist/src/components/icons/svg-icons/PauseIcon.d.ts.map +0 -1
  117. package/dist/src/components/icons/svg-icons/PauseIcon.js +0 -3
  118. package/dist/src/components/icons/svg-icons/PlayIcon.d.ts.map +0 -1
  119. package/dist/src/components/icons/svg-icons/PlayIcon.js +0 -3
  120. package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +0 -1
  121. package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.js +0 -3
  122. package/dist/src/components/icons/svg-icons/QualityIcon.d.ts.map +0 -1
  123. package/dist/src/components/icons/svg-icons/QualityIcon.js +0 -3
  124. package/dist/src/components/icons/svg-icons/SettingsIcon.d.ts.map +0 -1
  125. package/dist/src/components/icons/svg-icons/SettingsIcon.js +0 -3
  126. package/dist/src/components/icons/svg-icons/SliderIcon.d.ts.map +0 -1
  127. package/dist/src/components/icons/svg-icons/SliderIcon.js +0 -3
  128. package/dist/src/components/icons/svg-icons/SubtitleIcon.d.ts.map +0 -1
  129. package/dist/src/components/icons/svg-icons/SubtitleIcon.js +0 -3
  130. package/dist/src/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +0 -1
  131. package/dist/src/components/icons/svg-icons/SubtitleOffIcon.js +0 -3
  132. package/dist/src/components/icons/svg-icons/UnPiPIcon.d.ts.map +0 -1
  133. package/dist/src/components/icons/svg-icons/UnPiPIcon.js +0 -5
  134. package/dist/src/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +0 -1
  135. package/dist/src/components/icons/svg-icons/VolumeMutedIcon.js +0 -3
  136. package/dist/src/components/icons/svg-icons/VolumeOneIcon.d.ts.map +0 -1
  137. package/dist/src/components/icons/svg-icons/VolumeOneIcon.js +0 -3
  138. package/dist/src/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +0 -1
  139. package/dist/src/components/icons/svg-icons/VolumeThreeIcon.js +0 -3
  140. package/dist/src/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +0 -1
  141. package/dist/src/components/icons/svg-icons/VolumeTwoIcon.js +0 -3
  142. package/dist/src/components/legacy.d.ts.map +0 -1
  143. package/dist/src/components/legacy.js +0 -52
  144. package/dist/src/components/media-metadata-display.d.ts.map +0 -1
  145. package/dist/src/components/media-metadata-display.js +0 -20
  146. package/dist/src/components/media-player-audio.d.ts.map +0 -1
  147. package/dist/src/components/media-player-audio.js +0 -18
  148. package/dist/src/components/media-player-controls.d.ts.map +0 -1
  149. package/dist/src/components/media-player-controls.js +0 -150
  150. package/dist/src/components/media-player-error.d.ts.map +0 -1
  151. package/dist/src/components/media-player-error.js +0 -85
  152. package/dist/src/components/media-player-fullscreen.d.ts.map +0 -1
  153. package/dist/src/components/media-player-fullscreen.js +0 -68
  154. package/dist/src/components/media-player-hls.d.ts.map +0 -1
  155. package/dist/src/components/media-player-hls.js +0 -20
  156. package/dist/src/components/media-player-loading.d.ts.map +0 -1
  157. package/dist/src/components/media-player-loading.js +0 -53
  158. package/dist/src/components/media-player-play.d.ts.map +0 -1
  159. package/dist/src/components/media-player-play.js +0 -44
  160. package/dist/src/components/media-player-root.d.ts.map +0 -1
  161. package/dist/src/components/media-player-root.js +0 -243
  162. package/dist/src/components/media-player-seek.d.ts.map +0 -1
  163. package/dist/src/components/media-player-seek.js +0 -92
  164. package/dist/src/components/media-player-time.d.ts.map +0 -1
  165. package/dist/src/components/media-player-time.js +0 -57
  166. package/dist/src/components/media-player-tooltip.d.ts.map +0 -1
  167. package/dist/src/components/media-player-tooltip.js +0 -14
  168. package/dist/src/components/media-player-video.d.ts.map +0 -1
  169. package/dist/src/components/media-player-video.js +0 -18
  170. package/dist/src/components/media-player-volume.d.ts.map +0 -1
  171. package/dist/src/components/media-player-volume.js +0 -88
  172. package/dist/src/components/media-player.d.ts.map +0 -1
  173. package/dist/src/components/media-player.js +0 -67
  174. package/dist/src/components/media-suspense.d.ts.map +0 -1
  175. package/dist/src/components/media-suspense.js +0 -173
  176. package/dist/src/components/player-settings-form.d.ts.map +0 -1
  177. package/dist/src/components/player-settings-form.js +0 -46
  178. package/dist/src/components/react-player-wrapper.d.ts.map +0 -1
  179. package/dist/src/components/react-player-wrapper.js +0 -163
  180. package/dist/src/components/simple-video-player.d.ts.map +0 -1
  181. package/dist/src/components/simple-video-player.js +0 -41
  182. package/dist/src/components/ui/enhanced-seek-bar.d.ts.map +0 -1
  183. package/dist/src/components/ui/enhanced-seek-bar.js +0 -112
  184. package/dist/src/components/ui/fullscreen-button.d.ts.map +0 -1
  185. package/dist/src/components/ui/fullscreen-button.js +0 -21
  186. package/dist/src/components/ui/media-resource-preloader.d.ts.map +0 -1
  187. package/dist/src/components/ui/media-resource-preloader.js +0 -295
  188. package/dist/src/components/ui/play-button.d.ts.map +0 -1
  189. package/dist/src/components/ui/play-button.js +0 -26
  190. package/dist/src/components/ui/seek-bar.d.ts.map +0 -1
  191. package/dist/src/components/ui/seek-bar.js +0 -54
  192. package/dist/src/components/ui/time-display.d.ts.map +0 -1
  193. package/dist/src/components/ui/time-display.js +0 -18
  194. package/dist/src/components/ui/volume-control.d.ts.map +0 -1
  195. package/dist/src/components/ui/volume-control.js +0 -71
  196. package/dist/src/components/unified/base-media-player.d.ts.map +0 -1
  197. package/dist/src/components/unified/base-media-player.js +0 -104
  198. package/dist/src/components/unified/media-player.d.ts.map +0 -1
  199. package/dist/src/components/unified/media-player.js +0 -41
  200. package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts.map +0 -1
  201. package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.js +0 -322
  202. package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts.map +0 -1
  203. package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +0 -280
  204. package/dist/src/components/variants/minimal/MinimalControls.d.ts.map +0 -1
  205. package/dist/src/components/variants/minimal/MinimalControls.js +0 -19
  206. package/dist/src/components/variants/minimal/MinimalLoading.d.ts.map +0 -1
  207. package/dist/src/components/variants/minimal/MinimalLoading.js +0 -6
  208. package/dist/src/components/variants/minimal/MinimalMediaPlayer.d.ts.map +0 -1
  209. package/dist/src/components/variants/minimal/MinimalMediaPlayer.js +0 -135
  210. package/dist/src/components/variants/minimal/MinimalOverlay.d.ts.map +0 -1
  211. package/dist/src/components/variants/minimal/MinimalOverlay.js +0 -15
  212. package/dist/src/components/variants/minimal/MinimalPlayButton.d.ts.map +0 -1
  213. package/dist/src/components/variants/minimal/MinimalPlayButton.js +0 -29
  214. package/dist/src/components/variants/minimal/MinimalSeekBar.d.ts.map +0 -1
  215. package/dist/src/components/variants/minimal/MinimalSeekBar.js +0 -73
  216. package/dist/src/components/variants/minimal/MinimalVolumeControl.d.ts.map +0 -1
  217. package/dist/src/components/variants/minimal/MinimalVolumeControl.js +0 -29
  218. package/dist/src/components/variants/minimal/SimpleMinimalPlayer.d.ts.map +0 -1
  219. package/dist/src/components/variants/minimal/SimpleMinimalPlayer.js +0 -51
  220. package/dist/src/components/variants/minimal/components/CenterPlayButton.d.ts.map +0 -1
  221. package/dist/src/components/variants/minimal/components/CenterPlayButton.js +0 -8
  222. package/dist/src/components/variants/minimal/components/ControlBar.d.ts.map +0 -1
  223. package/dist/src/components/variants/minimal/components/ControlBar.js +0 -10
  224. package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts.map +0 -1
  225. package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.js +0 -68
  226. package/dist/src/components/variants/minimal/components/PlaybackControls.d.ts.map +0 -1
  227. package/dist/src/components/variants/minimal/components/PlaybackControls.js +0 -9
  228. package/dist/src/components/variants/minimal/components/RightControls.d.ts.map +0 -1
  229. package/dist/src/components/variants/minimal/components/RightControls.js +0 -40
  230. package/dist/src/components/variants/minimal/components/SeekBar.d.ts.map +0 -1
  231. package/dist/src/components/variants/minimal/components/SeekBar.js +0 -43
  232. package/dist/src/components/variants/minimal/components/SettingsDropdown.d.ts.map +0 -1
  233. package/dist/src/components/variants/minimal/components/SettingsDropdown.js +0 -18
  234. package/dist/src/components/variants/minimal/components/SubtitleDisplay.d.ts.map +0 -1
  235. package/dist/src/components/variants/minimal/components/SubtitleDisplay.js +0 -6
  236. package/dist/src/components/variants/minimal/components/TimeDisplay.d.ts.map +0 -1
  237. package/dist/src/components/variants/minimal/components/TimeDisplay.js +0 -5
  238. package/dist/src/components/variants/minimal/components/VideoElement.d.ts.map +0 -1
  239. package/dist/src/components/variants/minimal/components/VideoElement.js +0 -4
  240. package/dist/src/components/variants/minimal/components/VolumeControl.d.ts.map +0 -1
  241. package/dist/src/components/variants/minimal/components/VolumeControl.js +0 -99
  242. package/dist/src/components/variants/minimal/index.d.ts.map +0 -1
  243. package/dist/src/components/variants/minimal/index.js +0 -8
  244. package/dist/src/components/video-player.d.ts.map +0 -1
  245. package/dist/src/components/video-player.js +0 -38
  246. package/dist/src/context/error-handling.d.ts.map +0 -1
  247. package/dist/src/context/error-handling.js +0 -300
  248. package/dist/src/context/media-context.d.ts.map +0 -1
  249. package/dist/src/context/media-context.js +0 -121
  250. package/dist/src/context/media-provider.d.ts.map +0 -1
  251. package/dist/src/context/media-provider.js +0 -164
  252. package/dist/src/context/media-store.d.ts.map +0 -1
  253. package/dist/src/context/media-store.js +0 -273
  254. package/dist/src/context/persistence.d.ts.map +0 -1
  255. package/dist/src/context/persistence.js +0 -356
  256. package/dist/src/core/events/event-system.d.ts.map +0 -1
  257. package/dist/src/core/events/event-system.js +0 -288
  258. package/dist/src/core/events/hooks.d.ts.map +0 -1
  259. package/dist/src/core/events/hooks.js +0 -198
  260. package/dist/src/core/events/index.d.ts.map +0 -1
  261. package/dist/src/core/events/index.js +0 -7
  262. package/dist/src/core/events/middleware.d.ts.map +0 -1
  263. package/dist/src/core/events/middleware.js +0 -219
  264. package/dist/src/core/index.d.ts.map +0 -1
  265. package/dist/src/core/index.js +0 -15
  266. package/dist/src/core/optimization/bundle-optimizer.d.ts.map +0 -1
  267. package/dist/src/core/optimization/bundle-optimizer.js +0 -217
  268. package/dist/src/core/performance/cicd.d.ts.map +0 -1
  269. package/dist/src/core/performance/cicd.js +0 -83
  270. package/dist/src/core/performance/index.d.ts.map +0 -1
  271. package/dist/src/core/performance/index.js +0 -14
  272. package/dist/src/core/performance/media-loading-optimizer.d.ts.map +0 -1
  273. package/dist/src/core/performance/media-loading-optimizer.js +0 -404
  274. package/dist/src/core/performance/performance-budgets.d.ts.map +0 -1
  275. package/dist/src/core/performance/performance-budgets.js +0 -326
  276. package/dist/src/core/performance/performance-monitor.d.ts.map +0 -1
  277. package/dist/src/core/performance/performance-monitor.js +0 -297
  278. package/dist/src/core/performance/performance-testing.d.ts.map +0 -1
  279. package/dist/src/core/performance/performance-testing.js +0 -314
  280. package/dist/src/core/plugins/base-plugin.d.ts.map +0 -1
  281. package/dist/src/core/plugins/base-plugin.js +0 -151
  282. package/dist/src/core/plugins/enhanced-plugin-system.d.ts.map +0 -1
  283. package/dist/src/core/plugins/enhanced-plugin-system.js +0 -305
  284. package/dist/src/core/plugins/examples/analytics-plugin.d.ts.map +0 -1
  285. package/dist/src/core/plugins/examples/analytics-plugin.js +0 -191
  286. package/dist/src/core/plugins/index.d.ts.map +0 -1
  287. package/dist/src/core/plugins/index.js +0 -9
  288. package/dist/src/core/plugins/registry.d.ts.map +0 -1
  289. package/dist/src/core/plugins/registry.js +0 -261
  290. package/dist/src/core/plugins/types.d.ts.map +0 -1
  291. package/dist/src/core/plugins/types.js +0 -31
  292. package/dist/src/core/plugins/utils.d.ts.map +0 -1
  293. package/dist/src/core/plugins/utils.js +0 -274
  294. package/dist/src/core/progressive-loading.d.ts.map +0 -1
  295. package/dist/src/core/progressive-loading.js +0 -239
  296. package/dist/src/core/providers/enhanced-hls-provider.d.ts.map +0 -1
  297. package/dist/src/core/providers/enhanced-hls-provider.js +0 -273
  298. package/dist/src/core/providers/service-provider.d.ts.map +0 -1
  299. package/dist/src/core/providers/service-provider.js +0 -105
  300. package/dist/src/core/utils.d.ts.map +0 -1
  301. package/dist/src/core/utils.js +0 -21
  302. package/dist/src/features/media-session/media-session-manager.d.ts.map +0 -1
  303. package/dist/src/features/media-session/media-session-manager.js +0 -331
  304. package/dist/src/features/picture-in-picture/pip-manager.d.ts.map +0 -1
  305. package/dist/src/features/picture-in-picture/pip-manager.js +0 -353
  306. package/dist/src/features/playlist/playlist-manager.d.ts.map +0 -1
  307. package/dist/src/features/playlist/playlist-manager.js +0 -475
  308. package/dist/src/features/subtitles/subtitle-manager.d.ts.map +0 -1
  309. package/dist/src/features/subtitles/subtitle-manager.js +0 -335
  310. package/dist/src/features/subtitles/subtitle-parser.d.ts.map +0 -1
  311. package/dist/src/features/subtitles/subtitle-parser.js +0 -217
  312. package/dist/src/features/thumbnails/thumbnail-generator.d.ts.map +0 -1
  313. package/dist/src/features/thumbnails/thumbnail-generator.js +0 -388
  314. package/dist/src/hooks/accessibility/index.d.ts.map +0 -1
  315. package/dist/src/hooks/accessibility/index.js +0 -4
  316. package/dist/src/hooks/accessibility/use-accessibility-preferences.d.ts.map +0 -1
  317. package/dist/src/hooks/accessibility/use-accessibility-preferences.js +0 -156
  318. package/dist/src/hooks/accessibility/use-focus-management.d.ts.map +0 -1
  319. package/dist/src/hooks/accessibility/use-focus-management.js +0 -142
  320. package/dist/src/hooks/accessibility/use-keyboard-shortcuts.d.ts.map +0 -1
  321. package/dist/src/hooks/accessibility/use-keyboard-shortcuts.js +0 -101
  322. package/dist/src/hooks/accessibility/use-screen-reader.d.ts.map +0 -1
  323. package/dist/src/hooks/accessibility/use-screen-reader.js +0 -148
  324. package/dist/src/hooks/core/index.d.ts.map +0 -1
  325. package/dist/src/hooks/core/index.js +0 -19
  326. package/dist/src/hooks/legacy.d.ts.map +0 -1
  327. package/dist/src/hooks/legacy.js +0 -17
  328. package/dist/src/hooks/use-enhanced-media-player.d.ts.map +0 -1
  329. package/dist/src/hooks/use-enhanced-media-player.js +0 -395
  330. package/dist/src/hooks/use-intelligent-preloading.d.ts.map +0 -1
  331. package/dist/src/hooks/use-intelligent-preloading.js +0 -258
  332. package/dist/src/hooks/use-keyboard-controls.d.ts.map +0 -1
  333. package/dist/src/hooks/use-keyboard-controls.js +0 -83
  334. package/dist/src/hooks/use-media-actions.d.ts.map +0 -1
  335. package/dist/src/hooks/use-media-actions.js +0 -121
  336. package/dist/src/hooks/use-media-metadata.d.ts.map +0 -1
  337. package/dist/src/hooks/use-media-metadata.js +0 -74
  338. package/dist/src/hooks/use-media-optimistic.d.ts.map +0 -1
  339. package/dist/src/hooks/use-media-optimistic.js +0 -205
  340. package/dist/src/hooks/use-media-player.d.ts.map +0 -1
  341. package/dist/src/hooks/use-media-player.js +0 -251
  342. package/dist/src/hooks/use-media-state.d.ts.map +0 -1
  343. package/dist/src/hooks/use-media-state.js +0 -162
  344. package/dist/src/hooks/use-memory-optimization.d.ts.map +0 -1
  345. package/dist/src/hooks/use-memory-optimization.js +0 -288
  346. package/dist/src/hooks/use-optimistic-controls.d.ts.map +0 -1
  347. package/dist/src/hooks/use-optimistic-controls.js +0 -60
  348. package/dist/src/hooks/use-optimized-media.d.ts.map +0 -1
  349. package/dist/src/hooks/use-optimized-media.js +0 -211
  350. package/dist/src/hooks/use-touch-gestures.d.ts.map +0 -1
  351. package/dist/src/hooks/use-touch-gestures.js +0 -289
  352. package/dist/src/hooks/useEnhancedSubtitles.d.ts.map +0 -1
  353. package/dist/src/hooks/useEnhancedSubtitles.js +0 -205
  354. package/dist/src/hooks/useKeyboardShortcuts.d.ts.map +0 -1
  355. package/dist/src/hooks/useKeyboardShortcuts.js +0 -59
  356. package/dist/src/hooks/useMediaControls.d.ts.map +0 -1
  357. package/dist/src/hooks/useMediaControls.js +0 -44
  358. package/dist/src/hooks/useScreenshot.d.ts.map +0 -1
  359. package/dist/src/hooks/useScreenshot.js +0 -56
  360. package/dist/src/hooks/useSubtitles.d.ts.map +0 -1
  361. package/dist/src/hooks/useSubtitles.js +0 -73
  362. package/dist/src/hooks/useVideoPlayer.d.ts.map +0 -1
  363. package/dist/src/hooks/useVideoPlayer.js +0 -184
  364. package/dist/src/icons/components/FullscreenIcon.d.ts.map +0 -1
  365. package/dist/src/icons/components/FullscreenIcon.js +0 -11
  366. package/dist/src/icons/components/SettingsIcon.d.ts.map +0 -1
  367. package/dist/src/icons/components/SettingsIcon.js +0 -11
  368. package/dist/src/icons/components/animated/LoadingIcon.d.ts.map +0 -1
  369. package/dist/src/icons/components/animated/LoadingIcon.js +0 -11
  370. package/dist/src/icons/components/animated/PlayPauseIcon.d.ts.map +0 -1
  371. package/dist/src/icons/components/animated/PlayPauseIcon.js +0 -9
  372. package/dist/src/icons/components/media/PauseIcon.d.ts.map +0 -1
  373. package/dist/src/icons/components/media/PauseIcon.js +0 -12
  374. package/dist/src/icons/components/media/PlayIcon.d.ts.map +0 -1
  375. package/dist/src/icons/components/media/PlayIcon.js +0 -12
  376. package/dist/src/icons/components/volume/VolumeIcon.d.ts.map +0 -1
  377. package/dist/src/icons/components/volume/VolumeIcon.js +0 -11
  378. package/dist/src/icons/components/volume/VolumeOffIcon.d.ts.map +0 -1
  379. package/dist/src/icons/components/volume/VolumeOffIcon.js +0 -11
  380. package/dist/src/icons/index.d.ts.map +0 -1
  381. package/dist/src/icons/index.js +0 -45
  382. package/dist/src/icons/provider.d.ts.map +0 -1
  383. package/dist/src/icons/provider.js +0 -37
  384. package/dist/src/icons/types.d.ts.map +0 -1
  385. package/dist/src/icons/types.js +0 -1
  386. package/dist/src/index-enhanced.d.ts.map +0 -1
  387. package/dist/src/index-enhanced.js +0 -16
  388. package/dist/src/index-legacy.d.ts.map +0 -1
  389. package/dist/src/index-legacy.js +0 -97
  390. package/dist/src/index.d.ts.map +0 -1
  391. package/dist/src/index.js +0 -90
  392. package/dist/src/index.minimal.d.ts.map +0 -1
  393. package/dist/src/index.minimal.js +0 -3
  394. package/dist/src/lib/deprecation.d.ts.map +0 -1
  395. package/dist/src/lib/deprecation.js +0 -31
  396. package/dist/src/lib/format-time.d.ts.map +0 -1
  397. package/dist/src/lib/format-time.js +0 -32
  398. package/dist/src/lib/index.d.ts.map +0 -1
  399. package/dist/src/lib/index.js +0 -3
  400. package/dist/src/lib/utils.d.ts.map +0 -1
  401. package/dist/src/lib/utils.js +0 -5
  402. package/dist/src/test/setup.d.ts.map +0 -1
  403. package/dist/src/test/setup.js +0 -65
  404. package/dist/src/types/events.d.ts.map +0 -1
  405. package/dist/src/types/events.js +0 -2
  406. package/dist/src/types/formats.d.ts.map +0 -1
  407. package/dist/src/types/formats.js +0 -63
  408. package/dist/src/types/index.d.ts.map +0 -1
  409. package/dist/src/types/index.js +0 -4
  410. package/dist/utils-Db13763z.cjs +0 -9
  411. package/dist/utils-Db13763z.cjs.map +0 -1
  412. package/dist/utils-nTO4AnHo.js +0 -2809
  413. package/dist/utils-nTO4AnHo.js.map +0 -1
  414. package/dist/utils.js +0 -2
  415. package/dist/utils.js.map +0 -1
  416. package/dist/utils.mjs +0 -7
  417. package/dist/utils.mjs.map +0 -1
  418. package/src/adapters/videojs-adapter.js +0 -350
  419. package/src/components/AnimateLoading.js +0 -41
  420. package/src/components/LoadingState.js +0 -111
  421. package/src/components/accessibility/keyboard-help-overlay.js +0 -90
  422. package/src/components/audio-player.js +0 -31
  423. package/src/components/basic/index.js +0 -29
  424. package/src/components/enhanced/advanced-features.js +0 -64
  425. package/src/components/enhanced/debug-panel.js +0 -94
  426. package/src/components/enhanced/enhanced-controls.js +0 -233
  427. package/src/components/enhanced/enhanced-media-player.js +0 -316
  428. package/src/components/enhanced/error-handling.js +0 -153
  429. package/src/components/enhanced/index.js +0 -10
  430. package/src/components/enhanced/media-player-enhanced.js +0 -250
  431. package/src/components/examples/basic-video-player.js +0 -16
  432. package/src/components/examples/custom-controls-example.js +0 -12
  433. package/src/components/examples/enhanced-controls-example.js +0 -18
  434. package/src/components/examples/enhanced-media-player-example.js +0 -13
  435. package/src/components/examples/loading-states-demo.js +0 -41
  436. package/src/components/examples/react-19-demo.js +0 -104
  437. package/src/components/examples/volume-orientation-demo.js +0 -31
  438. package/src/components/icon-demo.js +0 -16
  439. package/src/components/icons/index.js +0 -59
  440. package/src/components/icons/svg-icons/ArrowLeftIcon.js +0 -3
  441. package/src/components/icons/svg-icons/ArrowRightIcon.js +0 -3
  442. package/src/components/icons/svg-icons/AudioIcon.js +0 -4
  443. package/src/components/icons/svg-icons/BackwardIcon.js +0 -3
  444. package/src/components/icons/svg-icons/CameraIcon.js +0 -4
  445. package/src/components/icons/svg-icons/CheckIcon.js +0 -4
  446. package/src/components/icons/svg-icons/EnablePiPIcon.js +0 -5
  447. package/src/components/icons/svg-icons/ForwardIcon.js +0 -3
  448. package/src/components/icons/svg-icons/FullscreenEnterIcon.js +0 -3
  449. package/src/components/icons/svg-icons/FullscreenExitIcon.js +0 -3
  450. package/src/components/icons/svg-icons/LoadingIcon.js +0 -3
  451. package/src/components/icons/svg-icons/PauseIcon.js +0 -3
  452. package/src/components/icons/svg-icons/PlayIcon.js +0 -3
  453. package/src/components/icons/svg-icons/PlaybackSpeedIcon.js +0 -3
  454. package/src/components/icons/svg-icons/QualityIcon.js +0 -3
  455. package/src/components/icons/svg-icons/SettingsIcon.js +0 -3
  456. package/src/components/icons/svg-icons/SliderIcon.js +0 -3
  457. package/src/components/icons/svg-icons/SubtitleIcon.js +0 -3
  458. package/src/components/icons/svg-icons/SubtitleOffIcon.js +0 -3
  459. package/src/components/icons/svg-icons/UnPiPIcon.js +0 -5
  460. package/src/components/icons/svg-icons/VolumeMutedIcon.js +0 -3
  461. package/src/components/icons/svg-icons/VolumeOneIcon.js +0 -3
  462. package/src/components/icons/svg-icons/VolumeThreeIcon.js +0 -3
  463. package/src/components/icons/svg-icons/VolumeTwoIcon.js +0 -3
  464. package/src/components/legacy.js +0 -52
  465. package/src/components/media-metadata-display.js +0 -20
  466. package/src/components/media-player-audio.js +0 -18
  467. package/src/components/media-player-controls.js +0 -150
  468. package/src/components/media-player-error.js +0 -85
  469. package/src/components/media-player-fullscreen.js +0 -68
  470. package/src/components/media-player-hls.js +0 -20
  471. package/src/components/media-player-loading.js +0 -53
  472. package/src/components/media-player-play.js +0 -44
  473. package/src/components/media-player-root.js +0 -243
  474. package/src/components/media-player-seek.js +0 -92
  475. package/src/components/media-player-time.js +0 -57
  476. package/src/components/media-player-tooltip.js +0 -14
  477. package/src/components/media-player-video.js +0 -18
  478. package/src/components/media-player-volume.js +0 -88
  479. package/src/components/media-player.js +0 -67
  480. package/src/components/media-suspense.js +0 -173
  481. package/src/components/player-settings-form.js +0 -46
  482. package/src/components/react-player-wrapper.js +0 -163
  483. package/src/components/simple-video-player.js +0 -41
  484. package/src/components/ui/enhanced-seek-bar.js +0 -112
  485. package/src/components/ui/fullscreen-button.js +0 -21
  486. package/src/components/ui/media-resource-preloader.js +0 -295
  487. package/src/components/ui/play-button.js +0 -26
  488. package/src/components/ui/seek-bar.js +0 -54
  489. package/src/components/ui/time-display.js +0 -18
  490. package/src/components/ui/volume-control.js +0 -71
  491. package/src/components/unified/base-media-player.js +0 -104
  492. package/src/components/unified/media-player.js +0 -41
  493. package/src/components/variants/minimal/AccessibleMinimalPlayer.js +0 -322
  494. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +0 -280
  495. package/src/components/variants/minimal/MinimalControls.js +0 -19
  496. package/src/components/variants/minimal/MinimalLoading.js +0 -6
  497. package/src/components/variants/minimal/MinimalMediaPlayer.js +0 -135
  498. package/src/components/variants/minimal/MinimalOverlay.js +0 -15
  499. package/src/components/variants/minimal/MinimalPlayButton.js +0 -29
  500. package/src/components/variants/minimal/MinimalSeekBar.js +0 -73
  501. package/src/components/variants/minimal/MinimalVolumeControl.js +0 -29
  502. package/src/components/variants/minimal/SimpleMinimalPlayer.js +0 -51
  503. package/src/components/variants/minimal/components/CenterPlayButton.js +0 -8
  504. package/src/components/variants/minimal/components/ControlBar.js +0 -10
  505. package/src/components/variants/minimal/components/EnhancedSettingsMenu.js +0 -68
  506. package/src/components/variants/minimal/components/PlaybackControls.js +0 -9
  507. package/src/components/variants/minimal/components/RightControls.js +0 -40
  508. package/src/components/variants/minimal/components/SeekBar.js +0 -43
  509. package/src/components/variants/minimal/components/SettingsDropdown.js +0 -18
  510. package/src/components/variants/minimal/components/SubtitleDisplay.js +0 -6
  511. package/src/components/variants/minimal/components/TimeDisplay.js +0 -5
  512. package/src/components/variants/minimal/components/VideoElement.js +0 -4
  513. package/src/components/variants/minimal/components/VolumeControl.js +0 -99
  514. package/src/components/variants/minimal/index.js +0 -8
  515. package/src/components/video-player.js +0 -38
  516. package/src/context/error-handling.js +0 -300
  517. package/src/context/media-context.js +0 -121
  518. package/src/context/media-provider.js +0 -164
  519. package/src/context/media-store.js +0 -273
  520. package/src/context/persistence.js +0 -356
  521. package/src/core/events/event-system.js +0 -288
  522. package/src/core/events/hooks.js +0 -198
  523. package/src/core/events/index.js +0 -7
  524. package/src/core/events/middleware.js +0 -219
  525. package/src/core/index.js +0 -15
  526. package/src/core/optimization/bundle-optimizer.js +0 -217
  527. package/src/core/performance/cicd.js +0 -83
  528. package/src/core/performance/index.js +0 -14
  529. package/src/core/performance/media-loading-optimizer.js +0 -404
  530. package/src/core/performance/performance-budgets.js +0 -326
  531. package/src/core/performance/performance-monitor.js +0 -297
  532. package/src/core/performance/performance-testing.js +0 -314
  533. package/src/core/plugins/base-plugin.js +0 -151
  534. package/src/core/plugins/enhanced-plugin-system.js +0 -305
  535. package/src/core/plugins/examples/analytics-plugin.js +0 -191
  536. package/src/core/plugins/index.js +0 -9
  537. package/src/core/plugins/registry.js +0 -261
  538. package/src/core/plugins/types.js +0 -31
  539. package/src/core/plugins/utils.js +0 -274
  540. package/src/core/progressive-loading.js +0 -239
  541. package/src/core/providers/enhanced-hls-provider.js +0 -273
  542. package/src/core/providers/service-provider.js +0 -105
  543. package/src/core/utils.js +0 -21
  544. package/src/features/media-session/media-session-manager.js +0 -331
  545. package/src/features/picture-in-picture/pip-manager.js +0 -353
  546. package/src/features/playlist/playlist-manager.js +0 -475
  547. package/src/features/subtitles/subtitle-manager.js +0 -335
  548. package/src/features/subtitles/subtitle-parser.js +0 -217
  549. package/src/features/thumbnails/thumbnail-generator.js +0 -388
  550. package/src/hooks/accessibility/index.js +0 -4
  551. package/src/hooks/accessibility/use-accessibility-preferences.js +0 -156
  552. package/src/hooks/accessibility/use-focus-management.js +0 -142
  553. package/src/hooks/accessibility/use-keyboard-shortcuts.js +0 -101
  554. package/src/hooks/accessibility/use-screen-reader.js +0 -148
  555. package/src/hooks/core/index.js +0 -19
  556. package/src/hooks/legacy.js +0 -17
  557. package/src/hooks/use-enhanced-media-player.js +0 -395
  558. package/src/hooks/use-intelligent-preloading.js +0 -258
  559. package/src/hooks/use-keyboard-controls.js +0 -83
  560. package/src/hooks/use-media-actions.js +0 -121
  561. package/src/hooks/use-media-metadata.js +0 -74
  562. package/src/hooks/use-media-optimistic.js +0 -205
  563. package/src/hooks/use-media-player.js +0 -251
  564. package/src/hooks/use-media-state.js +0 -162
  565. package/src/hooks/use-memory-optimization.js +0 -288
  566. package/src/hooks/use-optimistic-controls.js +0 -60
  567. package/src/hooks/use-optimized-media.js +0 -211
  568. package/src/hooks/use-touch-gestures.js +0 -289
  569. package/src/hooks/useEnhancedSubtitles.js +0 -205
  570. package/src/hooks/useKeyboardShortcuts.js +0 -59
  571. package/src/hooks/useMediaControls.js +0 -44
  572. package/src/hooks/useScreenshot.js +0 -56
  573. package/src/hooks/useSubtitles.js +0 -73
  574. package/src/hooks/useVideoPlayer.js +0 -184
  575. package/src/icons/components/FullscreenIcon.js +0 -11
  576. package/src/icons/components/SettingsIcon.js +0 -11
  577. package/src/icons/components/animated/LoadingIcon.js +0 -11
  578. package/src/icons/components/animated/PlayPauseIcon.js +0 -9
  579. package/src/icons/components/media/PauseIcon.js +0 -12
  580. package/src/icons/components/media/PlayIcon.js +0 -12
  581. package/src/icons/components/volume/VolumeIcon.js +0 -11
  582. package/src/icons/components/volume/VolumeOffIcon.js +0 -11
  583. package/src/icons/index.js +0 -45
  584. package/src/icons/provider.js +0 -37
  585. package/src/icons/types.js +0 -1
  586. package/src/index-enhanced.js +0 -16
  587. package/src/index-legacy.js +0 -97
  588. package/src/index.js +0 -90
  589. package/src/index.minimal.js +0 -3
  590. package/src/lib/deprecation.js +0 -31
  591. package/src/lib/format-time.js +0 -32
  592. package/src/lib/index.js +0 -3
  593. package/src/lib/utils.js +0 -5
  594. package/src/test/setup.js +0 -65
  595. package/src/types/events.js +0 -2
  596. package/src/types/formats.js +0 -63
  597. package/src/types/index.js +0 -4
@@ -1,2042 +0,0 @@
1
- import * as re from "react";
2
- import B, { useEffect as j, useOptimistic as ce, useRef as z, useTransition as le, useCallback as A, useMemo as ue, useState as Y } from "react";
3
- import { c as N, d as pe, e as W, M as H } from "./context-Af84FynT.js";
4
- import { s as ve } from "./utils-nTO4AnHo.js";
5
- function Ie({ enabled: e = !0, state: t, controls: n, seekStep: s = 10, volumeStep: u = 0.1 }) {
6
- const o = (a) => {
7
- if (!e)
8
- return;
9
- const m = a.target;
10
- if (!(m.tagName === "INPUT" || m.tagName === "TEXTAREA" || m.contentEditable === "true"))
11
- switch (a.code) {
12
- case "Space":
13
- case "KeyK":
14
- a.preventDefault(), n.toggle();
15
- break;
16
- case "KeyM":
17
- a.preventDefault(), n.toggleMute();
18
- break;
19
- case "KeyF":
20
- a.preventDefault(), n.toggleFullscreen();
21
- break;
22
- case "ArrowLeft":
23
- a.preventDefault(), n.seek(Math.max(0, t.currentTime - s));
24
- break;
25
- case "ArrowRight":
26
- a.preventDefault(), n.seek(Math.min(t.duration, t.currentTime + s));
27
- break;
28
- case "ArrowUp":
29
- a.preventDefault(), n.setVolume(Math.min(1, t.volume + u));
30
- break;
31
- case "ArrowDown":
32
- a.preventDefault(), n.setVolume(Math.max(0, t.volume - u));
33
- break;
34
- case "Digit0":
35
- case "Digit1":
36
- case "Digit2":
37
- case "Digit3":
38
- case "Digit4":
39
- case "Digit5":
40
- case "Digit6":
41
- case "Digit7":
42
- case "Digit8":
43
- case "Digit9":
44
- a.preventDefault();
45
- const F = parseInt(a.code.replace("Digit", ""), 10) / 10;
46
- n.seek(t.duration * F);
47
- break;
48
- case "Home":
49
- a.preventDefault(), n.seek(0);
50
- break;
51
- case "End":
52
- a.preventDefault(), n.seek(t.duration);
53
- break;
54
- }
55
- };
56
- return j(() => {
57
- if (e)
58
- return document.addEventListener("keydown", o), () => {
59
- document.removeEventListener("keydown", o);
60
- };
61
- }, [e, o]), {
62
- handleKeyDown: o
63
- };
64
- }
65
- function ye(e, t) {
66
- if (!t.optimistic)
67
- return e;
68
- switch (t.type) {
69
- case "PLAY":
70
- return { ...e, isPlaying: !0, error: null };
71
- case "PAUSE":
72
- return { ...e, isPlaying: !1 };
73
- case "SEEK":
74
- return { ...e, currentTime: t.detail };
75
- case "SET_VOLUME":
76
- return { ...e, volume: Math.max(0, Math.min(1, t.detail)) };
77
- case "MUTE":
78
- return { ...e, isMuted: !0 };
79
- case "UNMUTE":
80
- return { ...e, isMuted: !1 };
81
- case "TOGGLE_MUTE":
82
- return { ...e, isMuted: !e.isMuted };
83
- case "ENTER_FULLSCREEN":
84
- return { ...e, isFullscreen: !0 };
85
- case "EXIT_FULLSCREEN":
86
- return { ...e, isFullscreen: !1 };
87
- case "SET_PLAYBACK_RATE":
88
- return { ...e, playbackRate: t.detail };
89
- case "TOGGLE_SUBTITLES":
90
- return { ...e, subtitlesShowing: !e.subtitlesShowing };
91
- case "PREVIEW_TIME":
92
- return { ...e, previewTime: t.detail };
93
- case "CLEAR_PREVIEW":
94
- return {
95
- ...e,
96
- previewTime: null,
97
- previewImage: null,
98
- previewCoords: null
99
- };
100
- default:
101
- return e;
102
- }
103
- }
104
- function Ee(e) {
105
- const t = B.useSyncExternalStore(e.subscribe, e.getState, e.getState), [n, s] = ce(t, ye), u = B.useCallback(async (m) => {
106
- m.optimistic && s(m), await e.dispatchOptimistic(m);
107
- }, [e, s]), o = B.useMemo(() => ({
108
- // Play/Pause with immediate feedback
109
- togglePlayPause: async () => {
110
- const m = {
111
- type: n.isPlaying ? "PAUSE" : "PLAY",
112
- optimistic: !0,
113
- timestamp: Date.now()
114
- };
115
- await u(m);
116
- },
117
- // Volume control with immediate slider feedback
118
- setVolumeOptimistic: async (m) => {
119
- const S = {
120
- type: "SET_VOLUME",
121
- detail: Math.max(0, Math.min(1, m)),
122
- optimistic: !0,
123
- timestamp: Date.now()
124
- };
125
- await u(S);
126
- },
127
- // Seek with immediate scrub feedback
128
- seekOptimistic: async (m) => {
129
- const S = {
130
- type: "SEEK",
131
- detail: m,
132
- optimistic: !0,
133
- timestamp: Date.now()
134
- };
135
- await u(S);
136
- },
137
- // Mute toggle with immediate icon change
138
- toggleMuteOptimistic: async () => {
139
- const m = {
140
- type: "TOGGLE_MUTE",
141
- optimistic: !0,
142
- timestamp: Date.now()
143
- };
144
- await u(m);
145
- },
146
- // Fullscreen toggle with immediate layout change
147
- toggleFullscreenOptimistic: async () => {
148
- const m = {
149
- type: n.isFullscreen ? "EXIT_FULLSCREEN" : "ENTER_FULLSCREEN",
150
- optimistic: !0,
151
- timestamp: Date.now()
152
- };
153
- await u(m);
154
- },
155
- // Playback rate with immediate feedback
156
- setPlaybackRateOptimistic: async (m) => {
157
- const S = {
158
- type: "SET_PLAYBACK_RATE",
159
- detail: m,
160
- optimistic: !0,
161
- timestamp: Date.now()
162
- };
163
- await u(S);
164
- },
165
- // Subtitle toggle with immediate visibility change
166
- toggleSubtitlesOptimistic: async () => {
167
- const m = {
168
- type: "TOGGLE_SUBTITLES",
169
- optimistic: !0,
170
- timestamp: Date.now()
171
- };
172
- await u(m);
173
- }
174
- }), [n, u]), a = B.useMemo(() => ({
175
- isPlaying: n.isPlaying,
176
- currentTime: n.currentTime,
177
- volume: n.volume,
178
- isMuted: n.isMuted,
179
- isFullscreen: n.isFullscreen,
180
- playbackRate: n.playbackRate,
181
- subtitlesShowing: n.subtitlesShowing,
182
- previewTime: n.previewTime,
183
- // Computed values
184
- progress: n.duration > 0 ? n.currentTime / n.duration : 0,
185
- formattedTime: me(n.currentTime),
186
- formattedDuration: me(n.duration),
187
- // State checks
188
- canPlay: !n.isLoading && !n.error,
189
- hasError: !!n.error,
190
- isBuffering: n.isLoading
191
- }), [n]);
192
- return {
193
- state: n,
194
- actualState: t,
195
- ...a,
196
- ...o,
197
- dispatchOptimistic: u
198
- };
199
- }
200
- function me(e) {
201
- if (!e || !isFinite(e))
202
- return "0:00";
203
- const t = Math.floor(e / 60), n = Math.floor(e % 60), s = Math.floor(t / 60);
204
- return s > 0 ? `${s}:${String(t % 60).padStart(2, "0")}:${String(n).padStart(2, "0")}` : `${t}:${String(n).padStart(2, "0")}`;
205
- }
206
- function K(e, t) {
207
- return ((n, s = !1) => {
208
- const u = {
209
- type: e,
210
- detail: n,
211
- optimistic: s,
212
- timestamp: Date.now()
213
- };
214
- return s ? t.dispatchOptimistic(u) : (t.dispatch(u), Promise.resolve());
215
- });
216
- }
217
- function we(e) {
218
- const [t, n] = B.useState(e.getActionState());
219
- return B.useEffect(() => e.subscribe(() => {
220
- const u = e.getActionState();
221
- n((o) => JSON.stringify(o) !== JSON.stringify(u) ? u : o);
222
- }), [e]), t;
223
- }
224
- function Te(e) {
225
- const t = B.useMemo(() => ({
226
- // Playback actions
227
- play: K(N.PLAY, e),
228
- pause: K(N.PAUSE, e),
229
- seek: K(N.SEEK, e),
230
- // Volume actions
231
- setVolume: K(N.SET_VOLUME, e),
232
- mute: K(N.MUTE, e),
233
- unmute: K(N.UNMUTE, e),
234
- toggleMute: K(N.TOGGLE_MUTE, e),
235
- // Media state actions
236
- setDuration: K(N.SET_DURATION, e),
237
- setCurrentTime: K(N.SET_CURRENT_TIME, e),
238
- setBuffered: K(N.SET_BUFFERED, e),
239
- setLoading: K(N.SET_LOADING, e),
240
- setError: K(N.SET_ERROR, e),
241
- // Display actions
242
- enterFullscreen: K(N.ENTER_FULLSCREEN, e),
243
- exitFullscreen: K(N.EXIT_FULLSCREEN, e),
244
- enterPiP: K(N.ENTER_PIP, e),
245
- exitPiP: K(N.EXIT_PIP, e),
246
- // Advanced actions
247
- setPlaybackRate: K(N.SET_PLAYBACK_RATE, e),
248
- setSubtitleTrack: K(N.SET_SUBTITLE_TRACK, e),
249
- setRendition: K(N.SET_RENDITION, e),
250
- toggleSubtitles: K(N.TOGGLE_SUBTITLES, e),
251
- // Preview actions
252
- previewTime: K(N.PREVIEW_TIME, e),
253
- clearPreview: K(N.CLEAR_PREVIEW, e)
254
- }), [e]), n = we(e), s = B.useMemo(() => ({
255
- // These actions benefit from immediate UI feedback
256
- togglePlayPause: async (o) => {
257
- o ? await t.pause(!0) : await t.play(!0);
258
- },
259
- seekWithPreview: async (o) => {
260
- await t.previewTime(o, !0), await t.seek(o, !0);
261
- },
262
- adjustVolume: async (o, a) => {
263
- const m = Math.max(0, Math.min(1, a + o));
264
- await t.setVolume(m, !0);
265
- },
266
- toggleFullscreenOptimistic: async (o) => {
267
- o ? await t.exitFullscreen(!0) : await t.enterFullscreen(!0);
268
- }
269
- }), [t]), u = B.useCallback(async () => {
270
- const { lastAction: o } = n;
271
- o && n.error && await e.dispatchOptimistic({
272
- ...o,
273
- retryCount: (o.retryCount || 0) + 1
274
- });
275
- }, [e, n]);
276
- return {
277
- ...t,
278
- ...s,
279
- actionState: n,
280
- retryLastAction: u,
281
- isLoading: n.pending,
282
- hasError: !!n.error,
283
- errorMessage: n.error,
284
- retryCount: n.retryCount
285
- };
286
- }
287
- function Oe(e) {
288
- const t = z(null), n = z(null), [s, u] = le(), [o, a] = le();
289
- B.useRef(0);
290
- const m = B.useRef(0), S = B.useRef(0);
291
- z();
292
- const F = z(0), D = pe(), g = "getOptimisticState" in D, r = W((i) => i.isPlaying), y = W((i) => i.currentTime), p = W((i) => i.duration), d = W((i) => i.volume), v = W((i) => i.isMuted), L = W((i) => i.isLoading), h = W((i) => i.isBuffering), l = W((i) => i.error), T = W((i) => i.buffered), E = W((i) => i.isFullscreen), w = D, b = g ? Ee(w) : null, f = g ? Te(w) : null, [G, R] = B.useState({
293
- frameRate: 0,
294
- averageRenderTime: 0,
295
- droppedFrames: 0,
296
- bufferHealth: 0
297
- }), [I, P] = ce(d, (i, k) => Math.max(0, Math.min(1, k)));
298
- ce(y, (i, k) => Math.max(0, Math.min(p || 0, k))), j(() => {
299
- const i = t.current;
300
- if (!i)
301
- return;
302
- const k = {
303
- volume: e.volume,
304
- muted: e.muted,
305
- autoplay: e.autoPlay,
306
- loop: e.loop,
307
- preload: e.preload,
308
- crossOrigin: e.crossOrigin
309
- };
310
- Object.entries(k).forEach(([V, X]) => {
311
- X !== void 0 && (i[V] = X);
312
- }), i.setAttribute("preload", e.preloadStrategy === "eager" ? "auto" : "metadata"), e.bufferingStrategy === "aggressive" && i.setAttribute("buffered", "auto"), i instanceof HTMLVideoElement && (i.style.willChange = "transform", i.style.transform = "translateZ(0)");
313
- }, [
314
- e.volume,
315
- e.muted,
316
- e.autoPlay,
317
- e.loop,
318
- e.preload,
319
- e.crossOrigin,
320
- e.preloadStrategy,
321
- e.bufferingStrategy
322
- ]);
323
- const M = A(() => {
324
- const i = t.current;
325
- if (!i)
326
- return;
327
- const k = performance.now();
328
- if (e.enableTimeUpdateThrottling !== !1) {
329
- if (k - F.current < (e.timeUpdateThrottleMs || 100))
330
- return;
331
- F.current = k;
332
- }
333
- u(() => {
334
- g && f && f.setCurrentTime(i.currentTime);
335
- });
336
- }, [e.enableTimeUpdateThrottling, e.timeUpdateThrottleMs, g, f]), C = A(() => {
337
- u(() => {
338
- g && f && f.play(!0);
339
- }), e.onPlay?.();
340
- }, [g, f, e.onPlay]), O = A(() => {
341
- u(() => {
342
- g && f && f.pause(!0);
343
- }), e.onPause?.();
344
- }, [g, f, e.onPause]), U = A(() => {
345
- const i = t.current;
346
- i && u(() => {
347
- g && f && (f.setVolume(i.volume, !0), i.muted ? f.mute(!0) : f.unmute(!0));
348
- });
349
- }, [g, f]), c = A(() => {
350
- a(() => {
351
- });
352
- }, []), _ = A(() => {
353
- }, []), ee = A(() => {
354
- const i = t.current;
355
- i && u(() => {
356
- g && f && f.setBuffered(i.buffered);
357
- });
358
- }, [g, f]), Q = A(() => {
359
- const i = performance.now();
360
- if (i - S.current > 0 && (m.current++, m.current >= 60)) {
361
- const V = Math.round(m.current * 1e3 / (i - S.current));
362
- R((X) => ({
363
- ...X,
364
- frameRate: V,
365
- droppedFrames: Math.max(0, 60 - V)
366
- })), m.current = 0, S.current = i;
367
- }
368
- }, []);
369
- j(() => {
370
- const i = t.current;
371
- if (!i)
372
- return;
373
- const k = [
374
- { event: "timeupdate", handler: M, passive: !0 },
375
- { event: "play", handler: C },
376
- { event: "pause", handler: O },
377
- { event: "volumechange", handler: U },
378
- { event: "seeking", handler: c },
379
- { event: "seeked", handler: _ },
380
- { event: "progress", handler: ee, passive: !0 },
381
- { event: "loadedmetadata", handler: () => Q() },
382
- { event: "loadeddata", handler: () => Q() }
383
- ];
384
- k.forEach(({ event: te, handler: ne, passive: ie }) => {
385
- const oe = ie ? { passive: !0 } : {};
386
- i.addEventListener(te, ne, oe);
387
- });
388
- let V;
389
- const X = () => {
390
- Q(), V = requestAnimationFrame(X);
391
- };
392
- return e.enablePerformanceMonitoring && X(), () => {
393
- k.forEach(({ event: te, handler: ne }) => {
394
- i.removeEventListener(te, ne);
395
- }), V && cancelAnimationFrame(V);
396
- };
397
- }, [
398
- M,
399
- C,
400
- O,
401
- U,
402
- c,
403
- _,
404
- ee,
405
- Q,
406
- e.enablePerformanceMonitoring
407
- ]);
408
- const se = ue(() => {
409
- const i = async () => {
410
- const x = t.current;
411
- if (x)
412
- if (g && f)
413
- await f.play(!0);
414
- else
415
- try {
416
- await x.play();
417
- } catch (q) {
418
- console.error("Failed to play media:", q);
419
- }
420
- }, k = () => {
421
- const x = t.current;
422
- x && (g && f ? f.pause(!0) : x.pause());
423
- };
424
- return {
425
- play: i,
426
- pause: k,
427
- toggle: () => {
428
- r ? k() : i();
429
- },
430
- seek: (x) => {
431
- const q = t.current;
432
- if (!q)
433
- return;
434
- const Z = Math.max(0, Math.min(x, p || 0));
435
- g && f ? a(() => {
436
- f.seek(Z, !0);
437
- }) : q.currentTime = Z;
438
- },
439
- setVolume: (x) => {
440
- const q = t.current;
441
- if (!q)
442
- return;
443
- const Z = Math.max(0, Math.min(1, x));
444
- g && f ? (P(Z), u(() => {
445
- f.setVolume(Z, !0);
446
- })) : q.volume = Z;
447
- },
448
- toggleMute: () => {
449
- const x = t.current;
450
- x && (g && f ? f.toggleMute(!0) : x.muted = !x.muted);
451
- },
452
- enterFullscreen: async () => {
453
- const x = n.current;
454
- if (!(!x || !document.fullscreenEnabled))
455
- try {
456
- await x.requestFullscreen(), g && f && f.enterFullscreen(!0);
457
- } catch (q) {
458
- console.error("Failed to enter fullscreen:", q);
459
- }
460
- },
461
- exitFullscreen: async () => {
462
- if (document.fullscreenElement)
463
- try {
464
- await document.exitFullscreen(), g && f && f.exitFullscreen(!0);
465
- } catch (x) {
466
- console.error("Failed to exit fullscreen:", x);
467
- }
468
- }
469
- };
470
- }, [
471
- r,
472
- p,
473
- g,
474
- f,
475
- u,
476
- a,
477
- P
478
- ]), ae = ue(() => ({
479
- isPlaying: b?.isPlaying ?? r,
480
- currentTime: b?.currentTime ?? y,
481
- duration: b?.duration ?? p,
482
- volume: b?.volume ?? I,
483
- isMuted: b?.isMuted ?? v,
484
- isLoading: b?.isBuffering ?? L,
485
- isBuffering: b?.isBuffering ?? h,
486
- error: b?.error ?? l,
487
- buffered: b?.buffered ?? T,
488
- isFullscreen: b?.isFullscreen ?? E,
489
- progress: p > 0 ? y / p : 0,
490
- isTransitioning: s || o,
491
- canPlay: !L && !h && !l
492
- }), [
493
- b,
494
- r,
495
- y,
496
- p,
497
- I,
498
- v,
499
- L,
500
- h,
501
- l,
502
- T,
503
- E,
504
- s,
505
- o
506
- ]);
507
- return {
508
- // Refs
509
- mediaRef: t,
510
- containerRef: n,
511
- // State
512
- state: ae,
513
- actualState: b?.actualState,
514
- // Controls
515
- controls: se,
516
- // Performance metrics
517
- performanceMetrics: G,
518
- isTransitioning: s || o,
519
- // Enhanced features
520
- actions: b?.actions,
521
- actionState: b?.actionState,
522
- // Optimistic features
523
- optimisticState: b,
524
- isEnhanced: g
525
- };
526
- }
527
- function Ue(e = {}) {
528
- const {
529
- maxMemoryUsage: t = 100,
530
- // 100MB default
531
- cleanupInterval: n = 3e4,
532
- // 30 seconds default
533
- enableGC: s = !0,
534
- monitorMemory: u = !0
535
- } = e;
536
- z();
537
- const o = z(/* @__PURE__ */ new Set()), a = z(/* @__PURE__ */ new Map()), m = z(/* @__PURE__ */ new Set()), S = z(/* @__PURE__ */ new Set()), F = A(() => {
538
- if (typeof window > "u" || !("memory" in performance))
539
- return { used: 0, total: 0, limit: 0 };
540
- const h = performance.memory;
541
- return {
542
- used: h.usedJSHeapSize,
543
- total: h.totalJSHeapSize,
544
- limit: h.jsHeapSizeLimit
545
- };
546
- }, []), [D, g] = B.useState({
547
- used: 0,
548
- total: 0,
549
- limit: 0,
550
- usage: 0,
551
- isHighUsage: !1
552
- });
553
- j(() => {
554
- if (!u)
555
- return;
556
- const h = () => {
557
- const T = F(), E = T.used / 1024 / 1024, w = E > t;
558
- g({
559
- ...T,
560
- usage: E,
561
- isHighUsage: w
562
- }), w && s && r();
563
- };
564
- h();
565
- const l = p(h, n);
566
- return m.current.add(l), () => {
567
- clearInterval(l), m.current.delete(l);
568
- };
569
- }, [u, F, t, s, n]);
570
- const r = A(() => {
571
- m.current.forEach((h) => {
572
- clearTimeout(h);
573
- }), m.current.clear(), S.current.forEach((h) => {
574
- cancelAnimationFrame(h);
575
- }), S.current.clear(), o.current.forEach((h) => {
576
- h.disconnect();
577
- }), o.current.clear(), a.current.forEach((h, l) => {
578
- h.forEach(({ event: T, handler: E }) => {
579
- l.removeEventListener(T, E);
580
- });
581
- }), a.current.clear(), s && "gc" in window && window.gc();
582
- }, [s]), y = A((h, l, T, E) => (h.addEventListener(l, T, E), a.current.has(h) || a.current.set(h, []), a.current.get(h).push({ event: l, handler: T }), () => {
583
- h.removeEventListener(l, T);
584
- const w = a.current.get(h);
585
- if (w) {
586
- const b = w.findIndex((f) => f.event === l && f.handler === T);
587
- b > -1 && w.splice(b, 1), w.length === 0 && a.current.delete(h);
588
- }
589
- }), []), p = A((h, l) => {
590
- const T = p(h, l);
591
- return m.current.add(T), () => {
592
- clearInterval(T), m.current.delete(T);
593
- };
594
- }, []), d = A((h, l) => {
595
- const T = d(h, l);
596
- return m.current.add(T), () => {
597
- clearTimeout(T), m.current.delete(T);
598
- };
599
- }, []), v = A((h) => {
600
- const l = v(h);
601
- return S.current.add(l), () => {
602
- cancelAnimationFrame(l), S.current.delete(l);
603
- };
604
- }, []), L = A((h) => (o.current.add(h), () => {
605
- h.disconnect(), o.current.delete(h);
606
- }), []);
607
- return j(() => () => {
608
- r();
609
- }, [r]), {
610
- // Memory stats
611
- memoryStats: D,
612
- getMemoryUsage: F,
613
- // Cleanup functions
614
- performCleanup: r,
615
- // Safe API functions
616
- addEventListener: y,
617
- setInterval: p,
618
- setTimeout: d,
619
- requestAnimationFrame: v,
620
- addObserver: L,
621
- // Utilities
622
- formatBytes: (h) => {
623
- if (h === 0)
624
- return "0 Bytes";
625
- const l = 1024, T = ["Bytes", "KB", "MB", "GB"], E = Math.floor(Math.log(h) / Math.log(l));
626
- return parseFloat((h / Math.pow(l, E)).toFixed(2)) + " " + T[E];
627
- }
628
- };
629
- }
630
- function be({
631
- enabled: e = !0,
632
- state: t,
633
- controls: n,
634
- seekStep: s = 10,
635
- volumeStep: u = 0.1
636
- }) {
637
- const o = (a) => {
638
- if (!e) return;
639
- const m = a.target;
640
- if (!(m.tagName === "INPUT" || m.tagName === "TEXTAREA" || m.contentEditable === "true"))
641
- switch (a.code) {
642
- case "Space":
643
- case "KeyK":
644
- a.preventDefault(), n.toggle();
645
- break;
646
- case "KeyM":
647
- a.preventDefault(), n.toggleMute();
648
- break;
649
- case "KeyF":
650
- a.preventDefault(), n.toggleFullscreen();
651
- break;
652
- case "ArrowLeft":
653
- a.preventDefault(), n.seek(Math.max(0, t.currentTime - s));
654
- break;
655
- case "ArrowRight":
656
- a.preventDefault(), n.seek(Math.min(t.duration, t.currentTime + s));
657
- break;
658
- case "ArrowUp":
659
- a.preventDefault(), n.setVolume(Math.min(1, t.volume + u));
660
- break;
661
- case "ArrowDown":
662
- a.preventDefault(), n.setVolume(Math.max(0, t.volume - u));
663
- break;
664
- case "Digit0":
665
- case "Digit1":
666
- case "Digit2":
667
- case "Digit3":
668
- case "Digit4":
669
- case "Digit5":
670
- case "Digit6":
671
- case "Digit7":
672
- case "Digit8":
673
- case "Digit9":
674
- a.preventDefault();
675
- const F = parseInt(a.code.replace("Digit", ""), 10) / 10;
676
- n.seek(t.duration * F);
677
- break;
678
- case "Home":
679
- a.preventDefault(), n.seek(0);
680
- break;
681
- case "End":
682
- a.preventDefault(), n.seek(t.duration);
683
- break;
684
- }
685
- };
686
- return j(() => {
687
- if (e)
688
- return document.addEventListener("keydown", o), () => {
689
- document.removeEventListener("keydown", o);
690
- };
691
- }, [e, o]), {
692
- handleKeyDown: o
693
- };
694
- }
695
- const Ve = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
696
- __proto__: null,
697
- useKeyboardControls: be
698
- }, Symbol.toStringTag, { value: "Module" }));
699
- function Se() {
700
- const [e, t] = Y({
701
- isPlaying: !1,
702
- currentTime: 0,
703
- duration: 0,
704
- volume: 1,
705
- isMuted: !1,
706
- isLoading: !1,
707
- isFullscreen: !1,
708
- error: null,
709
- buffered: null
710
- }), n = (r) => {
711
- t((y) => ({ ...y, ...r }));
712
- };
713
- return {
714
- state: e,
715
- updateState: n,
716
- setPlaying: (r) => {
717
- n({ isPlaying: r });
718
- },
719
- setCurrentTime: (r) => {
720
- n({ currentTime: r });
721
- },
722
- setDuration: (r) => {
723
- n({ duration: r });
724
- },
725
- setVolume: (r) => {
726
- n({ volume: Math.max(0, Math.min(1, r)) });
727
- },
728
- setMuted: (r) => {
729
- n({ isMuted: r });
730
- },
731
- setLoading: (r) => {
732
- n({ isLoading: r });
733
- },
734
- setFullscreen: (r) => {
735
- n({ isFullscreen: r });
736
- },
737
- setError: (r) => {
738
- n({ error: r });
739
- },
740
- setBuffered: (r) => {
741
- n({ buffered: r });
742
- }
743
- };
744
- }
745
- function Me(e) {
746
- const t = z(null), n = z(null), {
747
- state: s,
748
- setPlaying: u,
749
- setCurrentTime: o,
750
- setDuration: a,
751
- setVolume: m,
752
- setMuted: S,
753
- setLoading: F,
754
- setFullscreen: D,
755
- setError: g,
756
- setBuffered: r
757
- } = Se();
758
- j(() => {
759
- const c = t.current;
760
- c && (e.volume !== void 0 && (c.volume = e.volume, m(e.volume)), e.muted !== void 0 && (c.muted = e.muted, S(e.muted)), e.autoPlay !== void 0 && (c.autoplay = e.autoPlay), e.loop !== void 0 && (c.loop = e.loop), e.preload !== void 0 && (c.preload = e.preload), e.crossOrigin !== void 0 && (c.crossOrigin = e.crossOrigin));
761
- }, [e, m, S]);
762
- const y = () => {
763
- u(!0), e.onPlay?.();
764
- }, p = () => {
765
- u(!1), e.onPause?.();
766
- }, d = () => {
767
- const c = t.current;
768
- c && (o(c.currentTime), e.onTimeUpdate?.(c.currentTime));
769
- }, v = () => {
770
- const c = t.current;
771
- c && (a(c.duration), e.onDurationChange?.(c.duration));
772
- }, L = () => {
773
- const c = t.current;
774
- c && (m(c.volume), S(c.muted), e.onVolumeChange?.(c.volume));
775
- }, h = () => {
776
- F(!0), g(null), e.onLoadStart?.();
777
- }, l = () => {
778
- F(!1), e.onLoadedData?.();
779
- }, T = () => {
780
- const c = t.current;
781
- if (!c) return;
782
- const _ = c.error?.message || "An error occurred while loading the media";
783
- g(_), F(!1), e.onError?.(_);
784
- }, E = () => {
785
- u(!1), e.onEnded?.();
786
- }, w = () => {
787
- const c = t.current;
788
- c && r(c.buffered);
789
- };
790
- j(() => {
791
- const c = t.current;
792
- if (c)
793
- return c.addEventListener("play", y), c.addEventListener("pause", p), c.addEventListener("timeupdate", d), c.addEventListener("durationchange", v), c.addEventListener("volumechange", L), c.addEventListener("loadstart", h), c.addEventListener("loadeddata", l), c.addEventListener("error", T), c.addEventListener("ended", E), c.addEventListener("progress", w), () => {
794
- c.removeEventListener("play", y), c.removeEventListener("pause", p), c.removeEventListener("timeupdate", d), c.removeEventListener("durationchange", v), c.removeEventListener("volumechange", L), c.removeEventListener("loadstart", h), c.removeEventListener("loadeddata", l), c.removeEventListener("error", T), c.removeEventListener("ended", E), c.removeEventListener("progress", w);
795
- };
796
- }, [
797
- y,
798
- p,
799
- d,
800
- v,
801
- L,
802
- h,
803
- l,
804
- T,
805
- E,
806
- w
807
- ]);
808
- const b = async () => {
809
- const c = t.current;
810
- if (c)
811
- try {
812
- await c.play();
813
- } catch (_) {
814
- console.error("Failed to play media:", _), g("Failed to play media");
815
- }
816
- }, f = () => {
817
- const c = t.current;
818
- c && c.pause();
819
- }, G = () => {
820
- s.isPlaying ? f() : b();
821
- }, R = (c) => {
822
- const _ = t.current;
823
- _ && (_.currentTime = Math.max(0, Math.min(c, _.duration || 0)));
824
- }, I = (c) => {
825
- const _ = t.current;
826
- if (!_) return;
827
- const ee = Math.max(0, Math.min(1, c));
828
- _.volume = ee;
829
- }, P = () => {
830
- const c = t.current;
831
- c && (c.muted = !c.muted);
832
- }, M = async () => {
833
- const c = n.current;
834
- if (!(!c || !document.fullscreenEnabled))
835
- try {
836
- await c.requestFullscreen(), D(!0);
837
- } catch (_) {
838
- console.error("Failed to enter fullscreen:", _);
839
- }
840
- }, C = async () => {
841
- if (document.fullscreenElement)
842
- try {
843
- await document.exitFullscreen(), D(!1);
844
- } catch (c) {
845
- console.error("Failed to exit fullscreen:", c);
846
- }
847
- }, O = () => {
848
- document.fullscreenElement ? C() : M();
849
- };
850
- return j(() => {
851
- const c = () => {
852
- D(!!document.fullscreenElement);
853
- };
854
- return document.addEventListener("fullscreenchange", c), () => {
855
- document.removeEventListener("fullscreenchange", c);
856
- };
857
- }, [D]), {
858
- state: s,
859
- controls: {
860
- play: b,
861
- pause: f,
862
- toggle: G,
863
- seek: R,
864
- setVolume: I,
865
- toggleMute: P,
866
- enterFullscreen: M,
867
- exitFullscreen: C,
868
- toggleFullscreen: O
869
- },
870
- mediaRef: t,
871
- containerRef: n
872
- };
873
- }
874
- const J = {
875
- mobile: 768,
876
- desktop: 1280
877
- };
878
- function fe() {
879
- if (typeof window > "u") return "unknown";
880
- const e = window.navigator.userAgent.toLowerCase();
881
- return /iphone|ipad|ipod/.test(e) ? "ios" : /android/.test(e) ? "android" : /windows|mac|linux/.test(e) ? "desktop" : "unknown";
882
- }
883
- function ge() {
884
- return typeof window > "u" ? !1 : "ontouchstart" in window || navigator.maxTouchPoints > 0 || // @ts-ignore - for older browsers
885
- navigator.msMaxTouchPoints > 0;
886
- }
887
- function he() {
888
- return typeof window > "u" ? !1 : "vibrate" in navigator || // @ts-ignore - for newer Vibration API
889
- "vibration" in navigator || // @ts-ignore - for iOS haptic feedback
890
- "ondevicemotion" in window;
891
- }
892
- function de() {
893
- const [e, t] = re.useState(() => {
894
- if (typeof window > "u")
895
- return {
896
- isMobile: !1,
897
- isTablet: !1,
898
- isDesktop: !0,
899
- isTouchDevice: !1,
900
- platform: "unknown",
901
- supportsHaptics: !1,
902
- screenSize: { width: 1920, height: 1080 },
903
- orientation: "landscape"
904
- };
905
- const n = window.innerWidth, s = window.innerHeight;
906
- return {
907
- isMobile: n < J.mobile,
908
- isTablet: n >= J.mobile && n < J.desktop,
909
- isDesktop: n >= J.desktop,
910
- isTouchDevice: ge(),
911
- platform: fe(),
912
- supportsHaptics: he(),
913
- screenSize: { width: n, height: s },
914
- orientation: n > s ? "landscape" : "portrait"
915
- };
916
- });
917
- return re.useEffect(() => {
918
- const n = () => {
919
- const a = window.innerWidth, m = window.innerHeight;
920
- t({
921
- isMobile: a < J.mobile,
922
- isTablet: a >= J.mobile && a < J.desktop,
923
- isDesktop: a >= J.desktop,
924
- isTouchDevice: ge(),
925
- platform: fe(),
926
- supportsHaptics: he(),
927
- screenSize: { width: a, height: m },
928
- orientation: a > m ? "landscape" : "portrait"
929
- });
930
- };
931
- window.addEventListener("resize", n), window.addEventListener("orientationchange", n);
932
- const s = window.matchMedia(`(max-width: ${J.mobile - 1}px)`), u = window.matchMedia(`(min-width: ${J.mobile}px) and (max-width: ${J.desktop - 1}px)`), o = window.matchMedia(`(min-width: ${J.desktop}px)`);
933
- return s.addEventListener("change", n), u.addEventListener("change", n), o.addEventListener("change", n), () => {
934
- window.removeEventListener("resize", n), window.removeEventListener("orientationchange", n), s.removeEventListener("change", n), u.removeEventListener("change", n), o.removeEventListener("change", n);
935
- };
936
- }, []), e;
937
- }
938
- function _e() {
939
- const { platform: e, isMobile: t } = de();
940
- re.useEffect(() => {
941
- if (t) {
942
- if (e === "ios") {
943
- const n = (s) => {
944
- s.touches.length > 1 && s.preventDefault();
945
- };
946
- return document.addEventListener("touchstart", n, { passive: !1 }), document.body.style.webkitOverflowScrolling = "touch", () => {
947
- document.removeEventListener("touchstart", n);
948
- };
949
- }
950
- e === "android" && (document.body.style.touchAction = "manipulation"), document.documentElement.style.setProperty("--webkit-transform", "translateZ(0)"), document.documentElement.style.setProperty("--transform", "translateZ(0)");
951
- }
952
- }, [e, t]);
953
- }
954
- function Le() {
955
- const { supportsHaptics: e } = de();
956
- return { triggerHaptic: re.useCallback((n = "light") => {
957
- if (!e) return;
958
- const u = {
959
- light: [10],
960
- medium: [20],
961
- heavy: [30],
962
- success: [10, 10, 10],
963
- warning: [20, 20],
964
- error: [50, 20, 50]
965
- }[n];
966
- "vibrate" in navigator && navigator.vibrate(u);
967
- }, [e]), supportsHaptics: e };
968
- }
969
- const ke = {
970
- enabledGestures: ["tap", "double-tap", "long-press", "swipe-left", "swipe-right", "swipe-up", "swipe-down", "pinch-in", "pinch-out"],
971
- tapThreshold: 200,
972
- doubleTapThreshold: 300,
973
- longPressThreshold: 500,
974
- swipeThreshold: 50,
975
- swipeVelocityThreshold: 0.5,
976
- pinchThreshold: 0.1,
977
- rotationThreshold: 15,
978
- enableHapticFeedback: !0
979
- };
980
- function Pe(e, t, n = {}) {
981
- const s = { ...ke, ...n }, { isTouchDevice: u } = de(), { triggerHaptic: o } = Le(), a = re.useRef({
982
- isTracking: !1,
983
- touches: [],
984
- startTouches: []
985
- }), m = (p) => ({
986
- id: p.identifier,
987
- x: p.clientX,
988
- y: p.clientY,
989
- timestamp: Date.now()
990
- }), S = (p, d) => Math.sqrt(Math.pow(d.x - p.x, 2) + Math.pow(d.y - p.y, 2)), F = (p, d) => {
991
- const v = Math.max(d.timestamp - p.timestamp, 1);
992
- return {
993
- x: (d.x - p.x) / v,
994
- y: (d.y - p.y) / v
995
- };
996
- }, D = (p, d, v, L = {}) => ({
997
- type: p,
998
- startPoint: { x: d.x, y: d.y },
999
- currentPoint: { x: v.x, y: v.y },
1000
- duration: v.timestamp - d.timestamp,
1001
- target: e.current,
1002
- preventDefault: () => {
1003
- },
1004
- ...L
1005
- }), g = re.useCallback((p) => {
1006
- if (!s.enabledGestures.length) return;
1007
- const d = Array.from(p.touches).map(m), v = a.current;
1008
- v.isTracking = !0, v.touches = d, v.startTouches = [...d], v.longPressTimer && clearTimeout(v.longPressTimer), d.length === 1 && s.enabledGestures.includes("long-press") && (v.longPressTimer = setTimeout(() => {
1009
- if (v.touches.length === 1 && d[0]) {
1010
- const L = D("long-press", d[0], d[0]);
1011
- t(L), s.enableHapticFeedback && o("heavy");
1012
- }
1013
- }, s.longPressThreshold)), d.length === 2 && d[0] && d[1] && (v.initialDistance = S(d[0], d[1]), v.initialScale = 1, v.lastScale = 1);
1014
- }, [s, t, o]), r = re.useCallback((p) => {
1015
- const d = a.current;
1016
- if (!d.isTracking) return;
1017
- const v = Array.from(p.touches).map(m);
1018
- if (d.touches = v, v.length === 2 && d.initialDistance && v[0] && v[1]) {
1019
- const L = S(v[0], v[1]), h = L / d.initialDistance;
1020
- if (Math.abs(h - (d.lastScale || 1)) > s.pinchThreshold) {
1021
- const T = h > (d.lastScale || 1) ? "pinch-out" : "pinch-in";
1022
- if (s.enabledGestures.includes(T)) {
1023
- const E = {
1024
- x: (v[0].x + v[1].x) / 2,
1025
- y: (v[0].y + v[1].y) / 2,
1026
- timestamp: Date.now()
1027
- }, w = {
1028
- x: ((d.startTouches[0]?.x ?? 0) + (d.startTouches[1]?.x ?? 0)) / 2,
1029
- y: ((d.startTouches[0]?.y ?? 0) + (d.startTouches[1]?.y ?? 0)) / 2,
1030
- timestamp: d.startTouches[0]?.timestamp ?? Date.now()
1031
- }, b = D(T, w, E, {
1032
- scale: h,
1033
- distance: L
1034
- });
1035
- t(b), d.lastScale = h;
1036
- }
1037
- }
1038
- }
1039
- if (d.longPressTimer && v.length === 1 && d.startTouches[0] && v[0]) {
1040
- const L = d.startTouches[0], h = v[0];
1041
- S(L, h) > s.swipeThreshold && (clearTimeout(d.longPressTimer), d.longPressTimer = void 0);
1042
- }
1043
- }, [s, t]), y = re.useCallback((p) => {
1044
- const d = a.current;
1045
- if (!d.isTracking) return;
1046
- const v = Array.from(p.changedTouches).map(m), L = Date.now();
1047
- if (d.longPressTimer && (clearTimeout(d.longPressTimer), d.longPressTimer = void 0), d.startTouches.length === 1 && v.length === 1 && d.startTouches[0] && v[0]) {
1048
- const h = d.startTouches[0], l = v[0], T = S(h, l), E = l.timestamp - h.timestamp;
1049
- if (T > s.swipeThreshold) {
1050
- const w = F(h, l), b = Math.abs(w.x), f = Math.abs(w.y);
1051
- if (b > s.swipeVelocityThreshold || f > s.swipeVelocityThreshold) {
1052
- let G;
1053
- if (b > f ? G = w.x > 0 ? "swipe-right" : "swipe-left" : G = w.y > 0 ? "swipe-down" : "swipe-up", s.enabledGestures.includes(G)) {
1054
- const R = D(G, h, l, {
1055
- velocity: w,
1056
- distance: T
1057
- });
1058
- t(R), s.enableHapticFeedback && o("light");
1059
- }
1060
- }
1061
- } else if (E < s.tapThreshold && T < s.swipeThreshold)
1062
- if (d.lastTap && L - d.lastTap.timestamp < s.doubleTapThreshold && S({ ...d.lastTap.point }, l) < s.swipeThreshold) {
1063
- if (s.enabledGestures.includes("double-tap")) {
1064
- const w = D("double-tap", h, l);
1065
- t(w), s.enableHapticFeedback && o("medium");
1066
- }
1067
- d.lastTap = void 0;
1068
- } else {
1069
- if (s.enabledGestures.includes("tap")) {
1070
- const w = D("tap", h, l);
1071
- t(w), s.enableHapticFeedback && o("light");
1072
- }
1073
- d.lastTap = {
1074
- timestamp: L,
1075
- point: { x: l.x, y: l.y }
1076
- };
1077
- }
1078
- }
1079
- p.touches.length === 0 && (d.isTracking = !1, d.touches = [], d.startTouches = [], d.initialDistance = void 0, d.initialScale = void 0, d.lastScale = void 0);
1080
- }, [s, t, o]);
1081
- return re.useEffect(() => {
1082
- const p = e.current;
1083
- if (!(!p || !u))
1084
- return p.addEventListener("touchstart", g, { passive: !1 }), p.addEventListener("touchmove", r, { passive: !1 }), p.addEventListener("touchend", y, { passive: !1 }), p.addEventListener("touchcancel", y, { passive: !1 }), () => {
1085
- p.removeEventListener("touchstart", g), p.removeEventListener("touchmove", r), p.removeEventListener("touchend", y), p.removeEventListener("touchcancel", y);
1086
- };
1087
- }, [g, r, y, u]), {
1088
- isGestureEnabled: u && s.enabledGestures.length > 0
1089
- };
1090
- }
1091
- function Be(e, t) {
1092
- const n = re.useCallback((u) => {
1093
- const { type: o, distance: a, scale: m } = u;
1094
- switch (o) {
1095
- case "double-tap":
1096
- t.onPlayPause?.();
1097
- break;
1098
- case "swipe-left":
1099
- const S = Math.min((a || 0) / 10, 30);
1100
- t.onSeek?.("backward", S);
1101
- break;
1102
- case "swipe-right":
1103
- const F = Math.min((a || 0) / 10, 30);
1104
- t.onSeek?.("forward", F);
1105
- break;
1106
- case "swipe-up":
1107
- if (u.startPoint.x > (e.current?.clientWidth || 0) / 2) {
1108
- const D = Math.min((a || 0) / 100, 0.2);
1109
- t.onVolumeChange?.("up", D);
1110
- }
1111
- break;
1112
- case "swipe-down":
1113
- if (u.startPoint.x > (e.current?.clientWidth || 0) / 2) {
1114
- const D = Math.min((a || 0) / 100, 0.2);
1115
- t.onVolumeChange?.("down", D);
1116
- }
1117
- break;
1118
- case "pinch-out":
1119
- t.onZoom?.(m || 1);
1120
- break;
1121
- case "pinch-in":
1122
- t.onZoom?.(m || 1);
1123
- break;
1124
- case "long-press":
1125
- t.onToggleFullscreen?.();
1126
- break;
1127
- }
1128
- }, [t, e]);
1129
- return Pe(e, n, {
1130
- enabledGestures: ["tap", "double-tap", "long-press", "swipe-left", "swipe-right", "swipe-up", "swipe-down", "pinch-in", "pinch-out"],
1131
- enableHapticFeedback: !0,
1132
- swipeThreshold: 30,
1133
- swipeVelocityThreshold: 0.3
1134
- });
1135
- }
1136
- function Ne(e) {
1137
- const t = z(null), [n, s] = Y({
1138
- isPlaying: !1,
1139
- currentTime: 0,
1140
- duration: 0,
1141
- volume: 1,
1142
- isMuted: !1,
1143
- isFullscreen: !1,
1144
- isLoading: !0,
1145
- isSeeking: !1,
1146
- isBuffering: !1,
1147
- bufferedRanges: []
1148
- });
1149
- return j(() => {
1150
- const r = t.current;
1151
- if (!r) return;
1152
- const y = () => {
1153
- s((R) => ({ ...R, currentTime: r.currentTime }));
1154
- }, p = () => {
1155
- s((R) => ({ ...R, duration: r.duration }));
1156
- }, d = () => {
1157
- s((R) => ({ ...R, isPlaying: !0, isBuffering: !1 }));
1158
- }, v = () => {
1159
- s((R) => ({ ...R, isPlaying: !1 }));
1160
- }, L = () => {
1161
- s((R) => ({
1162
- ...R,
1163
- volume: r.volume,
1164
- isMuted: r.muted
1165
- }));
1166
- }, h = () => {
1167
- s((R) => ({ ...R, isLoading: !0 }));
1168
- }, l = () => {
1169
- s((R) => ({ ...R, isLoading: !1 }));
1170
- }, T = () => {
1171
- s((R) => ({ ...R, isSeeking: !0 }));
1172
- }, E = () => {
1173
- s((R) => ({ ...R, isSeeking: !1 }));
1174
- }, w = () => {
1175
- s((R) => ({ ...R, isBuffering: !0 }));
1176
- }, b = () => {
1177
- s((R) => ({ ...R, isBuffering: !1, isLoading: !1 }));
1178
- }, f = () => {
1179
- s((R) => ({ ...R, isLoading: !1, isBuffering: !1 }));
1180
- }, G = () => {
1181
- if (!r.buffered || r.buffered.length === 0 || r.duration === 0) {
1182
- s((I) => ({ ...I, bufferedRanges: [] }));
1183
- return;
1184
- }
1185
- const R = [];
1186
- for (let I = 0; I < r.buffered.length; I++) {
1187
- const P = r.buffered.start(I), M = r.buffered.end(I);
1188
- R.push({
1189
- start: P,
1190
- end: M,
1191
- percentage: (M - P) / r.duration * 100
1192
- });
1193
- }
1194
- s((I) => ({ ...I, bufferedRanges: R }));
1195
- };
1196
- return r.addEventListener("timeupdate", y), r.addEventListener("loadedmetadata", p), r.addEventListener("play", d), r.addEventListener("pause", v), r.addEventListener("volumechange", L), r.addEventListener("loadstart", h), r.addEventListener("loadeddata", l), r.addEventListener("seeking", T), r.addEventListener("seeked", E), r.addEventListener("waiting", w), r.addEventListener("playing", b), r.addEventListener("canplay", f), r.addEventListener("progress", G), () => {
1197
- r.removeEventListener("timeupdate", y), r.removeEventListener("loadedmetadata", p), r.removeEventListener("play", d), r.removeEventListener("pause", v), r.removeEventListener("volumechange", L), r.removeEventListener("loadstart", h), r.removeEventListener("loadeddata", l), r.removeEventListener("seeking", T), r.removeEventListener("seeked", E), r.removeEventListener("waiting", w), r.removeEventListener("playing", b), r.removeEventListener("canplay", f), r.removeEventListener("progress", G);
1198
- };
1199
- }, []), {
1200
- videoRef: t,
1201
- state: n,
1202
- controls: {
1203
- togglePlay: () => {
1204
- const r = t.current;
1205
- r && (n.isPlaying ? r.pause() : r.play());
1206
- },
1207
- seekForward: (r = 10) => {
1208
- const y = t.current;
1209
- y && (y.currentTime = Math.min(n.duration, y.currentTime + r));
1210
- },
1211
- seekBackward: (r = 10) => {
1212
- const y = t.current;
1213
- y && (y.currentTime = Math.max(0, y.currentTime - r));
1214
- },
1215
- toggleMute: () => {
1216
- const r = t.current;
1217
- r && (r.muted = !n.isMuted);
1218
- },
1219
- setVolume: (r) => {
1220
- const y = t.current;
1221
- y && (y.volume = r, r > 0 && n.isMuted && (y.muted = !1));
1222
- },
1223
- toggleFullscreen: () => {
1224
- const r = e.current;
1225
- r && (n.isFullscreen ? document.exitFullscreen && document.exitFullscreen() : r.requestFullscreen && r.requestFullscreen(), s((y) => ({ ...y, isFullscreen: !y.isFullscreen })));
1226
- },
1227
- seekTo: (r) => {
1228
- const y = t.current;
1229
- !y || n.duration === 0 || (y.currentTime = Math.max(0, Math.min(n.duration, r)));
1230
- }
1231
- }
1232
- };
1233
- }
1234
- function Fe({
1235
- subtitleSrc: e,
1236
- subtitleTracks: t = [],
1237
- defaultFontSize: n = "medium",
1238
- onLoadError: s
1239
- } = {}) {
1240
- const [u, o] = Y(!1), [a, m] = Y([]), [S, F] = Y(""), [D, g] = Y(null), [r, y] = Y(n), [p, d] = Y(null), [v, L] = Y(!1), h = {
1241
- small: "text-sm",
1242
- medium: "text-base",
1243
- large: "text-lg"
1244
- }, l = !!(e || t && t.length > 0), T = (P) => {
1245
- const M = P.split(":"), C = M[2] ? parseFloat(M[2]) : 0, O = M[1] ? parseInt(M[1], 10) * 60 : 0;
1246
- return (M[0] ? parseInt(M[0], 10) * 3600 : 0) + O + C;
1247
- }, E = (P) => {
1248
- const [M, C] = P.split(","), O = (M || "").split(":"), U = C ? parseInt(C, 10) / 1e3 : 0, c = O[2] ? parseInt(O[2], 10) : 0, _ = O[1] ? parseInt(O[1], 10) * 60 : 0;
1249
- return (O[0] ? parseInt(O[0], 10) * 3600 : 0) + _ + c + U;
1250
- }, w = async (P) => {
1251
- L(!0), d(null);
1252
- try {
1253
- const M = await fetch(P);
1254
- if (!M.ok)
1255
- throw new Error(`Failed to load subtitles: ${M.status} ${M.statusText}`);
1256
- const C = await M.text(), O = [], U = C.split(`
1257
- `);
1258
- let c = 0;
1259
- const _ = C.includes("WEBVTT") || P.endsWith(".vtt"), ee = P.endsWith(".srt") || /^\d+$/.test(U[0]?.trim() || "");
1260
- if (_)
1261
- for (; c < U.length; ) {
1262
- if (U[c]?.includes("-->")) {
1263
- const [Q, se] = (U[c] || "").split("-->").map((V) => V.trim()), ae = T(Q || ""), i = T(se || "");
1264
- c++;
1265
- let k = "";
1266
- for (; c < U.length && U[c]?.trim() !== ""; )
1267
- k += (k ? " " : "") + U[c]?.trim(), c++;
1268
- k && O.push({ start: ae, end: i, text: k });
1269
- }
1270
- c++;
1271
- }
1272
- else if (ee)
1273
- for (; c < U.length; ) {
1274
- if (/^\d+$/.test(U[c]?.trim() || "") && (c++, U[c]?.includes("-->"))) {
1275
- const [Q, se] = (U[c] || "").split("-->").map((V) => V.trim()), ae = E(Q || ""), i = E(se || "");
1276
- c++;
1277
- let k = "";
1278
- for (; c < U.length && U[c]?.trim() !== ""; )
1279
- k += (k ? " " : "") + U[c]?.trim(), c++;
1280
- k && O.push({ start: ae, end: i, text: k });
1281
- }
1282
- c++;
1283
- }
1284
- else
1285
- throw new Error("Unsupported subtitle format. Only VTT and SRT are supported.");
1286
- if (O.length === 0)
1287
- throw new Error("No subtitle cues found in file");
1288
- m(O), L(!1);
1289
- } catch (M) {
1290
- const C = M instanceof Error ? M : new Error("Failed to load subtitles");
1291
- console.error("Failed to load subtitles:", C), d(C), L(!1), m([]), s?.(C);
1292
- }
1293
- }, b = (P) => !u || a.length === 0 ? "" : a.find(
1294
- (C) => P >= C.start && P <= C.end
1295
- )?.text || "", f = () => {
1296
- o((P) => {
1297
- const M = !P;
1298
- if (M && !p) {
1299
- if (a.length === 0 && !v) {
1300
- const C = e || t[0]?.src;
1301
- C && (w(C), t[0] && g(t[0].id));
1302
- }
1303
- } else M || F("");
1304
- return M;
1305
- });
1306
- }, G = (P) => {
1307
- if (!P) {
1308
- o(!1), g(null), F("");
1309
- return;
1310
- }
1311
- const M = t.find((C) => C.id === P);
1312
- M?.src && (g(P), w(M.src), o(!0));
1313
- }, R = (P) => {
1314
- y(P);
1315
- }, I = {
1316
- fontSize: h[r],
1317
- className: `${h[r]} font-medium`
1318
- };
1319
- return j(() => {
1320
- u || F("");
1321
- }, [u]), j(() => {
1322
- }, []), {
1323
- // State
1324
- subtitlesEnabled: u,
1325
- currentSubtitle: S,
1326
- subtitleCues: a,
1327
- currentTrackId: D,
1328
- fontSize: r,
1329
- loadError: p,
1330
- isLoading: v,
1331
- hasSubtitles: l,
1332
- // Actions
1333
- toggleSubtitles: f,
1334
- selectSubtitleTrack: G,
1335
- changeSubtitleFontSize: R,
1336
- setCurrentSubtitle: F,
1337
- // Utilities
1338
- getCurrentSubtitle: b,
1339
- getSubtitleStyles: I,
1340
- // Track info
1341
- availableTracks: t
1342
- };
1343
- }
1344
- const He = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1345
- __proto__: null,
1346
- useEnhancedSubtitles: Fe
1347
- }, Symbol.toStringTag, { value: "Module" }));
1348
- function Ke(e, t) {
1349
- const [n, s] = Y(!0), [u, o] = Y(!1), a = z(null), m = () => {
1350
- s(!0), a.current && clearTimeout(a.current), e && !t && (a.current = setTimeout(() => {
1351
- s(!1);
1352
- }, 3e3));
1353
- }, S = () => {
1354
- m();
1355
- }, F = () => {
1356
- s(!0);
1357
- }, D = () => {
1358
- e && s(!1);
1359
- };
1360
- return j(() => (m(), () => {
1361
- a.current && clearTimeout(a.current);
1362
- }), [m]), {
1363
- controlsVisible: n,
1364
- showVolumeSlider: u,
1365
- setShowVolumeSlider: o,
1366
- handleMouseMove: S,
1367
- handleMouseEnter: F,
1368
- handleMouseLeave: D
1369
- };
1370
- }
1371
- function $e({
1372
- videoControls: e,
1373
- toggleSubtitles: t,
1374
- takeScreenshot: n,
1375
- duration: s
1376
- }) {
1377
- const u = (o) => {
1378
- const a = document.querySelector("video");
1379
- if (a)
1380
- switch (o.key.toLowerCase()) {
1381
- case " ":
1382
- case "k":
1383
- o.preventDefault(), e.togglePlay();
1384
- break;
1385
- case "j":
1386
- o.preventDefault(), e.seekBackward();
1387
- break;
1388
- case "l":
1389
- o.preventDefault(), e.seekForward();
1390
- break;
1391
- case "arrowleft":
1392
- o.preventDefault(), a.currentTime = Math.max(0, a.currentTime - 5);
1393
- break;
1394
- case "arrowright":
1395
- o.preventDefault(), a.currentTime = Math.min(s, a.currentTime + 5);
1396
- break;
1397
- case "arrowup":
1398
- o.preventDefault(), a.volume = Math.min(1, a.volume + 0.1);
1399
- break;
1400
- case "arrowdown":
1401
- o.preventDefault(), a.volume = Math.max(0, a.volume - 0.1);
1402
- break;
1403
- case "m":
1404
- o.preventDefault(), e.toggleMute();
1405
- break;
1406
- case "f":
1407
- o.preventDefault(), e.toggleFullscreen();
1408
- break;
1409
- case "c":
1410
- o.preventDefault(), t();
1411
- break;
1412
- case "s":
1413
- o.preventDefault(), n(o.ctrlKey || o.metaKey);
1414
- break;
1415
- }
1416
- };
1417
- j(() => (document.addEventListener("keydown", u), () => document.removeEventListener("keydown", u)), [u]);
1418
- }
1419
- function Ge(e) {
1420
- return { takeScreenshot: (n = !1) => {
1421
- if (!e.current) return;
1422
- const s = e.current, u = document.createElement("canvas");
1423
- u.width = s.videoWidth, u.height = s.videoHeight;
1424
- const o = u.getContext("2d");
1425
- if (o)
1426
- try {
1427
- o.drawImage(s, 0, 0), u.toBlob((a) => {
1428
- if (!a) {
1429
- console.error("Failed to create blob from canvas");
1430
- return;
1431
- }
1432
- if (n)
1433
- if (navigator.clipboard && window.ClipboardItem) {
1434
- const m = new ClipboardItem({ "image/png": a });
1435
- navigator.clipboard.write([m]).catch((S) => {
1436
- console.error("Failed to copy to clipboard:", S);
1437
- });
1438
- } else
1439
- console.warn("Clipboard API not supported");
1440
- else {
1441
- const m = URL.createObjectURL(a), S = document.createElement("a");
1442
- S.href = m, S.download = `screenshot-${Date.now()}.png`, S.click(), URL.revokeObjectURL(m);
1443
- }
1444
- }, "image/png");
1445
- } catch (a) {
1446
- a instanceof Error && a.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:", a), alert("Screenshot failed: " + (a instanceof Error ? a.message : "Unknown error")));
1447
- }
1448
- } };
1449
- }
1450
- function $(e, t) {
1451
- return ((n, s = !1) => {
1452
- const u = {
1453
- type: e,
1454
- detail: n,
1455
- optimistic: s,
1456
- timestamp: Date.now()
1457
- };
1458
- return s ? t.dispatchOptimistic(u) : (t.dispatch(u), Promise.resolve());
1459
- });
1460
- }
1461
- function De(e) {
1462
- const [t, n] = B.useState(e.getActionState());
1463
- return B.useEffect(() => e.subscribe(() => {
1464
- const u = e.getActionState();
1465
- n(
1466
- (o) => JSON.stringify(o) !== JSON.stringify(u) ? u : o
1467
- );
1468
- }), [e]), t;
1469
- }
1470
- function ze(e) {
1471
- const t = B.useMemo(() => ({
1472
- // Playback actions
1473
- play: $(H.PLAY, e),
1474
- pause: $(H.PAUSE, e),
1475
- seek: $(H.SEEK, e),
1476
- // Volume actions
1477
- setVolume: $(H.SET_VOLUME, e),
1478
- mute: $(H.MUTE, e),
1479
- unmute: $(H.UNMUTE, e),
1480
- toggleMute: $(H.TOGGLE_MUTE, e),
1481
- // Media state actions
1482
- setDuration: $(H.SET_DURATION, e),
1483
- setCurrentTime: $(H.SET_CURRENT_TIME, e),
1484
- setBuffered: $(H.SET_BUFFERED, e),
1485
- setLoading: $(H.SET_LOADING, e),
1486
- setError: $(H.SET_ERROR, e),
1487
- // Display actions
1488
- enterFullscreen: $(H.ENTER_FULLSCREEN, e),
1489
- exitFullscreen: $(H.EXIT_FULLSCREEN, e),
1490
- enterPiP: $(H.ENTER_PIP, e),
1491
- exitPiP: $(H.EXIT_PIP, e),
1492
- // Advanced actions
1493
- setPlaybackRate: $(H.SET_PLAYBACK_RATE, e),
1494
- setSubtitleTrack: $(H.SET_SUBTITLE_TRACK, e),
1495
- setRendition: $(H.SET_RENDITION, e),
1496
- toggleSubtitles: $(H.TOGGLE_SUBTITLES, e),
1497
- // Preview actions
1498
- previewTime: $(H.PREVIEW_TIME, e),
1499
- clearPreview: $(H.CLEAR_PREVIEW, e)
1500
- }), [e]), n = De(e), s = B.useMemo(() => ({
1501
- // These actions benefit from immediate UI feedback
1502
- togglePlayPause: async (o) => {
1503
- o ? await t.pause(!0) : await t.play(!0);
1504
- },
1505
- seekWithPreview: async (o) => {
1506
- await t.previewTime(o, !0), await t.seek(o, !0);
1507
- },
1508
- adjustVolume: async (o, a) => {
1509
- const m = Math.max(0, Math.min(1, a + o));
1510
- await t.setVolume(m, !0);
1511
- },
1512
- toggleFullscreenOptimistic: async (o) => {
1513
- o ? await t.exitFullscreen(!0) : await t.enterFullscreen(!0);
1514
- }
1515
- }), [t]), u = B.useCallback(async () => {
1516
- const { lastAction: o } = n;
1517
- o && n.error && await e.dispatchOptimistic({
1518
- ...o,
1519
- retryCount: (o.retryCount || 0) + 1
1520
- });
1521
- }, [e, n]);
1522
- return {
1523
- ...t,
1524
- ...s,
1525
- actionState: n,
1526
- retryLastAction: u,
1527
- isLoading: n.pending,
1528
- hasError: !!n.error,
1529
- errorMessage: n.error,
1530
- retryCount: n.retryCount
1531
- };
1532
- }
1533
- function We() {
1534
- const [e, t] = Y({
1535
- isPlaying: !1,
1536
- currentTime: 0,
1537
- duration: 0,
1538
- volume: 1,
1539
- isMuted: !1,
1540
- isLoading: !1,
1541
- isFullscreen: !1,
1542
- error: null,
1543
- buffered: null
1544
- }), n = (r) => {
1545
- t((y) => ({ ...y, ...r }));
1546
- };
1547
- return {
1548
- state: e,
1549
- updateState: n,
1550
- setPlaying: (r) => {
1551
- n({ isPlaying: r });
1552
- },
1553
- setCurrentTime: (r) => {
1554
- n({ currentTime: r });
1555
- },
1556
- setDuration: (r) => {
1557
- n({ duration: r });
1558
- },
1559
- setVolume: (r) => {
1560
- n({ volume: Math.max(0, Math.min(1, r)) });
1561
- },
1562
- setMuted: (r) => {
1563
- n({ isMuted: r });
1564
- },
1565
- setLoading: (r) => {
1566
- n({ isLoading: r });
1567
- },
1568
- setFullscreen: (r) => {
1569
- n({ isFullscreen: r });
1570
- },
1571
- setError: (r) => {
1572
- n({ error: r });
1573
- },
1574
- setBuffered: (r) => {
1575
- n({ buffered: r });
1576
- }
1577
- };
1578
- }
1579
- function je(e) {
1580
- const t = z(null), n = z(null), [s, u] = le(), [o, a] = le();
1581
- B.useRef(0);
1582
- const m = B.useRef(0), S = B.useRef(0);
1583
- z(void 0);
1584
- const F = z(0), D = pe(), g = "getOptimisticState" in D, r = W((i) => i.isPlaying), y = W((i) => i.currentTime), p = W((i) => i.duration), d = W((i) => i.volume), v = W((i) => i.isMuted), L = W((i) => i.isLoading), h = W((i) => i.isBuffering), l = W((i) => i.error), T = W((i) => i.buffered), E = W((i) => i.isFullscreen), w = D, b = g ? Ee(w) : null, f = g ? Te(w) : null, [G, R] = B.useState({
1585
- frameRate: 0,
1586
- averageRenderTime: 0,
1587
- droppedFrames: 0,
1588
- bufferHealth: 0
1589
- }), [I, P] = ce(d, (i, k) => Math.max(0, Math.min(1, k)));
1590
- ce(y, (i, k) => Math.max(0, Math.min(p || 0, k))), j(() => {
1591
- const i = t.current;
1592
- if (!i) return;
1593
- const k = {
1594
- volume: e.volume,
1595
- muted: e.muted,
1596
- autoplay: e.autoPlay,
1597
- loop: e.loop,
1598
- preload: e.preload,
1599
- crossOrigin: e.crossOrigin
1600
- };
1601
- Object.entries(k).forEach(([V, X]) => {
1602
- X !== void 0 && (i[V] = X);
1603
- }), i.setAttribute("preload", e.preloadStrategy === "eager" ? "auto" : "metadata"), e.bufferingStrategy === "aggressive" && i.setAttribute("buffered", "auto"), i instanceof HTMLVideoElement && (i.style.willChange = "transform", i.style.transform = "translateZ(0)");
1604
- }, [
1605
- e.volume,
1606
- e.muted,
1607
- e.autoPlay,
1608
- e.loop,
1609
- e.preload,
1610
- e.crossOrigin,
1611
- e.preloadStrategy,
1612
- e.bufferingStrategy
1613
- ]);
1614
- const M = A(() => {
1615
- const i = t.current;
1616
- if (!i) return;
1617
- const k = performance.now();
1618
- if (e.enableTimeUpdateThrottling !== !1) {
1619
- if (k - F.current < (e.timeUpdateThrottleMs || 100))
1620
- return;
1621
- F.current = k;
1622
- }
1623
- u(() => {
1624
- g && f && f.setCurrentTime(i.currentTime);
1625
- });
1626
- }, [e.enableTimeUpdateThrottling, e.timeUpdateThrottleMs, g, f]), C = A(() => {
1627
- u(() => {
1628
- g && f && f.play(!0);
1629
- }), e.onPlay?.();
1630
- }, [g, f, e.onPlay]), O = A(() => {
1631
- u(() => {
1632
- g && f && f.pause(!0);
1633
- }), e.onPause?.();
1634
- }, [g, f, e.onPause]), U = A(() => {
1635
- const i = t.current;
1636
- i && u(() => {
1637
- g && f && (f.setVolume(i.volume, !0), i.muted ? f.mute(!0) : f.unmute(!0));
1638
- });
1639
- }, [g, f]), c = A(() => {
1640
- a(() => {
1641
- });
1642
- }, []), _ = A(() => {
1643
- }, []), ee = A(() => {
1644
- const i = t.current;
1645
- i && u(() => {
1646
- g && f && f.setBuffered(i.buffered);
1647
- });
1648
- }, [g, f]), Q = A(() => {
1649
- const i = performance.now();
1650
- if (i - S.current > 0 && (m.current++, m.current >= 60)) {
1651
- const V = Math.round(m.current * 1e3 / (i - S.current));
1652
- R((X) => ({
1653
- ...X,
1654
- frameRate: V,
1655
- droppedFrames: Math.max(0, 60 - V)
1656
- })), m.current = 0, S.current = i;
1657
- }
1658
- }, []);
1659
- j(() => {
1660
- const i = t.current;
1661
- if (!i) return;
1662
- const k = [
1663
- { event: "timeupdate", handler: M, passive: !0 },
1664
- { event: "play", handler: C },
1665
- { event: "pause", handler: O },
1666
- { event: "volumechange", handler: U },
1667
- { event: "seeking", handler: c },
1668
- { event: "seeked", handler: _ },
1669
- { event: "progress", handler: ee, passive: !0 },
1670
- { event: "loadedmetadata", handler: () => Q() },
1671
- { event: "loadeddata", handler: () => Q() }
1672
- ];
1673
- k.forEach(({ event: te, handler: ne, passive: ie }) => {
1674
- const oe = ie ? { passive: !0 } : {};
1675
- i.addEventListener(te, ne, oe);
1676
- });
1677
- let V;
1678
- const X = () => {
1679
- Q(), V = requestAnimationFrame(X);
1680
- };
1681
- return e.enablePerformanceMonitoring && X(), () => {
1682
- k.forEach(({ event: te, handler: ne }) => {
1683
- i.removeEventListener(te, ne);
1684
- }), V && cancelAnimationFrame(V);
1685
- };
1686
- }, [
1687
- M,
1688
- C,
1689
- O,
1690
- U,
1691
- c,
1692
- _,
1693
- ee,
1694
- Q,
1695
- e.enablePerformanceMonitoring
1696
- ]);
1697
- const se = ue(() => {
1698
- const i = async () => {
1699
- const x = t.current;
1700
- if (x)
1701
- if (g && f)
1702
- await f.play(!0);
1703
- else
1704
- try {
1705
- await x.play();
1706
- } catch (q) {
1707
- console.error("Failed to play media:", q);
1708
- }
1709
- }, k = () => {
1710
- const x = t.current;
1711
- x && (g && f ? f.pause(!0) : x.pause());
1712
- }, V = () => {
1713
- r ? k() : i();
1714
- }, X = (x) => {
1715
- const q = t.current;
1716
- if (!q) return;
1717
- const Z = Math.max(0, Math.min(x, p || 0));
1718
- g && f ? a(() => {
1719
- f.seek(Z, !0);
1720
- }) : q.currentTime = Z;
1721
- }, te = (x) => {
1722
- const q = t.current;
1723
- if (!q) return;
1724
- const Z = Math.max(0, Math.min(1, x));
1725
- g && f ? (P(Z), u(() => {
1726
- f.setVolume(Z, !0);
1727
- })) : q.volume = Z;
1728
- }, ne = () => {
1729
- const x = t.current;
1730
- x && (g && f ? f.toggleMute(!0) : x.muted = !x.muted);
1731
- }, ie = async () => {
1732
- const x = n.current;
1733
- if (!(!x || !document.fullscreenEnabled))
1734
- try {
1735
- await x.requestFullscreen(), g && f && f.enterFullscreen(!0);
1736
- } catch (q) {
1737
- console.error("Failed to enter fullscreen:", q);
1738
- }
1739
- }, oe = async () => {
1740
- if (document.fullscreenElement)
1741
- try {
1742
- await document.exitFullscreen(), g && f && f.exitFullscreen(!0);
1743
- } catch (x) {
1744
- console.error("Failed to exit fullscreen:", x);
1745
- }
1746
- };
1747
- return {
1748
- play: i,
1749
- pause: k,
1750
- toggle: V,
1751
- seek: X,
1752
- setVolume: te,
1753
- toggleMute: ne,
1754
- enterFullscreen: ie,
1755
- exitFullscreen: oe,
1756
- toggleFullscreen: () => {
1757
- document.fullscreenElement ? oe() : ie();
1758
- }
1759
- };
1760
- }, [
1761
- r,
1762
- p,
1763
- g,
1764
- f,
1765
- u,
1766
- a,
1767
- P
1768
- ]), ae = ue(() => ({
1769
- isPlaying: b?.state?.isPlaying ?? r,
1770
- currentTime: b?.state?.currentTime ?? y,
1771
- duration: b?.state?.duration ?? p,
1772
- volume: b?.state?.volume ?? I,
1773
- isMuted: b?.state?.isMuted ?? v,
1774
- isLoading: b?.state?.isBuffering ?? L,
1775
- isBuffering: b?.state?.isBuffering ?? h,
1776
- error: b?.state?.error ?? l,
1777
- buffered: b?.state?.buffered ?? T,
1778
- isFullscreen: b?.state?.isFullscreen ?? E,
1779
- progress: p > 0 ? y / p : 0,
1780
- isTransitioning: s || o,
1781
- canPlay: !L && !h && !l
1782
- }), [
1783
- b,
1784
- r,
1785
- y,
1786
- p,
1787
- I,
1788
- v,
1789
- L,
1790
- h,
1791
- l,
1792
- T,
1793
- E,
1794
- s,
1795
- o
1796
- ]);
1797
- return {
1798
- // Refs
1799
- mediaRef: t,
1800
- containerRef: n,
1801
- // State
1802
- state: ae,
1803
- actualState: b?.actualState,
1804
- // Controls
1805
- controls: se,
1806
- // Performance metrics
1807
- performanceMetrics: G,
1808
- isTransitioning: s || o,
1809
- // Enhanced features
1810
- actions: b,
1811
- // The optimisticState object contains all the actions
1812
- actionState: b?.state,
1813
- // Optimistic features
1814
- optimisticState: b,
1815
- isEnhanced: g
1816
- };
1817
- }
1818
- const qe = (e, t = {}) => {
1819
- const {
1820
- trackUserBehavior: n = !0,
1821
- adaptToNetwork: s = !0,
1822
- strategy: u = "balanced",
1823
- maxPreloadItems: o = 3,
1824
- preloadRadius: a = 2
1825
- } = t, m = z({
1826
- mouseMovements: 0,
1827
- scrollEvents: 0,
1828
- keyPresses: 0,
1829
- focusEvents: 0,
1830
- timeOnPage: 0,
1831
- engagementScore: 0,
1832
- lastInteraction: Date.now()
1833
- }), S = z(null), F = z(/* @__PURE__ */ new Set()), D = z([]), g = A(() => {
1834
- const l = m.current, T = Math.min(l.timeOnPage / 6e4, 1), E = Math.min(
1835
- (l.mouseMovements + l.scrollEvents + l.keyPresses) / 100,
1836
- 1
1837
- );
1838
- return (T * 0.4 + E * 0.6) * 100;
1839
- }, []), r = A((l, T = 1) => {
1840
- const E = m.current;
1841
- E[l] = typeof E[l] == "number" ? E[l] + T : Date.now(), E.engagementScore = g(), E.lastInteraction = Date.now();
1842
- }, [g]), y = A(() => {
1843
- if (!S.current || !s)
1844
- return { type: "unknown", downlink: 10, effectiveType: "4g", saveData: !1 };
1845
- const l = S.current;
1846
- return {
1847
- type: l.effectiveType || "4g",
1848
- // Use effectiveType as the primary type indicator
1849
- downlink: l.downlink || 10,
1850
- effectiveType: l.effectiveType || "4g",
1851
- saveData: l.saveData || !1,
1852
- rtt: l.rtt || 100
1853
- };
1854
- }, [s]), p = A((l, T, E = 0) => {
1855
- if (F.current.has(l.src))
1856
- return { shouldPreload: !1, priority: "low", reason: "Already preloaded" };
1857
- const w = Math.abs(T - E);
1858
- if (w > a)
1859
- return { shouldPreload: !1, priority: "low", reason: "Outside preload radius" };
1860
- const b = m.current, f = y(), G = b.engagementScore, R = Date.now() - b.lastInteraction;
1861
- if (f.saveData)
1862
- return { shouldPreload: !1, priority: "low", reason: "Data saver mode" };
1863
- let I = !1, P = "medium", M = "";
1864
- switch (u) {
1865
- case "conservative":
1866
- I = G > 70 && f.effectiveType !== "2g" && w === 1, P = I ? "medium" : "low", M = I ? "High engagement and optimal network" : "Conservative strategy";
1867
- break;
1868
- case "aggressive":
1869
- I = G > 30 && f.effectiveType !== "slow-2g", P = G > 70 ? "high" : G > 50 ? "medium" : "low", M = I ? "Aggressive preloading" : "Low engagement";
1870
- break;
1871
- case "balanced":
1872
- default:
1873
- const C = f.effectiveType === "4g" ? 1 : f.effectiveType === "3g" ? 0.7 : 0.3, O = G * C;
1874
- I = O > 40 && w <= 2, P = O > 70 ? "high" : O > 55 ? "medium" : "low", M = I ? `Balanced: score ${O.toFixed(1)}` : "Low adjusted score";
1875
- break;
1876
- }
1877
- if (I) {
1878
- const C = l.src.toLowerCase();
1879
- (C.includes(".m3u8") || C.includes("hls")) && (P = P === "low" ? "medium" : "high"), R < 5e3 && (P = "high", M += " + Recent interaction"), (l.type?.includes("mp4") || l.type?.includes("webm") || C.includes(".mp4") || C.includes(".webm")) && (P = P === "low" ? "medium" : P);
1880
- }
1881
- return { shouldPreload: I, priority: P, reason: M };
1882
- }, [u, a, y, g]), d = A(async (l, T) => {
1883
- try {
1884
- const E = document.createElement("link");
1885
- E.rel = "preload", E.href = l.src;
1886
- const w = l.src.toLowerCase(), b = l.type?.toLowerCase() || "";
1887
- w.includes(".m3u8") || w.includes("hls") ? E.as = "fetch" : b.includes("mp4") || b.includes("webm") || w.includes(".mp4") || w.includes(".webm") ? E.as = "video" : b.includes("mp3") || b.includes("wav") || b.includes("ogg") || w.includes(".mp3") || w.includes(".wav") || w.includes(".ogg") ? E.as = "audio" : E.as = "fetch", E.crossOrigin = "anonymous", document.head.appendChild(E), F.current.add(l.src), console.debug(`Preloaded: ${l.src} (${T})`), setTimeout(() => {
1888
- document.head.contains(E) && document.head.removeChild(E);
1889
- }, 3e4);
1890
- } catch (E) {
1891
- console.warn("Failed to preload source:", l.src, E);
1892
- }
1893
- }, []), v = A(() => {
1894
- if (D.current.length === 0) return;
1895
- const T = [...D.current].sort((E, w) => w.priority - E.priority).slice(0, o);
1896
- D.current = [], T.forEach(({ source: E, priority: w }) => {
1897
- d(E, w);
1898
- });
1899
- }, [o, d]), L = A((l = 0) => {
1900
- D.current = [], e.forEach((T, E) => {
1901
- const w = p(T, E, l);
1902
- if (w.shouldPreload) {
1903
- const b = w.priority === "high" ? 3 : w.priority === "medium" ? 2 : 1;
1904
- D.current.push({ source: T, priority: b });
1905
- }
1906
- }), v();
1907
- }, [e, p, v]);
1908
- return j(() => {
1909
- if (!n) return;
1910
- const l = () => r("mouseMovements"), T = () => r("scrollEvents"), E = () => r("keyPresses"), w = () => r("focusEvents");
1911
- document.addEventListener("mousemove", l, { passive: !0 }), document.addEventListener("scroll", T, { passive: !0 }), document.addEventListener("keydown", E, { passive: !0 }), document.addEventListener("focusin", w, { passive: !0 });
1912
- const b = setInterval(() => {
1913
- r("timeOnPage", 1);
1914
- }, 1e3);
1915
- return () => {
1916
- document.removeEventListener("mousemove", l), document.removeEventListener("scroll", T), document.removeEventListener("keydown", E), document.removeEventListener("focusin", w), clearInterval(b);
1917
- };
1918
- }, [n, r]), j(() => {
1919
- if (!s || !("connection" in navigator)) return;
1920
- const l = navigator.connection;
1921
- S.current = l;
1922
- const T = () => {
1923
- L();
1924
- };
1925
- return l.addEventListener("change", T), () => {
1926
- l.removeEventListener("change", T);
1927
- };
1928
- }, [s, L]), j(() => {
1929
- L();
1930
- }, [L]), ue(() => ({
1931
- /**
1932
- * Manually trigger preloading for specific index
1933
- */
1934
- preloadAtIndex: (l) => {
1935
- L(l);
1936
- },
1937
- /**
1938
- * Get current user behavior data
1939
- */
1940
- getUserBehavior: () => ({ ...m.current }),
1941
- /**
1942
- * Get current network conditions
1943
- */
1944
- getNetworkConditions: y,
1945
- /**
1946
- * Clear preloaded items cache
1947
- */
1948
- clearCache: () => {
1949
- F.current.clear();
1950
- },
1951
- /**
1952
- * Get preloading statistics
1953
- */
1954
- getStats: () => ({
1955
- preloadedItems: F.current.size,
1956
- engagementScore: m.current.engagementScore,
1957
- queueLength: D.current.length,
1958
- maxPreloadItems: o
1959
- })
1960
- }), [L, y, o]);
1961
- };
1962
- function Re(e) {
1963
- const [t, n] = Y(!1), [s, u] = Y([]), [o, a] = Y(""), m = (g) => {
1964
- const r = g.split(":"), y = r[2] ? parseFloat(r[2]) : 0, p = r[1] ? parseInt(r[1], 10) * 60 : 0;
1965
- return (r[0] ? parseInt(r[0], 10) * 3600 : 0) + p + y;
1966
- }, S = async (g) => {
1967
- try {
1968
- const y = await (await fetch(g)).text(), p = [], d = y.split(`
1969
- `);
1970
- let v = 0;
1971
- for (; v < d.length; ) {
1972
- if (d[v]?.includes("-->")) {
1973
- const [L, h] = (d[v] || "").split("-->").map((w) => w.trim()), l = m(L || ""), T = m(h || "");
1974
- v++;
1975
- let E = "";
1976
- for (; v < d.length && d[v]?.trim() !== ""; )
1977
- E += (E ? " " : "") + d[v]?.trim(), v++;
1978
- E && p.push({ start: l, end: T, text: E });
1979
- }
1980
- v++;
1981
- }
1982
- u(p);
1983
- } catch (r) {
1984
- console.error("Failed to load subtitles:", r);
1985
- }
1986
- }, F = (g) => !t || s.length === 0 ? "" : s.find(
1987
- (y) => g >= y.start && g <= y.end
1988
- )?.text || "", D = () => {
1989
- n((g) => {
1990
- const r = !g;
1991
- return r && e && s.length === 0 ? S(e) : r || a(""), r;
1992
- });
1993
- };
1994
- return j(() => {
1995
- t || a("");
1996
- }, [t]), {
1997
- subtitlesEnabled: t,
1998
- currentSubtitle: o,
1999
- toggleSubtitles: D,
2000
- getCurrentSubtitle: F,
2001
- setCurrentSubtitle: a
2002
- };
2003
- }
2004
- function Xe(e) {
2005
- return ve(
2006
- "useVideoPlayer",
2007
- "useMediaPlayer (the primary media player hook)"
2008
- ), Me(e);
2009
- }
2010
- function Ye(e) {
2011
- return ve(
2012
- "useEnhancedSubtitles",
2013
- "useSubtitles (the current subtitle hook)"
2014
- ), Re(e);
2015
- }
2016
- export {
2017
- _e as a,
2018
- Be as b,
2019
- Ne as c,
2020
- Fe as d,
2021
- Ke as e,
2022
- $e as f,
2023
- Ge as g,
2024
- Oe as h,
2025
- Ue as i,
2026
- Ie as j,
2027
- Me as k,
2028
- be as l,
2029
- We as m,
2030
- je as n,
2031
- ze as o,
2032
- De as p,
2033
- qe as q,
2034
- Pe as r,
2035
- Re as s,
2036
- Xe as t,
2037
- de as u,
2038
- Ye as v,
2039
- Ve as w,
2040
- He as x
2041
- };
2042
- //# sourceMappingURL=hooks-BPtHV1ZT.js.map