@npo/player 1.24.7 → 1.26.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 (170) hide show
  1. package/README.md +1 -1
  2. package/lib/js/api/getstreamobject.d.ts +1 -1
  3. package/lib/js/api/getstreamobject.js +4 -4
  4. package/lib/js/api/getstreamobject.test.js +13 -13
  5. package/lib/js/playeractions/handlers/handleoffsets.js +9 -7
  6. package/lib/js/playeractions/handlers/handleoffsets.test.js +1 -1
  7. package/lib/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
  8. package/lib/js/playeractions/handlers/processplayerconfig.js +18 -4
  9. package/lib/js/playeractions/handlers/processplayerconfig.test.js +116 -0
  10. package/lib/js/playeractions/handlers/processsourceconfig.d.ts +3 -1
  11. package/lib/js/playeractions/handlers/processsourceconfig.js +20 -10
  12. package/lib/js/playeractions/handlers/processsourceconfig.test.js +25 -0
  13. package/lib/js/settings/localization.d.ts +76 -1
  14. package/lib/js/settings/localization.js +2 -2
  15. package/lib/js/tracking/handlers/eventbinding.js +25 -17
  16. package/lib/js/tracking/handlers/eventlogging.js +3 -8
  17. package/lib/js/tracking/handlers/playertrackerinit.d.ts +2 -2
  18. package/lib/js/tracking/handlers/playertrackerinit.js +8 -6
  19. package/lib/js/tracking/handlers/playertrackerinit.test.d.ts +1 -0
  20. package/lib/js/tracking/handlers/playertrackerinit.test.js +74 -0
  21. package/lib/js/tracking/handlers/playertrackerstart.js +1 -1
  22. package/lib/js/utilities/utilities.element.d.ts +6 -0
  23. package/lib/js/utilities/utilities.element.js +10 -0
  24. package/lib/js/utilities/utilities.element.test.js +18 -5
  25. package/lib/lang/nl.json +1 -1
  26. package/lib/lang/subtitleLabels/nl.json +14 -0
  27. package/lib/npoplayer.d.ts +15 -6
  28. package/lib/npoplayer.js +57 -50
  29. package/lib/npoplayer.test.js +12 -4
  30. package/lib/package.json +3 -3
  31. package/lib/services/a11y/setup.js +2 -5
  32. package/lib/services/a11y/setup.test.js +2 -19
  33. package/lib/services/advertHandlers/discardAdBreak.js +4 -4
  34. package/lib/services/advertHandlers/discardAdBreak.test.js +25 -13
  35. package/lib/services/advertHandlers/handlePreRolls.js +19 -19
  36. package/lib/services/advertHandlers/handlePrerolls.test.js +4 -4
  37. package/lib/services/cdnProviders/cdnProviders.js +4 -2
  38. package/lib/services/drmHandlers/decideprofile.js +1 -1
  39. package/lib/services/drmHandlers/decideprofile.test.js +1 -1
  40. package/lib/services/drmHandlers/verifydrm.js +6 -6
  41. package/lib/services/drmHandlers/verifydrm.test.js +5 -5
  42. package/lib/services/eventListenerHandlers/removeEventListeners.js +2 -2
  43. package/lib/services/eventListenerHandlers/removeEventListeners.test.js +9 -9
  44. package/lib/services/keyboardHandlers/resolvekeypress.js +5 -5
  45. package/lib/services/keyboardHandlers/resolvekeypress.test.js +1 -1
  46. package/lib/services/liveStreamHandlers/handleLiveStreamControls.js +2 -2
  47. package/lib/services/liveStreamHandlers/handleLiveStreamControls.test.js +2 -2
  48. package/lib/services/localStorageHandlers/localStorageHandlers.js +2 -2
  49. package/lib/services/localStorageHandlers/localStorageHandlers.test.js +2 -5
  50. package/lib/services/nicamHandlers/nicamhandler.d.ts +5 -0
  51. package/lib/{ui/handlers → services/nicamHandlers}/nicamhandler.js +24 -15
  52. package/lib/services/nicamHandlers/nicamhandler.test.js +132 -0
  53. package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +3 -2
  54. package/lib/services/npoPlayerAPI/npoPlayerAPI.js +19 -23
  55. package/lib/services/preferences/handlePreferences.d.ts +2 -0
  56. package/lib/services/preferences/handlePreferences.js +42 -0
  57. package/lib/services/preferences/handlePreferences.test.d.ts +1 -0
  58. package/lib/services/preferences/handlePreferences.test.js +102 -0
  59. package/lib/services/segmentHandlers/addSegmentEventListeners.js +2 -2
  60. package/lib/services/segmentHandlers/addSegmentEventListeners.test.js +1 -1
  61. package/lib/services/segmentHandlers/setSegmentMarkers.js +1 -1
  62. package/lib/services/services.d.ts +7 -0
  63. package/lib/services/services.js +26 -0
  64. package/lib/services/streamoptionsHandlers/streamOptionsHandler.d.ts +6 -0
  65. package/lib/services/streamoptionsHandlers/streamOptionsHandler.js +78 -0
  66. package/lib/services/streamoptionsHandlers/streamOptionsHandler.test.js +187 -0
  67. package/lib/services/uiHandlers/uiVisiblityHandler.d.ts +3 -0
  68. package/lib/services/uiHandlers/uiVisiblityHandler.js +26 -0
  69. package/lib/services/uiHandlers/uiVisiblityHandler.test.d.ts +1 -0
  70. package/lib/services/uiHandlers/uiVisiblityHandler.test.js +62 -0
  71. package/lib/src/js/api/getstreamobject.d.ts +1 -1
  72. package/lib/src/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
  73. package/lib/src/js/playeractions/handlers/processplayerconfig.test.d.ts +1 -0
  74. package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +3 -1
  75. package/lib/src/js/playeractions/handlers/processsourceconfig.test.d.ts +1 -0
  76. package/lib/src/js/settings/localization.d.ts +76 -1
  77. package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +2 -2
  78. package/lib/src/js/tracking/handlers/playertrackerinit.test.d.ts +1 -0
  79. package/lib/src/js/utilities/utilities.element.d.ts +6 -0
  80. package/lib/src/npoplayer.d.ts +15 -6
  81. package/lib/src/services/nicamHandlers/nicamhandler.d.ts +5 -0
  82. package/lib/src/services/nicamHandlers/nicamhandler.test.d.ts +1 -0
  83. package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +3 -2
  84. package/lib/src/services/preferences/handlePreferences.d.ts +2 -0
  85. package/lib/src/services/preferences/handlePreferences.test.d.ts +1 -0
  86. package/lib/src/services/services.d.ts +7 -0
  87. package/lib/src/services/streamoptionsHandlers/streamOptionsHandler.d.ts +6 -0
  88. package/lib/src/services/streamoptionsHandlers/streamOptionsHandler.test.d.ts +1 -0
  89. package/lib/src/services/uiHandlers/uiVisiblityHandler.d.ts +3 -0
  90. package/lib/src/services/uiHandlers/uiVisiblityHandler.test.d.ts +1 -0
  91. package/lib/src/types/classes.d.ts +6 -0
  92. package/lib/src/types/interfaces.d.ts +25 -3
  93. package/lib/src/ui/components/adbutton.d.ts +1 -1
  94. package/lib/src/ui/components/adlabel.d.ts +1 -1
  95. package/lib/src/ui/components/buttons.d.ts +10 -17
  96. package/lib/src/ui/components/controlbar.d.ts +2 -2
  97. package/lib/src/ui/components/ctabar.d.ts +1 -1
  98. package/lib/src/ui/components/nativemobile/buttons.d.ts +8 -0
  99. package/lib/src/ui/components/playnext.d.ts +1 -3
  100. package/lib/src/ui/components/seekbar.d.ts +1 -1
  101. package/lib/src/ui/components/titlebar.d.ts +1 -1
  102. package/lib/src/ui/components/topbar.d.ts +2 -2
  103. package/lib/src/ui/components/verticalvideo/controlbar.d.ts +2 -2
  104. package/lib/src/ui/handlers/playnextscreen.test.d.ts +1 -0
  105. package/lib/src/ui/handlers/timecontrolhandlers.d.ts +3 -3
  106. package/lib/src/ui/uicontainer.d.ts +2 -3
  107. package/lib/src/ui/uicontainer.test.d.ts +1 -0
  108. package/lib/tests/mocks/mockLogEmitter.d.ts +2 -0
  109. package/lib/tests/mocks/mockLogEmitter.js +20 -0
  110. package/lib/tests/mocks/mockNpoplayer.js +4 -2
  111. package/lib/tests/mocks/playerContextMock.d.ts +5 -3
  112. package/lib/tests/mocks/playerContextMock.js +8 -5
  113. package/lib/types/classes.d.ts +6 -0
  114. package/lib/types/classes.js +12 -0
  115. package/lib/types/interfaces.d.ts +25 -3
  116. package/lib/types/interfaces.js +1 -0
  117. package/lib/ui/components/adbutton.d.ts +1 -1
  118. package/lib/ui/components/adbutton.js +3 -3
  119. package/lib/ui/components/adlabel.d.ts +1 -1
  120. package/lib/ui/components/adlabel.js +3 -3
  121. package/lib/ui/components/buttons.d.ts +10 -17
  122. package/lib/ui/components/buttons.js +44 -27
  123. package/lib/ui/components/controlbar.d.ts +2 -2
  124. package/lib/ui/components/controlbar.js +20 -32
  125. package/lib/ui/components/ctabar.d.ts +1 -1
  126. package/lib/ui/components/ctabar.js +4 -4
  127. package/lib/ui/components/nativemobile/buttons.d.ts +8 -0
  128. package/lib/ui/components/nativemobile/buttons.js +41 -1
  129. package/lib/ui/components/nativemobile/controlbar.js +1 -2
  130. package/lib/ui/components/nativemobile/topbar.js +2 -2
  131. package/lib/ui/components/playnext.d.ts +1 -3
  132. package/lib/ui/components/playnext.js +3 -3
  133. package/lib/ui/components/seekbar.d.ts +1 -1
  134. package/lib/ui/components/seekbar.js +5 -3
  135. package/lib/ui/components/settingspanel.js +9 -9
  136. package/lib/ui/components/titlebar.d.ts +1 -1
  137. package/lib/ui/components/titlebar.js +2 -2
  138. package/lib/ui/components/topbar.d.ts +2 -2
  139. package/lib/ui/components/topbar.js +8 -17
  140. package/lib/ui/components/verticalvideo/controlbar.d.ts +2 -2
  141. package/lib/ui/components/verticalvideo/controlbar.js +4 -4
  142. package/lib/ui/handlers/playnextscreen.test.d.ts +1 -0
  143. package/lib/ui/handlers/timecontrolhandlers.d.ts +3 -3
  144. package/lib/ui/nativemobileuifactory.js +20 -24
  145. package/lib/ui/nativemobileuifactory.test.js +2 -6
  146. package/lib/ui/uicontainer.d.ts +2 -3
  147. package/lib/ui/uicontainer.js +13 -30
  148. package/lib/ui/uicontainer.test.d.ts +1 -0
  149. package/lib/ui/uicontainer.test.js +80 -0
  150. package/package.json +3 -3
  151. package/src/style/components/_advert.scss +0 -9
  152. package/src/style/components/_icons.scss +5 -0
  153. package/src/style/components/_nicam.scss +5 -4
  154. package/src/style/components/_settingspanel.scss +48 -17
  155. package/src/style/components/vertical-video/_settingspanel.scss +1 -1
  156. package/src/style/npoplayer.css +26 -20
  157. package/src/style/variants/_player-base.scss +4 -0
  158. package/src/style/variants/_player-large.scss +5 -1
  159. package/src/style/variants/_player-small.scss +11 -8
  160. package/lib/src/ui/handlers/nicamhandler.d.ts +0 -6
  161. package/lib/src/ui/handlers/streamhandler.d.ts +0 -2
  162. package/lib/ui/handlers/nicamhandler.d.ts +0 -6
  163. package/lib/ui/handlers/nicamhandler.test.js +0 -36
  164. package/lib/ui/handlers/streamhandler.d.ts +0 -2
  165. package/lib/ui/handlers/streamhandler.js +0 -60
  166. /package/lib/{src/ui/handlers/playnextstreen.test.d.ts → js/playeractions/handlers/processplayerconfig.test.d.ts} +0 -0
  167. /package/lib/{ui/handlers/playnextstreen.test.d.ts → js/playeractions/handlers/processsourceconfig.test.d.ts} +0 -0
  168. /package/lib/{src/ui/handlers → services/nicamHandlers}/nicamhandler.test.d.ts +0 -0
  169. /package/lib/{ui/handlers/nicamhandler.test.d.ts → services/streamoptionsHandlers/streamOptionsHandler.test.d.ts} +0 -0
  170. /package/lib/ui/handlers/{playnextstreen.test.js → playnextscreen.test.js} +0 -0
