@videojs/html 10.0.0-beta.27 → 10.0.0-beta.28

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 (393) hide show
  1. package/cdn/audio-headless.dev.js +1 -1
  2. package/cdn/audio-headless.js +1 -1
  3. package/cdn/audio-minimal-ui.dev.js +1 -1
  4. package/cdn/audio-minimal-ui.js +1 -1
  5. package/cdn/audio-minimal.dev.js +4 -4
  6. package/cdn/audio-minimal.dev.js.map +1 -1
  7. package/cdn/audio-minimal.js +1 -1
  8. package/cdn/audio-minimal.js.map +1 -1
  9. package/cdn/audio-ui.dev.js +1 -1
  10. package/cdn/audio-ui.js +1 -1
  11. package/cdn/audio.dev.js +4 -4
  12. package/cdn/audio.dev.js.map +1 -1
  13. package/cdn/audio.js +1 -1
  14. package/cdn/audio.js.map +1 -1
  15. package/cdn/background-video-WKumpp49.js +59 -0
  16. package/cdn/background-video-WKumpp49.js.map +1 -0
  17. package/cdn/background-video-YHY_3-lX.js +2 -0
  18. package/cdn/background-video-YHY_3-lX.js.map +1 -0
  19. package/cdn/background.dev.js +3 -56
  20. package/cdn/background.dev.js.map +1 -1
  21. package/cdn/background.js +1 -1
  22. package/cdn/background.js.map +1 -1
  23. package/cdn/bn-CcLIScl6.js +108 -0
  24. package/cdn/bn-CcLIScl6.js.map +1 -0
  25. package/cdn/bn-KcCmQhYd.js +2 -0
  26. package/cdn/bn-KcCmQhYd.js.map +1 -0
  27. package/cdn/compounds-BEO1d3ZM.js +8 -0
  28. package/cdn/compounds-BEO1d3ZM.js.map +1 -0
  29. package/cdn/{compounds-CCvdpvge.js → compounds-nk9RJtBK.js} +8 -15
  30. package/cdn/compounds-nk9RJtBK.js.map +1 -0
  31. package/cdn/container-element-Dd0ZCdhK.js +14 -0
  32. package/cdn/container-element-Dd0ZCdhK.js.map +1 -0
  33. package/cdn/container-element-HHK_KZOE.js +376 -0
  34. package/cdn/container-element-HHK_KZOE.js.map +1 -0
  35. package/cdn/{create-player-BHFyOnWi.js → create-player-DK9WOywd.js} +19 -379
  36. package/cdn/create-player-DK9WOywd.js.map +1 -0
  37. package/cdn/create-player-hSdQMP5p.js +2 -0
  38. package/cdn/create-player-hSdQMP5p.js.map +1 -0
  39. package/cdn/embed-params-D2e8u0d4.js +2 -0
  40. package/cdn/embed-params-D2e8u0d4.js.map +1 -0
  41. package/cdn/embed-params-W6T88S8x.js +39 -0
  42. package/cdn/embed-params-W6T88S8x.js.map +1 -0
  43. package/cdn/{gesture-element-CG-Sx_5t.js → gesture-element-6Ld1YwIL.js} +3 -3
  44. package/cdn/{gesture-element-CG-Sx_5t.js.map → gesture-element-6Ld1YwIL.js.map} +1 -1
  45. package/cdn/gesture-element-BC48ucj9.js +2 -0
  46. package/cdn/{gesture-element-BNfMI8eh.js.map → gesture-element-BC48ucj9.js.map} +1 -1
  47. package/cdn/{hls-js-g1zdcyvE.js → hls-js-BEuVm0u9.js} +3 -2
  48. package/cdn/{hls-js-g1zdcyvE.js.map → hls-js-BEuVm0u9.js.map} +1 -1
  49. package/cdn/hls-js-C4P_b2tT.js +2 -0
  50. package/cdn/{hls-js-6lW7L4th.js.map → hls-js-C4P_b2tT.js.map} +1 -1
  51. package/cdn/hls-js-CATW7NBm.js +2 -0
  52. package/cdn/{hls-js-DCQzjzB5.js.map → hls-js-CATW7NBm.js.map} +1 -1
  53. package/cdn/{hls-js-Cwj8UBx9.js → hls-js-WCNy9MVh.js} +3 -2
  54. package/cdn/{hls-js-Cwj8UBx9.js.map → hls-js-WCNy9MVh.js.map} +1 -1
  55. package/cdn/i18n-CE4KxKuj.js +2 -0
  56. package/cdn/i18n-CE4KxKuj.js.map +1 -0
  57. package/cdn/{i18n-Mtlmj1AA.js → i18n-Ch4t6EjV.js} +2 -2
  58. package/cdn/{i18n-Mtlmj1AA.js.map → i18n-Ch4t6EjV.js.map} +1 -1
  59. package/cdn/i18n-Dc7WM2xd.js +2 -0
  60. package/cdn/{i18n-DfKGl5Rh.js.map → i18n-Dc7WM2xd.js.map} +1 -1
  61. package/cdn/i18n-DyF_NfCk.js +157 -0
  62. package/cdn/i18n-DyF_NfCk.js.map +1 -0
  63. package/cdn/i18n.dev.js +3 -152
  64. package/cdn/i18n.dev.js.map +1 -1
  65. package/cdn/i18n.js +1 -1
  66. package/cdn/i18n.js.map +1 -1
  67. package/cdn/{live-button-element-B_y-ZJBy.js → live-button-element-Bae44kBN.js} +5 -4
  68. package/cdn/live-button-element-Bae44kBN.js.map +1 -0
  69. package/cdn/live-button-element-DaHgnYdw.js +2 -0
  70. package/cdn/{live-button-element-CWfkQUoy.js.map → live-button-element-DaHgnYdw.js.map} +1 -1
  71. package/cdn/live-video-minimal.dev.js +8 -8
  72. package/cdn/live-video-minimal.dev.js.map +1 -1
  73. package/cdn/live-video-minimal.js +1 -1
  74. package/cdn/live-video-minimal.js.map +1 -1
  75. package/cdn/live-video.dev.js +9 -9
  76. package/cdn/live-video.dev.js.map +1 -1
  77. package/cdn/live-video.js +1 -1
  78. package/cdn/live-video.js.map +1 -1
  79. package/cdn/locales/bn.dev.js +1 -1
  80. package/cdn/locales/bn.js +1 -1
  81. package/cdn/media/background-video.dev.d.ts +1 -0
  82. package/cdn/media/background-video.dev.js +3 -0
  83. package/cdn/media/background-video.js +1 -0
  84. package/cdn/media/cloudflare-video.dev.d.ts +1 -0
  85. package/cdn/media/cloudflare-video.dev.js +668 -0
  86. package/cdn/media/cloudflare-video.dev.js.map +1 -0
  87. package/cdn/media/cloudflare-video.js +2 -0
  88. package/cdn/media/cloudflare-video.js.map +1 -0
  89. package/cdn/media/container.dev.d.ts +1 -0
  90. package/cdn/media/container.dev.js +8 -0
  91. package/cdn/media/container.dev.js.map +1 -0
  92. package/cdn/media/container.js +2 -0
  93. package/cdn/media/container.js.map +1 -0
  94. package/cdn/media/dash-video.dev.js +2 -1
  95. package/cdn/media/dash-video.js +2 -2
  96. package/cdn/media/dash-video.js.map +1 -1
  97. package/cdn/media/google-cast.dev.js +2 -31
  98. package/cdn/media/google-cast.dev.js.map +1 -1
  99. package/cdn/media/google-cast.js +3 -3
  100. package/cdn/media/google-cast.js.map +1 -1
  101. package/cdn/media/hls-audio.dev.js +1 -0
  102. package/cdn/media/hls-audio.js +1 -1
  103. package/cdn/media/hls-audio.js.map +1 -1
  104. package/cdn/media/hls-background-video.dev.js +2 -1
  105. package/cdn/media/hls-background-video.js +1 -1
  106. package/cdn/media/hls-background-video.js.map +1 -1
  107. package/cdn/media/hls-video.dev.js +2 -1
  108. package/cdn/media/hls-video.js +1 -1
  109. package/cdn/media/hls-video.js.map +1 -1
  110. package/cdn/media/hlsjs-video.dev.js +2 -1
  111. package/cdn/media/hlsjs-video.js +1 -1
  112. package/cdn/media/hlsjs-video.js.map +1 -1
  113. package/cdn/media/mux-audio/hls-js.dev.js +3 -1
  114. package/cdn/media/mux-audio/hls-js.js +1 -1
  115. package/cdn/media/mux-audio/spf.dev.js +1 -0
  116. package/cdn/media/mux-audio/spf.js +1 -1
  117. package/cdn/media/mux-audio/spf.js.map +1 -1
  118. package/cdn/media/mux-audio.dev.js +3 -1
  119. package/cdn/media/mux-audio.js +1 -1
  120. package/cdn/media/mux-background-video.dev.js +2 -1
  121. package/cdn/media/mux-background-video.js +1 -1
  122. package/cdn/media/mux-background-video.js.map +1 -1
  123. package/cdn/media/mux-data.dev.js +2 -1
  124. package/cdn/media/mux-data.dev.js.map +1 -1
  125. package/cdn/media/mux-data.js +2 -2
  126. package/cdn/media/mux-data.js.map +1 -1
  127. package/cdn/media/mux-video/hls-js.dev.js +3 -1
  128. package/cdn/media/mux-video/hls-js.js +1 -1
  129. package/cdn/media/mux-video/spf.dev.js +2 -1
  130. package/cdn/media/mux-video/spf.js +1 -1
  131. package/cdn/media/mux-video/spf.js.map +1 -1
  132. package/cdn/media/mux-video.dev.js +3 -1
  133. package/cdn/media/mux-video.js +1 -1
  134. package/cdn/media/native-hls-video.dev.js +1 -0
  135. package/cdn/media/native-hls-video.js +1 -1
  136. package/cdn/media/native-hls-video.js.map +1 -1
  137. package/cdn/media/spotify-audio.dev.d.ts +1 -0
  138. package/cdn/media/spotify-audio.dev.js +605 -0
  139. package/cdn/media/spotify-audio.dev.js.map +1 -0
  140. package/cdn/media/spotify-audio.js +2 -0
  141. package/cdn/media/spotify-audio.js.map +1 -0
  142. package/cdn/media/tiktok-video.dev.d.ts +1 -0
  143. package/cdn/media/tiktok-video.dev.js +636 -0
  144. package/cdn/media/tiktok-video.dev.js.map +1 -0
  145. package/cdn/media/tiktok-video.js +2 -0
  146. package/cdn/media/tiktok-video.js.map +1 -0
  147. package/cdn/media/twitch-video.dev.d.ts +1 -0
  148. package/cdn/media/twitch-video.dev.js +627 -0
  149. package/cdn/media/twitch-video.dev.js.map +1 -0
  150. package/cdn/media/twitch-video.js +2 -0
  151. package/cdn/media/twitch-video.js.map +1 -0
  152. package/cdn/media/vimeo-video.dev.d.ts +1 -0
  153. package/cdn/media/vimeo-video.dev.js +2989 -0
  154. package/cdn/media/vimeo-video.dev.js.map +1 -0
  155. package/cdn/media/vimeo-video.js +16 -0
  156. package/cdn/media/vimeo-video.js.map +1 -0
  157. package/cdn/media/youtube-video.dev.d.ts +1 -0
  158. package/cdn/media/youtube-video.dev.js +713 -0
  159. package/cdn/media/youtube-video.dev.js.map +1 -0
  160. package/cdn/media/youtube-video.js +2 -0
  161. package/cdn/media/youtube-video.js.map +1 -0
  162. package/cdn/{media-Cp3acYc8.js → media-BavrGKqa.js} +274 -5
  163. package/cdn/media-BavrGKqa.js.map +1 -0
  164. package/cdn/media-Bmablv4g.js +2 -0
  165. package/cdn/media-Bmablv4g.js.map +1 -0
  166. package/cdn/{media-B_gQXwri.js → media-COIe3uI5.js} +12 -3
  167. package/cdn/media-COIe3uI5.js.map +1 -0
  168. package/cdn/{media-CbWsJJhU.js → media-CPVSKLdk.js} +2 -2
  169. package/cdn/{media-CbWsJJhU.js.map → media-CPVSKLdk.js.map} +1 -1
  170. package/cdn/media-CanBm0Jh.js +41 -0
  171. package/cdn/media-CanBm0Jh.js.map +1 -0
  172. package/cdn/{media-Dq4zmIJa2.js → media-Dq4zmIJa.js} +1 -1
  173. package/cdn/media-Dq4zmIJa.js.map +1 -0
  174. package/cdn/{media-DRo3n8tM.js → media-oa3nyL2o.js} +3 -3
  175. package/cdn/{media-DRo3n8tM.js.map → media-oa3nyL2o.js.map} +1 -1
  176. package/cdn/media-played-ranges-CM2zeOGr.js +2 -0
  177. package/cdn/media-played-ranges-CM2zeOGr.js.map +1 -0
  178. package/cdn/media-played-ranges-Yd9acuMt.js +156 -0
  179. package/cdn/media-played-ranges-Yd9acuMt.js.map +1 -0
  180. package/cdn/{media-suYcjCG22.js → media-suYcjCG2.js} +1 -1
  181. package/cdn/media-suYcjCG2.js.map +1 -0
  182. package/cdn/minimal-ui-8iRZf_72.js +2 -0
  183. package/cdn/{minimal-ui-AFk6Ut5f.js.map → minimal-ui-8iRZf_72.js.map} +1 -1
  184. package/cdn/{minimal-ui--JsmpU2q.js → minimal-ui-BpHxIo4z.js} +5 -5
  185. package/cdn/{minimal-ui--JsmpU2q.js.map → minimal-ui-BpHxIo4z.js.map} +1 -1
  186. package/cdn/{minimal-ui-Bxcpf5Mb.js → minimal-ui-CRKvUmB8.js} +9 -9
  187. package/cdn/{minimal-ui-Bxcpf5Mb.js.map → minimal-ui-CRKvUmB8.js.map} +1 -1
  188. package/cdn/minimal-ui-Et2Wcn7r.js +2 -0
  189. package/cdn/{minimal-ui-BVKu9LWj.js.map → minimal-ui-Et2Wcn7r.js.map} +1 -1
  190. package/cdn/mixin-BqN0V06a.js +2 -0
  191. package/cdn/{mixin-DiB7dIef.js.map → mixin-BqN0V06a.js.map} +1 -1
  192. package/cdn/{mixin-CkNZwQXF.js → mixin-C193v40v.js} +67 -67
  193. package/cdn/mixin-C193v40v.js.map +1 -0
  194. package/cdn/noop-BxkeRIz9.js +6 -0
  195. package/cdn/noop-BxkeRIz9.js.map +1 -0
  196. package/cdn/noop-Ch0IHcOP.js +2 -0
  197. package/cdn/noop-Ch0IHcOP.js.map +1 -0
  198. package/cdn/{player-D4fdOLLk.js → player-B2oraRyD.js} +3 -2
  199. package/cdn/{player-D4fdOLLk.js.map → player-B2oraRyD.js.map} +1 -1
  200. package/cdn/player-BRQLp5bX.js +2 -0
  201. package/cdn/{player-srq1RGTj.js.map → player-BRQLp5bX.js.map} +1 -1
  202. package/cdn/player-BloX4l6F.js +2 -0
  203. package/cdn/{player-iIewo8Y9.js.map → player-BloX4l6F.js.map} +1 -1
  204. package/cdn/{player-B0qnepD5.js → player-CKTAtwit.js} +3 -2
  205. package/cdn/{player-B0qnepD5.js.map → player-CKTAtwit.js.map} +1 -1
  206. package/cdn/{player-C4ix6TQq.js → player-DM9rUXg-.js} +3 -2
  207. package/cdn/{player-C4ix6TQq.js.map → player-DM9rUXg-.js.map} +1 -1
  208. package/cdn/player-rCFqzWrA.js +2 -0
  209. package/cdn/{player-B0ccW5-n.js.map → player-rCFqzWrA.js.map} +1 -1
  210. package/cdn/{poster-element-BP1Ypgbf.js → poster-element-BGr1VQJB.js} +16 -4
  211. package/cdn/poster-element-BGr1VQJB.js.map +1 -0
  212. package/cdn/poster-element-DBmgOyep.js +2 -0
  213. package/cdn/poster-element-DBmgOyep.js.map +1 -0
  214. package/cdn/script-D3ZkiqwO.js +2 -0
  215. package/cdn/script-D3ZkiqwO.js.map +1 -0
  216. package/cdn/script-erPJaaTz.js +33 -0
  217. package/cdn/script-erPJaaTz.js.map +1 -0
  218. package/cdn/seek-button-element-FlgBVoGM.js +2 -0
  219. package/cdn/seek-button-element-FlgBVoGM.js.map +1 -0
  220. package/cdn/{seek-button-element-TErrbilI.js → seek-button-element-XMTLIxZj.js} +6 -5
  221. package/cdn/seek-button-element-XMTLIxZj.js.map +1 -0
  222. package/cdn/{skin-element-wPSb4AAs.js → skin-element-DL-Kqa5f.js} +2 -2
  223. package/cdn/{skin-element-wPSb4AAs.js.map → skin-element-DL-Kqa5f.js.map} +1 -1
  224. package/cdn/{skin-element-1_MG2zgS.js → skin-element-DNytI-uu.js} +2 -2
  225. package/cdn/{skin-element-1_MG2zgS.js.map → skin-element-DNytI-uu.js.map} +1 -1
  226. package/cdn/{text-element-DTB9_2HX.js → text-element-D88ArbZz.js} +3 -3
  227. package/cdn/{text-element-DTB9_2HX.js.map → text-element-D88ArbZz.js.map} +1 -1
  228. package/cdn/text-element-DeWBNKXb.js +2 -0
  229. package/cdn/{text-element-Bsyglab8.js.map → text-element-DeWBNKXb.js.map} +1 -1
  230. package/cdn/{time-slider-chapters-element-DPgaLdBt.js → time-slider-chapters-element-DJ0abZXI.js} +5 -4
  231. package/cdn/time-slider-chapters-element-DJ0abZXI.js.map +1 -0
  232. package/cdn/time-slider-chapters-element-DW8YyJn8.js +2 -0
  233. package/cdn/{time-slider-chapters-element-MdlcovBu.js.map → time-slider-chapters-element-DW8YyJn8.js.map} +1 -1
  234. package/cdn/{translate-text-DP0CzUCC.js → translate-text-BWvoW5-r.js} +2 -7
  235. package/cdn/translate-text-BWvoW5-r.js.map +1 -0
  236. package/cdn/translate-text-TzSgu_oe.js +2 -0
  237. package/cdn/translate-text-TzSgu_oe.js.map +1 -0
  238. package/cdn/{ui-D0AokGxw.js → ui-BU3_2gDQ.js} +8 -8
  239. package/cdn/{ui-D0AokGxw.js.map → ui-BU3_2gDQ.js.map} +1 -1
  240. package/cdn/{ui-p36Szn71.js → ui-BsaWWE4y.js} +10 -10
  241. package/cdn/{ui-p36Szn71.js.map → ui-BsaWWE4y.js.map} +1 -1
  242. package/cdn/ui-C0isALTQ.js +2 -0
  243. package/cdn/{ui-CecDxhTX.js.map → ui-C0isALTQ.js.map} +1 -1
  244. package/cdn/ui-DVpkE1MN.js +2 -0
  245. package/cdn/{ui-ChWM6Xz2.js.map → ui-DVpkE1MN.js.map} +1 -1
  246. package/cdn/video-headless.dev.js +1 -1
  247. package/cdn/video-headless.js +1 -1
  248. package/cdn/video-minimal-ui.dev.js +1 -1
  249. package/cdn/video-minimal-ui.js +1 -1
  250. package/cdn/video-minimal.dev.js +4 -4
  251. package/cdn/video-minimal.dev.js.map +1 -1
  252. package/cdn/video-minimal.js +1 -1
  253. package/cdn/video-minimal.js.map +1 -1
  254. package/cdn/video-ui.dev.js +1 -1
  255. package/cdn/video-ui.js +1 -1
  256. package/cdn/video.dev.js +5 -5
  257. package/cdn/video.dev.js.map +1 -1
  258. package/cdn/video.js +1 -1
  259. package/cdn/video.js.map +1 -1
  260. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  261. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  262. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  263. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  264. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
  265. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
  266. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
  267. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
  268. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
  269. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
  270. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
  271. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
  272. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  273. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  274. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  275. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  276. package/dist/default/define/audio/minimal-skin.css +16 -19
  277. package/dist/default/define/audio/skin.css +27 -30
  278. package/dist/default/define/live-audio/minimal-skin.css +16 -19
  279. package/dist/default/define/live-audio/skin.css +27 -30
  280. package/dist/default/define/live-video/minimal-skin.css +20 -19
  281. package/dist/default/define/live-video/skin.css +31 -30
  282. package/dist/default/define/video/minimal-skin.css +20 -19
  283. package/dist/default/define/video/skin.css +31 -30
  284. package/dist/default/media/tiktok-video/media.js +3 -2
  285. package/dist/default/media/tiktok-video/media.js.map +1 -1
  286. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +6 -6
  287. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  288. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +1 -1
  289. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  290. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +4 -4
  291. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  292. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -1
  293. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  294. package/dist/default/ui/playback-rate-button/playback-rate-button-element.js +1 -2
  295. package/dist/default/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
  296. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  297. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  298. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  299. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  300. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
  301. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
  302. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
  303. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
  304. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
  305. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
  306. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
  307. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
  308. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  309. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  310. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  311. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  312. package/dist/dev/define/audio/minimal-skin.css +16 -19
  313. package/dist/dev/define/audio/skin.css +27 -30
  314. package/dist/dev/define/live-audio/minimal-skin.css +16 -19
  315. package/dist/dev/define/live-audio/skin.css +27 -30
  316. package/dist/dev/define/live-video/minimal-skin.css +20 -19
  317. package/dist/dev/define/live-video/skin.css +31 -30
  318. package/dist/dev/define/video/minimal-skin.css +20 -19
  319. package/dist/dev/define/video/skin.css +31 -30
  320. package/dist/dev/media/tiktok-video/media.d.ts.map +1 -1
  321. package/dist/dev/media/tiktok-video/media.js +10 -7
  322. package/dist/dev/media/tiktok-video/media.js.map +1 -1
  323. package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js +6 -6
  324. package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  325. package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +1 -1
  326. package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  327. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js +4 -4
  328. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  329. package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -1
  330. package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  331. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts.map +1 -1
  332. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js +1 -2
  333. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
  334. package/docs/README.md +1 -1
  335. package/docs/concepts/features.md +2 -2
  336. package/docs/concepts/media-sources.md +79 -1
  337. package/docs/concepts/skins.md +31 -30
  338. package/docs/how-to/build-your-own-component.md +1 -1
  339. package/docs/how-to/customize-skins.md +94 -98
  340. package/docs/how-to/migrate-from-media-chrome.md +359 -0
  341. package/docs/how-to/migrate-from-mux-player.md +535 -0
  342. package/docs/how-to/migrate-from-plyr.md +394 -0
  343. package/docs/how-to/migrate-from-video-js-8.md +594 -0
  344. package/docs/llms.txt +9 -0
  345. package/docs/reference/feature-volume.md +3 -1
  346. package/docs/reference/mute-button.md +34 -0
  347. package/docs/reference/volume-slider.md +1 -1
  348. package/package.json +10 -9
  349. package/cdn/bn-DdelKD_n.js +0 -108
  350. package/cdn/bn-DdelKD_n.js.map +0 -1
  351. package/cdn/bn-YS8ruMcO.js +0 -2
  352. package/cdn/bn-YS8ruMcO.js.map +0 -1
  353. package/cdn/compounds-CCvdpvge.js.map +0 -1
  354. package/cdn/compounds-CJ6SbYAh.js +0 -8
  355. package/cdn/compounds-CJ6SbYAh.js.map +0 -1
  356. package/cdn/create-player-BHFyOnWi.js.map +0 -1
  357. package/cdn/create-player-CbpxjDaZ.js +0 -14
  358. package/cdn/create-player-CbpxjDaZ.js.map +0 -1
  359. package/cdn/gesture-element-BNfMI8eh.js +0 -2
  360. package/cdn/hls-js-6lW7L4th.js +0 -2
  361. package/cdn/hls-js-DCQzjzB5.js +0 -2
  362. package/cdn/i18n-DfKGl5Rh.js +0 -2
  363. package/cdn/live-button-element-B_y-ZJBy.js.map +0 -1
  364. package/cdn/live-button-element-CWfkQUoy.js +0 -2
  365. package/cdn/media-5ODYtX1-.js +0 -2
  366. package/cdn/media-5ODYtX1-.js.map +0 -1
  367. package/cdn/media-B_gQXwri.js.map +0 -1
  368. package/cdn/media-CPWNSZFX.js +0 -41
  369. package/cdn/media-CPWNSZFX.js.map +0 -1
  370. package/cdn/media-Cp3acYc8.js.map +0 -1
  371. package/cdn/media-Dq4zmIJa2.js.map +0 -1
  372. package/cdn/media-suYcjCG22.js.map +0 -1
  373. package/cdn/minimal-ui-AFk6Ut5f.js +0 -2
  374. package/cdn/minimal-ui-BVKu9LWj.js +0 -2
  375. package/cdn/mixin-CkNZwQXF.js.map +0 -1
  376. package/cdn/mixin-DiB7dIef.js +0 -2
  377. package/cdn/player-B0ccW5-n.js +0 -2
  378. package/cdn/player-iIewo8Y9.js +0 -2
  379. package/cdn/player-srq1RGTj.js +0 -2
  380. package/cdn/poster-element-BP1Ypgbf.js.map +0 -1
  381. package/cdn/poster-element-S-rr412t.js +0 -2
  382. package/cdn/poster-element-S-rr412t.js.map +0 -1
  383. package/cdn/seek-button-element-DxLmm58Y.js +0 -2
  384. package/cdn/seek-button-element-DxLmm58Y.js.map +0 -1
  385. package/cdn/seek-button-element-TErrbilI.js.map +0 -1
  386. package/cdn/text-element-Bsyglab8.js +0 -2
  387. package/cdn/time-slider-chapters-element-DPgaLdBt.js.map +0 -1
  388. package/cdn/time-slider-chapters-element-MdlcovBu.js +0 -2
  389. package/cdn/translate-text-BPMWpzFm.js +0 -2
  390. package/cdn/translate-text-BPMWpzFm.js.map +0 -1
  391. package/cdn/translate-text-DP0CzUCC.js.map +0 -1
  392. package/cdn/ui-CecDxhTX.js +0 -2
  393. package/cdn/ui-ChWM6Xz2.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube-video.dev.js","names":["#player","#target","#beginLoad","#createPlayer","#attachId","#stopPolling","#teardownTextTracks","#playerReady","#pendingLoad","#creatingPlayer","#loadComplete","#resetState","#src","#source","#readyState","#error","#autoplay","#paused","#ended","#seeking","#currentTime","#afterLoad","#duration","#volume","#muted","#playbackRate","#defaultMuted","#loop","#controls","#playsInline","#preload","#poster","#progress","#textTracksHost","#isFullscreen","#snapshotProps","#createPlayerApi","#isStale","#onPlayerReady","#onError","#bindPlayerEvents","#setupTextTracks","#loaded","#playFired","#onLoaded","#startPolling","#syncTextTracks","#pollInterval","#poll","#textTracksDisconnect"],"sources":["../../../media/dist/dev/dom/youtube/props.js","../../../media/dist/dev/dom/youtube/source.js","../../../media/dist/dev/dom/youtube/iframe-api.js","../../../media/dist/dev/dom/youtube/media.js","../../src/media/youtube-video/media.ts","../../src/define/media/youtube-video.ts"],"sourcesContent":["//#region src/dom/youtube/props.ts\nconst youtubeMediaDefaultProps = {\n\tsrc: \"\",\n\tautoplay: false,\n\tdefaultMuted: false,\n\tmuted: false,\n\tloop: false,\n\tcontrols: false,\n\tplaysInline: true,\n\tpreload: \"metadata\",\n\tposter: \"\",\n\tsource: null\n};\n//#endregion\nexport { youtubeMediaDefaultProps };\n\n//# sourceMappingURL=props.js.map","import { serializeEmbedParams } from \"../utils/embed-params.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\n//#region src/dom/youtube/source.ts\n/** Extract a YouTube video id from a raw 11-character id or any recognized URL. */\nfunction parseYouTubeVideoId(src) {\n\treturn parseYouTubeSource(src)?.id ?? null;\n}\n/**\n* Parse a YouTube source string. Recognizes raw 11-character ids, `youtu.be`\n* short links, `watch?v=`, `embed/`, `v/`, `shorts/` and `live/` URLs (with or\n* without the `-nocookie` host), playlist URLs via the `list` parameter, and\n* start times via the `t` parameter.\n*/\nfunction parseYouTubeSource(src) {\n\tif (!src) return null;\n\tif (/^[\\w-]{11}$/.test(src)) return {\n\t\tid: src,\n\t\tkind: \"video\",\n\t\tlistId: null,\n\t\tstartTime: null,\n\t\tnoCookie: false\n\t};\n\tconst noCookie = src.includes(\"-nocookie\");\n\tconst videoMatch = VIDEO_MATCH_SRC.exec(src);\n\tconst listMatch = PLAYLIST_MATCH_SRC.exec(src);\n\tconst videoId = videoMatch?.[1] ?? null;\n\tconst id = videoId === \"videoseries\" ? null : videoId;\n\tif (!id && !listMatch) return null;\n\treturn {\n\t\tid,\n\t\tkind: id ? \"video\" : \"playlist\",\n\t\tlistId: listMatch?.[1] ?? null,\n\t\tstartTime: parseStartTime(src),\n\t\tnoCookie\n\t};\n}\n/** Build the iframe `src` URL for an initial YouTube embed from the given props. */\nfunction buildYouTubeIframeSrc(src, props = {}) {\n\tconst parsed = parseYouTubeSource(src);\n\tif (!parsed) return \"\";\n\tconst embedBase = parsed.noCookie ? EMBED_BASE_NOCOOKIE : EMBED_BASE;\n\tconst params = {\n\t\tcontrols: props.controls === true ? null : 0,\n\t\tautoplay: props.autoplay,\n\t\tloop: props.loop,\n\t\tmute: props.defaultMuted,\n\t\tplaysinline: props.playsInline ?? youtubeMediaDefaultProps.playsInline,\n\t\tpreload: props.preload ?? youtubeMediaDefaultProps.preload,\n\t\tenablejsapi: 1,\n\t\trel: 0,\n\t\tiv_load_policy: 3,\n\t\tstart: parsed.startTime,\n\t\t...props.source?.engine?.youtube ?? void 0\n\t};\n\tif (parsed.kind === \"playlist\" && parsed.listId) return `${embedBase}?${serializeEmbedParams({\n\t\tlistType: \"playlist\",\n\t\tlist: parsed.listId,\n\t\t...params\n\t})}`;\n\treturn `${embedBase}/${parsed.id}?${serializeEmbedParams(params)}`;\n}\n/**\n* Parse the `t` parameter from a YouTube URL and convert it to seconds.\n* Supports formats like: `t=171`, `t=171s`, `t=2m51s`, `t=2m`, `t=1h30m15s`.\n*/\nfunction parseStartTime(url) {\n\tconst tValue = /[?&]t=([\\dhms]+)/i.exec(url)?.[1]?.toLowerCase();\n\tif (!tValue) return null;\n\tlet totalSeconds = 0;\n\tlet hasValue = false;\n\tconst hours = /(\\d+)h/.exec(tValue)?.[1];\n\tif (hours) {\n\t\ttotalSeconds += Number.parseInt(hours, 10) * 3600;\n\t\thasValue = true;\n\t}\n\tconst minutes = /(\\d+)m/.exec(tValue)?.[1];\n\tif (minutes) {\n\t\ttotalSeconds += Number.parseInt(minutes, 10) * 60;\n\t\thasValue = true;\n\t}\n\tconst seconds = /(\\d+)s?$/.exec(tValue)?.[1];\n\tif (seconds) {\n\t\ttotalSeconds += Number.parseInt(seconds, 10);\n\t\thasValue = true;\n\t}\n\treturn hasValue ? totalSeconds : null;\n}\nconst EMBED_BASE = \"https://www.youtube.com/embed\";\nconst EMBED_BASE_NOCOOKIE = \"https://www.youtube-nocookie.com/embed\";\nconst VIDEO_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|shorts\\/|live\\/))((?:\\w|-){11})/;\nconst PLAYLIST_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/.*?[?&]list=)([\\w-]+)/;\n//#endregion\nexport { buildYouTubeIframeSrc, parseYouTubeSource, parseYouTubeVideoId };\n\n//# sourceMappingURL=source.js.map","import { MediaError } from \"../../core/media-error.js\";\nimport { loadScript } from \"@videojs/utils/dom\";\n//#region src/dom/youtube/iframe-api.ts\nconst API_URL = \"https://www.youtube.com/iframe_api\";\n/** Load the iframe API once, reusing it if another host already pulled it in. */\nasync function loadYouTubeApi() {\n\tconst existing = globalThis.YT;\n\tif (existing?.Player) return existing;\n\tawait loadScript(API_URL);\n\tconst api = globalThis.YT;\n\tif (!api) throw new Error(\"YouTube iframe API failed to load\");\n\tawait new Promise((resolve) => api.ready(resolve));\n\treturn api;\n}\nconst youtubeErrorCodeToMediaErrorCode = {\n\t2: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t5: MediaError.MEDIA_ERR_DECODE,\n\t100: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t101: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t150: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED\n};\n//#endregion\nexport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode };\n\n//# sourceMappingURL=iframe-api.js.map","import { EMPTY_TEXT_TRACKS, EMPTY_TIME_RANGES } from \"../../core/constants.js\";\nimport { MediaError } from \"../../core/media-error.js\";\nimport { createTimeRange } from \"../utils/time-ranges.js\";\nimport { MediaPlayedRangesMixin } from \"../media-played-ranges/media-played-ranges.js\";\nimport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode } from \"./iframe-api.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\nimport { buildYouTubeIframeSrc, parseYouTubeSource } from \"./source.js\";\nimport { isNumber, isUndefined } from \"@videojs/utils/predicate\";\nimport { deepEqual } from \"@videojs/utils/object\";\nimport { createPublicPromise, noop, tryCall } from \"@videojs/utils/function\";\n//#region src/dom/youtube/media.ts\nconst YouTubeMediaBase = MediaPlayedRangesMixin(EventTarget);\nvar YouTubeMedia = class extends YouTubeMediaBase {\n\t#target = null;\n\t#player = null;\n\t#playerReady = false;\n\t#pendingLoad = false;\n\t#creatingPlayer = false;\n\t#loadComplete = createPublicPromise();\n\t#attachId = 0;\n\t#src = youtubeMediaDefaultProps.src;\n\t#autoplay = youtubeMediaDefaultProps.autoplay;\n\t#defaultMuted = youtubeMediaDefaultProps.defaultMuted;\n\t#loop = youtubeMediaDefaultProps.loop;\n\t#controls = youtubeMediaDefaultProps.controls;\n\t#playsInline = youtubeMediaDefaultProps.playsInline;\n\t#preload = youtubeMediaDefaultProps.preload;\n\t#poster = youtubeMediaDefaultProps.poster;\n\t#source = youtubeMediaDefaultProps.source;\n\t#paused = true;\n\t#ended = false;\n\t#seeking = false;\n\t#loaded = false;\n\t#playFired = false;\n\t#currentTime = 0;\n\t#duration = NaN;\n\t#volume = 1;\n\t#muted = false;\n\t#playbackRate = 1;\n\t#progress = 0;\n\t#readyState = READY_STATE_HAVE_NOTHING;\n\t#error = null;\n\t#isFullscreen = false;\n\t#pollInterval = null;\n\t#textTracksHost = null;\n\t#textTracksDisconnect = null;\n\tstatic PLAYER_SOFTWARE_NAME = \"youtube-video\";\n\t/** Underlying YouTube iframe API player instance (null until the API loads). */\n\tget engine() {\n\t\treturn this.#player;\n\t}\n\tget target() {\n\t\treturn this.#target;\n\t}\n\t/**\n\t* Bind the iframe hosting the embed. The player follows once an embed URL can be resolved,\n\t* which may not be now: an iframe attached before `src` is set is picked up by the next `load()`.\n\t*/\n\tattach(target) {\n\t\tif (!target || this.#target === target) return;\n\t\tif (this.#target) this.detach();\n\t\tthis.#target = target;\n\t\tthis.#beginLoad();\n\t\tthis.#createPlayer();\n\t}\n\tdetach() {\n\t\tif (!this.#target) return;\n\t\tthis.#attachId++;\n\t\tthis.#stopPolling();\n\t\tthis.#teardownTextTracks();\n\t\ttryCall(() => this.#player?.destroy());\n\t\tthis.#player = null;\n\t\tthis.#playerReady = false;\n\t\tthis.#pendingLoad = false;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#target = null;\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#resetState();\n\t}\n\tdestroy() {\n\t\tthis.detach();\n\t\tsuper.destroy();\n\t}\n\tget src() {\n\t\treturn this.#src;\n\t}\n\t/** YouTube URL or id. Setting it re-derives `source`, carrying its player parameters over. */\n\tset src(value) {\n\t\tconst { engine } = this.#source ?? {};\n\t\tconst next = {\n\t\t\t...engine && { engine },\n\t\t\t...value && { src: value }\n\t\t};\n\t\tthis.source = Object.keys(next).length > 0 ? next : null;\n\t}\n\tget currentSrc() {\n\t\treturn this.#target?.getAttribute(\"src\") ?? \"\";\n\t}\n\tget readyState() {\n\t\treturn this.#readyState;\n\t}\n\t/** Reload the current source via the iframe API; deferred until the player is ready. */\n\tasync load() {\n\t\tif (!this.#player || !this.#playerReady) {\n\t\t\tthis.#pendingLoad = !!this.#target;\n\t\t\tif (this.#target && !this.#player && !this.#creatingPlayer) {\n\t\t\t\tconst load = this.#beginLoad();\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tif (load !== this.#loadComplete) return;\n\t\t\t\tthis.#createPlayer();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst load = this.#beginLoad();\n\t\tthis.#resetState();\n\t\tthis.dispatchEvent(new Event(\"emptied\"));\n\t\tif (!this.#src) {\n\t\t\tload.resolve();\n\t\t\tthis.#stopPolling();\n\t\t\ttryCall(() => this.#player?.stopVideo());\n\t\t\treturn;\n\t\t}\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tconst parsed = parseYouTubeSource(this.#src);\n\t\tif (!parsed) {\n\t\t\tthis.#error = new MediaError(`Unrecognized YouTube source: ${this.#src}`, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tload.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (parsed.kind === \"playlist\" && parsed.listId) {\n\t\t\tconst options = {\n\t\t\t\tlist: parsed.listId,\n\t\t\t\tlistType: \"playlist\"\n\t\t\t};\n\t\t\tif (this.#autoplay) this.#player.loadPlaylist(options);\n\t\t\telse this.#player.cuePlaylist(options);\n\t\t} else if (parsed.id) {\n\t\t\tconst options = { videoId: parsed.id };\n\t\t\tif (parsed.startTime != null) options.startSeconds = parsed.startTime;\n\t\t\tif (this.#autoplay) this.#player.loadVideoById(options);\n\t\t\telse this.#player.cueVideoById(options);\n\t\t}\n\t}\n\t#beginLoad() {\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#loadComplete = createPublicPromise();\n\t\treturn this.#loadComplete;\n\t}\n\tget paused() {\n\t\treturn this.#paused;\n\t}\n\tget ended() {\n\t\treturn this.#ended;\n\t}\n\tget seeking() {\n\t\treturn this.#seeking;\n\t}\n\tasync play() {\n\t\tawait this.#loadComplete;\n\t\tif (!this.#src) return;\n\t\tthis.#player?.playVideo();\n\t}\n\tpause() {\n\t\tthis.#player?.pauseVideo();\n\t}\n\tget currentTime() {\n\t\treturn this.#currentTime;\n\t}\n\tset currentTime(value) {\n\t\tif (this.#currentTime === value) return;\n\t\tthis.#currentTime = value;\n\t\tthis.#afterLoad((p) => p.seekTo(value, true));\n\t}\n\tget duration() {\n\t\treturn this.#duration;\n\t}\n\tget volume() {\n\t\treturn this.#volume;\n\t}\n\tset volume(value) {\n\t\tif (this.#volume === value) return;\n\t\tthis.#volume = value;\n\t\tthis.#afterLoad((p) => p.setVolume(value * 100));\n\t}\n\tget muted() {\n\t\treturn this.#muted;\n\t}\n\tset muted(value) {\n\t\tif (this.#muted === value) return;\n\t\tthis.#muted = value;\n\t\tthis.#afterLoad((p) => value ? p.mute() : p.unMute());\n\t}\n\tget playbackRate() {\n\t\treturn this.#playbackRate;\n\t}\n\tset playbackRate(value) {\n\t\tif (this.#playbackRate === value) return;\n\t\tthis.#playbackRate = value;\n\t\tthis.#afterLoad((p) => p.setPlaybackRate(value));\n\t}\n\tget autoplay() {\n\t\treturn this.#autoplay;\n\t}\n\tset autoplay(value) {\n\t\tthis.#autoplay = value;\n\t}\n\tget defaultMuted() {\n\t\treturn this.#defaultMuted;\n\t}\n\tset defaultMuted(value) {\n\t\tthis.#defaultMuted = value;\n\t}\n\tget loop() {\n\t\treturn this.#loop;\n\t}\n\tset loop(value) {\n\t\tthis.#loop = value;\n\t}\n\tget controls() {\n\t\treturn this.#controls;\n\t}\n\tset controls(value) {\n\t\tthis.#controls = value;\n\t}\n\tget playsInline() {\n\t\treturn this.#playsInline;\n\t}\n\tset playsInline(value) {\n\t\tthis.#playsInline = value;\n\t}\n\tget preload() {\n\t\treturn this.#preload;\n\t}\n\tset preload(value) {\n\t\tthis.#preload = value;\n\t}\n\tget poster() {\n\t\treturn this.#poster;\n\t}\n\tset poster(value) {\n\t\tthis.#poster = value;\n\t}\n\t/** YouTube URL or id in `src`, plus player parameters under `engine.youtube`. Replacing it re-derives `src`. */\n\tget source() {\n\t\treturn this.#source;\n\t}\n\tset source(value) {\n\t\tconst source = value ?? null;\n\t\tif (source === this.#source) return;\n\t\tconst src = source?.src ?? \"\";\n\t\tconst srcChanged = this.#src !== src;\n\t\tconst engineChanged = !deepEqual(this.#source?.engine?.youtube ?? null, source?.engine?.youtube ?? null);\n\t\tthis.#source = source;\n\t\tthis.#src = src;\n\t\tif (srcChanged || engineChanged) this.load();\n\t\tthis.dispatchEvent(new Event(\"sourcechange\"));\n\t}\n\tget buffered() {\n\t\treturn this.#progress > 0 ? createTimeRange(0, this.#progress) : EMPTY_TIME_RANGES;\n\t}\n\tget seekable() {\n\t\treturn this.#duration > 0 && Number.isFinite(this.#duration) ? createTimeRange(0, this.#duration) : EMPTY_TIME_RANGES;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tget textTracks() {\n\t\tthis.#textTracksHost ??= globalThis.document?.createElement(\"video\") ?? null;\n\t\treturn this.#textTracksHost?.textTracks ?? EMPTY_TEXT_TRACKS;\n\t}\n\tget isFullscreen() {\n\t\treturn this.#isFullscreen;\n\t}\n\tasync requestFullscreen() {\n\t\tif (!this.#target?.requestFullscreen) return;\n\t\tawait this.#target.requestFullscreen();\n\t\tthis.#isFullscreen = true;\n\t}\n\tasync exitFullscreen() {\n\t\tconst doc = globalThis.document;\n\t\tif (doc?.fullscreenElement && doc.fullscreenElement === this.#target) await doc.exitFullscreen();\n\t\tthis.#isFullscreen = false;\n\t}\n\t#createPlayer() {\n\t\tconst target = this.#target;\n\t\tif (!target || this.#player || this.#creatingPlayer) return false;\n\t\tif (!target.getAttribute(\"src\")) {\n\t\t\tconst initialSrc = buildYouTubeIframeSrc(this.#src, this.#snapshotProps());\n\t\t\tif (!initialSrc) {\n\t\t\t\tthis.#loadComplete.resolve();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttarget.src = initialSrc;\n\t\t}\n\t\tthis.#creatingPlayer = true;\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tthis.#createPlayerApi(target);\n\t\treturn true;\n\t}\n\tasync #createPlayerApi(target) {\n\t\tconst attachId = this.#attachId;\n\t\tlet api;\n\t\ttry {\n\t\t\tapi = await loadYouTubeApi();\n\t\t} catch {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#creatingPlayer = false;\n\t\t\tthis.#error = new MediaError(\"Failed to load the YouTube iframe API\", MediaError.MEDIA_ERR_NETWORK);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tthis.#loadComplete.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (this.#isStale(attachId) || this.#target !== target) return;\n\t\tconst player = new api.Player(target, { events: {\n\t\t\tonReady: () => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onPlayerReady();\n\t\t\t},\n\t\t\tonError: (event) => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onError(event.data);\n\t\t\t}\n\t\t} });\n\t\tthis.#player = player;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#bindPlayerEvents(player, attachId);\n\t\tthis.#setupTextTracks(player);\n\t}\n\t#isStale(attachId) {\n\t\treturn attachId !== this.#attachId;\n\t}\n\t#afterLoad(fn) {\n\t\tthis.#loadComplete.then(() => {\n\t\t\tconst player = this.#player;\n\t\t\tif (player) tryCall(() => fn(player));\n\t\t}, noop);\n\t}\n\t#snapshotProps() {\n\t\treturn {\n\t\t\tautoplay: this.#autoplay,\n\t\t\tdefaultMuted: this.#defaultMuted,\n\t\t\tloop: this.#loop,\n\t\t\tcontrols: this.#controls,\n\t\t\tplaysInline: this.#playsInline,\n\t\t\tpreload: this.#preload || youtubeMediaDefaultProps.preload,\n\t\t\tsource: this.#source\n\t\t};\n\t}\n\t#resetState() {\n\t\tthis.#currentTime = 0;\n\t\tthis.#duration = NaN;\n\t\tthis.#muted = false;\n\t\tthis.#paused = !this.#autoplay;\n\t\tthis.#ended = false;\n\t\tthis.#playbackRate = 1;\n\t\tthis.#progress = 0;\n\t\tthis.#readyState = READY_STATE_HAVE_NOTHING;\n\t\tthis.#seeking = false;\n\t\tthis.#loaded = false;\n\t\tthis.#playFired = false;\n\t\tthis.#volume = 1;\n\t\tthis.#error = null;\n\t\tthis.#isFullscreen = false;\n\t}\n\t#onPlayerReady() {\n\t\tthis.#playerReady = true;\n\t\tif (this.#pendingLoad) {\n\t\t\tthis.#pendingLoad = false;\n\t\t\tthis.load();\n\t\t\treturn;\n\t\t}\n\t\tthis.#onLoaded();\n\t}\n\t#onLoaded() {\n\t\tif (this.#loaded) return;\n\t\tthis.#loaded = true;\n\t\tthis.#readyState = READY_STATE_HAVE_METADATA;\n\t\tconst player = this.#player;\n\t\tif (player) {\n\t\t\tthis.#duration = player.getDuration() || NaN;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t}\n\t\tfor (const type of [\n\t\t\t\"loadedmetadata\",\n\t\t\t\"durationchange\",\n\t\t\t\"volumechange\",\n\t\t\t\"loadcomplete\"\n\t\t]) this.dispatchEvent(new Event(type));\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#startPolling();\n\t}\n\t#onError(code) {\n\t\tconst error = new MediaError(`YouTube iframe player error #${code}; visit https://developers.google.com/youtube/iframe_api_reference#onError for the full error message.`, youtubeErrorCodeToMediaErrorCode[code] ?? MediaError.MEDIA_ERR_CUSTOM, true);\n\t\terror.data = { youtubeErrorCode: code };\n\t\tthis.#error = error;\n\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\tthis.#loadComplete.resolve();\n\t}\n\t#bindPlayerEvents(player, attachId) {\n\t\tconst emit = (type) => this.dispatchEvent(new Event(type));\n\t\tplayer.addEventListener(\"onStateChange\", ({ data: state }) => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tif (this.#src && !this.#loaded && state !== -1) this.#onLoaded();\n\t\t\tif (state === 1 || state === 3) {\n\t\t\t\tif (!this.#playFired) {\n\t\t\t\t\tthis.#playFired = true;\n\t\t\t\t\tthis.#paused = false;\n\t\t\t\t\tthis.#ended = false;\n\t\t\t\t\temit(\"play\");\n\t\t\t\t}\n\t\t\t\tthis.#syncTextTracks(player);\n\t\t\t}\n\t\t\tif (state === 3) emit(\"waiting\");\n\t\t\telse if (state === 1) {\n\t\t\t\tif (this.#seeking) {\n\t\t\t\t\tthis.#seeking = false;\n\t\t\t\t\temit(\"seeked\");\n\t\t\t\t}\n\t\t\t\tthis.#readyState = READY_STATE_HAVE_FUTURE_DATA;\n\t\t\t\tthis.#paused = false;\n\t\t\t\temit(\"playing\");\n\t\t\t} else if (state === 2) {\n\t\t\t\tconst diff = Math.abs(player.getCurrentTime() - this.#currentTime);\n\t\t\t\tif (!this.#seeking && diff > .1) {\n\t\t\t\t\tthis.#seeking = true;\n\t\t\t\t\temit(\"seeking\");\n\t\t\t\t}\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t} else if (state === 0) {\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t\tthis.#ended = true;\n\t\t\t\temit(\"ended\");\n\t\t\t\tif (this.#loop) this.play();\n\t\t\t}\n\t\t});\n\t\tplayer.addEventListener(\"onPlaybackRateChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t\temit(\"ratechange\");\n\t\t});\n\t\tplayer.addEventListener(\"onVolumeChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\temit(\"volumechange\");\n\t\t});\n\t}\n\t#startPolling() {\n\t\tthis.#stopPolling();\n\t\tthis.#pollInterval = setInterval(() => this.#poll(), 50);\n\t}\n\t#stopPolling() {\n\t\tif (this.#pollInterval !== null) {\n\t\t\tclearInterval(this.#pollInterval);\n\t\t\tthis.#pollInterval = null;\n\t\t}\n\t}\n\t#poll() {\n\t\tconst player = this.#player;\n\t\tif (!player) return;\n\t\tconst time = player.getCurrentTime();\n\t\tconst duration = player.getDuration();\n\t\tconst bufferedEnd = player.getVideoLoadedFraction() * duration;\n\t\tif (this.#seeking && bufferedEnd > .1) {\n\t\t\tthis.#seeking = false;\n\t\t\tthis.dispatchEvent(new Event(\"seeked\"));\n\t\t} else if (!this.#seeking && Math.abs(time - this.#currentTime) > .1) {\n\t\t\tthis.#seeking = true;\n\t\t\tthis.dispatchEvent(new Event(\"seeking\"));\n\t\t}\n\t\tif (time !== this.#currentTime) {\n\t\t\tthis.#currentTime = time;\n\t\t\tthis.dispatchEvent(new Event(\"timeupdate\"));\n\t\t}\n\t\tif (isNumber(duration) && duration > 0 && duration !== this.#duration) {\n\t\t\tthis.#duration = duration;\n\t\t\tthis.dispatchEvent(new Event(\"durationchange\"));\n\t\t}\n\t\tif (bufferedEnd !== this.#progress) {\n\t\t\tthis.#progress = bufferedEnd;\n\t\t\tif (duration > 0 && bufferedEnd >= duration) this.#readyState = READY_STATE_HAVE_ENOUGH_DATA;\n\t\t\tthis.dispatchEvent(new Event(\"progress\"));\n\t\t}\n\t}\n\t#setupTextTracks(player) {\n\t\tconst doc = globalThis.document;\n\t\tif (isUndefined(doc)) return;\n\t\tthis.#teardownTextTracks();\n\t\tconst host = doc.createElement(\"video\");\n\t\tthis.#textTracksHost = host;\n\t\tthis.#textTracksDisconnect = new AbortController();\n\t\thost.textTracks?.addEventListener?.(\"change\", () => {\n\t\t\tconst showing = Array.from(host.textTracks).find((t) => t.mode === \"showing\");\n\t\t\ttryCall(() => player.setOption(\"captions\", \"track\", showing ? { languageCode: showing.language } : {}));\n\t\t}, { signal: this.#textTracksDisconnect.signal });\n\t}\n\t#syncTextTracks(player) {\n\t\tconst host = this.#textTracksHost;\n\t\tif (!host) return;\n\t\tconst trackList = player.getOption(\"captions\", \"tracklist\") ?? [];\n\t\tfor (const track of trackList) {\n\t\t\tif (!track.languageCode) continue;\n\t\t\tif (Array.from(host.textTracks).some((t) => t.language === track.languageCode)) continue;\n\t\t\ttryCall(() => host.addTextTrack?.(\"subtitles\", track.displayName ?? \"\", track.languageCode));\n\t\t}\n\t}\n\t#teardownTextTracks() {\n\t\tthis.#textTracksDisconnect?.abort();\n\t\tthis.#textTracksDisconnect = null;\n\t\tthis.#textTracksHost = null;\n\t}\n};\nconst READY_STATE_HAVE_NOTHING = 0;\nconst READY_STATE_HAVE_METADATA = 1;\nconst READY_STATE_HAVE_FUTURE_DATA = 3;\nconst READY_STATE_HAVE_ENOUGH_DATA = 4;\n//#endregion\nexport { YouTubeMedia };\n\n//# sourceMappingURL=media.js.map","import { CustomMediaElement } from '@videojs/media/dom/custom-media-element';\nimport { buildYouTubeIframeSrc, YouTubeMedia } from '@videojs/media/dom/youtube';\nimport { escapeHtml } from '@videojs/utils/string';\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\nclass YouTubeCustomMediaElement extends CustomMediaElement('iframe', YouTubeMedia) {\n static override getTemplateHTML = (attrs: Record<string, string>): string => {\n const initialSrc = buildYouTubeIframeSrc(attrs.src ?? '', templateAttrsToEmbedProps(attrs));\n const srcAttr = initialSrc ? ` src=\"${escapeHtml(initialSrc)}\"` : '';\n return /*html*/ `\n <style>\n :host {\n display: inline-block;\n min-width: 300px;\n min-height: 150px;\n position: relative;\n }\n iframe {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n :host(:not([controls])) {\n pointer-events: none;\n }\n </style>\n <iframe\n part=\"iframe\"\n ${srcAttr}\n allow=\"accelerometer; fullscreen; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n frameborder=\"0\"\n width=\"100%\"\n height=\"100%\"\n referrerpolicy=\"${escapeHtml(attrs.referrerpolicy ?? '')}\"\n ></iframe>\n `;\n };\n}\n\nfunction templateAttrsToEmbedProps(attrs: Record<string, string>) {\n return {\n autoplay: attrs.autoplay !== undefined,\n defaultMuted: attrs.muted !== undefined,\n loop: attrs.loop !== undefined,\n controls: attrs.controls !== undefined,\n playsInline: attrs.playsinline !== undefined,\n preload: (attrs.preload as 'none' | 'metadata' | 'auto' | undefined) ?? 'metadata',\n };\n}\n\nexport class YouTubeVideo extends MediaAttachMixin(YouTubeCustomMediaElement) {}\n","import { YouTubeVideo } from '../../media/youtube-video';\nimport { safeDefine } from '../safe-define';\n\nexport class YouTubeVideoElement extends YouTubeVideo {\n static readonly tagName = 'youtube-video';\n}\n\nsafeDefine(YouTubeVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [YouTubeVideoElement.tagName]: YouTubeVideoElement;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{o as e,u as t}from"../predicate-LbFu-fPH.js";import{t as n}from"../deep-equal-CcwdHo6t.js";import{t as r}from"../custom-media-element-8pSkwn42.js";import{a as i}from"../attributes-CwICYz98.js";import{i as a}from"../context-C2rsoDxk.js";import{t as o}from"../noop-Ch0IHcOP.js";import{t as s}from"../script-D3ZkiqwO.js";import{n as c,r as l,t as u}from"../media-played-ranges-CM2zeOGr.js";import{n as d,t as f}from"../embed-params-D2e8u0d4.js";import{n as p,r as m}from"../constants-B4LD5zrj.js";import{t as h}from"../media-error-CtsbOTR1.js";import{t as g}from"../media-attach-mixin-Igi3-1UG.js";const _={src:``,autoplay:!1,defaultMuted:!1,muted:!1,loop:!1,controls:!1,playsInline:!0,preload:`metadata`,poster:``,source:null};function v(e){if(!e)return null;if(/^[\w-]{11}$/.test(e))return{id:e,kind:`video`,listId:null,startTime:null,noCookie:!1};let t=e.includes(`-nocookie`),n=C.exec(e),r=w.exec(e),i=n?.[1]??null,a=i===`videoseries`?null:i;return!a&&!r?null:{id:a,kind:a?`video`:`playlist`,listId:r?.[1]??null,startTime:b(e),noCookie:t}}function y(e,t={}){let n=v(e);if(!n)return``;let r=n.noCookie?S:x,i={controls:t.controls===!0?null:0,autoplay:t.autoplay,loop:t.loop,mute:t.defaultMuted,playsinline:t.playsInline??_.playsInline,preload:t.preload??_.preload,enablejsapi:1,rel:0,iv_load_policy:3,start:n.startTime,...t.source?.engine?.youtube??void 0};return n.kind===`playlist`&&n.listId?`${r}?${f({listType:`playlist`,list:n.listId,...i})}`:`${r}/${n.id}?${f(i)}`}function b(e){let t=/[?&]t=([\dhms]+)/i.exec(e)?.[1]?.toLowerCase();if(!t)return null;let n=0,r=!1,i=/(\d+)h/.exec(t)?.[1];i&&(n+=Number.parseInt(i,10)*3600,r=!0);let a=/(\d+)m/.exec(t)?.[1];a&&(n+=Number.parseInt(a,10)*60,r=!0);let o=/(\d+)s?$/.exec(t)?.[1];return o&&(n+=Number.parseInt(o,10),r=!0),r?n:null}const x=`https://www.youtube.com/embed`,S=`https://www.youtube-nocookie.com/embed`,C=/(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((?:\w|-){11})/,w=/(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/.*?[?&]list=)([\w-]+)/;async function T(){let e=globalThis.YT;if(e?.Player)return e;await s(`https://www.youtube.com/iframe_api`);let t=globalThis.YT;if(!t)throw Error(`YouTube iframe API failed to load`);return await new Promise(e=>t.ready(e)),t}const E={2:h.MEDIA_ERR_SRC_NOT_SUPPORTED,5:h.MEDIA_ERR_DECODE,100:h.MEDIA_ERR_SRC_NOT_SUPPORTED,101:h.MEDIA_ERR_SRC_NOT_SUPPORTED,150:h.MEDIA_ERR_SRC_NOT_SUPPORTED},D=u(EventTarget);var O=class extends D{#e=null;#t=null;#n=!1;#r=!1;#i=!1;#a=l();#o=0;#s=_.src;#c=_.autoplay;#l=_.defaultMuted;#u=_.loop;#d=_.controls;#f=_.playsInline;#p=_.preload;#m=_.poster;#h=_.source;#g=!0;#_=!1;#v=!1;#y=!1;#b=!1;#x=0;#S=NaN;#C=1;#w=!1;#T=1;#E=0;#D=k;#O=null;#k=!1;#A=null;#j=null;#M=null;static PLAYER_SOFTWARE_NAME=`youtube-video`;get engine(){return this.#t}get target(){return this.#e}attach(e){!e||this.#e===e||(this.#e&&this.detach(),this.#e=e,this.#N(),this.#P())}detach(){this.#e&&(this.#o++,this.#G(),this.#Y(),d(()=>this.#t?.destroy()),this.#t=null,this.#n=!1,this.#r=!1,this.#i=!1,this.#e=null,this.#a.resolve(),this.#z())}destroy(){this.detach(),super.destroy()}get src(){return this.#s}set src(e){let{engine:t}=this.#h??{},n={...t&&{engine:t},...e&&{src:e}};this.source=Object.keys(n).length>0?n:null}get currentSrc(){return this.#e?.getAttribute(`src`)??``}get readyState(){return this.#D}async load(){if(!this.#t||!this.#n){if(this.#r=!!this.#e,this.#e&&!this.#t&&!this.#i){let e=this.#N();if(await Promise.resolve(),e!==this.#a)return;this.#P()}return}let e=this.#N();if(this.#z(),this.dispatchEvent(new Event(`emptied`)),!this.#s){e.resolve(),this.#G(),d(()=>this.#t?.stopVideo());return}this.dispatchEvent(new Event(`loadstart`));let t=v(this.#s);if(!t){this.#O=new h(`Unrecognized YouTube source: ${this.#s}`,h.MEDIA_ERR_SRC_NOT_SUPPORTED),this.dispatchEvent(new Event(`error`)),e.resolve();return}if(t.kind===`playlist`&&t.listId){let e={list:t.listId,listType:`playlist`};this.#c?this.#t.loadPlaylist(e):this.#t.cuePlaylist(e)}else if(t.id){let e={videoId:t.id};t.startTime!=null&&(e.startSeconds=t.startTime),this.#c?this.#t.loadVideoById(e):this.#t.cueVideoById(e)}}#N(){return this.#a.resolve(),this.#a=l(),this.#a}get paused(){return this.#g}get ended(){return this.#_}get seeking(){return this.#v}async play(){await this.#a,this.#s&&this.#t?.playVideo()}pause(){this.#t?.pauseVideo()}get currentTime(){return this.#x}set currentTime(e){this.#x!==e&&(this.#x=e,this.#L(t=>t.seekTo(e,!0)))}get duration(){return this.#S}get volume(){return this.#C}set volume(e){this.#C!==e&&(this.#C=e,this.#L(t=>t.setVolume(e*100)))}get muted(){return this.#w}set muted(e){this.#w!==e&&(this.#w=e,this.#L(t=>e?t.mute():t.unMute()))}get playbackRate(){return this.#T}set playbackRate(e){this.#T!==e&&(this.#T=e,this.#L(t=>t.setPlaybackRate(e)))}get autoplay(){return this.#c}set autoplay(e){this.#c=e}get defaultMuted(){return this.#l}set defaultMuted(e){this.#l=e}get loop(){return this.#u}set loop(e){this.#u=e}get controls(){return this.#d}set controls(e){this.#d=e}get playsInline(){return this.#f}set playsInline(e){this.#f=e}get preload(){return this.#p}set preload(e){this.#p=e}get poster(){return this.#m}set poster(e){this.#m=e}get source(){return this.#h}set source(e){let t=e??null;if(t===this.#h)return;let r=t?.src??``,i=this.#s!==r,a=!n(this.#h?.engine?.youtube??null,t?.engine?.youtube??null);this.#h=t,this.#s=r,(i||a)&&this.load(),this.dispatchEvent(new Event(`sourcechange`))}get buffered(){return this.#E>0?c(0,this.#E):m}get seekable(){return this.#S>0&&Number.isFinite(this.#S)?c(0,this.#S):m}get error(){return this.#O}get textTracks(){return this.#j??=globalThis.document?.createElement(`video`)??null,this.#j?.textTracks??p}get isFullscreen(){return this.#k}async requestFullscreen(){this.#e?.requestFullscreen&&(await this.#e.requestFullscreen(),this.#k=!0)}async exitFullscreen(){let e=globalThis.document;e?.fullscreenElement&&e.fullscreenElement===this.#e&&await e.exitFullscreen(),this.#k=!1}#P(){let e=this.#e;if(!e||this.#t||this.#i)return!1;if(!e.getAttribute(`src`)){let t=y(this.#s,this.#R());if(!t)return this.#a.resolve(),!1;e.src=t}return this.#i=!0,this.dispatchEvent(new Event(`loadstart`)),this.#F(e),!0}async#F(e){let t=this.#o,n;try{n=await T()}catch{if(this.#I(t))return;this.#i=!1,this.#O=new h(`Failed to load the YouTube iframe API`,h.MEDIA_ERR_NETWORK),this.dispatchEvent(new Event(`error`)),this.#a.resolve();return}if(this.#I(t)||this.#e!==e)return;let r=new n.Player(e,{events:{onReady:()=>{this.#I(t)||this.#B()},onError:e=>{this.#I(t)||this.#H(e.data)}}});this.#t=r,this.#i=!1,this.#U(r,t),this.#q(r)}#I(e){return e!==this.#o}#L(e){this.#a.then(()=>{let t=this.#t;t&&d(()=>e(t))},o)}#R(){return{autoplay:this.#c,defaultMuted:this.#l,loop:this.#u,controls:this.#d,playsInline:this.#f,preload:this.#p||_.preload,source:this.#h}}#z(){this.#x=0,this.#S=NaN,this.#w=!1,this.#g=!this.#c,this.#_=!1,this.#T=1,this.#E=0,this.#D=k,this.#v=!1,this.#y=!1,this.#b=!1,this.#C=1,this.#O=null,this.#k=!1}#B(){if(this.#n=!0,this.#r){this.#r=!1,this.load();return}this.#V()}#V(){if(this.#y)return;this.#y=!0,this.#D=A;let e=this.#t;e&&(this.#S=e.getDuration()||NaN,this.#w=e.isMuted(),this.#C=e.getVolume()/100,this.#T=e.getPlaybackRate());for(let e of[`loadedmetadata`,`durationchange`,`volumechange`,`loadcomplete`])this.dispatchEvent(new Event(e));this.#a.resolve(),this.#W()}#H(e){let t=new h(`YouTube iframe player error #${e}; visit https://developers.google.com/youtube/iframe_api_reference#onError for the full error message.`,E[e]??h.MEDIA_ERR_CUSTOM,!0);t.data={youtubeErrorCode:e},this.#O=t,this.dispatchEvent(new Event(`error`)),this.#a.resolve()}#U(e,t){let n=e=>this.dispatchEvent(new Event(e));e.addEventListener(`onStateChange`,({data:r})=>{if(!this.#I(t))if(this.#s&&!this.#y&&r!==-1&&this.#V(),(r===1||r===3)&&(this.#b||(this.#b=!0,this.#g=!1,this.#_=!1,n(`play`)),this.#J(e)),r===3)n(`waiting`);else if(r===1)this.#v&&(this.#v=!1,n(`seeked`)),this.#D=j,this.#g=!1,n(`playing`);else if(r===2){let t=Math.abs(e.getCurrentTime()-this.#x);!this.#v&&t>.1&&(this.#v=!0,n(`seeking`)),this.#b=!1,this.#g=!0,n(`pause`)}else r===0&&(this.#b=!1,this.#g=!0,n(`pause`),this.#_=!0,n(`ended`),this.#u&&this.play())}),e.addEventListener(`onPlaybackRateChange`,()=>{this.#I(t)||(this.#T=e.getPlaybackRate(),n(`ratechange`))}),e.addEventListener(`onVolumeChange`,()=>{this.#I(t)||(this.#C=e.getVolume()/100,this.#w=e.isMuted(),n(`volumechange`))})}#W(){this.#G(),this.#A=setInterval(()=>this.#K(),50)}#G(){this.#A!==null&&(clearInterval(this.#A),this.#A=null)}#K(){let t=this.#t;if(!t)return;let n=t.getCurrentTime(),r=t.getDuration(),i=t.getVideoLoadedFraction()*r;this.#v&&i>.1?(this.#v=!1,this.dispatchEvent(new Event(`seeked`))):!this.#v&&Math.abs(n-this.#x)>.1&&(this.#v=!0,this.dispatchEvent(new Event(`seeking`))),n!==this.#x&&(this.#x=n,this.dispatchEvent(new Event(`timeupdate`))),e(r)&&r>0&&r!==this.#S&&(this.#S=r,this.dispatchEvent(new Event(`durationchange`))),i!==this.#E&&(this.#E=i,r>0&&i>=r&&(this.#D=M),this.dispatchEvent(new Event(`progress`)))}#q(e){let n=globalThis.document;if(t(n))return;this.#Y();let r=n.createElement(`video`);this.#j=r,this.#M=new AbortController,r.textTracks?.addEventListener?.(`change`,()=>{let t=Array.from(r.textTracks).find(e=>e.mode===`showing`);d(()=>e.setOption(`captions`,`track`,t?{languageCode:t.language}:{}))},{signal:this.#M.signal})}#J(e){let t=this.#j;if(!t)return;let n=e.getOption(`captions`,`tracklist`)??[];for(let e of n)e.languageCode&&(Array.from(t.textTracks).some(t=>t.language===e.languageCode)||d(()=>t.addTextTrack?.(`subtitles`,e.displayName??``,e.languageCode)))}#Y(){this.#M?.abort(),this.#M=null,this.#j=null}};const k=0,A=1,j=3,M=4;var N=class extends r(`iframe`,O){static{this.getTemplateHTML=e=>{let t=y(e.src??``,P(e));return`<style> :host { display: inline-block; min-width: 300px; min-height: 150px; position: relative; } iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; } :host(:not([controls])) { pointer-events: none; } </style><iframe part="iframe" ${t?` src="${i(t)}"`:``} allow="accelerometer; fullscreen; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen frameborder="0" width="100%" height="100%" referrerpolicy="${i(e.referrerpolicy??``)}" ></iframe>`}}};function P(e){return{autoplay:e.autoplay!==void 0,defaultMuted:e.muted!==void 0,loop:e.loop!==void 0,controls:e.controls!==void 0,playsInline:e.playsinline!==void 0,preload:e.preload??`metadata`}}var F=class extends g(N){},I=class extends F{static{this.tagName=`youtube-video`}};a(I);export{I as YouTubeVideoElement};
