@npo/player 1.9.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/CHANGELOG.md +3 -0
- package/LICENSE +15 -0
- package/README.md +281 -0
- package/lib/js/ads/ster.d.ts +4 -0
- package/lib/js/ads/ster.js +159 -0
- package/lib/js/ads/ster.js.map +1 -0
- package/lib/js/ads/ster.test.d.ts +1 -0
- package/lib/js/ads/ster.test.js +91 -0
- package/lib/js/ads/ster.test.js.map +1 -0
- package/lib/js/api/getstreamobject.d.ts +3 -0
- package/lib/js/api/getstreamobject.js +19 -0
- package/lib/js/api/getstreamobject.js.map +1 -0
- package/lib/js/cdnproviders.d.ts +1 -0
- package/lib/js/cdnproviders.js +13 -0
- package/lib/js/cdnproviders.js.map +1 -0
- package/lib/js/checks/safari.d.ts +1 -0
- package/lib/js/checks/safari.js +10 -0
- package/lib/js/checks/safari.js.map +1 -0
- package/lib/js/checks/safari.test.d.ts +1 -0
- package/lib/js/checks/safari.test.js +21 -0
- package/lib/js/checks/safari.test.js.map +1 -0
- package/lib/js/drm/verifydrm.d.ts +4 -0
- package/lib/js/drm/verifydrm.js +38 -0
- package/lib/js/drm/verifydrm.js.map +1 -0
- package/lib/js/drm/verifydrm.test.d.ts +1 -0
- package/lib/js/drm/verifydrm.test.js +18 -0
- package/lib/js/drm/verifydrm.test.js.map +1 -0
- package/lib/js/fragments/setfragments.d.ts +3 -0
- package/lib/js/fragments/setfragments.js +68 -0
- package/lib/js/fragments/setfragments.js.map +1 -0
- package/lib/js/playeractions/customerrors.test.d.ts +1 -0
- package/lib/js/playeractions/customerrors.test.js +52 -0
- package/lib/js/playeractions/customerrors.test.js.map +1 -0
- package/lib/js/playeractions/handlers/customerrors.d.ts +50 -0
- package/lib/js/playeractions/handlers/customerrors.js +154 -0
- package/lib/js/playeractions/handlers/customerrors.js.map +1 -0
- package/lib/js/playeractions/handlers/error.d.ts +3 -0
- package/lib/js/playeractions/handlers/error.js +23 -0
- package/lib/js/playeractions/handlers/error.js.map +1 -0
- package/lib/js/playeractions/handlers/error.test.d.ts +1 -0
- package/lib/js/playeractions/handlers/error.test.js +45 -0
- package/lib/js/playeractions/handlers/error.test.js.map +1 -0
- package/lib/js/playeractions/handlers/handleoffsets.d.ts +6 -0
- package/lib/js/playeractions/handlers/handleoffsets.js +71 -0
- package/lib/js/playeractions/handlers/handleoffsets.js.map +1 -0
- package/lib/js/playeractions/handlers/handleoffsets.test.d.ts +1 -0
- package/lib/js/playeractions/handlers/handleoffsets.test.js +50 -0
- package/lib/js/playeractions/handlers/handleoffsets.test.js.map +1 -0
- package/lib/js/playeractions/handlers/resolvekeypress.d.ts +3 -0
- package/lib/js/playeractions/handlers/resolvekeypress.js +55 -0
- package/lib/js/playeractions/handlers/resolvekeypress.js.map +1 -0
- package/lib/js/playeractions/playeractions.d.ts +3 -0
- package/lib/js/playeractions/playeractions.js +4 -0
- package/lib/js/playeractions/playeractions.js.map +1 -0
- package/lib/js/tracking/handlers/eventbinding.d.ts +10 -0
- package/lib/js/tracking/handlers/eventbinding.js +86 -0
- package/lib/js/tracking/handlers/eventbinding.js.map +1 -0
- package/lib/js/tracking/handlers/eventlogging.d.ts +11 -0
- package/lib/js/tracking/handlers/eventlogging.js +42 -0
- package/lib/js/tracking/handlers/eventlogging.js.map +1 -0
- package/lib/js/tracking/handlers/playertrackerinit.d.ts +13 -0
- package/lib/js/tracking/handlers/playertrackerinit.js +29 -0
- package/lib/js/tracking/handlers/playertrackerinit.js.map +1 -0
- package/lib/js/tracking/handlers/playertrackerstart.d.ts +8 -0
- package/lib/js/tracking/handlers/playertrackerstart.js +29 -0
- package/lib/js/tracking/handlers/playertrackerstart.js.map +1 -0
- package/lib/js/tracking/playertracker.d.ts +4 -0
- package/lib/js/tracking/playertracker.js +10 -0
- package/lib/js/tracking/playertracker.js.map +1 -0
- package/lib/js/ui/components/adbutton.d.ts +7 -0
- package/lib/js/ui/components/adbutton.js +21 -0
- package/lib/js/ui/components/adbutton.js.map +1 -0
- package/lib/js/ui/components/adlabel.d.ts +7 -0
- package/lib/js/ui/components/adlabel.js +17 -0
- package/lib/js/ui/components/adlabel.js.map +1 -0
- package/lib/js/ui/components/buttons.d.ts +30 -0
- package/lib/js/ui/components/buttons.js +89 -0
- package/lib/js/ui/components/buttons.js.map +1 -0
- package/lib/js/ui/components/controlbar.d.ts +3 -0
- package/lib/js/ui/components/controlbar.js +47 -0
- package/lib/js/ui/components/controlbar.js.map +1 -0
- package/lib/js/ui/components/ctabar.d.ts +9 -0
- package/lib/js/ui/components/ctabar.js +41 -0
- package/lib/js/ui/components/ctabar.js.map +1 -0
- package/lib/js/ui/components/nativemobile/buttons.d.ts +13 -0
- package/lib/js/ui/components/nativemobile/buttons.js +43 -0
- package/lib/js/ui/components/nativemobile/buttons.js.map +1 -0
- package/lib/js/ui/components/nativemobile/controlbar.d.ts +2 -0
- package/lib/js/ui/components/nativemobile/controlbar.js +23 -0
- package/lib/js/ui/components/nativemobile/controlbar.js.map +1 -0
- package/lib/js/ui/components/nativemobile/ctabar.d.ts +10 -0
- package/lib/js/ui/components/nativemobile/ctabar.js +12 -0
- package/lib/js/ui/components/nativemobile/ctabar.js.map +1 -0
- package/lib/js/ui/components/nativemobile/playnext.d.ts +10 -0
- package/lib/js/ui/components/nativemobile/playnext.js +16 -0
- package/lib/js/ui/components/nativemobile/playnext.js.map +1 -0
- package/lib/js/ui/components/nativemobile/topbar.d.ts +3 -0
- package/lib/js/ui/components/nativemobile/topbar.js +21 -0
- package/lib/js/ui/components/nativemobile/topbar.js.map +1 -0
- package/lib/js/ui/components/playnext.d.ts +11 -0
- package/lib/js/ui/components/playnext.js +11 -0
- package/lib/js/ui/components/playnext.js.map +1 -0
- package/lib/js/ui/components/settingspanel.d.ts +4 -0
- package/lib/js/ui/components/settingspanel.js +130 -0
- package/lib/js/ui/components/settingspanel.js.map +1 -0
- package/lib/js/ui/components/shared/playnextscreen.d.ts +2 -0
- package/lib/js/ui/components/shared/playnextscreen.js +18 -0
- package/lib/js/ui/components/shared/playnextscreen.js.map +1 -0
- package/lib/js/ui/components/titlebar.d.ts +3 -0
- package/lib/js/ui/components/titlebar.js +9 -0
- package/lib/js/ui/components/titlebar.js.map +1 -0
- package/lib/js/ui/components/topbar.d.ts +2 -0
- package/lib/js/ui/components/topbar.js +19 -0
- package/lib/js/ui/components/topbar.js.map +1 -0
- package/lib/js/ui/handlers/listboxhandlers.d.ts +5 -0
- package/lib/js/ui/handlers/listboxhandlers.js +41 -0
- package/lib/js/ui/handlers/listboxhandlers.js.map +1 -0
- package/lib/js/ui/handlers/nicamhandler.d.ts +2 -0
- package/lib/js/ui/handlers/nicamhandler.js +32 -0
- package/lib/js/ui/handlers/nicamhandler.js.map +1 -0
- package/lib/js/ui/handlers/nicamhandler.test.d.ts +1 -0
- package/lib/js/ui/handlers/nicamhandler.test.js +34 -0
- package/lib/js/ui/handlers/nicamhandler.test.js.map +1 -0
- package/lib/js/ui/handlers/playnexthandlers.d.ts +0 -0
- package/lib/js/ui/handlers/playnexthandlers.js +2 -0
- package/lib/js/ui/handlers/playnexthandlers.js.map +1 -0
- package/lib/js/ui/handlers/timecontrolhandlers.d.ts +3 -0
- package/lib/js/ui/handlers/timecontrolhandlers.js +23 -0
- package/lib/js/ui/handlers/timecontrolhandlers.js.map +1 -0
- package/lib/js/ui/nativemobileui.d.ts +6 -0
- package/lib/js/ui/nativemobileui.js +49 -0
- package/lib/js/ui/nativemobileui.js.map +1 -0
- package/lib/js/ui/uicontainer.d.ts +3 -0
- package/lib/js/ui/uicontainer.js +61 -0
- package/lib/js/ui/uicontainer.js.map +1 -0
- package/lib/js/utilities/localizationconfig.d.ts +6 -0
- package/lib/js/utilities/localizationconfig.js +8 -0
- package/lib/js/utilities/localizationconfig.js.map +1 -0
- package/lib/js/utilities/printversion.d.ts +1 -0
- package/lib/js/utilities/printversion.js +28 -0
- package/lib/js/utilities/printversion.js.map +1 -0
- package/lib/js/utilities/utilities.d.ts +60 -0
- package/lib/js/utilities/utilities.js +110 -0
- package/lib/js/utilities/utilities.js.map +1 -0
- package/lib/lang/nl.json +72 -0
- package/lib/npoplayer.d.ts +45 -0
- package/lib/npoplayer.js +518 -0
- package/lib/npoplayer.js.map +1 -0
- package/lib/npoplayer.test.d.ts +1 -0
- package/lib/npoplayer.test.js +12 -0
- package/lib/npoplayer.test.js.map +1 -0
- package/lib/package.json +88 -0
- package/lib/src/js/ads/ster.d.ts +4 -0
- package/lib/src/js/ads/ster.test.d.ts +1 -0
- package/lib/src/js/api/getstreamobject.d.ts +3 -0
- package/lib/src/js/cdnproviders.d.ts +1 -0
- package/lib/src/js/checks/safari.d.ts +1 -0
- package/lib/src/js/checks/safari.test.d.ts +1 -0
- package/lib/src/js/drm/verifydrm.d.ts +4 -0
- package/lib/src/js/drm/verifydrm.test.d.ts +1 -0
- package/lib/src/js/fragments/setfragments.d.ts +3 -0
- package/lib/src/js/playeractions/customerrors.test.d.ts +1 -0
- package/lib/src/js/playeractions/handlers/customerrors.d.ts +50 -0
- package/lib/src/js/playeractions/handlers/error.d.ts +3 -0
- package/lib/src/js/playeractions/handlers/error.test.d.ts +1 -0
- package/lib/src/js/playeractions/handlers/handleoffsets.d.ts +6 -0
- package/lib/src/js/playeractions/handlers/handleoffsets.test.d.ts +1 -0
- package/lib/src/js/playeractions/handlers/resolvekeypress.d.ts +3 -0
- package/lib/src/js/playeractions/playeractions.d.ts +3 -0
- package/lib/src/js/tracking/handlers/eventbinding.d.ts +10 -0
- package/lib/src/js/tracking/handlers/eventlogging.d.ts +11 -0
- package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +13 -0
- package/lib/src/js/tracking/handlers/playertrackerstart.d.ts +8 -0
- package/lib/src/js/tracking/playertracker.d.ts +4 -0
- package/lib/src/js/ui/components/adbutton.d.ts +7 -0
- package/lib/src/js/ui/components/adlabel.d.ts +7 -0
- package/lib/src/js/ui/components/buttons.d.ts +30 -0
- package/lib/src/js/ui/components/controlbar.d.ts +3 -0
- package/lib/src/js/ui/components/ctabar.d.ts +9 -0
- package/lib/src/js/ui/components/nativemobile/buttons.d.ts +13 -0
- package/lib/src/js/ui/components/nativemobile/controlbar.d.ts +2 -0
- package/lib/src/js/ui/components/nativemobile/ctabar.d.ts +10 -0
- package/lib/src/js/ui/components/nativemobile/playnext.d.ts +10 -0
- package/lib/src/js/ui/components/nativemobile/topbar.d.ts +3 -0
- package/lib/src/js/ui/components/playnext.d.ts +11 -0
- package/lib/src/js/ui/components/settingspanel.d.ts +4 -0
- package/lib/src/js/ui/components/shared/playnextscreen.d.ts +2 -0
- package/lib/src/js/ui/components/titlebar.d.ts +3 -0
- package/lib/src/js/ui/components/topbar.d.ts +2 -0
- package/lib/src/js/ui/handlers/listboxhandlers.d.ts +5 -0
- package/lib/src/js/ui/handlers/nicamhandler.d.ts +2 -0
- package/lib/src/js/ui/handlers/nicamhandler.test.d.ts +1 -0
- package/lib/src/js/ui/handlers/playnexthandlers.d.ts +0 -0
- package/lib/src/js/ui/handlers/timecontrolhandlers.d.ts +3 -0
- package/lib/src/js/ui/nativemobileui.d.ts +6 -0
- package/lib/src/js/ui/uicontainer.d.ts +3 -0
- package/lib/src/js/utilities/localizationconfig.d.ts +6 -0
- package/lib/src/js/utilities/printversion.d.ts +1 -0
- package/lib/src/js/utilities/utilities.d.ts +60 -0
- package/lib/src/npoplayer.d.ts +45 -0
- package/lib/src/npoplayer.test.d.ts +1 -0
- package/lib/src/types/classes.d.ts +4 -0
- package/lib/src/types/interfaces.d.ts +105 -0
- package/lib/types/classes.d.ts +4 -0
- package/lib/types/classes.js +4 -0
- package/lib/types/classes.js.map +1 -0
- package/lib/types/interfaces.d.ts +105 -0
- package/lib/types/interfaces.js +6 -0
- package/lib/types/interfaces.js.map +1 -0
- package/package.json +88 -0
- package/src/scss/components/_advert.scss +74 -0
- package/src/scss/components/_buffering.scss +6 -0
- package/src/scss/components/_container.scss +8 -0
- package/src/scss/components/_controlbars.scss +36 -0
- package/src/scss/components/_error.scss +26 -0
- package/src/scss/components/_fonts.scss +19 -0
- package/src/scss/components/_icons.scss +241 -0
- package/src/scss/components/_nicam.scss +61 -0
- package/src/scss/components/_playnext.scss +52 -0
- package/src/scss/components/_seekbar.scss +116 -0
- package/src/scss/components/_settingspanel.scss +196 -0
- package/src/scss/components/_subtitles.scss +32 -0
- package/src/scss/components/_textbuttons.scss +42 -0
- package/src/scss/components/_volumeslider.scss +23 -0
- package/src/scss/npoplayer.css +1238 -0
- package/src/scss/npoplayer.scss +37 -0
- package/src/scss/variants/_player-base.scss +64 -0
- package/src/scss/variants/_player-large.scss +56 -0
- package/src/scss/variants/_player-medium.scss +57 -0
- package/src/scss/variants/_player-small.scss +234 -0
- package/src/scss/vars/_colors.scss +24 -0
- package/src/scss/vars/_fonts.scss +20 -0
- package/src/scss/vars/_icons.scss +37 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
The ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) NPO
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
15
|
+
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
[](https://npo.nl)
|
|
2
|
+
|
|
3
|
+
# Publieke Omroep Player
|
|
4
|
+
|
|
5
|
+
The video player library for NPO and other broadcasters.
|
|
6
|
+
|
|
7
|
+
# Documentation
|
|
8
|
+
More extensive and up-to-date documentation is available at https://docs.npoplayer.nl
|
|
9
|
+
|
|
10
|
+
# Installing using npm
|
|
11
|
+
|
|
12
|
+
**If you are not using npm, skip to Import to use the js and css from the CDN.**
|
|
13
|
+
|
|
14
|
+
The player is hosted on our private NPM registry, so in order to install it you must add this registry to the context of the package manager.
|
|
15
|
+
In your project, add a file named '.npmrc' and add this line:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
always-auth=true
|
|
19
|
+
@npoplayer:registry=https://pkgs.dev.azure.com/NPOplayer/_packaging/NPOplayer/npm/registry/
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
##### For Mac:
|
|
23
|
+
|
|
24
|
+
Add this to your user's .npmrc file and replace the \[BASE64_ENCODED_ACCESS_KEY\] with the key you are provided.
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
; begin auth token
|
|
28
|
+
//pkgs.dev.azure.com/NPOplayer/_packaging/NPOplayer/npm/registry/:username=NPOplayer
|
|
29
|
+
//pkgs.dev.azure.com/NPOplayer/_packaging/NPOplayer/npm/registry/:_password=[BASE64_ENCODED_ACCESS_KEY]
|
|
30
|
+
//pkgs.dev.azure.com/NPOplayer/_packaging/NPOplayer/npm/registry/:email=npm requires email to be set but doesn't use the value
|
|
31
|
+
//pkgs.dev.azure.com/NPOplayer/_packaging/NPOplayer/npm/:username=NPOplayer
|
|
32
|
+
//pkgs.dev.azure.com/NPOplayer/_packaging/NPOplayer/npm/:_password=[BASE64_ENCODED_ACCESS_KEY]
|
|
33
|
+
//pkgs.dev.azure.com/NPOplayer/_packaging/NPOplayer/npm/:email=npm requires email to be set but doesn't use the value
|
|
34
|
+
; end auth token
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
##### For Windows:
|
|
38
|
+
|
|
39
|
+
Run this command to add the token to your user's .npmrc file:
|
|
40
|
+
|
|
41
|
+
```shell
|
|
42
|
+
vsts-npm-auth -config .npmrc
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
##### Install from registry
|
|
46
|
+
|
|
47
|
+
After adding the access token and the registry you can install the package:
|
|
48
|
+
|
|
49
|
+
```shell
|
|
50
|
+
npm install npoplayer
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
# Import
|
|
54
|
+
|
|
55
|
+
## NPM
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
import 'npoplayer/src/scss/npoplayer.scss';
|
|
59
|
+
import NpoPlayer from 'npoplayer';
|
|
60
|
+
window.npoplayer = NpoPlayer;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## CDN
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
<script src="https://npoplayer-test.s3.eu-central-1.amazonaws.com/assets/build/npoplayer.js" type="text/javascript"></script>
|
|
67
|
+
<link rel="stylesheet" href="https://npoplayer-test.s3.eu-central-1.amazonaws.com/assets/build/npoplayer.css"></style>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
# Basic usage
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
let player = new npoplayer(container, playerConfig, npotag?, npotaginstance?);
|
|
74
|
+
player.loadStream(jwt);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The parameters `container`, `playerConfig`, `npotag` (optional), `npotag` (optional), `jwt` passed to the functions need to be defined as below.
|
|
78
|
+
|
|
79
|
+
# JWT
|
|
80
|
+
|
|
81
|
+
The player library makes use of the JSON Web Token (JWT) technology. More information about using JWT can be found at this website [JWT.IO - JSON Web Tokens Introduction]
|
|
82
|
+
|
|
83
|
+
**Create your own unique JWT for each PRID**
|
|
84
|
+
|
|
85
|
+
To be able to load your stream for any player you need to make use of a [self generated JWT].
|
|
86
|
+
|
|
87
|
+
**JWT header:**
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"alg": "HS256",
|
|
92
|
+
"typ": "JWT"
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Payload:**
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"iat": timestamp,
|
|
105
|
+
"sub": "<< PRID >>",
|
|
106
|
+
"iss": "<< YOUR BROADCASTER NAME",
|
|
107
|
+
"cip": "<< IP FROM CLIENT >>",
|
|
108
|
+
"age": "26"
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Sign JWT:**
|
|
113
|
+
|
|
114
|
+
```js
|
|
115
|
+
HMACSHA256(
|
|
116
|
+
base64UrlEncode(header) + '.' + base64UrlEncode(payload),
|
|
117
|
+
your - 256 - bit - secret
|
|
118
|
+
);
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Example of generated JWT:**
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
For every new request you make to the player library a new JWT needs to be sent to the NPO player library
|
|
128
|
+
|
|
129
|
+
## Player Container
|
|
130
|
+
|
|
131
|
+
The player SDK needs to know within which container it should render its video and UI components. In this example a `div`-element is used with a unique `id="my-player"`, which is the recommended approach in general.
|
|
132
|
+
|
|
133
|
+
```html
|
|
134
|
+
<div id="my-player"></div>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Create a Player Configuration
|
|
138
|
+
|
|
139
|
+
A minimal player configuration requires the `key` property to be present, which expects a Player License Key. When served on `localhost`, no valid player license key is required to simplify development efforts.
|
|
140
|
+
|
|
141
|
+
```js
|
|
142
|
+
let playerConfig = {
|
|
143
|
+
key: '<< KEY >>'
|
|
144
|
+
};
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
You can however add optional values to customize the players' behaviour. For player events, (for now) you need to import it from the Bitmovin library with `import {PlayerEvent} from "bitmovin-player";`
|
|
148
|
+
|
|
149
|
+
```js
|
|
150
|
+
let playerConfig = {
|
|
151
|
+
key: '<< KEY >>',
|
|
152
|
+
analytics: {
|
|
153
|
+
key: '<< ANALYTICS KEY >>'
|
|
154
|
+
},
|
|
155
|
+
playback: {
|
|
156
|
+
muted: false,
|
|
157
|
+
autoplay: true
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Create an NPO Tag instance
|
|
163
|
+
|
|
164
|
+
For analytics purposes you can add and existing NPO Tag instance to the player or properties to create one.
|
|
165
|
+
|
|
166
|
+
```js
|
|
167
|
+
let npotag = {
|
|
168
|
+
brand: '[YOUR_COMPANY]',
|
|
169
|
+
brand_id: 1,
|
|
170
|
+
platform: '[web/ios/android]',
|
|
171
|
+
platform_version: '[YOUR_PLATFORM_VERSION]',
|
|
172
|
+
debug: false
|
|
173
|
+
};
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Optional: Options
|
|
177
|
+
|
|
178
|
+
There are several options you can use for the players behaviour.
|
|
179
|
+
|
|
180
|
+
```js
|
|
181
|
+
let options = {
|
|
182
|
+
//properties
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
player.loadStream(jwt, options);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Available properties**
|
|
189
|
+
`sourceConfig` - object: used for defining information about the source
|
|
190
|
+
`fragments` - object: used for defining and playing fragments
|
|
191
|
+
`endpoint` - string: the endpoint used to get the stream-link
|
|
192
|
+
|
|
193
|
+
The following properties need to be added directly into the options object.
|
|
194
|
+
|
|
195
|
+
**Source configuration**
|
|
196
|
+
The source configuration is used for defining information about the source like title, description, dash streamurl, hls streamurl, drm, subtitles, thumbnails etc.
|
|
197
|
+
The configuration is created by the library but you can overwrite this by adding a custom config to the `loadStream` function
|
|
198
|
+
|
|
199
|
+
```js
|
|
200
|
+
let options = {
|
|
201
|
+
/* ... */
|
|
202
|
+
sourceConfig: {
|
|
203
|
+
title: 'Video title',
|
|
204
|
+
description: 'Video description',
|
|
205
|
+
poster: '<POSTER IMAGE URL>',
|
|
206
|
+
thumbnailTrack: '<THUMBNAIL TRACK URL>',
|
|
207
|
+
subtitleTracks: [
|
|
208
|
+
{
|
|
209
|
+
url: '<SUBTITLE TRACK URL>'
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
analytics: {
|
|
213
|
+
title: 'Program title - Episode title'
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
player.loadStream(jwt, options);
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Fragments**
|
|
222
|
+
If you want to load a fragment of a video you can use the fragments property:
|
|
223
|
+
(currently there is only support for one fragment)
|
|
224
|
+
|
|
225
|
+
```js
|
|
226
|
+
let options = {
|
|
227
|
+
/* ... */
|
|
228
|
+
fragments: {
|
|
229
|
+
sections: [{ time: 500, duration: 610, title: 'Section 1' }]
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
player.loadStream(jwt, options);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Create a new Player Instance
|
|
237
|
+
|
|
238
|
+
Initiate a new player instance by providing it with a reference to the DOM element of your player-div and the player configuration object you defined earlier.
|
|
239
|
+
Then load a video or stream with the generated JWT and an optional sourceConfig.
|
|
240
|
+
|
|
241
|
+
```js
|
|
242
|
+
let container = document.getElementById('my-player');
|
|
243
|
+
let jwt = '<< OWN CREATED JWT >>';
|
|
244
|
+
|
|
245
|
+
let player = new npoplayer(container, options);
|
|
246
|
+
player.loadStream(jwt);
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Customize the player colors
|
|
250
|
+
|
|
251
|
+
The player colors can be edited by using the CSS variables that are exposed by the player. The variables are prefixed with `--npo-player-`.
|
|
252
|
+
The variables can be used in the following way:
|
|
253
|
+
|
|
254
|
+
```css
|
|
255
|
+
#my-player {
|
|
256
|
+
--npo-player-white: #ffffff;
|
|
257
|
+
--npo-player-primarycolor: #ff6d00;
|
|
258
|
+
--npo-player-secondarycolor: #1f3353;
|
|
259
|
+
--npo-player-textcolor: #ffffff;
|
|
260
|
+
--npo-player-bottomcolor: linear-gradient(
|
|
261
|
+
180deg,
|
|
262
|
+
transparent,
|
|
263
|
+
rgba(30, 30, 30, 0.7)
|
|
264
|
+
); //The gradient color "glow" at the bottom of the player
|
|
265
|
+
--npo-player-topcolor: linear-gradient(
|
|
266
|
+
0deg,
|
|
267
|
+
transparent,
|
|
268
|
+
rgba(0, 0, 0, 0.7)
|
|
269
|
+
); //The gradient color "glow" at the top of the player
|
|
270
|
+
--npo-player-bufferingcolor: rgba(255, 109, 0, 0);
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Where `#my-player` is the container element that the player is initialized in.
|
|
275
|
+
|
|
276
|
+
## License
|
|
277
|
+
|
|
278
|
+
MIT
|
|
279
|
+
|
|
280
|
+
[JWT.IO - JSON Web Tokens Introduction]: https://jwt.io/introduction
|
|
281
|
+
[self generated JWT]: https://www.npmjs.com/package/jsonwebtoken
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { AdTagType, PlayerEvent } from "bitmovin-player";
|
|
2
|
+
/*
|
|
3
|
+
* @function handlePreRolls
|
|
4
|
+
* @description Handles ster preroll ads for the player
|
|
5
|
+
* @param {PlayerAPI} playerapi - The player api
|
|
6
|
+
* @param {StreamObject} streamObject - The stream object
|
|
7
|
+
* @param {NpoPlayer} npoplayer - The npoplayer
|
|
8
|
+
* @returns {void}
|
|
9
|
+
*/
|
|
10
|
+
export async function handlePreRolls(playerapi, streamObject, npoplayer) {
|
|
11
|
+
console.warn('handlePreRolls ===========================');
|
|
12
|
+
if (streamObject.metadata.hasPreroll == "false" || streamObject.assets.preroll == null)
|
|
13
|
+
return;
|
|
14
|
+
let prerollUrl = streamObject.assets.preroll;
|
|
15
|
+
let adIndex = 0;
|
|
16
|
+
let totalAds = 0;
|
|
17
|
+
let currentClickListener = null;
|
|
18
|
+
let adUiSet = false;
|
|
19
|
+
/*
|
|
20
|
+
* @function handleSourceLoaded
|
|
21
|
+
* @description If we have a preroll, schedule it to play on source loaded
|
|
22
|
+
* @returns {void}
|
|
23
|
+
*/
|
|
24
|
+
async function handleSourceLoaded() {
|
|
25
|
+
const advertConfig = {
|
|
26
|
+
tag: {
|
|
27
|
+
url: prerollUrl,
|
|
28
|
+
type: AdTagType.VAST
|
|
29
|
+
},
|
|
30
|
+
id: 'Ad',
|
|
31
|
+
position: 'pre',
|
|
32
|
+
};
|
|
33
|
+
await playerapi.ads.schedule(advertConfig);
|
|
34
|
+
}
|
|
35
|
+
playerapi.on(PlayerEvent.SourceLoaded, handleSourceLoaded);
|
|
36
|
+
async function handlePlay() {
|
|
37
|
+
attemptSetAdUi();
|
|
38
|
+
}
|
|
39
|
+
playerapi.on(PlayerEvent.Play, handlePlay);
|
|
40
|
+
/*
|
|
41
|
+
* @function setAdUi
|
|
42
|
+
* @description Sets the ad ui and initializes the ad button and label.
|
|
43
|
+
* @returns {boolean}
|
|
44
|
+
* @returns {void}
|
|
45
|
+
*/
|
|
46
|
+
function setAdUi() {
|
|
47
|
+
let activeAdBreak = playerapi.ads.getActiveAdBreak();
|
|
48
|
+
if (!activeAdBreak || !activeAdBreak.ads)
|
|
49
|
+
return false;
|
|
50
|
+
npoplayer.uiManager?.release();
|
|
51
|
+
npoplayer.createUIManager(playerapi, 'ad');
|
|
52
|
+
adUiSet = true;
|
|
53
|
+
let currentAd = activeAdBreak.ads[0];
|
|
54
|
+
adIndex = 1;
|
|
55
|
+
totalAds = activeAdBreak.ads.length;
|
|
56
|
+
currentClickListener = () => {
|
|
57
|
+
window.open(currentAd.clickThroughUrl, '_blank');
|
|
58
|
+
playerapi.pause();
|
|
59
|
+
};
|
|
60
|
+
npoplayer.uiComponents.adbutton?.show();
|
|
61
|
+
npoplayer.uiComponents.adbutton?.onClick.subscribe(currentClickListener);
|
|
62
|
+
npoplayer.uiComponents.adlabel?.setText(`Advertentie 1 van ${activeAdBreak.ads.length}`);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
/*
|
|
66
|
+
* @function attemptSetAdUi
|
|
67
|
+
* @description Attempts to set the ad ui. If it fails, it will try again 10 times.
|
|
68
|
+
* This is because if we set the ad ui after the adBreakStarted event, the ui will not function properly.
|
|
69
|
+
* We have to check if the UI is set because if the user has an adblocker, the scheduled ad will not resolve
|
|
70
|
+
* causing the UI to be set on regular content otherwise.
|
|
71
|
+
* @returns {void}
|
|
72
|
+
*/
|
|
73
|
+
function attemptSetAdUi(attemptsLeft = 10) {
|
|
74
|
+
if (attemptsLeft <= 0)
|
|
75
|
+
return;
|
|
76
|
+
const isUiSet = setAdUi();
|
|
77
|
+
if (!isUiSet) {
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
console.log('attemptSetAdUi');
|
|
80
|
+
attemptSetAdUi(attemptsLeft - 1);
|
|
81
|
+
}, 200);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/*
|
|
85
|
+
* @function handleAdBreakStarted
|
|
86
|
+
* @description sets adBreakActive to true, in the case that the ad UI was not set, set it.
|
|
87
|
+
* @returns {void}
|
|
88
|
+
*/
|
|
89
|
+
function handleAdBreakStarted() {
|
|
90
|
+
let activeAdBreak = playerapi.ads.getActiveAdBreak();
|
|
91
|
+
if (!activeAdBreak || !activeAdBreak.ads) {
|
|
92
|
+
console.error('No active ad break data found');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (!adUiSet)
|
|
96
|
+
setAdUi();
|
|
97
|
+
npoplayer.adBreakActive = true;
|
|
98
|
+
}
|
|
99
|
+
playerapi.on(PlayerEvent.AdBreakStarted, handleAdBreakStarted);
|
|
100
|
+
/*
|
|
101
|
+
* @function handleAdFinished
|
|
102
|
+
* @description When the ad finishes, check if there are more ads in the adBreak.
|
|
103
|
+
* If so, set the click listener for the ad button and set the label text.
|
|
104
|
+
* If not, handle the adBreakFinished event.
|
|
105
|
+
* @returns {void}
|
|
106
|
+
*/
|
|
107
|
+
function handleAdFinished() {
|
|
108
|
+
let activeAdBreak = playerapi.ads.getActiveAdBreak();
|
|
109
|
+
if (!activeAdBreak || !activeAdBreak.ads) {
|
|
110
|
+
console.error('No active ad break data found');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (adIndex >= totalAds) {
|
|
114
|
+
handleAdBreakFinished();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
let nextAd = activeAdBreak.ads[adIndex];
|
|
118
|
+
adIndex++;
|
|
119
|
+
if (currentClickListener) {
|
|
120
|
+
npoplayer.uiComponents.adbutton?.onClick.unsubscribe(currentClickListener);
|
|
121
|
+
}
|
|
122
|
+
currentClickListener = () => {
|
|
123
|
+
window.open(nextAd.clickThroughUrl, '_blank');
|
|
124
|
+
playerapi.pause();
|
|
125
|
+
};
|
|
126
|
+
npoplayer.uiComponents.adbutton?.onClick.subscribe(currentClickListener);
|
|
127
|
+
npoplayer.uiComponents.adlabel?.setText(`Advertentie ${adIndex} van ${activeAdBreak.ads.length}`);
|
|
128
|
+
}
|
|
129
|
+
playerapi.on(PlayerEvent.AdFinished, handleAdFinished);
|
|
130
|
+
/*
|
|
131
|
+
* @function handleAdBreakFinished
|
|
132
|
+
* @description When the adBreak finishes, hide the ad button and label.
|
|
133
|
+
* Also release the ad uiManager, create a new default uiManager and remove the eventlisteners.
|
|
134
|
+
* @returns {void}
|
|
135
|
+
*/
|
|
136
|
+
function handleAdBreakFinished() {
|
|
137
|
+
npoplayer.adBreakActive = false;
|
|
138
|
+
npoplayer.uiComponents.adbutton?.hide();
|
|
139
|
+
npoplayer.uiComponents.adlabel?.hide();
|
|
140
|
+
npoplayer.uiManager?.release();
|
|
141
|
+
npoplayer.createUIManager(playerapi, 'default');
|
|
142
|
+
adUiSet = false;
|
|
143
|
+
removeListeners();
|
|
144
|
+
}
|
|
145
|
+
playerapi.on(PlayerEvent.AdBreakFinished, handleAdBreakFinished);
|
|
146
|
+
/*
|
|
147
|
+
* @function removeListeners
|
|
148
|
+
* @description Removes the eventlisteners set in this file.
|
|
149
|
+
* @returns {void}
|
|
150
|
+
*/
|
|
151
|
+
function removeListeners() {
|
|
152
|
+
playerapi.off(PlayerEvent.SourceLoaded, handleSourceLoaded);
|
|
153
|
+
playerapi.off(PlayerEvent.Play, handlePlay);
|
|
154
|
+
playerapi.off(PlayerEvent.AdBreakStarted, handleAdBreakStarted);
|
|
155
|
+
playerapi.off(PlayerEvent.AdFinished, handleAdFinished);
|
|
156
|
+
playerapi.off(PlayerEvent.AdBreakFinished, handleAdBreakFinished);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=ster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ster.js","sourceRoot":"","sources":["../../../../src/js/ads/ster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { handlePreRolls } from './ster';
|
|
2
|
+
import { PlayerEvent } from "bitmovin-player";
|
|
3
|
+
jest.mock("bitmovin-player");
|
|
4
|
+
jest.mock("../../npoplayer");
|
|
5
|
+
describe("handlePreRolls", () => {
|
|
6
|
+
let mockPlayerAPI;
|
|
7
|
+
let mockNpoPlayer;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
mockPlayerAPI = {
|
|
10
|
+
ads: {
|
|
11
|
+
schedule: jest.fn().mockResolvedValue(undefined),
|
|
12
|
+
getActiveAdBreak: jest.fn(),
|
|
13
|
+
},
|
|
14
|
+
on: jest.fn(),
|
|
15
|
+
off: jest.fn(),
|
|
16
|
+
};
|
|
17
|
+
mockNpoPlayer = {
|
|
18
|
+
uiManager: {
|
|
19
|
+
release: jest.fn(),
|
|
20
|
+
},
|
|
21
|
+
createUIManager: jest.fn(),
|
|
22
|
+
uiComponents: {
|
|
23
|
+
adbutton: {
|
|
24
|
+
show: jest.fn(),
|
|
25
|
+
hide: jest.fn(),
|
|
26
|
+
onClick: {
|
|
27
|
+
subscribe: jest.fn(),
|
|
28
|
+
unsubscribe: jest.fn(),
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
adlabel: {
|
|
32
|
+
setText: jest.fn(),
|
|
33
|
+
hide: jest.fn(),
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
adBreakActive: false,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
it("should not schedule ads when hasPreroll is false", async () => {
|
|
40
|
+
const streamObject = {
|
|
41
|
+
metadata: {
|
|
42
|
+
hasPreroll: "false"
|
|
43
|
+
},
|
|
44
|
+
assets: {
|
|
45
|
+
preroll: "sample_url"
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
await handlePreRolls(mockPlayerAPI, streamObject, mockNpoPlayer);
|
|
49
|
+
expect(mockPlayerAPI.ads.schedule).not.toHaveBeenCalled();
|
|
50
|
+
});
|
|
51
|
+
it("should schedule ads on SourceLoaded when hasPreroll is true", async () => {
|
|
52
|
+
const streamObject = {
|
|
53
|
+
metadata: {
|
|
54
|
+
hasPreroll: "true"
|
|
55
|
+
},
|
|
56
|
+
assets: {
|
|
57
|
+
preroll: "sample_url"
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
await handlePreRolls(mockPlayerAPI, streamObject, mockNpoPlayer);
|
|
61
|
+
mockPlayerAPI.on.mock.calls.forEach(call => {
|
|
62
|
+
if (call[0] === PlayerEvent.SourceLoaded) {
|
|
63
|
+
const sourceLoadedCallback = call[1];
|
|
64
|
+
const mockEvent = {};
|
|
65
|
+
sourceLoadedCallback(mockEvent);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
expect(mockPlayerAPI.ads.schedule).toHaveBeenCalledWith({
|
|
69
|
+
tag: {
|
|
70
|
+
url: "sample_url",
|
|
71
|
+
type: "vast" // based on the AdTagType enum
|
|
72
|
+
},
|
|
73
|
+
id: 'Ad',
|
|
74
|
+
position: 'pre',
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it("should not schedule ads if preroll URL is missing", async () => {
|
|
78
|
+
const streamObject = {
|
|
79
|
+
metadata: {
|
|
80
|
+
hasPreroll: "true"
|
|
81
|
+
},
|
|
82
|
+
assets: {}
|
|
83
|
+
};
|
|
84
|
+
await handlePreRolls(mockPlayerAPI, streamObject, mockNpoPlayer);
|
|
85
|
+
expect(mockPlayerAPI.ads.schedule).not.toHaveBeenCalled();
|
|
86
|
+
});
|
|
87
|
+
afterEach(() => {
|
|
88
|
+
jest.clearAllMocks();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=ster.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ster.test.js","sourceRoot":"","sources":["../../../../src/js/ads/ster.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { noTrailingSlash } from '../utilities/utilities';
|
|
2
|
+
export async function getStreamObject(npoplayer, payload) {
|
|
3
|
+
const response = await fetch(noTrailingSlash(payload.baseURL) + '/stream-link', {
|
|
4
|
+
method: 'post',
|
|
5
|
+
headers: {
|
|
6
|
+
Accept: '*/*',
|
|
7
|
+
Authorization: payload.jwt,
|
|
8
|
+
'Content-Type': 'application/json'
|
|
9
|
+
},
|
|
10
|
+
body: JSON.stringify(payload.data)
|
|
11
|
+
});
|
|
12
|
+
const streamApiResponse = await response.json();
|
|
13
|
+
if (!response.ok) {
|
|
14
|
+
npoplayer.doError('Het is niet gelukt de stream op te halen: \n' +
|
|
15
|
+
streamApiResponse.body);
|
|
16
|
+
}
|
|
17
|
+
return streamApiResponse;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=getstreamobject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getstreamobject.js","sourceRoot":"","sources":["../../../../src/js/api/getstreamobject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAIxD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAE,SAAoB,EAAE,OAAmB;IAC5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CACxB,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,cAAc,EACjD;QACI,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACL,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,OAAO,CAAC,GAAG;YAC1B,cAAc,EAAE,kBAAkB;SACrC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;KACrC,CACJ,CAAA;IAED,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;QACd,SAAS,CAAC,OAAO,CACb,8CAA8C;YAC1C,iBAAiB,CAAC,IAAI,CAC7B,CAAA;KACJ;IAED,OAAO,iBAAiB,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const npoCdnProviders: Map<any, any>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const npoCdnProviders = new Map();
|
|
2
|
+
npoCdnProviders.set('nep.global.ssl.fastly.net', 'NEP');
|
|
3
|
+
npoCdnProviders.set('cdn.streamgate.nl', 'NEP');
|
|
4
|
+
npoCdnProviders.set('npo-fsly.cdn.streamgate.io', 'FASTLY');
|
|
5
|
+
npoCdnProviders.set('cdn.eurovisioncdn.net', 'EUROVISION');
|
|
6
|
+
npoCdnProviders.set('npo.prd.cdn.bcms.kpn.com', 'KPN');
|
|
7
|
+
npoCdnProviders.set('cdn.bcms.kpn.com', 'KPN');
|
|
8
|
+
npoCdnProviders.set('Akamai', 'AKEMAI');
|
|
9
|
+
npoCdnProviders.set('icecast.omroep.nl', 'NPO');
|
|
10
|
+
npoCdnProviders.set('content.omroep.nl', 'NPO');
|
|
11
|
+
npoCdnProviders.set('podcast.npo.nl', 'NPO');
|
|
12
|
+
npoCdnProviders.set('video.omroep.nl', 'NPO');
|
|
13
|
+
//# sourceMappingURL=cdnproviders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdnproviders.js","sourceRoot":"","sources":["../../../src/js/cdnproviders.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE,CAAA;AACxC,eAAe,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAA;AACvD,eAAe,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;AAC/C,eAAe,CAAC,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;AAC3D,eAAe,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAA;AAC1D,eAAe,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;AACtD,eAAe,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;AAC9C,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AACvC,eAAe,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;AAC/C,eAAe,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;AAC/C,eAAe,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;AAC5C,eAAe,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isSafari(isFairPlayDrmSupported: boolean): boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function isSafari(isFairPlayDrmSupported) {
|
|
2
|
+
const isSafariUserAgent = navigator.userAgent.includes('Safari') &&
|
|
3
|
+
!navigator.userAgent.includes('Chrome') &&
|
|
4
|
+
!navigator.userAgent.includes('IEMobile') &&
|
|
5
|
+
!navigator.userAgent.includes('Edge') &&
|
|
6
|
+
!navigator.userAgent.includes('Chromium') &&
|
|
7
|
+
!navigator.userAgent.includes('Android');
|
|
8
|
+
return isSafariUserAgent || isFairPlayDrmSupported;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=safari.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safari.js","sourceRoot":"","sources":["../../../../src/js/checks/safari.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAE,sBAA+B;IACrD,MAAM,iBAAiB,GACf,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtC,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvC,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzC,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzC,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAEhD,OAAO,iBAAiB,IAAI,sBAAsB,CAAA;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isSafari } from "./safari";
|
|
2
|
+
describe("Test Safari check", () => {
|
|
3
|
+
it("should return true for Safari", () => {
|
|
4
|
+
jest.spyOn(global.navigator, "userAgent", "get").mockReturnValue("Safari");
|
|
5
|
+
const isFairPlayDrmSupported = false;
|
|
6
|
+
expect(isSafari(isFairPlayDrmSupported)).toBeTruthy();
|
|
7
|
+
});
|
|
8
|
+
it("should return true for isFairPlayDrmSupported", () => {
|
|
9
|
+
jest.spyOn(global.navigator, "userAgent", "get").mockReturnValue("Chrome");
|
|
10
|
+
const isFairPlayDrmSupported = true;
|
|
11
|
+
expect(isSafari(isFairPlayDrmSupported)).toBeTruthy();
|
|
12
|
+
});
|
|
13
|
+
it("should return false for any non-Safari userAgents", () => {
|
|
14
|
+
jest
|
|
15
|
+
.spyOn(global.navigator, "userAgent", "get")
|
|
16
|
+
.mockReturnValue("Safari Chrome IEMobile Edge Chromium Android");
|
|
17
|
+
const isFairPlayDrmSupported = false;
|
|
18
|
+
expect(isSafari(isFairPlayDrmSupported)).toBeFalsy();
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=safari.test.js.map
|