@npo/player 1.27.4 → 1.27.6

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.
@@ -8,16 +8,23 @@ export function handleStartOffset(playerContext, offset) {
8
8
  return;
9
9
  }
10
10
  const seek = () => {
11
- player.off(NpoPlayerEvent.Ready, seek);
12
- player.off(NpoPlayerEvent.SourceLoaded, seek);
13
- player.off(NpoPlayerEvent.AdBreakFinished, seek);
14
- player.off(NpoPlayerEvent.AdError, seek);
15
11
  player.seek(offset);
16
12
  };
17
- player.on(NpoPlayerEvent.Ready, seek);
18
- player.on(NpoPlayerEvent.SourceLoaded, seek);
19
- player.on(NpoPlayerEvent.AdBreakFinished, seek);
20
- player.on(NpoPlayerEvent.AdError, seek);
13
+ const handleStartOffsetCallbackOnReady = () => seek();
14
+ const handleStartOffsetCallbackOnSourceLoaded = () => seek();
15
+ const handleStartOffsetCallbackOnAdBreakFinished = () => seek();
16
+ const handleStartOffsetCallbackOnAdError = () => seek();
17
+ playerContext.player.on(NpoPlayerEvent.Ready, handleStartOffsetCallbackOnReady);
18
+ playerContext.player.on(NpoPlayerEvent.SourceLoaded, handleStartOffsetCallbackOnSourceLoaded);
19
+ playerContext.player.on(NpoPlayerEvent.AdBreakFinished, handleStartOffsetCallbackOnAdBreakFinished);
20
+ playerContext.player.on(NpoPlayerEvent.AdError, handleStartOffsetCallbackOnAdError);
21
+ playerContext.npoPlayer.eventListeners = {
22
+ ...playerContext.npoPlayer.eventListeners,
23
+ handleStartOffsetCallbackOnReady,
24
+ handleStartOffsetCallbackOnSourceLoaded,
25
+ handleStartOffsetCallbackOnAdBreakFinished,
26
+ handleStartOffsetCallbackOnAdError
27
+ };
21
28
  }
22
29
  export function shiftToProgramStart(playerContext, timestamp) {
23
30
  const { player } = playerContext;
package/lib/npoplayer.js CHANGED
@@ -159,25 +159,25 @@ export default class NpoPlayer {
159
159
  }
160
160
  this.sourceConfig = await playerAction.processSourceConfig(this.npoPlayerServices, source, options.sourceConfig ?? {}, this.streamObject, drmType && drmType.length > 0 ? profile.drm : undefined, this.streamOptions, this.version, this.npoTag?.npoTagInstance);
161
161
  await this.npoPlayerServices.verifyDRM(this.playerContext, payload);
162
- setupMediaSessionActionHandlers(this.player, this.sourceConfig, _streamObject);
163
- this.hidePlayNextScreen();
164
162
  const streamDuration = _streamObject.metadata.duration;
165
163
  this.npoPlayerServices.startPlayerTracker({
166
164
  playerContext: this.playerContext,
167
165
  source: source,
168
166
  duration: streamDuration ? Number(streamDuration) : undefined
169
167
  });
170
- if (this.variant === NpoPlayerUIVariants.DEFAULT &&
171
- this.streamObject.metadata.hasPreroll === 'true' &&
172
- this.streamObject.assets.preroll) {
173
- await this.npoPlayerServices.schedulePreRolls(this.playerContext);
174
- }
175
168
  }
176
169
  else {
177
170
  await this.npoPlayerServices.handleError(this.playerContext, 500);
178
171
  }
179
172
  this.npoPlayerServices.handleStreamOptions(this.playerContext);
180
173
  this.npoPlayerServices.setupNicamKijkwijzerIcons(this.playerContext);
