@gcorevideo/player 2.30.0 → 2.30.2
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/assets/audio-tracks/template.ejs +1 -1
- package/dist/core.js +65 -21
- package/dist/index.css +265 -265
- package/dist/index.embed.js +99 -34
- package/dist/index.js +125 -53
- package/docs/api/player.md +37 -0
- package/docs/api/player.player.getplugin.md +59 -0
- package/docs/api/player.player.md +14 -0
- package/docs/api/player.tokenrefreshoptions.gettoken.md +13 -0
- package/docs/api/player.tokenrefreshoptions.ipbound.md +13 -0
- package/docs/api/player.tokenrefreshoptions.md +115 -0
- package/docs/api/player.tokenrefreshoptions.ontokenrefreshed.md +13 -0
- package/docs/api/player.tokenrefreshoptions.refreshleadseconds.md +13 -0
- package/docs/api/player.tokenrefreshplugin.md +50 -0
- package/docs/api/player.tokenresponse.client_ip.md +13 -0
- package/docs/api/player.tokenresponse.expires.md +13 -0
- package/docs/api/player.tokenresponse.md +153 -0
- package/docs/api/player.tokenresponse.token.md +13 -0
- package/docs/api/player.tokenresponse.token_ip.md +13 -0
- package/docs/api/player.tokenresponse.url.md +13 -0
- package/docs/api/player.tokenresponse.url_ip.md +13 -0
- package/lib/playback/hls-playback/HlsPlayback.d.ts +1 -1
- package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/playback/hls-playback/HlsPlayback.js +23 -20
- package/lib/playback/hls-playback/RangesList.d.ts +7 -0
- package/lib/playback/hls-playback/RangesList.d.ts.map +1 -0
- package/lib/playback/hls-playback/RangesList.js +41 -0
- package/lib/plugins/audio-selector/AudioTracks.d.ts +4 -0
- package/lib/plugins/audio-selector/AudioTracks.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioTracks.js +42 -12
- package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
- package/lib/plugins/subtitles/ClosedCaptions.js +0 -2
- package/package.json +1 -1
- package/src/playback/hls-playback/HlsPlayback.ts +40 -37
- package/src/playback/hls-playback/RangesList.ts +45 -0
- package/src/playback/hls-playback/__tests__/RangesList.test.ts +60 -0
- package/src/plugins/audio-selector/AudioTracks.ts +51 -16
- package/src/plugins/audio-selector/__tests__/__snapshots__/AudioTracks.test.ts.snap +9 -9
- package/src/plugins/subtitles/ClosedCaptions.ts +0 -5
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenRefreshOptions](./player.tokenrefreshoptions.md)
|
|
4
|
+
|
|
5
|
+
## TokenRefreshOptions interface
|
|
6
|
+
|
|
7
|
+
Configuration options for [TokenRefreshPlugin](./player.tokenrefreshplugin.md)<!-- -->.
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
export interface TokenRefreshOptions
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Properties
|
|
16
|
+
|
|
17
|
+
<table><thead><tr><th>
|
|
18
|
+
|
|
19
|
+
Property
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
</th><th>
|
|
23
|
+
|
|
24
|
+
Modifiers
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
</th><th>
|
|
28
|
+
|
|
29
|
+
Type
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
</th><th>
|
|
33
|
+
|
|
34
|
+
Description
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
</th></tr></thead>
|
|
38
|
+
<tbody><tr><td>
|
|
39
|
+
|
|
40
|
+
[getToken](./player.tokenrefreshoptions.gettoken.md)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
</td><td>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
</td><td>
|
|
47
|
+
|
|
48
|
+
() => Promise<[TokenResponse](./player.tokenresponse.md)<!-- -->>
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
</td><td>
|
|
52
|
+
|
|
53
|
+
Async function called each time a fresh token is needed. Must return a [TokenResponse](./player.tokenresponse.md)<!-- -->.
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
</td></tr>
|
|
57
|
+
<tr><td>
|
|
58
|
+
|
|
59
|
+
[ipBound?](./player.tokenrefreshoptions.ipbound.md)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
</td><td>
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
</td><td>
|
|
66
|
+
|
|
67
|
+
boolean
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
</td><td>
|
|
71
|
+
|
|
72
|
+
_(Optional)_ When `true`<!-- -->, the IP-bound variant (`token_ip` / `url_ip`<!-- -->) is used. Defaults to `false`<!-- -->.
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
</td></tr>
|
|
76
|
+
<tr><td>
|
|
77
|
+
|
|
78
|
+
[onTokenRefreshed?](./player.tokenrefreshoptions.ontokenrefreshed.md)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
</td><td>
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
</td><td>
|
|
85
|
+
|
|
86
|
+
(data: [TokenResponse](./player.tokenresponse.md)<!-- -->) => void
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
</td><td>
|
|
90
|
+
|
|
91
|
+
_(Optional)_ Optional callback invoked after every successful token refresh.
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
</td></tr>
|
|
95
|
+
<tr><td>
|
|
96
|
+
|
|
97
|
+
[refreshLeadSeconds?](./player.tokenrefreshoptions.refreshleadseconds.md)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
</td><td>
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
</td><td>
|
|
104
|
+
|
|
105
|
+
number
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
</td><td>
|
|
109
|
+
|
|
110
|
+
_(Optional)_ Seconds before the token expiry timestamp to request a fresh token. Defaults to `5`<!-- -->.
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
</td></tr>
|
|
114
|
+
</tbody></table>
|
|
115
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenRefreshOptions](./player.tokenrefreshoptions.md) > [onTokenRefreshed](./player.tokenrefreshoptions.ontokenrefreshed.md)
|
|
4
|
+
|
|
5
|
+
## TokenRefreshOptions.onTokenRefreshed property
|
|
6
|
+
|
|
7
|
+
Optional callback invoked after every successful token refresh.
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
onTokenRefreshed?: (data: TokenResponse) => void;
|
|
13
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenRefreshOptions](./player.tokenrefreshoptions.md) > [refreshLeadSeconds](./player.tokenrefreshoptions.refreshleadseconds.md)
|
|
4
|
+
|
|
5
|
+
## TokenRefreshOptions.refreshLeadSeconds property
|
|
6
|
+
|
|
7
|
+
Seconds before the token expiry timestamp to request a fresh token. Defaults to `5`<!-- -->.
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
refreshLeadSeconds?: number;
|
|
13
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenRefreshPlugin](./player.tokenrefreshplugin.md)
|
|
4
|
+
|
|
5
|
+
## TokenRefreshPlugin class
|
|
6
|
+
|
|
7
|
+
`PLUGIN` — automatic token refresh for Gcore protected-content streams.
|
|
8
|
+
|
|
9
|
+
Supports all three playback engines:
|
|
10
|
+
|
|
11
|
+
\| Engine \| Mechanism \| Interruption \| \|\-\-\-\-\-\---\|\-\-\-\-\-\-\-\-\---\|\-\-\-\-\-\-\-\-\-\-\-\---\| \| \*\*hls.js\*\* \| Custom loader rewrites every request URL \| None \| \| \*\*dash.js\*\* \| `addRequestInterceptor` rewrites every request URL \| None \| \| \*\*Native `<video>`<!-- -->\*\* (Safari ≤ iOS 14.4) \| Source reload + seek restore \| Brief \|
|
|
12
|
+
|
|
13
|
+
**Signature:**
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
export declare class TokenRefreshPlugin extends CorePlugin
|
|
17
|
+
```
|
|
18
|
+
**Extends:** CorePlugin
|
|
19
|
+
|
|
20
|
+
## Remarks
|
|
21
|
+
|
|
22
|
+
Register the plugin once before creating any player instance:
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { Player, TokenRefreshPlugin } from '@gcorevideo/player'
|
|
26
|
+
Player.registerPlugin(TokenRefreshPlugin)
|
|
27
|
+
```
|
|
28
|
+
Then pass `tokenRefresh` in `PlayerConfig`<!-- -->:
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
const player = new Player({
|
|
32
|
+
sources: [{ source: initialUrl, mimeType: 'application/x-mpegURL' }],
|
|
33
|
+
tokenRefresh: {
|
|
34
|
+
getToken: () => fetch('https://…/token').then(r => r.json()),
|
|
35
|
+
ipBound: false,
|
|
36
|
+
refreshLeadSeconds: 5,
|
|
37
|
+
onTokenRefreshed: (data) => console.log('new token expires', data.expires),
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Example
|
|
43
|
+
|
|
44
|
+
Safari native — opt-in Service Worker for fully seamless refresh:
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
// Register token-refresh-sw.js (see example/ directory)
|
|
48
|
+
// and omit tokenRefresh config — the SW handles rewriting.
|
|
49
|
+
```
|
|
50
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenResponse](./player.tokenresponse.md) > [client\_ip](./player.tokenresponse.client_ip.md)
|
|
4
|
+
|
|
5
|
+
## TokenResponse.client\_ip property
|
|
6
|
+
|
|
7
|
+
Client IP address (informational)
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
client_ip: string;
|
|
13
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenResponse](./player.tokenresponse.md) > [expires](./player.tokenresponse.expires.md)
|
|
4
|
+
|
|
5
|
+
## TokenResponse.expires property
|
|
6
|
+
|
|
7
|
+
Unix timestamp (seconds) when both tokens expire
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
expires: number;
|
|
13
|
+
```
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenResponse](./player.tokenresponse.md)
|
|
4
|
+
|
|
5
|
+
## TokenResponse interface
|
|
6
|
+
|
|
7
|
+
Response shape expected from your token-refresh API endpoint.
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
export interface TokenResponse
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Properties
|
|
16
|
+
|
|
17
|
+
<table><thead><tr><th>
|
|
18
|
+
|
|
19
|
+
Property
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
</th><th>
|
|
23
|
+
|
|
24
|
+
Modifiers
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
</th><th>
|
|
28
|
+
|
|
29
|
+
Type
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
</th><th>
|
|
33
|
+
|
|
34
|
+
Description
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
</th></tr></thead>
|
|
38
|
+
<tbody><tr><td>
|
|
39
|
+
|
|
40
|
+
[client\_ip](./player.tokenresponse.client_ip.md)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
</td><td>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
</td><td>
|
|
47
|
+
|
|
48
|
+
string
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
</td><td>
|
|
52
|
+
|
|
53
|
+
Client IP address (informational)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
</td></tr>
|
|
57
|
+
<tr><td>
|
|
58
|
+
|
|
59
|
+
[expires](./player.tokenresponse.expires.md)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
</td><td>
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
</td><td>
|
|
66
|
+
|
|
67
|
+
number
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
</td><td>
|
|
71
|
+
|
|
72
|
+
Unix timestamp (seconds) when both tokens expire
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
</td></tr>
|
|
76
|
+
<tr><td>
|
|
77
|
+
|
|
78
|
+
[token\_ip](./player.tokenresponse.token_ip.md)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
</td><td>
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
</td><td>
|
|
85
|
+
|
|
86
|
+
string
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
</td><td>
|
|
90
|
+
|
|
91
|
+
IP-bound secure token
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
</td></tr>
|
|
95
|
+
<tr><td>
|
|
96
|
+
|
|
97
|
+
[token](./player.tokenresponse.token.md)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
</td><td>
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
</td><td>
|
|
104
|
+
|
|
105
|
+
string
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
</td><td>
|
|
109
|
+
|
|
110
|
+
Plain (non-IP-bound) secure token
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
</td></tr>
|
|
114
|
+
<tr><td>
|
|
115
|
+
|
|
116
|
+
[url\_ip](./player.tokenresponse.url_ip.md)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
</td><td>
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
</td><td>
|
|
123
|
+
|
|
124
|
+
string
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
</td><td>
|
|
128
|
+
|
|
129
|
+
Ready-to-use HLS master playlist URL with IP-bound token embedded
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
</td></tr>
|
|
133
|
+
<tr><td>
|
|
134
|
+
|
|
135
|
+
[url](./player.tokenresponse.url.md)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
</td><td>
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
</td><td>
|
|
142
|
+
|
|
143
|
+
string
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
</td><td>
|
|
147
|
+
|
|
148
|
+
Ready-to-use HLS master playlist URL with plain token embedded
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
</td></tr>
|
|
152
|
+
</tbody></table>
|
|
153
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenResponse](./player.tokenresponse.md) > [token](./player.tokenresponse.token.md)
|
|
4
|
+
|
|
5
|
+
## TokenResponse.token property
|
|
6
|
+
|
|
7
|
+
Plain (non-IP-bound) secure token
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
token: string;
|
|
13
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenResponse](./player.tokenresponse.md) > [token\_ip](./player.tokenresponse.token_ip.md)
|
|
4
|
+
|
|
5
|
+
## TokenResponse.token\_ip property
|
|
6
|
+
|
|
7
|
+
IP-bound secure token
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
token_ip: string;
|
|
13
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenResponse](./player.tokenresponse.md) > [url](./player.tokenresponse.url.md)
|
|
4
|
+
|
|
5
|
+
## TokenResponse.url property
|
|
6
|
+
|
|
7
|
+
Ready-to-use HLS master playlist URL with plain token embedded
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
url: string;
|
|
13
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TokenResponse](./player.tokenresponse.md) > [url\_ip](./player.tokenresponse.url_ip.md)
|
|
4
|
+
|
|
5
|
+
## TokenResponse.url\_ip property
|
|
6
|
+
|
|
7
|
+
Ready-to-use HLS master playlist URL with IP-bound token embedded
|
|
8
|
+
|
|
9
|
+
**Signature:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
url_ip: string;
|
|
13
|
+
```
|
|
@@ -5,7 +5,6 @@ import { BasePlayback } from '../BasePlayback.js';
|
|
|
5
5
|
import { AudioTrack } from '@clappr/core/types/base/playback/playback.js';
|
|
6
6
|
import { VTTCueInfo } from '../types.js';
|
|
7
7
|
export default class HlsPlayback extends BasePlayback {
|
|
8
|
-
private _ccTracksUpdated;
|
|
9
8
|
private _currentFragment;
|
|
10
9
|
private _currentLevel;
|
|
11
10
|
private _durationExcludesAfterLiveSyncPoint;
|
|
@@ -33,6 +32,7 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
33
32
|
id: string;
|
|
34
33
|
}) => void) | null;
|
|
35
34
|
private cues;
|
|
35
|
+
private cuesByTrack;
|
|
36
36
|
private currentCueId;
|
|
37
37
|
/**
|
|
38
38
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EACZ,MAAM,IAAI,SAAS,EAMnB,KAAK,kBAAkB,EAMxB,MAAM,QAAQ,CAAA;AAEf,OAAO,EAIL,YAAY,EAEb,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,13 @@ import { PlaybackErrorCode, } from '../../playback.types.js';
|
|
|
9
9
|
import { isHlsSource } from '../../utils/mediaSources.js';
|
|
10
10
|
import { BasePlayback } from '../BasePlayback.js';
|
|
11
11
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
12
|
+
import { RangesList } from './RangesList.js';
|
|
12
13
|
const { now } = Utils;
|
|
13
14
|
const AUTO = -1;
|
|
14
15
|
const DEFAULT_RECOVER_ATTEMPTS = 16;
|
|
15
16
|
Events.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
|
|
16
17
|
const T = 'playback.hls';
|
|
17
18
|
export default class HlsPlayback extends BasePlayback {
|
|
18
|
-
_ccTracksUpdated = false;
|
|
19
19
|
_currentFragment = null;
|
|
20
20
|
_currentLevel = null;
|
|
21
21
|
_durationExcludesAfterLiveSyncPoint = false;
|
|
@@ -40,7 +40,8 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
40
40
|
_timeUpdateTimer = null;
|
|
41
41
|
oncueenter = null;
|
|
42
42
|
oncueexit = null;
|
|
43
|
-
cues =
|
|
43
|
+
cues = null;
|
|
44
|
+
cuesByTrack = {};
|
|
44
45
|
currentCueId = null;
|
|
45
46
|
/**
|
|
46
47
|
* @internal
|
|
@@ -237,7 +238,6 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
237
238
|
}
|
|
238
239
|
this._manifestParsed = false;
|
|
239
240
|
// this._ccIsSetup = false
|
|
240
|
-
this._ccTracksUpdated = false;
|
|
241
241
|
this._setInitialState();
|
|
242
242
|
this._hls.destroy();
|
|
243
243
|
this._hls = null;
|
|
@@ -291,12 +291,20 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
291
291
|
this._hls.on(HlsEvents.AUDIO_TRACK_SWITCHED, (evt, data) => this._onAudioTrackSwitched(evt, data));
|
|
292
292
|
this._hls.on(HlsEvents.CUES_PARSED, (evt, data) => {
|
|
293
293
|
data.cues?.forEach((cue) => {
|
|
294
|
-
this.cues
|
|
294
|
+
if (!this.cues) {
|
|
295
|
+
const trackId = this._hls.subtitleTrack;
|
|
296
|
+
if (!this.cuesByTrack[trackId]) {
|
|
297
|
+
this.cuesByTrack[trackId] = new RangesList();
|
|
298
|
+
}
|
|
299
|
+
this.cues = this.cuesByTrack[trackId];
|
|
300
|
+
}
|
|
301
|
+
const cueInfo = {
|
|
295
302
|
id: cue.id,
|
|
296
303
|
start: cue.startTime,
|
|
297
304
|
end: cue.endTime,
|
|
298
305
|
text: cue.text,
|
|
299
|
-
}
|
|
306
|
+
};
|
|
307
|
+
this.cues.insert(cue.startTime, cue.endTime, cueInfo);
|
|
300
308
|
});
|
|
301
309
|
});
|
|
302
310
|
this.bindCustomListeners();
|
|
@@ -523,7 +531,7 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
523
531
|
}
|
|
524
532
|
}
|
|
525
533
|
reload() {
|
|
526
|
-
this.cues =
|
|
534
|
+
this.cues = null;
|
|
527
535
|
this.currentCueId = null;
|
|
528
536
|
this._hls?.startLoad(-1);
|
|
529
537
|
}
|
|
@@ -588,9 +596,7 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
588
596
|
}
|
|
589
597
|
triggerCues() {
|
|
590
598
|
const currentTime = this.getCurrentTime();
|
|
591
|
-
|
|
592
|
-
// TODO build a search tree
|
|
593
|
-
const cue = this.cues.find((cue) => currentTime >= cue.start && currentTime <= cue.end);
|
|
599
|
+
const cue = this.cues?.find(currentTime);
|
|
594
600
|
if (cue) {
|
|
595
601
|
this.currentCueId = cue.id;
|
|
596
602
|
this.oncueenter?.(cue);
|
|
@@ -634,20 +640,14 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
634
640
|
destroy() {
|
|
635
641
|
this._stopTimeUpdateTimer();
|
|
636
642
|
this._destroyHLSInstance();
|
|
643
|
+
this.cues = null;
|
|
644
|
+
this.cuesByTrack = {};
|
|
637
645
|
return super.destroy();
|
|
638
646
|
}
|
|
639
647
|
_updatePlaybackType(evt, data) {
|
|
640
648
|
const prevPlaybackType = this._playbackType;
|
|
641
649
|
this._playbackType = (data.details.live ? Playback.LIVE : Playback.VOD);
|
|
642
650
|
this._onLevelUpdated(evt, data);
|
|
643
|
-
// Live stream subtitle tracks detection hack (may not immediately available)
|
|
644
|
-
// if (
|
|
645
|
-
// this._ccTracksUpdated &&
|
|
646
|
-
// this._playbackType === Playback.LIVE &&
|
|
647
|
-
// this.hasClosedCaptionsTracks
|
|
648
|
-
// ) {
|
|
649
|
-
// this._onSubtitleLoaded()
|
|
650
|
-
// }
|
|
651
651
|
if (prevPlaybackType !== this._playbackType) {
|
|
652
652
|
this._updateSettings();
|
|
653
653
|
}
|
|
@@ -868,7 +868,10 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
868
868
|
return;
|
|
869
869
|
}
|
|
870
870
|
this._hls.subtitleTrack = id;
|
|
871
|
-
this.
|
|
871
|
+
if (!this.cuesByTrack[id]) {
|
|
872
|
+
this.cuesByTrack[id] = new RangesList();
|
|
873
|
+
}
|
|
874
|
+
this.cues = this.cuesByTrack[id];
|
|
872
875
|
}
|
|
873
876
|
/**
|
|
874
877
|
* @override
|
|
@@ -877,7 +880,7 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
877
880
|
return this.getTextTracks();
|
|
878
881
|
}
|
|
879
882
|
getTextTracks() {
|
|
880
|
-
return this._hls?.subtitleTracks.map((t) => ({
|
|
883
|
+
return (this._hls?.subtitleTracks.map((t) => ({
|
|
881
884
|
id: t.id,
|
|
882
885
|
name: t.name,
|
|
883
886
|
track: {
|
|
@@ -885,7 +888,7 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
885
888
|
label: t.name,
|
|
886
889
|
language: t.lang,
|
|
887
890
|
},
|
|
888
|
-
})) || [];
|
|
891
|
+
})) || []);
|
|
889
892
|
}
|
|
890
893
|
}
|
|
891
894
|
HlsPlayback.canPlay = function (resource, mimeType) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangesList.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/RangesList.ts"],"names":[],"mappings":"AACA,qBAAa,UAAU,CAAC,CAAC;IAEvB,OAAO,CAAC,KAAK,CAAkC;IAE/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAK3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAShC,OAAO,CAAC,SAAS;CAyBlB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class RangesList {
|
|
2
|
+
// TODO write an efficient implementation
|
|
3
|
+
items = [];
|
|
4
|
+
insert(start, end, value) {
|
|
5
|
+
const index = this.findIndex((start + end) / 2);
|
|
6
|
+
this.items.splice(index, 0, [start, end, value]);
|
|
7
|
+
}
|
|
8
|
+
find(position) {
|
|
9
|
+
const index = this.findIndex(position);
|
|
10
|
+
const item = this.items[index];
|
|
11
|
+
if (!item || item[0] > position || item[1] < position) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return item[2];
|
|
15
|
+
}
|
|
16
|
+
findIndex(position) {
|
|
17
|
+
let low = 0;
|
|
18
|
+
let high = this.items.length;
|
|
19
|
+
let index = 0;
|
|
20
|
+
while (low < high) {
|
|
21
|
+
index = low + Math.floor((high - low) / 2);
|
|
22
|
+
const item = this.items[index];
|
|
23
|
+
if (item[0] > position) {
|
|
24
|
+
if (index === low) {
|
|
25
|
+
return index;
|
|
26
|
+
}
|
|
27
|
+
high = index;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (item[1] <= position) {
|
|
31
|
+
if (index === high - 1) {
|
|
32
|
+
return index + 1;
|
|
33
|
+
}
|
|
34
|
+
low = index + 1;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
return index;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -13,6 +13,7 @@ export declare class AudioTracks extends UICorePlugin {
|
|
|
13
13
|
private currentTrack;
|
|
14
14
|
private open;
|
|
15
15
|
private tracks;
|
|
16
|
+
private autoUpdateTimerId;
|
|
16
17
|
/**
|
|
17
18
|
* @internal
|
|
18
19
|
*/
|
|
@@ -47,6 +48,8 @@ export declare class AudioTracks extends UICorePlugin {
|
|
|
47
48
|
bindEvents(): void;
|
|
48
49
|
private onCoreReady;
|
|
49
50
|
private onActiveContainerChanged;
|
|
51
|
+
private bindContainerAudioChanged;
|
|
52
|
+
private setCurrentTrack;
|
|
50
53
|
private shouldRender;
|
|
51
54
|
/**
|
|
52
55
|
* @internal
|
|
@@ -65,6 +68,7 @@ export declare class AudioTracks extends UICorePlugin {
|
|
|
65
68
|
private updateText;
|
|
66
69
|
private highlightCurrentTrack;
|
|
67
70
|
private mount;
|
|
71
|
+
private autoUpdateSelected;
|
|
68
72
|
private clickaway;
|
|
69
73
|
}
|
|
70
74
|
//# sourceMappingURL=AudioTracks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioTracks.d.ts","sourceRoot":"","sources":["../../../src/plugins/audio-selector/AudioTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAY,MAAM,cAAc,CAAA;AAiB7D;;;;;;;;;GASG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,YAAY,CAA0B;IAE9C,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,MAAM,CAAmB;IAEjC;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,wBAAwB;
|
|
1
|
+
{"version":3,"file":"AudioTracks.d.ts","sourceRoot":"","sources":["../../../src/plugins/audio-selector/AudioTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAY,MAAM,cAAc,CAAA;AAiB7D;;;;;;;;;GASG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,YAAY,CAA0B;IAE9C,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,MAAM,CAAmB;IAEjC,OAAO,CAAC,iBAAiB,CAA6C;IAEtE;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,wBAAwB;IA+BhC,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACM,MAAM;IAgBf,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,SAAS,CAA+C;CACjE"}
|