@npo/player 1.24.6 → 1.25.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 (87) hide show
  1. package/README.md +1 -1
  2. package/lib/js/api/getstreamobject.test.js +2 -2
  3. package/lib/js/playeractions/handlers/processplayerconfig.js +14 -0
  4. package/lib/js/playeractions/handlers/processplayerconfig.test.d.ts +1 -0
  5. package/lib/js/playeractions/handlers/processplayerconfig.test.js +116 -0
  6. package/lib/js/playeractions/handlers/processsourceconfig.d.ts +2 -1
  7. package/lib/js/playeractions/handlers/processsourceconfig.js +16 -5
  8. package/lib/js/settings/localization.d.ts +76 -1
  9. package/lib/js/settings/localization.js +2 -2
  10. package/lib/js/tracking/handlers/eventbinding.js +25 -17
  11. package/lib/js/tracking/handlers/eventlogging.js +3 -8
  12. package/lib/js/tracking/handlers/playertrackerinit.d.ts +2 -2
  13. package/lib/js/tracking/handlers/playertrackerinit.js +8 -6
  14. package/lib/js/tracking/handlers/playertrackerinit.test.d.ts +1 -0
  15. package/lib/js/tracking/handlers/playertrackerinit.test.js +74 -0
  16. package/lib/js/utilities/utilities.element.d.ts +6 -0
  17. package/lib/js/utilities/utilities.element.js +10 -0
  18. package/lib/js/utilities/utilities.element.test.js +18 -5
  19. package/lib/npoplayer.d.ts +13 -3
  20. package/lib/npoplayer.js +43 -28
  21. package/lib/npoplayer.test.js +12 -4
  22. package/lib/package.json +2 -2
  23. package/lib/services/cdnProviders/cdnProviders.js +4 -2
  24. package/lib/services/nicamHandlers/nicamhandler.d.ts +6 -0
  25. package/lib/{ui/handlers → services/nicamHandlers}/nicamhandler.js +14 -6
  26. package/lib/services/nicamHandlers/nicamhandler.test.js +69 -0
  27. package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +1 -0
  28. package/lib/services/npoPlayerAPI/npoPlayerAPI.js +6 -3
  29. package/lib/services/segmentHandlers/setSegmentMarkers.js +1 -1
  30. package/lib/services/services.d.ts +3 -0
  31. package/lib/services/services.js +7 -0
  32. package/lib/services/streamoptionsHandlers/steamOptionsHandler.d.ts +6 -0
  33. package/lib/services/streamoptionsHandlers/steamOptionsHandler.js +78 -0
  34. package/lib/services/streamoptionsHandlers/streamOptionsHandler.test.js +187 -0
  35. package/lib/src/js/playeractions/handlers/processplayerconfig.test.d.ts +1 -0
  36. package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +2 -1
  37. package/lib/src/js/settings/localization.d.ts +76 -1
  38. package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +2 -2
  39. package/lib/src/js/tracking/handlers/playertrackerinit.test.d.ts +1 -0
  40. package/lib/src/js/utilities/utilities.element.d.ts +6 -0
  41. package/lib/src/npoplayer.d.ts +13 -3
  42. package/lib/src/services/nicamHandlers/nicamhandler.d.ts +6 -0
  43. package/lib/src/services/nicamHandlers/nicamhandler.test.d.ts +1 -0
  44. package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +1 -0
  45. package/lib/src/services/services.d.ts +3 -0
  46. package/lib/src/services/streamoptionsHandlers/steamOptionsHandler.d.ts +6 -0
  47. package/lib/src/services/streamoptionsHandlers/streamOptionsHandler.test.d.ts +1 -0
  48. package/lib/src/types/interfaces.d.ts +2 -1
  49. package/lib/src/ui/components/buttons.d.ts +6 -3
  50. package/lib/src/ui/components/controlbar.d.ts +2 -2
  51. package/lib/src/ui/components/nativemobile/buttons.d.ts +8 -0
  52. package/lib/src/ui/components/playnext.d.ts +1 -0
  53. package/lib/src/ui/components/topbar.d.ts +2 -2
  54. package/lib/src/ui/components/verticalvideo/controlbar.d.ts +2 -2
  55. package/lib/src/ui/handlers/timecontrolhandlers.d.ts +3 -3
  56. package/lib/src/ui/uicontainer.d.ts +2 -3
  57. package/lib/tests/mocks/mockNpoplayer.js +3 -0
  58. package/lib/tests/mocks/playerContextMock.js +1 -0
  59. package/lib/types/interfaces.d.ts +2 -1
  60. package/lib/ui/components/buttons.d.ts +6 -3
  61. package/lib/ui/components/buttons.js +17 -17
  62. package/lib/ui/components/controlbar.d.ts +2 -2
  63. package/lib/ui/components/controlbar.js +15 -10
  64. package/lib/ui/components/nativemobile/buttons.d.ts +8 -0
  65. package/lib/ui/components/nativemobile/buttons.js +41 -1
  66. package/lib/ui/components/nativemobile/controlbar.js +1 -2
  67. package/lib/ui/components/playnext.d.ts +1 -0
  68. package/lib/ui/components/topbar.d.ts +2 -2
  69. package/lib/ui/components/topbar.js +14 -9
  70. package/lib/ui/components/verticalvideo/controlbar.d.ts +2 -2
  71. package/lib/ui/components/verticalvideo/controlbar.js +4 -4
  72. package/lib/ui/handlers/timecontrolhandlers.d.ts +3 -3
  73. package/lib/ui/nativemobileuifactory.js +20 -24
  74. package/lib/ui/nativemobileuifactory.test.js +0 -5
  75. package/lib/ui/uicontainer.d.ts +2 -3
  76. package/lib/ui/uicontainer.js +7 -5
  77. package/package.json +2 -2
  78. package/src/style/components/_icons.scss +5 -0
  79. package/src/style/npoplayer.css +2 -1
  80. package/lib/src/ui/handlers/nicamhandler.d.ts +0 -6
  81. package/lib/src/ui/handlers/streamhandler.d.ts +0 -2
  82. package/lib/ui/handlers/nicamhandler.d.ts +0 -6
  83. package/lib/ui/handlers/nicamhandler.test.js +0 -36
  84. package/lib/ui/handlers/streamhandler.d.ts +0 -2
  85. package/lib/ui/handlers/streamhandler.js +0 -60
  86. /package/lib/{src/ui/handlers → services/nicamHandlers}/nicamhandler.test.d.ts +0 -0
  87. /package/lib/{ui/handlers/nicamhandler.test.d.ts → services/streamoptionsHandlers/streamOptionsHandler.test.d.ts} +0 -0
