@npo/player 1.22.4 → 1.23.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 (415) hide show
  1. package/README.md +1 -1
  2. package/lib/js/ads/ster.js +23 -21
  3. package/lib/js/ads/ster.test.js +17 -17
  4. package/lib/js/api/getstreamobject.js +7 -7
  5. package/lib/js/api/getstreamobject.test.js +3 -3
  6. package/lib/js/markers/updateLiveMarkers.d.ts +3 -3
  7. package/lib/js/markers/updateLiveMarkers.js +14 -15
  8. package/lib/js/markers/updateLiveMarkers.test.js +11 -12
  9. package/lib/js/playeractions/customerrors.test.js +33 -33
  10. package/lib/js/playeractions/handlers/customerrors.js +48 -48
  11. package/lib/js/playeractions/handlers/error.js +1 -1
  12. package/lib/js/playeractions/handlers/error.test.js +11 -11
  13. package/lib/js/playeractions/handlers/handleoffsets.d.ts +2 -2
  14. package/lib/js/playeractions/handlers/handleoffsets.js +6 -6
  15. package/lib/js/playeractions/handlers/handleoffsets.test.js +12 -12
  16. package/lib/js/playeractions/handlers/mediasessionactions.d.ts +1 -1
  17. package/lib/js/playeractions/handlers/mediasessionactions.js +20 -15
  18. package/lib/js/playeractions/handlers/processplayerconfig.d.ts +2 -2
  19. package/lib/js/playeractions/handlers/processplayerconfig.js +4 -4
  20. package/lib/js/playeractions/handlers/processsourceconfig.d.ts +2 -1
  21. package/lib/js/playeractions/handlers/processsourceconfig.js +52 -46
  22. package/lib/js/playeractions/handlers/removereplayclass.d.ts +1 -1
  23. package/lib/js/playeractions/handlers/removereplayclass.test.d.ts +1 -1
  24. package/lib/js/playeractions/handlers/removereplayclass.test.js +7 -6
  25. package/lib/js/playeractions/playeractions.d.ts +4 -5
  26. package/lib/js/playeractions/playeractions.js +4 -5
  27. package/lib/js/settings/settings.user-agent.d.ts +1 -0
  28. package/lib/js/settings/settings.user-agent.js +1 -0
  29. package/lib/js/tracking/handlers/eventbinding.js +9 -9
  30. package/lib/js/tracking/handlers/eventlogging.js +2 -2
  31. package/lib/js/tracking/handlers/eventlogging.test.js +2 -2
  32. package/lib/js/tracking/handlers/playertrackerinit.d.ts +1 -1
  33. package/lib/js/tracking/handlers/playertrackerinit.js +5 -11
  34. package/lib/js/tracking/handlers/playertrackerstart.d.ts +1 -1
  35. package/lib/js/tracking/handlers/playertrackerstart.js +5 -10
  36. package/lib/js/utilities/utilities.element.d.ts +10 -0
  37. package/lib/js/utilities/utilities.element.js +8 -0
  38. package/lib/js/utilities/utilities.element.test.js +25 -0
  39. package/lib/js/utilities/utilities.jwt.d.ts +3 -0
  40. package/lib/js/utilities/utilities.jwt.js +22 -0
  41. package/lib/js/utilities/utilities.jwt.test.js +32 -0
  42. package/lib/js/utilities/utilities.locale.d.ts +2 -0
  43. package/lib/js/utilities/utilities.locale.js +4 -0
  44. package/lib/js/utilities/utilities.locale.test.js +10 -0
  45. package/lib/js/utilities/utilities.module.d.ts +1 -0
  46. package/lib/js/utilities/utilities.module.js +4 -0
  47. package/lib/js/utilities/utilities.module.test.js +19 -0
  48. package/lib/js/utilities/utilities.stream.d.ts +7 -0
  49. package/lib/js/utilities/utilities.stream.js +10 -0
  50. package/lib/js/utilities/utilities.stream.test.js +32 -0
  51. package/lib/js/utilities/utilities.text.d.ts +1 -0
  52. package/lib/js/utilities/utilities.text.js +3 -0
  53. package/lib/js/utilities/utilities.text.test.js +18 -0
  54. package/lib/js/utilities/utilities.time.d.ts +1 -0
  55. package/lib/js/utilities/utilities.time.js +3 -0
  56. package/lib/js/utilities/utilities.time.test.js +8 -0
  57. package/lib/js/utilities/utilities.url.d.ts +3 -0
  58. package/lib/js/utilities/utilities.url.js +29 -0
  59. package/lib/js/utilities/utilities.url.test.js +46 -0
  60. package/lib/js/utilities/utilities.user-agent.d.ts +3 -0
  61. package/lib/js/utilities/utilities.user-agent.js +13 -0
  62. package/lib/js/utilities/utilities.user-agent.test.js +60 -0
  63. package/lib/js/utilities/utilities.version.d.ts +1 -0
  64. package/lib/js/utilities/{printversion.js → utilities.version.js} +8 -8
  65. package/lib/js/utilities/utilities.version.test.js +26 -0
  66. package/lib/lang/nl.json +2 -1
  67. package/lib/npoplayer-bridge.test.d.ts +1 -1
  68. package/lib/npoplayer-bridge.test.js +6 -5
  69. package/lib/npoplayer.d.ts +14 -10
  70. package/lib/npoplayer.js +116 -124
  71. package/lib/npoplayer.test.js +3 -3
  72. package/lib/package.json +19 -12
  73. package/lib/services/a11y/setup.d.ts +2 -0
  74. package/lib/services/a11y/setup.js +18 -0
  75. package/lib/services/a11y/setup.test.js +109 -0
  76. package/lib/services/avTypeHandlers/getAVType.d.ts +2 -0
  77. package/lib/services/avTypeHandlers/getAVType.js +9 -0
  78. package/lib/services/avTypeHandlers/getAVType.test.js +18 -0
  79. package/lib/services/drmHandlers/constants.d.ts +15 -0
  80. package/lib/services/drmHandlers/constants.js +13 -0
  81. package/lib/services/drmHandlers/decideprofile.d.ts +2 -0
  82. package/lib/services/drmHandlers/decideprofile.js +51 -0
  83. package/lib/services/drmHandlers/decideprofile.test.js +34 -0
  84. package/lib/services/drmHandlers/drmhandlers.d.ts +2 -0
  85. package/lib/services/drmHandlers/drmhandlers.js +2 -0
  86. package/lib/services/drmHandlers/utils.d.ts +5 -0
  87. package/lib/services/drmHandlers/utils.js +26 -0
  88. package/lib/services/drmHandlers/utils.test.js +74 -0
  89. package/lib/services/drmHandlers/verifydrm.d.ts +2 -0
  90. package/lib/services/drmHandlers/verifydrm.js +40 -0
  91. package/lib/services/drmHandlers/verifydrm.test.js +89 -0
  92. package/lib/services/eventListenerHandlers/removeEventListeners.d.ts +2 -0
  93. package/lib/services/eventListenerHandlers/removeEventListeners.js +18 -0
  94. package/lib/services/eventListenerHandlers/removeEventListeners.test.js +27 -0
  95. package/lib/services/keyboardHandlers/resolvekeypress.d.ts +2 -0
  96. package/lib/services/keyboardHandlers/resolvekeypress.js +49 -0
  97. package/lib/{js/playeractions/handlers → services/keyboardHandlers}/resolvekeypress.test.js +21 -13
  98. package/lib/services/liveStreamHandlers/handleLiveStreamControls.d.ts +6 -0
  99. package/lib/services/liveStreamHandlers/handleLiveStreamControls.js +35 -0
  100. package/lib/services/localStorageHandlers/localStorageHandlers.d.ts +4 -0
  101. package/lib/services/localStorageHandlers/localStorageHandlers.js +33 -0
  102. package/lib/services/localStorageHandlers/localStorageHandlers.test.js +109 -0
  103. package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +30 -0
  104. package/lib/services/npoPlayerAPI/npoPlayerAPI.js +91 -0
  105. package/lib/services/npoPlayerAPI/npoPlayerAPI.test.js +51 -0
  106. package/lib/services/segmentHandlers/addSegmentEventListeners.d.ts +2 -0
  107. package/lib/services/segmentHandlers/addSegmentEventListeners.js +14 -0
  108. package/lib/services/segmentHandlers/addSegmentEventListeners.test.js +43 -0
  109. package/lib/services/segmentHandlers/convertFragmentToSegment.d.ts +2 -0
  110. package/lib/services/segmentHandlers/convertFragmentToSegment.js +8 -0
  111. package/lib/services/segmentHandlers/convertFragmentToSegment.test.js +17 -0
  112. package/lib/services/segmentHandlers/handleSegmentSeek.d.ts +5 -0
  113. package/lib/services/segmentHandlers/handleSegmentSeek.js +15 -0
  114. package/lib/services/segmentHandlers/handleSegmentSeek.test.js +73 -0
  115. package/lib/services/segmentHandlers/handleSegmentTimeChanged.d.ts +2 -0
  116. package/lib/services/segmentHandlers/handleSegmentTimeChanged.js +21 -0
  117. package/lib/services/segmentHandlers/handleSegmentTimeChanged.test.d.ts +1 -0
  118. package/lib/services/segmentHandlers/handleSegmentTimeChanged.test.js +34 -0
  119. package/lib/services/segmentHandlers/initSegment.d.ts +7 -0
  120. package/lib/services/segmentHandlers/initSegment.js +10 -0
  121. package/lib/services/segmentHandlers/initSegment.test.d.ts +1 -0
  122. package/lib/services/segmentHandlers/initSegment.test.js +36 -0
  123. package/lib/services/segmentHandlers/setSegmentMarkers.d.ts +2 -0
  124. package/lib/services/segmentHandlers/setSegmentMarkers.js +25 -0
  125. package/lib/services/segmentHandlers/setSegmentMarkers.test.d.ts +1 -0
  126. package/lib/services/segmentHandlers/setSegmentMarkers.test.js +32 -0
  127. package/lib/services/services.d.ts +14 -0
  128. package/lib/services/services.js +47 -0
  129. package/lib/src/js/markers/updateLiveMarkers.d.ts +3 -3
  130. package/lib/src/js/playeractions/handlers/handleoffsets.d.ts +2 -2
  131. package/lib/src/js/playeractions/handlers/mediasessionactions.d.ts +1 -1
  132. package/lib/src/js/playeractions/handlers/processplayerconfig.d.ts +2 -2
  133. package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +2 -1
  134. package/lib/src/js/playeractions/handlers/removereplayclass.d.ts +1 -1
  135. package/lib/src/js/playeractions/handlers/removereplayclass.test.d.ts +1 -1
  136. package/lib/src/js/playeractions/playeractions.d.ts +4 -5
  137. package/lib/src/js/settings/settings.user-agent.d.ts +1 -0
  138. package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +1 -1
  139. package/lib/src/js/tracking/handlers/playertrackerstart.d.ts +1 -1
  140. package/lib/src/js/utilities/utilities.element.d.ts +10 -0
  141. package/lib/src/js/utilities/utilities.element.test.d.ts +1 -0
  142. package/lib/src/js/utilities/utilities.jwt.d.ts +3 -0
  143. package/lib/src/js/utilities/utilities.jwt.test.d.ts +1 -0
  144. package/lib/src/js/utilities/utilities.locale.d.ts +2 -0
  145. package/lib/src/js/utilities/utilities.locale.test.d.ts +1 -0
  146. package/lib/src/js/utilities/utilities.module.d.ts +1 -0
  147. package/lib/src/js/utilities/utilities.module.test.d.ts +1 -0
  148. package/lib/src/js/utilities/utilities.stream.d.ts +7 -0
  149. package/lib/src/js/utilities/utilities.stream.test.d.ts +1 -0
  150. package/lib/src/js/utilities/utilities.text.d.ts +1 -0
  151. package/lib/src/js/utilities/utilities.text.test.d.ts +1 -0
  152. package/lib/src/js/utilities/utilities.time.d.ts +1 -0
  153. package/lib/src/js/utilities/utilities.time.test.d.ts +1 -0
  154. package/lib/src/js/utilities/utilities.url.d.ts +3 -0
  155. package/lib/src/js/utilities/utilities.url.test.d.ts +1 -0
  156. package/lib/src/js/utilities/utilities.user-agent.d.ts +3 -0
  157. package/lib/src/js/utilities/utilities.user-agent.test.d.ts +1 -0
  158. package/lib/src/js/utilities/utilities.version.d.ts +1 -0
  159. package/lib/src/js/utilities/utilities.version.test.d.ts +1 -0
  160. package/lib/src/npoplayer-bridge.test.d.ts +1 -1
  161. package/lib/src/npoplayer.d.ts +14 -10
  162. package/lib/src/services/a11y/setup.d.ts +2 -0
  163. package/lib/src/services/a11y/setup.test.d.ts +1 -0
  164. package/lib/src/services/avTypeHandlers/getAVType.d.ts +2 -0
  165. package/lib/src/services/avTypeHandlers/getAVType.test.d.ts +1 -0
  166. package/lib/src/services/drmHandlers/constants.d.ts +15 -0
  167. package/lib/src/services/drmHandlers/decideprofile.d.ts +2 -0
  168. package/lib/src/services/drmHandlers/decideprofile.test.d.ts +1 -0
  169. package/lib/src/services/drmHandlers/drmhandlers.d.ts +2 -0
  170. package/lib/src/services/drmHandlers/utils.d.ts +5 -0
  171. package/lib/src/services/drmHandlers/utils.test.d.ts +1 -0
  172. package/lib/src/services/drmHandlers/verifydrm.d.ts +2 -0
  173. package/lib/src/services/drmHandlers/verifydrm.test.d.ts +1 -0
  174. package/lib/src/services/eventListenerHandlers/removeEventListeners.d.ts +2 -0
  175. package/lib/src/services/eventListenerHandlers/removeEventListeners.test.d.ts +1 -0
  176. package/lib/src/services/keyboardHandlers/resolvekeypress.d.ts +2 -0
  177. package/lib/src/services/keyboardHandlers/resolvekeypress.test.d.ts +1 -0
  178. package/lib/src/services/liveStreamHandlers/handleLiveStreamControls.d.ts +6 -0
  179. package/lib/src/services/localStorageHandlers/localStorageHandlers.d.ts +4 -0
  180. package/lib/src/services/localStorageHandlers/localStorageHandlers.test.d.ts +1 -0
  181. package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +30 -0
  182. package/lib/src/services/npoPlayerAPI/npoPlayerAPI.test.d.ts +1 -0
  183. package/lib/src/services/segmentHandlers/addSegmentEventListeners.d.ts +2 -0
  184. package/lib/src/services/segmentHandlers/addSegmentEventListeners.test.d.ts +1 -0
  185. package/lib/src/services/segmentHandlers/convertFragmentToSegment.d.ts +2 -0
  186. package/lib/src/services/segmentHandlers/convertFragmentToSegment.test.d.ts +1 -0
  187. package/lib/src/services/segmentHandlers/handleSegmentSeek.d.ts +5 -0
  188. package/lib/src/services/segmentHandlers/handleSegmentSeek.test.d.ts +1 -0
  189. package/lib/src/services/segmentHandlers/handleSegmentTimeChanged.d.ts +2 -0
  190. package/lib/src/services/segmentHandlers/handleSegmentTimeChanged.test.d.ts +1 -0
  191. package/lib/src/services/segmentHandlers/initSegment.d.ts +7 -0
  192. package/lib/src/services/segmentHandlers/initSegment.test.d.ts +1 -0
  193. package/lib/src/services/segmentHandlers/setSegmentMarkers.d.ts +2 -0
  194. package/lib/src/services/segmentHandlers/setSegmentMarkers.test.d.ts +1 -0
  195. package/lib/src/services/services.d.ts +14 -0
  196. package/lib/src/types/events.d.ts +91 -0
  197. package/lib/src/types/interfaces.d.ts +39 -15
  198. package/lib/{js → src}/ui/components/adbutton.d.ts +1 -1
  199. package/lib/{js → src}/ui/components/adlabel.d.ts +1 -1
  200. package/lib/{js → src}/ui/components/audio/controlbar.d.ts +1 -1
  201. package/lib/{js → src}/ui/components/buttons.d.ts +3 -3
  202. package/lib/src/ui/components/controlbar.d.ts +3 -0
  203. package/lib/{js → src}/ui/components/ctabar.d.ts +2 -2
  204. package/lib/src/ui/components/nativemobile/controlbar.d.ts +3 -0
  205. package/lib/src/ui/components/nativemobile/topbar.d.ts +3 -0
  206. package/lib/{js → src}/ui/components/playnext.d.ts +1 -1
  207. package/lib/src/{js/ui → ui}/components/seekbar.d.ts +1 -1
  208. package/lib/src/{js/ui → ui}/components/settingspanel.d.ts +1 -1
  209. package/lib/{js → src}/ui/components/titlebar.d.ts +1 -1
  210. package/lib/src/ui/components/topbar.d.ts +3 -0
  211. package/lib/src/ui/handlers/accessibilityhandler.test.d.ts +1 -0
  212. package/lib/src/ui/handlers/domhandlers.d.ts +3 -0
  213. package/lib/src/ui/handlers/domhandlers.test.d.ts +1 -0
  214. package/lib/{js → src}/ui/handlers/nicamhandler.d.ts +2 -2
  215. package/lib/src/ui/handlers/nicamhandler.test.d.ts +1 -0
  216. package/lib/{js → src}/ui/handlers/playnextstreen.test.d.ts +1 -1
  217. package/lib/src/{js/ui → ui}/handlers/streamhandler.d.ts +2 -2
  218. package/lib/{js → src}/ui/nativemobileuicontainer.d.ts +1 -1
  219. package/lib/src/ui/nativemobileuifactory.test.d.ts +1 -0
  220. package/lib/{js → src}/ui/uicontainer.d.ts +2 -3
  221. package/lib/tests/mocks/mockNpoplayer.js +18 -15
  222. package/lib/tests/mocks/mockPlayerAPI.d.ts +3 -0
  223. package/lib/tests/mocks/mockPlayerAPI.js +181 -0
  224. package/lib/tests/mocks/mockPlayerContext.d.ts +2 -0
  225. package/lib/tests/mocks/mockPlayerContext.js +40 -0
  226. package/lib/types/events.d.ts +91 -0
  227. package/lib/types/events.js +1 -0
  228. package/lib/types/interfaces.d.ts +39 -15
  229. package/lib/types/interfaces.js +12 -0
  230. package/lib/{src/js/ui → ui}/components/adbutton.d.ts +1 -1
  231. package/lib/{src/js/ui → ui}/components/adlabel.d.ts +1 -1
  232. package/lib/{src/js/ui → ui}/components/audio/controlbar.d.ts +1 -1
  233. package/lib/{js/ui → ui}/components/audio/controlbar.js +2 -2
  234. package/lib/{src/js/ui → ui}/components/buttons.d.ts +3 -3
  235. package/lib/{js/ui → ui}/components/buttons.js +7 -7
  236. package/lib/ui/components/controlbar.d.ts +3 -0
  237. package/lib/{js/ui → ui}/components/controlbar.js +5 -2
  238. package/lib/{src/js/ui → ui}/components/ctabar.d.ts +3 -3
  239. package/lib/{js/ui → ui}/components/ctabar.js +4 -6
  240. package/lib/{js/ui → ui}/components/nativemobile/buttons.js +8 -6
  241. package/lib/ui/components/nativemobile/controlbar.d.ts +3 -0
  242. package/lib/{js/ui → ui}/components/nativemobile/controlbar.js +6 -4
  243. package/lib/{js/ui → ui}/components/nativemobile/ctabar.js +1 -1
  244. package/lib/ui/components/nativemobile/topbar.d.ts +3 -0
  245. package/lib/{js/ui → ui}/components/nativemobile/topbar.js +6 -3
  246. package/lib/{src/js/ui → ui}/components/playnext.d.ts +1 -1
  247. package/lib/{js/ui → ui}/components/playnext.js +1 -1
  248. package/lib/{js/ui → ui}/components/seekbar.d.ts +1 -1
  249. package/lib/{js/ui → ui}/components/seekbar.js +1 -1
  250. package/lib/{js/ui → ui}/components/settingspanel.d.ts +1 -1
  251. package/lib/{js/ui → ui}/components/settingspanel.js +23 -40
  252. package/lib/{src/js/ui → ui}/components/titlebar.d.ts +1 -1
  253. package/lib/ui/components/topbar.d.ts +3 -0
  254. package/lib/{js/ui → ui}/components/topbar.js +8 -4
  255. package/lib/{js/ui → ui}/handlers/accessibilityhandler.js +10 -10
  256. package/lib/ui/handlers/accessibilityhandler.test.d.ts +1 -0
  257. package/lib/ui/handlers/domhandlers.d.ts +3 -0
  258. package/lib/ui/handlers/domhandlers.js +7 -0
  259. package/lib/ui/handlers/domhandlers.test.d.ts +1 -0
  260. package/lib/ui/handlers/domhandlers.test.js +51 -0
  261. package/lib/{js/ui → ui}/handlers/listboxhandlers.js +7 -7
  262. package/lib/{src/js/ui → ui}/handlers/nicamhandler.d.ts +2 -2
  263. package/lib/{js/ui → ui}/handlers/nicamhandler.js +31 -10
  264. package/lib/ui/handlers/nicamhandler.test.d.ts +1 -0
  265. package/lib/{js/ui → ui}/handlers/nicamhandler.test.js +4 -3
  266. package/lib/{js/ui → ui}/handlers/playnextscreen.js +1 -1
  267. package/lib/{src/js/ui → ui}/handlers/playnextstreen.test.d.ts +1 -1
  268. package/lib/{js/ui → ui}/handlers/playnextstreen.test.js +5 -3
  269. package/lib/{js/ui → ui}/handlers/streamhandler.d.ts +2 -2
  270. package/lib/ui/handlers/streamhandler.js +51 -0
  271. package/lib/{src/js/ui → ui}/nativemobileuicontainer.d.ts +1 -1
  272. package/lib/{js/ui → ui}/nativemobileuicontainer.js +8 -13
  273. package/lib/{js/ui → ui}/nativemobileuifactory.js +20 -23
  274. package/lib/ui/nativemobileuifactory.test.d.ts +1 -0
  275. package/lib/{js/ui → ui}/nativemobileuifactory.test.js +8 -6
  276. package/lib/{src/js/ui → ui}/uicontainer.d.ts +2 -3
  277. package/lib/{js/ui → ui}/uicontainer.js +31 -45
  278. package/package.json +19 -12
  279. package/src/{scss → style}/components/_controlbars.scss +4 -0
  280. package/src/{scss → style}/components/_icons.scss +6 -0
  281. package/src/style/components/_poster.scss +3 -0
  282. package/src/{scss → style}/components/_settingspanel.scss +15 -1
  283. package/src/{scss → style}/components/_subtitles.scss +25 -16
  284. package/src/{scss → style}/npoplayer.css +30 -20
  285. package/src/{scss → style}/npoplayer.scss +3 -0
  286. package/src/{scss → style}/variants/_player-small.scss +9 -8
  287. package/lib/js/checks/apple.d.ts +0 -2
  288. package/lib/js/checks/apple.js +0 -19
  289. package/lib/js/checks/apple.test.js +0 -20
  290. package/lib/js/drm/drm.d.ts +0 -2
  291. package/lib/js/drm/drm.js +0 -2
  292. package/lib/js/drm/handlers/decideprofile.d.ts +0 -3
  293. package/lib/js/drm/handlers/decideprofile.js +0 -53
  294. package/lib/js/drm/handlers/decideprofile.test.js +0 -33
  295. package/lib/js/drm/handlers/verifydrm.d.ts +0 -4
  296. package/lib/js/drm/handlers/verifydrm.js +0 -24
  297. package/lib/js/drm/handlers/verifydrm.test.js +0 -17
  298. package/lib/js/fragments/removefragments.d.ts +0 -2
  299. package/lib/js/fragments/removefragments.js +0 -5
  300. package/lib/js/fragments/removefragments.test.js +0 -26
  301. package/lib/js/fragments/setfragments.d.ts +0 -6
  302. package/lib/js/fragments/setfragments.js +0 -78
  303. package/lib/js/fragments/setfragments.test.js +0 -72
  304. package/lib/js/playeractions/handlers/resolvekeypress.d.ts +0 -3
  305. package/lib/js/playeractions/handlers/resolvekeypress.js +0 -52
  306. package/lib/js/ui/components/controlbar.d.ts +0 -3
  307. package/lib/js/ui/components/nativemobile/addFragments.d.ts +0 -1
  308. package/lib/js/ui/components/nativemobile/addFragments.js +0 -7
  309. package/lib/js/ui/components/nativemobile/controlbar.d.ts +0 -3
  310. package/lib/js/ui/components/nativemobile/topbar.d.ts +0 -3
  311. package/lib/js/ui/components/topbar.d.ts +0 -3
  312. package/lib/js/ui/handlers/domhandlers.d.ts +0 -3
  313. package/lib/js/ui/handlers/domhandlers.js +0 -7
  314. package/lib/js/ui/handlers/domhandlers.test.js +0 -50
  315. package/lib/js/ui/handlers/streamhandler.js +0 -40
  316. package/lib/js/utilities/printversion.d.ts +0 -1
  317. package/lib/js/utilities/utilities.d.ts +0 -16
  318. package/lib/js/utilities/utilities.js +0 -78
  319. package/lib/js/utilities/utilities.test.js +0 -50
  320. package/lib/src/js/checks/apple.d.ts +0 -2
  321. package/lib/src/js/drm/drm.d.ts +0 -2
  322. package/lib/src/js/drm/handlers/decideprofile.d.ts +0 -3
  323. package/lib/src/js/drm/handlers/verifydrm.d.ts +0 -4
  324. package/lib/src/js/fragments/removefragments.d.ts +0 -2
  325. package/lib/src/js/fragments/setfragments.d.ts +0 -6
  326. package/lib/src/js/playeractions/handlers/resolvekeypress.d.ts +0 -3
  327. package/lib/src/js/ui/components/controlbar.d.ts +0 -3
  328. package/lib/src/js/ui/components/nativemobile/addFragments.d.ts +0 -1
  329. package/lib/src/js/ui/components/nativemobile/controlbar.d.ts +0 -3
  330. package/lib/src/js/ui/components/nativemobile/topbar.d.ts +0 -3
  331. package/lib/src/js/ui/components/topbar.d.ts +0 -3
  332. package/lib/src/js/ui/handlers/domhandlers.d.ts +0 -3
  333. package/lib/src/js/utilities/printversion.d.ts +0 -1
  334. package/lib/src/js/utilities/utilities.d.ts +0 -16
  335. /package/lib/js/{utilities/localizationconfig.d.ts → settings/localization.d.ts} +0 -0
  336. /package/lib/js/{utilities/localizationconfig.js → settings/localization.js} +0 -0
  337. /package/lib/js/{checks/apple.test.d.ts → utilities/utilities.element.test.d.ts} +0 -0
  338. /package/lib/js/{drm/handlers/decideprofile.test.d.ts → utilities/utilities.jwt.test.d.ts} +0 -0
  339. /package/lib/js/{drm/handlers/verifydrm.test.d.ts → utilities/utilities.locale.test.d.ts} +0 -0
  340. /package/lib/js/{fragments/removefragments.test.d.ts → utilities/utilities.module.test.d.ts} +0 -0
  341. /package/lib/js/{fragments/setfragments.test.d.ts → utilities/utilities.stream.test.d.ts} +0 -0
  342. /package/lib/js/{playeractions/handlers/resolvekeypress.test.d.ts → utilities/utilities.text.test.d.ts} +0 -0
  343. /package/lib/js/{ui/handlers/accessibilityhandler.test.d.ts → utilities/utilities.time.test.d.ts} +0 -0
  344. /package/lib/js/{ui/handlers/domhandlers.test.d.ts → utilities/utilities.url.test.d.ts} +0 -0
  345. /package/lib/js/{ui/handlers/nicamhandler.test.d.ts → utilities/utilities.user-agent.test.d.ts} +0 -0
  346. /package/lib/js/{ui/nativemobileuifactory.test.d.ts → utilities/utilities.version.test.d.ts} +0 -0
  347. /package/lib/{js/utilities/utilities.test.d.ts → services/a11y/setup.test.d.ts} +0 -0
  348. /package/lib/{src/js/checks/apple.test.d.ts → services/avTypeHandlers/getAVType.test.d.ts} +0 -0
  349. /package/lib/{src/js/drm/handlers → services/drmHandlers}/decideprofile.test.d.ts +0 -0
  350. /package/lib/{src/js/drm/handlers/verifydrm.test.d.ts → services/drmHandlers/utils.test.d.ts} +0 -0
  351. /package/lib/{src/js/fragments/removefragments.test.d.ts → services/drmHandlers/verifydrm.test.d.ts} +0 -0
  352. /package/lib/{src/js/fragments/setfragments.test.d.ts → services/eventListenerHandlers/removeEventListeners.test.d.ts} +0 -0
  353. /package/lib/{src/js/playeractions/handlers → services/keyboardHandlers}/resolvekeypress.test.d.ts +0 -0
  354. /package/lib/{src/js/ui/handlers/accessibilityhandler.test.d.ts → services/localStorageHandlers/localStorageHandlers.test.d.ts} +0 -0
  355. /package/lib/{src/js/ui/handlers/domhandlers.test.d.ts → services/npoPlayerAPI/npoPlayerAPI.test.d.ts} +0 -0
  356. /package/lib/{src/js/ui/handlers/nicamhandler.test.d.ts → services/segmentHandlers/addSegmentEventListeners.test.d.ts} +0 -0
  357. /package/lib/{src/js/ui/nativemobileuifactory.test.d.ts → services/segmentHandlers/convertFragmentToSegment.test.d.ts} +0 -0
  358. /package/lib/{src/js/utilities/utilities.test.d.ts → services/segmentHandlers/handleSegmentSeek.test.d.ts} +0 -0
  359. /package/lib/src/js/{utilities/localizationconfig.d.ts → settings/localization.d.ts} +0 -0
  360. /package/lib/{js → src}/ui/components/nativemobile/buttons.d.ts +0 -0
  361. /package/lib/{js → src}/ui/components/nativemobile/ctabar.d.ts +0 -0
  362. /package/lib/{js → src}/ui/components/nativemobile/titlebar.d.ts +0 -0
  363. /package/lib/{js → src}/ui/handlers/accessibilityhandler.d.ts +0 -0
  364. /package/lib/{js → src}/ui/handlers/listboxhandlers.d.ts +0 -0
  365. /package/lib/{js → src}/ui/handlers/playnextscreen.d.ts +0 -0
  366. /package/lib/{js → src}/ui/handlers/timecontrolhandlers.d.ts +0 -0
  367. /package/lib/{js → src}/ui/nativemobileuifactory.d.ts +0 -0
  368. /package/lib/{js/ui → ui}/components/adbutton.js +0 -0
  369. /package/lib/{js/ui → ui}/components/adlabel.js +0 -0
  370. /package/lib/{src/js/ui → ui}/components/nativemobile/buttons.d.ts +0 -0
  371. /package/lib/{src/js/ui → ui}/components/nativemobile/ctabar.d.ts +0 -0
  372. /package/lib/{src/js/ui → ui}/components/nativemobile/titlebar.d.ts +0 -0
  373. /package/lib/{js/ui → ui}/components/nativemobile/titlebar.js +0 -0
  374. /package/lib/{js/ui → ui}/components/titlebar.js +0 -0
  375. /package/lib/{src/js/ui → ui}/handlers/accessibilityhandler.d.ts +0 -0
  376. /package/lib/{js/ui → ui}/handlers/accessibilityhandler.test.js +0 -0
  377. /package/lib/{src/js/ui → ui}/handlers/listboxhandlers.d.ts +0 -0
  378. /package/lib/{src/js/ui → ui}/handlers/playnextscreen.d.ts +0 -0
  379. /package/lib/{src/js/ui → ui}/handlers/timecontrolhandlers.d.ts +0 -0
  380. /package/lib/{js/ui → ui}/handlers/timecontrolhandlers.js +0 -0
  381. /package/lib/{src/js/ui → ui}/nativemobileuifactory.d.ts +0 -0
  382. /package/src/{scss → style}/components/_advert.scss +0 -0
  383. /package/src/{scss → style}/components/_audio.scss +0 -0
  384. /package/src/{scss → style}/components/_buffering.scss +0 -0
  385. /package/src/{scss → style}/components/_error.scss +0 -0
  386. /package/src/{scss → style}/components/_hugeplaybacktogglebutton.scss +0 -0
  387. /package/src/{scss → style}/components/_metadata.scss +0 -0
  388. /package/src/{scss → style}/components/_nicam.scss +0 -0
  389. /package/src/{scss → style}/components/_playnext.scss +0 -0
  390. /package/src/{scss → style}/components/_replay.scss +0 -0
  391. /package/src/{scss → style}/components/_seekbar.scss +0 -0
  392. /package/src/{scss → style}/components/_seekbarthumbnail.scss +0 -0
  393. /package/src/{scss → style}/components/_textbuttons.scss +0 -0
  394. /package/src/{scss → style}/components/_volumeslider.scss +0 -0
  395. /package/src/{scss → style}/components/audio/_bottombar.scss +0 -0
  396. /package/src/{scss → style}/components/audio/_buffering.scss +0 -0
  397. /package/src/{scss → style}/components/audio/_errors.scss +0 -0
  398. /package/src/{scss → style}/components/audio/_metadata.scss +0 -0
  399. /package/src/{scss → style}/components/audio/_playbutton.scss +0 -0
  400. /package/src/{scss → style}/components/audio/_poster.scss +0 -0
  401. /package/src/{scss → style}/components/audio/_replay.scss +0 -0
  402. /package/src/{scss → style}/components/audio/_seekbar.scss +0 -0
  403. /package/src/{scss → style}/components/audio/_topbar.scss +0 -0
  404. /package/src/{scss → style}/components/audio/_vars.scss +0 -0
  405. /package/src/{scss → style}/components/audio/_volumeslider.scss +0 -0
  406. /package/src/{scss → style}/variants/_player-audio.scss +0 -0
  407. /package/src/{scss → style}/variants/_player-base.scss +0 -0
  408. /package/src/{scss → style}/variants/_player-debug.scss +0 -0
  409. /package/src/{scss → style}/variants/_player-large.scss +0 -0
  410. /package/src/{scss → style}/variants/_player-medium.scss +0 -0
  411. /package/src/{scss → style}/variants/_player-native-mobile.scss +0 -0
  412. /package/src/{scss → style}/vars/_audio.scss +0 -0
  413. /package/src/{scss → style}/vars/_colors.scss +0 -0
  414. /package/src/{scss → style}/vars/_fonts.scss +0 -0
  415. /package/src/{scss → style}/vars/_icons.scss +0 -0
