@npo/player 1.27.8 → 1.28.1

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 (214) hide show
  1. package/README.md +4 -7
  2. package/lib/js/markers/updateLiveMarkers.d.ts +7 -2
  3. package/lib/js/markers/updateLiveMarkers.js +11 -4
  4. package/lib/js/markers/updateLiveMarkers.test.js +13 -3
  5. package/lib/js/playeractions/handlers/handleoffsets.test.js +1 -1
  6. package/lib/js/playeractions/handlers/mediasessionactions.d.ts +7 -2
  7. package/lib/js/playeractions/handlers/mediasessionactions.js +7 -7
  8. package/lib/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
  9. package/lib/js/playeractions/handlers/processplayerconfig.js +1 -1
  10. package/lib/js/playeractions/handlers/processplayerconfig.test.js +1 -1
  11. package/lib/js/playeractions/handlers/processsourceconfig.d.ts +11 -2
  12. package/lib/js/playeractions/handlers/processsourceconfig.js +35 -18
  13. package/lib/js/playeractions/handlers/removereplayclass.d.ts +1 -1
  14. package/lib/js/playeractions/handlers/removereplayclass.js +1 -1
  15. package/lib/js/playeractions/handlers/removereplayclass.test.js +1 -1
  16. package/lib/js/settings/localization.d.ts +1 -0
  17. package/lib/js/utilities/utilities.jwt.d.ts +2 -0
  18. package/lib/js/utilities/utilities.jwt.js +22 -0
  19. package/lib/js/utilities/utilities.stream.js +11 -2
  20. package/lib/js/utilities/utilities.url.js +2 -2
  21. package/lib/js/utilities/utilities.version.js +1 -1
  22. package/lib/js/utilities/utilities.version.test.js +1 -1
  23. package/lib/lang/nl.json +2 -1
  24. package/lib/npoplayer.d.ts +6 -5
  25. package/lib/npoplayer.js +66 -23
  26. package/lib/package.json +7 -9
  27. package/lib/services/a11y/setup.test.js +2 -4
  28. package/lib/services/advertHandlers/handlePreRolls.js +3 -4
  29. package/lib/services/advertHandlers/handlePrerolls.test.js +2 -3
  30. package/lib/services/chapterHandlers/chapterHandler.d.ts +35 -0
  31. package/lib/services/chapterHandlers/chapterHandler.js +230 -0
  32. package/lib/services/errors/errorBackground.test.js +1 -1
  33. package/lib/services/errors/errorHandler.d.ts +4 -2
  34. package/lib/services/errors/errorHandler.js +27 -14
  35. package/lib/services/errors/errorHandler.test.js +148 -0
  36. package/lib/services/errors/errorRetryHandler.d.ts +2 -0
  37. package/lib/services/errors/errorRetryHandler.js +14 -0
  38. package/lib/services/errors/errorRetryHandler.test.d.ts +1 -0
  39. package/lib/services/errors/errorRetryHandler.test.js +62 -0
  40. package/lib/services/errors/errorText.js +8 -5
  41. package/lib/services/errors/errorText.test.js +3 -3
  42. package/lib/services/infoPanel/infoPanel.d.ts +3 -0
  43. package/lib/services/infoPanel/infoPanel.js +35 -0
  44. package/lib/services/infoPanel/infoPanel.test.d.ts +1 -0
  45. package/lib/services/infoPanel/infoPanel.test.js +70 -0
  46. package/lib/services/keyboardHandlers/resolvekeypress.js +11 -1
  47. package/lib/services/keyboardHandlers/resolvekeypress.test.js +6 -2
  48. package/lib/services/nicamHandlers/nicamhandler.d.ts +1 -0
  49. package/lib/services/nicamHandlers/nicamhandler.js +2 -1
  50. package/lib/services/nicamHandlers/nicamhandler.test.js +2 -2
  51. package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +8 -2
  52. package/lib/services/npoPlayerAPI/npoPlayerAPI.js +25 -12
  53. package/lib/services/npoPlayerAPI/playerModules.d.ts +1 -0
  54. package/lib/services/npoPlayerAPI/playerModules.js +46 -0
  55. package/lib/services/preferences/handlePreferences.js +9 -4
  56. package/lib/services/preferences/handlePreferences.test.js +53 -17
  57. package/lib/services/segmentHandlers/addSegmentEventListeners.test.js +1 -1
  58. package/lib/services/segmentHandlers/isSegmentInBounds.d.ts +2 -0
  59. package/lib/services/segmentHandlers/isSegmentInBounds.js +5 -0
  60. package/lib/services/segmentHandlers/isSegmentInBounds.test.d.ts +1 -0
  61. package/lib/services/segmentHandlers/isSegmentInBounds.test.js +27 -0
  62. package/lib/services/services.d.ts +5 -2
  63. package/lib/services/services.js +15 -2
  64. package/lib/services/streamFetchHandler/fetchStream.js +5 -4
  65. package/lib/services/streamFetchHandler/fetchstream.test.js +25 -3
  66. package/lib/services/streamoptionsHandlers/streamOptionsHandler.js +11 -9
  67. package/lib/services/streamoptionsHandlers/streamOptionsHandler.test.js +14 -2
  68. package/lib/services/trackingHandlers/eventBinding.js +48 -33
  69. package/lib/services/trackingHandlers/eventBinding.test.js +57 -1
  70. package/lib/services/trackingHandlers/playerTrackerStart.js +1 -1
  71. package/lib/services/uiHandlers/uiVisiblityHandler.js +6 -0
  72. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.test.js +0 -9
  73. package/lib/src/js/markers/updateLiveMarkers.d.ts +7 -2
  74. package/lib/src/js/playeractions/handlers/mediasessionactions.d.ts +7 -2
  75. package/lib/src/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
  76. package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +11 -2
  77. package/lib/src/js/playeractions/handlers/removereplayclass.d.ts +1 -1
  78. package/lib/src/js/settings/localization.d.ts +1 -0
  79. package/lib/src/js/utilities/utilities.jwt.d.ts +2 -0
  80. package/lib/src/npoplayer.d.ts +6 -5
  81. package/lib/src/services/chapterHandlers/chapterHandler.d.ts +35 -0
  82. package/lib/src/services/errors/errorHandler.d.ts +4 -2
  83. package/lib/src/services/errors/errorRetryHandler.d.ts +2 -0
  84. package/lib/src/services/errors/errorRetryHandler.test.d.ts +1 -0
  85. package/lib/src/services/infoPanel/infoPanel.d.ts +3 -0
  86. package/lib/src/services/infoPanel/infoPanel.test.d.ts +1 -0
  87. package/lib/src/services/nicamHandlers/nicamhandler.d.ts +1 -0
  88. package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +8 -2
  89. package/lib/src/services/npoPlayerAPI/playerModules.d.ts +1 -0
  90. package/lib/src/services/segmentHandlers/isSegmentInBounds.d.ts +2 -0
  91. package/lib/src/services/segmentHandlers/isSegmentInBounds.test.d.ts +1 -0
  92. package/lib/src/services/services.d.ts +5 -2
  93. package/lib/src/types/events.d.ts +1 -1
  94. package/lib/src/types/interfaces.d.ts +39 -43
  95. package/lib/src/ui/components/adbutton.d.ts +3 -6
  96. package/lib/src/ui/components/adlabel.d.ts +3 -6
  97. package/lib/src/ui/components/audio/controlbar.d.ts +2 -2
  98. package/lib/src/ui/components/buttons.d.ts +18 -11
  99. package/lib/src/ui/components/ctabar.d.ts +4 -10
  100. package/lib/src/ui/components/infopanel/infopanel.d.ts +3 -0
  101. package/lib/src/ui/components/infopanel/togglebutton.d.ts +3 -0
  102. package/lib/src/ui/components/playnext.d.ts +3 -9
  103. package/lib/src/ui/components/seekbar.d.ts +2 -3
  104. package/lib/src/ui/components/settingspanel.d.ts +2 -3
  105. package/lib/src/ui/components/titlebar.d.ts +2 -2
  106. package/lib/src/ui/handlers/domhandlers.d.ts +2 -2
  107. package/lib/src/ui/handlers/listboxhandlers.d.ts +18 -4
  108. package/lib/src/ui/handlers/playnextscreen.d.ts +6 -2
  109. package/lib/src/ui/uicontainer.d.ts +1 -2
  110. package/lib/tests/jest.setup-files-after-env.d.ts +0 -0
  111. package/lib/tests/jest.setup-files-after-env.js +6 -0
  112. package/lib/tests/jest.setup-tests.d.ts +1 -0
  113. package/lib/tests/jest.setup-tests.js +2 -0
  114. package/lib/tests/mocks/mockNpoplayer.js +27 -44
  115. package/lib/tests/mocks/mockPlayerAPI.d.ts +1 -1
  116. package/lib/tests/mocks/mockPlayerAPI.js +15 -1
  117. package/lib/tests/mocks/mockPlayerUi.d.ts +64 -0
  118. package/lib/tests/mocks/mockPlayerUi.js +251 -0
  119. package/lib/tests/mocks/playerContextMock.d.ts +3 -66
  120. package/lib/tests/mocks/playerContextMock.js +34 -7
  121. package/lib/types/events.d.ts +1 -1
  122. package/lib/types/events.js +1 -1
  123. package/lib/types/interfaces.d.ts +39 -43
  124. package/lib/types/interfaces.js +0 -27
  125. package/lib/ui/components/adbutton.d.ts +3 -6
  126. package/lib/ui/components/adbutton.js +2 -1
  127. package/lib/ui/components/adlabel.d.ts +3 -6
  128. package/lib/ui/components/adlabel.js +2 -1
  129. package/lib/ui/components/audio/controlbar.d.ts +2 -2
  130. package/lib/ui/components/audio/controlbar.js +6 -6
  131. package/lib/ui/components/buttons.d.ts +18 -11
  132. package/lib/ui/components/buttons.js +44 -26
  133. package/lib/ui/components/controlbar.js +13 -9
  134. package/lib/ui/components/ctabar.d.ts +4 -10
  135. package/lib/ui/components/ctabar.js +8 -7
  136. package/lib/ui/components/infopanel/infopanel.d.ts +3 -0
  137. package/lib/ui/components/infopanel/infopanel.js +42 -0
  138. package/lib/ui/components/infopanel/togglebutton.d.ts +3 -0
  139. package/lib/ui/components/infopanel/togglebutton.js +18 -0
  140. package/lib/ui/components/playnext.d.ts +3 -9
  141. package/lib/ui/components/playnext.js +3 -3
  142. package/lib/ui/components/seekbar.d.ts +2 -3
  143. package/lib/ui/components/seekbar.js +7 -3
  144. package/lib/ui/components/settingspanel.d.ts +2 -3
  145. package/lib/ui/components/settingspanel.js +79 -53
  146. package/lib/ui/components/titlebar.d.ts +2 -2
  147. package/lib/ui/components/titlebar.js +2 -1
  148. package/lib/ui/components/topbar.js +8 -5
  149. package/lib/ui/components/verticalvideo/controlbar.js +5 -2
  150. package/lib/ui/components/verticalvideo/settingspanel.js +9 -5
  151. package/lib/ui/handlers/accessibilityhandler.js +11 -22
  152. package/lib/ui/handlers/accessibilityhandler.test.js +25 -34
  153. package/lib/ui/handlers/domhandlers.d.ts +2 -2
  154. package/lib/ui/handlers/listboxhandlers.d.ts +18 -4
  155. package/lib/ui/handlers/listboxhandlers.js +5 -3
  156. package/lib/ui/handlers/playnextscreen.d.ts +6 -2
  157. package/lib/ui/handlers/playnextscreen.js +4 -4
  158. package/lib/ui/handlers/playnextscreen.test.js +15 -3
  159. package/lib/ui/uicontainer.d.ts +1 -2
  160. package/lib/ui/uicontainer.js +24 -8
  161. package/lib/ui/uicontainer.test.js +6 -5
  162. package/package.json +7 -9
  163. package/src/style/components/_advert.scss +0 -4
  164. package/src/style/components/_buffering.scss +18 -22
  165. package/src/style/components/_controlbars.scss +0 -4
  166. package/src/style/components/_icons.scss +18 -4
  167. package/src/style/components/_infopanel.scss +105 -0
  168. package/src/style/components/_nicam.scss +8 -4
  169. package/src/style/components/_seekbarthumbnail.scss +5 -0
  170. package/src/style/components/_settingspanel.scss +2 -2
  171. package/src/style/components/_subtitles.scss +0 -1
  172. package/src/style/components/_textbuttons.scss +30 -1
  173. package/src/style/components/_volumeslider.scss +0 -1
  174. package/src/style/components/audio/_bottombar.scss +6 -0
  175. package/src/style/components/audio/_metadata.scss +25 -9
  176. package/src/style/components/audio/_topbar.scss +6 -1
  177. package/src/style/npoplayer.css +170 -85
  178. package/src/style/npoplayer.scss +10 -2
  179. package/src/style/variants/_player-audio-only.scss +32 -0
  180. package/src/style/variants/_player-base.scss +5 -1
  181. package/src/style/variants/_player-large.scss +11 -3
  182. package/src/style/variants/_player-medium.scss +5 -1
  183. package/src/style/variants/_player-small.scss +6 -1
  184. package/src/style/vars/_colors.scss +1 -1
  185. package/src/style/vars/_icons.scss +5 -4
  186. package/src/style/vars/_z-index.scss +1 -1
  187. package/lib/npoplayer-bridge.test.js +0 -24
  188. package/lib/src/ui/components/nativemobile/buttons.d.ts +0 -30
  189. package/lib/src/ui/components/nativemobile/controlbar.d.ts +0 -3
  190. package/lib/src/ui/components/nativemobile/ctabar.d.ts +0 -11
  191. package/lib/src/ui/components/nativemobile/titlebar.d.ts +0 -2
  192. package/lib/src/ui/components/nativemobile/topbar.d.ts +0 -3
  193. package/lib/src/ui/nativemobileuicontainer.d.ts +0 -5
  194. package/lib/src/ui/nativemobileuifactory.d.ts +0 -3
  195. package/lib/src/ui/nativemobileuifactory.test.d.ts +0 -1
  196. package/lib/ui/components/nativemobile/buttons.d.ts +0 -30
  197. package/lib/ui/components/nativemobile/buttons.js +0 -233
  198. package/lib/ui/components/nativemobile/controlbar.d.ts +0 -3
  199. package/lib/ui/components/nativemobile/controlbar.js +0 -43
  200. package/lib/ui/components/nativemobile/ctabar.d.ts +0 -11
  201. package/lib/ui/components/nativemobile/ctabar.js +0 -10
  202. package/lib/ui/components/nativemobile/titlebar.d.ts +0 -2
  203. package/lib/ui/components/nativemobile/titlebar.js +0 -7
  204. package/lib/ui/components/nativemobile/topbar.d.ts +0 -3
  205. package/lib/ui/components/nativemobile/topbar.js +0 -23
  206. package/lib/ui/nativemobileuicontainer.d.ts +0 -5
  207. package/lib/ui/nativemobileuicontainer.js +0 -42
  208. package/lib/ui/nativemobileuifactory.d.ts +0 -3
  209. package/lib/ui/nativemobileuifactory.js +0 -112
  210. package/lib/ui/nativemobileuifactory.test.d.ts +0 -1
  211. package/lib/ui/nativemobileuifactory.test.js +0 -64
  212. package/src/style/variants/_player-native-mobile.scss +0 -13
  213. /package/lib/{npoplayer-bridge.test.d.ts → services/errors/errorHandler.test.d.ts} +0 -0
  214. /package/lib/src/{npoplayer-bridge.test.d.ts → services/errors/errorHandler.test.d.ts} +0 -0