@@ -0,0 +1,187 @@
1
+ import { handleStreamOptions, initializeFragment, handleStartOffset, updateStreamClasses, setupAutoplay } from './streamOptionsHandler';
2
+ import '@testing-library/jest-dom';
3
+ import { createMockNpoPlayer, createPlayerContextMock, createMockNpoPlayerAPI } from '../../../tests/mocks/playerContextMock';
4
+ import * as playerAction from '../../js/playeractions/playeractions';
5
+ import { updateClassFromElementByQuery } from '../../js/utilities/utilities.element';
6
+ import { handleLiveStreamControls } from '../liveStreamHandlers/handleLiveStreamControls';
7
+ import { initSegment } from '../segmentHandlers/initSegment';
8
+ import { NpoPlayerEvent } from '../../types/events';
9
+ import { removeEventListeners } from '../eventListenerHandlers/removeEventListeners';
10
+ jest.mock('../segmentHandlers/initSegment');
11
+ jest.mock('../eventListenerHandlers/removeEventListeners');
12
+ jest.mock('../../js/playeractions/playeractions');
13
+ jest.mock('../liveStreamHandlers/handleLiveStreamControls');
14
+ jest.mock('../../js/utilities/utilities.element', () => ({
15
+ updateClassFromElementByQuery: jest.fn()
16
+ }));
17
+ describe('handleStreamOptions', () => {
18
+ let mockElement;
19
+ beforeEach(() => {
20
+ mockElement = { innerHTML: '', appendChild: jest.fn() };
21
+ document.querySelector = jest.fn().mockReturnValue(mockElement);
22
+ });
23
+ it('correctly calls all of the functions when the conditions are met', () => {
24
+ const mockNpoPlayerAPI = createMockNpoPlayerAPI({
25
+ on: jest.fn(),
26
+ off: jest.fn()
27
+ });
28
+ const npoPlayerMock = createMockNpoPlayer({
29
+ playerconfig: {
30
+ playback: {
31
+ muted: false,
32
+ autoplay: true
33
+ }
34
+ },
35
+ streamObject: {
36
+ stream: {
37
+ isLiveStream: true
38
+ }
39
+ }
40
+ });
41
+ const playerContextMock = createPlayerContextMock({
42
+ player: mockNpoPlayerAPI,
43
+ npoPlayer: npoPlayerMock
44
+ });
45
+ handleStreamOptions(playerContextMock);
46
+ expect(initializeFragment(playerContextMock)).toHaveBeenCalled;
47
+ expect(handleStartOffset(playerContextMock)).toHaveBeenCalled;
48
+ expect(updateStreamClasses(playerContextMock)).toHaveBeenCalled;
49
+ expect(setupAutoplay(playerContextMock)).toHaveBeenCalled;
50
+ });
51
+ it('should return early if uiManager is missing', () => {
52
+ const npoPlayerMock = createMockNpoPlayer({
53
+ UIManager: null
54
+ });
55
+ const playerContextMock = createPlayerContextMock({
56
+ npoPlayer: npoPlayerMock
57
+ });
58
+ handleStreamOptions(playerContextMock);
59
+ expect(removeEventListeners).not.toHaveBeenCalled();
60
+ });
61
+ it('should return early if streamObject is missing', () => {
62
+ const npoPlayerMock = createMockNpoPlayer({
63
+ streamObject: null
64
+ });
65
+ const playerContextMock = createPlayerContextMock({
66
+ npoPlayer: npoPlayerMock
67
+ });
68
+ handleStreamOptions(playerContextMock);
69
+ expect(removeEventListeners).not.toHaveBeenCalled();
70
+ });
71
+ it('should return early if autoplay is false', () => {
72
+ const npoPlayerMock = createMockNpoPlayer({
73
+ playerconfig: {
74
+ playback: {
75
+ muted: false,
76
+ autoplay: true
77
+ }
78
+ },
79
+ streamOptions: {
80
+ autoplay: false
81
+ }
82
+ });
83
+ const playerContextMock = createPlayerContextMock({
84
+ npoPlayer: npoPlayerMock
85
+ });
86
+ const setupAutoplayMock = jest.fn();
87
+ handleStreamOptions(playerContextMock);
88
+ expect(setupAutoplayMock).not.toHaveBeenCalled();
89
+ });
90
+ describe('updateStreamClasses', () => {
91
+ it('should add "livestream-no-dvr" class when isLiveStream is true and hasDvrWindow is false', () => {
92
+ const npoPlayerMock = createMockNpoPlayer({
93
+ streamObject: {
94
+ stream: {
95
+ isLiveStream: true,
96
+ hasDvrWindow: false
97
+ }
98
+ }
99
+ });
100
+ const playerContextMock = createPlayerContextMock({
101
+ npoPlayer: npoPlayerMock
102
+ });
103
+ updateStreamClasses(playerContextMock);
104
+ expect(updateClassFromElementByQuery).toHaveBeenCalledWith(expect.objectContaining({
105
+ className: 'livestream-no-dvr',
106
+ condition: true
107
+ }));
108
+ });
109
+ it('should add "audio-only" class when avType is "aod" or "audio"', () => {
110
+ const npoPlayerMock = createMockNpoPlayer({
111
+ streamObject: {
112
+ stream: {
113
+ avType: 'aod'
114
+ }
115
+ }
116
+ });
117
+ const playerContextMock = createPlayerContextMock({
118
+ npoPlayer: npoPlayerMock
119
+ });
120
+ updateStreamClasses(playerContextMock);
121
+ expect(updateClassFromElementByQuery).toHaveBeenCalledWith(expect.objectContaining({
122
+ className: 'audio-only',
123
+ condition: true
124
+ }));
125
+ });
126
+ it('should call handleLiveStreamControls when isLiveStream is true and hasDvrWindow is true', () => {
127
+ const npoPlayerMock = createMockNpoPlayer({
128
+ streamObject: {
129
+ stream: {
130
+ isLiveStream: true,
131
+ hasDvrWindow: true
132
+ }
133
+ }
134
+ });
135
+ const playerContextMock = createPlayerContextMock({
136
+ npoPlayer: npoPlayerMock
137
+ });
138
+ updateStreamClasses(playerContextMock);
139
+ expect(handleLiveStreamControls).toHaveBeenCalledWith(playerContextMock);
140
+ });
141
+ });
142
+ describe('initializeFragment', () => {
143
+ it('should call initSegment with correct parameters', () => {
144
+ const npoPlayerMock = createMockNpoPlayer({
145
+ streamObject: { segment: 'segment' },
146
+ streamOptions: { fragments: { sections: [{ duration: 10, time: 0 }] } }
147
+ });
148
+ const playerContextMock = createPlayerContextMock({
149
+ npoPlayer: npoPlayerMock
150
+ });
151
+ initializeFragment(playerContextMock);
152
+ expect(initSegment).toHaveBeenCalledWith(playerContextMock, {
153
+ segment: 'segment',
154
+ fragment: { sections: [{ duration: 10, time: 0 }] }
155
+ });
156
+ });
157
+ });
158
+ describe('handleStartOffset', () => {
159
+ it('should call handleStartOffset with correct parameters', () => {
160
+ const npoPlayerMock = createMockNpoPlayer({
161
+ streamOptions: { startOffset: 10 }
162
+ });
163
+ const playerContextMock = createPlayerContextMock({
164
+ npoPlayer: npoPlayerMock
165
+ });
166
+ handleStartOffset(playerContextMock);
167
+ expect(playerAction.handleStartOffset).toHaveBeenCalledWith(playerContextMock, 10);
168
+ });
169
+ });
170
+ describe('setupAutoplay', () => {
171
+ it('should setup autoplay correctly', async () => {
172
+ const mockNpoPlayerAPI = createMockNpoPlayerAPI({
173
+ on: jest.fn(),
174
+ off: jest.fn(),
175
+ play: jest.fn().mockResolvedValue(undefined)
176
+ });
177
+ const playerContextMock = createPlayerContextMock({
178
+ player: mockNpoPlayerAPI
179
+ });
180
+ setupAutoplay(playerContextMock);
181
+ expect(playerContextMock.player.on).toHaveBeenCalledWith(NpoPlayerEvent.Ready, expect.any(Function));
182
+ const handleAutoPlay = playerContextMock.player.on.mock.calls[0][1];
183
+ await handleAutoPlay();
184
+ expect(playerContextMock.player.play).toHaveBeenCalled();
185
+ });
186
+ });
187
+ });
@@ -0,0 +1,3 @@
1
+ import { PlayerContext } from '../../types/interfaces';
2
+ export declare function addUivisiblityHandlers(playerContext: PlayerContext): void;
3
+ export declare function removeUivisiblityHandlers(playerContext: PlayerContext): void;
@@ -0,0 +1,26 @@
1
+ import { NpoPlayerUIVariants } from '../../types/interfaces';
2
+ export function addUivisiblityHandlers(playerContext) {
3
+ const { uiManager, variant } = playerContext.npoPlayer;
4
+ if (!uiManager)
5
+ return;
6
+ if (variant === NpoPlayerUIVariants.DEFAULT) {
7
+ uiManager.activeUi.onControlsHide.subscribe(() => {
8
+ playerContext.npoPlayer.logEmitter.emit('logControlsVisibilityChange', false);
9
+ });
10
+ uiManager.activeUi.onControlsShow.subscribe(() => {
11
+ playerContext.npoPlayer.logEmitter.emit('logControlsVisibilityChange', true);
12
+ });
13
+ uiManager.activeUi.getUI().showUi();
14
+ }
15
+ }
16
+ export function removeUivisiblityHandlers(playerContext) {
17
+ const { uiManager } = playerContext.npoPlayer;
18
+ if (!uiManager)
19
+ return;
20
+ uiManager.activeUi.onControlsHide.unsubscribe(() => {
21
+ playerContext.npoPlayer.logEmitter.emit('logControlsVisibilityChange', false);
22
+ });
23
+ uiManager.activeUi.onControlsShow.unsubscribe(() => {
24
+ playerContext.npoPlayer.logEmitter.emit('logControlsVisibilityChange', true);
25
+ });
26
+ }
@@ -0,0 +1,62 @@
1
+ import createPlayerContextMock from '../../../tests/mocks/playerContextMock';
2
+ import { addUivisiblityHandlers, removeUivisiblityHandlers } from './uiVisiblityHandler';
3
+ import { NpoPlayerUIVariants } from '../../types/interfaces';
4
+ import { createLogEmitterMock } from '../../../tests/mocks/mockLogEmitter';
5
+ describe('UI Visibility Handlers', () => {
6
+ let mockPlayerContext;
7
+ let mockLogEmitter;
8
+ let mockUIManager;
9
+ beforeEach(() => {
10
+ mockLogEmitter = createLogEmitterMock();
11
+ mockUIManager = {
12
+ activeUi: {
13
+ onControlsHide: { subscribe: jest.fn(), unsubscribe: jest.fn() },
14
+ onControlsShow: { subscribe: jest.fn(), unsubscribe: jest.fn() },
15
+ getUI: jest.fn().mockReturnValue({ showUi: jest.fn() })
16
+ }
17
+ };
18
+ mockPlayerContext = createPlayerContextMock();
19
+ mockPlayerContext.npoPlayer.logEmitter = mockLogEmitter;
20
+ mockPlayerContext.npoPlayer.uiManager = mockUIManager;
21
+ mockPlayerContext.npoPlayer.variant = NpoPlayerUIVariants.DEFAULT;
22
+ });
23
+ describe('addUivisiblityHandlers', () => {
24
+ it('should subscribe to visibility handlers and call showUi', () => {
25
+ addUivisiblityHandlers(mockPlayerContext);
26
+ expect(mockUIManager.activeUi.onControlsHide.subscribe).toHaveBeenCalled();
27
+ expect(mockUIManager.activeUi.onControlsShow.subscribe).toHaveBeenCalled();
28
+ expect(mockUIManager.activeUi.getUI().showUi).toHaveBeenCalled();
29
+ });
30
+ it('should emit logControlsVisibilityChange when controls are shown', () => {
31
+ addUivisiblityHandlers(mockPlayerContext);
32
+ const onControlsShowCallback = mockUIManager.activeUi.onControlsShow.subscribe.mock.calls[0][0];
33
+ onControlsShowCallback();
34
+ expect(mockLogEmitter.emit).toHaveBeenCalledWith('logControlsVisibilityChange', true);
35
+ });
36
+ it('should emit logControlsVisibilityChange when controls are hidden', () => {
37
+ addUivisiblityHandlers(mockPlayerContext);
38
+ const onControlsHideCallback = mockUIManager.activeUi.onControlsHide.subscribe.mock.calls[0][0];
39
+ onControlsHideCallback();
40
+ expect(mockLogEmitter.emit).toHaveBeenCalledWith('logControlsVisibilityChange', false);
41
+ });
42
+ it('should not do anything if uiManager is not defined', () => {
43
+ mockPlayerContext.npoPlayer.uiManager = undefined;
44
+ addUivisiblityHandlers(mockPlayerContext);
45
+ expect(mockLogEmitter.emit).not.toHaveBeenCalled();
46
+ });
47
+ });
48
+ describe('removeUivisiblityHandlers', () => {
49
+ it('should unsubscribe from visibility handlers', () => {
50
+ addUivisiblityHandlers(mockPlayerContext);
51
+ removeUivisiblityHandlers(mockPlayerContext);
52
+ expect(mockUIManager.activeUi.onControlsHide.unsubscribe).toHaveBeenCalled();
53
+ expect(mockUIManager.activeUi.onControlsShow.unsubscribe).toHaveBeenCalled();
54
+ });
55
+ it('should not do anything if uiManager is not defined', () => {
56
+ mockPlayerContext.npoPlayer.uiManager = undefined;
57
+ removeUivisiblityHandlers(mockPlayerContext);
58
+ expect(mockUIManager.activeUi.onControlsHide.unsubscribe).not.toHaveBeenCalled();
59
+ expect(mockUIManager.activeUi.onControlsShow.unsubscribe).not.toHaveBeenCalled();
60
+ });
61
+ });
62
+ });
@@ -1,3 +1,3 @@
1
1
  import { type ApiPayload } from '../../types/interfaces';