@@ -1,10 +1,11 @@
1
1
  import { resolveKeyPress } from './resolvekeypress';
2
- import { ViewMode } from 'bitmovin-player';
3
- import { mockNpoPlayer } from '../../../../tests/mocks/mockNpoplayer';
2
+ import { mockNpoPlayer } from '../../../tests/mocks/mockNpoplayer';
3
+ import { ViewMode } from '../../types/interfaces';
4
4
  describe('resolveKeyPress', () => {
5
5
  let mockPlayer;
6
- let mockNpoplayer = mockNpoPlayer;
6
+ const mockNpoplayer = mockNpoPlayer;
7
7
  let e;
8
+ let mockPlayerContext;
8
9
  beforeEach(() => {
9
10
  jest.clearAllMocks();
10
11
  mockPlayer = {
@@ -31,50 +32,57 @@ describe('resolveKeyPress', () => {
31
32
  })
32
33
  };
33
34
  e = new KeyboardEvent('keydown');
35
+ mockPlayerContext = { player: mockPlayer, npoplayer: mockNpoplayer };
34
36
  });
35
37
  it('should mute/unmute the player when "KeyM" is pressed', () => {
36
38
  mockPlayer.isMuted.mockReturnValue(true);
37
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'KeyM' });
39
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'KeyM' });
38
40
  expect(mockPlayer.unmute).toHaveBeenCalled();