2
+ //# sourceMappingURL=youtube-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube-video.js","names":["#player","#target","#beginLoad","#createPlayer","#attachId","#stopPolling","#teardownTextTracks","#playerReady","#pendingLoad","#creatingPlayer","#loadComplete","#resetState","#src","#source","#readyState","#error","#autoplay","#paused","#ended","#seeking","#currentTime","#afterLoad","#duration","#volume","#muted","#playbackRate","#defaultMuted","#loop","#controls","#playsInline","#preload","#poster","#progress","#textTracksHost","#isFullscreen","#snapshotProps","#createPlayerApi","#isStale","#onPlayerReady","#onError","#bindPlayerEvents","#setupTextTracks","#loaded","#playFired","#onLoaded","#startPolling","#syncTextTracks","#pollInterval","#poll","#textTracksDisconnect"],"sources":["../../../media/dist/default/dom/youtube/props.js","../../../media/dist/default/dom/youtube/source.js","../../../media/dist/default/dom/youtube/iframe-api.js","../../../media/dist/default/dom/youtube/media.js","../../src/media/youtube-video/media.ts","../../src/define/media/youtube-video.ts"],"sourcesContent":["//#region src/dom/youtube/props.ts\nconst youtubeMediaDefaultProps = {\n\tsrc: \"\",\n\tautoplay: false,\n\tdefaultMuted: false,\n\tmuted: false,\n\tloop: false,\n\tcontrols: false,\n\tplaysInline: true,\n\tpreload: \"metadata\",\n\tposter: \"\",\n\tsource: null\n};\n//#endregion\nexport { youtubeMediaDefaultProps };\n\n//# sourceMappingURL=props.js.map","import { serializeEmbedParams } from \"../utils/embed-params.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\n//#region src/dom/youtube/source.ts\n/** Extract a YouTube video id from a raw 11-character id or any recognized URL. */\nfunction parseYouTubeVideoId(src) {\n\treturn parseYouTubeSource(src)?.id ?? null;\n}\n/**\n* Parse a YouTube source string. Recognizes raw 11-character ids, `youtu.be`\n* short links, `watch?v=`, `embed/`, `v/`, `shorts/` and `live/` URLs (with or\n* without the `-nocookie` host), playlist URLs via the `list` parameter, and\n* start times via the `t` parameter.\n*/\nfunction parseYouTubeSource(src) {\n\tif (!src) return null;\n\tif (/^[\\w-]{11}$/.test(src)) return {\n\t\tid: src,\n\t\tkind: \"video\",\n\t\tlistId: null,\n\t\tstartTime: null,\n\t\tnoCookie: false\n\t};\n\tconst noCookie = src.includes(\"-nocookie\");\n\tconst videoMatch = VIDEO_MATCH_SRC.exec(src);\n\tconst listMatch = PLAYLIST_MATCH_SRC.exec(src);\n\tconst videoId = videoMatch?.[1] ?? null;\n\tconst id = videoId === \"videoseries\" ? null : videoId;\n\tif (!id && !listMatch) return null;\n\treturn {\n\t\tid,\n\t\tkind: id ? \"video\" : \"playlist\",\n\t\tlistId: listMatch?.[1] ?? null,\n\t\tstartTime: parseStartTime(src),\n\t\tnoCookie\n\t};\n}\n/** Build the iframe `src` URL for an initial YouTube embed from the given props. */\nfunction buildYouTubeIframeSrc(src, props = {}) {\n\tconst parsed = parseYouTubeSource(src);\n\tif (!parsed) return \"\";\n\tconst embedBase = parsed.noCookie ? EMBED_BASE_NOCOOKIE : EMBED_BASE;\n\tconst params = {\n\t\tcontrols: props.controls === true ? null : 0,\n\t\tautoplay: props.autoplay,\n\t\tloop: props.loop,\n\t\tmute: props.defaultMuted,\n\t\tplaysinline: props.playsInline ?? youtubeMediaDefaultProps.playsInline,\n\t\tpreload: props.preload ?? youtubeMediaDefaultProps.preload,\n\t\tenablejsapi: 1,\n\t\trel: 0,\n\t\tiv_load_policy: 3,\n\t\tstart: parsed.startTime,\n\t\t...props.source?.engine?.youtube ?? void 0\n\t};\n\tif (parsed.kind === \"playlist\" && parsed.listId) return `${embedBase}?${serializeEmbedParams({\n\t\tlistType: \"playlist\",\n\t\tlist: parsed.listId,\n\t\t...params\n\t})}`;\n\treturn `${embedBase}/${parsed.id}?${serializeEmbedParams(params)}`;\n}\n/**\n* Parse the `t` parameter from a YouTube URL and convert it to seconds.\n* Supports formats like: `t=171`, `t=171s`, `t=2m51s`, `t=2m`, `t=1h30m15s`.\n*/\nfunction parseStartTime(url) {\n\tconst tValue = /[?&]t=([\\dhms]+)/i.exec(url)?.[1]?.toLowerCase();\n\tif (!tValue) return null;\n\tlet totalSeconds = 0;\n\tlet hasValue = false;\n\tconst hours = /(\\d+)h/.exec(tValue)?.[1];\n\tif (hours) {\n\t\ttotalSeconds += Number.parseInt(hours, 10) * 3600;\n\t\thasValue = true;\n\t}\n\tconst minutes = /(\\d+)m/.exec(tValue)?.[1];\n\tif (minutes) {\n\t\ttotalSeconds += Number.parseInt(minutes, 10) * 60;\n\t\thasValue = true;\n\t}\n\tconst seconds = /(\\d+)s?$/.exec(tValue)?.[1];\n\tif (seconds) {\n\t\ttotalSeconds += Number.parseInt(seconds, 10);\n\t\thasValue = true;\n\t}\n\treturn hasValue ? totalSeconds : null;\n}\nconst EMBED_BASE = \"https://www.youtube.com/embed\";\nconst EMBED_BASE_NOCOOKIE = \"https://www.youtube-nocookie.com/embed\";\nconst VIDEO_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|shorts\\/|live\\/))((?:\\w|-){11})/;\nconst PLAYLIST_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/.*?[?&]list=)([\\w-]+)/;\n//#endregion\nexport { buildYouTubeIframeSrc, parseYouTubeSource, parseYouTubeVideoId };\n\n//# sourceMappingURL=source.js.map","import { MediaError } from \"../../core/media-error.js\";\nimport { loadScript } from \"@videojs/utils/dom\";\n//#region src/dom/youtube/iframe-api.ts\nconst API_URL = \"https://www.youtube.com/iframe_api\";\n/** Load the iframe API once, reusing it if another host already pulled it in. */\nasync function loadYouTubeApi() {\n\tconst existing = globalThis.YT;\n\tif (existing?.Player) return existing;\n\tawait loadScript(API_URL);\n\tconst api = globalThis.YT;\n\tif (!api) throw new Error(\"YouTube iframe API failed to load\");\n\tawait new Promise((resolve) => api.ready(resolve));\n\treturn api;\n}\nconst youtubeErrorCodeToMediaErrorCode = {\n\t2: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t5: MediaError.MEDIA_ERR_DECODE,\n\t100: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t101: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t150: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED\n};\n//#endregion\nexport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode };\n\n//# sourceMappingURL=iframe-api.js.map","import { EMPTY_TEXT_TRACKS, EMPTY_TIME_RANGES } from \"../../core/constants.js\";\nimport { MediaError } from \"../../core/media-error.js\";\nimport { createTimeRange } from \"../utils/time-ranges.js\";\nimport { MediaPlayedRangesMixin } from \"../media-played-ranges/media-played-ranges.js\";\nimport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode } from \"./iframe-api.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\nimport { buildYouTubeIframeSrc, parseYouTubeSource } from \"./source.js\";\nimport { isNumber, isUndefined } from \"@videojs/utils/predicate\";\nimport { deepEqual } from \"@videojs/utils/object\";\nimport { createPublicPromise, noop, tryCall } from \"@videojs/utils/function\";\n//#region src/dom/youtube/media.ts\nconst YouTubeMediaBase = MediaPlayedRangesMixin(EventTarget);\nvar YouTubeMedia = class extends YouTubeMediaBase {\n\t#target = null;\n\t#player = null;\n\t#playerReady = false;\n\t#pendingLoad = false;\n\t#creatingPlayer = false;\n\t#loadComplete = createPublicPromise();\n\t#attachId = 0;\n\t#src = youtubeMediaDefaultProps.src;\n\t#autoplay = youtubeMediaDefaultProps.autoplay;\n\t#defaultMuted = youtubeMediaDefaultProps.defaultMuted;\n\t#loop = youtubeMediaDefaultProps.loop;\n\t#controls = youtubeMediaDefaultProps.controls;\n\t#playsInline = youtubeMediaDefaultProps.playsInline;\n\t#preload = youtubeMediaDefaultProps.preload;\n\t#poster = youtubeMediaDefaultProps.poster;\n\t#source = youtubeMediaDefaultProps.source;\n\t#paused = true;\n\t#ended = false;\n\t#seeking = false;\n\t#loaded = false;\n\t#playFired = false;\n\t#currentTime = 0;\n\t#duration = NaN;\n\t#volume = 1;\n\t#muted = false;\n\t#playbackRate = 1;\n\t#progress = 0;\n\t#readyState = READY_STATE_HAVE_NOTHING;\n\t#error = null;\n\t#isFullscreen = false;\n\t#pollInterval = null;\n\t#textTracksHost = null;\n\t#textTracksDisconnect = null;\n\tstatic PLAYER_SOFTWARE_NAME = \"youtube-video\";\n\t/** Underlying YouTube iframe API player instance (null until the API loads). */\n\tget engine() {\n\t\treturn this.#player;\n\t}\n\tget target() {\n\t\treturn this.#target;\n\t}\n\t/**\n\t* Bind the iframe hosting the embed. The player follows once an embed URL can be resolved,\n\t* which may not be now: an iframe attached before `src` is set is picked up by the next `load()`.\n\t*/\n\tattach(target) {\n\t\tif (!target || this.#target === target) return;\n\t\tif (this.#target) this.detach();\n\t\tthis.#target = target;\n\t\tthis.#beginLoad();\n\t\tthis.#createPlayer();\n\t}\n\tdetach() {\n\t\tif (!this.#target) return;\n\t\tthis.#attachId++;\n\t\tthis.#stopPolling();\n\t\tthis.#teardownTextTracks();\n\t\ttryCall(() => this.#player?.destroy());\n\t\tthis.#player = null;\n\t\tthis.#playerReady = false;\n\t\tthis.#pendingLoad = false;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#target = null;\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#resetState();\n\t}\n\tdestroy() {\n\t\tthis.detach();\n\t\tsuper.destroy();\n\t}\n\tget src() {\n\t\treturn this.#src;\n\t}\n\t/** YouTube URL or id. Setting it re-derives `source`, carrying its player parameters over. */\n\tset src(value) {\n\t\tconst { engine } = this.#source ?? {};\n\t\tconst next = {\n\t\t\t...engine && { engine },\n\t\t\t...value && { src: value }\n\t\t};\n\t\tthis.source = Object.keys(next).length > 0 ? next : null;\n\t}\n\tget currentSrc() {\n\t\treturn this.#target?.getAttribute(\"src\") ?? \"\";\n\t}\n\tget readyState() {\n\t\treturn this.#readyState;\n\t}\n\t/** Reload the current source via the iframe API; deferred until the player is ready. */\n\tasync load() {\n\t\tif (!this.#player || !this.#playerReady) {\n\t\t\tthis.#pendingLoad = !!this.#target;\n\t\t\tif (this.#target && !this.#player && !this.#creatingPlayer) {\n\t\t\t\tconst load = this.#beginLoad();\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tif (load !== this.#loadComplete) return;\n\t\t\t\tthis.#createPlayer();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst load = this.#beginLoad();\n\t\tthis.#resetState();\n\t\tthis.dispatchEvent(new Event(\"emptied\"));\n\t\tif (!this.#src) {\n\t\t\tload.resolve();\n\t\t\tthis.#stopPolling();\n\t\t\ttryCall(() => this.#player?.stopVideo());\n\t\t\treturn;\n\t\t}\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tconst parsed = parseYouTubeSource(this.#src);\n\t\tif (!parsed) {\n\t\t\tthis.#error = new MediaError(`Unrecognized YouTube source: ${this.#src}`, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tload.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (parsed.kind === \"playlist\" && parsed.listId) {\n\t\t\tconst options = {\n\t\t\t\tlist: parsed.listId,\n\t\t\t\tlistType: \"playlist\"\n\t\t\t};\n\t\t\tif (this.#autoplay) this.#player.loadPlaylist(options);\n\t\t\telse this.#player.cuePlaylist(options);\n\t\t} else if (parsed.id) {\n\t\t\tconst options = { videoId: parsed.id };\n\t\t\tif (parsed.startTime != null) options.startSeconds = parsed.startTime;\n\t\t\tif (this.#autoplay) this.#player.loadVideoById(options);\n\t\t\telse this.#player.cueVideoById(options);\n\t\t}\n\t}\n\t#beginLoad() {\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#loadComplete = createPublicPromise();\n\t\treturn this.#loadComplete;\n\t}\n\tget paused() {\n\t\treturn this.#paused;\n\t}\n\tget ended() {\n\t\treturn this.#ended;\n\t}\n\tget seeking() {\n\t\treturn this.#seeking;\n\t}\n\tasync play() {\n\t\tawait this.#loadComplete;\n\t\tif (!this.#src) return;\n\t\tthis.#player?.playVideo();\n\t}\n\tpause() {\n\t\tthis.#player?.pauseVideo();\n\t}\n\tget currentTime() {\n\t\treturn this.#currentTime;\n\t}\n\tset currentTime(value) {\n\t\tif (this.#currentTime === value) return;\n\t\tthis.#currentTime = value;\n\t\tthis.#afterLoad((p) => p.seekTo(value, true));\n\t}\n\tget duration() {\n\t\treturn this.#duration;\n\t}\n\tget volume() {\n\t\treturn this.#volume;\n\t}\n\tset volume(value) {\n\t\tif (this.#volume === value) return;\n\t\tthis.#volume = value;\n\t\tthis.#afterLoad((p) => p.setVolume(value * 100));\n\t}\n\tget muted() {\n\t\treturn this.#muted;\n\t}\n\tset muted(value) {\n\t\tif (this.#muted === value) return;\n\t\tthis.#muted = value;\n\t\tthis.#afterLoad((p) => value ? p.mute() : p.unMute());\n\t}\n\tget playbackRate() {\n\t\treturn this.#playbackRate;\n\t}\n\tset playbackRate(value) {\n\t\tif (this.#playbackRate === value) return;\n\t\tthis.#playbackRate = value;\n\t\tthis.#afterLoad((p) => p.setPlaybackRate(value));\n\t}\n\tget autoplay() {\n\t\treturn this.#autoplay;\n\t}\n\tset autoplay(value) {\n\t\tthis.#autoplay = value;\n\t}\n\tget defaultMuted() {\n\t\treturn this.#defaultMuted;\n\t}\n\tset defaultMuted(value) {\n\t\tthis.#defaultMuted = value;\n\t}\n\tget loop() {\n\t\treturn this.#loop;\n\t}\n\tset loop(value) {\n\t\tthis.#loop = value;\n\t}\n\tget controls() {\n\t\treturn this.#controls;\n\t}\n\tset controls(value) {\n\t\tthis.#controls = value;\n\t}\n\tget playsInline() {\n\t\treturn this.#playsInline;\n\t}\n\tset playsInline(value) {\n\t\tthis.#playsInline = value;\n\t}\n\tget preload() {\n\t\treturn this.#preload;\n\t}\n\tset preload(value) {\n\t\tthis.#preload = value;\n\t}\n\tget poster() {\n\t\treturn this.#poster;\n\t}\n\tset poster(value) {\n\t\tthis.#poster = value;\n\t}\n\t/** YouTube URL or id in `src`, plus player parameters under `engine.youtube`. Replacing it re-derives `src`. */\n\tget source() {\n\t\treturn this.#source;\n\t}\n\tset source(value) {\n\t\tconst source = value ?? null;\n\t\tif (source === this.#source) return;\n\t\tconst src = source?.src ?? \"\";\n\t\tconst srcChanged = this.#src !== src;\n\t\tconst engineChanged = !deepEqual(this.#source?.engine?.youtube ?? null, source?.engine?.youtube ?? null);\n\t\tthis.#source = source;\n\t\tthis.#src = src;\n\t\tif (srcChanged || engineChanged) this.load();\n\t\tthis.dispatchEvent(new Event(\"sourcechange\"));\n\t}\n\tget buffered() {\n\t\treturn this.#progress > 0 ? createTimeRange(0, this.#progress) : EMPTY_TIME_RANGES;\n\t}\n\tget seekable() {\n\t\treturn this.#duration > 0 && Number.isFinite(this.#duration) ? createTimeRange(0, this.#duration) : EMPTY_TIME_RANGES;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tget textTracks() {\n\t\tthis.#textTracksHost ??= globalThis.document?.createElement(\"video\") ?? null;\n\t\treturn this.#textTracksHost?.textTracks ?? EMPTY_TEXT_TRACKS;\n\t}\n\tget isFullscreen() {\n\t\treturn this.#isFullscreen;\n\t}\n\tasync requestFullscreen() {\n\t\tif (!this.#target?.requestFullscreen) return;\n\t\tawait this.#target.requestFullscreen();\n\t\tthis.#isFullscreen = true;\n\t}\n\tasync exitFullscreen() {\n\t\tconst doc = globalThis.document;\n\t\tif (doc?.fullscreenElement && doc.fullscreenElement === this.#target) await doc.exitFullscreen();\n\t\tthis.#isFullscreen = false;\n\t}\n\t#createPlayer() {\n\t\tconst target = this.#target;\n\t\tif (!target || this.#player || this.#creatingPlayer) return false;\n\t\tif (!target.getAttribute(\"src\")) {\n\t\t\tconst initialSrc = buildYouTubeIframeSrc(this.#src, this.#snapshotProps());\n\t\t\tif (!initialSrc) {\n\t\t\t\tthis.#loadComplete.resolve();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttarget.src = initialSrc;\n\t\t}\n\t\tthis.#creatingPlayer = true;\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tthis.#createPlayerApi(target);\n\t\treturn true;\n\t}\n\tasync #createPlayerApi(target) {\n\t\tconst attachId = this.#attachId;\n\t\tlet api;\n\t\ttry {\n\t\t\tapi = await loadYouTubeApi();\n\t\t} catch {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#creatingPlayer = false;\n\t\t\tthis.#error = new MediaError(\"Failed to load the YouTube iframe API\", MediaError.MEDIA_ERR_NETWORK);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tthis.#loadComplete.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (this.#isStale(attachId) || this.#target !== target) return;\n\t\tconst player = new api.Player(target, { events: {\n\t\t\tonReady: () => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onPlayerReady();\n\t\t\t},\n\t\t\tonError: (event) => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onError(event.data);\n\t\t\t}\n\t\t} });\n\t\tthis.#player = player;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#bindPlayerEvents(player, attachId);\n\t\tthis.#setupTextTracks(player);\n\t}\n\t#isStale(attachId) {\n\t\treturn attachId !== this.#attachId;\n\t}\n\t#afterLoad(fn) {\n\t\tthis.#loadComplete.then(() => {\n\t\t\tconst player = this.#player;\n\t\t\tif (player) tryCall(() => fn(player));\n\t\t}, noop);\n\t}\n\t#snapshotProps() {\n\t\treturn {\n\t\t\tautoplay: this.#autoplay,\n\t\t\tdefaultMuted: this.#defaultMuted,\n\t\t\tloop: this.#loop,\n\t\t\tcontrols: this.#controls,\n\t\t\tplaysInline: this.#playsInline,\n\t\t\tpreload: this.#preload || youtubeMediaDefaultProps.preload,\n\t\t\tsource: this.#source\n\t\t};\n\t}\n\t#resetState() {\n\t\tthis.#currentTime = 0;\n\t\tthis.#duration = NaN;\n\t\tthis.#muted = false;\n\t\tthis.#paused = !this.#autoplay;\n\t\tthis.#ended = false;\n\t\tthis.#playbackRate = 1;\n\t\tthis.#progress = 0;\n\t\tthis.#readyState = READY_STATE_HAVE_NOTHING;\n\t\tthis.#seeking = false;\n\t\tthis.#loaded = false;\n\t\tthis.#playFired = false;\n\t\tthis.#volume = 1;\n\t\tthis.#error = null;\n\t\tthis.#isFullscreen = false;\n\t}\n\t#onPlayerReady() {\n\t\tthis.#playerReady = true;\n\t\tif (this.#pendingLoad) {\n\t\t\tthis.#pendingLoad = false;\n\t\t\tthis.load();\n\t\t\treturn;\n\t\t}\n\t\tthis.#onLoaded();\n\t}\n\t#onLoaded() {\n\t\tif (this.#loaded) return;\n\t\tthis.#loaded = true;\n\t\tthis.#readyState = READY_STATE_HAVE_METADATA;\n\t\tconst player = this.#player;\n\t\tif (player) {\n\t\t\tthis.#duration = player.getDuration() || NaN;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t}\n\t\tfor (const type of [\n\t\t\t\"loadedmetadata\",\n\t\t\t\"durationchange\",\n\t\t\t\"volumechange\",\n\t\t\t\"loadcomplete\"\n\t\t]) this.dispatchEvent(new Event(type));\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#startPolling();\n\t}\n\t#onError(code) {\n\t\tconst error = new MediaError(`YouTube iframe player error #${code}; visit https://developers.google.com/youtube/iframe_api_reference#onError for the full error message.`, youtubeErrorCodeToMediaErrorCode[code] ?? MediaError.MEDIA_ERR_CUSTOM, true);\n\t\terror.data = { youtubeErrorCode: code };\n\t\tthis.#error = error;\n\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\tthis.#loadComplete.resolve();\n\t}\n\t#bindPlayerEvents(player, attachId) {\n\t\tconst emit = (type) => this.dispatchEvent(new Event(type));\n\t\tplayer.addEventListener(\"onStateChange\", ({ data: state }) => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tif (this.#src && !this.#loaded && state !== -1) this.#onLoaded();\n\t\t\tif (state === 1 || state === 3) {\n\t\t\t\tif (!this.#playFired) {\n\t\t\t\t\tthis.#playFired = true;\n\t\t\t\t\tthis.#paused = false;\n\t\t\t\t\tthis.#ended = false;\n\t\t\t\t\temit(\"play\");\n\t\t\t\t}\n\t\t\t\tthis.#syncTextTracks(player);\n\t\t\t}\n\t\t\tif (state === 3) emit(\"waiting\");\n\t\t\telse if (state === 1) {\n\t\t\t\tif (this.#seeking) {\n\t\t\t\t\tthis.#seeking = false;\n\t\t\t\t\temit(\"seeked\");\n\t\t\t\t}\n\t\t\t\tthis.#readyState = READY_STATE_HAVE_FUTURE_DATA;\n\t\t\t\tthis.#paused = false;\n\t\t\t\temit(\"playing\");\n\t\t\t} else if (state === 2) {\n\t\t\t\tconst diff = Math.abs(player.getCurrentTime() - this.#currentTime);\n\t\t\t\tif (!this.#seeking && diff > .1) {\n\t\t\t\t\tthis.#seeking = true;\n\t\t\t\t\temit(\"seeking\");\n\t\t\t\t}\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t} else if (state === 0) {\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t\tthis.#ended = true;\n\t\t\t\temit(\"ended\");\n\t\t\t\tif (this.#loop) this.play();\n\t\t\t}\n\t\t});\n\t\tplayer.addEventListener(\"onPlaybackRateChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t\temit(\"ratechange\");\n\t\t});\n\t\tplayer.addEventListener(\"onVolumeChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\temit(\"volumechange\");\n\t\t});\n\t}\n\t#startPolling() {\n\t\tthis.#stopPolling();\n\t\tthis.#pollInterval = setInterval(() => this.#poll(), 50);\n\t}\n\t#stopPolling() {\n\t\tif (this.#pollInterval !== null) {\n\t\t\tclearInterval(this.#pollInterval);\n\t\t\tthis.#pollInterval = null;\n\t\t}\n\t}\n\t#poll() {\n\t\tconst player = this.#player;\n\t\tif (!player) return;\n\t\tconst time = player.getCurrentTime();\n\t\tconst duration = player.getDuration();\n\t\tconst bufferedEnd = player.getVideoLoadedFraction() * duration;\n\t\tif (this.#seeking && bufferedEnd > .1) {\n\t\t\tthis.#seeking = false;\n\t\t\tthis.dispatchEvent(new Event(\"seeked\"));\n\t\t} else if (!this.#seeking && Math.abs(time - this.#currentTime) > .1) {\n\t\t\tthis.#seeking = true;\n\t\t\tthis.dispatchEvent(new Event(\"seeking\"));\n\t\t}\n\t\tif (time !== this.#currentTime) {\n\t\t\tthis.#currentTime = time;\n\t\t\tthis.dispatchEvent(new Event(\"timeupdate\"));\n\t\t}\n\t\tif (isNumber(duration) && duration > 0 && duration !== this.#duration) {\n\t\t\tthis.#duration = duration;\n\t\t\tthis.dispatchEvent(new Event(\"durationchange\"));\n\t\t}\n\t\tif (bufferedEnd !== this.#progress) {\n\t\t\tthis.#progress = bufferedEnd;\n\t\t\tif (duration > 0 && bufferedEnd >= duration) this.#readyState = READY_STATE_HAVE_ENOUGH_DATA;\n\t\t\tthis.dispatchEvent(new Event(\"progress\"));\n\t\t}\n\t}\n\t#setupTextTracks(player) {\n\t\tconst doc = globalThis.document;\n\t\tif (isUndefined(doc)) return;\n\t\tthis.#teardownTextTracks();\n\t\tconst host = doc.createElement(\"video\");\n\t\tthis.#textTracksHost = host;\n\t\tthis.#textTracksDisconnect = new AbortController();\n\t\thost.textTracks?.addEventListener?.(\"change\", () => {\n\t\t\tconst showing = Array.from(host.textTracks).find((t) => t.mode === \"showing\");\n\t\t\ttryCall(() => player.setOption(\"captions\", \"track\", showing ? { languageCode: showing.language } : {}));\n\t\t}, { signal: this.#textTracksDisconnect.signal });\n\t}\n\t#syncTextTracks(player) {\n\t\tconst host = this.#textTracksHost;\n\t\tif (!host) return;\n\t\tconst trackList = player.getOption(\"captions\", \"tracklist\") ?? [];\n\t\tfor (const track of trackList) {\n\t\t\tif (!track.languageCode) continue;\n\t\t\tif (Array.from(host.textTracks).some((t) => t.language === track.languageCode)) continue;\n\t\t\ttryCall(() => host.addTextTrack?.(\"subtitles\", track.displayName ?? \"\", track.languageCode));\n\t\t}\n\t}\n\t#teardownTextTracks() {\n\t\tthis.#textTracksDisconnect?.abort();\n\t\tthis.#textTracksDisconnect = null;\n\t\tthis.#textTracksHost = null;\n\t}\n};\nconst READY_STATE_HAVE_NOTHING = 0;\nconst READY_STATE_HAVE_METADATA = 1;\nconst READY_STATE_HAVE_FUTURE_DATA = 3;\nconst READY_STATE_HAVE_ENOUGH_DATA = 4;\n//#endregion\nexport { YouTubeMedia };\n\n//# sourceMappingURL=media.js.map","import { CustomMediaElement } from '@videojs/media/dom/custom-media-element';\nimport { buildYouTubeIframeSrc, YouTubeMedia } from '@videojs/media/dom/youtube';\nimport { escapeHtml } from '@videojs/utils/string';\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\nclass YouTubeCustomMediaElement extends CustomMediaElement('iframe', YouTubeMedia) {\n static override getTemplateHTML = (attrs: Record<string, string>): string => {\n const initialSrc = buildYouTubeIframeSrc(attrs.src ?? '', templateAttrsToEmbedProps(attrs));\n const srcAttr = initialSrc ? ` src=\"${escapeHtml(initialSrc)}\"` : '';\n return /*html*/ `\n <style>\n :host {\n display: inline-block;\n min-width: 300px;\n min-height: 150px;\n position: relative;\n }\n iframe {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n :host(:not([controls])) {\n pointer-events: none;\n }\n </style>\n <iframe\n part=\"iframe\"\n ${srcAttr}\n allow=\"accelerometer; fullscreen; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n frameborder=\"0\"\n width=\"100%\"\n height=\"100%\"\n referrerpolicy=\"${escapeHtml(attrs.referrerpolicy ?? '')}\"\n ></iframe>\n `;\n };\n}\n\nfunction templateAttrsToEmbedProps(attrs: Record<string, string>) {\n return {\n autoplay: attrs.autoplay !== undefined,\n defaultMuted: attrs.muted !== undefined,\n loop: attrs.loop !== undefined,\n controls: attrs.controls !== undefined,\n playsInline: attrs.playsinline !== undefined,\n preload: (attrs.preload as 'none' | 'metadata' | 'auto' | undefined) ?? 'metadata',\n };\n}\n\nexport class YouTubeVideo extends MediaAttachMixin(YouTubeCustomMediaElement) {}\n","import { YouTubeVideo } from '../../media/youtube-video';\nimport { safeDefine } from '../safe-define';\n\nexport class YouTubeVideoElement extends YouTubeVideo {\n static readonly tagName = 'youtube-video';\n}\n\nsafeDefine(YouTubeVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [YouTubeVideoElement.tagName]: YouTubeVideoElement;\n }\n}\n"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { t as isWebKitAirPlayCapable } from "./webkit-C682yTT7.js";
5
5
  import { n as KeySystems$1, t as NativeHlsMedia } from "./media-Wq1AGln1.js";