2
2
  import type NpoPlayer from '../../npoplayer';
3
- export declare function getStreamObject(npoplayer: NpoPlayer, payload: ApiPayload): Promise<any>;
3
+ export declare function getStreamObject(npoPlayer: NpoPlayer, payload: ApiPayload): Promise<any>;
@@ -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,4 +1,6 @@
1
1
  import { StreamObject, StreamOptions } from 'types/interfaces';
2
2
  import { SourceConfig } from 'bitmovin-player';
3
3
  import { NpoPlayerServices } from '../../../services/services';
4
- export declare function processSourceConfig(NpoPlayerServices: NpoPlayerServices, _sourceConfig: SourceConfig | undefined, _streamObject: StreamObject, drm: string | undefined, streamOptions: StreamOptions, version: string, npoTagPartyId: string | undefined, npoPlayerServices: NpoPlayerServices): Promise<SourceConfig>;
4
+ import { NPOTag } from '@npotag/tag';
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>;
@@ -1,6 +1,81 @@
1
1
  export declare const localizationConfig: {
2
2
  language: string;
3
3
  vocabularies: {
4
- nl: Record<string, string>;
4
+ nl: {
5
+ "settings.video.quality": string;
6
+ "settings.audio.quality": string;
7
+ "settings.audio.track": string;
8
+ "settings.audio.mute": string;
9
+ "settings.audio.unmute": string;
10
+ "settings.audio.volume": string;
11
+ "settings.subtitles.window.color": string;
12
+ "settings.subtitles.window.opacity": string;
13
+ "settings.subtitles": string;
14
+ "settings.subtitles.font.color": string;
15
+ "settings.subtitles.font.opacity": string;
16
+ "settings.subtitles.background.color": string;
17
+ "settings.subtitles.background.opacity": string;
18
+ "colors.white": string;
19
+ "colors.black": string;
20
+ "colors.red": string;
21
+ "colors.green": string;
22
+ "colors.blue": string;
23
+ "colors.cyan": string;
24
+ "colors.yellow": string;
25
+ "colors.magenta": string;
26
+ percent: string;
27
+ "settings.subtitles.font.size": string;
28
+ "settings.subtitles.characterEdge": string;
29
+ "settings.subtitles.characterEdge.raised": string;
30
+ "settings.subtitles.characterEdge.depressed": string;
31
+ "settings.subtitles.characterEdge.uniform": string;
32
+ "settings.subtitles.characterEdge.dropshadowed": string;
33
+ "settings.subtitles.font.family": string;
34
+ "settings.subtitles.font.family.monospacedserif": string;
35
+ "settings.subtitles.font.family.proportionalserif": string;
36
+ "settings.subtitles.font.family.monospacedsansserif": string;
37
+ "settings.subtitles.font.family.proportionalsansserif": string;
38
+ "settings.subtitles.font.family.casual": string;
39
+ "settings.subtitles.font.family.cursive": string;
40
+ "settings.subtitles.font.family.smallcapital": string;
41
+ "settings.time.hours": string;
42
+ "settings.time.minutes": string;
43
+ "settings.time.seconds": string;
44
+ "ads.remainingTime": string;
45
+ settings: string;
46
+ fullscreen: string;
47
+ speed: string;
48
+ playPause: string;
49
+ play: string;
50
+ pause: string;
51
+ open: string;
52
+ close: string;
53
+ pictureInPicture: string;
54
+ appleAirplay: string;
55
+ googleCast: string;
56
+ vr: string;
57
+ off: string;
58
+ auto: string;
59
+ back: string;
60
+ reset: string;
61
+ replay: string;
62
+ normal: string;
63
+ default: string;
64
+ live: string;
65
+ "subtitle.example": string;
66
+ "subtitle.select": string;
67
+ playingOn: string;
68
+ connectingTo: string;
69
+ watermarkLink: string;
70
+ controlBar: string;
71
+ player: string;
72
+ videoPlayer: string;
73
+ audioPlayer: string;
74
+ seekBar: string;
75
+ "seekBar.value": string;
76
+ "seekBar.timeshift": string;
77
+ "seekBar.durationText": string;
78
+ "segment.unplayableTitle": string;
79
+ };
5
80
  };
6
81
  };
