@livepeer-frameworks/player-core 0.1.0 → 0.1.2

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 (294) hide show
  1. package/README.md +11 -9
  2. package/dist/cjs/core/ABRController.js +456 -0
  3. package/dist/cjs/core/ABRController.js.map +1 -0
  4. package/dist/cjs/core/CodecUtils.js +195 -0
  5. package/dist/cjs/core/CodecUtils.js.map +1 -0
  6. package/dist/cjs/core/ErrorClassifier.js +410 -0
  7. package/dist/cjs/core/ErrorClassifier.js.map +1 -0
  8. package/dist/cjs/core/EventEmitter.js +108 -0
  9. package/dist/cjs/core/EventEmitter.js.map +1 -0
  10. package/dist/cjs/core/GatewayClient.js +342 -0
  11. package/dist/cjs/core/GatewayClient.js.map +1 -0
  12. package/dist/cjs/core/InteractionController.js +606 -0
  13. package/dist/cjs/core/InteractionController.js.map +1 -0
  14. package/dist/cjs/core/LiveDurationProxy.js +186 -0
  15. package/dist/cjs/core/LiveDurationProxy.js.map +1 -0
  16. package/dist/cjs/core/MetaTrackManager.js +624 -0
  17. package/dist/cjs/core/MetaTrackManager.js.map +1 -0
  18. package/dist/cjs/core/MistReporter.js +449 -0
  19. package/dist/cjs/core/MistReporter.js.map +1 -0
  20. package/dist/cjs/core/MistSignaling.js +264 -0
  21. package/dist/cjs/core/MistSignaling.js.map +1 -0
  22. package/dist/cjs/core/PlayerController.js +2658 -0
  23. package/dist/cjs/core/PlayerController.js.map +1 -0
  24. package/dist/cjs/core/PlayerInterface.js +269 -0
  25. package/dist/cjs/core/PlayerInterface.js.map +1 -0
  26. package/dist/cjs/core/PlayerManager.js +806 -0
  27. package/dist/cjs/core/PlayerManager.js.map +1 -0
  28. package/dist/cjs/core/PlayerRegistry.js +270 -0
  29. package/dist/cjs/core/PlayerRegistry.js.map +1 -0
  30. package/dist/cjs/core/QualityMonitor.js +474 -0
  31. package/dist/cjs/core/QualityMonitor.js.map +1 -0
  32. package/dist/cjs/core/SeekingUtils.js +292 -0
  33. package/dist/cjs/core/SeekingUtils.js.map +1 -0
  34. package/dist/cjs/core/StreamStateClient.js +381 -0
  35. package/dist/cjs/core/StreamStateClient.js.map +1 -0
  36. package/dist/cjs/core/SubtitleManager.js +227 -0
  37. package/dist/cjs/core/SubtitleManager.js.map +1 -0
  38. package/dist/cjs/core/TelemetryReporter.js +258 -0
  39. package/dist/cjs/core/TelemetryReporter.js.map +1 -0
  40. package/dist/cjs/core/TimeFormat.js +176 -0
  41. package/dist/cjs/core/TimeFormat.js.map +1 -0
  42. package/dist/cjs/core/TimerManager.js +176 -0
  43. package/dist/cjs/core/TimerManager.js.map +1 -0
  44. package/dist/cjs/core/UrlUtils.js +160 -0
  45. package/dist/cjs/core/UrlUtils.js.map +1 -0
  46. package/dist/cjs/core/detector.js +293 -0
  47. package/dist/cjs/core/detector.js.map +1 -0
  48. package/dist/cjs/core/scorer.js +443 -0
  49. package/dist/cjs/core/scorer.js.map +1 -0
  50. package/dist/cjs/index.js +121 -20134
  51. package/dist/cjs/index.js.map +1 -1
  52. package/dist/cjs/lib/utils.js +11 -0
  53. package/dist/cjs/lib/utils.js.map +1 -0
  54. package/dist/cjs/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js +6 -0
  55. package/dist/cjs/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
  56. package/dist/cjs/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js +3042 -0
  57. package/dist/cjs/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  58. package/dist/cjs/players/DashJsPlayer.js +638 -0
  59. package/dist/cjs/players/DashJsPlayer.js.map +1 -0
  60. package/dist/cjs/players/HlsJsPlayer.js +482 -0
  61. package/dist/cjs/players/HlsJsPlayer.js.map +1 -0
  62. package/dist/cjs/players/MewsWsPlayer/SourceBufferManager.js +522 -0
  63. package/dist/cjs/players/MewsWsPlayer/SourceBufferManager.js.map +1 -0
  64. package/dist/cjs/players/MewsWsPlayer/WebSocketManager.js +215 -0
  65. package/dist/cjs/players/MewsWsPlayer/WebSocketManager.js.map +1 -0
  66. package/dist/cjs/players/MewsWsPlayer/index.js +987 -0
  67. package/dist/cjs/players/MewsWsPlayer/index.js.map +1 -0
  68. package/dist/cjs/players/MistPlayer.js +185 -0
  69. package/dist/cjs/players/MistPlayer.js.map +1 -0
  70. package/dist/cjs/players/MistWebRTCPlayer/index.js +635 -0
  71. package/dist/cjs/players/MistWebRTCPlayer/index.js.map +1 -0
  72. package/dist/cjs/players/NativePlayer.js +762 -0
  73. package/dist/cjs/players/NativePlayer.js.map +1 -0
  74. package/dist/cjs/players/VideoJsPlayer.js +585 -0
  75. package/dist/cjs/players/VideoJsPlayer.js.map +1 -0
  76. package/dist/cjs/players/WebCodecsPlayer/JitterBuffer.js +236 -0
  77. package/dist/cjs/players/WebCodecsPlayer/JitterBuffer.js.map +1 -0
  78. package/dist/cjs/players/WebCodecsPlayer/LatencyProfiles.js +143 -0
  79. package/dist/cjs/players/WebCodecsPlayer/LatencyProfiles.js.map +1 -0
  80. package/dist/cjs/players/WebCodecsPlayer/RawChunkParser.js +96 -0
  81. package/dist/cjs/players/WebCodecsPlayer/RawChunkParser.js.map +1 -0
  82. package/dist/cjs/players/WebCodecsPlayer/SyncController.js +359 -0
  83. package/dist/cjs/players/WebCodecsPlayer/SyncController.js.map +1 -0
  84. package/dist/cjs/players/WebCodecsPlayer/WebSocketController.js +460 -0
  85. package/dist/cjs/players/WebCodecsPlayer/WebSocketController.js.map +1 -0
  86. package/dist/cjs/players/WebCodecsPlayer/index.js +1467 -0
  87. package/dist/cjs/players/WebCodecsPlayer/index.js.map +1 -0
  88. package/dist/cjs/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js +320 -0
  89. package/dist/cjs/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js.map +1 -0
  90. package/dist/cjs/styles/index.js +57 -0
  91. package/dist/cjs/styles/index.js.map +1 -0
  92. package/dist/cjs/vanilla/FrameWorksPlayer.js +269 -0
  93. package/dist/cjs/vanilla/FrameWorksPlayer.js.map +1 -0
  94. package/dist/cjs/vanilla.js +11 -0
  95. package/dist/cjs/vanilla.js.map +1 -0
  96. package/dist/esm/core/ABRController.js +454 -0
  97. package/dist/esm/core/ABRController.js.map +1 -0
  98. package/dist/esm/core/CodecUtils.js +193 -0
  99. package/dist/esm/core/CodecUtils.js.map +1 -0
  100. package/dist/esm/core/ErrorClassifier.js +408 -0
  101. package/dist/esm/core/ErrorClassifier.js.map +1 -0
  102. package/dist/esm/core/EventEmitter.js +106 -0
  103. package/dist/esm/core/EventEmitter.js.map +1 -0
  104. package/dist/esm/core/GatewayClient.js +340 -0
  105. package/dist/esm/core/GatewayClient.js.map +1 -0
  106. package/dist/esm/core/InteractionController.js +604 -0
  107. package/dist/esm/core/InteractionController.js.map +1 -0
  108. package/dist/esm/core/LiveDurationProxy.js +184 -0
  109. package/dist/esm/core/LiveDurationProxy.js.map +1 -0
  110. package/dist/esm/core/MetaTrackManager.js +622 -0
  111. package/dist/esm/core/MetaTrackManager.js.map +1 -0
  112. package/dist/esm/core/MistReporter.js +447 -0
  113. package/dist/esm/core/MistReporter.js.map +1 -0
  114. package/dist/esm/core/MistSignaling.js +262 -0
  115. package/dist/esm/core/MistSignaling.js.map +1 -0
  116. package/dist/esm/core/PlayerController.js +2651 -0
  117. package/dist/esm/core/PlayerController.js.map +1 -0
  118. package/dist/esm/core/PlayerInterface.js +267 -0
  119. package/dist/esm/core/PlayerInterface.js.map +1 -0
  120. package/dist/esm/core/PlayerManager.js +804 -0
  121. package/dist/esm/core/PlayerManager.js.map +1 -0
  122. package/dist/esm/core/PlayerRegistry.js +264 -0
  123. package/dist/esm/core/PlayerRegistry.js.map +1 -0
  124. package/dist/esm/core/QualityMonitor.js +471 -0
  125. package/dist/esm/core/QualityMonitor.js.map +1 -0
  126. package/dist/esm/core/SeekingUtils.js +280 -0
  127. package/dist/esm/core/SeekingUtils.js.map +1 -0
  128. package/dist/esm/core/StreamStateClient.js +379 -0
  129. package/dist/esm/core/StreamStateClient.js.map +1 -0
  130. package/dist/esm/core/SubtitleManager.js +225 -0
  131. package/dist/esm/core/SubtitleManager.js.map +1 -0
  132. package/dist/esm/core/TelemetryReporter.js +256 -0
  133. package/dist/esm/core/TelemetryReporter.js.map +1 -0
  134. package/dist/esm/core/TimeFormat.js +169 -0
  135. package/dist/esm/core/TimeFormat.js.map +1 -0
  136. package/dist/esm/core/TimerManager.js +174 -0
  137. package/dist/esm/core/TimerManager.js.map +1 -0
  138. package/dist/esm/core/UrlUtils.js +151 -0
  139. package/dist/esm/core/UrlUtils.js.map +1 -0
  140. package/dist/esm/core/detector.js +279 -0
  141. package/dist/esm/core/detector.js.map +1 -0
  142. package/dist/esm/core/scorer.js +422 -0
  143. package/dist/esm/core/scorer.js.map +1 -0
  144. package/dist/esm/index.js +26 -20043
  145. package/dist/esm/index.js.map +1 -1
  146. package/dist/esm/lib/utils.js +9 -0
  147. package/dist/esm/lib/utils.js.map +1 -0
  148. package/dist/esm/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js +4 -0
  149. package/dist/esm/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
  150. package/dist/esm/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js +3036 -0
  151. package/dist/esm/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  152. package/dist/esm/players/DashJsPlayer.js +636 -0
  153. package/dist/esm/players/DashJsPlayer.js.map +1 -0
  154. package/dist/esm/players/HlsJsPlayer.js +480 -0
  155. package/dist/esm/players/HlsJsPlayer.js.map +1 -0
  156. package/dist/esm/players/MewsWsPlayer/SourceBufferManager.js +520 -0
  157. package/dist/esm/players/MewsWsPlayer/SourceBufferManager.js.map +1 -0
  158. package/dist/esm/players/MewsWsPlayer/WebSocketManager.js +213 -0
  159. package/dist/esm/players/MewsWsPlayer/WebSocketManager.js.map +1 -0
  160. package/dist/esm/players/MewsWsPlayer/index.js +985 -0
  161. package/dist/esm/players/MewsWsPlayer/index.js.map +1 -0
  162. package/dist/esm/players/MistPlayer.js +183 -0
  163. package/dist/esm/players/MistPlayer.js.map +1 -0
  164. package/dist/esm/players/MistWebRTCPlayer/index.js +633 -0
  165. package/dist/esm/players/MistWebRTCPlayer/index.js.map +1 -0
  166. package/dist/esm/players/NativePlayer.js +759 -0
  167. package/dist/esm/players/NativePlayer.js.map +1 -0
  168. package/dist/esm/players/VideoJsPlayer.js +583 -0
  169. package/dist/esm/players/VideoJsPlayer.js.map +1 -0
  170. package/dist/esm/players/WebCodecsPlayer/JitterBuffer.js +233 -0
  171. package/dist/esm/players/WebCodecsPlayer/JitterBuffer.js.map +1 -0
  172. package/dist/esm/players/WebCodecsPlayer/LatencyProfiles.js +134 -0
  173. package/dist/esm/players/WebCodecsPlayer/LatencyProfiles.js.map +1 -0
  174. package/dist/esm/players/WebCodecsPlayer/RawChunkParser.js +91 -0
  175. package/dist/esm/players/WebCodecsPlayer/RawChunkParser.js.map +1 -0
  176. package/dist/esm/players/WebCodecsPlayer/SyncController.js +357 -0
  177. package/dist/esm/players/WebCodecsPlayer/SyncController.js.map +1 -0
  178. package/dist/esm/players/WebCodecsPlayer/WebSocketController.js +458 -0
  179. package/dist/esm/players/WebCodecsPlayer/WebSocketController.js.map +1 -0
  180. package/dist/esm/players/WebCodecsPlayer/index.js +1458 -0
  181. package/dist/esm/players/WebCodecsPlayer/index.js.map +1 -0
  182. package/dist/esm/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js +315 -0
  183. package/dist/esm/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js.map +1 -0
  184. package/dist/esm/styles/index.js +54 -0
  185. package/dist/esm/styles/index.js.map +1 -0
  186. package/dist/esm/vanilla/FrameWorksPlayer.js +264 -0
  187. package/dist/esm/vanilla/FrameWorksPlayer.js.map +1 -0
  188. package/dist/esm/vanilla.js +2 -0
  189. package/dist/esm/vanilla.js.map +1 -0
  190. package/dist/player.css +185 -42
  191. package/dist/types/core/ABRController.d.ts +4 -4
  192. package/dist/types/core/CodecUtils.d.ts +1 -1
  193. package/dist/types/core/ErrorClassifier.d.ts +77 -0
  194. package/dist/types/core/GatewayClient.d.ts +4 -4
  195. package/dist/types/core/MetaTrackManager.d.ts +2 -2
  196. package/dist/types/core/MistReporter.d.ts +3 -3
  197. package/dist/types/core/MistSignaling.d.ts +12 -12
  198. package/dist/types/core/PlayerController.d.ts +19 -14
  199. package/dist/types/core/PlayerInterface.d.ts +100 -2
  200. package/dist/types/core/PlayerManager.d.ts +36 -9
  201. package/dist/types/core/PlayerRegistry.d.ts +11 -11
  202. package/dist/types/core/QualityMonitor.d.ts +2 -2
  203. package/dist/types/core/SeekingUtils.d.ts +2 -2
  204. package/dist/types/core/StreamStateClient.d.ts +2 -2
  205. package/dist/types/core/TelemetryReporter.d.ts +1 -1
  206. package/dist/types/core/TimerManager.d.ts +1 -1
  207. package/dist/types/core/detector.d.ts +1 -1
  208. package/dist/types/core/index.d.ts +44 -44
  209. package/dist/types/core/scorer.d.ts +1 -1
  210. package/dist/types/core/selector.d.ts +2 -2
  211. package/dist/types/index.d.ts +35 -34
  212. package/dist/types/players/DashJsPlayer.d.ts +3 -3
  213. package/dist/types/players/HlsJsPlayer.d.ts +3 -3
  214. package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +1 -1
  215. package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +1 -1
  216. package/dist/types/players/MewsWsPlayer/index.d.ts +2 -2
  217. package/dist/types/players/MewsWsPlayer/types.d.ts +15 -15
  218. package/dist/types/players/MistPlayer.d.ts +2 -2
  219. package/dist/types/players/MistWebRTCPlayer/index.d.ts +3 -3
  220. package/dist/types/players/NativePlayer.d.ts +3 -3
  221. package/dist/types/players/VideoJsPlayer.d.ts +3 -3
  222. package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +3 -3
  223. package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +1 -1
  224. package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +2 -2
  225. package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +2 -2
  226. package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +3 -3
  227. package/dist/types/players/WebCodecsPlayer/index.d.ts +9 -9
  228. package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +1 -1
  229. package/dist/types/players/WebCodecsPlayer/types.d.ts +49 -49
  230. package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +31 -31
  231. package/dist/types/players/index.d.ts +5 -8
  232. package/dist/types/types.d.ts +15 -15
  233. package/dist/types/vanilla/FrameWorksPlayer.d.ts +2 -2
  234. package/dist/types/vanilla/index.d.ts +4 -4
  235. package/dist/workers/decoder.worker.js +129 -122
  236. package/dist/workers/decoder.worker.js.map +1 -1
  237. package/package.json +31 -15
  238. package/src/core/ABRController.ts +38 -36
  239. package/src/core/CodecUtils.ts +49 -46
  240. package/src/core/Disposable.ts +4 -4
  241. package/src/core/ErrorClassifier.ts +499 -0
  242. package/src/core/EventEmitter.ts +1 -1
  243. package/src/core/GatewayClient.ts +41 -39
  244. package/src/core/InteractionController.ts +89 -82
  245. package/src/core/LiveDurationProxy.ts +14 -15
  246. package/src/core/MetaTrackManager.ts +73 -65
  247. package/src/core/MistReporter.ts +72 -45
  248. package/src/core/MistSignaling.ts +59 -56
  249. package/src/core/PlayerController.ts +542 -384
  250. package/src/core/PlayerInterface.ts +192 -59
  251. package/src/core/PlayerManager.ts +354 -164
  252. package/src/core/PlayerRegistry.ts +238 -87
  253. package/src/core/QualityMonitor.ts +38 -31
  254. package/src/core/ScreenWakeLockManager.ts +8 -9
  255. package/src/core/SeekingUtils.ts +31 -22
  256. package/src/core/StreamStateClient.ts +74 -68
  257. package/src/core/SubtitleManager.ts +24 -22
  258. package/src/core/TelemetryReporter.ts +38 -32
  259. package/src/core/TimeFormat.ts +13 -17
  260. package/src/core/TimerManager.ts +24 -8
  261. package/src/core/UrlUtils.ts +20 -17
  262. package/src/core/detector.ts +44 -44
  263. package/src/core/index.ts +57 -48
  264. package/src/core/scorer.ts +136 -141
  265. package/src/core/selector.ts +2 -6
  266. package/src/global.d.ts +1 -1
  267. package/src/index.ts +56 -36
  268. package/src/players/DashJsPlayer.ts +164 -115
  269. package/src/players/HlsJsPlayer.ts +132 -78
  270. package/src/players/MewsWsPlayer/SourceBufferManager.ts +41 -36
  271. package/src/players/MewsWsPlayer/WebSocketManager.ts +9 -9
  272. package/src/players/MewsWsPlayer/index.ts +192 -152
  273. package/src/players/MewsWsPlayer/types.ts +21 -21
  274. package/src/players/MistPlayer.ts +45 -26
  275. package/src/players/MistWebRTCPlayer/index.ts +175 -129
  276. package/src/players/NativePlayer.ts +203 -143
  277. package/src/players/VideoJsPlayer.ts +170 -118
  278. package/src/players/WebCodecsPlayer/JitterBuffer.ts +6 -7
  279. package/src/players/WebCodecsPlayer/LatencyProfiles.ts +43 -43
  280. package/src/players/WebCodecsPlayer/RawChunkParser.ts +10 -10
  281. package/src/players/WebCodecsPlayer/SyncController.ts +45 -53
  282. package/src/players/WebCodecsPlayer/WebSocketController.ts +66 -68
  283. package/src/players/WebCodecsPlayer/index.ts +265 -223
  284. package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +12 -17
  285. package/src/players/WebCodecsPlayer/types.ts +56 -56
  286. package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +238 -182
  287. package/src/players/WebCodecsPlayer/worker/types.ts +31 -31
  288. package/src/players/index.ts +5 -16
  289. package/src/styles/animations.css +2 -1
  290. package/src/styles/player.css +185 -42
  291. package/src/styles/tailwind.css +473 -159
  292. package/src/types.ts +43 -43
  293. package/src/vanilla/FrameWorksPlayer.ts +26 -14
  294. package/src/vanilla/index.ts +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashJsPlayer.js","sources":["../../../../src/players/DashJsPlayer.ts"],"sourcesContent":["import { BasePlayer } from \"../core/PlayerInterface\";\nimport { checkProtocolMismatch, getBrowserInfo, isFileProtocol } from \"../core/detector\";\nimport { translateCodec } from \"../core/CodecUtils\";\nimport type {\n StreamSource,\n StreamInfo,\n PlayerOptions,\n PlayerCapability,\n} from \"../core/PlayerInterface\";\n\n// Player implementation class\nexport class DashJsPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"Dash.js Player\",\n shortname: \"dashjs\",\n priority: 100, // Below legacy (99) - DASH support is experimental\n mimes: [\"dash/video/mp4\"],\n };\n\n private dashPlayer: any = null;\n private container: HTMLElement | null = null;\n private destroyed = false;\n private debugging = false;\n\n // Live duration proxy state (ported from reference dashjs.js:81-122)\n private lastProgress = Date.now();\n private videoProxy: HTMLVideoElement | null = null;\n private streamType: \"live\" | \"vod\" | \"unknown\" = \"unknown\";\n\n // Subtitle deferred loading (ported from reference dashjs.js:173-197)\n private subsLoaded = false;\n private pendingSubtitleId: string | null = null;\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(\n mimetype: string,\n source: StreamSource,\n streamInfo: StreamInfo\n ): boolean | string[] {\n // Check protocol mismatch\n if (checkProtocolMismatch(source.url)) {\n return false;\n }\n\n // Don't use DASH.js if loaded via file://\n if (isFileProtocol()) {\n return false;\n }\n\n const browser = getBrowserInfo();\n\n // Check MediaSource support (required for DASH.js)\n if (!browser.supportsMediaSource) {\n return false;\n }\n\n // Check codec compatibility\n const playableTracks: string[] = [];\n const tracksByType: Record<string, typeof streamInfo.meta.tracks> = {};\n\n // Group tracks by type\n for (const track of streamInfo.meta.tracks) {\n if (track.type === \"meta\") {\n if (track.codec === \"subtitle\") {\n // Check for WebVTT subtitle support\n for (const src of streamInfo.source) {\n if (src.type === \"html5/text/vtt\") {\n playableTracks.push(\"subtitle\");\n break;\n }\n }\n }\n continue;\n }\n\n if (!tracksByType[track.type]) {\n tracksByType[track.type] = [];\n }\n tracksByType[track.type].push(track);\n }\n\n // DASH-incompatible audio codecs for fMP4 segments (even if browser MSE supports them)\n // Standard DASH audio: AAC, MP3, AC-3/E-AC-3. OPUS only works in WebM DASH (not fMP4)\n const DASH_INCOMPATIBLE_AUDIO = [\"OPUS\", \"Opus\", \"opus\", \"VORBIS\", \"Vorbis\"];\n\n // Test codec support for video/audio tracks\n for (const [trackType, tracks] of Object.entries(tracksByType)) {\n let hasPlayableTrack = false;\n\n for (const track of tracks) {\n // Explicit DASH codec filtering - OPUS in fMP4 DASH doesn't work reliably\n if (trackType === \"audio\" && DASH_INCOMPATIBLE_AUDIO.includes(track.codec)) {\n console.debug(`[DashJS] Codec incompatible with DASH fMP4: ${track.codec}`);\n continue;\n }\n\n const codecString = translateCodec(track);\n // Use correct container type for audio vs video tracks\n const container = trackType === \"audio\" ? \"audio/mp4\" : \"video/mp4\";\n const mimeType = `${container};codecs=\"${codecString}\"`;\n\n if (MediaSource.isTypeSupported && MediaSource.isTypeSupported(mimeType)) {\n hasPlayableTrack = true;\n break;\n } else {\n console.debug(`[DashJS] Codec not supported: ${mimeType}`);\n }\n }\n\n if (hasPlayableTrack) {\n playableTracks.push(trackType);\n }\n }\n\n return playableTracks.length > 0 ? playableTracks : false;\n }\n\n /**\n * Check if current stream is live.\n * Ported from reference dashjs.js live detection.\n */\n private isLiveStream(): boolean {\n if (this.streamType === \"live\") return true;\n if (this.streamType === \"vod\") return false;\n // Fallback: check video duration\n const v = this.videoElement;\n if (v && (v.duration === Infinity || !isFinite(v.duration))) {\n return true;\n }\n return false;\n }\n\n /**\n * Create a Proxy wrapper for the video element that intercepts duration for live streams.\n * Ported from reference dashjs.js:81-122.\n *\n * For live streams, returns synthetic duration = buffer_end + time_since_last_progress\n * This makes the seek bar usable for live content.\n */\n private createVideoProxy(video: HTMLVideoElement): HTMLVideoElement {\n if (!(\"Proxy\" in window)) {\n // Fallback for older browsers\n return video;\n }\n\n // Track buffer progress for duration extrapolation\n video.addEventListener(\"progress\", () => {\n this.lastProgress = Date.now();\n });\n\n const self = this;\n return new Proxy(video, {\n get(target, key, receiver) {\n // Override duration for live streams (reference dashjs.js:108-116)\n if (key === \"duration\" && self.isLiveStream()) {\n const buffered = target.buffered;\n if (buffered.length > 0) {\n const bufferEnd = buffered.end(buffered.length - 1);\n const timeSinceBuffer = (Date.now() - self.lastProgress) / 1000;\n return bufferEnd + timeSinceBuffer;\n }\n }\n const value = Reflect.get(target, key, receiver);\n // Bind functions to the original target\n if (typeof value === \"function\") {\n return value.bind(target);\n }\n return value;\n },\n set(target, key, value) {\n return Reflect.set(target, key, value);\n },\n }) as HTMLVideoElement;\n }\n\n /**\n * Set up comprehensive event logging.\n * Ported from reference dashjs.js:152-160.\n */\n private setupEventLogging(dashjs: any): void {\n const skipEvents = [\n \"METRIC_ADDED\",\n \"METRIC_UPDATED\",\n \"METRIC_CHANGED\",\n \"METRICS_CHANGED\",\n \"FRAGMENT_LOADING_STARTED\",\n \"FRAGMENT_LOADING_COMPLETED\",\n \"LOG\",\n \"PLAYBACK_TIME_UPDATED\",\n \"PLAYBACK_PROGRESS\",\n ];\n\n const events = dashjs.MediaPlayer?.events || {};\n for (const eventKey of Object.keys(events)) {\n if (!skipEvents.includes(eventKey)) {\n this.dashPlayer.on(events[eventKey], (e: any) => {\n if (this.destroyed) return;\n if (this.debugging) {\n console.log(\"DASH event:\", e.type);\n }\n });\n }\n }\n }\n\n /**\n * Set up subtitle deferred loading.\n * Ported from reference dashjs.js:173-197.\n */\n private setupSubtitleHandling(): void {\n this.dashPlayer.on(\"allTextTracksAdded\", () => {\n if (this.destroyed) return;\n this.subsLoaded = true;\n if (this.pendingSubtitleId !== null) {\n this.selectTextTrack(this.pendingSubtitleId);\n this.pendingSubtitleId = null;\n }\n });\n }\n\n /**\n * Set up stalled indicator handling.\n * Ported from reference dashjs.js:207-211.\n */\n private setupStalledHandling(): void {\n this.videoElement?.addEventListener(\"progress\", () => {\n // Clear any stalled state when buffer advances\n // This integrates with the loading indicator system\n });\n }\n\n async initialize(\n container: HTMLElement,\n source: StreamSource,\n options: PlayerOptions\n ): Promise<HTMLVideoElement> {\n this.destroyed = false;\n this.container = container;\n this.subsLoaded = false;\n this.pendingSubtitleId = null;\n container.classList.add(\"fw-player-container\");\n\n // Detect stream type from source if available (reference dashjs.js live detection)\n const sourceType = (source as any).type;\n if (sourceType === \"live\") {\n this.streamType = \"live\";\n } else if (sourceType === \"vod\") {\n this.streamType = \"vod\";\n } else {\n this.streamType = \"unknown\";\n }\n\n // Create video element\n const video = document.createElement(\"video\");\n video.classList.add(\"fw-player-video\");\n video.setAttribute(\"playsinline\", \"\");\n video.setAttribute(\"crossorigin\", \"anonymous\");\n\n // Apply options (ported from reference dashjs.js:129-142)\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true;\n // Loop only for VoD (reference dashjs.js: live streams don't loop)\n if (options.loop && this.streamType !== \"live\") video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n // Create proxy for live duration handling (reference dashjs.js:81-122)\n this.videoProxy = this.createVideoProxy(video);\n this.videoElement = video;\n container.appendChild(video);\n\n // Set up event listeners\n this.setupVideoEventListeners(video, options);\n this.setupStalledHandling();\n\n try {\n // Dynamic import of DASH.js\n console.debug(\"[DashJS] Importing dashjs module...\");\n const mod = await import(\"dashjs\");\n const dashjs = (mod as any).default || (mod as any);\n console.debug(\"[DashJS] Module imported:\", dashjs);\n\n this.dashPlayer = dashjs.MediaPlayer().create();\n console.debug(\"[DashJS] MediaPlayer created\");\n\n // Set up event logging (reference dashjs.js:152-160)\n this.setupEventLogging(dashjs);\n\n // Set up subtitle handling (reference dashjs.js:173-197)\n this.setupSubtitleHandling();\n\n this.dashPlayer.on(\"error\", (e: any) => {\n if (this.destroyed) return;\n const error = `DASH error: ${e?.event?.message || e?.message || \"unknown\"}`;\n console.error(\"[DashJS] Error event:\", e);\n this.emit(\"error\", error);\n });\n\n // Log key dashjs events for debugging\n this.dashPlayer.on(\"manifestLoaded\", (e: any) => {\n console.debug(\"[DashJS] manifestLoaded:\", e);\n });\n this.dashPlayer.on(\"canPlay\", () => {\n console.debug(\"[DashJS] canPlay event\");\n });\n\n // Log stream initialization for debugging\n this.dashPlayer.on(\"streamInitialized\", () => {\n if (this.destroyed) return;\n const isDynamic = this.dashPlayer.isDynamic?.() ?? false;\n console.debug(\"[DashJS v5] streamInitialized - isDynamic:\", isDynamic);\n });\n\n // Configure dashjs v5 streaming settings BEFORE initialization\n // AGGRESSIVE settings for fastest startup and low latency\n this.dashPlayer.updateSettings({\n streaming: {\n // AGGRESSIVE: Minimal buffers for fastest startup\n buffer: {\n fastSwitchEnabled: true,\n stableBufferTime: 4, // Reduced from 16 (aggressive!)\n bufferTimeAtTopQuality: 8, // Reduced from 30\n bufferTimeAtTopQualityLongForm: 15, // Reduced from 60\n bufferToKeep: 10, // Reduced from 30\n bufferPruningInterval: 10, // Reduced from 30\n },\n // Gaps/stall handling\n gaps: {\n jumpGaps: true,\n jumpLargeGaps: true,\n smallGapLimit: 1.5,\n threshold: 0.3,\n },\n // AGGRESSIVE: ABR with high initial bitrate estimate\n abr: {\n autoSwitchBitrate: { video: true, audio: true },\n limitBitrateByPortal: false,\n useDefaultABRRules: true,\n initialBitrate: { video: 5_000_000, audio: 128_000 }, // 5Mbps initial (was -1)\n },\n // LIVE CATCHUP - critical for maintaining live edge (was missing!)\n liveCatchup: {\n enabled: true,\n maxDrift: 1.5, // Seek to live if drift > 1.5s\n playbackRate: {\n max: 0.15, // Speed up by max 15%\n min: -0.15, // Slow down by max 15%\n },\n playbackBufferMin: 0.3, // Min buffer before catchup\n mode: \"liveCatchupModeDefault\",\n },\n // Retry settings - more aggressive\n retryAttempts: {\n MPD: 5,\n MediaSegment: 5,\n InitializationSegment: 5,\n BitstreamSwitchingSegment: 5,\n IndexSegment: 5,\n XLinkExpansion: 3,\n other: 3,\n },\n retryIntervals: {\n MPD: 1000,\n MediaSegment: 1000,\n InitializationSegment: 1000,\n BitstreamSwitchingSegment: 1000,\n IndexSegment: 1000,\n XLinkExpansion: 1000,\n other: 1000,\n },\n // Timeout settings - faster abandonment of slow segments\n timeoutAttempts: {\n MPD: 2,\n MediaSegment: 2, // Abandon after 2 timeout attempts\n InitializationSegment: 2,\n BitstreamSwitchingSegment: 2,\n IndexSegment: 2,\n XLinkExpansion: 1,\n other: 1,\n },\n // Abandon slow segment downloads more quickly\n abandonLoadTimeout: 5000, // 5 seconds instead of default 10\n xhrWithCredentials: false,\n text: { defaultEnabled: false },\n // AGGRESSIVE: Tighter live delay\n delay: {\n liveDelay: 2, // Reduced from 4 (2s behind live edge)\n liveDelayFragmentCount: null,\n useSuggestedPresentationDelay: false, // Ignore manifest suggestions\n },\n },\n debug: {\n logLevel: 4, // Always debug for now to see what's happening\n },\n });\n\n // Add fragment loading event listeners to debug the pending issue\n this.dashPlayer.on(\"fragmentLoadingStarted\", (e: any) => {\n console.debug(\"[DashJS] Fragment loading started:\", e.request?.url?.split(\"/\").pop());\n });\n this.dashPlayer.on(\"fragmentLoadingCompleted\", (e: any) => {\n console.debug(\"[DashJS] Fragment loading completed:\", e.request?.url?.split(\"/\").pop());\n });\n this.dashPlayer.on(\"fragmentLoadingAbandoned\", (e: any) => {\n console.warn(\"[DashJS] Fragment loading ABANDONED:\", e.request?.url?.split(\"/\").pop(), e);\n });\n this.dashPlayer.on(\"fragmentLoadingFailed\", (e: any) => {\n console.error(\"[DashJS] Fragment loading FAILED:\", e.request?.url?.split(\"/\").pop(), e);\n });\n\n // dashjs v5: Initialize with URL\n console.debug(\"[DashJS v5] Initializing with URL:\", source.url);\n this.dashPlayer.initialize(video, source.url, options.autoplay ?? false);\n console.debug(\"[DashJS v5] Initialize called\");\n\n // Optional subtitle tracks helper from source extras (external tracks)\n try {\n const subs = (source as any).subtitles as Array<{\n label: string;\n lang: string;\n src: string;\n }>;\n if (Array.isArray(subs)) {\n subs.forEach((s, idx) => {\n const track = document.createElement(\"track\");\n track.kind = \"subtitles\";\n track.label = s.label;\n track.srclang = s.lang;\n track.src = s.src;\n if (idx === 0) track.default = true;\n video.appendChild(track);\n });\n }\n } catch {}\n\n return video;\n } catch (error: any) {\n this.emit(\"error\", error.message || String(error));\n throw error;\n }\n }\n\n /**\n * Get DASH.js-specific stats for ABR and playback monitoring\n * Updated for dashjs v5 API\n */\n async getStats(): Promise<\n | {\n type: \"dash\";\n currentQuality: number;\n bufferLevel: number;\n bitrateInfoList: Array<{ bitrate: number; width: number; height: number }>;\n currentBitrate: number;\n playbackRate: number;\n }\n | undefined\n > {\n if (!this.dashPlayer || !this.videoElement) return undefined;\n\n try {\n // dashjs v5: getCurrentRepresentationForType returns Representation object\n const currentRep = this.dashPlayer.getCurrentRepresentationForType?.(\"video\");\n // dashjs v5: getRepresentationsByType returns Representation[] (bandwidth instead of bitrate)\n const representations = this.dashPlayer.getRepresentationsByType?.(\"video\") || [];\n const bufferLevel = this.dashPlayer.getBufferLength(\"video\") || 0;\n\n // Find current quality index\n const currentIndex = currentRep\n ? representations.findIndex((r: any) => r.id === currentRep.id)\n : 0;\n\n return {\n type: \"dash\",\n currentQuality: currentIndex >= 0 ? currentIndex : 0,\n bufferLevel,\n bitrateInfoList: representations.map((r: any) => ({\n bitrate: r.bandwidth || 0, // v5 uses 'bandwidth' not 'bitrate'\n width: r.width || 0,\n height: r.height || 0,\n })),\n currentBitrate: currentRep?.bandwidth || 0,\n playbackRate: this.videoElement.playbackRate,\n };\n } catch {\n return undefined;\n }\n }\n\n /**\n * Set playback rate\n */\n setPlaybackRate(rate: number): void {\n if (this.videoElement) {\n this.videoElement.playbackRate = rate;\n }\n }\n\n /**\n * Set source URL for seamless source switching.\n * Ported from reference dashjs.js:166-168.\n */\n setSource(url: string): void {\n if (this.dashPlayer) {\n this.dashPlayer.attachSource(url);\n }\n }\n\n /**\n * Get duration using proxy for live streams.\n * Returns synthetic growing duration for live content.\n */\n getDuration(): number {\n // Use proxy if available for live duration handling\n if (this.videoProxy && this.isLiveStream()) {\n return (this.videoProxy as any).duration ?? 0;\n }\n return this.videoElement?.duration ?? 0;\n }\n\n /**\n * Jump to live edge for live streams.\n * Uses DASH.js seekToLive API when available.\n */\n jumpToLive(): void {\n const video = this.videoElement;\n if (!video || !this.isLiveStream()) return;\n\n // DASH.js has a seekToLive method for live streams\n if (this.dashPlayer && typeof this.dashPlayer.seekToLive === \"function\") {\n console.debug(\"[DashJS] jumpToLive using seekToLive()\");\n this.dashPlayer.seekToLive();\n return;\n }\n\n // Fallback: seek to end of seekable range\n if (video.seekable && video.seekable.length > 0) {\n const liveEdge = video.seekable.end(video.seekable.length - 1);\n if (isFinite(liveEdge) && liveEdge > 0) {\n console.debug(\"[DashJS] jumpToLive using seekable.end:\", liveEdge);\n video.currentTime = liveEdge;\n }\n }\n }\n\n /**\n * Get latency from live edge (for live streams)\n */\n getLiveLatency(): number {\n const video = this.videoElement;\n if (!video || !this.isLiveStream()) return 0;\n\n // DASH.js provides live delay metrics\n if (this.dashPlayer && typeof this.dashPlayer.getCurrentLiveLatency === \"function\") {\n return this.dashPlayer.getCurrentLiveLatency() * 1000;\n }\n\n // Fallback: calculate from seekable end\n if (video.seekable && video.seekable.length > 0) {\n const liveEdge = video.seekable.end(video.seekable.length - 1);\n if (isFinite(liveEdge)) {\n return Math.max(0, (liveEdge - video.currentTime) * 1000);\n }\n }\n\n return 0;\n }\n\n async destroy(): Promise<void> {\n this.destroyed = true;\n this.subsLoaded = false;\n this.pendingSubtitleId = null;\n this.videoProxy = null;\n\n if (this.dashPlayer) {\n try {\n this.dashPlayer.reset();\n } catch (e) {\n console.warn(\"Error destroying DASH.js:\", e);\n }\n this.dashPlayer = null;\n }\n\n if (this.videoElement && this.container) {\n try {\n this.container.removeChild(this.videoElement);\n } catch {}\n }\n\n this.videoElement = null;\n this.container = null;\n this.listeners.clear();\n }\n\n getQualities(): Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }> {\n const out: any[] = [];\n const v = this.videoElement;\n if (!this.dashPlayer || !v) return out;\n try {\n // dashjs v5: getRepresentationsByType returns Representation[] (bandwidth instead of bitrate)\n const representations = this.dashPlayer.getRepresentationsByType?.(\"video\") || [];\n const settings = this.dashPlayer.getSettings?.();\n const isAutoEnabled = settings?.streaming?.abr?.autoSwitchBitrate?.video !== false;\n\n out.push({ id: \"auto\", label: \"Auto\", isAuto: true, active: isAutoEnabled });\n representations.forEach((rep: any, i: number) => {\n out.push({\n id: String(i),\n label: rep.height ? `${rep.height}p` : `${Math.round((rep.bandwidth || 0) / 1000)}kbps`,\n bitrate: rep.bandwidth, // v5 uses 'bandwidth'\n width: rep.width,\n height: rep.height,\n });\n });\n } catch {}\n return out;\n }\n\n selectQuality(id: string): void {\n if (!this.dashPlayer) return;\n if (id === \"auto\") {\n this.dashPlayer.updateSettings({\n streaming: { abr: { autoSwitchBitrate: { video: true } } },\n });\n return;\n }\n const idx = parseInt(id, 10);\n if (!isNaN(idx)) {\n this.dashPlayer.updateSettings({\n streaming: { abr: { autoSwitchBitrate: { video: false } } },\n });\n // dashjs v5: setRepresentationForTypeByIndex instead of setQualityFor\n try {\n this.dashPlayer.setRepresentationForTypeByIndex?.(\"video\", idx);\n } catch {}\n }\n }\n\n // Captions via native text tracks or dash.js API\n getTextTracks(): Array<{ id: string; label: string; lang?: string; active: boolean }> {\n const v = this.videoElement;\n if (!this.dashPlayer || !v) return [];\n const out: any[] = [];\n try {\n const textTracks = (v.textTracks || []) as any;\n for (let i = 0; i < textTracks.length; i++) {\n const tt = textTracks[i];\n out.push({\n id: String(i),\n label: tt.label || `CC ${i + 1}`,\n lang: (tt as any).language,\n active: tt.mode === \"showing\",\n });\n }\n } catch {}\n return out;\n }\n\n selectTextTrack(id: string | null): void {\n const v = this.videoElement;\n if (!this.dashPlayer || !v) return;\n\n // Deferred loading: wait for allTextTracksAdded (reference dashjs.js:180-186)\n if (!this.subsLoaded) {\n this.pendingSubtitleId = id;\n return;\n }\n\n // Try dash.js API first (reference dashjs.js:193-197)\n try {\n const dashTracks = this.dashPlayer.getTracksFor(\"text\");\n if (dashTracks && dashTracks.length > 0) {\n const idx = id === null ? -1 : parseInt(id, 10);\n if (idx >= 0 && idx < dashTracks.length) {\n this.dashPlayer.setTextTrack(idx);\n return;\n } else if (id === null || idx < 0) {\n // Disable all dash.js text tracks\n this.dashPlayer.setTextTrack(-1);\n return;\n }\n }\n } catch {}\n\n // Fallback to native text tracks\n const list = v.textTracks as TextTrackList;\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n if (id !== null && String(i) === id) tt.mode = \"showing\";\n else tt.mode = \"disabled\";\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,480 @@