@@ -0,0 +1,187 @@
1
+ import { handleStreamOptions, initializeFragment, handleStartOffset, updateStreamClasses, setupAutoplay } from './steamOptionsHandler';
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.SourceLoaded, 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
+ });
@@ -1,4 +1,5 @@
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 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,5 +1,5 @@
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';
@@ -7,12 +7,15 @@ import { LogEmitter } from './types/classes';
7
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';
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;
@@ -31,7 +34,14 @@ export default class NpoPlayer {
31
34
  eventListeners: EventListeners | undefined;
32
35
  mockNpoPlayer: any;
33
36
  userPreferences: LocalStorageData;
34
- constructor(_container: HTMLElement, _playerConfig: PlayerConfig, _npotag?: InitialisationProps | undefined, _npotaginstance?: NPOTag | undefined, _variant?: NpoPlayerUIVariants);
37
+ constructor(container: HTMLElement | {
38
+ container: HTMLElement;
39
+ playerConfig: PlayerConfig;
40
+ npoTag?: InitialisationProps | undefined;
41
+ npoTagInstance?: NPOTag | undefined;
42
+ variant?: NpoPlayerUIVariants;
43
+ npoTagPageTracker?: PageTracker | undefined;
44
+ }, playerConfig?: PlayerConfig | undefined, npoTag?: InitialisationProps | undefined, npoTagInstance?: NPOTag | undefined, variant?: NpoPlayerUIVariants, npoTagPageTracker?: PageTracker | undefined);
35
45
  initPlayer(_container: HTMLElement, playerConfig: PlayerConfig): void;
36
46
  loadStream(source: string, options?: StreamOptions): Promise<void>;
37
47
  doError(input: any, status?: number): void;
@@ -0,0 +1,6 @@
1
+ import { UIManager } from 'bitmovin-player-ui';
2
+ import { PlayerContext } from '../../types/interfaces';
3
+ export declare function processNicam(playerContext: PlayerContext, nicamElement: HTMLElement | undefined): void;
4
+ export declare function addNicamIcon(character: string, nicamElement: Element): void;
5
+ export declare function showNicamAfterUiDelay(playerContext: PlayerContext, uiManager: UIManager | undefined): void;
6
+ export declare function setupNicamKijkwijzerIcons(playerContext: PlayerContext): void;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -25,6 +25,7 @@ export declare class NpoPlayerAPI {
25
25
  getSupportedTech(): Technology[];
26
26
  off(eventType: NpoPlayerEvent, callback: NpoPlayerEventCallback): void;
27
27
  on(eventType: NpoPlayerEvent, callback: NpoPlayerEventCallback): void;
28
+ isCastAvailable(): boolean;
28
29
  seek(time: number): void;
29
30
  timeShift(time: number): void;
30
31
  getContainer(): HTMLElement;
@@ -1,5 +1,6 @@
1
1
  import { ApiPayload, Fragment, PlayerContext, Profile, Segment, TimeLineMarker, LocalStorageData, LocalStorageValues, NpoPlayerUIVariants } from '../types/interfaces';
2
2
  import { AVType } from '@npotag/tag/dist/types/src/streamTracker';
3
+ import { UIManager } from 'bitmovin-player-ui';
3
4
  export declare class NpoPlayerServices {
4
5
  getAVType(avType: string): AVType;
5
6
  keyboardHandler(playerContext: PlayerContext, e: KeyboardEvent): void;
@@ -13,4 +14,6 @@ export declare class NpoPlayerServices {
13
14
  setAccessibilityAttributes(playerContext: PlayerContext): void;
14
15
  schedulePreRolls(playerContext: PlayerContext): Promise<void>;
15
16
  handleVerticalVideoControls(playerContext: PlayerContext, variant: NpoPlayerUIVariants): void;
17
+ showNicamAfterUiDelay(playerContext: PlayerContext | undefined, uiManager: UIManager | undefined): void;
18
+ setupNicamKijkwijzerIcons(playerContext: PlayerContext): void;
16
19
  }
@@ -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';
@@ -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 { GoogleCastRemoteControlConfig, SourceConfig } from 'bitmovin-player';
8
8
  export { Technology } from 'bitmovin-player';
9
9
  export interface Profile {
10
10
  profileName: string;
@@ -200,3 +200,4 @@ export declare enum LocalStorageValues {
200
200
  SUBTITLES_ENABLED = "subtitles_enabled"
201
201
  }
202
202
  export type LocalStorageData = Partial<Record<LocalStorageValues, string | number>>;
203
+ export type NPOGoogleCastRemoteControlConfig = GoogleCastRemoteControlConfig;
@@ -1,12 +1,13 @@
1
1
  import { type PlayerAPI } from 'bitmovin-player';
2
2
  import { Button, ControlBar } from 'bitmovin-player-ui';
3
3
  import type NpoPlayer from '../../npoplayer';
4
- export declare function createMiddleButtons(player: PlayerAPI): ControlBar;
5
- export declare function createRewindButton(player: PlayerAPI | undefined): Button<{
4
+ import { PlayerContext } from '../../types/interfaces';
5
+ export declare function createMiddleButtons(playerContext: PlayerContext): ControlBar;
6
+ export declare function createRewindButton(playerContext: PlayerContext): Button<{
6
7
  cssClass: string;
7
8
  ariaLabel: string;
8
9
  }>;
9
- export declare function createForwardButton(player: PlayerAPI | undefined): Button<{
10
+ export declare function createForwardButton(playerContext: PlayerContext): Button<{
10
11
  cssClass: string;
11
12
  ariaLabel: string;
12
13
  }>;
@@ -15,12 +16,14 @@ export declare function createPlayNextButton(player: PlayerAPI, npoplayer: NpoPl
15
16
  text: string;
16
17
  ariaLabel: string;
17
18
  hidden: false;
19
+ acceptsTouchWithUiHidden: true;
18
20
  }>;
19
21
  export declare function createCancelPlayNextButton(player: PlayerAPI, npoplayer: NpoPlayer): Button<{
20
22
  cssClass: string;
21
23
  text: string;
22
24
  ariaLabel: string;
23
25
  hidden: false;
26
+ acceptsTouchWithUiHidden: true;
24
27
  }>;
25
28
  export declare function createskipIntroButton(player: PlayerAPI): Button<{
26
29
  cssClass: string;
@@ -1,3 +1,3 @@
1
1
  import { ControlBar } from 'bitmovin-player-ui';
2
- import type NpoPlayer from '../../npoplayer';
3
- export declare function createControlBar(npoPlayer: NpoPlayer): ControlBar;
2
+ import { PlayerContext } from '../../types/interfaces';
3
+ export declare function createControlBar(playerContext: PlayerContext): ControlBar;
@@ -1,5 +1,13 @@
1
1
  import { AirPlayToggleButton, Button, CastToggleButton, ControlBar, FullscreenToggleButton, PictureInPictureToggleButton, PlaybackToggleButton, SettingsPanel, SettingsToggleButton, VolumeToggleButton } from 'bitmovin-player-ui';
2
2
  import { PlayerAPI } from 'bitmovin-player';
3
+ export declare function createForwardButton(player: PlayerAPI | undefined): Button<{
4
+ cssClass: string;
5
+ ariaLabel: string;
6
+ }>;
7
+ export declare function createRewindButton(player: PlayerAPI | undefined): Button<{
8
+ cssClass: string;
9
+ ariaLabel: string;
10
+ }>;
3
11
  export declare function createMiddleButtons(player: PlayerAPI): ControlBar;
4
12
  export declare function createWatchFromStartButton(): Button<{
5
13
  cssClass: string;
@@ -7,6 +7,7 @@ export declare function createPlayNextScreen(player: PlayerAPI, npoplayer: NpoPl
7
7
  text: string;
8
8
  ariaLabel: string;
9
9
  hidden: false;
10
+ acceptsTouchWithUiHidden: true;
10
11
  }>[];
11
12
  cssClasses: string[];
12
13
  }>;
@@ -1,3 +1,3 @@
1
1
  import { TitleBar } from 'bitmovin-player-ui';
2
- import NpoPlayer from 'npoplayer';
3
- export declare function createTopBar(npoplayer: NpoPlayer): TitleBar;
2
+ import { PlayerContext } from '../../types/interfaces';
3
+ export declare function createTopBar(playerContext: PlayerContext): TitleBar;
@@ -1,3 +1,3 @@
1
1
  import { ControlBar } from 'bitmovin-player-ui';
2
- import type NpoPlayer from '../../../npoplayer';
3
- export declare function createVerticalVideoControlBar(npoPlayer: NpoPlayer): ControlBar;
2
+ import { PlayerContext } from 'types/interfaces';
3
+ export declare function createVerticalVideoControlBar(playerContext: PlayerContext): ControlBar;
@@ -1,3 +1,3 @@
1
- import { type PlayerAPI } from 'bitmovin-player';
2
- export declare function rewind(player: PlayerAPI): void;
3
- export declare function forward(player: PlayerAPI): void;
1
+ import { NpoPlayerAPI } from '../../services/npoPlayerAPI/npoPlayerAPI';
2
+ export declare function rewind(player: NpoPlayerAPI): void;
3
+ export declare function forward(player: NpoPlayerAPI): void;
@@ -1,5 +1,4 @@
1
- import NpoPlayer from '../npoplayer';
2
1
  import { UIContainer } from 'bitmovin-player-ui';
3
2
  import { PlayerAPI } from 'bitmovin-player';
4
- import { NpoPlayerUIVariants } from '../types/interfaces';
5
- export declare function createUIContainer(npoPlayer: NpoPlayer, player: PlayerAPI, variant: NpoPlayerUIVariants, container: HTMLElement): UIContainer;
3
+ import { NpoPlayerUIVariants, PlayerContext } from '../types/interfaces';
4
+ export declare function createUIContainer(playerContext: PlayerContext, player: PlayerAPI, variant: NpoPlayerUIVariants): UIContainer;
@@ -30,6 +30,9 @@ export const mockNpoPlayer = {
30
30
  uiManager: undefined,
31
31
  canceledPlayNextScreen: false,
32
32
  npoTag: undefined,
33
+ npoTagInitialisation: undefined,
34
+ npoTagInstance: undefined,
35
+ npoTagPageTracker: undefined,
33
36
  logEmitter: {},
34
37
  uiComponents: {
35
38
  settingsPanels: [settingsPanelMock, settingsPanelMock]
@@ -32,6 +32,7 @@ export const createMockNpoPlayerAPI = (overrides = {}) => ({
32
32
  getSupportedTech: jest.fn().mockReturnValue([]),
33
33
  off: jest.fn(),
34
34
  on: jest.fn(),
35
+ isCastAvailable: jest.fn(),
35
36
  seek: jest.fn(),
36
37
  timeShift: jest.fn(),
37
38
  getContainer: jest.fn(),
@@ -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 { GoogleCastRemoteControlConfig, SourceConfig } from 'bitmovin-player';
8
8
  export { Technology } from 'bitmovin-player';
9
9
  export interface Profile {
10
10
  profileName: string;
@@ -200,3 +200,4 @@ export declare enum LocalStorageValues {
200
200
  SUBTITLES_ENABLED = "subtitles_enabled"
201
201
  }
202
202
  export type LocalStorageData = Partial<Record<LocalStorageValues, string | number>>;
203
+ export type NPOGoogleCastRemoteControlConfig = GoogleCastRemoteControlConfig;
@@ -1,12 +1,13 @@
1
1
  import { type PlayerAPI } from 'bitmovin-player';
2
2
  import { Button, ControlBar } from 'bitmovin-player-ui';
3
3
  import type NpoPlayer from '../../npoplayer';
4
- export declare function createMiddleButtons(player: PlayerAPI): ControlBar;
5
- export declare function createRewindButton(player: PlayerAPI | undefined): Button<{
4
+ import { PlayerContext } from '../../types/interfaces';
5
+ export declare function createMiddleButtons(playerContext: PlayerContext): ControlBar;
6
+ export declare function createRewindButton(playerContext: PlayerContext): Button<{
6
7
  cssClass: string;
7
8
  ariaLabel: string;
8
9
  }>;
9
- export declare function createForwardButton(player: PlayerAPI | undefined): Button<{
10
+ export declare function createForwardButton(playerContext: PlayerContext): Button<{
10
11
  cssClass: string;
11
12
  ariaLabel: string;
12
13
  }>;
@@ -15,12 +16,14 @@ export declare function createPlayNextButton(player: PlayerAPI, npoplayer: NpoPl
15
16
  text: string;
16
17
  ariaLabel: string;
17
18
  hidden: false;
19
+ acceptsTouchWithUiHidden: true;
18
20
  }>;
19
21
  export declare function createCancelPlayNextButton(player: PlayerAPI, npoplayer: NpoPlayer): Button<{
20
22
  cssClass: string;
21
23
  text: string;
22
24
  ariaLabel: string;
23
25
  hidden: false;
26
+ acceptsTouchWithUiHidden: true;
24
27
  }>;
25
28
  export declare function createskipIntroButton(player: PlayerAPI): Button<{
26
29
  cssClass: string;
@@ -1,38 +1,36 @@
1
1
  import { Button, PlaybackToggleButton, ControlBar } from 'bitmovin-player-ui';
2
2
  import { rewind, forward } from '../handlers/timecontrolhandlers';
3
- export function createMiddleButtons(player) {
3
+ export function createMiddleButtons(playerContext) {
4
4
  const bigPlayToggleButton = new PlaybackToggleButton({
5
5
  cssClass: 'ui-playbacktogglebutton'
6
6
  });
7
- const bigRewindButton = createRewindButton(player);
8
- const bigForwardButton = createForwardButton(player);
7
+ const bigRewindButton = createRewindButton(playerContext);
8
+ const bigForwardButton = createForwardButton(playerContext);
9
9
  return new ControlBar({
10
10
  components: [bigRewindButton, bigPlayToggleButton, bigForwardButton],
11
11
  cssClasses: ['controlbar-middle']
12
12
  });
13
13
  }
14
- export function createRewindButton(player) {
14
+ export function createRewindButton(playerContext) {
15
+ const { player } = playerContext;
15
16
  const rewindButton = new Button({
16
17
  cssClass: 'ui-rewindbutton bmpui-ui-button',
17
18
  ariaLabel: 'Spoel 10 seconden terug'
18
19
  });
19
- if (player) {
20
- rewindButton.onClick.subscribe(() => {
21
- rewind(player);
22
- });
23
- }
20
+ rewindButton.onClick.subscribe(() => {
21
+ rewind(player);
22
+ });
24
23
  return rewindButton;
25
24
  }
26
- export function createForwardButton(player) {
25
+ export function createForwardButton(playerContext) {
26
+ const { player } = playerContext;
27
27
  const forwardButton = new Button({
28
28
  cssClass: 'ui-forwardbutton bmpui-ui-button',
29
29
  ariaLabel: 'Spoel 10 seconden vooruit'
30
30
  });
31
- if (player) {
32
- forwardButton.onClick.subscribe(() => {
33
- forward(player);
34
- });
35
- }
31
+ forwardButton.onClick.subscribe(() => {
32
+ forward(player);
33
+ });
36
34
  return forwardButton;
37
35
  }
38
36
  export function createPlayNextButton(player, npoplayer) {
@@ -40,7 +38,8 @@ export function createPlayNextButton(player, npoplayer) {
40
38
  cssClass: 'ui-textbutton ui-playNextButton bmpui-ui-button',
41
39
  text: '<span class="bmpui-ui-textbutton-icon bmpui-ui-textbutton-icon-play"></span> Volgende aflevering',
42
40
  ariaLabel: 'Volgende aflevering',
43
- hidden: false
41
+ hidden: false,
42
+ acceptsTouchWithUiHidden: true
44
43
  });
45
44
  playNextButton.onClick.subscribe(() => {
46
45
  if (player != undefined) {
@@ -54,7 +53,8 @@ export function createCancelPlayNextButton(player, npoplayer) {
54
53
  cssClass: 'ui-textbutton ui-cancelPlayNextButton bmpui-ui-button',
55
54
  text: 'Annuleer',
56
55
  ariaLabel: 'Annuleer',
57
- hidden: false
56
+ hidden: false,
57
+ acceptsTouchWithUiHidden: true
58
58
  });
59
59
  cancelPlayNextButton.onClick.subscribe(() => {
60
60
  if (player != undefined) {