@@ -1,4 +1,4 @@
1
- import { type NPOTag } from '@npotag/tag';
1
+ import { type NPOTag, type PageTracker } from '@npotag/tag';
2
2
  import { type InitialisationProps } from '@npotag/tag/dist/types/src/npoTag';
3
3
  import type NpoPlayer from '../../../npoplayer';
4
- export declare function initPlayerTracker(npoplayer: NpoPlayer, _npotag?: InitialisationProps | undefined, _npotaginstance?: NPOTag): void;
4
+ export declare function initPlayerTracker(npoPlayer: NpoPlayer, _npoTag?: InitialisationProps, _npoTagInstance?: NPOTag, _npoTagPageTracker?: PageTracker): void;
@@ -4,7 +4,13 @@ interface ElementByQuery {
4
4
  }
5
5
  interface RemoveClassFromElementByQuery extends ElementByQuery {
6
6
  className: string;
7
+ condition: boolean;
8
+ }
9
+ export interface UpdateClassFromElementByQuery extends ElementByQuery {
10
+ className: string;
11
+ condition: boolean;
7
12
  }
8
13
  export declare function getElementByQuery({ container, query }: ElementByQuery): Element | null;
9
14
  export declare function removeClassFromElementByQuery(params: RemoveClassFromElementByQuery): void;