39
41
  });
40
42
  it('should enter/exit fullscreen mode when "KeyF" is pressed', () => {
41
43
  mockPlayer.getViewMode.mockReturnValue(ViewMode.Inline);
42
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'KeyF' });
44
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'KeyF' });
43
45
  expect(mockPlayer.setViewMode).toHaveBeenCalledWith(ViewMode.Fullscreen);
44
46
  });
45
47
  it('should play/pause the player when "Space" is pressed', () => {
46
48
  mockPlayer.isPaused.mockReturnValue(true);
47
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'Space' });
49
+ mockPlayer.play.mockImplementation(() => Promise.resolve().catch(() => {
50
+ console.log('Failed to play');
51
+ }));
52
+ const preventDefault = jest.fn();
53
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'Space', preventDefault });
48
54
  expect(mockPlayer.play).toHaveBeenCalled();
49
55
  });
50
56
  it('should increase the volume when "ArrowUp" is pressed', () => {
57
+ const preventDefault = jest.fn();
51
58
  mockPlayer.isMuted.mockReturnValue(true);
52
59
  mockNpoplayer.increaseVolume = jest.fn();
53
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'ArrowUp' });
60
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowUp', preventDefault });
54
61
  expect(mockPlayer.unmute).toHaveBeenCalled();
