@npo/player 1.25.0 → 1.27.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 (249) hide show
  1. package/README.md +1 -1
  2. package/lib/js/playeractions/handlers/handleoffsets.js +9 -7
  3. package/lib/js/playeractions/handlers/handleoffsets.test.js +1 -1
  4. package/lib/js/playeractions/handlers/mediasessionactions.js +2 -2
  5. package/lib/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
  6. package/lib/js/playeractions/handlers/processplayerconfig.js +4 -4
  7. package/lib/js/playeractions/handlers/processsourceconfig.d.ts +1 -0
  8. package/lib/js/playeractions/handlers/processsourceconfig.js +4 -5
  9. package/lib/js/playeractions/handlers/processsourceconfig.test.js +25 -0
  10. package/lib/js/playeractions/playeractions.d.ts +0 -1
  11. package/lib/js/playeractions/playeractions.js +0 -1
  12. package/lib/js/utilities/utilities.prid.d.ts +6 -0
  13. package/lib/js/utilities/utilities.prid.js +8 -0
  14. package/lib/js/utilities/utilities.prid.test.js +46 -0
  15. package/lib/lang/nl.json +1 -1
  16. package/lib/lang/subtitleLabels/nl.json +14 -0
  17. package/lib/npoplayer.d.ts +3 -4
  18. package/lib/npoplayer.js +66 -83
  19. package/lib/npoplayer.test.js +3 -3
  20. package/lib/package.json +2 -2
  21. package/lib/services/a11y/setup.js +2 -5
  22. package/lib/services/a11y/setup.test.js +2 -20
  23. package/lib/services/advertHandlers/discardAdBreak.js +6 -4
  24. package/lib/services/advertHandlers/discardAdBreak.test.js +31 -14
  25. package/lib/services/advertHandlers/handlePreRolls.js +19 -21
  26. package/lib/services/advertHandlers/handlePrerolls.test.js +66 -5
  27. package/lib/services/drmHandlers/decideprofile.js +8 -2
  28. package/lib/services/drmHandlers/decideprofile.test.js +5 -1
  29. package/lib/services/drmHandlers/verifydrm.js +7 -8
  30. package/lib/services/drmHandlers/verifydrm.test.js +32 -9
  31. package/lib/services/errors/errorBackground.test.js +48 -0
  32. package/lib/services/errors/errorHandler.d.ts +3 -0
  33. package/lib/services/errors/errorHandler.js +45 -0
  34. package/lib/services/errors/errorText.d.ts +2 -0
  35. package/lib/services/errors/errorText.js +59 -0
  36. package/lib/services/errors/errorText.test.js +66 -0
  37. package/lib/services/eventListenerHandlers/removeEventListeners.js +2 -2
  38. package/lib/services/eventListenerHandlers/removeEventListeners.test.js +9 -9
  39. package/lib/services/keyboardHandlers/resolvekeypress.js +21 -17
  40. package/lib/services/keyboardHandlers/resolvekeypress.test.js +1 -1
  41. package/lib/services/liveStreamHandlers/handleLiveStreamControls.js +2 -2
  42. package/lib/services/liveStreamHandlers/handleLiveStreamControls.test.js +2 -2
  43. package/lib/services/localStorageHandlers/localStorageHandlers.js +6 -3
  44. package/lib/services/localStorageHandlers/localStorageHandlers.test.js +2 -6
  45. package/lib/services/nicamHandlers/nicamhandler.d.ts +1 -2
  46. package/lib/services/nicamHandlers/nicamhandler.js +15 -18
  47. package/lib/services/nicamHandlers/nicamhandler.test.js +67 -9
  48. package/lib/services/npoPlayerAPI/contants.d.ts +20 -0
  49. package/lib/services/npoPlayerAPI/contants.js +6 -0
  50. package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +6 -3
  51. package/lib/services/npoPlayerAPI/npoPlayerAPI.js +43 -26
  52. package/lib/services/npoPlayerAPI/npoPlayerAPI.test.js +11 -0
  53. package/lib/services/preferences/handlePreferences.d.ts +2 -0
  54. package/lib/services/preferences/handlePreferences.js +42 -0
  55. package/lib/services/preferences/handlePreferences.test.js +102 -0
  56. package/lib/services/segmentHandlers/addSegmentEventListeners.js +2 -2
  57. package/lib/services/segmentHandlers/addSegmentEventListeners.test.js +1 -1
  58. package/lib/services/services.d.ts +14 -4
  59. package/lib/services/services.js +49 -4
  60. package/lib/services/streamFetchHandler/fetchStream.d.ts +2 -0
  61. package/lib/services/streamFetchHandler/fetchStream.js +48 -0
  62. package/lib/services/streamFetchHandler/fetchstream.test.js +70 -0
  63. package/lib/services/streamoptionsHandlers/{steamOptionsHandler.js → streamOptionsHandler.js} +11 -11
  64. package/lib/services/streamoptionsHandlers/streamOptionsHandler.test.js +20 -20
  65. package/lib/services/trackingHandlers/eventBinding.d.ts +2 -0
  66. package/lib/{js/tracking/handlers/eventbinding.js → services/trackingHandlers/eventBinding.js} +16 -14
  67. package/lib/services/trackingHandlers/eventBinding.test.js +89 -0
  68. package/lib/services/trackingHandlers/eventLogging.d.ts +2 -0
  69. package/lib/{js/tracking/handlers/eventlogging.js → services/trackingHandlers/eventLogging.js} +18 -7
  70. package/lib/services/trackingHandlers/eventLogging.test.js +63 -0
  71. package/lib/services/trackingHandlers/index.d.ts +3 -0
  72. package/lib/services/trackingHandlers/index.js +3 -0
  73. package/lib/services/trackingHandlers/playerTrackerInit.d.ts +2 -0
  74. package/lib/{js/tracking/handlers/playertrackerinit.js → services/trackingHandlers/playerTrackerInit.js} +6 -3
  75. package/lib/services/trackingHandlers/playerTrackerInit.test.js +75 -0
  76. package/lib/services/trackingHandlers/playerTrackerStart.d.ts +2 -0
  77. package/lib/services/trackingHandlers/playerTrackerStart.js +25 -0
  78. package/lib/services/trackingHandlers/playerTrackerStart.test.js +59 -0
  79. package/lib/services/trackingHandlers/streamTrackerInit.d.ts +3 -0
  80. package/lib/services/trackingHandlers/streamTrackerInit.js +27 -0
  81. package/lib/services/trackingHandlers/streamTrackerInit.test.js +84 -0
  82. package/lib/services/uiHandlers/uiVisiblityHandler.d.ts +3 -0
  83. package/lib/services/uiHandlers/uiVisiblityHandler.js +26 -0
  84. package/lib/services/uiHandlers/uiVisiblityHandler.test.js +62 -0
  85. package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.d.ts +2 -2
  86. package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.js +4 -6
  87. package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.test.js +4 -17
  88. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.d.ts +2 -0
  89. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.js +26 -0
  90. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.test.d.ts +1 -0
  91. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.test.js +82 -0
  92. package/lib/src/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
  93. package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +1 -0
  94. package/lib/src/js/playeractions/handlers/processsourceconfig.test.d.ts +1 -0
  95. package/lib/src/js/playeractions/playeractions.d.ts +0 -1
  96. package/lib/src/js/utilities/utilities.prid.d.ts +6 -0
  97. package/lib/src/js/utilities/utilities.prid.test.d.ts +1 -0
  98. package/lib/src/npoplayer.d.ts +3 -4
  99. package/lib/src/services/errors/errorBackground.test.d.ts +1 -0
  100. package/lib/src/services/errors/errorHandler.d.ts +3 -0
  101. package/lib/src/services/errors/errorText.d.ts +2 -0
  102. package/lib/src/services/errors/errorText.test.d.ts +1 -0
  103. package/lib/src/services/nicamHandlers/nicamhandler.d.ts +1 -2
  104. package/lib/src/services/npoPlayerAPI/contants.d.ts +20 -0
  105. package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +6 -3
  106. package/lib/src/services/preferences/handlePreferences.d.ts +2 -0
  107. package/lib/src/services/preferences/handlePreferences.test.d.ts +1 -0
  108. package/lib/src/services/services.d.ts +14 -4
  109. package/lib/src/services/streamFetchHandler/fetchStream.d.ts +2 -0
  110. package/lib/src/services/streamFetchHandler/fetchstream.test.d.ts +1 -0
  111. package/lib/src/services/trackingHandlers/eventBinding.d.ts +2 -0
  112. package/lib/src/services/trackingHandlers/eventBinding.test.d.ts +1 -0
  113. package/lib/src/services/trackingHandlers/eventLogging.d.ts +2 -0
  114. package/lib/src/services/trackingHandlers/eventLogging.test.d.ts +1 -0
  115. package/lib/src/services/trackingHandlers/index.d.ts +3 -0
  116. package/lib/src/services/trackingHandlers/playerTrackerInit.d.ts +2 -0
  117. package/lib/src/services/trackingHandlers/playerTrackerInit.test.d.ts +1 -0
  118. package/lib/src/services/trackingHandlers/playerTrackerStart.d.ts +2 -0
  119. package/lib/src/services/trackingHandlers/playerTrackerStart.test.d.ts +1 -0
  120. package/lib/src/services/trackingHandlers/streamTrackerInit.d.ts +3 -0
  121. package/lib/src/services/trackingHandlers/streamTrackerInit.test.d.ts +1 -0
  122. package/lib/src/services/uiHandlers/uiVisiblityHandler.d.ts +3 -0
  123. package/lib/src/services/uiHandlers/uiVisiblityHandler.test.d.ts +1 -0
  124. package/lib/src/services/verticalVideoHandlers/handleVerticalVideoControls.d.ts +2 -2
  125. package/lib/src/services/verticalVideoHandlers/handleVerticalVideoSettings.d.ts +2 -0
  126. package/lib/src/services/verticalVideoHandlers/handleVerticalVideoSettings.test.d.ts +1 -0
  127. package/lib/src/types/classes.d.ts +6 -0
  128. package/lib/src/types/interfaces.d.ts +39 -4
  129. package/lib/src/ui/components/adbutton.d.ts +1 -1
  130. package/lib/src/ui/components/adlabel.d.ts +1 -1
  131. package/lib/src/ui/components/buttons.d.ts +6 -16
  132. package/lib/src/ui/components/controlbar.d.ts +2 -2
  133. package/lib/src/ui/components/ctabar.d.ts +1 -1
  134. package/lib/src/ui/components/playnext.d.ts +1 -4
  135. package/lib/src/ui/components/seekbar.d.ts +2 -1
  136. package/lib/src/ui/components/titlebar.d.ts +1 -1
  137. package/lib/src/ui/components/verticalvideo/controlbar.d.ts +3 -3
  138. package/lib/src/ui/components/verticalvideo/settingspanel.d.ts +2 -0
  139. package/lib/src/ui/handlers/playnextscreen.test.d.ts +1 -0
  140. package/lib/src/ui/uicontainer.test.d.ts +1 -0
  141. package/lib/tests/mocks/mockLogEmitter.d.ts +2 -0
  142. package/lib/tests/mocks/mockLogEmitter.js +20 -0
  143. package/lib/tests/mocks/mockNpoplayer.js +2 -3
  144. package/lib/tests/mocks/mockStreamObject.d.ts +2 -0
  145. package/lib/tests/mocks/mockStreamObject.js +21 -0
  146. package/lib/tests/mocks/playerContextMock.d.ts +6 -3
  147. package/lib/tests/mocks/playerContextMock.js +12 -6
  148. package/lib/types/classes.d.ts +6 -0
  149. package/lib/types/classes.js +12 -0
  150. package/lib/types/interfaces.d.ts +39 -4
  151. package/lib/types/interfaces.js +1 -0
  152. package/lib/ui/components/adbutton.d.ts +1 -1
  153. package/lib/ui/components/adbutton.js +3 -3
  154. package/lib/ui/components/adlabel.d.ts +1 -1
  155. package/lib/ui/components/adlabel.js +3 -3
  156. package/lib/ui/components/audio/controlbar.js +2 -1
  157. package/lib/ui/components/buttons.d.ts +6 -16
  158. package/lib/ui/components/buttons.js +27 -10
  159. package/lib/ui/components/controlbar.d.ts +2 -2
  160. package/lib/ui/components/controlbar.js +21 -38
  161. package/lib/ui/components/ctabar.d.ts +1 -1
  162. package/lib/ui/components/ctabar.js +4 -4
  163. package/lib/ui/components/nativemobile/topbar.js +2 -2
  164. package/lib/ui/components/playnext.d.ts +1 -4
  165. package/lib/ui/components/playnext.js +3 -3
  166. package/lib/ui/components/seekbar.d.ts +2 -1
  167. package/lib/ui/components/seekbar.js +5 -3
  168. package/lib/ui/components/settingspanel.js +7 -9
  169. package/lib/ui/components/titlebar.d.ts +1 -1
  170. package/lib/ui/components/titlebar.js +2 -2
  171. package/lib/ui/components/topbar.js +6 -20
  172. package/lib/ui/components/verticalvideo/controlbar.d.ts +3 -3
  173. package/lib/ui/components/verticalvideo/controlbar.js +15 -12
  174. package/lib/ui/components/verticalvideo/settingspanel.d.ts +2 -0
  175. package/lib/ui/components/verticalvideo/settingspanel.js +21 -0
  176. package/lib/ui/handlers/domhandlers.test.js +6 -26
  177. package/lib/ui/handlers/playnextscreen.test.d.ts +1 -0
  178. package/lib/ui/nativemobileuifactory.js +2 -2
  179. package/lib/ui/nativemobileuifactory.test.js +2 -1
  180. package/lib/ui/uicontainer.js +14 -30
  181. package/lib/ui/uicontainer.test.d.ts +1 -0
  182. package/lib/ui/uicontainer.test.js +83 -0
  183. package/package.json +2 -2
  184. package/src/style/components/_advert.scss +3 -12
  185. package/src/style/components/_buffering.scss +14 -8
  186. package/src/style/components/_error.scss +44 -1
  187. package/src/style/components/_hugeplaybacktogglebutton.scss +1 -0
  188. package/src/style/components/_metadata.scss +13 -12
  189. package/src/style/components/_nicam.scss +16 -10
  190. package/src/style/components/_playnext.scss +1 -1
  191. package/src/style/components/_replay.scss +1 -6
  192. package/src/style/components/_settingspanel.scss +121 -95
  193. package/src/style/components/audio/_errors.scss +1 -1
  194. package/src/style/components/audio/_metadata.scss +14 -8
  195. package/src/style/components/audio/_playbutton.scss +1 -0
  196. package/src/style/components/audio/_topbar.scss +10 -2
  197. package/src/style/components/audio/_volumeslider.scss +3 -3
  198. package/src/style/components/vertical-video/_bottombar.scss +42 -1
  199. package/src/style/components/vertical-video/_hugeplaybacktogglebutton.scss +24 -4
  200. package/src/style/components/vertical-video/_settingspanel.scss +21 -4
  201. package/src/style/components/vertical-video/_topbar.scss +47 -6
  202. package/src/style/npoplayer.css +108 -70
  203. package/src/style/npoplayer.scss +4 -7
  204. package/src/style/variants/_player-base.scss +14 -2
  205. package/src/style/variants/_player-large.scss +5 -1
  206. package/src/style/variants/_player-small.scss +26 -9
  207. package/src/style/vars/_fonts.scss +13 -7
  208. package/src/style/vars/_z-index.scss +1 -0
  209. package/lib/js/api/getstreamobject.d.ts +0 -3
  210. package/lib/js/api/getstreamobject.js +0 -38
  211. package/lib/js/api/getstreamobject.test.js +0 -48
  212. package/lib/js/playeractions/customerrors.test.js +0 -51
  213. package/lib/js/playeractions/handlers/customerrors.d.ts +0 -50
  214. package/lib/js/playeractions/handlers/customerrors.js +0 -56
  215. package/lib/js/playeractions/handlers/error.d.ts +0 -3
  216. package/lib/js/playeractions/handlers/error.js +0 -14
  217. package/lib/js/playeractions/handlers/error.test.js +0 -44
  218. package/lib/js/tracking/handlers/eventbinding.d.ts +0 -3
  219. package/lib/js/tracking/handlers/eventlogging.d.ts +0 -2
  220. package/lib/js/tracking/handlers/eventlogging.test.js +0 -46
  221. package/lib/js/tracking/handlers/playertrackerinit.d.ts +0 -4
  222. package/lib/js/tracking/handlers/playertrackerinit.test.js +0 -74
  223. package/lib/js/tracking/handlers/playertrackerstart.d.ts +0 -1
  224. package/lib/js/tracking/handlers/playertrackerstart.js +0 -25
  225. package/lib/js/tracking/playertracker.d.ts +0 -4
  226. package/lib/js/tracking/playertracker.js +0 -4
  227. package/lib/src/js/api/getstreamobject.d.ts +0 -3
  228. package/lib/src/js/playeractions/handlers/customerrors.d.ts +0 -50
  229. package/lib/src/js/playeractions/handlers/error.d.ts +0 -3
  230. package/lib/src/js/tracking/handlers/eventbinding.d.ts +0 -3
  231. package/lib/src/js/tracking/handlers/eventlogging.d.ts +0 -2
  232. package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +0 -4
  233. package/lib/src/js/tracking/handlers/playertrackerstart.d.ts +0 -1
  234. package/lib/src/js/tracking/playertracker.d.ts +0 -4
  235. /package/lib/js/{api/getstreamobject.test.d.ts → playeractions/handlers/processsourceconfig.test.d.ts} +0 -0
  236. /package/lib/js/{playeractions/customerrors.test.d.ts → utilities/utilities.prid.test.d.ts} +0 -0
  237. /package/lib/{js/playeractions/handlers/error.test.d.ts → services/errors/errorBackground.test.d.ts} +0 -0
  238. /package/lib/{js/tracking/handlers/eventlogging.test.d.ts → services/errors/errorText.test.d.ts} +0 -0
  239. /package/lib/{js/tracking/handlers/playertrackerinit.test.d.ts → services/preferences/handlePreferences.test.d.ts} +0 -0
  240. /package/lib/{src/js/api/getstreamobject.test.d.ts → services/streamFetchHandler/fetchstream.test.d.ts} +0 -0
  241. /package/lib/services/streamoptionsHandlers/{steamOptionsHandler.d.ts → streamOptionsHandler.d.ts} +0 -0
  242. /package/lib/{src/js/playeractions/customerrors.test.d.ts → services/trackingHandlers/eventBinding.test.d.ts} +0 -0
  243. /package/lib/{src/js/playeractions/handlers/error.test.d.ts → services/trackingHandlers/eventLogging.test.d.ts} +0 -0
  244. /package/lib/{src/js/tracking/handlers/eventlogging.test.d.ts → services/trackingHandlers/playerTrackerInit.test.d.ts} +0 -0
  245. /package/lib/{src/js/tracking/handlers/playertrackerinit.test.d.ts → services/trackingHandlers/playerTrackerStart.test.d.ts} +0 -0
  246. /package/lib/{src/ui/handlers/playnextstreen.test.d.ts → services/trackingHandlers/streamTrackerInit.test.d.ts} +0 -0
  247. /package/lib/{ui/handlers/playnextstreen.test.d.ts → services/uiHandlers/uiVisiblityHandler.test.d.ts} +0 -0
  248. /package/lib/src/services/streamoptionsHandlers/{steamOptionsHandler.d.ts → streamOptionsHandler.d.ts} +0 -0
  249. /package/lib/ui/handlers/{playnextstreen.test.js → playnextscreen.test.js} +0 -0
