@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.
- package/lib/js/playeractions/handlers/handleoffsets.js +15 -8
- package/lib/npoplayer.js +8 -7
- package/lib/package.json +1 -1
- package/lib/services/advertHandlers/handlePreRolls.js +9 -2
- package/lib/services/eventListenerHandlers/removeEventListeners.js +8 -2
- package/lib/services/eventListenerHandlers/removeEventListeners.test.js +20 -26
- package/lib/services/liveStreamHandlers/handleLiveStreamControls.js +1 -0
- package/lib/services/segmentHandlers/addSegmentEventListeners.js +1 -0
- package/lib/services/services.d.ts +1 -0
- package/lib/services/services.js +4 -0
- package/lib/services/streamoptionsHandlers/streamOptionsHandler.js +0 -2
- package/lib/src/services/services.d.ts +1 -0
- package/lib/src/types/interfaces.d.ts +6 -0
- package/lib/types/interfaces.d.ts +6 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
@@ -124,7 +124,14 @@ export async function handlePreRolls(playerContext) {
|
|
|
124
124
|
adUiSet = false;
|
|
125
125
|
resolve();
|
|
126
126
|
}
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
11
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
}
|
package/lib/services/services.js
CHANGED
|
@@ -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;
|