174
+ setupMediaSessionActionHandlers(this.player, this.sourceConfig, this.streamObject);
175
+ this.hidePlayNextScreen();
176
+ if (this.variant === NpoPlayerUIVariants.DEFAULT &&
177
+ this.streamObject.metadata.hasPreroll === 'true' &&
178
+ this.streamObject.assets.preroll) {
179
+ await this.npoPlayerServices.schedulePreRolls(this.playerContext);
180
+ }
181
181
  if (this.variant === NpoPlayerUIVariants.VERTICAL) {
182
182
  this.npoPlayerServices.handleVerticalVideoControls(this.playerContext);
183
183
  this.npoPlayerServices.handleVerticalVideoSettings(this.playerContext);
@@ -329,6 +329,7 @@ export default class NpoPlayer {
329
329
  }
330
330
  this.pause();
331
331
  if (this.playerContext) {
332
+ this.npoPlayerServices.removeEventListeners(this.playerContext);
332
333
  this.npoPlayerServices.discardAdBreak(this.playerContext);
333
334
  }
334
335
  this.hidePlayNextScreen();
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@npo/player",
3
- "version": "1.27.4",
3
+ "version": "1.27.6",
4
4
  "description": "NPO Player",
5
5
  "author": "Publieke Omroep <player@npo.nl>",
6
6
  "contributors": [
@@ -124,7 +124,14 @@ export async function handlePreRolls(playerContext) {
124
124
  adUiSet = false;
125
125
  resolve();
126
126
  }
127
- playerContext.player.on(NpoPlayerEvent.AdBreakFinished, handleAdBreakFinished);
128
- playerContext.player.on(NpoPlayerEvent.AdError, handleAdBreakFinished);
127
+ const adBreakFinishedCallback = () => handleAdBreakFinished();
128
+ const adErrorCallback = () => handleAdBreakFinished();
129
+ playerContext.player.on(NpoPlayerEvent.AdBreakFinished, adBreakFinishedCallback);
130
+ playerContext.player.on(NpoPlayerEvent.AdError, adErrorCallback);
131
+ playerContext.npoPlayer.eventListeners = {
132
+ ...playerContext.npoPlayer.eventListeners,
133
+ adBreakFinishedCallback,
134
+ adErrorCallback
135
+ };
129
136
  });
130
137
  }