package/README.md CHANGED
@@ -11,7 +11,7 @@ Extensive and up-to-date documentation is available at https://docs.npoplayer.nl
11
11
  Code quality is analysed by SonarCloud. The project can be found at https://sonarcloud.io/project/overview?id=NPOstart_npo-player
12
12
 
13
13
  # Changelog
14
- Current version: v1.25.0
14
+ Current version: v1.27.0
15
15
 
16
16
  The changelog is available at https://docs.npoplayer.nl/implementation/web/changelog/
17
17
 
@@ -8,11 +8,13 @@ export function handleStartOffset(playerContext, offset) {
8
8
  return;
9
9
  }
10
10
  const seek = () => {
11
+ player.off(NpoPlayerEvent.Ready, seek);
11
12
  player.off(NpoPlayerEvent.SourceLoaded, seek);
12
13
  player.off(NpoPlayerEvent.AdBreakFinished, seek);
13
14
  player.off(NpoPlayerEvent.AdError, seek);
14
15
  player.seek(offset);
15
16
  };
17
+ player.on(NpoPlayerEvent.Ready, seek);
16
18
  player.on(NpoPlayerEvent.SourceLoaded, seek);
17
19
  player.on(NpoPlayerEvent.AdBreakFinished, seek);
18
20
  player.on(NpoPlayerEvent.AdError, seek);