6
6
  import { t as MediaError } from "./media-error-zO-Hg4un.js";
7
7
  import { t as MediaStreamTypes } from "./types-B3ylxZUA.js";
8
+ import { t as MediaTracksMixin } from "./mixin-C193v40v.js";
8
9
  import { t as HTMLVideoElementHost } from "./video-host-BfXZVMMj.js";
9
- import { t as MediaTracksMixin } from "./mixin-CkNZwQXF.js";
10
10
 
11
11
  //#region ../media/dist/dev/core/bridge-events.js
12
12
  /** Wrap `source.dispatchEvent` so every event is also re-dispatched on `target`. */
@@ -28356,6 +28356,213 @@ function HlsJsMediaAirPlayMixin(BaseClass) {
28356
28356
  return HlsJsMediaAirPlay;
28357
28357
  }
28358
28358
 
28359
+ //#endregion
28360
+ //#region ../media/dist/dev/dom/hls-js/cap-level.js
28361
+ /**
28362
+ * Floor applied to the player-size cap unless a source names another.
28363
+ *
28364
+ * The low rungs of a ladder are there for bad network conditions, and at that
28365
+ * end the relationship between resolution and perceived quality stops holding:
28366
+ * a small player capped to 360p looks worse than its size alone suggests. No
28367
+ * reliable signal exists to key that on, so a fixed floor stands in for one.
28368
+ */
28369
+ const DEFAULT_MIN_AUTO_RESOLUTION = "720p";
28370
+ /**
28371
+ * Pixel area of a resolution shorthand, assuming 16:9 — `'720p'` is
28372
+ * `1280 × 720`, or `921_600`.
28373
+ *
28374
+ * Renditions are matched on area rather than literal height so anamorphic
28375
+ * variants are judged by how many pixels they actually carry: a 2560×1080
28376
+ * ultrawide rendition costs more than 16:9 1080p and is capped accordingly.
28377
+ *
28378
+ * Mirrors `maxResolutionToPixelArea` in `@videojs/spf`, and agrees with it on
28379
+ * every rung whose 16:9 width is a whole number. It parts company at `'480p'`
28380
+ * on purpose: 16:9 at 480 tall is 853.33 wide, ladders ship the rounded-up
28381
+ * 854×480, and the exact area would put the standard 480p rendition over its
28382
+ * own cap. Rounding the width up admits it while still excluding anything
28383
+ * genuinely wider.
28384
+ */
28385
+ function resolutionToPixelArea(resolution) {
28386
+ if (resolution === void 0) return Number.POSITIVE_INFINITY;
28387
+ const height = Number.parseInt(resolution, 10);
28388
+ if (!(Number.isFinite(height) && height > 0)) return Number.POSITIVE_INFINITY;
28389
+ return Math.ceil(height * 16 / 9) * height;
28390
+ }
28391
+ /**
28392
+ * Highest level index that keeps automatic selection at or below `resolution`.
28393
+ *
28394
+ * `autoLevelCapping` is a ceiling on the *index*, so every level at or below it
28395
+ * stays eligible. That makes the answer the end of the leading run that fits the
28396
+ * budget, not the single best match: hls.js orders levels by height, so a wider
28397
+ * rendition can exceed the pixel budget from a lower index, and capping at the
28398
+ * best match would leave it selectable.
28399
+ *
28400
+ * Falls back to index `0` when even the lowest rung is over budget — playing
28401
+ * something over-spec beats refusing to adapt.
28402
+ *
28403
+ * Returns `undefined` when there is nothing to cap: no resolution requested, or
28404
+ * no levels to choose from.
28405
+ */
28406
+ function levelIndexAtOrBelow(levels, resolution) {
28407
+ const maxPixelArea = resolutionToPixelArea(resolution);
28408
+ if (maxPixelArea === Number.POSITIVE_INFINITY || levels.length === 0) return void 0;
28409
+ const overBudget = levels.findIndex((level) => (level.width ?? 0) * (level.height ?? 0) > maxPixelArea);
28410
+ return overBudget === -1 ? levels.length - 1 : Math.max(0, overBudget - 1);
28411
+ }
28412
+ /**
28413
+ * Lowest level index that keeps a rendition at or above `resolution` eligible.
28414
+ *
28415
+ * The complement of {@link levelIndexAtOrBelow}, for raising a ceiling rather
28416
+ * than lowering one, and reasoned the same way: `autoLevelCapping` is a ceiling
28417
+ * on the *index*, so the cheapest ceiling that still admits the floor is the
28418
+ * first index that reaches it. Every rung below stays eligible either way, which
28419
+ * is what keeps this a bound on capping rather than a quality minimum.
28420
+ *
28421
+ * Falls back to the top of the ladder when no rendition reaches the floor — a
28422
+ * floor nothing can satisfy has no cap to raise.
28423
+ *
28424
+ * Returns `undefined` when there is no floor to apply: no resolution requested,
28425
+ * or no levels to choose from.
28426
+ */
28427
+ function levelIndexAtOrAbove(levels, resolution) {
28428
+ const minPixelArea = resolutionToPixelArea(resolution);
28429
+ if (minPixelArea === Number.POSITIVE_INFINITY || levels.length === 0) return void 0;
28430
+ const atFloor = levels.findIndex((level) => (level.width ?? 0) * (level.height ?? 0) >= minPixelArea);
28431
+ return atFloor === -1 ? levels.length - 1 : atFloor;
28432
+ }
28433
+ /**
28434
+ * Build the `capLevelController` class to hand to the hls.js constructor.
28435
+ *
28436
+ * `hls.autoLevelCapping` has exactly one writer: hls.js's own
28437
+ * `CapLevelController`, which rewrites it on a one-second interval for as long
28438
+ * as `capLevelToPlayerSize` is on — and it is on by default here. Assigning the
28439
+ * property from outside is undone within a second, so a cap has to be applied
28440
+ * from inside the controller rather than in competition with it.
28441
+ *
28442
+ * The only seam hls.js offers is `getMaxLevel()`, which every value the capping
28443
+ * loop writes passes through. Overriding it makes the requested ceiling part of
28444
+ * the same single-writer computation.
28445
+ *
28446
+ * @param policy - Live cap inputs, re-read on every evaluation.
28447
+ * @param BaseController - Controller to layer on top of, so a controller passed
28448
+ * through `source.engine.capLevelController` keeps its behavior.
28449
+ */
28450
+ function createCapLevelController(policy, BaseController = Hls.DefaultConfig.capLevelController) {
28451
+ return class RenditionCapLevelController extends BaseController {
28452
+ #hls;
28453
+ #capping = false;
28454
+ #measuringWithoutSize = false;
28455
+ constructor(hls) {
28456
+ super(hls);
28457
+ this.#hls = hls;
28458
+ policy.controller = this;
28459
+ hls.on(Hls.Events.MANIFEST_PARSED, this.#onLevelsChanged);
28460
+ hls.on(Hls.Events.LEVELS_UPDATED, this.#onLevelsChanged);
28461
+ }
28462
+ destroy() {
28463
+ this.#hls.off(Hls.Events.MANIFEST_PARSED, this.#onLevelsChanged);
28464
+ this.#hls.off(Hls.Events.LEVELS_UPDATED, this.#onLevelsChanged);
28465
+ if (policy.controller === this) policy.controller = void 0;
28466
+ super.destroy();
28467
+ }
28468
+ startCapping() {
28469
+ this.#capping = true;
28470
+ super.startCapping();
28471
+ }
28472
+ stopCapping() {
28473
+ this.#capping = false;
28474
+ super.stopCapping();
28475
+ }
28476
+ /**
28477
+ * hls.js derives its player-size ceiling from these two, so reporting an
28478
+ * unbounded measurement is how `capToPlayerSize: false` switches that
28479
+ * ceiling off while leaving the rest of the base controller intact.
28480
+ *
28481
+ * Returning early from `getMaxLevel()` instead would be the obvious way to
28482
+ * skip the size cap, and it would also skip the levels `capLevelOnFPSDrop`
28483
+ * has restricted: those are filtered inside the same `super.getMaxLevel()`
28484
+ * call, and `restrictedLevels` is private, so there is no way to reapply
28485
+ * them afterwards. Neutralizing the input keeps one path for both.
28486
+ */
28487
+ get mediaWidth() {
28488
+ return this.#sizeApplies ? super.mediaWidth : Number.POSITIVE_INFINITY;
28489
+ }
28490
+ get mediaHeight() {
28491
+ return this.#sizeApplies ? super.mediaHeight : Number.POSITIVE_INFINITY;
28492
+ }
28493
+ get #sizeApplies() {
28494
+ return policy.capToPlayerSize && !this.#measuringWithoutSize;
28495
+ }
28496
+ /**
28497
+ * What `super` allows with player size out of the picture — the ladder minus
28498
+ * whatever `capLevelOnFPSDrop` has restricted. Reached through the same
28499
+ * unbounded-measurement seam the toggle uses, since `restrictedLevels` is
28500
+ * private and not readable any other way.
28501
+ */
28502
+ #topAllowedLevel(capLevelIndex) {
28503
+ this.#measuringWithoutSize = true;
28504
+ try {
28505
+ return super.getMaxLevel(capLevelIndex);
28506
+ } finally {
28507
+ this.#measuringWithoutSize = false;
28508
+ }
28509
+ }
28510
+ /**
28511
+ * Intersect hls.js's player-size ceiling with the requested one. Deferring
28512
+ * to `super` first keeps the behavior it owns — notably the level
28513
+ * restrictions `capLevelOnFPSDrop` accumulates.
28514
+ *
28515
+ * The translation from resolution to level index happens here, not when the
28516
+ * policy is set, because levels arrive after the option does and shift
28517
+ * whenever hls.js drops one.
28518
+ */
28519
+ getMaxLevel(capLevelIndex) {
28520
+ const { levels } = this.#hls;
28521
+ let ceiling = super.getMaxLevel(capLevelIndex);
28522
+ if (policy.capToPlayerSize && ceiling >= 0) {
28523
+ const floor = levelIndexAtOrAbove(levels, policy.minAutoResolution);
28524
+ if (floor !== void 0) ceiling = Math.min(Math.max(ceiling, floor), this.#topAllowedLevel(capLevelIndex));
28525
+ }
28526
+ const byResolution = levelIndexAtOrBelow(levels, policy.maxAutoResolution);
28527
+ if (byResolution !== void 0) ceiling = Math.min(ceiling, byResolution);
28528
+ return Math.min(ceiling, capLevelIndex);
28529
+ }
28530
+ /**
28531
+ * hls.js measures the element here and writes the ceiling it derives. It
28532
+ * backs out entirely when the element has no measurable size — sensible for
28533
+ * a cap that *is* the element's size, but a requested resolution ceiling
28534
+ * does not depend on layout. A player that is hidden, detached, or not laid
28535
+ * out yet still has to honor it.
28536
+ */
28537
+ detectPlayerSize() {
28538
+ super.detectPlayerSize();
28539
+ if (super.mediaWidth > 0 && super.mediaHeight > 0) return;
28540
+ this.#applyResolutionCap();
28541
+ }
28542
+ apply() {
28543
+ if (this.#capping) {
28544
+ this.detectPlayerSize();
28545
+ return;
28546
+ }
28547
+ this.#applyResolutionCap();
28548
+ }
28549
+ /**
28550
+ * The ceiling on its own, for when the size measurement is unavailable.
28551
+ *
28552
+ * Neither `capToPlayerSize` nor `minAutoResolution` reaches this path, and
28553
+ * neither has anything to do here: both describe a cap derived from the
28554
+ * element's size, and this is precisely the case where no such cap exists —
28555
+ * there is none to switch off, and none for a floor to lift.
28556
+ */
28557
+ #applyResolutionCap() {
28558
+ const { levels } = this.#hls;
28559
+ if (!levels?.length) return;
28560
+ this.#hls.autoLevelCapping = levelIndexAtOrBelow(levels, policy.maxAutoResolution) ?? -1;
28561
+ }
28562
+ #onLevelsChanged = () => this.apply();
28563
+ };
28564
+ }
28565
+
28359
28566
  //#endregion