@@ -2,11 +2,17 @@ import { NpoPlayerEvent } from '../../types/events';
2
2
  export const removeEventListeners = (playerContext) => {
3
3
  const { eventListeners } = playerContext.npoPlayer;
4
4
  if (eventListeners) {
5
- const { segmentHandleTimeChangedCallback, segmentSeekFunctionCallback, liveStreamHandleTimeChangedCallback } = eventListeners;
5
+ const { segmentHandleTimeChangedCallback, segmentSeekFunctionCallback, liveStreamHandleTimeChangedCallback, adBreakFinishedCallback, adErrorCallback, handleStartOffsetCallbackOnReady, handleStartOffsetCallbackOnSourceLoaded, handleStartOffsetCallbackOnAdBreakFinished, handleStartOffsetCallbackOnAdError } = eventListeners;
6
6
  const eventMapping = [
7
7
  { event: NpoPlayerEvent.TimeChanged, callback: liveStreamHandleTimeChangedCallback },
8
8
  { event: NpoPlayerEvent.TimeChanged, callback: segmentHandleTimeChangedCallback },
9
- { event: NpoPlayerEvent.Seek, callback: segmentSeekFunctionCallback }
9
+ { event: NpoPlayerEvent.Seek, callback: segmentSeekFunctionCallback },
10
+ { event: NpoPlayerEvent.AdBreakFinished, callback: adBreakFinishedCallback },
11
+ { event: NpoPlayerEvent.AdError, callback: adErrorCallback },
12
+ { event: NpoPlayerEvent.Ready, callback: handleStartOffsetCallbackOnReady },
13
+ { event: NpoPlayerEvent.SourceLoaded, callback: handleStartOffsetCallbackOnSourceLoaded },
14
+ { event: NpoPlayerEvent.AdBreakFinished, callback: handleStartOffsetCallbackOnAdBreakFinished },
15
+ { event: NpoPlayerEvent.AdError, callback: handleStartOffsetCallbackOnAdError }
10
16
  ];
11
17
  for (const { event, callback } of eventMapping) {
12
18
  if (callback) {
@@ -7,36 +7,30 @@ describe('removeEventListeners', () => {
7
7
  jest.clearAllMocks();
8
8
  mockPlayerContext = createPlayerContextMock();
9
9
  });
10
- it('should remove TimeChanged event listener if exists', () => {
11
- mockPlayerContext.npoPlayer.eventListeners = {
10
+ it('should remove all event listeners if they exist', () => {
11
+ const eventListeners = {
12
12
  segmentHandleTimeChangedCallback: jest.fn(),
13
13
  liveStreamHandleTimeChangedCallback: jest.fn(),
14
- segmentSeekFunctionCallback: jest.fn()
15
- };
16
- removeEventListeners(mockPlayerContext);
17
- if (mockPlayerContext.npoPlayer.eventListeners) {
18
- expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.TimeChanged, mockPlayerContext.npoPlayer.eventListeners.segmentHandleTimeChangedCallback);
19
- expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.TimeChanged, mockPlayerContext.npoPlayer.eventListeners.liveStreamHandleTimeChangedCallback);
20
- }
21
- });
22
- it('should remove Seek event listener if exists', () => {
23
- mockPlayerContext.npoPlayer.eventListeners = {
24
- segmentHandleTimeChangedCallback: jest.fn(),
25
- liveStreamHandleTimeChangedCallback: jest.fn(),
26
- segmentSeekFunctionCallback: jest.fn()
27
- };
28
- removeEventListeners(mockPlayerContext);
29
- if (mockPlayerContext.npoPlayer.eventListeners) {
30
- expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.Seek, mockPlayerContext.npoPlayer.eventListeners.segmentSeekFunctionCallback);
31
- }
32
- });
33
- it('should reset EventListeners in playerContext', () => {
34
- mockPlayerContext.npoPlayer.eventListeners = {
35
- segmentHandleTimeChangedCallback: jest.fn(),
36
- liveStreamHandleTimeChangedCallback: jest.fn(),
37
- segmentSeekFunctionCallback: jest.fn()
14
+ segmentSeekFunctionCallback: jest.fn(),
15
+ adBreakFinishedCallback: jest.fn(),
16
+ adErrorCallback: jest.fn(),
17
+ handleStartOffsetCallbackOnReady: jest.fn(),
18
+ handleStartOffsetCallbackOnSourceLoaded: jest.fn(),
19
+ handleStartOffsetCallbackOnAdBreakFinished: jest.fn(),
20
+ handleStartOffsetCallbackOnAdError: jest.fn()
38
21
  };
22
+ mockPlayerContext.npoPlayer.eventListeners = { ...eventListeners };
39
23
  removeEventListeners(mockPlayerContext);
24
+ expect(mockPlayerContext.player.off).toHaveBeenCalledTimes(9);
25
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.TimeChanged, eventListeners.liveStreamHandleTimeChangedCallback);
26
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.TimeChanged, eventListeners.segmentHandleTimeChangedCallback);
27
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.Seek, eventListeners.segmentSeekFunctionCallback);
28
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.AdBreakFinished, eventListeners.adBreakFinishedCallback);
29
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.AdError, eventListeners.adErrorCallback);
30
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.Ready, eventListeners.handleStartOffsetCallbackOnReady);
31
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.SourceLoaded, eventListeners.handleStartOffsetCallbackOnSourceLoaded);
32
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.AdBreakFinished, eventListeners.handleStartOffsetCallbackOnAdBreakFinished);
33
+ expect(mockPlayerContext.player.off).toHaveBeenCalledWith(NpoPlayerEvent.AdError, eventListeners.handleStartOffsetCallbackOnAdError);
40
34
  expect(mockPlayerContext.npoPlayer.eventListeners).toBeUndefined();
41
35
  });
42
36
  });
@@ -4,6 +4,7 @@ export const handleLiveStreamControls = (playerContext) => {
4
4
  const { player, npoPlayer } = playerContext;
5
5
  player.on(NpoPlayerEvent.TimeChanged, liveStreamHandleTimeChangedCallback);
6
6
  npoPlayer.eventListeners = {
7
+ ...npoPlayer.eventListeners,
7
8
  liveStreamHandleTimeChangedCallback
8
9
  };
9
10
  };