@@ -28,22 +30,22 @@ export function shiftToProgramStart(playerContext, timestamp) {
28
30
  player.timeShift(timestamp);
29
31
  }
30
32
  export function handleLiveOffsetLogic(playerContext, options) {
31
- const { player, npoplayer } = playerContext;
32
- if (npoplayer.uiComponents.watchFromStartButton == undefined)
33
+ const { player, npoPlayer } = playerContext;
34
+ if (npoPlayer.uiComponents.watchFromStartButton == undefined)
33
35
  return;
34
36
  if (options?.liveProgramTime == undefined) {
35
- npoplayer.uiComponents.watchFromStartButton.hide();
37
+ npoPlayer.uiComponents.watchFromStartButton.hide();
36
38
  return;
37
39
  }
38
- npoplayer.streamOptions.liveProgramTime = options.liveProgramTime;
40
+ npoPlayer.streamOptions.liveProgramTime = options.liveProgramTime;
39
41
  if (player.isLive() && options.liveProgramTime > 0) {
40
- npoplayer.uiComponents.watchFromStartButton.show();
42
+ npoPlayer.uiComponents.watchFromStartButton.show();
41
43
  }
42
44
  else {
43
- npoplayer.uiComponents.watchFromStartButton.hide();
45
+ npoPlayer.uiComponents.watchFromStartButton.hide();
44
46
  }
45
47
  if (options.liveOffset !== null && options.liveOffset !== false && options.liveProgramTime > 0) {
46
- npoplayer.uiComponents.watchFromStartButton.hide();
48
+ npoPlayer.uiComponents.watchFromStartButton.hide();
47
49
  shiftToProgramStart(playerContext, options.liveProgramTime);
48
50
  }
49
51
  }