55
62
  expect(mockNpoplayer.increaseVolume).toHaveBeenCalled();
56
63
  });
57
64
  it('should decrease the volume when "ArrowDown" is pressed', () => {
65
+ const preventDefault = jest.fn();
58
66
  mockPlayer.isMuted.mockReturnValue(true);
59
67
  mockNpoplayer.decreaseVolume = jest.fn();
60
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'ArrowDown' });
68
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowDown', preventDefault });
61
69
  expect(mockPlayer.unmute).toHaveBeenCalled();
62
70
  expect(mockNpoplayer.decreaseVolume).toHaveBeenCalled();
63
71
  });
64
72
  it('should go backwards when "ArrowLeft" is pressed', () => {
65
73
  mockNpoplayer.goBackwards = jest.fn();
66
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'ArrowLeft' });
74
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowLeft' });
67
75
  expect(mockNpoplayer.goBackwards).toHaveBeenCalledWith(10);
68
76
  });
69
77
  it('should go forward when "ArrowRight" is pressed', () => {
70
78
  mockNpoplayer.goForward = jest.fn();
71
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'ArrowRight' });
79
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowRight' });
72
80
  expect(mockNpoplayer.goForward).toHaveBeenCalledWith(10);
73
81
  });
74
82
  it('should hide the settings panel when "Escape" is pressed', () => {
75
- if (mockNpoplayer.uiComponents.settingsPanel) {
76
- resolveKeyPress(mockPlayer, mockNpoplayer, { ...e, code: 'Escape' });
77
- expect(mockNpoplayer.uiComponents.settingsPanel.hide).toHaveBeenCalled();
83
+ if (mockNpoplayer.uiComponents.settingsPanels) {
84
+ resolveKeyPress(mockPlayerContext, { ...e, code: 'Escape' });
85
+ expect(mockNpoplayer.uiComponents.settingsPanels[0].hide).toHaveBeenCalled();
78
86
  }
79
87
  });
80
88
  });