@@ -8,6 +8,7 @@ export const addSegmentEventListeners = (playerContext, segment) => {
8
8
  player.on(NpoPlayerEvent.TimeChanged, segmentHandleTimeChangedCallback);
9
9
  player.on(NpoPlayerEvent.Seek, segmentSeekFunctionCallback);
10
10
  npoPlayer.eventListeners = {
11
+ ...npoPlayer.eventListeners,
11
12
  segmentHandleTimeChangedCallback,
12
13
  segmentSeekFunctionCallback
13
14
  };
@@ -26,4 +26,5 @@ export declare class NpoPlayerServices {
26
26
  startPlayerTracker({ playerContext, source, duration }: PlayerTrackerParams): void;
27
27
  initPlayerTracker(playerContext: PlayerContext): void;
28
28
  logEvent({ playerContext, event, data }: LogEventParams): void;
29
+ removeEventListeners(playerContext: PlayerContext): void;
29
30
  }
@@ -16,6 +16,7 @@ import { handleStreamOptions } from './streamoptionsHandlers/streamOptionsHandle
16
16
  import { handlePlayerError } from './errors/errorHandler';
17
17
  import { fetchStream } from './streamFetchHandler/fetchStream';
18
18
  import { startPlayerTracker, initPlayerTracker, logEvent } from './trackingHandlers';
19
+ import { removeEventListeners } from './eventListenerHandlers/removeEventListeners';
19
20
  export class NpoPlayerServices {
20
21
  getAVType(avType) {
21
22
  return getAVType(avType);
@@ -104,4 +105,7 @@ export class NpoPlayerServices {
104
105
  logEvent({ playerContext, event, data }) {
105
106
  logEvent({ playerContext, event, data });
106
107
  }
108
+ removeEventListeners(playerContext) {
109
+ removeEventListeners(playerContext);
110
+ }
107
111
  }
@@ -1,14 +1,12 @@
1
1
  import * as playerAction from '../../js/playeractions/playeractions';
2
2
  import { initSegment } from '../segmentHandlers/initSegment';
3
3
  import { handleLiveStreamControls } from '../liveStreamHandlers/handleLiveStreamControls';
4
- import { removeEventListeners } from '../eventListenerHandlers/removeEventListeners';
5
4
  import { NpoPlayerEvent } from '../../types/events';
6
5
  import { updateClassFromElementByQuery } from '../../js/utilities/utilities.element';
7
6
  export function handleStreamOptions(playerContext) {
8
7
  const { streamObject, uiManager } = playerContext.npoPlayer;
9
8
  if (!streamObject || !uiManager)
10
9
  return;
11
- removeEventListeners(playerContext);
12
10
  initializeFragment(playerContext);
13
11
  handleStartOffset(playerContext);
14
12
  updateStreamClasses(playerContext);
@@ -26,4 +26,5 @@ export declare class NpoPlayerServices {
26
26
  startPlayerTracker({ playerContext, source, duration }: PlayerTrackerParams): void;
27
27
  initPlayerTracker(playerContext: PlayerContext): void;
28
28
  logEvent({ playerContext, event, data }: LogEventParams): void;
29
+ removeEventListeners(playerContext: PlayerContext): void;
29
30
  }
@@ -19,6 +19,12 @@ export interface EventListeners {
19
19
  liveStreamHandleTimeChangedCallback?: NpoPlayerEventCallback;
20
20
  segmentHandleTimeChangedCallback?: NpoPlayerEventCallback;
21
21
  segmentSeekFunctionCallback?: NpoPlayerEventCallback;
22
+ adBreakFinishedCallback?: NpoPlayerEventCallback;
23
+ adErrorCallback?: NpoPlayerEventCallback;
24
+ handleStartOffsetCallbackOnReady?: NpoPlayerEventCallback;
25
+ handleStartOffsetCallbackOnSourceLoaded?: NpoPlayerEventCallback;
26
+ handleStartOffsetCallbackOnAdBreakFinished?: NpoPlayerEventCallback;
27
+ handleStartOffsetCallbackOnAdError?: NpoPlayerEventCallback;
22
28
  }
23
29
  export interface StreamObject {
24
30
  stream: StreamObject_Stream;
@@ -19,6 +19,12 @@ export interface EventListeners {
19
19
  liveStreamHandleTimeChangedCallback?: NpoPlayerEventCallback;
20
20
  segmentHandleTimeChangedCallback?: NpoPlayerEventCallback;
21
21
  segmentSeekFunctionCallback?: NpoPlayerEventCallback;
22
+ adBreakFinishedCallback?: NpoPlayerEventCallback;
23
+ adErrorCallback?: NpoPlayerEventCallback;
24
+ handleStartOffsetCallbackOnReady?: NpoPlayerEventCallback;
25
+ handleStartOffsetCallbackOnSourceLoaded?: NpoPlayerEventCallback;
26
+ handleStartOffsetCallbackOnAdBreakFinished?: NpoPlayerEventCallback;
27
+ handleStartOffsetCallbackOnAdError?: NpoPlayerEventCallback;
22
28
  }
23
29
  export interface StreamObject {
24
30
  stream: StreamObject_Stream;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@npo/player",
3
- "version": "1.27.4",
3
+ "version": "1.27.6",
4
4
  "description": "NPO Player",
5
5
  "author": "Publieke Omroep <player@npo.nl>",
6
6
  "contributors": [