@npo/player 1.25.0 → 1.27.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.
- package/README.md +1 -1
- package/lib/js/playeractions/handlers/handleoffsets.js +9 -7
- package/lib/js/playeractions/handlers/handleoffsets.test.js +1 -1
- package/lib/js/playeractions/handlers/mediasessionactions.js +2 -2
- package/lib/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
- package/lib/js/playeractions/handlers/processplayerconfig.js +4 -4
- package/lib/js/playeractions/handlers/processsourceconfig.d.ts +1 -0
- package/lib/js/playeractions/handlers/processsourceconfig.js +4 -5
- package/lib/js/playeractions/handlers/processsourceconfig.test.js +25 -0
- package/lib/js/playeractions/playeractions.d.ts +0 -1
- package/lib/js/playeractions/playeractions.js +0 -1
- package/lib/js/utilities/utilities.prid.d.ts +6 -0
- package/lib/js/utilities/utilities.prid.js +8 -0
- package/lib/js/utilities/utilities.prid.test.js +46 -0
- package/lib/lang/nl.json +1 -1
- package/lib/lang/subtitleLabels/nl.json +14 -0
- package/lib/npoplayer.d.ts +3 -4
- package/lib/npoplayer.js +66 -83
- package/lib/npoplayer.test.js +3 -3
- package/lib/package.json +2 -2
- package/lib/services/a11y/setup.js +2 -5
- package/lib/services/a11y/setup.test.js +2 -20
- package/lib/services/advertHandlers/discardAdBreak.js +6 -4
- package/lib/services/advertHandlers/discardAdBreak.test.js +31 -14
- package/lib/services/advertHandlers/handlePreRolls.js +19 -21
- package/lib/services/advertHandlers/handlePrerolls.test.js +66 -5
- package/lib/services/drmHandlers/decideprofile.js +8 -2
- package/lib/services/drmHandlers/decideprofile.test.js +5 -1
- package/lib/services/drmHandlers/verifydrm.js +7 -8
- package/lib/services/drmHandlers/verifydrm.test.js +32 -9
- package/lib/services/errors/errorBackground.test.js +48 -0
- package/lib/services/errors/errorHandler.d.ts +3 -0
- package/lib/services/errors/errorHandler.js +45 -0
- package/lib/services/errors/errorText.d.ts +2 -0
- package/lib/services/errors/errorText.js +59 -0
- package/lib/services/errors/errorText.test.js +66 -0
- package/lib/services/eventListenerHandlers/removeEventListeners.js +2 -2
- package/lib/services/eventListenerHandlers/removeEventListeners.test.js +9 -9
- package/lib/services/keyboardHandlers/resolvekeypress.js +21 -17
- package/lib/services/keyboardHandlers/resolvekeypress.test.js +1 -1
- package/lib/services/liveStreamHandlers/handleLiveStreamControls.js +2 -2
- package/lib/services/liveStreamHandlers/handleLiveStreamControls.test.js +2 -2
- package/lib/services/localStorageHandlers/localStorageHandlers.js +6 -3
- package/lib/services/localStorageHandlers/localStorageHandlers.test.js +2 -6
- package/lib/services/nicamHandlers/nicamhandler.d.ts +1 -2
- package/lib/services/nicamHandlers/nicamhandler.js +15 -18
- package/lib/services/nicamHandlers/nicamhandler.test.js +67 -9
- package/lib/services/npoPlayerAPI/contants.d.ts +20 -0
- package/lib/services/npoPlayerAPI/contants.js +6 -0
- package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +6 -3
- package/lib/services/npoPlayerAPI/npoPlayerAPI.js +43 -26
- package/lib/services/npoPlayerAPI/npoPlayerAPI.test.js +11 -0
- package/lib/services/preferences/handlePreferences.d.ts +2 -0
- package/lib/services/preferences/handlePreferences.js +42 -0
- package/lib/services/preferences/handlePreferences.test.js +102 -0
- package/lib/services/segmentHandlers/addSegmentEventListeners.js +2 -2
- package/lib/services/segmentHandlers/addSegmentEventListeners.test.js +1 -1
- package/lib/services/services.d.ts +14 -4
- package/lib/services/services.js +49 -4
- package/lib/services/streamFetchHandler/fetchStream.d.ts +2 -0
- package/lib/services/streamFetchHandler/fetchStream.js +48 -0
- package/lib/services/streamFetchHandler/fetchstream.test.js +70 -0
- package/lib/services/streamoptionsHandlers/{steamOptionsHandler.js → streamOptionsHandler.js} +11 -11
- package/lib/services/streamoptionsHandlers/streamOptionsHandler.test.js +20 -20
- package/lib/services/trackingHandlers/eventBinding.d.ts +2 -0
- package/lib/{js/tracking/handlers/eventbinding.js → services/trackingHandlers/eventBinding.js} +16 -14
- package/lib/services/trackingHandlers/eventBinding.test.js +89 -0
- package/lib/services/trackingHandlers/eventLogging.d.ts +2 -0
- package/lib/{js/tracking/handlers/eventlogging.js → services/trackingHandlers/eventLogging.js} +18 -7
- package/lib/services/trackingHandlers/eventLogging.test.js +63 -0
- package/lib/services/trackingHandlers/index.d.ts +3 -0
- package/lib/services/trackingHandlers/index.js +3 -0
- package/lib/services/trackingHandlers/playerTrackerInit.d.ts +2 -0
- package/lib/{js/tracking/handlers/playertrackerinit.js → services/trackingHandlers/playerTrackerInit.js} +6 -3
- package/lib/services/trackingHandlers/playerTrackerInit.test.js +75 -0
- package/lib/services/trackingHandlers/playerTrackerStart.d.ts +2 -0
- package/lib/services/trackingHandlers/playerTrackerStart.js +25 -0
- package/lib/services/trackingHandlers/playerTrackerStart.test.js +59 -0
- package/lib/services/trackingHandlers/streamTrackerInit.d.ts +3 -0
- package/lib/services/trackingHandlers/streamTrackerInit.js +27 -0
- package/lib/services/trackingHandlers/streamTrackerInit.test.js +84 -0
- package/lib/services/uiHandlers/uiVisiblityHandler.d.ts +3 -0
- package/lib/services/uiHandlers/uiVisiblityHandler.js +26 -0
- package/lib/services/uiHandlers/uiVisiblityHandler.test.js +62 -0
- package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.d.ts +2 -2
- package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.js +4 -6
- package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.test.js +4 -17
- package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.d.ts +2 -0
- package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.js +26 -0
- package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.test.d.ts +1 -0
- package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.test.js +82 -0
- package/lib/src/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
- package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +1 -0
- package/lib/src/js/playeractions/handlers/processsourceconfig.test.d.ts +1 -0
- package/lib/src/js/playeractions/playeractions.d.ts +0 -1
- package/lib/src/js/utilities/utilities.prid.d.ts +6 -0
- package/lib/src/js/utilities/utilities.prid.test.d.ts +1 -0
- package/lib/src/npoplayer.d.ts +3 -4
- package/lib/src/services/errors/errorBackground.test.d.ts +1 -0
- package/lib/src/services/errors/errorHandler.d.ts +3 -0
- package/lib/src/services/errors/errorText.d.ts +2 -0
- package/lib/src/services/errors/errorText.test.d.ts +1 -0
- package/lib/src/services/nicamHandlers/nicamhandler.d.ts +1 -2
- package/lib/src/services/npoPlayerAPI/contants.d.ts +20 -0
- package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +6 -3
- package/lib/src/services/preferences/handlePreferences.d.ts +2 -0
- package/lib/src/services/preferences/handlePreferences.test.d.ts +1 -0
- package/lib/src/services/services.d.ts +14 -4
- package/lib/src/services/streamFetchHandler/fetchStream.d.ts +2 -0
- package/lib/src/services/streamFetchHandler/fetchstream.test.d.ts +1 -0
- package/lib/src/services/trackingHandlers/eventBinding.d.ts +2 -0
- package/lib/src/services/trackingHandlers/eventBinding.test.d.ts +1 -0
- package/lib/src/services/trackingHandlers/eventLogging.d.ts +2 -0
- package/lib/src/services/trackingHandlers/eventLogging.test.d.ts +1 -0
- package/lib/src/services/trackingHandlers/index.d.ts +3 -0
- package/lib/src/services/trackingHandlers/playerTrackerInit.d.ts +2 -0
- package/lib/src/services/trackingHandlers/playerTrackerInit.test.d.ts +1 -0
- package/lib/src/services/trackingHandlers/playerTrackerStart.d.ts +2 -0
- package/lib/src/services/trackingHandlers/playerTrackerStart.test.d.ts +1 -0
- package/lib/src/services/trackingHandlers/streamTrackerInit.d.ts +3 -0
- package/lib/src/services/trackingHandlers/streamTrackerInit.test.d.ts +1 -0
- package/lib/src/services/uiHandlers/uiVisiblityHandler.d.ts +3 -0
- package/lib/src/services/uiHandlers/uiVisiblityHandler.test.d.ts +1 -0
- package/lib/src/services/verticalVideoHandlers/handleVerticalVideoControls.d.ts +2 -2
- package/lib/src/services/verticalVideoHandlers/handleVerticalVideoSettings.d.ts +2 -0
- package/lib/src/services/verticalVideoHandlers/handleVerticalVideoSettings.test.d.ts +1 -0
- package/lib/src/types/classes.d.ts +6 -0
- package/lib/src/types/interfaces.d.ts +39 -4
- package/lib/src/ui/components/adbutton.d.ts +1 -1
- package/lib/src/ui/components/adlabel.d.ts +1 -1
- package/lib/src/ui/components/buttons.d.ts +6 -16
- package/lib/src/ui/components/controlbar.d.ts +2 -2
- package/lib/src/ui/components/ctabar.d.ts +1 -1
- package/lib/src/ui/components/playnext.d.ts +1 -4
- package/lib/src/ui/components/seekbar.d.ts +2 -1
- package/lib/src/ui/components/titlebar.d.ts +1 -1
- package/lib/src/ui/components/verticalvideo/controlbar.d.ts +3 -3
- package/lib/src/ui/components/verticalvideo/settingspanel.d.ts +2 -0
- package/lib/src/ui/handlers/playnextscreen.test.d.ts +1 -0
- package/lib/src/ui/uicontainer.test.d.ts +1 -0
- package/lib/tests/mocks/mockLogEmitter.d.ts +2 -0
- package/lib/tests/mocks/mockLogEmitter.js +20 -0
- package/lib/tests/mocks/mockNpoplayer.js +2 -3
- package/lib/tests/mocks/mockStreamObject.d.ts +2 -0
- package/lib/tests/mocks/mockStreamObject.js +21 -0
- package/lib/tests/mocks/playerContextMock.d.ts +6 -3
- package/lib/tests/mocks/playerContextMock.js +12 -6
- package/lib/types/classes.d.ts +6 -0
- package/lib/types/classes.js +12 -0
- package/lib/types/interfaces.d.ts +39 -4
- package/lib/types/interfaces.js +1 -0
- package/lib/ui/components/adbutton.d.ts +1 -1
- package/lib/ui/components/adbutton.js +3 -3
- package/lib/ui/components/adlabel.d.ts +1 -1
- package/lib/ui/components/adlabel.js +3 -3
- package/lib/ui/components/audio/controlbar.js +2 -1
- package/lib/ui/components/buttons.d.ts +6 -16
- package/lib/ui/components/buttons.js +27 -10
- package/lib/ui/components/controlbar.d.ts +2 -2
- package/lib/ui/components/controlbar.js +21 -38
- package/lib/ui/components/ctabar.d.ts +1 -1
- package/lib/ui/components/ctabar.js +4 -4
- package/lib/ui/components/nativemobile/topbar.js +2 -2
- package/lib/ui/components/playnext.d.ts +1 -4
- package/lib/ui/components/playnext.js +3 -3
- package/lib/ui/components/seekbar.d.ts +2 -1
- package/lib/ui/components/seekbar.js +5 -3
- package/lib/ui/components/settingspanel.js +7 -9
- package/lib/ui/components/titlebar.d.ts +1 -1
- package/lib/ui/components/titlebar.js +2 -2
- package/lib/ui/components/topbar.js +6 -20
- package/lib/ui/components/verticalvideo/controlbar.d.ts +3 -3
- package/lib/ui/components/verticalvideo/controlbar.js +15 -12
- package/lib/ui/components/verticalvideo/settingspanel.d.ts +2 -0
- package/lib/ui/components/verticalvideo/settingspanel.js +21 -0
- package/lib/ui/handlers/domhandlers.test.js +6 -26
- package/lib/ui/handlers/playnextscreen.test.d.ts +1 -0
- package/lib/ui/nativemobileuifactory.js +2 -2
- package/lib/ui/nativemobileuifactory.test.js +2 -1
- package/lib/ui/uicontainer.js +14 -30
- package/lib/ui/uicontainer.test.d.ts +1 -0
- package/lib/ui/uicontainer.test.js +83 -0
- package/package.json +2 -2
- package/src/style/components/_advert.scss +3 -12
- package/src/style/components/_buffering.scss +14 -8
- package/src/style/components/_error.scss +44 -1
- package/src/style/components/_hugeplaybacktogglebutton.scss +1 -0
- package/src/style/components/_metadata.scss +13 -12
- package/src/style/components/_nicam.scss +16 -10
- package/src/style/components/_playnext.scss +1 -1
- package/src/style/components/_replay.scss +1 -6
- package/src/style/components/_settingspanel.scss +121 -95
- package/src/style/components/audio/_errors.scss +1 -1
- package/src/style/components/audio/_metadata.scss +14 -8
- package/src/style/components/audio/_playbutton.scss +1 -0
- package/src/style/components/audio/_topbar.scss +10 -2
- package/src/style/components/audio/_volumeslider.scss +3 -3
- package/src/style/components/vertical-video/_bottombar.scss +42 -1
- package/src/style/components/vertical-video/_hugeplaybacktogglebutton.scss +24 -4
- package/src/style/components/vertical-video/_settingspanel.scss +21 -4
- package/src/style/components/vertical-video/_topbar.scss +47 -6
- package/src/style/npoplayer.css +108 -70
- package/src/style/npoplayer.scss +4 -7
- package/src/style/variants/_player-base.scss +14 -2
- package/src/style/variants/_player-large.scss +5 -1
- package/src/style/variants/_player-small.scss +26 -9
- package/src/style/vars/_fonts.scss +13 -7
- package/src/style/vars/_z-index.scss +1 -0
- package/lib/js/api/getstreamobject.d.ts +0 -3
- package/lib/js/api/getstreamobject.js +0 -38
- package/lib/js/api/getstreamobject.test.js +0 -48
- package/lib/js/playeractions/customerrors.test.js +0 -51
- package/lib/js/playeractions/handlers/customerrors.d.ts +0 -50
- package/lib/js/playeractions/handlers/customerrors.js +0 -56
- package/lib/js/playeractions/handlers/error.d.ts +0 -3
- package/lib/js/playeractions/handlers/error.js +0 -14
- package/lib/js/playeractions/handlers/error.test.js +0 -44
- package/lib/js/tracking/handlers/eventbinding.d.ts +0 -3
- package/lib/js/tracking/handlers/eventlogging.d.ts +0 -2
- package/lib/js/tracking/handlers/eventlogging.test.js +0 -46
- package/lib/js/tracking/handlers/playertrackerinit.d.ts +0 -4
- package/lib/js/tracking/handlers/playertrackerinit.test.js +0 -74
- package/lib/js/tracking/handlers/playertrackerstart.d.ts +0 -1
- package/lib/js/tracking/handlers/playertrackerstart.js +0 -25
- package/lib/js/tracking/playertracker.d.ts +0 -4
- package/lib/js/tracking/playertracker.js +0 -4
- package/lib/src/js/api/getstreamobject.d.ts +0 -3
- package/lib/src/js/playeractions/handlers/customerrors.d.ts +0 -50
- package/lib/src/js/playeractions/handlers/error.d.ts +0 -3
- package/lib/src/js/tracking/handlers/eventbinding.d.ts +0 -3
- package/lib/src/js/tracking/handlers/eventlogging.d.ts +0 -2
- package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +0 -4
- package/lib/src/js/tracking/handlers/playertrackerstart.d.ts +0 -1
- package/lib/src/js/tracking/playertracker.d.ts +0 -4
- /package/lib/js/{api/getstreamobject.test.d.ts → playeractions/handlers/processsourceconfig.test.d.ts} +0 -0
- /package/lib/js/{playeractions/customerrors.test.d.ts → utilities/utilities.prid.test.d.ts} +0 -0
- /package/lib/{js/playeractions/handlers/error.test.d.ts → services/errors/errorBackground.test.d.ts} +0 -0
- /package/lib/{js/tracking/handlers/eventlogging.test.d.ts → services/errors/errorText.test.d.ts} +0 -0
- /package/lib/{js/tracking/handlers/playertrackerinit.test.d.ts → services/preferences/handlePreferences.test.d.ts} +0 -0
- /package/lib/{src/js/api/getstreamobject.test.d.ts → services/streamFetchHandler/fetchstream.test.d.ts} +0 -0
- /package/lib/services/streamoptionsHandlers/{steamOptionsHandler.d.ts → streamOptionsHandler.d.ts} +0 -0
- /package/lib/{src/js/playeractions/customerrors.test.d.ts → services/trackingHandlers/eventBinding.test.d.ts} +0 -0
- /package/lib/{src/js/playeractions/handlers/error.test.d.ts → services/trackingHandlers/eventLogging.test.d.ts} +0 -0
- /package/lib/{src/js/tracking/handlers/eventlogging.test.d.ts → services/trackingHandlers/playerTrackerInit.test.d.ts} +0 -0
- /package/lib/{src/js/tracking/handlers/playertrackerinit.test.d.ts → services/trackingHandlers/playerTrackerStart.test.d.ts} +0 -0
- /package/lib/{src/ui/handlers/playnextstreen.test.d.ts → services/trackingHandlers/streamTrackerInit.test.d.ts} +0 -0
- /package/lib/{ui/handlers/playnextstreen.test.d.ts → services/uiHandlers/uiVisiblityHandler.test.d.ts} +0 -0
- /package/lib/src/services/streamoptionsHandlers/{steamOptionsHandler.d.ts → streamOptionsHandler.d.ts} +0 -0
- /package/lib/ui/handlers/{playnextstreen.test.js → playnextscreen.test.js} +0 -0
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ Extensive and up-to-date documentation is available at https://docs.npoplayer.nl
|
|
|
11
11
|
Code quality is analysed by SonarCloud. The project can be found at https://sonarcloud.io/project/overview?id=NPOstart_npo-player
|
|
12
12
|
|
|
13
13
|
# Changelog
|
|
14
|
-
Current version: v1.
|
|
14
|
+
Current version: v1.27.0
|
|
15
15
|
|
|
16
16
|
The changelog is available at https://docs.npoplayer.nl/implementation/web/changelog/
|
|
17
17
|
|
|
@@ -8,11 +8,13 @@ export function handleStartOffset(playerContext, offset) {
|
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
10
|
const seek = () => {
|
|
11
|
+
player.off(NpoPlayerEvent.Ready, seek);
|
|
11
12
|
player.off(NpoPlayerEvent.SourceLoaded, seek);
|
|
12
13
|
player.off(NpoPlayerEvent.AdBreakFinished, seek);
|
|
13
14
|
player.off(NpoPlayerEvent.AdError, seek);
|
|
14
15
|
player.seek(offset);
|
|
15
16
|
};
|
|
17
|
+
player.on(NpoPlayerEvent.Ready, seek);
|
|
16
18
|
player.on(NpoPlayerEvent.SourceLoaded, seek);
|
|
17
19
|
player.on(NpoPlayerEvent.AdBreakFinished, seek);
|
|
18
20
|
player.on(NpoPlayerEvent.AdError, seek);
|
|
@@ -28,22 +30,22 @@ export function shiftToProgramStart(playerContext, timestamp) {
|
|
|
28
30
|
player.timeShift(timestamp);
|
|
29
31
|
}
|
|
30
32
|
export function handleLiveOffsetLogic(playerContext, options) {
|
|
31
|
-
const { player,
|
|
32
|
-
if (
|
|
33
|
+
const { player, npoPlayer } = playerContext;
|
|
34
|
+
if (npoPlayer.uiComponents.watchFromStartButton == undefined)
|
|
33
35
|
return;
|
|
34
36
|
if (options?.liveProgramTime == undefined) {
|
|
35
|
-
|
|
37
|
+
npoPlayer.uiComponents.watchFromStartButton.hide();
|
|
36
38
|
return;
|
|
37
39
|
}
|
|
38
|
-
|
|
40
|
+
npoPlayer.streamOptions.liveProgramTime = options.liveProgramTime;
|
|
39
41
|
if (player.isLive() && options.liveProgramTime > 0) {
|
|
40
|
-
|
|
42
|
+
npoPlayer.uiComponents.watchFromStartButton.show();
|
|
41
43
|
}
|
|
42
44
|
else {
|
|
43
|
-
|
|
45
|
+
npoPlayer.uiComponents.watchFromStartButton.hide();
|
|
44
46
|
}
|
|
45
47
|
if (options.liveOffset !== null && options.liveOffset !== false && options.liveProgramTime > 0) {
|
|
46
|
-
|
|
48
|
+
npoPlayer.uiComponents.watchFromStartButton.hide();
|
|
47
49
|
shiftToProgramStart(playerContext, options.liveProgramTime);
|
|
48
50
|
}
|
|
49
51
|
}
|
|
@@ -91,7 +91,7 @@ export function setupMediaSessionActionHandlers(player, sourceConfig, _streamObj
|
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
93
|
action: 'play',
|
|
94
|
-
handler: () => player.play()
|
|
94
|
+
handler: () => void player.play()
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
action: 'pause',
|
|
@@ -99,7 +99,7 @@ export function setupMediaSessionActionHandlers(player, sourceConfig, _streamObj
|
|
|
99
99
|
},
|
|
100
100
|
{
|
|
101
101
|
action: 'stop',
|
|
102
|
-
handler: () => player.unload()
|
|
102
|
+
handler: () => void player.unload()
|
|
103
103
|
}
|
|
104
104
|
];
|
|
105
105
|
for (const { action, handler } of actionHandlers) {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type PlayerConfig } from 'bitmovin-player';
|
|
2
2
|
import NpoPlayer from 'npoplayer';
|
|
3
|
-
export declare function processPlayerConfig(
|
|
3
|
+
export declare function processPlayerConfig(npoPlayer: NpoPlayer, playerConfig: PlayerConfig): PlayerConfig;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LogLevel } from 'bitmovin-player';
|
|
2
2
|
import { isSafari } from '../../utilities/utilities.user-agent';
|
|
3
|
-
export function processPlayerConfig(
|
|
3
|
+
export function processPlayerConfig(npoPlayer, playerConfig) {
|
|
4
4
|
const processedConfig = playerConfig;
|
|
5
5
|
if (isSafari()) {
|
|
6
6
|
processedConfig.playback = {
|
|
@@ -17,9 +17,9 @@ export function processPlayerConfig(npoplayer, playerConfig) {
|
|
|
17
17
|
receiverVersion: 'v3',
|
|
18
18
|
messageNamespace: 'urn:x-cast:com.bitmovin.player.caf',
|
|
19
19
|
customReceiverConfig: {
|
|
20
|
-
drm:
|
|
21
|
-
profileName:
|
|
22
|
-
jwt:
|
|
20
|
+
drm: npoPlayer.drmProfile.drm,
|
|
21
|
+
profileName: npoPlayer.drmProfile.profileName,
|
|
22
|
+
jwt: npoPlayer.jwt
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
const userRemoteControlConfig = processedConfig.remotecontrol || defaultRemoteControlConfig;
|
|
@@ -2,4 +2,5 @@ import { StreamObject, StreamOptions } from 'types/interfaces';
|
|
|
2
2
|
import { SourceConfig } from 'bitmovin-player';
|
|
3
3
|
import { NpoPlayerServices } from '../../../services/services';
|
|
4
4
|
import { NPOTag } from '@npotag/tag';
|
|
5
|
+
export declare const getSubtitleLabels: (data: any) => string;
|
|
5
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,7 @@
|
|
|
1
1
|
import { HttpResponseType } from 'bitmovin-player';
|
|
2
2
|
import { npoCdnProviders } from '../../../services/cdnProviders/cdnProviders';
|
|
3
3
|
import { replaceSpecialCharacters } from '../../utilities/utilities.text';
|
|
4
|
+
import subtitleLabelMap from '../../../lang/subtitleLabels/nl.json';
|
|
4
5
|
async function setDrm(sourceConfig, drm, _streamObject, useWidevineServerCertificate) {
|
|
5
6
|
const npoDrmGateway = 'https://npo-drm-gateway.samgcloud.nepworldwide.nl/authentication?custom_data=';
|
|
6
7
|
switch (drm) {
|
|
@@ -66,11 +67,9 @@ async function getServerCertificate(url) {
|
|
|
66
67
|
const response = await fetch(url);
|
|
67
68
|
return response.arrayBuffer();
|
|
68
69
|
}
|
|
69
|
-
const getSubtitleLabels = function (data) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
return data.label;
|
|
70
|
+
export const getSubtitleLabels = function (data) {
|
|
71
|
+
const langKey = data.lang.toLowerCase();
|
|
72
|
+
return subtitleLabelMap[langKey] || data.label || langKey;
|
|
74
73
|
};
|
|
75
74
|
const getQualityLabels = function (data) {
|
|
76
75
|
return data.height + 'p';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getSubtitleLabels } from './processsourceconfig';
|
|
2
|
+
describe('getSubtitleLabels', () => {
|
|
3
|
+
it('should return the correct language label for known lang codes', () => {
|
|
4
|
+
expect(getSubtitleLabels({ lang: 'ar' })).toBe('Arabisch');
|
|
5
|
+
expect(getSubtitleLabels({ lang: 'bg' })).toBe('Bulgaars');
|
|
6
|
+
expect(getSubtitleLabels({ lang: 'de' })).toBe('Duits');
|
|
7
|
+
expect(getSubtitleLabels({ lang: 'en' })).toBe('Engels');
|
|
8
|
+
expect(getSubtitleLabels({ lang: 'es' })).toBe('Spaans');
|
|
9
|
+
expect(getSubtitleLabels({ lang: 'fr' })).toBe('Frans');
|
|
10
|
+
expect(getSubtitleLabels({ lang: 'it' })).toBe('Italiaans');
|
|
11
|
+
expect(getSubtitleLabels({ lang: 'nl' })).toBe('Nederlands');
|
|
12
|
+
expect(getSubtitleLabels({ lang: 'ma' })).toBe('Marokkaans');
|
|
13
|
+
expect(getSubtitleLabels({ lang: 'pl' })).toBe('Pools');
|
|
14
|
+
expect(getSubtitleLabels({ lang: 'ua' })).toBe('Oekraïens');
|
|
15
|
+
expect(getSubtitleLabels({ lang: 'tr' })).toBe('Turks');
|
|
16
|
+
});
|
|
17
|
+
it('should return the original label if the lang code is unknown', () => {
|
|
18
|
+
expect(getSubtitleLabels({ lang: 'jp', label: 'Japanese' })).toBe('Japanese');
|
|
19
|
+
expect(getSubtitleLabels({ lang: 'jp' })).toBe('jp');
|
|
20
|
+
});
|
|
21
|
+
it('should handle mixed case lang codes', () => {
|
|
22
|
+
expect(getSubtitleLabels({ lang: 'EN' })).toBe('Engels');
|
|
23
|
+
expect(getSubtitleLabels({ lang: 'Fr' })).toBe('Frans');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { handleStartOffset, handleLiveOffsetLogic, shiftToProgramStart } from './handlers/handleoffsets';
|
|
2
|
-
export { handlePlayerError } from './handlers/error';
|
|
3
2
|
export { processPlayerConfig } from './handlers/processplayerconfig';
|
|
4
3
|
export { processSourceConfig } from './handlers/processsourceconfig';
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { handleStartOffset, handleLiveOffsetLogic, shiftToProgramStart } from './handlers/handleoffsets';
|
|
2
|
-
export { handlePlayerError } from './handlers/error';
|
|
3
2
|
export { processPlayerConfig } from './handlers/processplayerconfig';
|
|
4
3
|
export { processSourceConfig } from './handlers/processsourceconfig';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { isJWTToken } from './utilities.jwt';
|
|
2
|
+
export function getAnalyticsPrid(params) {
|
|
3
|
+
const { source, sourceConfig, streamObject } = params;
|
|
4
|
+
if (isJWTToken(source)) {
|
|
5
|
+
return streamObject?.metadata?.prid ?? '';
|
|
6
|
+
}
|
|
7
|
+
return sourceConfig?.metadata?.prid ?? source;
|
|
8
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { mockStreamObject } from '../../../tests/mocks/mockStreamObject';
|
|
2
|
+
import { getAnalyticsPrid } from './utilities.prid';
|
|
3
|
+
describe('getAnalyticsPrid', () => {
|
|
4
|
+
it('should return the prid from streamObject if the source is a JWT token', () => {
|
|
5
|
+
const result = getAnalyticsPrid({
|
|
6
|
+
source: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
|
|
7
|
+
sourceConfig: undefined,
|
|
8
|
+
streamObject: {
|
|
9
|
+
...mockStreamObject,
|
|
10
|
+
metadata: {
|
|
11
|
+
...mockStreamObject.metadata,
|
|
12
|
+
prid: '123'
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
expect(result).toBe('123');
|
|
17
|
+
});
|
|
18
|
+
it('should return an empty string if the source is a JWT token but no prid is present in streamObject', () => {
|
|
19
|
+
const result = getAnalyticsPrid({
|
|
20
|
+
source: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
|
|
21
|
+
sourceConfig: undefined,
|
|
22
|
+
streamObject: {
|
|
23
|
+
...mockStreamObject
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
expect(result).toBe('');
|
|
27
|
+
});
|
|
28
|
+
it('should return the prid from sourceConfig if the source is a media file URL', () => {
|
|
29
|
+
const result = getAnalyticsPrid({
|
|
30
|
+
source: 'https://example.com/media/video.mp4',
|
|
31
|
+
sourceConfig: { metadata: { prid: '456' } },
|
|
32
|
+
streamObject: undefined
|
|
33
|
+
});
|
|
34
|
+
expect(result).toBe('456');
|
|
35
|
+
});
|
|
36
|
+
it('should return the source (media file URL) if no prid is found', () => {
|
|
37
|
+
const result = getAnalyticsPrid({
|
|
38
|
+
source: 'https://example.com/media/audio.mp3',
|
|
39
|
+
sourceConfig: undefined,
|
|
40
|
+
streamObject: {
|
|
41
|
+
...mockStreamObject
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
expect(result).toBe('https://example.com/media/audio.mp3');
|
|
45
|
+
});
|
|
46
|
+
});
|
package/lib/lang/nl.json
CHANGED
package/lib/npoplayer.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ 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
|
|
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
10
|
playerConfig: PlayerConfig | undefined;
|
|
@@ -30,10 +30,9 @@ export default class NpoPlayer {
|
|
|
30
30
|
isShowingPlayNextScreen: boolean;
|
|
31
31
|
canceledPlayNextScreen: boolean;
|
|
32
32
|
playerContext: PlayerContext | undefined;
|
|
33
|
-
|
|
33
|
+
npoPlayerServices: NpoPlayerServices;
|
|
34
34
|
eventListeners: EventListeners | undefined;
|
|
35
35
|
mockNpoPlayer: any;
|
|
36
|
-
userPreferences: LocalStorageData;
|
|
37
36
|
constructor(container: HTMLElement | {
|
|
38
37
|
container: HTMLElement;
|
|
39
38
|
playerConfig: PlayerConfig;
|
|
@@ -42,9 +41,9 @@ export default class NpoPlayer {
|
|
|
42
41
|
variant?: NpoPlayerUIVariants;
|
|
43
42
|
npoTagPageTracker?: PageTracker | undefined;
|
|
44
43
|
}, playerConfig?: PlayerConfig | undefined, npoTag?: InitialisationProps | undefined, npoTagInstance?: NPOTag | undefined, variant?: NpoPlayerUIVariants, npoTagPageTracker?: PageTracker | undefined);
|
|
44
|
+
keydownHandler: (e: KeyboardEvent) => void;
|
|
45
45
|
initPlayer(_container: HTMLElement, playerConfig: PlayerConfig): void;
|
|
46
46
|
loadStream(source: string, options?: StreamOptions): Promise<void>;
|
|
47
|
-
doError(input: any, status?: number): void;
|
|
48
47
|
play(): Promise<void>;
|
|
49
48
|
pause(): void;
|
|
50
49
|
setVolume(volume: number): void;
|
package/lib/npoplayer.js
CHANGED
|
@@ -1,33 +1,26 @@
|
|
|
1
1
|
import { NpoPlayerServices } from './services/services';
|
|
2
2
|
import { Player, PlayerEvent } from 'bitmovin-player';
|
|
3
3
|
import AdsModuleBM from 'bitmovin-player/modules/bitmovinplayer-advertising-bitmovin';
|
|
4
|
-
import { logEvent, initPlayerTracker, startPlayerTracker } from './js/tracking/playertracker';
|
|
5
4
|
import { hidePlayNextScreen, showPlayNextScreenIfNeeded } from './ui/handlers/playnextscreen';
|
|
6
5
|
import * as playerAction from './js/playeractions/playeractions';
|
|
7
6
|
import { getModuleExport } from './js/utilities/utilities.module';
|
|
8
|
-
import { getStreamObject } from './js/api/getstreamobject';
|
|
9
7
|
import { isJWTToken } from './js/utilities/utilities.jwt';
|
|
10
8
|
import { isMediaUrl, isUrl } from './js/utilities/utilities.url';
|
|
11
9
|
import { logVersion } from './js/utilities/utilities.version';
|
|
12
|
-
import { getStreamDurationInSeconds } from './js/utilities/utilities.stream';
|
|
13
10
|
import { LogEmitter } from './types/classes';
|
|
14
11
|
import pkg from '../package.json';
|
|
15
|
-
import { NpoPlayerUIVariants
|
|
12
|
+
import { NpoPlayerUIVariants } from './types/interfaces';
|
|
16
13
|
import { nativeMobileUiFactory } from './ui/nativemobileuifactory';
|
|
17
14
|
import { setupMediaSessionActionHandlers } from './js/playeractions/handlers/mediasessionactions';
|
|
18
15
|
import { removeReplayClass } from './js/playeractions/handlers/removereplayclass';
|
|
19
16
|
import { updateLiveMarkers } from './js/markers/updateLiveMarkers';
|
|
20
17
|
import { NpoPlayerAPI } from './services/npoPlayerAPI/npoPlayerAPI';
|
|
18
|
+
import { emptyStreamObject } from './services/npoPlayerAPI/contants';
|
|
21
19
|
export { NpoPlayerUIVariants };
|
|
22
20
|
export default class NpoPlayer {
|
|
23
21
|
constructor(container, playerConfig, npoTag, npoTagInstance, variant, npoTagPageTracker) {
|
|
24
22
|
this.sourceConfig = {};
|
|
25
|
-
this.streamObject =
|
|
26
|
-
stream: { drmType: '', streamProfile: '', streamURL: '', avType: '', sourceProfile: '' },
|
|
27
|
-
metadata: { title: '', description: '' },
|
|
28
|
-
assets: { scrubbingThumbnail: '', subtitles: [] },
|
|
29
|
-
user: { type: 'anonymous' }
|
|
30
|
-
};
|
|
23
|
+
this.streamObject = emptyStreamObject;
|
|
31
24
|
this.player = undefined;
|
|
32
25
|
this.uiManager = undefined;
|
|
33
26
|
this.npoTagInitialisation = undefined;
|
|
@@ -45,9 +38,13 @@ export default class NpoPlayer {
|
|
|
45
38
|
this.isShowingPlayNextScreen = false;
|
|
46
39
|
this.canceledPlayNextScreen = false;
|
|
47
40
|
this.playerContext = undefined;
|
|
48
|
-
this.
|
|
41
|
+
this.npoPlayerServices = new NpoPlayerServices();
|
|
49
42
|
this.eventListeners = undefined;
|
|
50
|
-
this.
|
|
43
|
+
this.keydownHandler = (e) => {
|
|
44
|
+
if (!this.playerContext)
|
|
45
|
+
return;
|
|
46
|
+
this.npoPlayerServices.keyboardHandler(this.playerContext, e);
|
|
47
|
+
};
|
|
51
48
|
if (typeof container === 'object' && !(container instanceof HTMLElement)) {
|
|
52
49
|
const params = container;
|
|
53
50
|
this.container = params.container;
|
|
@@ -70,9 +67,6 @@ export default class NpoPlayer {
|
|
|
70
67
|
console.error('Player configuration is missing. Ensure that playerConfig is properly initialized before using the player.');
|
|
71
68
|
return;
|
|
72
69
|
}
|
|
73
|
-
if (this.npoTagInstance) {
|
|
74
|
-
initPlayerTracker(this, this.npoTagInitialisation, this.npoTagInstance, this.npoTagPageTracker);
|
|
75
|
-
}
|
|
76
70
|
this.initPlayer(this.container, this.playerConfig);
|
|
77
71
|
}
|
|
78
72
|
initPlayer(_container, playerConfig) {
|
|
@@ -80,47 +74,31 @@ export default class NpoPlayer {
|
|
|
80
74
|
this.player = new Player(_container, processedPlayerConfig);
|
|
81
75
|
Player.addModule(getModuleExport(AdsModuleBM));
|
|
82
76
|
const npoPlayerAPI = new NpoPlayerAPI(this.player);
|
|
83
|
-
this.playerContext = { player: npoPlayerAPI,
|
|
84
|
-
this.
|
|
85
|
-
this.
|
|
86
|
-
this.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.npoplayerServices.setStoredUserPrefs(LocalStorageValues.SUBTITLES_ENABLED, npoPlayerAPI.areSubtitlesEnabled().toString());
|
|
90
|
-
this.npoplayerServices.setStoredUserPrefs(LocalStorageValues.VOLUME, npoPlayerAPI.getVolume());
|
|
91
|
-
this.npoplayerServices.setStoredUserPrefs(LocalStorageValues.IS_MUTED, npoPlayerAPI.isMuted().toString());
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
this.container.addEventListener('keydown', (e) => {
|
|
95
|
-
if (!this.playerContext)
|
|
96
|
-
return;
|
|
97
|
-
this.npoplayerServices.keyboardHandler(this.playerContext, e);
|
|
98
|
-
}, true);
|
|
77
|
+
this.playerContext = { player: npoPlayerAPI, npoPlayer: this };
|
|
78
|
+
this.npoPlayerServices.initPlayerTracker(this.playerContext);
|
|
79
|
+
this.npoPlayerServices.handleUserPrefs(this.playerContext);
|
|
80
|
+
this.npoPlayerServices.setAccessibilityAttributes(this.playerContext);
|
|
81
|
+
this.npoPlayerServices.handlePreferences(this.playerContext);
|
|
82
|
+
this.container.addEventListener('keydown', this.keydownHandler, true);
|
|
99
83
|
}
|
|
100
84
|
async loadStream(source, options = {}) {
|
|
101
|
-
if (!this.playerContext)
|
|
102
|
-
return;
|
|
103
|
-
this.streamOptions = options;
|
|
104
|
-
if (this.player == undefined) {
|
|
85
|
+
if (!this.playerContext || !this.player) {
|
|
105
86
|
console.error('Er is nog geen player geladen.');
|
|
106
87
|
return;
|
|
107
88
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
89
|
+
this.streamOptions = options;
|
|
90
|
+
this.playerContext.player.removeClassFromNpoPlayerElement('npo-player-error');
|
|
91
|
+
this.npoPlayerServices.discardAdBreak(this.playerContext);
|
|
112
92
|
let _streamObject;
|
|
113
93
|
const sourceIsUrl = isUrl(source);
|
|
114
94
|
const sourceIsMedia = await isMediaUrl(source);
|
|
115
95
|
const sourceIsJWTToken = isJWTToken(source);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const prid = (isJWTToken(source) ? this.streamObject?.metadata.prid : source) || 'unknown';
|
|
120
|
-
const duration = this.player ? this.player.getDuration() : undefined;
|
|
121
|
-
startPlayerTracker(this, getStreamDurationInSeconds({ duration: duration }), this.version, prid);
|
|
122
|
-
}.bind(this);
|
|
96
|
+
if (this.streamOptions.npoTagPageTracker) {
|
|
97
|
+
this.npoTagPageTracker = this.streamOptions.npoTagPageTracker;
|
|
98
|
+
}
|
|
123
99
|
if (sourceIsUrl && sourceIsMedia) {
|
|
100
|
+
_streamObject = emptyStreamObject;
|
|
101
|
+
this.streamObject = _streamObject;
|
|
124
102
|
this.sourceConfig = {
|
|
125
103
|
...options.sourceConfig,
|
|
126
104
|
progressive: source,
|
|
@@ -131,12 +109,17 @@ export default class NpoPlayer {
|
|
|
131
109
|
customData5: this.version
|
|
132
110
|
}
|
|
133
111
|
};
|
|
112
|
+
void this.playerContext.player.createUIManager(this.playerContext, this.variant);
|
|
134
113
|
await this.playerContext.player?.load(this.sourceConfig);
|
|
135
|
-
|
|
114
|
+
this.npoPlayerServices.startPlayerTracker({
|
|
115
|
+
playerContext: this.playerContext,
|
|
116
|
+
source: source,
|
|
117
|
+
duration: undefined
|
|
118
|
+
});
|
|
136
119
|
}
|
|
137
120
|
else if (sourceIsJWTToken) {
|
|
138
121
|
this.jwt = source;
|
|
139
|
-
const profile = await this.
|
|
122
|
+
const profile = await this.npoPlayerServices.decideProfile(this.playerContext, options?.preferredDRM ?? '');
|
|
140
123
|
const defaultEndpoint = 'https://prod.npoplayer.nl/';
|
|
141
124
|
const endpoint = options?.endpoint ?? defaultEndpoint;
|
|
142
125
|
const payload = {
|
|
@@ -153,59 +136,58 @@ export default class NpoPlayer {
|
|
|
153
136
|
}
|
|
154
137
|
}
|
|
155
138
|
};
|
|
139
|
+
void this.playerContext.player.createUIManager(this.playerContext, this.variant);
|
|
156
140
|
try {
|
|
157
|
-
_streamObject = await
|
|
141
|
+
_streamObject = await this.npoPlayerServices.fetchStream(this.playerContext, payload);
|
|
158
142
|
this.streamObject = _streamObject;
|
|
159
|
-
if (_streamObject) {
|
|
160
|
-
await this.playerContext.player.createUIManager(this.playerContext, this.variant);
|
|
161
|
-
}
|
|
162
143
|
}
|
|
163
|
-
catch
|
|
164
|
-
this.doError('Het is niet gelukt de stream op te halen. \n' + error);
|
|
144
|
+
catch {
|
|
165
145
|
this.player.pause();
|
|
166
146
|
return;
|
|
167
147
|
}
|
|
168
148
|
if (this.streamObject?.stream == undefined)
|
|
169
149
|
return;
|
|
170
150
|
const drmType = this.streamObject.stream.drmType ?? undefined;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
logEvent(this, 'load');
|
|
175
|
-
let streamDuration = _streamObject.metadata.duration;
|
|
176
|
-
const streamPrid = this.streamObject.metadata.prid || _streamObject.metadata.prid;
|
|
177
|
-
if (this.isShowingPlayNextScreen) {
|
|
178
|
-
this.hidePlayNextScreen();
|
|
151
|
+
if (drmType !== undefined && drmType !== profile.drm) {
|
|
152
|
+
await this.npoPlayerServices.handleError(this.playerContext, 2007);
|
|
153
|
+
return;
|
|
179
154
|
}
|
|
155
|
+
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);
|
|
156
|
+
await this.npoPlayerServices.verifyDRM(this.playerContext, payload);
|
|
157
|
+
setupMediaSessionActionHandlers(this.player, this.sourceConfig, _streamObject);
|
|
158
|
+
this.hidePlayNextScreen();
|
|
159
|
+
const streamDuration = _streamObject.metadata.duration;
|
|
180
160
|
const initAndStartTracker = () => {
|
|
181
|
-
if (this.
|
|
161
|
+
if (!this.playerContext || !this.player)
|
|
182
162
|
return;
|
|
183
163
|
this.player?.off(PlayerEvent.AdBreakFinished, initAndStartTracker);
|
|
184
164
|
this.player?.off(PlayerEvent.AdError, initAndStartTracker);
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
165
|
+
this.npoPlayerServices.startPlayerTracker({
|
|
166
|
+
playerContext: this.playerContext,
|
|
167
|
+
source: source,
|
|
168
|
+
duration: streamDuration ? Number(streamDuration) : undefined
|
|
169
|
+
});
|
|
189
170
|
};
|
|
190
171
|
if (this.variant === NpoPlayerUIVariants.DEFAULT &&
|
|
191
172
|
this.streamObject.metadata.hasPreroll === 'true' &&
|
|
192
173
|
this.streamObject.assets.preroll) {
|
|
193
174
|
this.player.on(PlayerEvent.AdBreakFinished, initAndStartTracker);
|
|
194
175
|
this.player.on(PlayerEvent.AdError, initAndStartTracker);
|
|
195
|
-
await this.
|
|
176
|
+
await this.npoPlayerServices.schedulePreRolls(this.playerContext);
|
|
196
177
|
}
|
|
197
178
|
else {
|
|
198
179
|
initAndStartTracker();
|
|
199
180
|
}
|
|
200
181
|
}
|
|
201
182
|
else {
|
|
202
|
-
this.
|
|
183
|
+
await this.npoPlayerServices.handleError(this.playerContext, 500);
|
|
184
|
+
}
|
|
185
|
+
this.npoPlayerServices.handleStreamOptions(this.playerContext);
|
|
186
|
+
this.npoPlayerServices.setupNicamKijkwijzerIcons(this.playerContext);
|
|
187
|
+
if (this.variant === NpoPlayerUIVariants.VERTICAL) {
|
|
188
|
+
this.npoPlayerServices.handleVerticalVideoControls(this.playerContext);
|
|
189
|
+
this.npoPlayerServices.handleVerticalVideoSettings(this.playerContext);
|
|
203
190
|
}
|
|
204
|
-
this.npoplayerServices.setupNicamKijkwijzerIcons(this.playerContext);
|
|
205
|
-
this.player.on(PlayerEvent.Play, () => {
|
|
206
|
-
this.npoplayerServices.showNicamAfterUiDelay(this.playerContext, this.uiManager);
|
|
207
|
-
});
|
|
208
|
-
this.npoplayerServices.handleVerticalVideoControls(this.playerContext, this.variant);
|
|
209
191
|
this.player.on(PlayerEvent.Seek, () => {
|
|
210
192
|
removeReplayClass(this.player);
|
|
211
193
|
});
|
|
@@ -225,14 +207,6 @@ export default class NpoPlayer {
|
|
|
225
207
|
}.bind(this);
|
|
226
208
|
this.player.on(PlayerEvent.Ready, setLiveOffsetListener);
|
|
227
209
|
}
|
|
228
|
-
doError(input, status) {
|
|
229
|
-
if (this.player == undefined)
|
|
230
|
-
return;
|
|
231
|
-
if (status) {
|
|
232
|
-
this.logEmitter.emit('logError', status);
|
|
233
|
-
}
|
|
234
|
-
playerAction.handlePlayerError(this.player, this.uiComponents, input);
|
|
235
|
-
}
|
|
236
210
|
async play() {
|
|
237
211
|
await this.playerContext?.player.play();
|
|
238
212
|
}
|
|
@@ -311,6 +285,8 @@ export default class NpoPlayer {
|
|
|
311
285
|
this.streamOptions.playNext?.cancelCallback?.();
|
|
312
286
|
}
|
|
313
287
|
hidePlayNextScreen() {
|
|
288
|
+
if (!this.isShowingPlayNextScreen)
|
|
289
|
+
return;
|
|
314
290
|
this.player?.off(PlayerEvent.Paused, () => {
|
|
315
291
|
this.hidePlayNextScreen();
|
|
316
292
|
});
|
|
@@ -327,9 +303,16 @@ export default class NpoPlayer {
|
|
|
327
303
|
if (this.npoTag != undefined) {
|
|
328
304
|
clearInterval(this.npoTag?.heartbeatInterval);
|
|
329
305
|
}
|
|
330
|
-
|
|
306
|
+
if (this.playerContext) {
|
|
307
|
+
this.npoPlayerServices.logEvent({
|
|
308
|
+
playerContext: this.playerContext,
|
|
309
|
+
event: 'stop'
|
|
310
|
+
});
|
|
311
|
+
this.npoPlayerServices.removeUivisiblityHandlers(this.playerContext);
|
|
312
|
+
}
|
|
331
313
|
this.uiManager?.release();
|
|
332
314
|
this.uiManager = undefined;
|
|
315
|
+
this.container.removeEventListener('keydown', this.keydownHandler, true);
|
|
333
316
|
await this.player?.destroy();
|
|
334
317
|
return true;
|
|
335
318
|
}
|
package/lib/npoplayer.test.js
CHANGED
|
@@ -3,16 +3,16 @@ const div = document.createElement('div');
|
|
|
3
3
|
const testPlayerConfig = {
|
|
4
4
|
key: 'dummy-key'
|
|
5
5
|
};
|
|
6
|
-
jest.mock('./services/streamoptionsHandlers/
|
|
6
|
+
jest.mock('./services/streamoptionsHandlers/streamOptionsHandler', () => ({
|
|
7
7
|
handleStreamOptions: jest.fn()
|
|
8
8
|
}));
|
|
9
9
|
let player;
|
|
10
|
-
test('player init with parameters',
|
|
10
|
+
test('player init with parameters', () => {
|
|
11
11
|
player = new NpoPlayer(div, testPlayerConfig);
|
|
12
12
|
expect(player).toBeInstanceOf(NpoPlayer);
|
|
13
13
|
expect(player.playerConfig?.key).toBe(testPlayerConfig.key);
|
|
14
14
|
});
|
|
15
|
-
test('player init with parameters',
|
|
15
|
+
test('player init with parameters', () => {
|
|
16
16
|
player = new NpoPlayer({
|
|
17
17
|
container: div,
|
|
18
18
|
playerConfig: testPlayerConfig
|
package/lib/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@npo/player",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.27.0",
|
|
4
4
|
"description": "NPO Player",
|
|
5
5
|
"author": "Publieke Omroep <player@npo.nl>",
|
|
6
6
|
"contributors": [
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"webpack-dev-server": "^4.11.1"
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"@npotag/tag": "3.2.
|
|
92
|
+
"@npotag/tag": "3.2.4",
|
|
93
93
|
"bitmovin-player": "^8.166.0",
|
|
94
94
|
"bitmovin-player-ui": "3.67.0"
|
|
95
95
|
},
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import { NpoPlayerEvent } from '../../types/events';
|
|
2
2
|
import { addAccessibilityAttributes } from '../../ui/handlers/accessibilityhandler';
|
|
3
3
|
export function setupAccessibilityAttributes(playerContext) {
|
|
4
|
-
const { player,
|
|
4
|
+
const { player, npoPlayer } = playerContext;
|
|
5
5
|
const events = [NpoPlayerEvent.SourceLoaded, NpoPlayerEvent.AdBreakFinished, NpoPlayerEvent.AdError];
|
|
6
6
|
const triggerAddAccessibilityAttributes = () => {
|
|
7
7
|
for (const event of events) {
|
|
8
8
|
player?.off(event, triggerAddAccessibilityAttributes);
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
player?.enableSubtitles();
|
|
12
|
-
}
|
|
13
|
-
addAccessibilityAttributes(npoplayer.container, npoplayer.streamObject.metadata);
|
|
10
|
+
addAccessibilityAttributes(npoPlayer.container, npoPlayer.streamObject.metadata);
|
|
14
11
|
};
|
|
15
12
|
for (const event of events) {
|
|
16
13
|
player?.on(event, triggerAddAccessibilityAttributes);
|