@gcorevideo/player 2.18.3 → 2.19.0

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 (349) hide show
  1. package/assets/audio-selector/style.scss +156 -0
  2. package/assets/audio-selector/track-selector.ejs +12 -0
  3. package/assets/big-mute-button/big-mute-button.ejs +3 -0
  4. package/assets/big-mute-button/big-mute-button.scss +57 -0
  5. package/assets/bottom-gear/bottomgear.ejs +12 -0
  6. package/assets/bottom-gear/gear-sub-menu.scss +95 -0
  7. package/assets/bottom-gear/gear.scss +79 -0
  8. package/assets/clappr-nerd-stats/button.ejs +4 -0
  9. package/assets/clappr-nerd-stats/clappr-nerd-stats.ejs +212 -0
  10. package/assets/clappr-nerd-stats/clappr-nerd-stats.scss +488 -0
  11. package/assets/clappr-nerd-stats/options-list.ejs +9 -0
  12. package/assets/clappr-nerd-stats/settings.ejs +12 -0
  13. package/assets/clappr-nerd-stats/speedtest/speedtest.worker.js +775 -0
  14. package/assets/clips/clips.scss +3 -0
  15. package/assets/context-menu/context_menu.ejs +8 -0
  16. package/assets/context-menu/context_menu.scss +31 -0
  17. package/assets/dvr-controls/dvr_controls.scss +136 -0
  18. package/assets/dvr-controls/index.ejs +2 -0
  19. package/assets/error-screen/error_screen.ejs +13 -0
  20. package/assets/error-screen/error_screen.scss +40 -0
  21. package/assets/icons/new/arrow-left.svg +5 -0
  22. package/assets/icons/new/arrow-right.svg +5 -0
  23. package/assets/icons/new/check.svg +5 -0
  24. package/assets/icons/new/close.svg +12 -0
  25. package/assets/icons/new/full.svg +8 -0
  26. package/assets/icons/new/fullscreen-off.svg +14 -0
  27. package/assets/icons/new/fullscreen-on.svg +14 -0
  28. package/assets/icons/new/gear-hd.svg +16 -0
  29. package/assets/icons/new/gear.svg +12 -0
  30. package/assets/icons/new/hd.svg +8 -0
  31. package/assets/icons/new/pause.svg +5 -0
  32. package/assets/icons/new/pip.svg +5 -0
  33. package/assets/icons/new/play.svg +10 -0
  34. package/assets/icons/new/replayleft.svg +5 -0
  35. package/assets/icons/new/replayright.svg +5 -0
  36. package/assets/icons/new/speed.svg +5 -0
  37. package/assets/icons/new/stats.svg +3 -0
  38. package/assets/icons/new/stop.svg +3 -0
  39. package/assets/icons/new/subtitles-off.svg +5 -0
  40. package/assets/icons/new/subtitles-on.svg +6 -0
  41. package/assets/icons/new/volume-max.svg +5 -0
  42. package/assets/icons/new/volume-min.svg +5 -0
  43. package/assets/icons/new/volume-off.svg +5 -0
  44. package/assets/icons/old/cardboard.svg +4 -0
  45. package/assets/icons/old/close-share.svg +13 -0
  46. package/assets/icons/old/close.svg +13 -0
  47. package/assets/icons/old/fb.svg +13 -0
  48. package/assets/icons/old/fullscreen.svg +12 -0
  49. package/assets/icons/old/language.svg +1 -0
  50. package/assets/icons/old/pause.svg +12 -0
  51. package/assets/icons/old/play.svg +12 -0
  52. package/assets/icons/old/quality-arrow.svg +13 -0
  53. package/assets/icons/old/reload.svg +4 -0
  54. package/assets/icons/old/share.svg +13 -0
  55. package/assets/icons/old/sound-off.svg +15 -0
  56. package/assets/icons/old/sound-on.svg +15 -0
  57. package/assets/icons/old/streams.svg +3 -0
  58. package/assets/icons/old/twitter.svg +13 -0
  59. package/assets/icons/old/wn.svg +15 -0
  60. package/assets/icons/standard/01-play.svg +3 -0
  61. package/assets/icons/standard/02-pause.svg +3 -0
  62. package/assets/icons/standard/03-stop.svg +3 -0
  63. package/assets/icons/standard/04-volume.svg +3 -0
  64. package/assets/icons/standard/05-mute.svg +3 -0
  65. package/assets/icons/standard/06-expand.svg +3 -0
  66. package/assets/icons/standard/07-shrink.svg +3 -0
  67. package/assets/icons/standard/08-hd.svg +3 -0
  68. package/assets/icons/standard/09-cc.svg +8 -0
  69. package/assets/icons/standard/10-reload.svg +4 -0
  70. package/assets/level-selector/button.ejs +8 -0
  71. package/assets/level-selector/list.ejs +22 -0
  72. package/assets/level-selector/style.scss +4 -0
  73. package/assets/logo/styles/logo.scss +10 -0
  74. package/assets/logo/templates/logo.ejs +3 -0
  75. package/assets/media-control/closed-hand.cur +0 -0
  76. package/assets/media-control/container.scss +57 -0
  77. package/assets/media-control/media-control.ejs +133 -0
  78. package/assets/media-control/media-control.scss +390 -0
  79. package/assets/media-control/plugins.scss +94 -0
  80. package/assets/media-control/width270.scss +50 -0
  81. package/assets/media-control/width370.scss +263 -0
  82. package/assets/multi-camera/multicamera.ejs +29 -0
  83. package/assets/multi-camera/style.scss +176 -0
  84. package/assets/picture-in-picture/button.ejs +3 -0
  85. package/assets/picture-in-picture/button.scss +11 -0
  86. package/assets/playback-rate/button.ejs +6 -0
  87. package/assets/playback-rate/list.ejs +14 -0
  88. package/assets/playback-rate/playback-rate-selector.ejs +9 -0
  89. package/assets/poster/poster.ejs +1 -0
  90. package/assets/poster/poster.scss +32 -0
  91. package/assets/seek-time/seek-time.html +2 -0
  92. package/assets/seek-time/seek-time.scss +38 -0
  93. package/assets/share/share.ejs +37 -0
  94. package/assets/share/style.scss +104 -0
  95. package/assets/skip-time/skip-time.ejs +8 -0
  96. package/assets/skip-time/style.scss +24 -0
  97. package/assets/spinner-three-bounce/spinner.ejs +3 -0
  98. package/assets/spinner-three-bounce/spinner.scss +44 -0
  99. package/assets/style/main.scss +50 -0
  100. package/assets/style/theme.scss +42 -0
  101. package/assets/style/variables.scss +7 -0
  102. package/assets/subtitles/combobox copy.ejs +16 -0
  103. package/assets/subtitles/combobox.ejs +16 -0
  104. package/assets/subtitles/string.ejs +3 -0
  105. package/assets/subtitles/style.scss +99 -0
  106. package/assets/thumbnails/scrub-thumbnails.ejs +10 -0
  107. package/assets/thumbnails/style.scss +75 -0
  108. package/assets/vast-ads/style.scss +112 -0
  109. package/assets/video360/button.ejs +1 -0
  110. package/assets/video360/style.scss +8 -0
  111. package/build/vite-raw-plugin.js +18 -0
  112. package/dist/index.js +1 -1
  113. package/dist/plugins/index.css +2164 -0
  114. package/dist/plugins/index.js/index.plugins.js +40837 -0
  115. package/dist/plugins/index.plugins.js +40837 -0
  116. package/lib/index.core.d.ts +15 -0
  117. package/lib/index.core.d.ts.map +1 -0
  118. package/lib/index.core.js +14 -0
  119. package/lib/index.d.ts +2 -14
  120. package/lib/index.d.ts.map +1 -1
  121. package/lib/index.js +2 -14
  122. package/lib/index.plugins.d.ts +38 -0
  123. package/lib/index.plugins.d.ts.map +1 -0
  124. package/lib/index.plugins.js +40 -0
  125. package/lib/plugins/audio-selector/AudioSelector.d.ts +3 -3
  126. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  127. package/lib/plugins/audio-selector/AudioSelector.js +6 -12
  128. package/lib/plugins/big-mute-button/BigMuteButton.d.ts +2 -2
  129. package/lib/plugins/big-mute-button/BigMuteButton.d.ts.map +1 -1
  130. package/lib/plugins/big-mute-button/BigMuteButton.js +7 -12
  131. package/lib/plugins/bottom-gear/BottomGear.d.ts +4 -3
  132. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  133. package/lib/plugins/bottom-gear/BottomGear.js +11 -16
  134. package/lib/plugins/build.d.ts +2 -0
  135. package/lib/plugins/build.d.ts.map +1 -0
  136. package/lib/plugins/build.js +1 -0
  137. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +44 -0
  138. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -0
  139. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +294 -0
  140. package/lib/plugins/clappr-nerd-stats/formatter.d.ts +8 -0
  141. package/lib/plugins/clappr-nerd-stats/formatter.d.ts.map +1 -0
  142. package/lib/plugins/clappr-nerd-stats/formatter.js +91 -0
  143. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.d.ts +54 -0
  144. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.d.ts.map +1 -0
  145. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.js +335 -0
  146. package/lib/plugins/clappr-nerd-stats/speedtest/index.d.ts +9 -0
  147. package/lib/plugins/clappr-nerd-stats/speedtest/index.d.ts.map +1 -0
  148. package/lib/plugins/clappr-nerd-stats/speedtest/index.js +154 -0
  149. package/lib/plugins/clappr-nerd-stats/speedtest/types.d.ts +6 -0
  150. package/lib/plugins/clappr-nerd-stats/speedtest/types.d.ts.map +1 -0
  151. package/lib/plugins/clappr-nerd-stats/speedtest/types.js +1 -0
  152. package/lib/plugins/clappr-nerd-stats/types.d.ts +4 -0
  153. package/lib/plugins/clappr-nerd-stats/types.d.ts.map +1 -0
  154. package/lib/plugins/clappr-nerd-stats/types.js +1 -0
  155. package/lib/plugins/clappr-stats/ClapprStats.d.ts +56 -0
  156. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -0
  157. package/lib/plugins/clappr-stats/ClapprStats.js +332 -0
  158. package/lib/plugins/clappr-stats/types.d.ts +50 -0
  159. package/lib/plugins/clappr-stats/types.d.ts.map +1 -0
  160. package/lib/plugins/clappr-stats/types.js +5 -0
  161. package/lib/plugins/clappr-stats/utils.d.ts +3 -0
  162. package/lib/plugins/clappr-stats/utils.d.ts.map +1 -0
  163. package/lib/plugins/clappr-stats/utils.js +40 -0
  164. package/lib/plugins/click-to-pause/ClickToPause.d.ts +2 -2
  165. package/lib/plugins/click-to-pause/ClickToPause.d.ts.map +1 -1
  166. package/lib/plugins/click-to-pause/ClickToPause.js +4 -6
  167. package/lib/plugins/clips/Clips.d.ts +23 -0
  168. package/lib/plugins/clips/Clips.d.ts.map +1 -0
  169. package/lib/plugins/clips/Clips.js +109 -0
  170. package/lib/plugins/context-menu/ContextMenu.d.ts +36 -0
  171. package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -0
  172. package/lib/plugins/context-menu/ContextMenu.js +102 -0
  173. package/lib/plugins/disable-controls/DisableControls.d.ts +1 -1
  174. package/lib/plugins/disable-controls/DisableControls.d.ts.map +1 -1
  175. package/lib/plugins/disable-controls/DisableControls.js +3 -5
  176. package/lib/plugins/dvr-controls/DVRControls.d.ts +4 -4
  177. package/lib/plugins/dvr-controls/DVRControls.d.ts.map +1 -1
  178. package/lib/plugins/dvr-controls/DVRControls.js +5 -4
  179. package/lib/plugins/error-screen/ErrorScreen.d.ts +44 -0
  180. package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -0
  181. package/lib/plugins/error-screen/ErrorScreen.js +179 -0
  182. package/lib/plugins/favicon/Favicon.d.ts +24 -0
  183. package/lib/plugins/favicon/Favicon.d.ts.map +1 -0
  184. package/lib/plugins/favicon/Favicon.js +106 -0
  185. package/lib/plugins/google-analytics/GoogleAnalytics.d.ts +30 -0
  186. package/lib/plugins/google-analytics/GoogleAnalytics.d.ts.map +1 -0
  187. package/lib/plugins/google-analytics/GoogleAnalytics.js +114 -0
  188. package/lib/plugins/index.d.ts +38 -0
  189. package/lib/plugins/index.d.ts.map +1 -0
  190. package/lib/plugins/index.js +40 -0
  191. package/lib/plugins/kibo/index.d.ts +23 -0
  192. package/lib/plugins/kibo/index.d.ts.map +1 -0
  193. package/lib/plugins/kibo/index.js +199 -0
  194. package/lib/plugins/level-selector/LevelSelector.d.ts +48 -17
  195. package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
  196. package/lib/plugins/level-selector/LevelSelector.js +169 -155
  197. package/lib/plugins/logo/Logo.d.ts +29 -0
  198. package/lib/plugins/logo/Logo.d.ts.map +1 -0
  199. package/lib/plugins/logo/Logo.js +181 -0
  200. package/lib/plugins/logo/utils/index.d.ts +22 -0
  201. package/lib/plugins/logo/utils/index.d.ts.map +1 -0
  202. package/lib/plugins/logo/utils/index.js +32 -0
  203. package/lib/plugins/media-control/MediaControl.d.ts +20 -25
  204. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  205. package/lib/plugins/media-control/MediaControl.js +136 -106
  206. package/lib/plugins/multi-camera/MultiCamera.d.ts +59 -0
  207. package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -0
  208. package/lib/plugins/multi-camera/MultiCamera.js +353 -0
  209. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +20 -0
  210. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -0
  211. package/lib/plugins/picture-in-picture/PictureInPicture.js +68 -0
  212. package/lib/plugins/playback-rate/PlaybackRate.d.ts +42 -0
  213. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -0
  214. package/lib/plugins/playback-rate/PlaybackRate.js +205 -0
  215. package/lib/plugins/poster/Poster.d.ts +18 -17
  216. package/lib/plugins/poster/Poster.d.ts.map +1 -1
  217. package/lib/plugins/poster/Poster.js +83 -37
  218. package/lib/plugins/seek-time/SeekTime.d.ts +38 -0
  219. package/lib/plugins/seek-time/SeekTime.d.ts.map +1 -0
  220. package/lib/plugins/seek-time/SeekTime.js +153 -0
  221. package/lib/plugins/share/Share.d.ts +38 -0
  222. package/lib/plugins/share/Share.d.ts.map +1 -0
  223. package/lib/plugins/share/Share.js +122 -0
  224. package/lib/plugins/skip-time/SkipTime.d.ts +28 -0
  225. package/lib/plugins/skip-time/SkipTime.d.ts.map +1 -0
  226. package/lib/plugins/skip-time/SkipTime.js +86 -0
  227. package/lib/plugins/source-controller/SourceController.d.ts +41 -0
  228. package/lib/plugins/source-controller/SourceController.d.ts.map +1 -0
  229. package/lib/plugins/source-controller/SourceController.js +199 -0
  230. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +26 -0
  231. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -0
  232. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +117 -0
  233. package/lib/plugins/statistics/Statistics.d.ts +52 -0
  234. package/lib/plugins/statistics/Statistics.d.ts.map +1 -0
  235. package/lib/plugins/statistics/Statistics.js +130 -0
  236. package/lib/plugins/subtitles/Subtitles.d.ts +61 -0
  237. package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -0
  238. package/lib/plugins/subtitles/Subtitles.js +354 -0
  239. package/lib/plugins/thumbnails/Thumbnails.d.ts +47 -0
  240. package/lib/plugins/thumbnails/Thumbnails.d.ts.map +1 -0
  241. package/lib/plugins/thumbnails/Thumbnails.js +414 -0
  242. package/lib/plugins/types.d.ts +8 -0
  243. package/lib/plugins/types.d.ts.map +1 -0
  244. package/lib/plugins/types.js +1 -0
  245. package/lib/plugins/utils.d.ts +5 -0
  246. package/lib/plugins/utils.d.ts.map +1 -0
  247. package/lib/plugins/utils.js +68 -0
  248. package/lib/plugins/vast-ads/VastAds.d.ts +72 -0
  249. package/lib/plugins/vast-ads/VastAds.d.ts.map +1 -0
  250. package/lib/plugins/vast-ads/VastAds.js +686 -0
  251. package/lib/plugins/vast-ads/loaderxml.d.ts +32 -0
  252. package/lib/plugins/vast-ads/loaderxml.d.ts.map +1 -0
  253. package/lib/plugins/vast-ads/loaderxml.js +226 -0
  254. package/lib/plugins/vast-ads/roll.d.ts +60 -0
  255. package/lib/plugins/vast-ads/roll.d.ts.map +1 -0
  256. package/lib/plugins/vast-ads/roll.js +415 -0
  257. package/lib/plugins/vast-ads/rollmanager.d.ts +62 -0
  258. package/lib/plugins/vast-ads/rollmanager.d.ts.map +1 -0
  259. package/lib/plugins/vast-ads/rollmanager.js +347 -0
  260. package/lib/plugins/vast-ads/sctemanager.d.ts +18 -0
  261. package/lib/plugins/vast-ads/sctemanager.d.ts.map +1 -0
  262. package/lib/plugins/vast-ads/sctemanager.js +116 -0
  263. package/lib/plugins/vast-ads/types.d.ts +12 -0
  264. package/lib/plugins/vast-ads/types.d.ts.map +1 -0
  265. package/lib/plugins/vast-ads/types.js +1 -0
  266. package/lib/plugins/vast-ads/urlhandler.d.ts +4 -0
  267. package/lib/plugins/vast-ads/urlhandler.d.ts.map +1 -0
  268. package/lib/plugins/vast-ads/urlhandler.js +30 -0
  269. package/lib/plugins/vast-ads/xmlhttprequest.d.ts +6 -0
  270. package/lib/plugins/vast-ads/xmlhttprequest.d.ts.map +1 -0
  271. package/lib/plugins/vast-ads/xmlhttprequest.js +39 -0
  272. package/lib/plugins/vast-ads/xmlmerge.d.ts +12 -0
  273. package/lib/plugins/vast-ads/xmlmerge.d.ts.map +1 -0
  274. package/lib/plugins/vast-ads/xmlmerge.js +82 -0
  275. package/lib/plugins/volume-fade/VolumeFade.d.ts +21 -0
  276. package/lib/plugins/volume-fade/VolumeFade.d.ts.map +1 -0
  277. package/lib/plugins/volume-fade/VolumeFade.js +90 -0
  278. package/package.json +10 -2
  279. package/rollup.config.js +32 -2
  280. package/src/index.core.ts +15 -0
  281. package/src/index.plugins.ts +42 -0
  282. package/src/index.ts +2 -15
  283. package/src/plugins/audio-selector/AudioSelector.ts +370 -0
  284. package/src/plugins/big-mute-button/BigMuteButton.ts +187 -0
  285. package/src/plugins/bottom-gear/BottomGear.ts +122 -0
  286. package/src/plugins/build.ts +1 -0
  287. package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +369 -0
  288. package/src/plugins/clappr-nerd-stats/formatter.ts +109 -0
  289. package/src/plugins/clappr-nerd-stats/speedtest/Speedtest.ts +414 -0
  290. package/src/plugins/clappr-nerd-stats/speedtest/index.ts +183 -0
  291. package/src/plugins/clappr-nerd-stats/speedtest/types.ts +5 -0
  292. package/src/plugins/clappr-nerd-stats/types.ts +3 -0
  293. package/src/plugins/clappr-stats/ClapprStats.ts +441 -0
  294. package/src/plugins/clappr-stats/types.ts +52 -0
  295. package/src/plugins/clappr-stats/utils.ts +42 -0
  296. package/src/plugins/click-to-pause/ClickToPause.ts +93 -0
  297. package/src/plugins/clips/Clips.ts +152 -0
  298. package/src/plugins/context-menu/ContextMenu.ts +134 -0
  299. package/src/plugins/disable-controls/DisableControls.ts +81 -0
  300. package/src/plugins/dvr-controls/DvrControls.ts +131 -0
  301. package/src/plugins/error-screen/ErrorScreen.ts +241 -0
  302. package/src/plugins/favicon/Favicon.ts +137 -0
  303. package/src/plugins/ga-events/GaEvents.js +395 -0
  304. package/src/plugins/ga-events/ga-tracking.js +46 -0
  305. package/src/plugins/google-analytics/GoogleAnalytics.ts +147 -0
  306. package/src/plugins/index.ts +42 -0
  307. package/src/plugins/kibo/index.ts +244 -0
  308. package/src/plugins/level-selector/LevelSelector.ts +400 -0
  309. package/src/plugins/level-selector/__tests__/LevelSelector.test.ts +72 -0
  310. package/src/plugins/level-selector/__tests__/__snapshots__/LevelSelector.test.ts.snap +11 -0
  311. package/src/plugins/logo/Logo.ts +233 -0
  312. package/src/plugins/logo/utils/index.ts +46 -0
  313. package/src/plugins/media-control/MediaControl.ts +1383 -0
  314. package/src/plugins/multi-camera/MultiCamera copy.xts +414 -0
  315. package/src/plugins/multi-camera/MultiCamera.ts +426 -0
  316. package/src/plugins/picture-in-picture/PictureInPicture.ts +87 -0
  317. package/src/plugins/playback-rate/PlaybackRate.ts +269 -0
  318. package/src/plugins/poster/Poster.ts +298 -0
  319. package/src/plugins/seek-time/SeekTime.ts +191 -0
  320. package/src/plugins/share/Share.ts +148 -0
  321. package/src/plugins/skip-time/SkipTime.ts +109 -0
  322. package/src/plugins/source-controller/SourceController.ts +239 -0
  323. package/src/plugins/source-controller/__tests__/SourceController.test.ts +230 -0
  324. package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +135 -0
  325. package/src/plugins/statistics/Statistics copy.xts +296 -0
  326. package/src/plugins/statistics/Statistics.ts +207 -0
  327. package/src/plugins/subtitles/Subtitles.ts +505 -0
  328. package/src/plugins/thumbnails/Thumbnails.ts +530 -0
  329. package/src/plugins/types.ts +7 -0
  330. package/src/plugins/typings/globals.d.ts +10 -0
  331. package/src/plugins/typings/parse-srt.d.ts +14 -0
  332. package/src/plugins/typings/workers.d.ts +3 -0
  333. package/src/plugins/utils.ts +77 -0
  334. package/src/plugins/vast-ads/VastAds.ts +915 -0
  335. package/src/plugins/vast-ads/loaderxml.ts +260 -0
  336. package/src/plugins/vast-ads/roll.ts +492 -0
  337. package/src/plugins/vast-ads/rollmanager.ts +403 -0
  338. package/src/plugins/vast-ads/sctemanager.ts +134 -0
  339. package/src/plugins/vast-ads/types.ts +14 -0
  340. package/src/plugins/vast-ads/urlhandler.ts +37 -0
  341. package/src/plugins/vast-ads/xmlhttprequest.ts +44 -0
  342. package/src/plugins/vast-ads/xmlmerge.ts +96 -0
  343. package/src/plugins/video360/VRControls.js +104 -0
  344. package/src/plugins/video360/VREffect.js +422 -0
  345. package/src/plugins/video360/Video360.js +979 -0
  346. package/src/plugins/video360/orbit-oriention-controls.js +1002 -0
  347. package/src/plugins/video360/utils.js +49 -0
  348. package/src/plugins/volume-fade/VolumeFade.ts +109 -0
  349. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,244 @@