@@ -0,0 +1,6 @@
1
+ import { PlayerContext } from 'types/interfaces';
2
+ export declare const handleLiveStreamControls: (playerContext: PlayerContext) => void;
3
+ export declare function updateForwardButtonState(player: any): void;
4
+ export declare function toggleForwardButtons(forwardButtons: NodeListOf<Element>, timeShift: number): void;
5
+ export declare function disableForwardButton(button: Element): void;
6
+ export declare function enableForwardButton(button: Element): void;
@@ -0,0 +1,35 @@
1
+ import { PlayerEvent } from 'bitmovin-player';
2
+ export const handleLiveStreamControls = (playerContext) => {
3
+ const liveStreamHandleTimeChangedCallback = () => updateForwardButtonState(playerContext.player);
4
+ const { player, npoplayer } = playerContext;
5
+ player.on(PlayerEvent.TimeChanged, liveStreamHandleTimeChangedCallback);
6
+ npoplayer.eventListeners = {
7
+ liveStreamHandleTimeChangedCallback
8
+ };
9
+ };
10
+ export function updateForwardButtonState(player) {
11
+ const timeShift = player?.getTimeShift();
12
+ const forwardButtons = player?.getContainer().querySelectorAll('.bmpui-ui-forwardbutton');
13
+ player.off(PlayerEvent.TimeChanged, () => {
14
+ updateForwardButtonState(player);
15
+ });
16
+ if (forwardButtons && timeShift !== undefined) {
17
+ toggleForwardButtons(forwardButtons, timeShift);
18
+ }
19
+ }
20
+ export function toggleForwardButtons(forwardButtons, timeShift) {
21
+ for (const forwardButton of forwardButtons) {
22
+ if (timeShift > -10) {
23
+ disableForwardButton(forwardButton);
24
+ }
25
+ else {
26
+ enableForwardButton(forwardButton);
27
+ }
28
+ }
29
+ }
30
+ export function disableForwardButton(button) {
31
+ button.setAttribute('disabled', 'true');
32
+ }
33
+ export function enableForwardButton(button) {
34
+ button.removeAttribute('disabled');
35
+ }
@@ -0,0 +1,4 @@
1
+ import { LocalStorageData, LocalStorageValues, PlayerContext } from 'types/interfaces';
2
+ export declare function setLocalStorage(key: LocalStorageValues, value: any): void;
3
+ export declare function getLocalStorage(): LocalStorageData;
4
+ export declare function setValuesBasedOnLocalStorage(playerContext: PlayerContext): void;
@@ -0,0 +1,33 @@
1
+ export function setLocalStorage(key, value) {
2
+ const prefixedKey = `npoplayer-${key}`;
3
+ localStorage.setItem(prefixedKey, JSON.stringify(value));
4
+ }
5
+ export function getLocalStorage() {
6
+ const result = {};
7
+ for (let i = 0; i < localStorage.length; i++) {
8
+ const key = localStorage.key(i);
9
+ if (key && key.startsWith('npoplayer-')) {
10
+ const item = localStorage.getItem(key);
11
+ if (item !== null) {
12
+ const originalKey = key.replace('npoplayer-', '');
13
+ result[originalKey] = JSON.parse(item);
14
+ }
15
+ }
16
+ }
17
+ return result;
18
+ }
19
+ export function setValuesBasedOnLocalStorage(playerContext) {
20
+ const localStorageData = getLocalStorage();
21
+ const player = playerContext.player;
22
+ if (!player) {
23
+ console.error('Player is undefined in playerContext');
24
+ return;
25
+ }
26
+ player.setVolume(localStorageData.volume ?? 100);
27
+ if (localStorageData.ismuted === 'true') {
28
+ player.mute();
29
+ }
30
+ if (localStorageData.subtitles_enabled === 'true') {
31
+ playerContext.npoplayer.streamOptions.enableSubtitles = true;
32
+ }
33
+ }
@@ -0,0 +1,109 @@
1
+ import { mockNpoPlayer } from '../../../tests/mocks/mockNpoplayer';
2
+ import { setLocalStorage, getLocalStorage, setValuesBasedOnLocalStorage } from './localStorageHandlers';
3
+ import { LocalStorageValues } from '../../types/interfaces';
4
+ describe('localStorageHandler', () => {
5
+ beforeEach(() => {
6
+ localStorage.clear();
7
+ });
8
+ describe('setLocalStorage', () => {
9
+ it('should set an item in local storage with a prefixed key', () => {
10
+ const key = LocalStorageValues.VOLUME;
11
+ const value = 50;
12
+ setLocalStorage(key, value);
13
+ const storedValue = localStorage.getItem('npoplayer-volume');
14
+ expect(storedValue).toEqual(JSON.stringify(value));
15
+ });
16
+ });
17
+ describe('getLocalStorage', () => {
18
+ beforeEach(() => {
19
+ localStorage.clear();
20
+ });
21
+ it('should retrieve all items with the npoplayer prefix from local storage and return them as an object', () => {
22
+ const key1 = `npoplayer-${LocalStorageValues.VOLUME}`;
23
+ const value1 = 50;
24
+ const key2 = `npoplayer-${LocalStorageValues.IS_MUTED}`;
25
+ const value2 = false;
26
+ localStorage.setItem(key1, JSON.stringify(value1));
27
+ localStorage.setItem(key2, JSON.stringify(value2));
28
+ const localStorageData = getLocalStorage();
29
+ expect(localStorageData).toEqual({
30
+ [LocalStorageValues.VOLUME]: value1,
31
+ [LocalStorageValues.IS_MUTED]: value2
32
+ });
33
+ });
34
+ it('should ignore items without the npoplayer prefix', () => {
35
+ const key1 = 'npoplayer-key1';
36
+ const value1 = { foo: 'bar1' };
37
+ const key2 = 'key2';
38
+ const value2 = { foo: 'bar2' };
39
+ localStorage.setItem(key1, JSON.stringify(value1));
40
+ localStorage.setItem(key2, JSON.stringify(value2));
41
+ const localStorageData = getLocalStorage();
42
+ expect(localStorageData).toEqual({
43
+ key1: value1
44
+ });
45
+ });
46
+ });
47
+ describe('setValuesBasedOnLocalStorage', () => {
48
+ let mockPlayerAPI;
49
+ let playerContext;
50
+ beforeEach(() => {
51
+ mockPlayerAPI = {
52
+ setVolume: jest.fn(),
53
+ mute: jest.fn()
54
+ };
55
+ playerContext = {
56
+ player: mockPlayerAPI,
57
+ npoplayer: {
58
+ ...mockNpoPlayer,
59
+ streamOptions: {
60
+ enableSubtitles: false
61
+ },
62
+ userPreferences: {
63
+ subtitles_enabled: 'false'
64
+ },
65
+ container: document.createElement('div'),
66
+ streamObject: {},
67
+ playerConfig: {},
68
+ initPlayer: () => { },
69
+ loadStream: () => Promise.resolve(),
70
+ createUIManager: async () => { },
71
+ doError: () => { },
72
+ play: async () => { },
73
+ pause: () => { },
74
+ setVolume: () => { },
75
+ increaseVolume: () => { },
76
+ decreaseVolume: () => { },
77
+ goForward: () => { },
78
+ goBackwards: () => { },
79
+ watchFromStart: () => { },
80
+ showPlayNextScreen: () => { },
81
+ updateMarkers: () => { },
82
+ cancelPlayNextScreen: () => { },
83
+ hidePlayNextScreen: () => { },
84
+ doPlayNext: () => { },
85
+ destroy: () => false,
86
+ unload: () => {
87
+ return true;
88
+ },
89
+ printVersion: () => { }
90
+ }
91
+ };
92
+ });
93
+ it('should set the volume based on local storage', () => {
94
+ localStorage.setItem('npoplayer-volume', JSON.stringify(50));
95
+ setValuesBasedOnLocalStorage(playerContext);
96
+ expect(mockPlayerAPI.setVolume).toHaveBeenCalledWith(50);
97
+ });
98
+ it('should mute the player if localStorage ismuted is true', () => {
99
+ localStorage.setItem('npoplayer-ismuted', JSON.stringify('true'));
100
+ setValuesBasedOnLocalStorage(playerContext);
101
+ expect(mockPlayerAPI.mute).toHaveBeenCalled();
102
+ });
103
+ it('should enable subtitles if localStorage subtitles_enabled is true', () => {
104
+ localStorage.setItem('npoplayer-subtitles_enabled', JSON.stringify('true'));
105
+ setValuesBasedOnLocalStorage(playerContext);
106
+ expect(playerContext.npoplayer.streamOptions.enableSubtitles).toBe(true);
107
+ });
108
+ });
109
+ });
@@ -0,0 +1,30 @@
1
+ import { PlayerAPI, PlayerEvent, PlayerEventCallback, SourceConfig, TimeMode, ViewMode } from 'bitmovin-player';
2
+ import { Technology } from 'types/interfaces';
3
+ export declare class NpoPlayerAPI {
4
+ playerAPI: PlayerAPI;
5
+ constructor(playerAPI: PlayerAPI);
6
+ load(sourceConfig: SourceConfig): Promise<void>;
7
+ play(): Promise<void>;
8
+ pause(): void;
9
+ mute(): void;
10
+ unmute(): void;
11
+ getVolume(): number;
12
+ setVolume(level: number): void;
13
+ setViewMode(viewMode: ViewMode): void;
14
+ getViewMode(): ViewMode;
15
+ areSubtitlesEnabled(): boolean;
16
+ enableSubtitles(): void;
17
+ isPaused(): boolean;
18
+ isMuted(): boolean;
19
+ getSupportedDRM(): Promise<string[]>;
20
+ getSupportedTech(): Technology[];
21
+ off(eventType: PlayerEvent, callback: PlayerEventCallback): void;
22
+ on(eventType: PlayerEvent, callback: PlayerEventCallback): void;
23
+ seek(time: number): void;
24
+ getContainer(): HTMLElement;
25
+ getNpoPlayerElement(): Element | null;
26
+ addClassToNpoPlayerElement(className: string): void | undefined;
27
+ removeClassFromNpoPlayerElement(className: string): void | undefined;
28
+ getCurrentTime(mode?: TimeMode | undefined): number;
29
+ getTimeShift(): number;
30
+ }
@@ -0,0 +1,91 @@
1
+ export class NpoPlayerAPI {
2
+ constructor(playerAPI) {
3
+ this.playerAPI = playerAPI;
4
+ }
5
+ async load(sourceConfig) {
6
+ await this.playerAPI.load(sourceConfig);
7
+ }
8
+ async play() {
9
+ await this.playerAPI.play();
10
+ }
11
+ pause() {
12
+ this.playerAPI.pause();
13
+ }
14
+ mute() {
15
+ this.playerAPI.mute();
16
+ }
17
+ unmute() {
18
+ this.playerAPI.unmute();
19
+ }
20
+ getVolume() {
21
+ return this.playerAPI.getVolume();
22
+ }
23
+ setVolume(level) {
24
+ this.playerAPI.setVolume(level);
25
+ }
26
+ setViewMode(viewMode) {
27
+ this.playerAPI.setViewMode(viewMode);
28
+ }
29
+ getViewMode() {
30
+ return this.playerAPI.getViewMode();
31
+ }
32
+ areSubtitlesEnabled() {
33
+ let subsEnabled = false;
34
+ const currentSubtitleTrack = this.playerAPI.subtitles.list();
35
+ for (const subtitle of currentSubtitleTrack) {
36
+ if (subtitle.enabled) {
37
+ subsEnabled = true;
38
+ break;
39
+ }
40
+ }
41
+ return subsEnabled;
42
+ }
43
+ enableSubtitles() {
44
+ const subtitleTracks = this.playerAPI.subtitles.list();
45
+ for (const subtitle of subtitleTracks) {
46
+ if (!subtitle.enabled) {
47
+ this.playerAPI.subtitles.enable(subtitle.id);
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ isPaused() {
53
+ return this.playerAPI.isPaused();
54
+ }
55
+ isMuted() {
56
+ return this.playerAPI.isMuted();
57
+ }
58
+ async getSupportedDRM() {
59
+ return (await this.playerAPI.getSupportedDRM());
60
+ }
61
+ getSupportedTech() {
62
+ return this.playerAPI.getSupportedTech();
63
+ }
64
+ off(eventType, callback) {
65
+ this.playerAPI.off(eventType, callback);
66
+ }
67
+ on(eventType, callback) {
68
+ this.playerAPI.on(eventType, callback);
69
+ }
70
+ seek(time) {
71
+ this.playerAPI.seek(time);
72
+ }
73
+ getContainer() {
74
+ return this.playerAPI.getContainer();
75
+ }
76
+ getNpoPlayerElement() {
77
+ return this.getContainer().querySelector('.bmpui-npo-player');
78
+ }
79
+ addClassToNpoPlayerElement(className) {
80
+ this.getNpoPlayerElement()?.classList.add(className);
81
+ }
82
+ removeClassFromNpoPlayerElement(className) {
83
+ this.getNpoPlayerElement()?.classList.remove(className);
84
+ }
85
+ getCurrentTime(mode) {
86
+ return this.playerAPI.getCurrentTime(mode);
87
+ }
88
+ getTimeShift() {
89
+ return this.playerAPI.getTimeShift();
90
+ }
91
+ }
@@ -0,0 +1,51 @@
1
+ import { NpoPlayerAPI } from './npoPlayerAPI';
2
+ describe('NpoPlayerAPI', () => {
3
+ let mockPlayerAPI;
4
+ let npoPlayerAPI;
5
+ beforeEach(() => {
6
+ mockPlayerAPI = {
7
+ play: jest.fn(),
8
+ pause: jest.fn(),
9
+ mute: jest.fn(),
10
+ unmute: jest.fn(),
11
+ setViewMode: jest.fn(),
12
+ getViewMode: jest.fn(),
13
+ isPaused: jest.fn(),
14
+ isMuted: jest.fn()
15
+ };
16
+ npoPlayerAPI = new NpoPlayerAPI(mockPlayerAPI);
17
+ });
18
+ it('should call play on the PlayerAPI', async () => {
19
+ await npoPlayerAPI.play();
20
+ expect(mockPlayerAPI.play).toHaveBeenCalled();
21
+ });
22
+ it('should call pause on the PlayerAPI', () => {
23
+ npoPlayerAPI.pause();
24
+ expect(mockPlayerAPI.pause).toHaveBeenCalled();
25
+ });
26
+ it('should call mute on the PlayerAPI', () => {
27
+ npoPlayerAPI.mute();
28
+ expect(mockPlayerAPI.mute).toHaveBeenCalled();
29
+ });
30
+ it('should call unmute on the PlayerAPI', () => {
31
+ npoPlayerAPI.unmute();
32
+ expect(mockPlayerAPI.unmute).toHaveBeenCalled();
33
+ });
34
+ it('should call setViewMode on the PlayerAPI', () => {
35
+ const viewMode = 'fullscreen';
36
+ npoPlayerAPI.setViewMode(viewMode);
37
+ expect(mockPlayerAPI.setViewMode).toHaveBeenCalledWith(viewMode);
38
+ });
39
+ it('should call getViewMode on the PlayerAPI', () => {
40
+ npoPlayerAPI.getViewMode();
41
+ expect(mockPlayerAPI.getViewMode).toHaveBeenCalled();
42
+ });
43
+ it('should call isPaused on the PlayerAPI', () => {
44
+ npoPlayerAPI.isPaused();
45
+ expect(mockPlayerAPI.isPaused).toHaveBeenCalled();
46
+ });
47
+ it('should call isMuted on the PlayerAPI', () => {
48
+ npoPlayerAPI.isMuted();
49
+ expect(mockPlayerAPI.isMuted).toHaveBeenCalled();
50
+ });
51
+ });
@@ -0,0 +1,2 @@
1
+ import { PlayerContext, Segment } from '../../types/interfaces';
2
+ export declare const addSegmentEventListeners: (playerContext: PlayerContext, segment: Segment) => void;
@@ -0,0 +1,14 @@
1
+ import { PlayerEvent } from 'bitmovin-player';
2
+ import { handleSegmentTimeChanged } from './handleSegmentTimeChanged';
3
+ import { handleSegmentSeek } from './handleSegmentSeek';
4
+ export const addSegmentEventListeners = (playerContext, segment) => {
5
+ const segmentHandleTimeChangedCallback = handleSegmentTimeChanged(playerContext, segment);
6
+ const segmentSeekFunctionCallback = handleSegmentSeek(playerContext, segment);
7
+ const { player, npoplayer } = playerContext;
8
+ player.on(PlayerEvent.TimeChanged, segmentHandleTimeChangedCallback);
9
+ player.on(PlayerEvent.Seek, segmentSeekFunctionCallback);
10
+ npoplayer.eventListeners = {
11
+ segmentHandleTimeChangedCallback,
12
+ segmentSeekFunctionCallback
13
+ };
14
+ };
@@ -0,0 +1,43 @@
1
+ import { PlayerEvent } from 'bitmovin-player';
2
+ import { addSegmentEventListeners } from './addSegmentEventListeners';
3
+ import { handleSegmentTimeChanged } from './handleSegmentTimeChanged';
4
+ import { handleSegmentSeek } from './handleSegmentSeek';
5
+ import { mockPlayerContext } from '../../../tests/mocks/mockPlayerContext';
6
+ jest.mock('./handleSegmentTimeChanged', () => ({
7
+ handleSegmentTimeChanged: jest.fn()
8
+ }));
9
+ jest.mock('./handleSegmentSeek', () => ({
10
+ handleSegmentSeek: jest.fn()
11
+ }));
12
+ describe('addSegmentEventListeners', () => {
13
+ const segment = { inpoint: 10, outpoint: 20, duration: 10 };
14
+ const context = { ...mockPlayerContext };
15
+ beforeEach(() => {
16
+ jest.clearAllMocks();
17
+ });
18
+ it('should add TimeChanged event listener', () => {
19
+ const segmentHandleTimeChangedCallback = jest.fn();
20
+ handleSegmentTimeChanged.mockReturnValue(segmentHandleTimeChangedCallback);
21
+ addSegmentEventListeners(context, segment);
22
+ expect(context.player.on).toHaveBeenCalledWith(PlayerEvent.TimeChanged, segmentHandleTimeChangedCallback);
23
+ expect(handleSegmentTimeChanged).toHaveBeenCalledWith(context, segment);
24
+ });
25
+ it('should add Seek event listener', () => {
26
+ const segmentSeekFunctionCallback = jest.fn();
27
+ handleSegmentSeek.mockReturnValue(segmentSeekFunctionCallback);
28
+ addSegmentEventListeners(mockPlayerContext, segment);
29
+ expect(context.player.on).toHaveBeenCalledWith(PlayerEvent.Seek, segmentSeekFunctionCallback);
30
+ expect(handleSegmentSeek).toHaveBeenCalledWith(context, segment);
31
+ });
32
+ it('should set segmentEventListeners in playerContext', () => {
33
+ const segmentHandleTimeChangedCallback = jest.fn();
34
+ const segmentSeekFunctionCallback = jest.fn();
35
+ handleSegmentTimeChanged.mockReturnValue(segmentHandleTimeChangedCallback);
36
+ handleSegmentSeek.mockReturnValue(segmentSeekFunctionCallback);
37
+ addSegmentEventListeners(context, segment);
38
+ expect(context.npoplayer.eventListeners).toEqual({
39
+ segmentHandleTimeChangedCallback,
40
+ segmentSeekFunctionCallback
41
+ });
42
+ });
43
+ });
@@ -0,0 +1,2 @@
1
+ import { Fragment, Segment } from 'types/interfaces';
2
+ export declare function convertFragmentToSegment(fragment: Fragment): Segment;
@@ -0,0 +1,8 @@
1
+ export function convertFragmentToSegment(fragment) {
2
+ const { duration, time } = fragment.sections[0];
3
+ return {
4
+ inpoint: time,
5
+ outpoint: time + duration,
6
+ duration: duration
7
+ };
8
+ }
@@ -0,0 +1,17 @@
1
+ import { convertFragmentToSegment } from './convertFragmentToSegment';
2
+ describe('convertFragmentToSegment', () => {
3
+ const SECTION_START = 500;
4
+ const SECTION_DURATION = 610;
5
+ it('should convert fragment to segment correctly', () => {
6
+ const fragment = {
7
+ sections: [{ time: SECTION_START, duration: SECTION_DURATION, title: 'Section 1' }]
8
+ };
9
+ const expectedSegment = {
10
+ inpoint: SECTION_START,
11
+ outpoint: SECTION_START + SECTION_DURATION,
12
+ duration: SECTION_DURATION
13
+ };
14
+ const result = convertFragmentToSegment(fragment);
15
+ expect(result).toEqual(expectedSegment);
16
+ });
17
+ });
@@ -0,0 +1,5 @@
1
+ import { PlayerContext, Segment } from 'types/interfaces';
2
+ export declare const handleSegmentSeek: (playerContext: PlayerContext, segment: Segment) => (e: any) => void;
3
+ export declare const getSeekTarget: (event: any) => number;
4
+ export declare const isSeekOutsideSegment: (seekTarget: number, segment: Segment) => boolean;
5
+ export declare const clampSeekTarget: (seekTarget: number, segment: Segment) => number;
@@ -0,0 +1,15 @@
1
+ export const handleSegmentSeek = (playerContext, segment) => (e) => {
2
+ const seekTarget = getSeekTarget(e);
3
+ if (isSeekOutsideSegment(seekTarget, segment)) {
4
+ playerContext.player.seek(clampSeekTarget(seekTarget, segment));
5
+ }
6
+ };
7
+ export const getSeekTarget = (event) => {
8
+ return event.seekTarget ? event.seekTarget : event.to.time;
9
+ };
10
+ export const isSeekOutsideSegment = (seekTarget, segment) => {
11
+ return seekTarget > segment.outpoint || seekTarget < segment.inpoint;
12
+ };
13
+ export const clampSeekTarget = (seekTarget, segment) => {
14
+ return Math.max(segment.inpoint, Math.min(segment.outpoint, seekTarget));
15
+ };
@@ -0,0 +1,73 @@
1
+ import { handleSegmentSeek, getSeekTarget, isSeekOutsideSegment, clampSeekTarget } from './handleSegmentSeek';
2
+ import { mockPlayerContext } from '../../../tests/mocks/mockPlayerContext';
3
+ describe('segmentHandler', () => {
4
+ const SEGMENT_INPOINT = 500;
5
+ const SEGMENT_OUTPOINT = 1500;
6
+ const SEGMENT_DURATION = 1000;
7
+ const SEEK_TARGET_WITHIN = 800;
8
+ const SEEK_TARGET_ABOVE = 1600;
9
+ const SEEK_TARGET_BELOW = 400;
10
+ let segment;
11
+ beforeEach(() => {
12
+ segment = {
13
+ inpoint: SEGMENT_INPOINT,
14
+ outpoint: SEGMENT_OUTPOINT,
15
+ duration: SEGMENT_DURATION
16
+ };
17
+ });
18
+ afterEach(() => {
19
+ jest.clearAllMocks();
20
+ });
21
+ describe('getSeekTarget', () => {
22
+ it('should return seekTarget if present in event', () => {
23
+ const event = { seekTarget: SEEK_TARGET_WITHIN };
24
+ expect(getSeekTarget(event)).toBe(SEEK_TARGET_WITHIN);
25
+ });
26
+ it('should return event.to.time if seekTarget is not present', () => {
27
+ const event = { to: { time: SEEK_TARGET_WITHIN } };
28
+ expect(getSeekTarget(event)).toBe(SEEK_TARGET_WITHIN);
29
+ });
30
+ });
31
+ describe('isSeekOutsideSegment', () => {
32
+ it('should return true if seekTarget is greater than segment.outpoint', () => {
33
+ expect(isSeekOutsideSegment(SEEK_TARGET_ABOVE, segment)).toBe(true);
34
+ });
35
+ it('should return true if seekTarget is less than segment.inpoint', () => {
36
+ expect(isSeekOutsideSegment(SEEK_TARGET_BELOW, segment)).toBe(true);
37
+ });
38
+ it('should return false if seekTarget is within segment bounds', () => {
39
+ expect(isSeekOutsideSegment(SEEK_TARGET_WITHIN, segment)).toBe(false);
40
+ });
41
+ });
42
+ describe('clampSeekTarget', () => {
43
+ it('should return inpoint if seekTarget is less than inpoint', () => {
44
+ expect(clampSeekTarget(SEEK_TARGET_BELOW, segment)).toBe(SEGMENT_INPOINT);
45
+ });
46
+ it('should return outpoint if seekTarget is greater than outpoint', () => {
47
+ expect(clampSeekTarget(SEEK_TARGET_ABOVE, segment)).toBe(SEGMENT_OUTPOINT);
48
+ });
49
+ it('should return seekTarget if it is within segment bounds', () => {
50
+ expect(clampSeekTarget(SEEK_TARGET_WITHIN, segment)).toBe(SEEK_TARGET_WITHIN);
51
+ });
52
+ });
53
+ describe('handleSegmentSeek', () => {
54
+ it('should seek to the clamped seekTarget if outside segment', () => {
55
+ const event = { seekTarget: SEEK_TARGET_ABOVE };
56
+ const handler = handleSegmentSeek(mockPlayerContext, segment);
57
+ handler(event);
58
+ expect(mockPlayerContext.player.seek).toHaveBeenCalledWith(SEGMENT_OUTPOINT);
59
+ });
60
+ it('should not seek if the seekTarget is within segment', () => {
61
+ const event = { seekTarget: SEEK_TARGET_WITHIN };
62
+ const handler = handleSegmentSeek(mockPlayerContext, segment);
63
+ handler(event);
64
+ expect(mockPlayerContext.player.seek).not.toHaveBeenCalled();
65
+ });
66
+ it('should seek to the clamped seekTarget using event.to.time', () => {
67
+ const event = { to: { time: SEEK_TARGET_ABOVE } };
68
+ const handler = handleSegmentSeek(mockPlayerContext, segment);
69
+ handler(event);
70
+ expect(mockPlayerContext.player.seek).toHaveBeenCalledWith(SEGMENT_OUTPOINT);
71
+ });
72
+ });
73
+ });
@@ -0,0 +1,2 @@
1
+ import { PlayerContext, Segment } from 'types/interfaces';
2
+ export declare const handleSegmentTimeChanged: (playerContext: PlayerContext, segment: Segment) => (e: any) => void;