15
+ export declare function updateClassFromElementByQuery(params: UpdateClassFromElementByQuery): void;
10
16
  export {};
@@ -1,18 +1,21 @@
1
1
  import { NpoPlayerServices } from './services/services';
2
- import { type StreamTracker, type NPOTag } from '@npotag/tag';
2
+ import { type StreamTracker, type NPOTag, type PageTracker } from '@npotag/tag';
3
3
  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
- playerConfig: PlayerConfig;
10
+ playerConfig: PlayerConfig | undefined;
11
11
  sourceConfig: SourceConfig;
12
12
  streamObject: StreamObject;
13
13
  player: PlayerAPI | undefined;
14
14
  uiManager: UIManager | undefined;
15
15
  npoTag: NPOTagObject | undefined;
16
+ npoTagInitialisation: InitialisationProps | undefined;
17
+ npoTagInstance: NPOTag | undefined;
18
+ npoTagPageTracker: PageTracker | undefined;
16
19
  streamTracker: StreamTracker | undefined;
17
20
  logEmitter: LogEmitter;
18
21
  uiComponents: UIComponents;
@@ -27,11 +30,17 @@ export default class NpoPlayer {
27
30
  isShowingPlayNextScreen: boolean;
28
31
  canceledPlayNextScreen: boolean;
29
32
  playerContext: PlayerContext | undefined;
30
- npoplayerServices: NpoPlayerServices;
33
+ npoPlayerServices: NpoPlayerServices;
31
34
  eventListeners: EventListeners | undefined;
32
35
  mockNpoPlayer: any;
33
- userPreferences: LocalStorageData;
34
- constructor(_container: HTMLElement, _playerConfig: PlayerConfig, _npotag?: InitialisationProps | undefined, _npotaginstance?: NPOTag | undefined, _variant?: NpoPlayerUIVariants);
36
+ constructor(container: HTMLElement | {
37
+ container: HTMLElement;
38
+ playerConfig: PlayerConfig;
39
+ npoTag?: InitialisationProps | undefined;
40
+ npoTagInstance?: NPOTag | undefined;
41
+ variant?: NpoPlayerUIVariants;
42
+ npoTagPageTracker?: PageTracker | undefined;
43
+ }, playerConfig?: PlayerConfig | undefined, npoTag?: InitialisationProps | undefined, npoTagInstance?: NPOTag | undefined, variant?: NpoPlayerUIVariants, npoTagPageTracker?: PageTracker | undefined);
35
44
  initPlayer(_container: HTMLElement, playerConfig: PlayerConfig): void;
36
45
  loadStream(source: string, options?: StreamOptions): Promise<void>;
37
46
  doError(input: any, status?: number): void;
@@ -0,0 +1,5 @@
1
+ import { PlayerContext } from '../../types/interfaces';
2
+ export declare function processNicam(playerContext: PlayerContext, nicamElement: HTMLElement | undefined): void;
3
+ export declare function addNicamIcon(character: string, nicamElement: Element): void;
4
+ export declare function showNicamAfterUiDelay(playerContext: PlayerContext): void;
5
+ export declare function setupNicamKijkwijzerIcons(playerContext: PlayerContext): void;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -17,7 +17,8 @@ export declare class NpoPlayerAPI {
17
17
  setViewMode(viewMode: ViewMode): void;
18
18
  getViewMode(): ViewMode;
19
19
  areSubtitlesEnabled(): boolean;
20
- enableSubtitles(): void;
20
+ getCurrentSubtitle(): string | undefined;
21
+ enableSubtitles(selectedLang?: string): void;
21
22
  isPaused(): boolean;
22
23
  isMuted(): boolean;
23
24
  isLive(): boolean;
@@ -25,6 +26,7 @@ export declare class NpoPlayerAPI {
25
26
  getSupportedTech(): Technology[];
26
27
  off(eventType: NpoPlayerEvent, callback: NpoPlayerEventCallback): void;
27
28
  on(eventType: NpoPlayerEvent, callback: NpoPlayerEventCallback): void;
29
+ isCastAvailable(): boolean;
28
30
  seek(time: number): void;
29
31
  timeShift(time: number): void;
30
32
  getContainer(): HTMLElement;
@@ -37,7 +39,6 @@ export declare class NpoPlayerAPI {
37
39
  getTimeShift(): number;
38
40
  scheduleAds(adConfig: AdConfig): Promise<AdBreak[]>;
39
41
  getActiveAdBreak(): AdBreak | null;
40
- discardAdBreak(adBreakId: string): void;
41
42
  getConfig(mergedConfig?: boolean): PlayerConfig;
42
43
  createUIManager(playerContext: PlayerContext, variant: NpoPlayerUIVariants): Promise<void | UIManager>;
43
44
  }
@@ -0,0 +1,2 @@
1
+ import { PlayerContext } from '../../types/interfaces';
2
+ export declare function handlePreferences(playerContext: PlayerContext): void;
@@ -12,5 +12,12 @@ export declare class NpoPlayerServices {
12
12
  handleUserPrefs(playerContext: PlayerContext): void;
13
13
  setAccessibilityAttributes(playerContext: PlayerContext): void;
14
14
  schedulePreRolls(playerContext: PlayerContext): Promise<void>;
15
+ discardAdBreak(playerContext: PlayerContext): void;
15
16
  handleVerticalVideoControls(playerContext: PlayerContext, variant: NpoPlayerUIVariants): void;
17
+ showNicamAfterUiDelay(playerContext: PlayerContext | undefined): void;
18
+ setupNicamKijkwijzerIcons(playerContext: PlayerContext): void;
19
+ handlePreferences(playerContext: PlayerContext): void;
20
+ addUivisiblityHandlers(playerContext: PlayerContext): void;
21
+ removeUivisiblityHandlers(playerContext: PlayerContext): void;
22
+ handleStreamOptions(playerContext: PlayerContext): void;
16
23
  }
@@ -0,0 +1,6 @@
1
+ import { PlayerContext } from '../../types/interfaces';
2
+ export declare function handleStreamOptions(playerContext: PlayerContext): void;
3
+ export declare function initializeFragment(playerContext: PlayerContext): void;
4
+ export declare function handleStartOffset(playerContext: PlayerContext): void;
5
+ export declare function updateStreamClasses(playerContext: PlayerContext): void;
6
+ export declare function setupAutoplay(playerContext: PlayerContext): void;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,3 @@
1
+ import { PlayerContext } from '../../types/interfaces';
2
+ export declare function addUivisiblityHandlers(playerContext: PlayerContext): void;
3
+ export declare function removeUivisiblityHandlers(playerContext: PlayerContext): void;
@@ -1,4 +1,10 @@
1
1
  /// <reference types="node" />
2
2
  import { EventEmitter } from 'events';
3
+ type AllowedEvents = 'logControlsVisibilityChange' | 'logError' | 'logEvent';
3
4
  export declare class LogEmitter extends EventEmitter {
5
+ emit(event: AllowedEvents, ...args: any[]): boolean;
6
+ on(event: AllowedEvents, listener: (...args: any[]) => void): this;
7
+ once(event: AllowedEvents, listener: (...args: any[]) => void): this;
8
+ off(event: AllowedEvents, listener: (...args: any[]) => void): this;
4
9
  }
10
+ export {};
@@ -4,7 +4,7 @@ import { ButtonConfig } from 'bitmovin-player-ui/dist/js/framework/components/bu
4
4
  import NpoPlayer from '../npoplayer';
5
5
  import { NpoPlayerAPI } from '../services/npoPlayerAPI/npoPlayerAPI';
6
6
  import { NpoPlayerEventCallback } from './events';
7
- import { SourceConfig } from 'bitmovin-player';
7
+ import { AnalyticsConfig, DRMConfig, GoogleCastRemoteControlConfig, ProgressiveSourceConfig, SourceConfigOptions, SourceLabelingStreamTypeConfig, SubtitleTrack, ThumbnailTrack, VRConfig } from 'bitmovin-player';
8
8
  export { Technology } from 'bitmovin-player';
9
9
  export interface Profile {
10
10
  profileName: string;
@@ -31,7 +31,7 @@ export interface StreamObject {
31
31
  }
32
32
  export interface PlayerContext {
33
33
  player: NpoPlayerAPI;
34
- npoplayer: NpoPlayer;
34
+ npoPlayer: NpoPlayer;
35
35
  }
36
36
  export interface ApiPayload {
37
37
  baseURL: string;
@@ -95,6 +95,26 @@ interface FragmentSection {
95
95
  export interface Fragment {
96
96
  sections: FragmentSection[];
97
97
  }
98
+ export interface SourceConfig {
99
+ dash?: string;
100
+ hls?: string;
101
+ progressive?: string | ProgressiveSourceConfig[];
102
+ smooth?: string;
103
+ whep?: string;
104
+ poster?: string;
105
+ drm?: DRMConfig;
106
+ options?: SourceConfigOptions;
107
+ subtitleTracks?: SubtitleTrack[];
108
+ thumbnailTrack?: ThumbnailTrack;
109
+ vr?: VRConfig;
110
+ title?: string;
111
+ description?: string;
112
+ labeling?: SourceLabelingStreamTypeConfig;
113
+ analytics?: AnalyticsConfig;
114
+ metadata?: {
115
+ [key: string]: string;
116
+ };
117
+ }
98
118
  export interface StreamOptions {
99
119
  sourceConfig?: SourceConfig;
100
120
  fragments?: Fragment;
@@ -197,6 +217,8 @@ export type TimeLineMarker = {
197
217
  export declare enum LocalStorageValues {
198
218
  IS_MUTED = "ismuted",
199
219
  VOLUME = "volume",
200
- SUBTITLES_ENABLED = "subtitles_enabled"
220
+ SUBTITLES_ENABLED = "subtitles_enabled",
221
+ SUBTITLES_LANGUAGE = "subtitles_language"
201
222
  }
202
223
  export type LocalStorageData = Partial<Record<LocalStorageValues, string | number>>;
224
+ export type NPOGoogleCastRemoteControlConfig = GoogleCastRemoteControlConfig;
@@ -1,6 +1,6 @@
1
1
  import { Button } from 'bitmovin-player-ui';
2
2
  import type NpoPlayer from '../../npoplayer';
3
- export declare function createAdButton(npoplayer: NpoPlayer): Button<{
3
+ export declare function createAdButton(npoPlayer: NpoPlayer): Button<{
4
4
  cssClass: string;
5
5
  text: string;
6
6
  hidden: true;
@@ -1,6 +1,6 @@
1
1
  import { Label } from 'bitmovin-player-ui';
2
2
  import type NpoPlayer from '../../npoplayer';
3
- export declare function createAdLabel(npoplayer: NpoPlayer): Label<{
3
+ export declare function createAdLabel(npoPlayer: NpoPlayer): Label<{
4
4
  text: string;
5
5
  cssClass: string;
6
6
  hidden: true;