1
+ /* eslint-disable */
2
+ // Kibo is released under the MIT License. Copyright (c) 2013 marquete.
3
+ // see https://github.com/marquete/kibo
4
+
5
+ type KeyboardEventHandler = (e: KeyboardEvent) => boolean | undefined;
6
+
7
+ type KeyboardEventBindings = {
8
+ any: KeyboardEventHandler[];
9
+ [key: string]: KeyboardEventHandler[];
10
+ }
11
+
12
+ type UpDown = 'up' | 'down';
13
+
14
+ export class Kibo {
15
+ private lastKeyCode = -1;
16
+
17
+ private lastModifiers: Record<string, boolean> = {};
18
+
19
+ private keysDown: KeyboardEventBindings = { any: [] }; // TODO
20
+ private keysUp: KeyboardEventBindings = { any: [] };
21
+
22
+ private downHandler: (e: KeyboardEvent) => void;
23
+
24
+ private upHandler: (e: KeyboardEvent) => void;
25
+
26
+ constructor(private element: Document | Element = window.document) {
27
+ for (const mod of MODIFIERS) {
28
+ this.lastModifiers[mod] = false;
29
+ }
30
+
31
+ this.keysDown = { any: [] };
32
+ this.keysUp = { any: [] };
33
+ this.downHandler = this.handler('down');
34
+ this.upHandler = this.handler('up');
35
+
36
+ registerEvent(this.element, 'keydown', this.downHandler);
37
+ registerEvent(this.element, 'keyup', this.upHandler);
38
+ const unloader = () => {
39
+ unregisterEvent(this.element, 'keydown', this.downHandler);
40
+ unregisterEvent(this.element, 'keyup', this.upHandler);
41
+ unregisterEvent(window, 'unload', unloader);
42
+ };
43
+ registerEvent(window, 'unload', unloader);
44
+ }
45
+
46
+ private handler(upOrDown: UpDown = 'up') {
47
+ return (e: KeyboardEvent) => {
48
+ this.lastKeyCode = e.keyCode; // TODO
49
+ for (const mod of MODIFIERS) {
50
+ this.lastModifiers[mod] = e[(mod + 'Key') as 'shiftKey' | 'ctrlKey' | 'altKey'];
51
+ }
52
+ // for (i = 0; i < Kibo.MODIFIERS.length; i++) {
53
+ // that.lastModifiers[Kibo.MODIFIERS[i]] = e[Kibo.MODIFIERS[i] + 'Key'];
54
+ // }
55
+ // if (Kibo.arrayIncludes(Kibo.MODIFIERS, Kibo.keyName(that.lastKeyCode))) {
56
+ // that.lastModifiers[Kibo.keyName(that.lastKeyCode)] = true;
57
+ // }
58
+ const key = keyName(this.lastKeyCode);
59
+ if (key && MODIFIERS.includes(key)) {
60
+ this.lastModifiers[key] = true;
61
+ }
62
+
63
+ const regKeys: KeyboardEventBindings = upOrDown === 'up' ? this.keysUp : this.keysDown;
64
+ // this['keys' + capitalize(upOrDown)]; // TODO
65
+
66
+ // for (i = 0; i < registeredKeys.any.length; i++) {
67
+ // if ((registeredKeys.any[i](e) === false) && e.preventDefault) {
68
+ // e.preventDefault();
69
+ // }
70
+ // }
71
+ for (const h of regKeys.any) {
72
+ if (h(e) === false && e.preventDefault) {
73
+ e.preventDefault();
74
+ }
75
+ }
76
+
77
+ const lastModifiersAndKey = this.lastModifiersAndKey();
78
+ if (regKeys[lastModifiersAndKey]) {
79
+ for (const h of regKeys[lastModifiersAndKey]) {
80
+ if ((h(e) === false) && e.preventDefault) {
81
+ e.preventDefault();
82
+ }
83
+ // for (i = 0; i < registeredKeys[lastModifiersAndKey].length; i++) {
84
+ // if ((registeredKeys[lastModifiersAndKey][i](e) === false) && e.preventDefault) {
85
+ // e.preventDefault();
86
+ // }
87
+ }
88
+ }
89
+ };
90
+ }
91
+
92
+ private registerKeys(upOrDown: UpDown, newKeys: string | string[], func: KeyboardEventHandler) {
93
+ const registeredKeys = upOrDown === 'up' ? this.keysUp : this.keysDown;
94
+
95
+ const normKeys = typeof newKeys === "string" ? [newKeys] : newKeys;
96
+
97
+ // for (i = 0; i < newKeys.length; i++) {
98
+ // // keys = newKeys[i];
99
+ // keys = modifiersAndKey(keys + '');
100
+
101
+ // if (registeredKeys[keys]) {
102
+ // registeredKeys[keys].push(func);
103
+ // } else {
104
+ // registeredKeys[keys] = [func];
105
+ // }
106
+ // }
107
+ for (const k of normKeys) {
108
+ const keys = modifiersAndKey(k);
109
+
110
+ if (registeredKeys[keys]) {
111
+ registeredKeys[keys].push(func);
112
+ } else {
113
+ registeredKeys[keys] = [func];
114
+ }
115
+ }
116
+
117
+ return this;
118
+ }
119
+
120
+ private unregisterKeys(upOrDown: UpDown, newKeys: string | string[], func: KeyboardEventHandler | null = null) {
121
+ const registeredKeys = upOrDown === 'up' ? this.keysUp : this.keysDown;
122
+ const normKeys = typeof newKeys === "string" ? [newKeys] : newKeys;
123
+
124
+ for (const k of normKeys) {
125
+ const keys = modifiersAndKey(k);
126
+ if (func === null) {
127
+ delete registeredKeys[keys];
128
+ } else {
129
+ if (registeredKeys[keys]) {
130
+ const p = registeredKeys[keys].indexOf(func);
131
+ if (p >= 0) {
132
+ registeredKeys[keys].splice(p, 1);
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
+ return this;
139
+ }
140
+
141
+ off(keys: string | string[]): Kibo {
142
+ return this.unregisterKeys('down', keys, null);
143
+ }
144
+
145
+ delegate(upOrDown: UpDown, keys: string | string[], func?: KeyboardEventHandler | null): Kibo {
146
+ return (func !== null && func !== undefined)
147
+ ? this.registerKeys(upOrDown, keys, func)
148
+ : this.unregisterKeys(upOrDown, keys, func);
149
+ }
150
+
151
+ down(keys: string | string[], func?: KeyboardEventHandler | null): Kibo {
152
+ return this.delegate('down', keys, func);
153
+ }
154
+
155
+ up(keys: string | string[], func?: KeyboardEventHandler | null): Kibo {
156
+ return this.delegate('up', keys, func);
157
+ }
158
+
159
+ lastKey(modifier?: string): string | boolean {
160
+ if (!modifier) {
161
+ return keyName(this.lastKeyCode);
162
+ }
163
+
164
+ return this.lastModifiers[modifier];
165
+ }
166
+
167
+ lastModifiersAndKey() {
168
+ const result = MODIFIERS.filter(m => this.lastKey(m));
169
+ const lastKey = keyName(this.lastKeyCode);
170
+ if (lastKey && !result.includes(lastKey)) {
171
+ result.push(lastKey);
172
+ }
173
+ return result.join(' ');
174
+ };
175
+ }
176
+
177
+ function registerEvent(element: Node | Window, eventName: string, func: (e: KeyboardEvent) => void): void {
178
+ element.addEventListener(eventName, func as EventListener, false);
179
+ }
180
+
181
+ function unregisterEvent(element: Node | Window, eventName: string, func: (e: KeyboardEvent) => void): void {
182
+ element.removeEventListener(eventName, func as EventListener, false);
183
+ }
184
+
185
+ const KEY_NAMES_BY_CODE: Record<number, string> = {
186
+ 8: 'backspace', 9: 'tab', 13: 'enter',
187
+ 16: 'shift', 17: 'ctrl', 18: 'alt',
188
+ 20: 'caps_lock',
189
+ 27: 'esc',
190
+ 32: 'space',
191
+ 37: 'left', 38: 'up', 39: 'right', 40: 'down',
192
+ 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', 54: '6', 55: '7', 56: '8', 57: '9',
193
+ 65: 'a', 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', 73: 'i', 74: 'j',
194
+ 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't',
195
+ 85: 'u', 86: 'v', 87: 'w', 88: 'x', 89: 'y', 90: 'z', 112: 'f1', 113: 'f2', 114: 'f3',
196
+ 115: 'f4', 116: 'f5', 117: 'f6', 118: 'f7', 119: 'f8', 120: 'f9', 121: 'f10', 122: 'f11', 123: 'f12'
197
+ };
198
+
199
+ const KEY_CODES_BY_NAME: Record<string, number> = {};
200
+
201
+ (function () {
202
+ Object.entries(KEY_NAMES_BY_CODE).forEach(([key, name]) => {
203
+ KEY_CODES_BY_NAME[name] = +key;
204
+ });
205
+ })();
206
+
207
+ const MODIFIERS = ['shift', 'ctrl', 'alt'];
208
+
209
+ function stringContains(string: string, substring: string): boolean {
210
+ return string.indexOf(substring) !== -1;
211
+ }
212
+
213
+ function neatString(string: string): string {
214
+ return string.replace(/^\s+|\s+$/g, '').replace(/\s+/g, ' ');
215
+ };
216
+
217
+ function extractModifiers(keyCombination: string): string[] {
218
+ return MODIFIERS.filter(m => keyCombination.includes(m));
219
+ }
220
+
221
+ function extractKey(keyCombination: string): string | undefined{
222
+ return neatString(keyCombination).split(' ').find(key => !MODIFIERS.includes(key));
223
+ };
224
+
225
+ function modifiersAndKey(keyCombination: string) {
226
+ var result, key;
227
+
228
+ if (stringContains(keyCombination, 'any')) {
229
+ return neatString(keyCombination).split(' ').slice(0, 2).join(' ');
230
+ }
231
+
232
+ result = extractModifiers(keyCombination);
233
+
234
+ key = extractKey(keyCombination);
235
+ if (key) {
236
+ result.push(key);
237
+ }
238
+
239
+ return result.join(' ');
240
+ }
241
+
242
+ function keyName(keyCode: number): string {
243
+ return KEY_NAMES_BY_CODE[keyCode] || '';
244
+ };
@@ -0,0 +1,400 @@
1
+ import { Events, template, UICorePlugin } from '@clappr/core'
2
+ import { type QualityLevel } from '../..//playback.types'
3
+ import { reportError, trace } from '@gcorevideo/utils'
4
+ import { CLAPPR_VERSION } from '../build.js'
5
+ import { ZeptoResult } from '../types.js'
6
+
7
+ import buttonHtml from '../../../assets/level-selector/button.ejs'
8
+ import listHtml from '../../../assets/level-selector/list.ejs'
9
+ import hdIcon from '../../../assets/icons/new/hd.svg'
10
+ import arrowRightIcon from '../../../assets/icons/new/arrow-right.svg'
11
+ import arrowLeftIcon from '../../../assets/icons/new/arrow-left.svg'
12
+ import checkIcon from '../../../assets/icons/new/check.svg'
13
+ import '../../../assets/level-selector/style.scss'
14
+
15
+
16
+ const T = 'plugins.level_selector'
17
+ const VERSION = '2.18.3'
18
+
19
+ type TemplateFunction = (data: Record<string, unknown>) => string
20
+
21
+ /**
22
+ * Allows to control the quality level of the playback.
23
+ * @beta
24
+ *
25
+ * @remarks
26
+ * The plugin is rendered as a button in the gear menu.
27
+ * When clicked, it shows a list of quality levels to choose from.
28
+ *
29
+ * Configuration options:
30
+ *
31
+ * - `labels`: The labels to show in the level selector. [vertical resolution]: string
32
+ * - `restrictResolution`: The maximum resolution to allow in the level selector.
33
+ * - `title`: The title to show in the level selector.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * {
38
+ * levelSelector: {
39
+ * restrictResolution: 360,
40
+ * labels: { 360: '360p', 720: '720p' },
41
+ * },
42
+ * }
43
+ * ```
44
+ */
45
+ export class LevelSelector extends UICorePlugin {
46
+ private levels: QualityLevel[] = []
47
+
48
+ private levelLabels: string[] = []
49
+
50
+ private removeAuto = false
51
+
52
+ private isHd = false
53
+
54
+ private isOpen = false
55
+
56
+ private buttonTemplate: TemplateFunction | null = null
57
+
58
+ private listTemplate: TemplateFunction | null = null
59
+
60
+ get name() {
61
+ return 'level_selector'
62
+ }
63
+
64
+ get supportedVersion() {
65
+ return { min: CLAPPR_VERSION }
66
+ }
67
+
68
+ static get version() {
69
+ return VERSION
70
+ }
71
+
72
+ override get attributes() {
73
+ return {
74
+ class: this.name,
75
+ 'data-level-selector': '',
76
+ }
77
+ }
78
+
79
+ private currentText = 'Auto'
80
+
81
+ private selectedLevelId = -1
82
+
83
+ override get events() {
84
+ return {
85
+ 'click .gear-sub-menu_btn': 'onLevelSelect',
86
+ 'click .gear-option': 'onShowLevelSelectMenu',
87
+ 'click .go-back': 'goBack',
88
+ }
89
+ }
90
+
91
+ override bindEvents() {
92
+ this.listenTo(this.core, Events.CORE_READY, () => this.bindPlaybackEvents())
93
+ this.listenTo(
94
+ this.core.mediaControl,
95
+ Events.MEDIACONTROL_CONTAINERCHANGED,
96
+ this.reload,
97
+ )
98
+ this.listenTo(this.core, 'gear:rendered', this.render)
99
+ }
100
+
101
+ private unBindEvents() {
102
+ this.stopListening(this.core, Events.CORE_READY, () =>
103
+ this.bindPlaybackEvents(),
104
+ )
105
+ this.stopListening(
106
+ this.core.mediaControl,
107
+ Events.MEDIACONTROL_CONTAINERCHANGED,
108
+ this.reload,
109
+ )
110
+ this.stopListening(this.core, 'gear:rendered', this.render)
111
+ }
112
+
113
+ private bindPlaybackEvents() {
114
+ this.removeAuto = false
115
+ this.isHd = false
116
+
117
+ const activePlayback = this.core.activePlayback
118
+
119
+ this.listenTo(activePlayback, Events.PLAYBACK_LEVELS_AVAILABLE, (levels: QualityLevel[]) =>
120
+ this.fillLevels(levels),
121
+ )
122
+ this.listenTo(
123
+ activePlayback,
124
+ Events.PLAYBACK_LEVEL_SWITCH_START,
125
+ this.onLevelSwitchStart,
126
+ )
127
+ this.listenTo(
128
+ activePlayback,
129
+ Events.PLAYBACK_LEVEL_SWITCH_END,
130
+ this.onLevelSwitchEnd,
131
+ )
132
+ this.listenTo(
133
+ activePlayback,
134
+ Events.PLAYBACK_BITRATE,
135
+ this.updateCurrentLevel,
136
+ )
137
+ this.listenTo(activePlayback, Events.PLAYBACK_STOP, this.onStop)
138
+ this.listenTo(
139
+ activePlayback,
140
+ Events.PLAYBACK_HIGHDEFINITIONUPDATE,
141
+ (isHd: boolean) => {
142
+ this.isHd = isHd
143
+ this.deferRender()
144
+ },
145
+ )
146
+ if (activePlayback?.levels?.length > 0) {
147
+ this.fillLevels(activePlayback.levels)
148
+ }
149
+ }
150
+
151
+ private onStop() {
152
+ trace(`${T} onStop`)
153
+ const currentPlayback = this.core.activePlayback
154
+
155
+ this.listenToOnce(currentPlayback, Events.PLAYBACK_PLAY, () => {
156
+ trace(`${T} on PLAYBACK_PLAY after stop`, { selectedLevelId: this.selectedLevelId })
157
+ if (currentPlayback.getPlaybackType() === 'live') {
158
+ if (this.selectedLevelId !== -1) {
159
+ currentPlayback.currentLevel = this.selectedLevelId
160
+ }
161
+ }
162
+ })
163
+ }
164
+
165
+ private reload() {
166
+ this.unBindEvents()
167
+ this.bindEvents()
168
+ this.bindPlaybackEvents()
169
+ }
170
+
171
+ private shouldRender() {
172
+ if (!this.core.activeContainer) {
173
+ return false
174
+ }
175
+
176
+ const activePlayback = this.core.activePlayback
177
+
178
+ if (!activePlayback) {
179
+ return false
180
+ }
181
+
182
+ const supportsCurrentLevel = 'currentLevel' in activePlayback
183
+ if (!supportsCurrentLevel) {
184
+ return false
185
+ }
186
+ // Only care if we have at least 2 to choose from
187
+ return !!(this.levels && this.levels.length > 1)
188
+ }
189
+
190
+ override render() {
191
+ if (!this.shouldRender()) {
192
+ return this
193
+ }
194
+
195
+ this.renderButton()
196
+
197
+ return this
198
+ }
199
+
200
+ private renderButton() {
201
+ if (!this.buttonTemplate) {
202
+ this.buttonTemplate = template(buttonHtml)
203
+ }
204
+
205
+ if (!this.isOpen) {
206
+ const html = this.buttonTemplate?.({
207
+ arrowRightIcon,
208
+ currentText: this.currentText,
209
+ isHd: this.isHd,
210
+ hdIcon,
211
+ })
212
+ this.$el.html(html)
213
+ this.core.mediaControl.$el
214
+ ?.find('.gear-options-list [data-quality]')
215
+ .html(this.el)
216
+ }
217
+ }
218
+
219
+ private renderDropdown() {
220
+ if (!this.listTemplate) {
221
+ this.listTemplate = template(listHtml)
222
+ }
223
+ const html = this.listTemplate!({
224
+ arrowLeftIcon,
225
+ checkIcon,
226
+ labels: this.levelLabels,
227
+ levels: this.levels,
228
+ maxLevel: this.maxLevel,
229
+ removeAuto: this.removeAuto,
230
+ })
231
+ this.$el.html(html)
232
+ this.core.mediaControl.$el?.find('.gear-wrapper').html(this.el)
233
+ }
234
+
235
+ private get maxLevel() {
236
+ const maxRes = this.core.options.levelSelector?.restrictResolution
237
+ return maxRes
238
+ ? this.levels.findIndex(
239
+ (level) =>
240
+ level.height === maxRes,
241
+ )
242
+ : -1
243
+ }
244
+
245
+ private fillLevels(levels: QualityLevel[]) {
246
+ const maxResolution = this.core.options.levelSelector?.restrictResolution
247
+ this.levels = levels
248
+ this.makeLevelsLabels()
249
+ if (maxResolution) {
250
+ this.removeAuto = true
251
+ // TODO account for vertical resolutions, i.e, normalize the resolution to the width
252
+ const initialLevel = levels
253
+ .filter((level) => level.height <= maxResolution)
254
+ .pop()
255
+ this.setLevel(initialLevel?.level ?? 0)
256
+ }
257
+ this.deferRender()
258
+ }
259
+
260
+ private makeLevelsLabels() {
261
+ const labels = this.core.options.levelSelector?.labels ?? {}
262
+ this.levelLabels = []
263
+
264
+ for (let i = 0; i < this.levels.length; i++) {
265
+ const level = this.levels[i]
266
+ const ll = level.width > level.height ? level.height : level.width
267
+ const label = labels[ll] || `${ll}p`
268
+ this.levelLabels.push(label)
269
+ }
270
+ }
271
+
272
+ private findLevelBy(id: number): QualityLevel | undefined {
273
+ return this.levels.find((level) => level.level === id)
274
+ }
275
+
276
+ private onLevelSelect(event: MouseEvent) {
277
+ const selectedLevel = parseInt(
278
+ (event.currentTarget as HTMLElement)?.dataset?.id ?? '-1',
279
+ 10,
280
+ )
281
+ this.setLevel(selectedLevel)
282
+ event.stopPropagation()
283
+ return false
284
+ }
285
+
286
+ private goBack() {
287
+ trace(`${T} goBack`)
288
+ this.isOpen = false
289
+ this.core.trigger('gear:refresh')
290
+ this.deferRender()
291
+ }
292
+
293
+ private setLevel(index: number) {
294
+ trace(`${T} setIndexLevel`, { index })
295
+ this.selectedLevelId = index
296
+ if (!this.core.activePlayback) {
297
+ return
298
+ }
299
+ if (this.core.activePlayback.currentLevel === this.selectedLevelId) {
300
+ return
301
+ }
302
+ this.core.activePlayback.currentLevel = this.selectedLevelId
303
+
304
+ try {
305
+ this.highlightCurrentLevel()
306
+ } catch (error) {
307
+ reportError(error)
308
+ }
309
+ this.deferRender()
310
+ }
311
+
312
+ private onShowLevelSelectMenu() {
313
+ trace(`${T} onShowLevelSelectMenu`)
314
+ this.isOpen = true
315
+ this.renderDropdown()
316
+ this.highlightCurrentLevel()
317
+ }
318
+
319
+ private allLevelElements() {
320
+ return this.$('ul.gear-sub-menu li') as ZeptoResult
321
+ }
322
+
323
+ private levelElement(id = -1) {
324
+ return (
325
+ this.$(`ul.gear-sub-menu a[data-id="${id}"]`) as ZeptoResult
326
+ ).parent()
327
+ }
328
+
329
+ private getTitle() {
330
+ return (this.core.options.levelSelector || {}).title
331
+ }
332
+
333
+ private onLevelSwitchStart() {
334
+ this.core.activePlayback.trigger('playback:level:select:start')
335
+ this.levelElement(this.selectedLevelId).addClass('changing')
336
+ }
337
+
338
+ private onLevelSwitchEnd() {
339
+ this.levelElement(this.selectedLevelId).removeClass('changing')
340
+ }
341
+
342
+ private updateText(level: number) {
343
+ if (level === undefined || isNaN(level)) {
344
+ return
345
+ }
346
+ this.currentText = this.getLevelLabel(level)
347
+ this.deferRender()
348
+ }
349
+
350
+ private getLevelLabel(id: number): string {
351
+ if (id === -1) {
352
+ return 'Auto'
353
+ }
354
+ const index = this.levels.findIndex((l) => l.level === id)
355
+ if (index < 0) {
356
+ return 'Auto'
357
+ }
358
+ return this.levelLabels[index] ?? formatLevelLabel(this.levels[index])
359
+ }
360
+
361
+ private updateCurrentLevel(info: QualityLevel) {
362
+ trace(`${T} updateCurrentLevel`, { info })
363
+ this.highlightCurrentLevel()
364
+ }
365
+
366
+ private highlightCurrentLevel() {
367
+ trace(`${T} highlightCurrentLevel`, {
368
+ selectedLevelId: this.selectedLevelId,
369
+ })
370
+ this.allLevelElements().removeClass('current')
371
+ this.allLevelElements().find('a').removeClass('gcore-skin-active')
372
+
373
+ const currentLevelElement = this.levelElement(this.selectedLevelId)
374
+
375
+ currentLevelElement.addClass('current')
376
+ currentLevelElement.find('a').addClass('gcore-skin-active')
377
+
378
+ this.updateText(this.selectedLevelId)
379
+ }
380
+
381
+ private deferRender = debounce(() => this.render(), 0)
382
+ }
383
+
384
+ function formatLevelLabel(level: QualityLevel): string {
385
+ const h = level.width > level.height ? level.height : level.width
386
+ return `${h}p`
387
+ }
388
+
389
+ function debounce(fn: () => void, wait: number) {
390
+ let timerId: ReturnType<typeof setTimeout> | null = null
391
+ return function () {
392
+ if (timerId !== null) {
393
+ clearTimeout(timerId)
394
+ }
395
+ timerId = setTimeout(() => {
396
+ timerId = null
397
+ fn()
398
+ }, wait)
399
+ }
400
+ }
@@ -0,0 +1,72 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
2
+ import { UICorePlugin } from '@clappr/core'
3
+ import FakeTimers from '@sinonjs/fake-timers'
4
+ import EventLite from 'event-lite'
5
+ import { Logger, LogTracer, setTracer } from '@gcorevideo/utils'
6
+ import { LevelSelector } from '../LevelSelector.js'
7
+
8
+ setTracer(new LogTracer('LevelSelector.test'))
9
+ Logger.enable('*')
10
+
11
+ describe('LevelSelector', () => {
12
+ let clock: FakeTimers.InstalledClock
13
+ beforeEach(() => {
14
+ clock = FakeTimers.install()
15
+ })
16
+ afterEach(() => {
17
+ clock.uninstall()
18
+ })
19
+ describe('options.restrictResolution', () => {
20
+ let core: any
21
+ let levelSelector: LevelSelector
22
+ beforeEach(async () => {
23
+ const activeContainer = Object.assign(new EventLite(), {
24
+ $el: {
25
+ html: vi.fn(),
26
+ },
27
+ })
28
+ const activePlayback = Object.assign(new EventLite(), {
29
+ currentLevel: -1,
30
+ levels: [],
31
+ })
32
+ core = Object.assign(new EventLite(), {
33
+ activeContainer,
34
+ activePlayback,
35
+ options: {
36
+ levelSelector: {
37
+ restrictResolution: 360,
38
+ },
39
+ },
40
+ })
41
+ core.mediaControl = new UICorePlugin(core),
42
+ levelSelector = new LevelSelector(core)
43
+ core.emit('core:ready')
44
+ await clock.tickAsync(1)
45
+ activePlayback.emit('playback:levels:available', [
46
+ {
47
+ level: 0,
48
+ height: 360,
49
+ width: 640,
50
+ bitrate: 300000,
51
+ },
52
+ {
53
+ level: 1,
54
+ height: 720,
55
+ width: 1280,
56
+ bitrate: 150000,
57
+ },
58
+ {
59
+ level: 2,
60
+ height: 1080,
61
+ width: 1920,
62
+ bitrate: 250000,
63
+ },
64
+ ])
65
+ await clock.tickAsync(1)
66
+ })
67
+ it('should render the restricted quality level label', () => {
68
+ expect(levelSelector.el.textContent?.replace('/assets/icons/new/arrow-right.svg', '').replace(/\s+/g, ' ')).toContain('Quality 360p')
69
+ expect(levelSelector.el.innerHTML).toMatchSnapshot()
70
+ })
71
+ })
72
+ })