@@ -1,22 +1,20 @@
1
- import { PlayerEvent, ViewMode } from 'bitmovin-player';
1
+ import { PlayerEvent, ViewMode } from 'bitmovin-player/modules/bitmovinplayer-core';
2
2
  import { logEvent } from './eventLogging';
3
3
  const logEventHandlers = new Map();
4
4
  export function bindPlayerEvents(playerContext) {
5
- const { npoPlayer } = playerContext;
6
- const { player, streamObject } = npoPlayer;
5
+ const { player, streamObject, adBreakActive } = playerContext.npoPlayer;
6
+ const { isLiveStream } = streamObject.stream;
7
7
  if (player == undefined)
8
8
  return;
9
- const isLiveStream = streamObject.stream.isLiveStream;
10
9
  let isNewSource = true;
11
10
  let data = {};
12
11
  const timeDifference = (time) => {
13
12
  if (time === undefined || time === null)
14
13
  return;
15
14
  const currentUnixTime = Date.now() / 1000;
16
- const timeOffset = (time - currentUnixTime).toFixed(3);
17
- const threeDecimalTime = time.toFixed(3);
18
- const currentTime = isLiveStream ? +timeOffset : +threeDecimalTime;
19
- data = { stream_position: currentTime };
15
+ const timeOffset = time > 0 ? time - currentUnixTime : time;
16
+ const currentTime = isLiveStream ? timeOffset : time;
17
+ data = { stream_position: +currentTime.toFixed(3) };
20
18
  };
21
19
  const logEventHandler = (event) => {
22
20
  return (e) => {
@@ -24,21 +22,21 @@ export function bindPlayerEvents(playerContext) {
24
22
  logEvent({ playerContext, event, data });
25
23
  };
26
24
  };
25
+ const timeShiftHandler = (e) => {
26
+ const from = data.stream_position ?? 0;
27
+ const currentTime = playerContext.player.getCurrentTime();
28
+ const to = e.target - currentTime + from;
29
+ data = {
30
+ seek_from: +from.toFixed(3),
31
+ stream_position: +to.toFixed(3)
32
+ };
33
+ logEvent({ playerContext, event: 'seek', data });
34
+ };
27
35
  const seekHandler = (e) => {
28
- if (e.type === 'timeshift') {
29
- const timeDifferencePosition = -1 * (Date.now() / 1000 - e.position);
30
- const timeDifferenceTarget = -1 * (Date.now() / 1000 - e.target);
31
- data = {
32
- seek_from: Number.parseFloat(timeDifferencePosition.toFixed(3)),
33
- stream_position: Number.parseFloat(timeDifferenceTarget.toFixed(3))
34
- };
35
- }
36
- else if (e.type === 'seek') {
37
- data = {
38
- seek_from: e.position,
39
- stream_position: e.seekTarget
40
- };
41
- }
36
+ data = {
37
+ seek_from: e.position,
38
+ stream_position: e.seekTarget
39
+ };
42
40
  logEvent({ playerContext, event: 'seek', data });
43
41
  };
44
42
  const handleSourceLoaded = (e) => {
@@ -48,6 +46,19 @@ export function bindPlayerEvents(playerContext) {
48
46
  logEvent({ playerContext, event: 'stop', data });
49
47
  }
50
48
  };
49
+ const handlePlaybackFinished = (e) => {
50
+ timeDifference(e.time);
51
+ logEvent({ playerContext, event: 'complete', data });
52
+ logEvent({ playerContext, event: 'stop', data });
53
+ isNewSource = true;
54
+ };
55
+ const readyHandler = (e) => {
56
+ timeDifference(e.time);
57
+ if (isLiveStream) {
58
+ data = { stream_position: 0 };
59
+ }
60
+ logEvent({ playerContext, event: 'load_complete', data });
61
+ };
51
62
  const handlePlay = (e) => {
52
63
  timeDifference(e.time);
53
64
  if (!isNewSource && e.issuer !== 'ui-seek') {
@@ -62,7 +73,7 @@ export function bindPlayerEvents(playerContext) {
62
73
  };
63
74
  const handleTime = (e) => {
64
75
  timeDifference(e.time);
65
- if (isNewSource && !npoPlayer.adBreakActive) {
76
+ if (isNewSource && !adBreakActive) {
66
77
  logEvent({ playerContext, event: 'start', data });
67
78
  isNewSource = false;
68
79
  }
@@ -84,27 +95,31 @@ export function bindPlayerEvents(playerContext) {
84
95
  timeDifference(e.time);
85
96
  logEvent({ playerContext, event: 'stop', data });
86
97
  };
87
- for (const [key, value] of logEventHandlers) {
88
- player.off(key, value);
89
- }
90
- window.removeEventListener('beforeunload', logEventHandlers.get('stopBeforeUnload'));
91
- logEventHandlers.clear();
98
+ const clearAllEvents = () => {
99
+ for (const [key, value] of logEventHandlers) {
100
+ player.off(key, value);
101
+ }
102
+ window.removeEventListener('beforeunload', logEventHandlers.get('stopBeforeUnload'));
103
+ logEventHandlers.clear();
104
+ };
105
+ clearAllEvents();
92
106
  const playerEvents = [
93
- { event: PlayerEvent.Ready, name: 'load_complete' },
107
+ { event: PlayerEvent.Ready, handler: readyHandler },
94
108
  { event: PlayerEvent.Paused, handler: pausedHandler },
95
109
  { event: PlayerEvent.Play, handler: handlePlay },
96
110
  { event: PlayerEvent.SourceLoaded, handler: handleSourceLoaded },
97
111
  { event: PlayerEvent.StallStarted, name: 'buffering' },
98
112
  { event: PlayerEvent.StallEnded, name: 'buffering_complete' },
99
- { event: PlayerEvent.PlaybackFinished, name: 'complete' },
113
+ { event: PlayerEvent.PlaybackFinished, handler: handlePlaybackFinished },
100
114
  { event: PlayerEvent.SourceUnloaded, name: 'stop' },
101
115
  { event: PlayerEvent.Seek, handler: seekHandler },
102
- { event: PlayerEvent.TimeShift, handler: seekHandler },
116
+ { event: PlayerEvent.TimeShift, handler: timeShiftHandler },
103
117
  { event: PlayerEvent.TimeChanged, handler: handleTime },
104
- { event: PlayerEvent.ViewModeChanged, handler: handleViewModeChange }
118
+ { event: PlayerEvent.ViewModeChanged, handler: handleViewModeChange },
119
+ { event: PlayerEvent.Destroy, handler: clearAllEvents }
105
120
  ];
106
121
  for (const { event, name, handler } of playerEvents) {
107
- const effectiveName = name || 'unnamed_event';
122
+ const effectiveName = name ?? 'unnamed_event';
108
123
  const eventHandler = handler || logEventHandler(effectiveName);
109
124
  logEventHandlers.set(event, eventHandler);
110
125
  player.on(event, eventHandler);
@@ -1,4 +1,4 @@
1
- import { PlayerEvent, ViewMode } from 'bitmovin-player';
1
+ import { PlayerEvent, ViewMode } from 'bitmovin-player/modules/bitmovinplayer-core';
2
2
  import { bindPlayerEvents } from './eventBinding';
3
3
  import { logEvent } from './eventLogging';
4
4
  import { createPlayerContextMock } from '../../../tests/mocks/playerContextMock';
@@ -86,4 +86,60 @@ describe('bindPlayerEvents', () => {
86
86
  });
87
87
  }
88
88
  });
89
+ it('should handle playback finished correctly', () => {
90
+ bindPlayerEvents(playerContextMock);
91
+ const playbackFinishedHandler = mockPlayer.on.mock.calls.find(([event]) => event === PlayerEvent.PlaybackFinished)?.[1];
92
+ if (playbackFinishedHandler && typeof playbackFinishedHandler === 'function') {
93
+ playbackFinishedHandler({ time: 789 });
94
+ expect(logEvent).toHaveBeenCalledWith({
95
+ playerContext: playerContextMock,
96
+ event: 'complete',
97
+ data: expect.objectContaining({ stream_position: expect.any(Number) })
98
+ });
99
+ expect(logEvent).toHaveBeenCalledWith({
100
+ playerContext: playerContextMock,
101
+ event: 'stop',
102
+ data: expect.objectContaining({ stream_position: expect.any(Number) })
103
+ });
104
+ }
105
+ });
106
+ it('should handle TimeShift events correctly', () => {
107
+ mockPlayer.getCurrentTime = jest.fn().mockReturnValue(1000);
108
+ bindPlayerEvents(playerContextMock);
109
+ const timeShiftHandler = mockPlayer.on.mock.calls.find(([event]) => event === PlayerEvent.TimeShift)?.[1];
110
+ if (timeShiftHandler && typeof timeShiftHandler === 'function') {
111
+ timeShiftHandler({
112
+ target: -10
113
+ });
114
+ expect(logEvent).toHaveBeenCalledWith({
115
+ playerContext: playerContextMock,
116
+ event: 'seek',
117
+ data: {
118
+ seek_from: 0,
119
+ stream_position: -10
120
+ }
121
+ });
122
+ }
123
+ });
124
+ it('should clean up event listeners on destroy', () => {
125
+ bindPlayerEvents(playerContextMock);
126
+ const destroyHandler = mockPlayer.on.mock.calls.find(([event]) => event === PlayerEvent.Destroy)?.[1];
127
+ if (destroyHandler && typeof destroyHandler === 'function') {
128
+ destroyHandler({});
129
+ expect(mockPlayer.off).toHaveBeenCalled();
130
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.Ready, expect.any(Function));
131
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.Paused, expect.any(Function));
132
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.Play, expect.any(Function));
133
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.SourceLoaded, expect.any(Function));
134
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.StallStarted, expect.any(Function));
135
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.StallEnded, expect.any(Function));
136
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.PlaybackFinished, expect.any(Function));
137
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.SourceUnloaded, expect.any(Function));
138
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.Seek, expect.any(Function));
139
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.TimeShift, expect.any(Function));
140
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.TimeChanged, expect.any(Function));
141
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.ViewModeChanged, expect.any(Function));
142
+ expect(mockPlayer.off).toHaveBeenCalledWith(PlayerEvent.Destroy, expect.any(Function));
143
+ }
144
+ });
89
145
  });