@@ -39,7 +39,7 @@ describe('Test offset handling', () => {
39
39
  seek: seekMock,
40
40
  off: jest.fn(),
41
41
  on: jest.fn((event, callback) => {
42
- if (event === PlayerEvent.SourceLoaded) {
42
+ if (event === PlayerEvent.Ready) {
43
43
  callback();
44
44
  }
45
45
  })
@@ -91,7 +91,7 @@ export function setupMediaSessionActionHandlers(player, sourceConfig, _streamObj
91
91
  },
92
92
  {
93
93
  action: 'play',
94
- handler: () => player.play()
94
+ handler: () => void player.play()
95
95
  },
96
96
  {
97
97
  action: 'pause',
@@ -99,7 +99,7 @@ export function setupMediaSessionActionHandlers(player, sourceConfig, _streamObj
99
99
  },
100
100
  {
101
101
  action: 'stop',
102
- handler: () => player.unload()
102
+ handler: () => void player.unload()
103
103
  }
104
104
  ];
105
105
  for (const { action, handler } of actionHandlers) {
@@ -1,3 +1,3 @@
1
1
  import { type PlayerConfig } from 'bitmovin-player';
2
2
  import NpoPlayer from 'npoplayer';
3
- export declare function processPlayerConfig(npoplayer: NpoPlayer, playerConfig: PlayerConfig): PlayerConfig;
3
+ export declare function processPlayerConfig(npoPlayer: NpoPlayer, playerConfig: PlayerConfig): PlayerConfig;
@@ -1,6 +1,6 @@
1
1
  import { LogLevel } from 'bitmovin-player';
2
2
  import { isSafari } from '../../utilities/utilities.user-agent';
3
- export function processPlayerConfig(npoplayer, playerConfig) {
3
+ export function processPlayerConfig(npoPlayer, playerConfig) {
4
4
  const processedConfig = playerConfig;
5
5
  if (isSafari()) {
6
6
  processedConfig.playback = {
@@ -17,9 +17,9 @@ export function processPlayerConfig(npoplayer, playerConfig) {
17
17
  receiverVersion: 'v3',
18
18
  messageNamespace: 'urn:x-cast:com.bitmovin.player.caf',
19
19
  customReceiverConfig: {
20
- drm: npoplayer.drmProfile.drm,
21
- profileName: npoplayer.drmProfile.profileName,
22
- jwt: npoplayer.jwt
20
+ drm: npoPlayer.drmProfile.drm,
21
+ profileName: npoPlayer.drmProfile.profileName,
22
+ jwt: npoPlayer.jwt
23
23
  }
24
24
  };
25
25
  const userRemoteControlConfig = processedConfig.remotecontrol || defaultRemoteControlConfig;
@@ -2,4 +2,5 @@ import { StreamObject, StreamOptions } from 'types/interfaces';
2
2
  import { SourceConfig } from 'bitmovin-player';
3
3
  import { NpoPlayerServices } from '../../../services/services';
4
4
  import { NPOTag } from '@npotag/tag';
5
+ export declare const getSubtitleLabels: (data: any) => string;
5
6
  export declare function processSourceConfig(npoPlayerServices: NpoPlayerServices, source: string, _sourceConfig: SourceConfig | undefined, _streamObject: StreamObject, drm: string | undefined, streamOptions: StreamOptions, version: string, npoTagInstance: NPOTag | undefined): Promise<SourceConfig>;
@@ -1,6 +1,7 @@
1
1
  import { HttpResponseType } from 'bitmovin-player';
2
2
  import { npoCdnProviders } from '../../../services/cdnProviders/cdnProviders';
3
3
  import { replaceSpecialCharacters } from '../../utilities/utilities.text';
4
+ import subtitleLabelMap from '../../../lang/subtitleLabels/nl.json';
4
5
  async function setDrm(sourceConfig, drm, _streamObject, useWidevineServerCertificate) {
5
6
  const npoDrmGateway = 'https://npo-drm-gateway.samgcloud.nepworldwide.nl/authentication?custom_data=';
6
7
  switch (drm) {
@@ -66,11 +67,9 @@ async function getServerCertificate(url) {
66
67
  const response = await fetch(url);
67
68
  return response.arrayBuffer();
68
69
  }
69
- const getSubtitleLabels = function (data) {
70
- if (data.label === 'nl') {
71
- return 'Nederlands';
72
- }
73
- return data.label;
70
+ export const getSubtitleLabels = function (data) {
71
+ const langKey = data.lang.toLowerCase();
72
+ return subtitleLabelMap[langKey] || data.label || langKey;
74
73
  };
75
74
  const getQualityLabels = function (data) {
76
75
  return data.height + 'p';
@@ -0,0 +1,25 @@
1
+ import { getSubtitleLabels } from './processsourceconfig';
2
+ describe('getSubtitleLabels', () => {
3
+ it('should return the correct language label for known lang codes', () => {
4
+ expect(getSubtitleLabels({ lang: 'ar' })).toBe('Arabisch');
5
+ expect(getSubtitleLabels({ lang: 'bg' })).toBe('Bulgaars');
6
+ expect(getSubtitleLabels({ lang: 'de' })).toBe('Duits');
7
+ expect(getSubtitleLabels({ lang: 'en' })).toBe('Engels');
8
+ expect(getSubtitleLabels({ lang: 'es' })).toBe('Spaans');
9
+ expect(getSubtitleLabels({ lang: 'fr' })).toBe('Frans');
10
+ expect(getSubtitleLabels({ lang: 'it' })).toBe('Italiaans');
11
+ expect(getSubtitleLabels({ lang: 'nl' })).toBe('Nederlands');
12
+ expect(getSubtitleLabels({ lang: 'ma' })).toBe('Marokkaans');
13
+ expect(getSubtitleLabels({ lang: 'pl' })).toBe('Pools');
14
+ expect(getSubtitleLabels({ lang: 'ua' })).toBe('Oekraïens');
15
+ expect(getSubtitleLabels({ lang: 'tr' })).toBe('Turks');
16
+ });
17
+ it('should return the original label if the lang code is unknown', () => {
18
+ expect(getSubtitleLabels({ lang: 'jp', label: 'Japanese' })).toBe('Japanese');
19
+ expect(getSubtitleLabels({ lang: 'jp' })).toBe('jp');
20
+ });
21
+ it('should handle mixed case lang codes', () => {
22
+ expect(getSubtitleLabels({ lang: 'EN' })).toBe('Engels');
23
+ expect(getSubtitleLabels({ lang: 'Fr' })).toBe('Frans');
24
+ });
25
+ });
@@ -1,4 +1,3 @@
1
1
  export { handleStartOffset, handleLiveOffsetLogic, shiftToProgramStart } from './handlers/handleoffsets';
2
- export { handlePlayerError } from './handlers/error';
3
2
  export { processPlayerConfig } from './handlers/processplayerconfig';
4
3
  export { processSourceConfig } from './handlers/processsourceconfig';
@@ -1,4 +1,3 @@
1
1
  export { handleStartOffset, handleLiveOffsetLogic, shiftToProgramStart } from './handlers/handleoffsets';
2
- export { handlePlayerError } from './handlers/error';
3
2
  export { processPlayerConfig } from './handlers/processplayerconfig';
4
3
  export { processSourceConfig } from './handlers/processsourceconfig';
@@ -0,0 +1,6 @@
1
+ import { SourceConfig, StreamObject } from 'types/interfaces';
2
+ export declare function getAnalyticsPrid(params: {
3
+ source: string;
4
+ sourceConfig?: SourceConfig;
5
+ streamObject?: StreamObject;
6
+ }): string;
@@ -0,0 +1,8 @@
1
+ import { isJWTToken } from './utilities.jwt';
2
+ export function getAnalyticsPrid(params) {
3
+ const { source, sourceConfig, streamObject } = params;
4
+ if (isJWTToken(source)) {
5
+ return streamObject?.metadata?.prid ?? '';
6
+ }
7
+ return sourceConfig?.metadata?.prid ?? source;
8
+ }
@@ -0,0 +1,46 @@
1
+ import { mockStreamObject } from '../../../tests/mocks/mockStreamObject';
2
+ import { getAnalyticsPrid } from './utilities.prid';
3
+ describe('getAnalyticsPrid', () => {
4
+ it('should return the prid from streamObject if the source is a JWT token', () => {
5
+ const result = getAnalyticsPrid({
6
+ source: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
7
+ sourceConfig: undefined,
8
+ streamObject: {
9
+ ...mockStreamObject,
10
+ metadata: {
11
+ ...mockStreamObject.metadata,
12
+ prid: '123'
13
+ }
14
+ }
15
+ });
16
+ expect(result).toBe('123');
17
+ });
18
+ it('should return an empty string if the source is a JWT token but no prid is present in streamObject', () => {
19
+ const result = getAnalyticsPrid({
20
+ source: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
21
+ sourceConfig: undefined,
22
+ streamObject: {
23
+ ...mockStreamObject
24
+ }
25
+ });
26
+ expect(result).toBe('');
27
+ });
28
+ it('should return the prid from sourceConfig if the source is a media file URL', () => {
29
+ const result = getAnalyticsPrid({
30
+ source: 'https://example.com/media/video.mp4',
31
+ sourceConfig: { metadata: { prid: '456' } },
32
+ streamObject: undefined
33
+ });
34
+ expect(result).toBe('456');
35
+ });
36
+ it('should return the source (media file URL) if no prid is found', () => {
37
+ const result = getAnalyticsPrid({
38
+ source: 'https://example.com/media/audio.mp3',
39
+ sourceConfig: undefined,
40
+ streamObject: {
41
+ ...mockStreamObject
42
+ }
43
+ });
44
+ expect(result).toBe('https://example.com/media/audio.mp3');
45
+ });
46
+ });
package/lib/lang/nl.json CHANGED
@@ -52,7 +52,7 @@
52
52
  "googleCast": "Google Cast",
53
53
  "vr": "VR",
54
54
  "off": "Uit",
55
- "auto": "automatisch",
55
+ "auto": "Automatisch",
56
56
  "back": "Terug",
57
57
  "reset": "Herstellen",
58
58
  "replay": "Replay",
@@ -0,0 +1,14 @@
1
+ {
2
+ "ar": "Arabisch",
3
+ "bg": "Bulgaars",
4
+ "de": "Duits",
5
+ "en": "Engels",
6
+ "es": "Spaans",
7
+ "fr": "Frans",
8
+ "it": "Italiaans",
9
+ "nl": "Nederlands",
10
+ "ma": "Marokkaans",
11
+ "pl": "Pools",
12
+ "ua": "Oekraïens",
13
+ "tr": "Turks"
14
+ }
@@ -4,7 +4,7 @@ import { type InitialisationProps } from '@npotag/tag/dist/types/src/npoTag';
4
4
  import { type PlayerAPI, type PlayerConfig, type SourceConfig } from 'bitmovin-player';
5
5
  import { UIManager } from 'bitmovin-player-ui';
6
6
  import { LogEmitter } from './types/classes';
7
- import { type DRMProfile, type ApiPayload, type NPOTagObject, type StreamObject, type StreamOptions, type UIComponents, type TimeLineMarker, type LocalStorageData, type PlayerContext, type EventListeners, NpoPlayerUIVariants } from './types/interfaces';
7
+ import { type DRMProfile, type ApiPayload, type NPOTagObject, type StreamObject, type StreamOptions, type UIComponents, type TimeLineMarker, type PlayerContext, type EventListeners, NpoPlayerUIVariants } from './types/interfaces';
8
8
  export { type PlayerConfig, type InitialisationProps, type NPOTagObject, type StreamOptions, NpoPlayerUIVariants };
9
9
  export default class NpoPlayer {
10
10
  playerConfig: PlayerConfig | undefined;
@@ -30,10 +30,9 @@ export default class NpoPlayer {
30
30
  isShowingPlayNextScreen: boolean;
31
31
  canceledPlayNextScreen: boolean;
32
32
  playerContext: PlayerContext | undefined;
33
- npoplayerServices: NpoPlayerServices;
33
+ npoPlayerServices: NpoPlayerServices;
34
34
  eventListeners: EventListeners | undefined;
35
35
  mockNpoPlayer: any;
36
- userPreferences: LocalStorageData;
37
36
  constructor(container: HTMLElement | {
38
37
  container: HTMLElement;
39
38
  playerConfig: PlayerConfig;
@@ -42,9 +41,9 @@ export default class NpoPlayer {
42
41
  variant?: NpoPlayerUIVariants;
43
42
  npoTagPageTracker?: PageTracker | undefined;
44
43
  }, playerConfig?: PlayerConfig | undefined, npoTag?: InitialisationProps | undefined, npoTagInstance?: NPOTag | undefined, variant?: NpoPlayerUIVariants, npoTagPageTracker?: PageTracker | undefined);
44
+ keydownHandler: (e: KeyboardEvent) => void;
45
45
  initPlayer(_container: HTMLElement, playerConfig: PlayerConfig): void;
46
46
  loadStream(source: string, options?: StreamOptions): Promise<void>;
47
- doError(input: any, status?: number): void;
48
47
  play(): Promise<void>;
49
48
  pause(): void;
50
49
  setVolume(volume: number): void;
package/lib/npoplayer.js CHANGED
@@ -1,33 +1,26 @@
1
1
  import { NpoPlayerServices } from './services/services';
2
2
  import { Player, PlayerEvent } from 'bitmovin-player';
3
3
  import AdsModuleBM from 'bitmovin-player/modules/bitmovinplayer-advertising-bitmovin';
4
- import { logEvent, initPlayerTracker, startPlayerTracker } from './js/tracking/playertracker';
5
4
  import { hidePlayNextScreen, showPlayNextScreenIfNeeded } from './ui/handlers/playnextscreen';
6
5
  import * as playerAction from './js/playeractions/playeractions';
7
6
  import { getModuleExport } from './js/utilities/utilities.module';
8
- import { getStreamObject } from './js/api/getstreamobject';
9
7
  import { isJWTToken } from './js/utilities/utilities.jwt';
10
8
  import { isMediaUrl, isUrl } from './js/utilities/utilities.url';
11
9
  import { logVersion } from './js/utilities/utilities.version';
12
- import { getStreamDurationInSeconds } from './js/utilities/utilities.stream';
13
10
  import { LogEmitter } from './types/classes';
14
11
  import pkg from '../package.json';
15
- import { NpoPlayerUIVariants, LocalStorageValues } from './types/interfaces';
12
+ import { NpoPlayerUIVariants } from './types/interfaces';
16
13
  import { nativeMobileUiFactory } from './ui/nativemobileuifactory';
17
14
  import { setupMediaSessionActionHandlers } from './js/playeractions/handlers/mediasessionactions';
18
15
  import { removeReplayClass } from './js/playeractions/handlers/removereplayclass';
19
16
  import { updateLiveMarkers } from './js/markers/updateLiveMarkers';
20
17
  import { NpoPlayerAPI } from './services/npoPlayerAPI/npoPlayerAPI';
18
+ import { emptyStreamObject } from './services/npoPlayerAPI/contants';
21
19
  export { NpoPlayerUIVariants };
22
20
  export default class NpoPlayer {
23
21
  constructor(container, playerConfig, npoTag, npoTagInstance, variant, npoTagPageTracker) {
24
22
  this.sourceConfig = {};
25
- this.streamObject = {
26
- stream: { drmType: '', streamProfile: '', streamURL: '', avType: '', sourceProfile: '' },
27
- metadata: { title: '', description: '' },
28
- assets: { scrubbingThumbnail: '', subtitles: [] },
29
- user: { type: 'anonymous' }
30
- };
23
+ this.streamObject = emptyStreamObject;
31
24
  this.player = undefined;
32
25
  this.uiManager = undefined;
33
26
  this.npoTagInitialisation = undefined;
@@ -45,9 +38,13 @@ export default class NpoPlayer {
45
38
  this.isShowingPlayNextScreen = false;
46
39
  this.canceledPlayNextScreen = false;
47
40
  this.playerContext = undefined;
48
- this.npoplayerServices = new NpoPlayerServices();
41
+ this.npoPlayerServices = new NpoPlayerServices();
49
42
  this.eventListeners = undefined;
50
- this.userPreferences = {};
43
+ this.keydownHandler = (e) => {
44
+ if (!this.playerContext)
45
+ return;
46
+ this.npoPlayerServices.keyboardHandler(this.playerContext, e);
47
+ };
51
48
  if (typeof container === 'object' && !(container instanceof HTMLElement)) {
52
49
  const params = container;
53
50
  this.container = params.container;
@@ -70,9 +67,6 @@ export default class NpoPlayer {
70
67
  console.error('Player configuration is missing. Ensure that playerConfig is properly initialized before using the player.');
71
68
  return;
72
69
  }
73
- if (this.npoTagInstance) {
74
- initPlayerTracker(this, this.npoTagInitialisation, this.npoTagInstance, this.npoTagPageTracker);
75
- }
76
70
  this.initPlayer(this.container, this.playerConfig);
77
71
  }
78
72
  initPlayer(_container, playerConfig) {
@@ -80,47 +74,31 @@ export default class NpoPlayer {
80
74
  this.player = new Player(_container, processedPlayerConfig);
81
75
  Player.addModule(getModuleExport(AdsModuleBM));
82
76
  const npoPlayerAPI = new NpoPlayerAPI(this.player);
83
- this.playerContext = { player: npoPlayerAPI, npoplayer: this };
84
- this.userPreferences = this.npoplayerServices.getStoredUserPrefs();
85
- this.npoplayerServices.handleUserPrefs(this.playerContext);
86
- this.npoplayerServices.setAccessibilityAttributes(this.playerContext);
87
- window.addEventListener('beforeunload', () => {
88
- if (this.player) {
89
- this.npoplayerServices.setStoredUserPrefs(LocalStorageValues.SUBTITLES_ENABLED, npoPlayerAPI.areSubtitlesEnabled().toString());
90
- this.npoplayerServices.setStoredUserPrefs(LocalStorageValues.VOLUME, npoPlayerAPI.getVolume());
91
- this.npoplayerServices.setStoredUserPrefs(LocalStorageValues.IS_MUTED, npoPlayerAPI.isMuted().toString());
92
- }
93
- });
94
- this.container.addEventListener('keydown', (e) => {
95
- if (!this.playerContext)
96
- return;
97
- this.npoplayerServices.keyboardHandler(this.playerContext, e);
98
- }, true);
77
+ this.playerContext = { player: npoPlayerAPI, npoPlayer: this };
78
+ this.npoPlayerServices.initPlayerTracker(this.playerContext);
79
+ this.npoPlayerServices.handleUserPrefs(this.playerContext);
80
+ this.npoPlayerServices.setAccessibilityAttributes(this.playerContext);
81
+ this.npoPlayerServices.handlePreferences(this.playerContext);
82
+ this.container.addEventListener('keydown', this.keydownHandler, true);
99
83
  }
100
84
  async loadStream(source, options = {}) {
101
- if (!this.playerContext)
102
- return;
103
- this.streamOptions = options;
104
- if (this.player == undefined) {
85
+ if (!this.playerContext || !this.player) {
105
86
  console.error('Er is nog geen player geladen.');
106
87
  return;
107
88
  }
108
- if (this.adBreakActive) {
109
- const currentAd = this.player.ads.getActiveAdBreak().id;
110
- this.player.ads.discardAdBreak(currentAd);
111
- }
89
+ this.streamOptions = options;
90
+ this.playerContext.player.removeClassFromNpoPlayerElement('npo-player-error');
91
+ this.npoPlayerServices.discardAdBreak(this.playerContext);
112
92
  let _streamObject;
113
93
  const sourceIsUrl = isUrl(source);
114
94
  const sourceIsMedia = await isMediaUrl(source);
115
95
  const sourceIsJWTToken = isJWTToken(source);
116
- const getDurationAndStartPlayerTracker = function () {
117
- if (this.player === null)
118
- return;
119
- const prid = (isJWTToken(source) ? this.streamObject?.metadata.prid : source) || 'unknown';
120
- const duration = this.player ? this.player.getDuration() : undefined;
121
- startPlayerTracker(this, getStreamDurationInSeconds({ duration: duration }), this.version, prid);
122
- }.bind(this);
96
+ if (this.streamOptions.npoTagPageTracker) {
97
+ this.npoTagPageTracker = this.streamOptions.npoTagPageTracker;
98
+ }
123
99
  if (sourceIsUrl && sourceIsMedia) {
100
+ _streamObject = emptyStreamObject;
101
+ this.streamObject = _streamObject;
124
102
  this.sourceConfig = {
125
103
  ...options.sourceConfig,
126
104
  progressive: source,
@@ -131,12 +109,17 @@ export default class NpoPlayer {
131
109
  customData5: this.version
132
110
  }
133
111
  };
112
+ void this.playerContext.player.createUIManager(this.playerContext, this.variant);
134
113
  await this.playerContext.player?.load(this.sourceConfig);
135
- getDurationAndStartPlayerTracker();
114
+ this.npoPlayerServices.startPlayerTracker({
115
+ playerContext: this.playerContext,
116
+ source: source,
117
+ duration: undefined
118
+ });
136
119
  }
137
120
  else if (sourceIsJWTToken) {
138
121
  this.jwt = source;
139
- const profile = await this.npoplayerServices.decideProfile(this.playerContext, options?.preferredDRM ?? '');
122
+ const profile = await this.npoPlayerServices.decideProfile(this.playerContext, options?.preferredDRM ?? '');
140
123
  const defaultEndpoint = 'https://prod.npoplayer.nl/';
141
124
  const endpoint = options?.endpoint ?? defaultEndpoint;
142
125
  const payload = {
@@ -153,59 +136,58 @@ export default class NpoPlayer {
153
136
  }
154
137
  }
155
138
  };
139
+ void this.playerContext.player.createUIManager(this.playerContext, this.variant);
156
140
  try {
157
- _streamObject = await getStreamObject(this, payload);
141
+ _streamObject = await this.npoPlayerServices.fetchStream(this.playerContext, payload);
158
142
  this.streamObject = _streamObject;
159
- if (_streamObject) {
160
- await this.playerContext.player.createUIManager(this.playerContext, this.variant);
161
- }
162
143
  }
163
- catch (error) {
164
- this.doError('Het is niet gelukt de stream op te halen. \n' + error);
144
+ catch {
165
145
  this.player.pause();
166
146
  return;
167
147
  }
168
148
  if (this.streamObject?.stream == undefined)
169
149
  return;
170
150
  const drmType = this.streamObject.stream.drmType ?? undefined;
171
- this.sourceConfig = await playerAction.processSourceConfig(this.npoplayerServices, source, options.sourceConfig ?? {}, this.streamObject, drmType && drmType.length > 0 ? profile.drm : undefined, this.streamOptions, this.version, this.npoTag?.npoTagInstance);
172
- await this.npoplayerServices.verifyDRM(this.playerContext, payload);
173
- setupMediaSessionActionHandlers(this.player, this.sourceConfig, _streamObject);
174
- logEvent(this, 'load');
175
- let streamDuration = _streamObject.metadata.duration;
176
- const streamPrid = this.streamObject.metadata.prid || _streamObject.metadata.prid;
177
- if (this.isShowingPlayNextScreen) {
178
- this.hidePlayNextScreen();
151
+ if (drmType !== undefined && drmType !== profile.drm) {
152
+ await this.npoPlayerServices.handleError(this.playerContext, 2007);
153
+ return;
179
154
  }
155
+ this.sourceConfig = await playerAction.processSourceConfig(this.npoPlayerServices, source, options.sourceConfig ?? {}, this.streamObject, drmType && drmType.length > 0 ? profile.drm : undefined, this.streamOptions, this.version, this.npoTag?.npoTagInstance);
156
+ await this.npoPlayerServices.verifyDRM(this.playerContext, payload);
157
+ setupMediaSessionActionHandlers(this.player, this.sourceConfig, _streamObject);
158
+ this.hidePlayNextScreen();
159
+ const streamDuration = _streamObject.metadata.duration;
180
160
  const initAndStartTracker = () => {
181
- if (this.player === null)
161
+ if (!this.playerContext || !this.player)
182
162
  return;
183
163
  this.player?.off(PlayerEvent.AdBreakFinished, initAndStartTracker);
184
164
  this.player?.off(PlayerEvent.AdError, initAndStartTracker);
185
- streamDuration =
186
- streamDuration == undefined
187
- ? getDurationAndStartPlayerTracker()
188
- : startPlayerTracker(this, getStreamDurationInSeconds({ duration: streamDuration, durationIsInMs: true }), this.version, streamPrid);
165
+ this.npoPlayerServices.startPlayerTracker({
166
+ playerContext: this.playerContext,
167
+ source: source,
168
+ duration: streamDuration ? Number(streamDuration) : undefined
169
+ });
189
170
  };
190
171
  if (this.variant === NpoPlayerUIVariants.DEFAULT &&
191
172
  this.streamObject.metadata.hasPreroll === 'true' &&
192
173
  this.streamObject.assets.preroll) {
193
174
  this.player.on(PlayerEvent.AdBreakFinished, initAndStartTracker);
194
175
  this.player.on(PlayerEvent.AdError, initAndStartTracker);
195
- await this.npoplayerServices.schedulePreRolls(this.playerContext);
176
+ await this.npoPlayerServices.schedulePreRolls(this.playerContext);
196
177
  }
197
178
  else {
198
179
  initAndStartTracker();
199
180
  }
200
181
  }
201
182
  else {
202
- this.doError(`Het is niet gelukt de stream op te halen: \n Input is geen valide token of media object.`, 500);
183
+ await this.npoPlayerServices.handleError(this.playerContext, 500);
184
+ }
185
+ this.npoPlayerServices.handleStreamOptions(this.playerContext);
186
+ this.npoPlayerServices.setupNicamKijkwijzerIcons(this.playerContext);
187
+ if (this.variant === NpoPlayerUIVariants.VERTICAL) {
188
+ this.npoPlayerServices.handleVerticalVideoControls(this.playerContext);
189
+ this.npoPlayerServices.handleVerticalVideoSettings(this.playerContext);
203
190
  }
204
- this.npoplayerServices.setupNicamKijkwijzerIcons(this.playerContext);
205
- this.player.on(PlayerEvent.Play, () => {
206
- this.npoplayerServices.showNicamAfterUiDelay(this.playerContext, this.uiManager);
207
- });
208
- this.npoplayerServices.handleVerticalVideoControls(this.playerContext, this.variant);
209
191
  this.player.on(PlayerEvent.Seek, () => {
210
192
  removeReplayClass(this.player);
211
193
  });
@@ -225,14 +207,6 @@ export default class NpoPlayer {
225
207
  }.bind(this);
226
208
  this.player.on(PlayerEvent.Ready, setLiveOffsetListener);
227
209
  }
228
- doError(input, status) {
229
- if (this.player == undefined)
230
- return;
231
- if (status) {
232
- this.logEmitter.emit('logError', status);
233
- }
234
- playerAction.handlePlayerError(this.player, this.uiComponents, input);
235
- }
236
210
  async play() {
237
211
  await this.playerContext?.player.play();
238
212
  }
@@ -311,6 +285,8 @@ export default class NpoPlayer {
311
285
  this.streamOptions.playNext?.cancelCallback?.();
312
286
  }
313
287
  hidePlayNextScreen() {
288
+ if (!this.isShowingPlayNextScreen)
289
+ return;
314
290
  this.player?.off(PlayerEvent.Paused, () => {
315
291
  this.hidePlayNextScreen();
316
292
  });
@@ -327,9 +303,16 @@ export default class NpoPlayer {
327
303
  if (this.npoTag != undefined) {
328
304
  clearInterval(this.npoTag?.heartbeatInterval);
329
305
  }
330
- logEvent(this, 'stop');
306
+ if (this.playerContext) {
307
+ this.npoPlayerServices.logEvent({
308
+ playerContext: this.playerContext,
309
+ event: 'stop'
310
+ });
311
+ this.npoPlayerServices.removeUivisiblityHandlers(this.playerContext);
312
+ }
331
313
  this.uiManager?.release();
332
314
  this.uiManager = undefined;
315
+ this.container.removeEventListener('keydown', this.keydownHandler, true);
333
316
  await this.player?.destroy();
334
317
  return true;
335
318
  }
@@ -3,16 +3,16 @@ const div = document.createElement('div');
3
3
  const testPlayerConfig = {
4
4
  key: 'dummy-key'
5
5
  };
6
- jest.mock('./services/streamoptionsHandlers/steamOptionsHandler', () => ({
6
+ jest.mock('./services/streamoptionsHandlers/streamOptionsHandler', () => ({
7
7
  handleStreamOptions: jest.fn()
8
8
  }));
9
9
  let player;
10
- test('player init with parameters', async () => {
10
+ test('player init with parameters', () => {
11
11
  player = new NpoPlayer(div, testPlayerConfig);
12
12
  expect(player).toBeInstanceOf(NpoPlayer);
13
13
  expect(player.playerConfig?.key).toBe(testPlayerConfig.key);
14
14
  });
15
- test('player init with parameters', async () => {
15
+ test('player init with parameters', () => {
16
16
  player = new NpoPlayer({
17
17
  container: div,
18
18
  playerConfig: testPlayerConfig
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@npo/player",
3
- "version": "1.25.0",
3
+ "version": "1.27.0",
4
4
  "description": "NPO Player",
5
5
  "author": "Publieke Omroep <player@npo.nl>",
6
6
  "contributors": [
@@ -89,7 +89,7 @@
89
89
  "webpack-dev-server": "^4.11.1"
90
90
  },
91
91
  "dependencies": {
92
- "@npotag/tag": "3.2.1",
92
+ "@npotag/tag": "3.2.4",
93
93
  "bitmovin-player": "^8.166.0",
94
94
  "bitmovin-player-ui": "3.67.0"
95
95
  },
@@ -1,16 +1,13 @@
1
1
  import { NpoPlayerEvent } from '../../types/events';
2
2
  import { addAccessibilityAttributes } from '../../ui/handlers/accessibilityhandler';
3
3
  export function setupAccessibilityAttributes(playerContext) {
4
- const { player, npoplayer } = playerContext;
4
+ const { player, npoPlayer } = playerContext;
5
5
  const events = [NpoPlayerEvent.SourceLoaded, NpoPlayerEvent.AdBreakFinished, NpoPlayerEvent.AdError];
6
6
  const triggerAddAccessibilityAttributes = () => {
7
7
  for (const event of events) {
8
8
  player?.off(event, triggerAddAccessibilityAttributes);
9
9
  }
10
- if (npoplayer.streamOptions.enableSubtitles === true || npoplayer.userPreferences.subtitles_enabled === 'true') {
11
- player?.enableSubtitles();
12
- }
13
- addAccessibilityAttributes(npoplayer.container, npoplayer.streamObject.metadata);
10
+ addAccessibilityAttributes(npoPlayer.container, npoPlayer.streamObject.metadata);
14
11
  };
15
12
  for (const event of events) {
16
13
  player?.on(event, triggerAddAccessibilityAttributes);