@npo/player 1.22.4 → 1.23.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/ads/ster.js +23 -21
- package/lib/js/ads/ster.test.js +17 -17
- package/lib/js/api/getstreamobject.js +7 -7
- package/lib/js/api/getstreamobject.test.js +3 -3
- package/lib/js/markers/updateLiveMarkers.d.ts +3 -3
- package/lib/js/markers/updateLiveMarkers.js +14 -15
- package/lib/js/markers/updateLiveMarkers.test.js +11 -12
- package/lib/js/playeractions/customerrors.test.js +33 -33
- package/lib/js/playeractions/handlers/customerrors.js +48 -48
- package/lib/js/playeractions/handlers/error.js +1 -1
- package/lib/js/playeractions/handlers/error.test.js +11 -11
- package/lib/js/playeractions/handlers/handleoffsets.d.ts +2 -2
- package/lib/js/playeractions/handlers/handleoffsets.js +6 -6
- package/lib/js/playeractions/handlers/handleoffsets.test.js +12 -12
- package/lib/js/playeractions/handlers/mediasessionactions.d.ts +1 -1
- package/lib/js/playeractions/handlers/mediasessionactions.js +20 -15
- package/lib/js/playeractions/handlers/processplayerconfig.d.ts +2 -2
- package/lib/js/playeractions/handlers/processplayerconfig.js +4 -4
- package/lib/js/playeractions/handlers/processsourceconfig.d.ts +2 -1
- package/lib/js/playeractions/handlers/processsourceconfig.js +52 -46
- package/lib/js/playeractions/handlers/removereplayclass.d.ts +1 -1
- package/lib/js/playeractions/handlers/removereplayclass.test.d.ts +1 -1
- package/lib/js/playeractions/handlers/removereplayclass.test.js +7 -6
- package/lib/js/playeractions/playeractions.d.ts +4 -5
- package/lib/js/playeractions/playeractions.js +4 -5
- package/lib/js/settings/settings.user-agent.d.ts +1 -0
- package/lib/js/settings/settings.user-agent.js +1 -0
- package/lib/js/tracking/handlers/eventbinding.js +9 -9
- package/lib/js/tracking/handlers/eventlogging.js +2 -2
- package/lib/js/tracking/handlers/eventlogging.test.js +2 -2
- package/lib/js/tracking/handlers/playertrackerinit.d.ts +1 -1
- package/lib/js/tracking/handlers/playertrackerinit.js +5 -11
- package/lib/js/tracking/handlers/playertrackerstart.d.ts +1 -1
- package/lib/js/tracking/handlers/playertrackerstart.js +5 -10
- package/lib/js/utilities/utilities.element.d.ts +10 -0
- package/lib/js/utilities/utilities.element.js +8 -0
- package/lib/js/utilities/utilities.element.test.js +25 -0
- package/lib/js/utilities/utilities.jwt.d.ts +3 -0
- package/lib/js/utilities/utilities.jwt.js +22 -0
- package/lib/js/utilities/utilities.jwt.test.js +32 -0
- package/lib/js/utilities/utilities.locale.d.ts +2 -0
- package/lib/js/utilities/utilities.locale.js +4 -0
- package/lib/js/utilities/utilities.locale.test.js +10 -0
- package/lib/js/utilities/utilities.module.d.ts +1 -0
- package/lib/js/utilities/utilities.module.js +4 -0
- package/lib/js/utilities/utilities.module.test.js +19 -0
- package/lib/js/utilities/utilities.stream.d.ts +7 -0
- package/lib/js/utilities/utilities.stream.js +10 -0
- package/lib/js/utilities/utilities.stream.test.js +32 -0
- package/lib/js/utilities/utilities.text.d.ts +1 -0
- package/lib/js/utilities/utilities.text.js +3 -0
- package/lib/js/utilities/utilities.text.test.js +18 -0
- package/lib/js/utilities/utilities.time.d.ts +1 -0
- package/lib/js/utilities/utilities.time.js +3 -0
- package/lib/js/utilities/utilities.time.test.js +8 -0
- package/lib/js/utilities/utilities.url.d.ts +3 -0
- package/lib/js/utilities/utilities.url.js +29 -0
- package/lib/js/utilities/utilities.url.test.js +46 -0
- package/lib/js/utilities/utilities.user-agent.d.ts +3 -0
- package/lib/js/utilities/utilities.user-agent.js +13 -0
- package/lib/js/utilities/utilities.user-agent.test.js +60 -0
- package/lib/js/utilities/utilities.version.d.ts +1 -0
- package/lib/js/utilities/{printversion.js → utilities.version.js} +8 -8
- package/lib/js/utilities/utilities.version.test.js +26 -0
- package/lib/lang/nl.json +2 -1
- package/lib/npoplayer-bridge.test.d.ts +1 -1
- package/lib/npoplayer-bridge.test.js +6 -5
- package/lib/npoplayer.d.ts +14 -10
- package/lib/npoplayer.js +116 -124
- package/lib/npoplayer.test.js +3 -3
- package/lib/package.json +19 -12
- package/lib/services/a11y/setup.d.ts +2 -0
- package/lib/services/a11y/setup.js +18 -0
- package/lib/services/a11y/setup.test.js +109 -0
- package/lib/services/avTypeHandlers/getAVType.d.ts +2 -0
- package/lib/services/avTypeHandlers/getAVType.js +9 -0
- package/lib/services/avTypeHandlers/getAVType.test.js +18 -0
- package/lib/services/drmHandlers/constants.d.ts +15 -0
- package/lib/services/drmHandlers/constants.js +13 -0
- package/lib/services/drmHandlers/decideprofile.d.ts +2 -0
- package/lib/services/drmHandlers/decideprofile.js +51 -0
- package/lib/services/drmHandlers/decideprofile.test.js +34 -0
- package/lib/services/drmHandlers/drmhandlers.d.ts +2 -0
- package/lib/services/drmHandlers/drmhandlers.js +2 -0
- package/lib/services/drmHandlers/utils.d.ts +5 -0
- package/lib/services/drmHandlers/utils.js +26 -0
- package/lib/services/drmHandlers/utils.test.js +74 -0
- package/lib/services/drmHandlers/verifydrm.d.ts +2 -0
- package/lib/services/drmHandlers/verifydrm.js +40 -0
- package/lib/services/drmHandlers/verifydrm.test.js +89 -0
- package/lib/services/eventListenerHandlers/removeEventListeners.d.ts +2 -0
- package/lib/services/eventListenerHandlers/removeEventListeners.js +18 -0
- package/lib/services/eventListenerHandlers/removeEventListeners.test.js +27 -0
- package/lib/services/keyboardHandlers/resolvekeypress.d.ts +2 -0
- package/lib/services/keyboardHandlers/resolvekeypress.js +49 -0
- package/lib/{js/playeractions/handlers → services/keyboardHandlers}/resolvekeypress.test.js +21 -13
- package/lib/services/liveStreamHandlers/handleLiveStreamControls.d.ts +6 -0
- package/lib/services/liveStreamHandlers/handleLiveStreamControls.js +35 -0
- package/lib/services/localStorageHandlers/localStorageHandlers.d.ts +4 -0
- package/lib/services/localStorageHandlers/localStorageHandlers.js +33 -0
- package/lib/services/localStorageHandlers/localStorageHandlers.test.js +109 -0
- package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +30 -0
- package/lib/services/npoPlayerAPI/npoPlayerAPI.js +91 -0
- package/lib/services/npoPlayerAPI/npoPlayerAPI.test.js +51 -0
- package/lib/services/segmentHandlers/addSegmentEventListeners.d.ts +2 -0
- package/lib/services/segmentHandlers/addSegmentEventListeners.js +14 -0
- package/lib/services/segmentHandlers/addSegmentEventListeners.test.js +43 -0
- package/lib/services/segmentHandlers/convertFragmentToSegment.d.ts +2 -0
- package/lib/services/segmentHandlers/convertFragmentToSegment.js +8 -0
- package/lib/services/segmentHandlers/convertFragmentToSegment.test.js +17 -0
- package/lib/services/segmentHandlers/handleSegmentSeek.d.ts +5 -0
- package/lib/services/segmentHandlers/handleSegmentSeek.js +15 -0
- package/lib/services/segmentHandlers/handleSegmentSeek.test.js +73 -0
- package/lib/services/segmentHandlers/handleSegmentTimeChanged.d.ts +2 -0
- package/lib/services/segmentHandlers/handleSegmentTimeChanged.js +21 -0
- package/lib/services/segmentHandlers/handleSegmentTimeChanged.test.d.ts +1 -0
- package/lib/services/segmentHandlers/handleSegmentTimeChanged.test.js +34 -0
- package/lib/services/segmentHandlers/initSegment.d.ts +7 -0
- package/lib/services/segmentHandlers/initSegment.js +10 -0
- package/lib/services/segmentHandlers/initSegment.test.d.ts +1 -0
- package/lib/services/segmentHandlers/initSegment.test.js +36 -0
- package/lib/services/segmentHandlers/setSegmentMarkers.d.ts +2 -0
- package/lib/services/segmentHandlers/setSegmentMarkers.js +25 -0
- package/lib/services/segmentHandlers/setSegmentMarkers.test.d.ts +1 -0
- package/lib/services/segmentHandlers/setSegmentMarkers.test.js +32 -0
- package/lib/services/services.d.ts +14 -0
- package/lib/services/services.js +47 -0
- package/lib/src/js/markers/updateLiveMarkers.d.ts +3 -3
- package/lib/src/js/playeractions/handlers/handleoffsets.d.ts +2 -2
- package/lib/src/js/playeractions/handlers/mediasessionactions.d.ts +1 -1
- package/lib/src/js/playeractions/handlers/processplayerconfig.d.ts +2 -2
- package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +2 -1
- package/lib/src/js/playeractions/handlers/removereplayclass.d.ts +1 -1
- package/lib/src/js/playeractions/handlers/removereplayclass.test.d.ts +1 -1
- package/lib/src/js/playeractions/playeractions.d.ts +4 -5
- package/lib/src/js/settings/settings.user-agent.d.ts +1 -0
- package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +1 -1
- package/lib/src/js/tracking/handlers/playertrackerstart.d.ts +1 -1
- package/lib/src/js/utilities/utilities.element.d.ts +10 -0
- package/lib/src/js/utilities/utilities.element.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.jwt.d.ts +3 -0
- package/lib/src/js/utilities/utilities.jwt.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.locale.d.ts +2 -0
- package/lib/src/js/utilities/utilities.locale.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.module.d.ts +1 -0
- package/lib/src/js/utilities/utilities.module.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.stream.d.ts +7 -0
- package/lib/src/js/utilities/utilities.stream.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.text.d.ts +1 -0
- package/lib/src/js/utilities/utilities.text.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.time.d.ts +1 -0
- package/lib/src/js/utilities/utilities.time.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.url.d.ts +3 -0
- package/lib/src/js/utilities/utilities.url.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.user-agent.d.ts +3 -0
- package/lib/src/js/utilities/utilities.user-agent.test.d.ts +1 -0
- package/lib/src/js/utilities/utilities.version.d.ts +1 -0
- package/lib/src/js/utilities/utilities.version.test.d.ts +1 -0
- package/lib/src/npoplayer-bridge.test.d.ts +1 -1
- package/lib/src/npoplayer.d.ts +14 -10
- package/lib/src/services/a11y/setup.d.ts +2 -0
- package/lib/src/services/a11y/setup.test.d.ts +1 -0
- package/lib/src/services/avTypeHandlers/getAVType.d.ts +2 -0
- package/lib/src/services/avTypeHandlers/getAVType.test.d.ts +1 -0
- package/lib/src/services/drmHandlers/constants.d.ts +15 -0
- package/lib/src/services/drmHandlers/decideprofile.d.ts +2 -0
- package/lib/src/services/drmHandlers/decideprofile.test.d.ts +1 -0
- package/lib/src/services/drmHandlers/drmhandlers.d.ts +2 -0
- package/lib/src/services/drmHandlers/utils.d.ts +5 -0
- package/lib/src/services/drmHandlers/utils.test.d.ts +1 -0
- package/lib/src/services/drmHandlers/verifydrm.d.ts +2 -0
- package/lib/src/services/drmHandlers/verifydrm.test.d.ts +1 -0
- package/lib/src/services/eventListenerHandlers/removeEventListeners.d.ts +2 -0
- package/lib/src/services/eventListenerHandlers/removeEventListeners.test.d.ts +1 -0
- package/lib/src/services/keyboardHandlers/resolvekeypress.d.ts +2 -0
- package/lib/src/services/keyboardHandlers/resolvekeypress.test.d.ts +1 -0
- package/lib/src/services/liveStreamHandlers/handleLiveStreamControls.d.ts +6 -0
- package/lib/src/services/localStorageHandlers/localStorageHandlers.d.ts +4 -0
- package/lib/src/services/localStorageHandlers/localStorageHandlers.test.d.ts +1 -0
- package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +30 -0
- package/lib/src/services/npoPlayerAPI/npoPlayerAPI.test.d.ts +1 -0
- package/lib/src/services/segmentHandlers/addSegmentEventListeners.d.ts +2 -0
- package/lib/src/services/segmentHandlers/addSegmentEventListeners.test.d.ts +1 -0
- package/lib/src/services/segmentHandlers/convertFragmentToSegment.d.ts +2 -0
- package/lib/src/services/segmentHandlers/convertFragmentToSegment.test.d.ts +1 -0
- package/lib/src/services/segmentHandlers/handleSegmentSeek.d.ts +5 -0
- package/lib/src/services/segmentHandlers/handleSegmentSeek.test.d.ts +1 -0
- package/lib/src/services/segmentHandlers/handleSegmentTimeChanged.d.ts +2 -0
- package/lib/src/services/segmentHandlers/handleSegmentTimeChanged.test.d.ts +1 -0
- package/lib/src/services/segmentHandlers/initSegment.d.ts +7 -0
- package/lib/src/services/segmentHandlers/initSegment.test.d.ts +1 -0
- package/lib/src/services/segmentHandlers/setSegmentMarkers.d.ts +2 -0
- package/lib/src/services/segmentHandlers/setSegmentMarkers.test.d.ts +1 -0
- package/lib/src/services/services.d.ts +14 -0
- package/lib/src/types/events.d.ts +91 -0
- package/lib/src/types/interfaces.d.ts +39 -15
- package/lib/{js → src}/ui/components/adbutton.d.ts +1 -1
- package/lib/{js → src}/ui/components/adlabel.d.ts +1 -1
- package/lib/{js → src}/ui/components/audio/controlbar.d.ts +1 -1
- package/lib/{js → src}/ui/components/buttons.d.ts +3 -3
- package/lib/src/ui/components/controlbar.d.ts +3 -0
- package/lib/{js → src}/ui/components/ctabar.d.ts +2 -2
- package/lib/src/ui/components/nativemobile/controlbar.d.ts +3 -0
- package/lib/src/ui/components/nativemobile/topbar.d.ts +3 -0
- package/lib/{js → src}/ui/components/playnext.d.ts +1 -1
- package/lib/src/{js/ui → ui}/components/seekbar.d.ts +1 -1
- package/lib/src/{js/ui → ui}/components/settingspanel.d.ts +1 -1
- package/lib/{js → src}/ui/components/titlebar.d.ts +1 -1
- package/lib/src/ui/components/topbar.d.ts +3 -0
- package/lib/src/ui/handlers/accessibilityhandler.test.d.ts +1 -0
- package/lib/src/ui/handlers/domhandlers.d.ts +3 -0
- package/lib/src/ui/handlers/domhandlers.test.d.ts +1 -0
- package/lib/{js → src}/ui/handlers/nicamhandler.d.ts +2 -2
- package/lib/src/ui/handlers/nicamhandler.test.d.ts +1 -0
- package/lib/{js → src}/ui/handlers/playnextstreen.test.d.ts +1 -1
- package/lib/src/{js/ui → ui}/handlers/streamhandler.d.ts +2 -2
- package/lib/{js → src}/ui/nativemobileuicontainer.d.ts +1 -1
- package/lib/src/ui/nativemobileuifactory.test.d.ts +1 -0
- package/lib/{js → src}/ui/uicontainer.d.ts +2 -3
- package/lib/tests/mocks/mockNpoplayer.js +18 -15
- package/lib/tests/mocks/mockPlayerAPI.d.ts +3 -0
- package/lib/tests/mocks/mockPlayerAPI.js +181 -0
- package/lib/tests/mocks/mockPlayerContext.d.ts +2 -0
- package/lib/tests/mocks/mockPlayerContext.js +40 -0
- package/lib/types/events.d.ts +91 -0
- package/lib/types/events.js +1 -0
- package/lib/types/interfaces.d.ts +39 -15
- package/lib/types/interfaces.js +12 -0
- package/lib/{src/js/ui → ui}/components/adbutton.d.ts +1 -1
- package/lib/{src/js/ui → ui}/components/adlabel.d.ts +1 -1
- package/lib/{src/js/ui → ui}/components/audio/controlbar.d.ts +1 -1
- package/lib/{js/ui → ui}/components/audio/controlbar.js +2 -2
- package/lib/{src/js/ui → ui}/components/buttons.d.ts +3 -3
- package/lib/{js/ui → ui}/components/buttons.js +7 -7
- package/lib/ui/components/controlbar.d.ts +3 -0
- package/lib/{js/ui → ui}/components/controlbar.js +5 -2
- package/lib/{src/js/ui → ui}/components/ctabar.d.ts +3 -3
- package/lib/{js/ui → ui}/components/ctabar.js +4 -6
- package/lib/{js/ui → ui}/components/nativemobile/buttons.js +8 -6
- package/lib/ui/components/nativemobile/controlbar.d.ts +3 -0
- package/lib/{js/ui → ui}/components/nativemobile/controlbar.js +6 -4
- package/lib/{js/ui → ui}/components/nativemobile/ctabar.js +1 -1
- package/lib/ui/components/nativemobile/topbar.d.ts +3 -0
- package/lib/{js/ui → ui}/components/nativemobile/topbar.js +6 -3
- package/lib/{src/js/ui → ui}/components/playnext.d.ts +1 -1
- package/lib/{js/ui → ui}/components/playnext.js +1 -1
- package/lib/{js/ui → ui}/components/seekbar.d.ts +1 -1
- package/lib/{js/ui → ui}/components/seekbar.js +1 -1
- package/lib/{js/ui → ui}/components/settingspanel.d.ts +1 -1
- package/lib/{js/ui → ui}/components/settingspanel.js +23 -40
- package/lib/{src/js/ui → ui}/components/titlebar.d.ts +1 -1
- package/lib/ui/components/topbar.d.ts +3 -0
- package/lib/{js/ui → ui}/components/topbar.js +8 -4
- package/lib/{js/ui → ui}/handlers/accessibilityhandler.js +10 -10
- package/lib/ui/handlers/accessibilityhandler.test.d.ts +1 -0
- package/lib/ui/handlers/domhandlers.d.ts +3 -0
- package/lib/ui/handlers/domhandlers.js +7 -0
- package/lib/ui/handlers/domhandlers.test.d.ts +1 -0
- package/lib/ui/handlers/domhandlers.test.js +51 -0
- package/lib/{js/ui → ui}/handlers/listboxhandlers.js +7 -7
- package/lib/{src/js/ui → ui}/handlers/nicamhandler.d.ts +2 -2
- package/lib/{js/ui → ui}/handlers/nicamhandler.js +31 -10
- package/lib/ui/handlers/nicamhandler.test.d.ts +1 -0
- package/lib/{js/ui → ui}/handlers/nicamhandler.test.js +4 -3
- package/lib/{js/ui → ui}/handlers/playnextscreen.js +1 -1
- package/lib/{src/js/ui → ui}/handlers/playnextstreen.test.d.ts +1 -1
- package/lib/{js/ui → ui}/handlers/playnextstreen.test.js +5 -3
- package/lib/{js/ui → ui}/handlers/streamhandler.d.ts +2 -2
- package/lib/ui/handlers/streamhandler.js +51 -0
- package/lib/{src/js/ui → ui}/nativemobileuicontainer.d.ts +1 -1
- package/lib/{js/ui → ui}/nativemobileuicontainer.js +8 -13
- package/lib/{js/ui → ui}/nativemobileuifactory.js +20 -23
- package/lib/ui/nativemobileuifactory.test.d.ts +1 -0
- package/lib/{js/ui → ui}/nativemobileuifactory.test.js +8 -6
- package/lib/{src/js/ui → ui}/uicontainer.d.ts +2 -3
- package/lib/{js/ui → ui}/uicontainer.js +31 -45
- package/package.json +19 -12
- package/src/{scss → style}/components/_controlbars.scss +4 -0
- package/src/{scss → style}/components/_icons.scss +6 -0
- package/src/style/components/_poster.scss +3 -0
- package/src/{scss → style}/components/_settingspanel.scss +15 -1
- package/src/{scss → style}/components/_subtitles.scss +25 -16
- package/src/{scss → style}/npoplayer.css +30 -20
- package/src/{scss → style}/npoplayer.scss +3 -0
- package/src/{scss → style}/variants/_player-small.scss +9 -8
- package/lib/js/checks/apple.d.ts +0 -2
- package/lib/js/checks/apple.js +0 -19
- package/lib/js/checks/apple.test.js +0 -20
- package/lib/js/drm/drm.d.ts +0 -2
- package/lib/js/drm/drm.js +0 -2
- package/lib/js/drm/handlers/decideprofile.d.ts +0 -3
- package/lib/js/drm/handlers/decideprofile.js +0 -53
- package/lib/js/drm/handlers/decideprofile.test.js +0 -33
- package/lib/js/drm/handlers/verifydrm.d.ts +0 -4
- package/lib/js/drm/handlers/verifydrm.js +0 -24
- package/lib/js/drm/handlers/verifydrm.test.js +0 -17
- package/lib/js/fragments/removefragments.d.ts +0 -2
- package/lib/js/fragments/removefragments.js +0 -5
- package/lib/js/fragments/removefragments.test.js +0 -26
- package/lib/js/fragments/setfragments.d.ts +0 -6
- package/lib/js/fragments/setfragments.js +0 -78
- package/lib/js/fragments/setfragments.test.js +0 -72
- package/lib/js/playeractions/handlers/resolvekeypress.d.ts +0 -3
- package/lib/js/playeractions/handlers/resolvekeypress.js +0 -52
- package/lib/js/ui/components/controlbar.d.ts +0 -3
- package/lib/js/ui/components/nativemobile/addFragments.d.ts +0 -1
- package/lib/js/ui/components/nativemobile/addFragments.js +0 -7
- package/lib/js/ui/components/nativemobile/controlbar.d.ts +0 -3
- package/lib/js/ui/components/nativemobile/topbar.d.ts +0 -3
- package/lib/js/ui/components/topbar.d.ts +0 -3
- package/lib/js/ui/handlers/domhandlers.d.ts +0 -3
- package/lib/js/ui/handlers/domhandlers.js +0 -7
- package/lib/js/ui/handlers/domhandlers.test.js +0 -50
- package/lib/js/ui/handlers/streamhandler.js +0 -40
- package/lib/js/utilities/printversion.d.ts +0 -1
- package/lib/js/utilities/utilities.d.ts +0 -16
- package/lib/js/utilities/utilities.js +0 -78
- package/lib/js/utilities/utilities.test.js +0 -50
- package/lib/src/js/checks/apple.d.ts +0 -2
- package/lib/src/js/drm/drm.d.ts +0 -2
- package/lib/src/js/drm/handlers/decideprofile.d.ts +0 -3
- package/lib/src/js/drm/handlers/verifydrm.d.ts +0 -4
- package/lib/src/js/fragments/removefragments.d.ts +0 -2
- package/lib/src/js/fragments/setfragments.d.ts +0 -6
- package/lib/src/js/playeractions/handlers/resolvekeypress.d.ts +0 -3
- package/lib/src/js/ui/components/controlbar.d.ts +0 -3
- package/lib/src/js/ui/components/nativemobile/addFragments.d.ts +0 -1
- package/lib/src/js/ui/components/nativemobile/controlbar.d.ts +0 -3
- package/lib/src/js/ui/components/nativemobile/topbar.d.ts +0 -3
- package/lib/src/js/ui/components/topbar.d.ts +0 -3
- package/lib/src/js/ui/handlers/domhandlers.d.ts +0 -3
- package/lib/src/js/utilities/printversion.d.ts +0 -1
- package/lib/src/js/utilities/utilities.d.ts +0 -16
- /package/lib/js/{utilities/localizationconfig.d.ts → settings/localization.d.ts} +0 -0
- /package/lib/js/{utilities/localizationconfig.js → settings/localization.js} +0 -0
- /package/lib/js/{checks/apple.test.d.ts → utilities/utilities.element.test.d.ts} +0 -0
- /package/lib/js/{drm/handlers/decideprofile.test.d.ts → utilities/utilities.jwt.test.d.ts} +0 -0
- /package/lib/js/{drm/handlers/verifydrm.test.d.ts → utilities/utilities.locale.test.d.ts} +0 -0
- /package/lib/js/{fragments/removefragments.test.d.ts → utilities/utilities.module.test.d.ts} +0 -0
- /package/lib/js/{fragments/setfragments.test.d.ts → utilities/utilities.stream.test.d.ts} +0 -0
- /package/lib/js/{playeractions/handlers/resolvekeypress.test.d.ts → utilities/utilities.text.test.d.ts} +0 -0
- /package/lib/js/{ui/handlers/accessibilityhandler.test.d.ts → utilities/utilities.time.test.d.ts} +0 -0
- /package/lib/js/{ui/handlers/domhandlers.test.d.ts → utilities/utilities.url.test.d.ts} +0 -0
- /package/lib/js/{ui/handlers/nicamhandler.test.d.ts → utilities/utilities.user-agent.test.d.ts} +0 -0
- /package/lib/js/{ui/nativemobileuifactory.test.d.ts → utilities/utilities.version.test.d.ts} +0 -0
- /package/lib/{js/utilities/utilities.test.d.ts → services/a11y/setup.test.d.ts} +0 -0
- /package/lib/{src/js/checks/apple.test.d.ts → services/avTypeHandlers/getAVType.test.d.ts} +0 -0
- /package/lib/{src/js/drm/handlers → services/drmHandlers}/decideprofile.test.d.ts +0 -0
- /package/lib/{src/js/drm/handlers/verifydrm.test.d.ts → services/drmHandlers/utils.test.d.ts} +0 -0
- /package/lib/{src/js/fragments/removefragments.test.d.ts → services/drmHandlers/verifydrm.test.d.ts} +0 -0
- /package/lib/{src/js/fragments/setfragments.test.d.ts → services/eventListenerHandlers/removeEventListeners.test.d.ts} +0 -0
- /package/lib/{src/js/playeractions/handlers → services/keyboardHandlers}/resolvekeypress.test.d.ts +0 -0
- /package/lib/{src/js/ui/handlers/accessibilityhandler.test.d.ts → services/localStorageHandlers/localStorageHandlers.test.d.ts} +0 -0
- /package/lib/{src/js/ui/handlers/domhandlers.test.d.ts → services/npoPlayerAPI/npoPlayerAPI.test.d.ts} +0 -0
- /package/lib/{src/js/ui/handlers/nicamhandler.test.d.ts → services/segmentHandlers/addSegmentEventListeners.test.d.ts} +0 -0
- /package/lib/{src/js/ui/nativemobileuifactory.test.d.ts → services/segmentHandlers/convertFragmentToSegment.test.d.ts} +0 -0
- /package/lib/{src/js/utilities/utilities.test.d.ts → services/segmentHandlers/handleSegmentSeek.test.d.ts} +0 -0
- /package/lib/src/js/{utilities/localizationconfig.d.ts → settings/localization.d.ts} +0 -0
- /package/lib/{js → src}/ui/components/nativemobile/buttons.d.ts +0 -0
- /package/lib/{js → src}/ui/components/nativemobile/ctabar.d.ts +0 -0
- /package/lib/{js → src}/ui/components/nativemobile/titlebar.d.ts +0 -0
- /package/lib/{js → src}/ui/handlers/accessibilityhandler.d.ts +0 -0
- /package/lib/{js → src}/ui/handlers/listboxhandlers.d.ts +0 -0
- /package/lib/{js → src}/ui/handlers/playnextscreen.d.ts +0 -0
- /package/lib/{js → src}/ui/handlers/timecontrolhandlers.d.ts +0 -0
- /package/lib/{js → src}/ui/nativemobileuifactory.d.ts +0 -0
- /package/lib/{js/ui → ui}/components/adbutton.js +0 -0
- /package/lib/{js/ui → ui}/components/adlabel.js +0 -0
- /package/lib/{src/js/ui → ui}/components/nativemobile/buttons.d.ts +0 -0
- /package/lib/{src/js/ui → ui}/components/nativemobile/ctabar.d.ts +0 -0
- /package/lib/{src/js/ui → ui}/components/nativemobile/titlebar.d.ts +0 -0
- /package/lib/{js/ui → ui}/components/nativemobile/titlebar.js +0 -0
- /package/lib/{js/ui → ui}/components/titlebar.js +0 -0
- /package/lib/{src/js/ui → ui}/handlers/accessibilityhandler.d.ts +0 -0
- /package/lib/{js/ui → ui}/handlers/accessibilityhandler.test.js +0 -0
- /package/lib/{src/js/ui → ui}/handlers/listboxhandlers.d.ts +0 -0
- /package/lib/{src/js/ui → ui}/handlers/playnextscreen.d.ts +0 -0
- /package/lib/{src/js/ui → ui}/handlers/timecontrolhandlers.d.ts +0 -0
- /package/lib/{js/ui → ui}/handlers/timecontrolhandlers.js +0 -0
- /package/lib/{src/js/ui → ui}/nativemobileuifactory.d.ts +0 -0
- /package/src/{scss → style}/components/_advert.scss +0 -0
- /package/src/{scss → style}/components/_audio.scss +0 -0
- /package/src/{scss → style}/components/_buffering.scss +0 -0
- /package/src/{scss → style}/components/_error.scss +0 -0
- /package/src/{scss → style}/components/_hugeplaybacktogglebutton.scss +0 -0
- /package/src/{scss → style}/components/_metadata.scss +0 -0
- /package/src/{scss → style}/components/_nicam.scss +0 -0
- /package/src/{scss → style}/components/_playnext.scss +0 -0
- /package/src/{scss → style}/components/_replay.scss +0 -0
- /package/src/{scss → style}/components/_seekbar.scss +0 -0
- /package/src/{scss → style}/components/_seekbarthumbnail.scss +0 -0
- /package/src/{scss → style}/components/_textbuttons.scss +0 -0
- /package/src/{scss → style}/components/_volumeslider.scss +0 -0
- /package/src/{scss → style}/components/audio/_bottombar.scss +0 -0
- /package/src/{scss → style}/components/audio/_buffering.scss +0 -0
- /package/src/{scss → style}/components/audio/_errors.scss +0 -0
- /package/src/{scss → style}/components/audio/_metadata.scss +0 -0
- /package/src/{scss → style}/components/audio/_playbutton.scss +0 -0
- /package/src/{scss → style}/components/audio/_poster.scss +0 -0
- /package/src/{scss → style}/components/audio/_replay.scss +0 -0
- /package/src/{scss → style}/components/audio/_seekbar.scss +0 -0
- /package/src/{scss → style}/components/audio/_topbar.scss +0 -0
- /package/src/{scss → style}/components/audio/_vars.scss +0 -0
- /package/src/{scss → style}/components/audio/_volumeslider.scss +0 -0
- /package/src/{scss → style}/variants/_player-audio.scss +0 -0
- /package/src/{scss → style}/variants/_player-base.scss +0 -0
- /package/src/{scss → style}/variants/_player-debug.scss +0 -0
- /package/src/{scss → style}/variants/_player-large.scss +0 -0
- /package/src/{scss → style}/variants/_player-medium.scss +0 -0
- /package/src/{scss → style}/variants/_player-native-mobile.scss +0 -0
- /package/src/{scss → style}/vars/_audio.scss +0 -0
- /package/src/{scss → style}/vars/_colors.scss +0 -0
- /package/src/{scss → style}/vars/_fonts.scss +0 -0
- /package/src/{scss → style}/vars/_icons.scss +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { resolveKeyPress } from './resolvekeypress';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { mockNpoPlayer } from '../../../tests/mocks/mockNpoplayer';
|
|
3
|
+
import { ViewMode } from '../../types/interfaces';
|
|
4
4
|
describe('resolveKeyPress', () => {
|
|
5
5
|
let mockPlayer;
|
|
6
|
-
|
|
6
|
+
const mockNpoplayer = mockNpoPlayer;
|
|
7
7
|
let e;
|
|
8
|
+
let mockPlayerContext;
|
|
8
9
|
beforeEach(() => {
|
|
9
10
|
jest.clearAllMocks();
|
|
10
11
|
mockPlayer = {
|
|
@@ -31,50 +32,57 @@ describe('resolveKeyPress', () => {
|
|
|
31
32
|
})
|
|
32
33
|
};
|
|
33
34
|
e = new KeyboardEvent('keydown');
|
|
35
|
+
mockPlayerContext = { player: mockPlayer, npoplayer: mockNpoplayer };
|
|
34
36
|
});
|
|
35
37
|
it('should mute/unmute the player when "KeyM" is pressed', () => {
|
|
36
38
|
mockPlayer.isMuted.mockReturnValue(true);
|
|
37
|
-
resolveKeyPress(
|
|
39
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'KeyM' });
|
|
38
40
|
expect(mockPlayer.unmute).toHaveBeenCalled();
|
|
39
41
|
});
|
|
40
42
|
it('should enter/exit fullscreen mode when "KeyF" is pressed', () => {
|
|
41
43
|
mockPlayer.getViewMode.mockReturnValue(ViewMode.Inline);
|
|
42
|
-
resolveKeyPress(
|
|
44
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'KeyF' });
|
|
43
45
|
expect(mockPlayer.setViewMode).toHaveBeenCalledWith(ViewMode.Fullscreen);
|
|
44
46
|
});
|
|
45
47
|
it('should play/pause the player when "Space" is pressed', () => {
|
|
46
48
|
mockPlayer.isPaused.mockReturnValue(true);
|
|
47
|
-
|
|
49
|
+
mockPlayer.play.mockImplementation(() => Promise.resolve().catch(() => {
|
|
50
|
+
console.log('Failed to play');
|
|
51
|
+
}));
|
|
52
|
+
const preventDefault = jest.fn();
|
|
53
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'Space', preventDefault });
|
|
48
54
|
expect(mockPlayer.play).toHaveBeenCalled();
|
|
49
55
|
});
|
|
50
56
|
it('should increase the volume when "ArrowUp" is pressed', () => {
|
|
57
|
+
const preventDefault = jest.fn();
|
|
51
58
|
mockPlayer.isMuted.mockReturnValue(true);
|
|
52
59
|
mockNpoplayer.increaseVolume = jest.fn();
|
|
53
|
-
resolveKeyPress(
|
|
60
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowUp', preventDefault });
|
|
54
61
|
expect(mockPlayer.unmute).toHaveBeenCalled();
|
|
55
62
|
expect(mockNpoplayer.increaseVolume).toHaveBeenCalled();
|
|
56
63
|
});
|
|
57
64
|
it('should decrease the volume when "ArrowDown" is pressed', () => {
|
|
65
|
+
const preventDefault = jest.fn();
|
|
58
66
|
mockPlayer.isMuted.mockReturnValue(true);
|
|
59
67
|
mockNpoplayer.decreaseVolume = jest.fn();
|
|
60
|
-
resolveKeyPress(
|
|
68
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowDown', preventDefault });
|
|
61
69
|
expect(mockPlayer.unmute).toHaveBeenCalled();
|
|
62
70
|
expect(mockNpoplayer.decreaseVolume).toHaveBeenCalled();
|
|
63
71
|
});
|
|
64
72
|
it('should go backwards when "ArrowLeft" is pressed', () => {
|
|
65
73
|
mockNpoplayer.goBackwards = jest.fn();
|
|
66
|
-
resolveKeyPress(
|
|
74
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowLeft' });
|
|
67
75
|
expect(mockNpoplayer.goBackwards).toHaveBeenCalledWith(10);
|
|
68
76
|
});
|
|
69
77
|
it('should go forward when "ArrowRight" is pressed', () => {
|
|
70
78
|
mockNpoplayer.goForward = jest.fn();
|
|
71
|
-
resolveKeyPress(
|
|
79
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'ArrowRight' });
|
|
72
80
|
expect(mockNpoplayer.goForward).toHaveBeenCalledWith(10);
|
|
73
81
|
});
|
|
74
82
|
it('should hide the settings panel when "Escape" is pressed', () => {
|
|
75
|
-
if (mockNpoplayer.uiComponents.
|
|
76
|
-
resolveKeyPress(
|
|
77
|
-
expect(mockNpoplayer.uiComponents.
|
|
83
|
+
if (mockNpoplayer.uiComponents.settingsPanels) {
|
|
84
|
+
resolveKeyPress(mockPlayerContext, { ...e, code: 'Escape' });
|
|
85
|
+
expect(mockNpoplayer.uiComponents.settingsPanels[0].hide).toHaveBeenCalled();
|
|
78
86
|
}
|
|
79
87
|
});
|
|
80
88
|
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PlayerContext } from 'types/interfaces';
|
|
2
|
+
export declare const handleLiveStreamControls: (playerContext: PlayerContext) => void;
|
|
3
|
+
export declare function updateForwardButtonState(player: any): void;
|
|
4
|
+
export declare function toggleForwardButtons(forwardButtons: NodeListOf<Element>, timeShift: number): void;
|
|
5
|
+
export declare function disableForwardButton(button: Element): void;
|
|
6
|
+
export declare function enableForwardButton(button: Element): void;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { PlayerEvent } from 'bitmovin-player';
|
|
2
|
+
export const handleLiveStreamControls = (playerContext) => {
|
|
3
|
+
const liveStreamHandleTimeChangedCallback = () => updateForwardButtonState(playerContext.player);
|
|
4
|
+
const { player, npoplayer } = playerContext;
|
|
5
|
+
player.on(PlayerEvent.TimeChanged, liveStreamHandleTimeChangedCallback);
|
|
6
|
+
npoplayer.eventListeners = {
|
|
7
|
+
liveStreamHandleTimeChangedCallback
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export function updateForwardButtonState(player) {
|
|
11
|
+
const timeShift = player?.getTimeShift();
|
|
12
|
+
const forwardButtons = player?.getContainer().querySelectorAll('.bmpui-ui-forwardbutton');
|
|
13
|
+
player.off(PlayerEvent.TimeChanged, () => {
|
|
14
|
+
updateForwardButtonState(player);
|
|
15
|
+
});
|
|
16
|
+
if (forwardButtons && timeShift !== undefined) {
|
|
17
|
+
toggleForwardButtons(forwardButtons, timeShift);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function toggleForwardButtons(forwardButtons, timeShift) {
|
|
21
|
+
for (const forwardButton of forwardButtons) {
|
|
22
|
+
if (timeShift > -10) {
|
|
23
|
+
disableForwardButton(forwardButton);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
enableForwardButton(forwardButton);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function disableForwardButton(button) {
|
|
31
|
+
button.setAttribute('disabled', 'true');
|
|
32
|
+
}
|
|
33
|
+
export function enableForwardButton(button) {
|
|
34
|
+
button.removeAttribute('disabled');
|
|
35
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { LocalStorageData, LocalStorageValues, PlayerContext } from 'types/interfaces';
|
|
2
|
+
export declare function setLocalStorage(key: LocalStorageValues, value: any): void;
|
|
3
|
+
export declare function getLocalStorage(): LocalStorageData;
|
|
4
|
+
export declare function setValuesBasedOnLocalStorage(playerContext: PlayerContext): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function setLocalStorage(key, value) {
|
|
2
|
+
const prefixedKey = `npoplayer-${key}`;
|
|
3
|
+
localStorage.setItem(prefixedKey, JSON.stringify(value));
|
|
4
|
+
}
|
|
5
|
+
export function getLocalStorage() {
|
|
6
|
+
const result = {};
|
|
7
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
8
|
+
const key = localStorage.key(i);
|
|
9
|
+
if (key && key.startsWith('npoplayer-')) {
|
|
10
|
+
const item = localStorage.getItem(key);
|
|
11
|
+
if (item !== null) {
|
|
12
|
+
const originalKey = key.replace('npoplayer-', '');
|
|
13
|
+
result[originalKey] = JSON.parse(item);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
export function setValuesBasedOnLocalStorage(playerContext) {
|
|
20
|
+
const localStorageData = getLocalStorage();
|
|
21
|
+
const player = playerContext.player;
|
|
22
|
+
if (!player) {
|
|
23
|
+
console.error('Player is undefined in playerContext');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
player.setVolume(localStorageData.volume ?? 100);
|
|
27
|
+
if (localStorageData.ismuted === 'true') {
|
|
28
|
+
player.mute();
|
|
29
|
+
}
|
|
30
|
+
if (localStorageData.subtitles_enabled === 'true') {
|
|
31
|
+
playerContext.npoplayer.streamOptions.enableSubtitles = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { mockNpoPlayer } from '../../../tests/mocks/mockNpoplayer';
|
|
2
|
+
import { setLocalStorage, getLocalStorage, setValuesBasedOnLocalStorage } from './localStorageHandlers';
|
|
3
|
+
import { LocalStorageValues } from '../../types/interfaces';
|
|
4
|
+
describe('localStorageHandler', () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
localStorage.clear();
|
|
7
|
+
});
|
|
8
|
+
describe('setLocalStorage', () => {
|
|
9
|
+
it('should set an item in local storage with a prefixed key', () => {
|
|
10
|
+
const key = LocalStorageValues.VOLUME;
|
|
11
|
+
const value = 50;
|
|
12
|
+
setLocalStorage(key, value);
|
|
13
|
+
const storedValue = localStorage.getItem('npoplayer-volume');
|
|
14
|
+
expect(storedValue).toEqual(JSON.stringify(value));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe('getLocalStorage', () => {
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
localStorage.clear();
|
|
20
|
+
});
|
|
21
|
+
it('should retrieve all items with the npoplayer prefix from local storage and return them as an object', () => {
|
|
22
|
+
const key1 = `npoplayer-${LocalStorageValues.VOLUME}`;
|
|
23
|
+
const value1 = 50;
|
|
24
|
+
const key2 = `npoplayer-${LocalStorageValues.IS_MUTED}`;
|
|
25
|
+
const value2 = false;
|
|
26
|
+
localStorage.setItem(key1, JSON.stringify(value1));
|
|
27
|
+
localStorage.setItem(key2, JSON.stringify(value2));
|
|
28
|
+
const localStorageData = getLocalStorage();
|
|
29
|
+
expect(localStorageData).toEqual({
|
|
30
|
+
[LocalStorageValues.VOLUME]: value1,
|
|
31
|
+
[LocalStorageValues.IS_MUTED]: value2
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
it('should ignore items without the npoplayer prefix', () => {
|
|
35
|
+
const key1 = 'npoplayer-key1';
|
|
36
|
+
const value1 = { foo: 'bar1' };
|
|
37
|
+
const key2 = 'key2';
|
|
38
|
+
const value2 = { foo: 'bar2' };
|
|
39
|
+
localStorage.setItem(key1, JSON.stringify(value1));
|
|
40
|
+
localStorage.setItem(key2, JSON.stringify(value2));
|
|
41
|
+
const localStorageData = getLocalStorage();
|
|
42
|
+
expect(localStorageData).toEqual({
|
|
43
|
+
key1: value1
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('setValuesBasedOnLocalStorage', () => {
|
|
48
|
+
let mockPlayerAPI;
|
|
49
|
+
let playerContext;
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
mockPlayerAPI = {
|
|
52
|
+
setVolume: jest.fn(),
|
|
53
|
+
mute: jest.fn()
|
|
54
|
+
};
|
|
55
|
+
playerContext = {
|
|
56
|
+
player: mockPlayerAPI,
|
|
57
|
+
npoplayer: {
|
|
58
|
+
...mockNpoPlayer,
|
|
59
|
+
streamOptions: {
|
|
60
|
+
enableSubtitles: false
|
|
61
|
+
},
|
|
62
|
+
userPreferences: {
|
|
63
|
+
subtitles_enabled: 'false'
|
|
64
|
+
},
|
|
65
|
+
container: document.createElement('div'),
|
|
66
|
+
streamObject: {},
|
|
67
|
+
playerConfig: {},
|
|
68
|
+
initPlayer: () => { },
|
|
69
|
+
loadStream: () => Promise.resolve(),
|
|
70
|
+
createUIManager: async () => { },
|
|
71
|
+
doError: () => { },
|
|
72
|
+
play: async () => { },
|
|
73
|
+
pause: () => { },
|
|
74
|
+
setVolume: () => { },
|
|
75
|
+
increaseVolume: () => { },
|
|
76
|
+
decreaseVolume: () => { },
|
|
77
|
+
goForward: () => { },
|
|
78
|
+
goBackwards: () => { },
|
|
79
|
+
watchFromStart: () => { },
|
|
80
|
+
showPlayNextScreen: () => { },
|
|
81
|
+
updateMarkers: () => { },
|
|
82
|
+
cancelPlayNextScreen: () => { },
|
|
83
|
+
hidePlayNextScreen: () => { },
|
|
84
|
+
doPlayNext: () => { },
|
|
85
|
+
destroy: () => false,
|
|
86
|
+
unload: () => {
|
|
87
|
+
return true;
|
|
88
|
+
},
|
|
89
|
+
printVersion: () => { }
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
it('should set the volume based on local storage', () => {
|
|
94
|
+
localStorage.setItem('npoplayer-volume', JSON.stringify(50));
|
|
95
|
+
setValuesBasedOnLocalStorage(playerContext);
|
|
96
|
+
expect(mockPlayerAPI.setVolume).toHaveBeenCalledWith(50);
|
|
97
|
+
});
|
|
98
|
+
it('should mute the player if localStorage ismuted is true', () => {
|
|
99
|
+
localStorage.setItem('npoplayer-ismuted', JSON.stringify('true'));
|
|
100
|
+
setValuesBasedOnLocalStorage(playerContext);
|
|
101
|
+
expect(mockPlayerAPI.mute).toHaveBeenCalled();
|
|
102
|
+
});
|
|
103
|
+
it('should enable subtitles if localStorage subtitles_enabled is true', () => {
|
|
104
|
+
localStorage.setItem('npoplayer-subtitles_enabled', JSON.stringify('true'));
|
|
105
|
+
setValuesBasedOnLocalStorage(playerContext);
|
|
106
|
+
expect(playerContext.npoplayer.streamOptions.enableSubtitles).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PlayerAPI, PlayerEvent, PlayerEventCallback, SourceConfig, TimeMode, ViewMode } from 'bitmovin-player';
|
|
2
|
+
import { Technology } from 'types/interfaces';
|
|
3
|
+
export declare class NpoPlayerAPI {
|
|
4
|
+
playerAPI: PlayerAPI;
|
|
5
|
+
constructor(playerAPI: PlayerAPI);
|
|
6
|
+
load(sourceConfig: SourceConfig): Promise<void>;
|
|
7
|
+
play(): Promise<void>;
|
|
8
|
+
pause(): void;
|
|
9
|
+
mute(): void;
|
|
10
|
+
unmute(): void;
|
|
11
|
+
getVolume(): number;
|
|
12
|
+
setVolume(level: number): void;
|
|
13
|
+
setViewMode(viewMode: ViewMode): void;
|
|
14
|
+
getViewMode(): ViewMode;
|
|
15
|
+
areSubtitlesEnabled(): boolean;
|
|
16
|
+
enableSubtitles(): void;
|
|
17
|
+
isPaused(): boolean;
|
|
18
|
+
isMuted(): boolean;
|
|
19
|
+
getSupportedDRM(): Promise<string[]>;
|
|
20
|
+
getSupportedTech(): Technology[];
|
|
21
|
+
off(eventType: PlayerEvent, callback: PlayerEventCallback): void;
|
|
22
|
+
on(eventType: PlayerEvent, callback: PlayerEventCallback): void;
|
|
23
|
+
seek(time: number): void;
|
|
24
|
+
getContainer(): HTMLElement;
|
|
25
|
+
getNpoPlayerElement(): Element | null;
|
|
26
|
+
addClassToNpoPlayerElement(className: string): void | undefined;
|
|
27
|
+
removeClassFromNpoPlayerElement(className: string): void | undefined;
|
|
28
|
+
getCurrentTime(mode?: TimeMode | undefined): number;
|
|
29
|
+
getTimeShift(): number;
|
|
30
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export class NpoPlayerAPI {
|
|
2
|
+
constructor(playerAPI) {
|
|
3
|
+
this.playerAPI = playerAPI;
|
|
4
|
+
}
|
|
5
|
+
async load(sourceConfig) {
|
|
6
|
+
await this.playerAPI.load(sourceConfig);
|
|
7
|
+
}
|
|
8
|
+
async play() {
|
|
9
|
+
await this.playerAPI.play();
|
|
10
|
+
}
|
|
11
|
+
pause() {
|
|
12
|
+
this.playerAPI.pause();
|
|
13
|
+
}
|
|
14
|
+
mute() {
|
|
15
|
+
this.playerAPI.mute();
|
|
16
|
+
}
|
|
17
|
+
unmute() {
|
|
18
|
+
this.playerAPI.unmute();
|
|
19
|
+
}
|
|
20
|
+
getVolume() {
|
|
21
|
+
return this.playerAPI.getVolume();
|
|
22
|
+
}
|
|
23
|
+
setVolume(level) {
|
|
24
|
+
this.playerAPI.setVolume(level);
|
|
25
|
+
}
|
|
26
|
+
setViewMode(viewMode) {
|
|
27
|
+
this.playerAPI.setViewMode(viewMode);
|
|
28
|
+
}
|
|
29
|
+
getViewMode() {
|
|
30
|
+
return this.playerAPI.getViewMode();
|
|
31
|
+
}
|
|
32
|
+
areSubtitlesEnabled() {
|
|
33
|
+
let subsEnabled = false;
|
|
34
|
+
const currentSubtitleTrack = this.playerAPI.subtitles.list();
|
|
35
|
+
for (const subtitle of currentSubtitleTrack) {
|
|
36
|
+
if (subtitle.enabled) {
|
|
37
|
+
subsEnabled = true;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return subsEnabled;
|
|
42
|
+
}
|
|
43
|
+
enableSubtitles() {
|
|
44
|
+
const subtitleTracks = this.playerAPI.subtitles.list();
|
|
45
|
+
for (const subtitle of subtitleTracks) {
|
|
46
|
+
if (!subtitle.enabled) {
|
|
47
|
+
this.playerAPI.subtitles.enable(subtitle.id);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
isPaused() {
|
|
53
|
+
return this.playerAPI.isPaused();
|
|
54
|
+
}
|
|
55
|
+
isMuted() {
|
|
56
|
+
return this.playerAPI.isMuted();
|
|
57
|
+
}
|
|
58
|
+
async getSupportedDRM() {
|
|
59
|
+
return (await this.playerAPI.getSupportedDRM());
|
|
60
|
+
}
|
|
61
|
+
getSupportedTech() {
|
|
62
|
+
return this.playerAPI.getSupportedTech();
|
|
63
|
+
}
|
|
64
|
+
off(eventType, callback) {
|
|
65
|
+
this.playerAPI.off(eventType, callback);
|
|
66
|
+
}
|
|
67
|
+
on(eventType, callback) {
|
|
68
|
+
this.playerAPI.on(eventType, callback);
|
|
69
|
+
}
|
|
70
|
+
seek(time) {
|
|
71
|
+
this.playerAPI.seek(time);
|
|
72
|
+
}
|
|
73
|
+
getContainer() {
|
|
74
|
+
return this.playerAPI.getContainer();
|
|
75
|
+
}
|
|
76
|
+
getNpoPlayerElement() {
|
|
77
|
+
return this.getContainer().querySelector('.bmpui-npo-player');
|
|
78
|
+
}
|
|
79
|
+
addClassToNpoPlayerElement(className) {
|
|
80
|
+
this.getNpoPlayerElement()?.classList.add(className);
|
|
81
|
+
}
|
|
82
|
+
removeClassFromNpoPlayerElement(className) {
|
|
83
|
+
this.getNpoPlayerElement()?.classList.remove(className);
|
|
84
|
+
}
|
|
85
|
+
getCurrentTime(mode) {
|
|
86
|
+
return this.playerAPI.getCurrentTime(mode);
|
|
87
|
+
}
|
|
88
|
+
getTimeShift() {
|
|
89
|
+
return this.playerAPI.getTimeShift();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { NpoPlayerAPI } from './npoPlayerAPI';
|
|
2
|
+
describe('NpoPlayerAPI', () => {
|
|
3
|
+
let mockPlayerAPI;
|
|
4
|
+
let npoPlayerAPI;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
mockPlayerAPI = {
|
|
7
|
+
play: jest.fn(),
|
|
8
|
+
pause: jest.fn(),
|
|
9
|
+
mute: jest.fn(),
|
|
10
|
+
unmute: jest.fn(),
|
|
11
|
+
setViewMode: jest.fn(),
|
|
12
|
+
getViewMode: jest.fn(),
|
|
13
|
+
isPaused: jest.fn(),
|
|
14
|
+
isMuted: jest.fn()
|
|
15
|
+
};
|
|
16
|
+
npoPlayerAPI = new NpoPlayerAPI(mockPlayerAPI);
|
|
17
|
+
});
|
|
18
|
+
it('should call play on the PlayerAPI', async () => {
|
|
19
|
+
await npoPlayerAPI.play();
|
|
20
|
+
expect(mockPlayerAPI.play).toHaveBeenCalled();
|
|
21
|
+
});
|
|
22
|
+
it('should call pause on the PlayerAPI', () => {
|
|
23
|
+
npoPlayerAPI.pause();
|
|
24
|
+
expect(mockPlayerAPI.pause).toHaveBeenCalled();
|
|
25
|
+
});
|
|
26
|
+
it('should call mute on the PlayerAPI', () => {
|
|
27
|
+
npoPlayerAPI.mute();
|
|
28
|
+
expect(mockPlayerAPI.mute).toHaveBeenCalled();
|
|
29
|
+
});
|
|
30
|
+
it('should call unmute on the PlayerAPI', () => {
|
|
31
|
+
npoPlayerAPI.unmute();
|
|
32
|
+
expect(mockPlayerAPI.unmute).toHaveBeenCalled();
|
|
33
|
+
});
|
|
34
|
+
it('should call setViewMode on the PlayerAPI', () => {
|
|
35
|
+
const viewMode = 'fullscreen';
|
|
36
|
+
npoPlayerAPI.setViewMode(viewMode);
|
|
37
|
+
expect(mockPlayerAPI.setViewMode).toHaveBeenCalledWith(viewMode);
|
|
38
|
+
});
|
|
39
|
+
it('should call getViewMode on the PlayerAPI', () => {
|
|
40
|
+
npoPlayerAPI.getViewMode();
|
|
41
|
+
expect(mockPlayerAPI.getViewMode).toHaveBeenCalled();
|
|
42
|
+
});
|
|
43
|
+
it('should call isPaused on the PlayerAPI', () => {
|
|
44
|
+
npoPlayerAPI.isPaused();
|
|
45
|
+
expect(mockPlayerAPI.isPaused).toHaveBeenCalled();
|
|
46
|
+
});
|
|
47
|
+
it('should call isMuted on the PlayerAPI', () => {
|
|
48
|
+
npoPlayerAPI.isMuted();
|
|
49
|
+
expect(mockPlayerAPI.isMuted).toHaveBeenCalled();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PlayerEvent } from 'bitmovin-player';
|
|
2
|
+
import { handleSegmentTimeChanged } from './handleSegmentTimeChanged';
|
|
3
|
+
import { handleSegmentSeek } from './handleSegmentSeek';
|
|
4
|
+
export const addSegmentEventListeners = (playerContext, segment) => {
|
|
5
|
+
const segmentHandleTimeChangedCallback = handleSegmentTimeChanged(playerContext, segment);
|
|
6
|
+
const segmentSeekFunctionCallback = handleSegmentSeek(playerContext, segment);
|
|
7
|
+
const { player, npoplayer } = playerContext;
|
|
8
|
+
player.on(PlayerEvent.TimeChanged, segmentHandleTimeChangedCallback);
|
|
9
|
+
player.on(PlayerEvent.Seek, segmentSeekFunctionCallback);
|
|
10
|
+
npoplayer.eventListeners = {
|
|
11
|
+
segmentHandleTimeChangedCallback,
|
|
12
|
+
segmentSeekFunctionCallback
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PlayerEvent } from 'bitmovin-player';
|
|
2
|
+
import { addSegmentEventListeners } from './addSegmentEventListeners';
|
|
3
|
+
import { handleSegmentTimeChanged } from './handleSegmentTimeChanged';
|
|
4
|
+
import { handleSegmentSeek } from './handleSegmentSeek';
|
|
5
|
+
import { mockPlayerContext } from '../../../tests/mocks/mockPlayerContext';
|
|
6
|
+
jest.mock('./handleSegmentTimeChanged', () => ({
|
|
7
|
+
handleSegmentTimeChanged: jest.fn()
|
|
8
|
+
}));
|
|
9
|
+
jest.mock('./handleSegmentSeek', () => ({
|
|
10
|
+
handleSegmentSeek: jest.fn()
|
|
11
|
+
}));
|
|
12
|
+
describe('addSegmentEventListeners', () => {
|
|
13
|
+
const segment = { inpoint: 10, outpoint: 20, duration: 10 };
|
|
14
|
+
const context = { ...mockPlayerContext };
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
jest.clearAllMocks();
|
|
17
|
+
});
|
|
18
|
+
it('should add TimeChanged event listener', () => {
|
|
19
|
+
const segmentHandleTimeChangedCallback = jest.fn();
|
|
20
|
+
handleSegmentTimeChanged.mockReturnValue(segmentHandleTimeChangedCallback);
|
|
21
|
+
addSegmentEventListeners(context, segment);
|
|
22
|
+
expect(context.player.on).toHaveBeenCalledWith(PlayerEvent.TimeChanged, segmentHandleTimeChangedCallback);
|
|
23
|
+
expect(handleSegmentTimeChanged).toHaveBeenCalledWith(context, segment);
|
|
24
|
+
});
|
|
25
|
+
it('should add Seek event listener', () => {
|
|
26
|
+
const segmentSeekFunctionCallback = jest.fn();
|
|
27
|
+
handleSegmentSeek.mockReturnValue(segmentSeekFunctionCallback);
|
|
28
|
+
addSegmentEventListeners(mockPlayerContext, segment);
|
|
29
|
+
expect(context.player.on).toHaveBeenCalledWith(PlayerEvent.Seek, segmentSeekFunctionCallback);
|
|
30
|
+
expect(handleSegmentSeek).toHaveBeenCalledWith(context, segment);
|
|
31
|
+
});
|
|
32
|
+
it('should set segmentEventListeners in playerContext', () => {
|
|
33
|
+
const segmentHandleTimeChangedCallback = jest.fn();
|
|
34
|
+
const segmentSeekFunctionCallback = jest.fn();
|
|
35
|
+
handleSegmentTimeChanged.mockReturnValue(segmentHandleTimeChangedCallback);
|
|
36
|
+
handleSegmentSeek.mockReturnValue(segmentSeekFunctionCallback);
|
|
37
|
+
addSegmentEventListeners(context, segment);
|
|
38
|
+
expect(context.npoplayer.eventListeners).toEqual({
|
|
39
|
+
segmentHandleTimeChangedCallback,
|
|
40
|
+
segmentSeekFunctionCallback
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { convertFragmentToSegment } from './convertFragmentToSegment';
|
|
2
|
+
describe('convertFragmentToSegment', () => {
|
|
3
|
+
const SECTION_START = 500;
|
|
4
|
+
const SECTION_DURATION = 610;
|
|
5
|
+
it('should convert fragment to segment correctly', () => {
|
|
6
|
+
const fragment = {
|
|
7
|
+
sections: [{ time: SECTION_START, duration: SECTION_DURATION, title: 'Section 1' }]
|
|
8
|
+
};
|
|
9
|
+
const expectedSegment = {
|
|
10
|
+
inpoint: SECTION_START,
|
|
11
|
+
outpoint: SECTION_START + SECTION_DURATION,
|
|
12
|
+
duration: SECTION_DURATION
|
|
13
|
+
};
|
|
14
|
+
const result = convertFragmentToSegment(fragment);
|
|
15
|
+
expect(result).toEqual(expectedSegment);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PlayerContext, Segment } from 'types/interfaces';
|
|
2
|
+
export declare const handleSegmentSeek: (playerContext: PlayerContext, segment: Segment) => (e: any) => void;
|
|
3
|
+
export declare const getSeekTarget: (event: any) => number;
|
|
4
|
+
export declare const isSeekOutsideSegment: (seekTarget: number, segment: Segment) => boolean;
|
|
5
|
+
export declare const clampSeekTarget: (seekTarget: number, segment: Segment) => number;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const handleSegmentSeek = (playerContext, segment) => (e) => {
|
|
2
|
+
const seekTarget = getSeekTarget(e);
|
|
3
|
+
if (isSeekOutsideSegment(seekTarget, segment)) {
|
|
4
|
+
playerContext.player.seek(clampSeekTarget(seekTarget, segment));
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
export const getSeekTarget = (event) => {
|
|
8
|
+
return event.seekTarget ? event.seekTarget : event.to.time;
|
|
9
|
+
};
|
|
10
|
+
export const isSeekOutsideSegment = (seekTarget, segment) => {
|
|
11
|
+
return seekTarget > segment.outpoint || seekTarget < segment.inpoint;
|
|
12
|
+
};
|
|
13
|
+
export const clampSeekTarget = (seekTarget, segment) => {
|
|
14
|
+
return Math.max(segment.inpoint, Math.min(segment.outpoint, seekTarget));
|
|
15
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { handleSegmentSeek, getSeekTarget, isSeekOutsideSegment, clampSeekTarget } from './handleSegmentSeek';
|
|
2
|
+
import { mockPlayerContext } from '../../../tests/mocks/mockPlayerContext';
|
|
3
|
+
describe('segmentHandler', () => {
|
|
4
|
+
const SEGMENT_INPOINT = 500;
|
|
5
|
+
const SEGMENT_OUTPOINT = 1500;
|
|
6
|
+
const SEGMENT_DURATION = 1000;
|
|
7
|
+
const SEEK_TARGET_WITHIN = 800;
|
|
8
|
+
const SEEK_TARGET_ABOVE = 1600;
|
|
9
|
+
const SEEK_TARGET_BELOW = 400;
|
|
10
|
+
let segment;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
segment = {
|
|
13
|
+
inpoint: SEGMENT_INPOINT,
|
|
14
|
+
outpoint: SEGMENT_OUTPOINT,
|
|
15
|
+
duration: SEGMENT_DURATION
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
jest.clearAllMocks();
|
|
20
|
+
});
|
|
21
|
+
describe('getSeekTarget', () => {
|
|
22
|
+
it('should return seekTarget if present in event', () => {
|
|
23
|
+
const event = { seekTarget: SEEK_TARGET_WITHIN };
|
|
24
|
+
expect(getSeekTarget(event)).toBe(SEEK_TARGET_WITHIN);
|
|
25
|
+
});
|
|
26
|
+
it('should return event.to.time if seekTarget is not present', () => {
|
|
27
|
+
const event = { to: { time: SEEK_TARGET_WITHIN } };
|
|
28
|
+
expect(getSeekTarget(event)).toBe(SEEK_TARGET_WITHIN);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('isSeekOutsideSegment', () => {
|
|
32
|
+
it('should return true if seekTarget is greater than segment.outpoint', () => {
|
|
33
|
+
expect(isSeekOutsideSegment(SEEK_TARGET_ABOVE, segment)).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
it('should return true if seekTarget is less than segment.inpoint', () => {
|
|
36
|
+
expect(isSeekOutsideSegment(SEEK_TARGET_BELOW, segment)).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('should return false if seekTarget is within segment bounds', () => {
|
|
39
|
+
expect(isSeekOutsideSegment(SEEK_TARGET_WITHIN, segment)).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('clampSeekTarget', () => {
|
|
43
|
+
it('should return inpoint if seekTarget is less than inpoint', () => {
|
|
44
|
+
expect(clampSeekTarget(SEEK_TARGET_BELOW, segment)).toBe(SEGMENT_INPOINT);
|
|
45
|
+
});
|
|
46
|
+
it('should return outpoint if seekTarget is greater than outpoint', () => {
|
|
47
|
+
expect(clampSeekTarget(SEEK_TARGET_ABOVE, segment)).toBe(SEGMENT_OUTPOINT);
|
|
48
|
+
});
|
|
49
|
+
it('should return seekTarget if it is within segment bounds', () => {
|
|
50
|
+
expect(clampSeekTarget(SEEK_TARGET_WITHIN, segment)).toBe(SEEK_TARGET_WITHIN);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('handleSegmentSeek', () => {
|
|
54
|
+
it('should seek to the clamped seekTarget if outside segment', () => {
|
|
55
|
+
const event = { seekTarget: SEEK_TARGET_ABOVE };
|
|
56
|
+
const handler = handleSegmentSeek(mockPlayerContext, segment);
|
|
57
|
+
handler(event);
|
|
58
|
+
expect(mockPlayerContext.player.seek).toHaveBeenCalledWith(SEGMENT_OUTPOINT);
|
|
59
|
+
});
|
|
60
|
+
it('should not seek if the seekTarget is within segment', () => {
|
|
61
|
+
const event = { seekTarget: SEEK_TARGET_WITHIN };
|
|
62
|
+
const handler = handleSegmentSeek(mockPlayerContext, segment);
|
|
63
|
+
handler(event);
|
|
64
|
+
expect(mockPlayerContext.player.seek).not.toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
it('should seek to the clamped seekTarget using event.to.time', () => {
|
|
67
|
+
const event = { to: { time: SEEK_TARGET_ABOVE } };
|
|
68
|
+
const handler = handleSegmentSeek(mockPlayerContext, segment);
|
|
69
|
+
handler(event);
|
|
70
|
+
expect(mockPlayerContext.player.seek).toHaveBeenCalledWith(SEGMENT_OUTPOINT);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|