@@ -6,7 +6,7 @@ import { logEvent } from './eventLogging';
6
6
  export const startPlayerTracker = function ({ playerContext, source, duration }) {
7
7
  const { npoPlayer } = playerContext;
8
8
  const { player, sourceConfig, streamObject } = npoPlayer;
9
- const playerDuration = duration || player?.getDuration() || undefined;
9
+ const playerDuration = duration ?? player?.getDuration() ?? undefined;
10
10
  if (!source) {
11
11
  throw new Error('Could not initialize streamTracker, no source specified.');
12
12
  }
@@ -6,9 +6,15 @@ export function addUivisiblityHandlers(playerContext) {
6
6
  if (variant === NpoPlayerUIVariants.DEFAULT) {
7
7
  uiManager.activeUi.onControlsHide.subscribe(() => {
8
8
  playerContext.npoPlayer.logEmitter.emit('logControlsVisibilityChange', false);
9
+ if (playerContext.npoPlayer.chapterHandler) {
10
+ playerContext.npoPlayer.chapterHandler.setControlsVisibility(false);
11
+ }
9
12
  });
10
13
  uiManager.activeUi.onControlsShow.subscribe(() => {
11
14
  playerContext.npoPlayer.logEmitter.emit('logControlsVisibilityChange', true);
15
+ if (playerContext.npoPlayer.chapterHandler) {
16
+ playerContext.npoPlayer.chapterHandler.setControlsVisibility(true);
17
+ }
12
18
  });
13
19
  uiManager.activeUi.getUI().showUi();
14
20
  }
@@ -1,15 +1,6 @@
1
1
  import { handleVerticalVideoSettings } from './handleVerticalVideoSettings';
2
2
  import { NpoPlayerEvent } from '../../types/events';
3
3
  import { createMockNpoPlayer, createPlayerContextMock } from '../../../tests/mocks/playerContextMock';
4
- jest.mock('bitmovin-player', () => ({
5
- PlayerEvent: {
6
- Ready: 'ready',
7
- SourceLoaded: 'sourceLoaded',
8
- SourceUnloaded: 'sourceUnloaded',
9
- SubtitleDisable: 'subtitleDisable',
10
- SubtitleEnable: 'subtitleEnable'
11
- }
12
- }));
13
4
  describe('handleVerticalVideoSettings', () => {
14
5
  let playerContextMock;
15
6
  let mockAddEventListener;
@@ -1,4 +1,9 @@
1
- import { PlayerAPI } from 'bitmovin-player';
1
+ import { PlayerAPI } from 'bitmovin-player/modules/bitmovinplayer-core';
2
2
  import { UIManager } from 'bitmovin-player-ui';
3
3
  import { TimeLineMarker } from 'types/interfaces';
4
- export declare function updateLiveMarkers(timeLineMarkers: TimeLineMarker[], player: PlayerAPI, uiManager: UIManager, autoFillTimeLineMarkerDuration: boolean): void;
4
+ export declare function updateLiveMarkers({ timeLineMarkers, player, uiManager, autoFillTimeLineMarkerDuration }: {
5
+ timeLineMarkers: TimeLineMarker[];
6
+ player: PlayerAPI;
7
+ uiManager: UIManager;
8
+ autoFillTimeLineMarkerDuration: boolean;
9
+ }): void;
@@ -1,2 +1,7 @@
1
- import { PlayerAPI, SourceConfig } from 'bitmovin-player';
2
- export declare function setupMediaSessionActionHandlers(player: PlayerAPI, sourceConfig: SourceConfig, _streamObject: any): void;
1
+ import { PlayerAPI, SourceConfig } from 'bitmovin-player/modules/bitmovinplayer-core';
2
+ import { StreamObject } from 'types/interfaces';
3
+ export declare function setupMediaSessionActionHandlers({ player, sourceConfig, streamObject }: {
4
+ player: PlayerAPI;
5
+ sourceConfig: SourceConfig;
6
+ streamObject: StreamObject;
7
+ }): void;
@@ -1,3 +1,3 @@
1
- import { type PlayerConfig } from 'bitmovin-player';
1
+ import { type PlayerConfig } from 'bitmovin-player/modules/bitmovinplayer-core';
2
2
  import NpoPlayer from 'npoplayer';
3
3
  export declare function processPlayerConfig(npoPlayer: NpoPlayer, playerConfig: PlayerConfig): PlayerConfig;
@@ -1,6 +1,15 @@
1
1
  import { StreamObject, StreamOptions } from 'types/interfaces';
2
- import { SourceConfig } from 'bitmovin-player';
2
+ import { SourceConfig } from 'bitmovin-player/modules/bitmovinplayer-core';
3
3
  import { NpoPlayerServices } from '../../../services/services';
4
4
  import { NPOTag } from '@npotag/tag';
5
5
  export declare const getSubtitleLabels: (data: any) => string;
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>;
6
+ export declare function processSourceConfig({ npoPlayerServices, source, _sourceConfig, _streamObject, drm, streamOptions, version, npoTagInstance }: {
7
+ npoPlayerServices: NpoPlayerServices;
8
+ source: string;
9
+ _sourceConfig: SourceConfig;
10
+ _streamObject: StreamObject;
11
+ drm: string | undefined;
12
+ streamOptions: StreamOptions;
13
+ version: string;
14
+ npoTagInstance: NPOTag | undefined;
15
+ }): Promise<SourceConfig>;
@@ -1,2 +1,2 @@
1
- import { PlayerAPI } from 'bitmovin-player';
1
+ import { PlayerAPI } from 'bitmovin-player/modules/bitmovinplayer-core';
2
2
  export declare function removeReplayClass(player: PlayerAPI | undefined): void;
@@ -68,6 +68,7 @@ export declare const localizationConfig: {
68
68
  connectingTo: string;
69
69
  watermarkLink: string;
70
70
  controlBar: string;
71
+ "controlBar.bottom": string;
71
72
  player: string;
72
73
  videoPlayer: string;
73
74
  audioPlayer: string;
@@ -1,3 +1,5 @@
1
1
  export declare const convertBase64ToObject: (value: string) => Record<string, any>;
2
2
  export declare const convertJwtToBase64: (jwt: string) => string;
3
3
  export declare function isJWTToken(token: string): boolean;
4
+ export declare function getJwtIat(jwt: string): number;
5
+ export declare function isJwtFresh(jwt: string, maxAgeSeconds?: number): boolean;
@@ -1,10 +1,11 @@
1
1
  import { NpoPlayerServices } from './services/services';
2
2
  import { type StreamTracker, type NPOTag, type PageTracker } from '@npotag/tag';
3
3
  import { type InitialisationProps } from '@npotag/tag/dist/types/src/npoTag';
4
- import { type PlayerAPI, type PlayerConfig, type SourceConfig } from 'bitmovin-player';
4
+ import { type PlayerAPI, type PlayerConfig, type SourceConfig } from 'bitmovin-player/modules/bitmovinplayer-core';
5
5
  import { UIManager } from 'bitmovin-player-ui';
6
6
  import { LogEmitter } from './types/classes';
7
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
+ import { ChapterHandler } from './services/chapterHandlers/chapterHandler';
8
9
  export { type PlayerConfig, type InitialisationProps, type NPOTagObject, type StreamOptions, NpoPlayerUIVariants };
9
10
  export default class NpoPlayer {
10
11
  playerConfig: PlayerConfig | undefined;
@@ -32,14 +33,14 @@ export default class NpoPlayer {
32
33
  playerContext: PlayerContext | undefined;
33
34
  npoPlayerServices: NpoPlayerServices;
34
35
  eventListeners: EventListeners | undefined;
35
- mockNpoPlayer: any;
36
+ chapterHandler: ChapterHandler | undefined;
36
37
  constructor(container: HTMLElement | {
37
38
  container: HTMLElement;
38
39
  playerConfig: PlayerConfig;
39
- npoTag?: InitialisationProps | undefined;
40
- npoTagInstance?: NPOTag | undefined;
40
+ npoTag?: InitialisationProps;
41
+ npoTagInstance?: NPOTag;
41
42
  variant?: NpoPlayerUIVariants;
42
- npoTagPageTracker?: PageTracker | undefined;
43
+ npoTagPageTracker?: PageTracker;
43
44
  }, playerConfig?: PlayerConfig | undefined, npoTag?: InitialisationProps | undefined, npoTagInstance?: NPOTag | undefined, variant?: NpoPlayerUIVariants, npoTagPageTracker?: PageTracker | undefined);
44
45
  keydownHandler: (e: KeyboardEvent) => void;
45
46
  initPlayer(_container: HTMLElement, playerConfig: PlayerConfig): void;
@@ -0,0 +1,35 @@
1
+ import { Chapter, PlayerContext } from '../../types/interfaces';
2
+ export declare const defaultSkippableChapterTypes: string[];
3
+ export interface ChapterHandlerOptions {
4
+ chapters: Chapter[];
5
+ showSkipButtons?: boolean;
6
+ skippableTypes?: string[];
7
+ }
8
+ export declare class ChapterHandler {
9
+ private readonly playerContext;
10
+ private readonly defaultSkippableTypes;
11
+ private readonly options;
12
+ private lastShownFrom?;
13
+ private hideTimeout?;
14
+ private controlsVisible;
15
+ private currentChapter?;
16
+ private isForceShowing;
17
+ private isPaused;
18
+ private pausedTimeRemaining?;
19
+ constructor(playerContext: PlayerContext, options: ChapterHandlerOptions);
20
+ getCurrentChapter(currentTimeMs: number): Chapter | undefined;
21
+ isChapterSkippable(chapter: Chapter): boolean;
22
+ handleTimeChange(): void;
23
+ reset(): void;
24
+ handlePause(): void;
25
+ handlePlay(): void;
26
+ setControlsVisibility(visible: boolean): void;
27
+ private setupSkipButtonHandler;
28
+ private skipCurrentChapter;
29
+ private updateSkipButtonVisibility;
30
+ private startFadeOut;
31
+ private forceShowButton;
32
+ private getCurrentControlsVisibility;
33
+ private startHideTimeout;
34
+ private clearHideTimeout;
35
+ }
@@ -1,3 +1,5 @@
1
- import { PlayerContext } from '../../types/interfaces';
2
- export declare function handlePlayerError(playerContext: PlayerContext, status: number): Promise<void>;
1
+ import { LogErrorParams, PlayerContext } from '../../types/interfaces';
2
+ export declare function handlePlayerError({ playerContext, status, context }: LogErrorParams): Promise<void>;
3
+ export declare function generateErrorMessage(status: number, shouldRetry: boolean): string;
4
+ export declare function setupRetryHandler(playerContext: PlayerContext, errorContainerClass: string): void;
3
5
  export declare function setErrorBackground(playerContext: PlayerContext): void;
@@ -0,0 +1,2 @@
1
+ import { PlayerContext } from 'types/interfaces';
2
+ export declare function handleErrorRetry(playerContext: PlayerContext): Promise<void>;
@@ -0,0 +1,3 @@
1
+ import { PlayerContext } from '../../types/interfaces';
2
+ export declare function addDataInInfoPanel(playerContext: PlayerContext): void;
3
+ export declare function clearInfoPanel(playerContext: PlayerContext): void;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { PlayerContext } from '../../types/interfaces';
2
+ export declare const SHOW_NICAM_AFTER_UI_HIDE_DURATION = 5000;
2
3
  export declare function processNicam(playerContext: PlayerContext, nicamElement: HTMLElement | undefined): void;
3
4
  export declare function addNicamIcon(character: string, nicamElement: Element): void;
4
5
  export declare function showNicamAfterUiDelay(playerContext: PlayerContext): void;
@@ -1,4 +1,6 @@
1
- import { AdBreak, AdConfig, PlayerAPI, PlayerConfig, SourceConfig, TimeMode, ViewMode } from 'bitmovin-player';
1
+ import { PlayerAPI, PlayerConfig, SourceConfig, TimeMode, VideoQuality, ViewMode } from 'bitmovin-player/modules/bitmovinplayer-core';
2
+ import { AdBreak, AdConfig } from 'bitmovin-player/modules/bitmovinplayer-advertising-core';
3
+ import { SubtitleTrack } from 'bitmovin-player/modules/bitmovinplayer-subtitles';
2
4
  import { UIManager } from 'bitmovin-player-ui';
3
5
  import { NpoPlayerUIVariants, PlayerContext, Technology } from 'types/interfaces';
4
6
  import { NpoPlayerEventCallback, NpoPlayerEvent } from '../../types/events';
@@ -40,8 +42,12 @@ export declare class NpoPlayerAPI {
40
42
  getDuration(): number;
41
43
  getTimeShift(): number;
42
44
  scheduleAds(adConfig: AdConfig): Promise<AdBreak[]>;
43
- handleErrorRetry(playerContext: PlayerContext): void;
45
+ handleErrorRetry(playerContext: PlayerContext): Promise<void>;
44
46
  getActiveAdBreak(): AdBreak | null;
45
47
  getConfig(mergedConfig?: boolean): PlayerConfig;
46
48
  createUIManager(playerContext: PlayerContext, variant: NpoPlayerUIVariants): void | UIManager;
49
+ getAvailableVideoQualities(): VideoQuality[];
50
+ listSubtitles(): SubtitleTrack[];
51
+ setPlaybackSpeed(speed: number): void;
52
+ setVideoQuality(VideoQualityId: string): void;
47
53
  }
@@ -0,0 +1 @@
1
+ export declare const playerModules: any[];
@@ -0,0 +1,2 @@
1
+ import { Segment } from 'types/interfaces';
2
+ export declare function isSegmentInBounds(segment: Segment | undefined, duration: number): boolean;
@@ -1,4 +1,4 @@
1
- import { ApiPayload, Fragment, PlayerContext, Profile, Segment, TimeLineMarker, LocalStorageData, LocalStorageValues, StreamObject, PlayerTrackerParams, LogEventParams } from '../types/interfaces';
1
+ import { ApiPayload, Fragment, PlayerContext, Profile, Segment, TimeLineMarker, LocalStorageData, LocalStorageValues, StreamObject, PlayerTrackerParams, LogEventParams, LogErrorParams } from '../types/interfaces';
2
2
  import { AVType } from '@npotag/tag/dist/types/src/streamTracker';
3
3
  export declare class NpoPlayerServices {
4
4
  getAVType(avType: string): AVType;
@@ -21,10 +21,13 @@ export declare class NpoPlayerServices {
21
21
  addUivisiblityHandlers(playerContext: PlayerContext): void;
22
22
  removeUivisiblityHandlers(playerContext: PlayerContext): void;
23
23
  handleStreamOptions(playerContext: PlayerContext): void;
24
- handleError(playerContext: PlayerContext, input: number): Promise<void>;
24
+ handleError({ playerContext, status: input, context: context }: LogErrorParams): Promise<void>;
25
25
  fetchStream(playerContext: PlayerContext, payload: ApiPayload): Promise<StreamObject>;
26
26
  startPlayerTracker({ playerContext, source, duration }: PlayerTrackerParams): void;
27
27
  initPlayerTracker(playerContext: PlayerContext): void;
28
28
  logEvent({ playerContext, event, data }: LogEventParams): void;
29
29
  removeEventListeners(playerContext: PlayerContext): void;
30
+ isSegmentInBounds(playerContext: PlayerContext): boolean;
31
+ addDataInInfoPanel(playerContext: PlayerContext): void;
32
+ clearInfoPanel(playerContext: PlayerContext): void;
30
33
  }
@@ -1,4 +1,4 @@
1
- import { PlayerEvent } from 'bitmovin-player';
1
+ import { PlayerEvent } from 'bitmovin-player/modules/bitmovinplayer-core';
2
2
  type PlayerEventMap = {
3
3
  [key in NpoPlayerEvent]: PlayerEvent;
4
4
  };
@@ -1,11 +1,15 @@
1
- import { type ErrorMessageOverlay, type Label, ControlBar, SettingsPanelItem, Button, SeekBar, CastToggleButton, SettingsPanel, SettingsToggleButton } from 'bitmovin-player-ui';
1
+ import { type ErrorMessageOverlay, type Label, ControlBar, SettingsPanelItem, Button, SeekBar, CastToggleButton, SettingsPanel, SettingsToggleButton, Container, ContainerConfig, ToggleButton, ToggleButtonConfig } from 'bitmovin-player-ui';
2
2
  import { type NPOTag, type PageTracker } from '@npotag/tag';
3
3
  import { ButtonConfig } from 'bitmovin-player-ui/dist/js/framework/components/button';
4
4
  import NpoPlayer from '../npoplayer';
5
5
  import { NpoPlayerAPI } from '../services/npoPlayerAPI/npoPlayerAPI';
6
6
  import { NpoPlayerEventCallback } from './events';
7
- import { AnalyticsConfig, DRMConfig, GoogleCastRemoteControlConfig, ProgressiveSourceConfig, SourceConfigOptions, SourceLabelingStreamTypeConfig, SubtitleTrack, ThumbnailTrack, VRConfig } from 'bitmovin-player';
8
- export { Technology } from 'bitmovin-player';
7
+ import { ProgressiveSourceConfig, SourceConfigOptions, SourceLabelingStreamTypeConfig, ThumbnailTrack } from 'bitmovin-player/modules/bitmovinplayer-core';
8
+ import type { AnalyticsConfig } from 'bitmovin-player/types/analytics/ConfigAPI';
9
+ import type { GoogleCastRemoteControlConfig } from 'bitmovin-player/types/remotecontrol/ConfigAPI';
10
+ import DRMConfig from 'bitmovin-player/modules/bitmovinplayer-drm';
11
+ import { SubtitleTrack } from 'bitmovin-player/modules/bitmovinplayer-subtitles';
12
+ export { Technology } from 'bitmovin-player/modules/bitmovinplayer-core';
9
13
  export interface Profile {
10
14
  profileName: string;
11
15
  drm: string | undefined;
@@ -82,6 +86,7 @@ interface StreamObject_Assets {
82
86
  preroll?: string;
83
87
  }
84
88
  export interface StreamObject_Metadata {
89
+ chapters?: Chapter[];
85
90
  broadcaster?: string;
86
91
  description: string;
87
92
  duration?: string;
@@ -108,11 +113,10 @@ export interface SourceConfig {
108
113
  smooth?: string;
109
114
  whep?: string;
110
115
  poster?: string;
111
- drm?: DRMConfig;
116
+ drm?: typeof DRMConfig;
112
117
  options?: SourceConfigOptions;
113
118
  subtitleTracks?: SubtitleTrack[];
114
119
  thumbnailTrack?: ThumbnailTrack;
115
- vr?: VRConfig;
116
120
  title?: string;
117
121
  description?: string;
118
122
  labeling?: SourceLabelingStreamTypeConfig;
@@ -138,8 +142,10 @@ export interface StreamOptions {
138
142
  customFallbackPoster?: string;
139
143
  autoFillTimeLineMarkerDuration?: boolean;
140
144
  autoplay?: boolean;
145
+ skippableChapters?: string[];
141
146
  npoTagPageTracker?: PageTracker;
142
147
  retryCallback?: () => void;
148
+ infoPanelHTML?: string;
143
149
  }
144
150
  export interface UIComponents {
145
151
  errorMessageOverlay?: ErrorMessageOverlay;
@@ -150,6 +156,7 @@ export interface UIComponents {
150
156
  subtitlesButton?: SettingsPanelItem | undefined;
151
157
  qualityButton?: SettingsPanelItem | undefined;
152
158
  watchFromStartButton?: Button<ButtonConfig> | undefined;
159
+ skipChapterButton?: Button<ButtonConfig> | undefined;
153
160
  controlBar?: ControlBar | undefined;
154
161
  adbutton?: Button<ButtonConfig> | undefined;
155
162
  adlabel?: Label<{
@@ -161,44 +168,8 @@ export interface UIComponents {
161
168
  settingsPanels?: SettingsPanel[] | undefined;
162
169
  settingsPanel?: SettingsPanel | undefined;
163
170
  settingsToggleButton?: SettingsToggleButton | undefined;
164
- }
165
- export interface CustomMessageHandlerInterface {
166
- defaultActionRequired?: boolean;
167
- isChecked?: boolean;
168
- playNext?: {
169
- remainingCountDownDuration: number;
170
- };
171
- error?: ErrorEvent;
172
- errorMessage?: {
173
- input: string;
174
- status: number;
175
- };
176
- }
177
- export declare enum CustomMessages {
178
- CLICK_CAST = "castButtonClick",
179
- CLICK_GO_BACK_TO_LIVE = "clickGoBackToLive",
180
- CLICK_WATCH_FROM_START = "clickWatchFromStart",
181
- DO_ERROR = "doError",
182
- ERROR_TRIGGERED = "errorTriggerd",
183
- JAVASCRIPT_READY = "javascriptReady",
184
- PLAY_NEXT_CANCEL_CLICK = "playNextCancelClick",
185
- PLAY_NEXT_COUNTDOWN_CANCELED = "playNextCountdownCanceled",
186
- PLAY_NEXT_COUNTDOWN_FINISHED = "playNextCountdownFinished",
187
- PLAY_NEXT_COUNTDOWN_PROGRESS = "playNextCountdownProgress",
188
- PLAY_NEXT_OVERLAY_HIDDEN = "playNextOverlayHidden",
189
- PLAY_NEXT_OVERLAY_HIDE = "playNextOverlayHide",
190
- PLAY_NEXT_OVERLAY_SHOW = "playNextOverlayShow",
191
- PLAY_NEXT_OVERLAY_SHOWN = "playNextOverlayShown",
192
- PLAY_NEXT_PROCEED_CLICK = "playNextProceedClick",
193
- SET_STREAM_LINK = "setStreamLink",
194
- SET_WEB_DATA = "setWebData",
195
- TOGGLE_AIRPLAY = "toggleAirplay",
196
- TOGGLE_FULLSCREEN = "toggleFullScreen",
197
- TOGGLE_FULLSCREEN_UI = "toggleFullscreenUI",
198
- TOGGLE_MUTE = "toggleMute",
199
- TOGGLE_PIP = "togglePiP",
200
- TOGGLE_PLAY_PAUSE = "togglePlayPause",
201
- TOGGLE_SETTINGS_PANEL = "toggleSettingsPanel"
171
+ infoPanel?: Container<ContainerConfig>;
172
+ infoPanelToggleButtons?: ToggleButton<ToggleButtonConfig>[];
202
173
  }
203
174
  export declare enum NpoPlayerUIVariants {
204
175
  DEFAULT = "default",
@@ -242,3 +213,28 @@ export interface LogEventParams {
242
213
  event: string;
243
214
  data?: any;
244
215
  }
216
+ export interface LogErrorContext {
217
+ programAvailableFrom?: string;
218
+ programAvailableUntil?: string;
219
+ }
220
+ export interface LogErrorParams {
221
+ playerContext: PlayerContext;
222
+ status: number;
223
+ body?: string;
224
+ context?: LogErrorContext;
225
+ }
226
+ export interface CreateButtonConfig {
227
+ text: string;
228
+ onClick: () => void;
229
+ ariaLabel?: string;
230
+ cssClass?: string;
231
+ hidden?: boolean;
232
+ acceptsTouchWithUiHidden?: boolean;
233
+ }
234
+ export interface Chapter {
235
+ description: string;
236
+ from: number;
237
+ until: number;
238
+ title: string;
239
+ type: string;
240
+ }
@@ -1,7 +1,4 @@
1
1
  import { Button } from 'bitmovin-player-ui';
2
- import type NpoPlayer from '../../npoplayer';
3
- export declare function createAdButton(npoPlayer: NpoPlayer): Button<{
4
- cssClass: string;
5
- text: string;
6
- hidden: true;
7
- }>;
2
+ import { ButtonConfig } from 'bitmovin-player-ui/dist/js/framework/components/button';
3
+ import { PlayerContext } from '../../types/interfaces';
4
+ export declare function createAdButton(playerContext: PlayerContext): Button<ButtonConfig>;
@@ -1,7 +1,4 @@
1
1
  import { Label } from 'bitmovin-player-ui';
2
- import type NpoPlayer from '../../npoplayer';
3
- export declare function createAdLabel(npoPlayer: NpoPlayer): Label<{
4
- text: string;
5
- cssClass: string;
6
- hidden: true;
7
- }>;
2
+ import { LabelConfig } from 'bitmovin-player-ui/dist/js/framework/components/label';
3
+ import { PlayerContext } from '../../types/interfaces';
4
+ export declare function createAdLabel(playerContext: PlayerContext): Label<LabelConfig>;