1
+ import { BasePlayer } from '../core/PlayerInterface.js';
2
+ import { checkProtocolMismatch, getBrowserInfo } from '../core/detector.js';
3
+ import { translateCodec } from '../core/CodecUtils.js';
4
+ import { LiveDurationProxy } from '../core/LiveDurationProxy.js';
5
+
6
+ // Player implementation class
7
+ class HlsJsPlayerImpl extends BasePlayer {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.capability = {
11
+ name: "HLS.js Player",
12
+ shortname: "hlsjs",
13
+ priority: 3,
14
+ mimes: ["html5/application/vnd.apple.mpegurl", "html5/application/vnd.apple.mpegurl;version=7"],
15
+ };
16
+ this.hls = null;
17
+ this.container = null;
18
+ this.failureCount = 0;
19
+ this.destroyed = false;
20
+ this.liveDurationProxy = null;
21
+ }
22
+ isMimeSupported(mimetype) {
23
+ return this.capability.mimes.includes(mimetype);
24
+ }
25
+ isBrowserSupported(mimetype, source, streamInfo) {
26
+ // Check protocol mismatch
27
+ if (checkProtocolMismatch(source.url)) {
28
+ return false;
29
+ }
30
+ // Check if HLS.js is supported or native HLS is available
31
+ const browser = getBrowserInfo();
32
+ // If native HLS is supported (Safari/iOS), prefer that for older Android
33
+ if (browser.isAndroid && browser.isMobile) {
34
+ // Let VideoJS handle older Android instead
35
+ return false;
36
+ }
37
+ // Check MediaSource support (required for HLS.js)
38
+ if (!browser.supportsMediaSource) {
39
+ // Fall back to native if available
40
+ const testVideo = document.createElement("video");
41
+ if (testVideo.canPlayType("application/vnd.apple.mpegurl")) {
42
+ return ["video", "audio"];
43
+ }
44
+ return false;
45
+ }
46
+ // Check codec compatibility
47
+ const playableTracks = [];
48
+ const tracksByType = {};
49
+ // If no track info available yet, assume compatible (like upstream does)
50
+ // Track info comes async from MistServer - don't block on it
51
+ if (!streamInfo.meta.tracks || streamInfo.meta.tracks.length === 0) {
52
+ return ["video", "audio"]; // Assume standard tracks until we know better
53
+ }
54
+ // Group tracks by type
55
+ for (const track of streamInfo.meta.tracks) {
56
+ if (track.type === "meta") {
57
+ if (track.codec === "subtitle") {
58
+ // Check for WebVTT subtitle support
59
+ for (const src of streamInfo.source) {
60
+ if (src.type === "html5/text/vtt") {
61
+ playableTracks.push("subtitle");
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ continue;
67
+ }
68
+ if (!tracksByType[track.type]) {
69
+ tracksByType[track.type] = [];
70
+ }
71
+ tracksByType[track.type].push(track);
72
+ }
73
+ // HLS-incompatible audio codecs (even if browser MSE supports them in fMP4)
74
+ // HLS standard only supports: AAC, MP3, AC-3/E-AC-3
75
+ const HLS_INCOMPATIBLE_AUDIO = ["OPUS", "Opus", "opus", "VORBIS", "Vorbis", "FLAC"];
76
+ // Test codec support for video/audio tracks
77
+ for (const [trackType, tracks] of Object.entries(tracksByType)) {
78
+ let hasPlayableTrack = false;
79
+ for (const track of tracks) {
80
+ // Explicit HLS codec filtering - OPUS doesn't work in HLS even if MSE supports it
81
+ if (trackType === "audio" && HLS_INCOMPATIBLE_AUDIO.includes(track.codec)) {
82
+ console.debug(`[HLS.js] Codec incompatible with HLS: ${track.codec}`);
83
+ continue;
84
+ }
85
+ const codecString = translateCodec(track);
86
+ // Use correct container type for audio vs video tracks
87
+ const container = trackType === "audio" ? "audio/mp4" : "video/mp4";
88
+ const mimeType = `${container};codecs="${codecString}"`;
89
+ if (MediaSource.isTypeSupported && MediaSource.isTypeSupported(mimeType)) {
90
+ hasPlayableTrack = true;
91
+ break;
92
+ }
93
+ else {
94
+ console.debug(`[HLS.js] Codec not supported: ${mimeType}`);
95
+ }
96
+ }
97
+ if (hasPlayableTrack) {
98
+ playableTracks.push(trackType);
99
+ }
100
+ }
101
+ return playableTracks.length > 0 ? playableTracks : false;
102
+ }
103
+ async initialize(container, source, options) {
104
+ console.log("[HLS.js] initialize() starting for", source.url.slice(0, 60) + "...");
105
+ this.destroyed = false;
106
+ this.container = container;
107
+ container.classList.add("fw-player-container");
108
+ // Create video element
109
+ const video = document.createElement("video");
110
+ video.classList.add("fw-player-video");
111
+ video.setAttribute("playsinline", "");
112
+ video.setAttribute("crossorigin", "anonymous");
113
+ // Apply options
114
+ if (options.autoplay)
115
+ video.autoplay = true;
116
+ if (options.muted)
117
+ video.muted = true;
118
+ video.controls = options.controls === true; // Explicit false to hide native controls
119
+ if (options.loop)
120
+ video.loop = true;
121
+ if (options.poster)
122
+ video.poster = options.poster;
123
+ this.videoElement = video;
124
+ container.appendChild(video);
125
+ // Set up event listeners
126
+ this.setupVideoEventListeners(video, options);
127
+ try {
128
+ // Dynamic import of HLS.js
129
+ console.log("[HLS.js] Dynamically importing hls.js module...");
130
+ const mod = await import('hls.js');
131
+ const Hls = mod.default || mod;
132
+ console.log("[HLS.js] hls.js module imported, Hls.isSupported():", Hls.isSupported?.());
133
+ if (Hls.isSupported()) {
134
+ // Build optimized HLS.js config with user overrides
135
+ const hlsConfig = {
136
+ // Worker disabled for lower latency (per HLS.js maintainer recommendation)
137
+ enableWorker: false,
138
+ // LL-HLS support
139
+ lowLatencyMode: true,
140
+ // AGGRESSIVE: Assume 5 Mbps initially (not 500kbps default)
141
+ // This dramatically improves startup time by selecting appropriate quality faster
142
+ abrEwmaDefaultEstimate: 5000000,
143
+ // AGGRESSIVE: Minimal buffers for fastest startup
144
+ maxBufferLength: 6, // Reduced from 15 (just 2 segments @ 3s)
145
+ maxMaxBufferLength: 15, // Reduced from 60
146
+ backBufferLength: Infinity, // Let browser manage (per maintainer advice)
147
+ // Stay close to live edge but not too aggressive
148
+ liveSyncDuration: 4, // Target 4 seconds behind live edge
149
+ liveMaxLatencyDuration: 8, // Max 8 seconds before seeking to live
150
+ // Faster ABR adaptation for live
151
+ abrEwmaFastLive: 2.0, // Faster than default 3.0
152
+ abrEwmaSlowLive: 6.0, // Faster than default 9.0
153
+ // Allow user overrides
154
+ ...options.hlsConfig,
155
+ };
156
+ this.hls = new Hls(hlsConfig);
157
+ this.hls.attachMedia(video);
158
+ this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {
159
+ this.hls.loadSource(source.url);
160
+ });
161
+ this.hls.on(Hls.Events.ERROR, (_, data) => {
162
+ if (this.destroyed)
163
+ return; // Guard against zombie callbacks
164
+ if (data?.fatal) {
165
+ if (this.failureCount < 3) {
166
+ this.failureCount++;
167
+ try {
168
+ this.hls.recoverMediaError();
169
+ }
170
+ catch { }
171
+ }
172
+ else {
173
+ const error = `HLS fatal error: ${data?.type || "unknown"}`;
174
+ this.emit("error", error);
175
+ }
176
+ }
177
+ });
178
+ this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
179
+ if (this.destroyed)
180
+ return; // Guard against zombie callbacks
181
+ // Set up LiveDurationProxy for live streams
182
+ // HLS.js sets video.duration to Infinity for live streams
183
+ const isLive = !isFinite(video.duration) || this.hls.levels?.[0]?.details?.live;
184
+ if (isLive && !this.liveDurationProxy) {
185
+ this.liveDurationProxy = new LiveDurationProxy(video, {
186
+ constrainSeek: true,
187
+ liveOffset: 0,
188
+ });
189
+ console.debug("[HLS.js] LiveDurationProxy initialized for live stream");
190
+ }
191
+ if (options.autoplay) {
192
+ video.play().catch((e) => console.warn("HLS autoplay failed:", e));
193
+ }
194
+ });
195
+ }
196
+ else if (video.canPlayType("application/vnd.apple.mpegurl")) {
197
+ // Use native HLS support
198
+ video.src = source.url;
199
+ if (options.autoplay) {
200
+ video.play().catch((e) => console.warn("Native HLS autoplay failed:", e));
201
+ }
202
+ }
203
+ else {
204
+ throw new Error("HLS not supported in this browser");
205
+ }
206
+ // Optional subtitle tracks helper from source extras
207
+ try {
208
+ const subs = source.subtitles;
209
+ if (Array.isArray(subs)) {
210
+ subs.forEach((s, idx) => {
211
+ const track = document.createElement("track");
212
+ track.kind = "subtitles";
213
+ track.label = s.label;
214
+ track.srclang = s.lang;
215
+ track.src = s.src;
216
+ if (idx === 0)
217
+ track.default = true;
218
+ video.appendChild(track);
219
+ });
220
+ }
221
+ }
222
+ catch { }
223
+ console.log("[HLS.js] initialize() complete, returning video element");
224
+ return video;
225
+ }
226
+ catch (error) {
227
+ this.emit("error", error.message || String(error));
228
+ throw error;
229
+ }
230
+ }
231
+ async destroy() {
232
+ console.debug("[HLS.js] destroy() called");
233
+ this.destroyed = true;
234
+ if (this.liveDurationProxy) {
235
+ this.liveDurationProxy.destroy();
236
+ this.liveDurationProxy = null;
237
+ }
238
+ if (this.hls) {
239
+ try {
240
+ this.hls.destroy();
241
+ console.debug("[HLS.js] hls.destroy() completed");
242
+ }
243
+ catch (e) {
244
+ console.warn("[HLS.js] Error destroying:", e);
245
+ }
246
+ this.hls = null;
247
+ }
248
+ if (this.videoElement && this.container) {
249
+ try {
250
+ this.container.removeChild(this.videoElement);
251
+ }
252
+ catch { }
253
+ }
254
+ this.videoElement = null;
255
+ this.container = null;
256
+ this.listeners.clear();
257
+ }
258
+ // ============================================================================
259
+ // Live Stream Support
260
+ // ============================================================================
261
+ /**
262
+ * Get the calculated duration for live streams
263
+ * Falls back to native duration for VOD
264
+ */
265
+ getDuration() {
266
+ if (this.liveDurationProxy) {
267
+ return this.liveDurationProxy.getDuration();
268
+ }
269
+ return this.videoElement?.duration ?? 0;
270
+ }
271
+ /**
272
+ * Check if the stream is live
273
+ */
274
+ isLiveStream() {
275
+ if (this.liveDurationProxy) {
276
+ return this.liveDurationProxy.isLive();
277
+ }
278
+ const video = this.videoElement;
279
+ if (!video)
280
+ return false;
281
+ return !isFinite(video.duration);
282
+ }
283
+ /**
284
+ * Seek to a position with live-aware constraints
285
+ */
286
+ seek(time) {
287
+ const video = this.videoElement;
288
+ if (!video)
289
+ return;
290
+ // For live streams, use the proxy which constrains to buffer
291
+ if (this.liveDurationProxy && this.liveDurationProxy.isLive()) {
292
+ this.liveDurationProxy.seek(time);
293
+ return;
294
+ }
295
+ // For VOD, seek directly
296
+ video.currentTime = time;
297
+ }
298
+ /**
299
+ * Jump to live edge
300
+ * Uses HLS.js liveSyncPosition when available (more accurate)
301
+ */
302
+ jumpToLive() {
303
+ const video = this.videoElement;
304
+ if (!video)
305
+ return;
306
+ // HLS.js provides liveSyncPosition for live streams - use that first
307
+ if (this.hls &&
308
+ typeof this.hls.liveSyncPosition === "number" &&
309
+ this.hls.liveSyncPosition > 0) {
310
+ console.debug("[HLS.js] jumpToLive using liveSyncPosition:", this.hls.liveSyncPosition);
311
+ video.currentTime = this.hls.liveSyncPosition;
312
+ return;
313
+ }
314
+ // Fall back to LiveDurationProxy
315
+ if (this.liveDurationProxy && this.liveDurationProxy.isLive()) {
316
+ console.debug("[HLS.js] jumpToLive using LiveDurationProxy");
317
+ this.liveDurationProxy.jumpToLive();
318
+ return;
319
+ }
320
+ // Last resort: use seekable end
321
+ if (video.seekable && video.seekable.length > 0) {
322
+ const liveEdge = video.seekable.end(video.seekable.length - 1);
323
+ if (isFinite(liveEdge) && liveEdge > 0) {
324
+ console.debug("[HLS.js] jumpToLive using seekable.end:", liveEdge);
325
+ video.currentTime = liveEdge;
326
+ }
327
+ }
328
+ }
329
+ /**
330
+ * Provide a seekable range override for live streams.
331
+ * Uses liveSyncPosition as the live edge to avoid waiting for the absolute end.
332
+ */
333
+ getSeekableRange() {
334
+ const video = this.videoElement;
335
+ if (!video?.seekable || video.seekable.length === 0)
336
+ return null;
337
+ const start = video.seekable.start(0);
338
+ let end = video.seekable.end(video.seekable.length - 1);
339
+ if (this.liveDurationProxy?.isLive() &&
340
+ this.hls &&
341
+ typeof this.hls.liveSyncPosition === "number") {
342
+ const sync = this.hls.liveSyncPosition;
343
+ if (Number.isFinite(sync) && sync > 0) {
344
+ end = Math.min(end, sync);
345
+ }
346
+ }
347
+ if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start)
348
+ return null;
349
+ return { start, end };
350
+ }
351
+ /**
352
+ * Get latency from live edge (for live streams)
353
+ */
354
+ getLiveLatency() {
355
+ const video = this.videoElement;
356
+ if (!video)
357
+ return 0;
358
+ // HLS.js provides liveSyncPosition
359
+ if (this.hls && typeof this.hls.liveSyncPosition === "number") {
360
+ return Math.max(0, (this.hls.liveSyncPosition - video.currentTime) * 1000);
361
+ }
362
+ // Fall back to proxy
363
+ if (this.liveDurationProxy) {
364
+ return this.liveDurationProxy.getLatency() * 1000;
365
+ }
366
+ return 0;
367
+ }
368
+ // ============================================================================
369
+ // Quality API (Auto + levels)
370
+ // ============================================================================
371
+ getQualities() {
372
+ const qualities = [];
373
+ const video = this.videoElement;
374
+ if (!this.hls || !video)
375
+ return qualities;
376
+ const levels = this.hls.levels || [];
377
+ const auto = { id: "auto", label: "Auto", isAuto: true, active: this.hls.autoLevelEnabled };
378
+ qualities.push(auto);
379
+ levels.forEach((lvl, idx) => {
380
+ qualities.push({
381
+ id: String(idx),
382
+ label: lvl.height ? `${lvl.height}p` : `${Math.round((lvl.bitrate || 0) / 1000)}kbps`,
383
+ bitrate: lvl.bitrate,
384
+ width: lvl.width,
385
+ height: lvl.height,
386
+ active: this.hls.currentLevel === idx,
387
+ });
388
+ });
389
+ return qualities;
390
+ }
391
+ selectQuality(id) {
392
+ if (!this.hls)
393
+ return;
394
+ if (id === "auto") {
395
+ this.hls.currentLevel = -1;
396
+ this.hls.autoLevelEnabled = true;
397
+ return;
398
+ }
399
+ const idx = parseInt(id, 10);
400
+ if (!isNaN(idx)) {
401
+ this.hls.autoLevelEnabled = false;
402
+ this.hls.currentLevel = idx;
403
+ }
404
+ }
405
+ // Captions via native textTracks if rendered; hls.js can also manage subtitles tracks
406
+ getTextTracks() {
407
+ const v = this.videoElement;
408
+ if (!v)
409
+ return [];
410
+ const list = v.textTracks;
411
+ const out = [];
412
+ for (let i = 0; i < list.length; i++) {
413
+ const tt = list[i];
414
+ out.push({
415
+ id: String(i),
416
+ label: tt.label || `CC ${i + 1}`,
417
+ lang: tt.language,
418
+ active: tt.mode === "showing",
419
+ });
420
+ }
421
+ return out;
422
+ }
423
+ selectTextTrack(id) {
424
+ const v = this.videoElement;
425
+ if (!v)
426
+ return;
427
+ const list = v.textTracks;
428
+ for (let i = 0; i < list.length; i++) {
429
+ const tt = list[i];
430
+ if (id !== null && String(i) === id)
431
+ tt.mode = "showing";
432
+ else
433
+ tt.mode = "disabled";
434
+ }
435
+ }
436
+ /**
437
+ * Get HLS.js-specific stats for accurate bitrate and bandwidth
438
+ */
439
+ async getStats() {
440
+ if (!this.hls)
441
+ return undefined;
442
+ const levels = (this.hls.levels || []).map((lvl) => ({
443
+ bitrate: lvl.bitrate || 0,
444
+ width: lvl.width || 0,
445
+ height: lvl.height || 0,
446
+ }));
447
+ const currentLevel = this.hls.currentLevel;
448
+ const currentLevelData = levels[currentLevel];
449
+ // Calculate buffered ahead
450
+ let buffered = 0;
451
+ const video = this.videoElement;
452
+ if (video && video.buffered.length > 0) {
453
+ for (let i = 0; i < video.buffered.length; i++) {
454
+ if (video.buffered.start(i) <= video.currentTime &&
455
+ video.buffered.end(i) > video.currentTime) {
456
+ buffered = video.buffered.end(i) - video.currentTime;
457
+ break;
458
+ }
459
+ }
460
+ }
461
+ // Latency for live streams
462
+ let latency;
463
+ if (video && this.hls.liveSyncPosition !== undefined && !isFinite(video.duration)) {
464
+ latency = (this.hls.liveSyncPosition - video.currentTime) * 1000;
465
+ }
466
+ return {
467
+ type: "hls",
468
+ bandwidthEstimate: this.hls.bandwidthEstimate || 0,
469
+ currentLevel,
470
+ currentBitrate: currentLevelData?.bitrate || 0,
471
+ loadLevel: this.hls.loadLevel || 0,
472
+ levels,
473
+ buffered,
474
+ latency,
475
+ };
476
+ }
477
+ }
478
+
479
+ export { HlsJsPlayerImpl };
480
+ //# sourceMappingURL=HlsJsPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HlsJsPlayer.js","sources":["../../../../src/players/HlsJsPlayer.ts"],"sourcesContent":["import { BasePlayer } from \"../core/PlayerInterface\";\nimport { checkProtocolMismatch, getBrowserInfo } from \"../core/detector\";\nimport { translateCodec } from \"../core/CodecUtils\";\nimport { LiveDurationProxy } from \"../core/LiveDurationProxy\";\nimport type {\n StreamSource,\n StreamInfo,\n PlayerOptions,\n PlayerCapability,\n} from \"../core/PlayerInterface\";\nimport type { HlsJsConfig } from \"../types\";\n\n// Player implementation class\nexport class HlsJsPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"HLS.js Player\",\n shortname: \"hlsjs\",\n priority: 3,\n mimes: [\"html5/application/vnd.apple.mpegurl\", \"html5/application/vnd.apple.mpegurl;version=7\"],\n };\n\n private hls: any = null;\n private container: HTMLElement | null = null;\n private failureCount = 0;\n private destroyed = false;\n private liveDurationProxy: LiveDurationProxy | null = null;\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(\n mimetype: string,\n source: StreamSource,\n streamInfo: StreamInfo\n ): boolean | string[] {\n // Check protocol mismatch\n if (checkProtocolMismatch(source.url)) {\n return false;\n }\n\n // Check if HLS.js is supported or native HLS is available\n const browser = getBrowserInfo();\n\n // If native HLS is supported (Safari/iOS), prefer that for older Android\n if (browser.isAndroid && browser.isMobile) {\n // Let VideoJS handle older Android instead\n return false;\n }\n\n // Check MediaSource support (required for HLS.js)\n if (!browser.supportsMediaSource) {\n // Fall back to native if available\n const testVideo = document.createElement(\"video\");\n if (testVideo.canPlayType(\"application/vnd.apple.mpegurl\")) {\n return [\"video\", \"audio\"];\n }\n return false;\n }\n\n // Check codec compatibility\n const playableTracks: string[] = [];\n const tracksByType: Record<string, typeof streamInfo.meta.tracks> = {};\n\n // If no track info available yet, assume compatible (like upstream does)\n // Track info comes async from MistServer - don't block on it\n if (!streamInfo.meta.tracks || streamInfo.meta.tracks.length === 0) {\n return [\"video\", \"audio\"]; // Assume standard tracks until we know better\n }\n\n // Group tracks by type\n for (const track of streamInfo.meta.tracks) {\n if (track.type === \"meta\") {\n if (track.codec === \"subtitle\") {\n // Check for WebVTT subtitle support\n for (const src of streamInfo.source) {\n if (src.type === \"html5/text/vtt\") {\n playableTracks.push(\"subtitle\");\n break;\n }\n }\n }\n continue;\n }\n\n if (!tracksByType[track.type]) {\n tracksByType[track.type] = [];\n }\n tracksByType[track.type].push(track);\n }\n\n // HLS-incompatible audio codecs (even if browser MSE supports them in fMP4)\n // HLS standard only supports: AAC, MP3, AC-3/E-AC-3\n const HLS_INCOMPATIBLE_AUDIO = [\"OPUS\", \"Opus\", \"opus\", \"VORBIS\", \"Vorbis\", \"FLAC\"];\n\n // Test codec support for video/audio tracks\n for (const [trackType, tracks] of Object.entries(tracksByType)) {\n let hasPlayableTrack = false;\n\n for (const track of tracks) {\n // Explicit HLS codec filtering - OPUS doesn't work in HLS even if MSE supports it\n if (trackType === \"audio\" && HLS_INCOMPATIBLE_AUDIO.includes(track.codec)) {\n console.debug(`[HLS.js] Codec incompatible with HLS: ${track.codec}`);\n continue;\n }\n\n const codecString = translateCodec(track);\n // Use correct container type for audio vs video tracks\n const container = trackType === \"audio\" ? \"audio/mp4\" : \"video/mp4\";\n const mimeType = `${container};codecs=\"${codecString}\"`;\n\n if (MediaSource.isTypeSupported && MediaSource.isTypeSupported(mimeType)) {\n hasPlayableTrack = true;\n break;\n } else {\n console.debug(`[HLS.js] Codec not supported: ${mimeType}`);\n }\n }\n\n if (hasPlayableTrack) {\n playableTracks.push(trackType);\n }\n }\n\n return playableTracks.length > 0 ? playableTracks : false;\n }\n\n async initialize(\n container: HTMLElement,\n source: StreamSource,\n options: PlayerOptions\n ): Promise<HTMLVideoElement> {\n console.log(\"[HLS.js] initialize() starting for\", source.url.slice(0, 60) + \"...\");\n this.destroyed = false;\n this.container = container;\n container.classList.add(\"fw-player-container\");\n\n // Create video element\n const video = document.createElement(\"video\");\n video.classList.add(\"fw-player-video\");\n video.setAttribute(\"playsinline\", \"\");\n video.setAttribute(\"crossorigin\", \"anonymous\");\n\n // Apply options\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true; // Explicit false to hide native controls\n if (options.loop) video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n this.videoElement = video;\n container.appendChild(video);\n\n // Set up event listeners\n this.setupVideoEventListeners(video, options);\n\n try {\n // Dynamic import of HLS.js\n console.log(\"[HLS.js] Dynamically importing hls.js module...\");\n const mod = await import(\"hls.js\");\n const Hls = (mod as any).default || (mod as any);\n console.log(\"[HLS.js] hls.js module imported, Hls.isSupported():\", Hls.isSupported?.());\n\n if (Hls.isSupported()) {\n // Build optimized HLS.js config with user overrides\n const hlsConfig: HlsJsConfig = {\n // Worker disabled for lower latency (per HLS.js maintainer recommendation)\n enableWorker: false,\n\n // LL-HLS support\n lowLatencyMode: true,\n\n // AGGRESSIVE: Assume 5 Mbps initially (not 500kbps default)\n // This dramatically improves startup time by selecting appropriate quality faster\n abrEwmaDefaultEstimate: 5_000_000,\n\n // AGGRESSIVE: Minimal buffers for fastest startup\n maxBufferLength: 6, // Reduced from 15 (just 2 segments @ 3s)\n maxMaxBufferLength: 15, // Reduced from 60\n backBufferLength: Infinity, // Let browser manage (per maintainer advice)\n\n // Stay close to live edge but not too aggressive\n liveSyncDuration: 4, // Target 4 seconds behind live edge\n liveMaxLatencyDuration: 8, // Max 8 seconds before seeking to live\n\n // Faster ABR adaptation for live\n abrEwmaFastLive: 2.0, // Faster than default 3.0\n abrEwmaSlowLive: 6.0, // Faster than default 9.0\n\n // Allow user overrides\n ...options.hlsConfig,\n };\n\n this.hls = new Hls(hlsConfig);\n\n this.hls.attachMedia(video);\n\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls.loadSource(source.url);\n });\n\n this.hls.on(Hls.Events.ERROR, (_: any, data: any) => {\n if (this.destroyed) return; // Guard against zombie callbacks\n if (data?.fatal) {\n if (this.failureCount < 3) {\n this.failureCount++;\n try {\n this.hls.recoverMediaError();\n } catch {}\n } else {\n const error = `HLS fatal error: ${data?.type || \"unknown\"}`;\n this.emit(\"error\", error);\n }\n }\n });\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, () => {\n if (this.destroyed) return; // Guard against zombie callbacks\n\n // Set up LiveDurationProxy for live streams\n // HLS.js sets video.duration to Infinity for live streams\n const isLive = !isFinite(video.duration) || this.hls.levels?.[0]?.details?.live;\n if (isLive && !this.liveDurationProxy) {\n this.liveDurationProxy = new LiveDurationProxy(video, {\n constrainSeek: true,\n liveOffset: 0,\n });\n console.debug(\"[HLS.js] LiveDurationProxy initialized for live stream\");\n }\n\n if (options.autoplay) {\n video.play().catch((e) => console.warn(\"HLS autoplay failed:\", e));\n }\n });\n } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n // Use native HLS support\n video.src = source.url;\n if (options.autoplay) {\n video.play().catch((e) => console.warn(\"Native HLS autoplay failed:\", e));\n }\n } else {\n throw new Error(\"HLS not supported in this browser\");\n }\n\n // Optional subtitle tracks helper from source extras\n try {\n const subs = (source as any).subtitles as Array<{\n label: string;\n lang: string;\n src: string;\n }>;\n if (Array.isArray(subs)) {\n subs.forEach((s, idx) => {\n const track = document.createElement(\"track\");\n track.kind = \"subtitles\";\n track.label = s.label;\n track.srclang = s.lang;\n track.src = s.src;\n if (idx === 0) track.default = true;\n video.appendChild(track);\n });\n }\n } catch {}\n\n console.log(\"[HLS.js] initialize() complete, returning video element\");\n return video;\n } catch (error: any) {\n this.emit(\"error\", error.message || String(error));\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n console.debug(\"[HLS.js] destroy() called\");\n this.destroyed = true;\n\n if (this.liveDurationProxy) {\n this.liveDurationProxy.destroy();\n this.liveDurationProxy = null;\n }\n\n if (this.hls) {\n try {\n this.hls.destroy();\n console.debug(\"[HLS.js] hls.destroy() completed\");\n } catch (e) {\n console.warn(\"[HLS.js] Error destroying:\", e);\n }\n this.hls = null;\n }\n\n if (this.videoElement && this.container) {\n try {\n this.container.removeChild(this.videoElement);\n } catch {}\n }\n\n this.videoElement = null;\n this.container = null;\n this.listeners.clear();\n }\n\n // ============================================================================\n // Live Stream Support\n // ============================================================================\n\n /**\n * Get the calculated duration for live streams\n * Falls back to native duration for VOD\n */\n getDuration(): number {\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.getDuration();\n }\n return this.videoElement?.duration ?? 0;\n }\n\n /**\n * Check if the stream is live\n */\n isLiveStream(): boolean {\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.isLive();\n }\n const video = this.videoElement;\n if (!video) return false;\n return !isFinite(video.duration);\n }\n\n /**\n * Seek to a position with live-aware constraints\n */\n seek(time: number): void {\n const video = this.videoElement;\n if (!video) return;\n\n // For live streams, use the proxy which constrains to buffer\n if (this.liveDurationProxy && this.liveDurationProxy.isLive()) {\n this.liveDurationProxy.seek(time);\n return;\n }\n\n // For VOD, seek directly\n video.currentTime = time;\n }\n\n /**\n * Jump to live edge\n * Uses HLS.js liveSyncPosition when available (more accurate)\n */\n jumpToLive(): void {\n const video = this.videoElement;\n if (!video) return;\n\n // HLS.js provides liveSyncPosition for live streams - use that first\n if (\n this.hls &&\n typeof this.hls.liveSyncPosition === \"number\" &&\n this.hls.liveSyncPosition > 0\n ) {\n console.debug(\"[HLS.js] jumpToLive using liveSyncPosition:\", this.hls.liveSyncPosition);\n video.currentTime = this.hls.liveSyncPosition;\n return;\n }\n\n // Fall back to LiveDurationProxy\n if (this.liveDurationProxy && this.liveDurationProxy.isLive()) {\n console.debug(\"[HLS.js] jumpToLive using LiveDurationProxy\");\n this.liveDurationProxy.jumpToLive();\n return;\n }\n\n // Last resort: use seekable end\n if (video.seekable && video.seekable.length > 0) {\n const liveEdge = video.seekable.end(video.seekable.length - 1);\n if (isFinite(liveEdge) && liveEdge > 0) {\n console.debug(\"[HLS.js] jumpToLive using seekable.end:\", liveEdge);\n video.currentTime = liveEdge;\n }\n }\n }\n\n /**\n * Provide a seekable range override for live streams.\n * Uses liveSyncPosition as the live edge to avoid waiting for the absolute end.\n */\n getSeekableRange(): { start: number; end: number } | null {\n const video = this.videoElement;\n if (!video?.seekable || video.seekable.length === 0) return null;\n const start = video.seekable.start(0);\n let end = video.seekable.end(video.seekable.length - 1);\n\n if (\n this.liveDurationProxy?.isLive() &&\n this.hls &&\n typeof this.hls.liveSyncPosition === \"number\"\n ) {\n const sync = this.hls.liveSyncPosition;\n if (Number.isFinite(sync) && sync > 0) {\n end = Math.min(end, sync);\n }\n }\n\n if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) return null;\n return { start, end };\n }\n\n /**\n * Get latency from live edge (for live streams)\n */\n getLiveLatency(): number {\n const video = this.videoElement;\n if (!video) return 0;\n\n // HLS.js provides liveSyncPosition\n if (this.hls && typeof this.hls.liveSyncPosition === \"number\") {\n return Math.max(0, (this.hls.liveSyncPosition - video.currentTime) * 1000);\n }\n\n // Fall back to proxy\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.getLatency() * 1000;\n }\n\n return 0;\n }\n\n // ============================================================================\n // Quality API (Auto + levels)\n // ============================================================================\n getQualities(): Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }> {\n const qualities: any[] = [];\n const video = this.videoElement;\n if (!this.hls || !video) return qualities;\n const levels = this.hls.levels || [];\n const auto = { id: \"auto\", label: \"Auto\", isAuto: true, active: this.hls.autoLevelEnabled };\n qualities.push(auto);\n levels.forEach((lvl: any, idx: number) => {\n qualities.push({\n id: String(idx),\n label: lvl.height ? `${lvl.height}p` : `${Math.round((lvl.bitrate || 0) / 1000)}kbps`,\n bitrate: lvl.bitrate,\n width: lvl.width,\n height: lvl.height,\n active: this.hls.currentLevel === idx,\n });\n });\n return qualities;\n }\n\n selectQuality(id: string): void {\n if (!this.hls) return;\n if (id === \"auto\") {\n this.hls.currentLevel = -1;\n this.hls.autoLevelEnabled = true;\n return;\n }\n const idx = parseInt(id, 10);\n if (!isNaN(idx)) {\n this.hls.autoLevelEnabled = false;\n this.hls.currentLevel = idx;\n }\n }\n\n // Captions via native textTracks if rendered; hls.js can also manage subtitles tracks\n getTextTracks(): Array<{ id: string; label: string; lang?: string; active: boolean }> {\n const v = this.videoElement;\n if (!v) return [];\n const list = v.textTracks;\n const out: any[] = [];\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n out.push({\n id: String(i),\n label: tt.label || `CC ${i + 1}`,\n lang: (tt as any).language,\n active: tt.mode === \"showing\",\n });\n }\n return out;\n }\n\n selectTextTrack(id: string | null): void {\n const v = this.videoElement as any;\n if (!v) return;\n const list = v.textTracks as TextTrackList;\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n if (id !== null && String(i) === id) tt.mode = \"showing\";\n else tt.mode = \"disabled\";\n }\n }\n\n /**\n * Get HLS.js-specific stats for accurate bitrate and bandwidth\n */\n async getStats(): Promise<\n | {\n type: \"hls\";\n bandwidthEstimate: number;\n currentLevel: number;\n currentBitrate: number;\n loadLevel: number;\n levels: Array<{ bitrate: number; width: number; height: number }>;\n buffered: number;\n latency?: number;\n }\n | undefined\n > {\n if (!this.hls) return undefined;\n\n const levels = (this.hls.levels || []).map((lvl: any) => ({\n bitrate: lvl.bitrate || 0,\n width: lvl.width || 0,\n height: lvl.height || 0,\n }));\n\n const currentLevel = this.hls.currentLevel;\n const currentLevelData = levels[currentLevel];\n\n // Calculate buffered ahead\n let buffered = 0;\n const video = this.videoElement;\n if (video && video.buffered.length > 0) {\n for (let i = 0; i < video.buffered.length; i++) {\n if (\n video.buffered.start(i) <= video.currentTime &&\n video.buffered.end(i) > video.currentTime\n ) {\n buffered = video.buffered.end(i) - video.currentTime;\n break;\n }\n }\n }\n\n // Latency for live streams\n let latency: number | undefined;\n if (video && this.hls.liveSyncPosition !== undefined && !isFinite(video.duration)) {\n latency = (this.hls.liveSyncPosition - video.currentTime) * 1000;\n }\n\n return {\n type: \"hls\",\n bandwidthEstimate: this.hls.bandwidthEstimate || 0,\n currentLevel,\n currentBitrate: currentLevelData?.bitrate || 0,\n loadLevel: this.hls.loadLevel || 0,\n levels,\n buffered,\n latency,\n };\n }\n}\n"],"names":[],"mappings":"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"}