28360
28567
  //#region ../media/dist/dev/dom/hls-js/drm.js
28361
28568
  /**
@@ -29045,17 +29252,55 @@ const defaultHlsConfig = {
29045
29252
  };
29046
29253
  var HlsJsOnlyMediaBase = class extends HTMLVideoElementHost {
29047
29254
  #engine = null;
29255
+ #capPolicy = {
29256
+ maxAutoResolution: void 0,
29257
+ capToPlayerSize: true,
29258
+ minAutoResolution: DEFAULT_MIN_AUTO_RESOLUTION
29259
+ };
29048
29260
  constructor(params) {
29049
29261
  super();
29050
- this.#engine = new Hls({
29262
+ const config = {
29051
29263
  ...defaultHlsConfig,
29052
29264
  ...params.config
29265
+ };
29266
+ this.#engine = new Hls({
29267
+ ...config,
29268
+ capLevelController: createCapLevelController(this.#capPolicy, config.capLevelController)
29053
29269
  });
29054
29270
  setupDrm(this.#engine);
29055
29271
  }
29056
29272
  get engine() {
29057
29273
  return this.#engine;
29058
29274
  }
29275
+ /** Ceiling on automatic rendition selection. See `HlsSource.maxAutoResolution`. */
29276
+ get maxAutoResolution() {
29277
+ return this.#capPolicy.maxAutoResolution;
29278
+ }
29279
+ set maxAutoResolution(value) {
29280
+ if (this.#capPolicy.maxAutoResolution === value) return;
29281
+ this.#capPolicy.maxAutoResolution = value;
29282
+ this.#capPolicy.controller?.apply();
29283
+ }
29284
+ /** Whether the rendered size caps selection. See `HlsSource.capRenditionToPlayerSize`. */
29285
+ get capRenditionToPlayerSize() {
29286
+ return this.#capPolicy.capToPlayerSize;
29287
+ }
29288
+ set capRenditionToPlayerSize(value) {
29289
+ const next = value ?? true;
29290
+ if (this.#capPolicy.capToPlayerSize === next) return;
29291
+ this.#capPolicy.capToPlayerSize = next;
29292
+ this.#capPolicy.controller?.apply();
29293
+ }
29294
+ /** Floor on the player-size cap. See `HlsSource.minAutoResolution`. */
29295
+ get minAutoResolution() {
29296
+ return this.#capPolicy.minAutoResolution ?? "720p";
29297
+ }
29298
+ set minAutoResolution(value) {
29299
+ const next = value ?? "720p";
29300
+ if (this.#capPolicy.minAutoResolution === next) return;
29301
+ this.#capPolicy.minAutoResolution = next;
29302
+ this.#capPolicy.controller?.apply();
29303
+ }
29059
29304
  get src() {
29060
29305
  return this.#engine?.url ?? "";
29061
29306
  }
@@ -29168,12 +29413,15 @@ var HlsJsMedia = class extends HTMLVideoElementHost {
29168
29413
  return this.#src;
29169
29414
  }
29170
29415
  set src(src) {
29171
- const { type, preferPlayback, drm, engine } = this.#source ?? {};
29416
+ const { type, preferPlayback, drm, engine, maxAutoResolution, capRenditionToPlayerSize, minAutoResolution } = this.#source ?? {};
29172
29417
  const next = {
29173
29418
  ...type && { type },
29174
29419
  ...preferPlayback && { preferPlayback },
29175
29420
  ...drm && { drm },
29176
29421
  ...engine && { engine },
29422
+ ...maxAutoResolution && { maxAutoResolution },
29423
+ ...capRenditionToPlayerSize !== void 0 && { capRenditionToPlayerSize },
29424
+ ...minAutoResolution && { minAutoResolution },
29177
29425
  ...src && { src }
29178
29426
  };
29179
29427
  this.source = Object.keys(next).length > 0 ? next : null;
@@ -29196,6 +29444,7 @@ var HlsJsMedia = class extends HTMLVideoElementHost {
29196
29444
  const srcChanged = this.#src !== src;
29197
29445
  this.#source = source;
29198
29446
  this.#src = src;
29447
+ this.#applyRenditionCaps();
29199
29448
  this.dispatchEvent(new Event("sourcechange"));
29200
29449
  if (srcChanged || this.#shouldEngineUpdate(this.#engineConfigKey())) this.#requestLoad();
29201
29450
  }
@@ -29248,14 +29497,26 @@ var HlsJsMedia = class extends HTMLVideoElementHost {
29248
29497
  if (this.#shouldEngineUpdate(this.#engineConfigKey())) {
29249
29498
  this.#engineDestroy();
29250
29499
  this.#prevEngineConfigKey = this.#engineConfigKey();
29251
- const { type, preferPlayback, drm, engine } = this.#source ?? {};
29500
+ const { type, preferPlayback, drm, engine, maxAutoResolution, capRenditionToPlayerSize, minAutoResolution } = this.#source ?? {};
29252
29501
  const { hlsJs, nativeHls } = engine ?? {};
29253
29502
  const contentType = type ?? inferContentType(this.src);
29254
29503
  const useMse = Hls.isSupported() && contentType === ContentTypes.M3U8 && preferPlayback !== PlaybackTypes.NATIVE;
29504
+ if (!useMse) {
29505
+ const ignored = Object.entries({
29506
+ maxAutoResolution,
29507
+ capRenditionToPlayerSize,
29508
+ minAutoResolution
29509
+ }).filter(([, value]) => value !== void 0).map(([key]) => `\`${key}\``);
29510
+ if (ignored.length > 0) {
29511
+ const [verb, pronoun] = ignored.length > 1 ? ["require", "them"] : ["requires", "it"];
29512
+ console.warn(`[vjs-media] ${ignored.join(", ")} ${verb} the hls.js (MSE) engine; native HLS playback ignores ${pronoun}.`);
29513
+ }
29514
+ }
29255
29515
  this.#delegate = useMse ? new HlsJsOnlyMedia({ config: withDrmSystems(hlsJs, drm) }) : this.#createNativeDelegate(drm, nativeHls, hlsJs);
29256
29516
  bridgeEvents(this.#delegate, this);
29257
29517
  if (this.#isUserStreamType) this.#delegate.streamType = this.#streamType;
29258
29518
  this.#delegate.preload = this.preload;
29519
+ this.#applyRenditionCaps();
29259
29520
  if (this.#mediaElement) this.#delegate.attach(this.#mediaElement);
29260
29521
  }
29261
29522
  if (this.#delegate) {
@@ -29283,6 +29544,14 @@ var HlsJsMedia = class extends HTMLVideoElementHost {
29283
29544
  if (Object.keys(source).length > 0) media.source = source;
29284
29545
  return media;
29285
29546
  }
29547
+ /** Push the source's rendition caps down; only the hls.js engine has a lever. */
29548
+ #applyRenditionCaps() {
29549
+ if (this.#delegate instanceof HlsJsOnlyMedia) {
29550
+ this.#delegate.maxAutoResolution = this.#source?.maxAutoResolution;
29551
+ this.#delegate.capRenditionToPlayerSize = this.#source?.capRenditionToPlayerSize;
29552
+ this.#delegate.minAutoResolution = this.#source?.minAutoResolution;
29553
+ }
29554
+ }
29286
29555
  #stopTargetLoadStartEvent = (event) => {
29287
29556
  if (!(event instanceof HlsMediaEvent)) event.stopImmediatePropagation();
29288
29557
  };
@@ -29343,4 +29612,4 @@ function inferContentType(src) {
29343
29612
 
29344
29613
  //#endregion
29345
29614
  export { HlsJsMedia as t };
29346
- //# sourceMappingURL=media-Cp3acYc8.js.map
29615
+ //# sourceMappingURL=media-BavrGKqa.js.map