@gcorevideo/player 2.12.2 → 2.14.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/dist/index.js +63 -6
- package/dist/player.d.ts +71 -11
- package/docs/api/player.errorlevel.md +15 -0
- package/docs/api/player.md +77 -0
- package/docs/api/player.mediatransport.md +1 -1
- package/docs/api/player.playbackerror.code.md +14 -0
- package/docs/api/player.playbackerror.description.md +14 -0
- package/docs/api/player.playbackerror.level.md +14 -0
- package/docs/api/player.playbackerror.md +116 -0
- package/docs/api/player.playbackerror.message.md +14 -0
- package/docs/api/player.playbackerrorcode.md +83 -0
- package/docs/api/player.playbackmodule.md +1 -1
- package/docs/api/player.playerconfig.md +2 -2
- package/docs/api/player.playerconfig.strings.md +1 -1
- package/docs/api/player.playerplugin.md +1 -1
- package/docs/api/player.timeposition.md +21 -0
- package/docs/api/player.timeprogress.md +20 -0
- package/docs/api/player.timeupdate.md +20 -0
- package/docs/api/player.timevalue.md +16 -0
- package/docs/api/player.transportpreference.md +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/playback.types.d.ts +7 -4
- package/lib/playback.types.d.ts.map +1 -1
- package/lib/testUtils.d.ts +34 -0
- package/lib/testUtils.d.ts.map +1 -0
- package/lib/testUtils.js +58 -0
- package/lib/types.d.ts +2 -2
- package/lib/types.d.ts.map +1 -1
- package/lib/utils/mediaSources.d.ts.map +1 -1
- package/lib/utils/mediaSources.js +2 -3
- package/package.json +1 -1
- package/src/__tests__/Player.test.ts +0 -122
- package/src/index.ts +1 -0
- package/src/playback.types.ts +7 -4
- package/src/testUtils.ts +80 -0
- package/src/types.ts +2 -2
- package/src/utils/__tests__/mediaSources.test.ts +0 -41
- package/src/utils/mediaSources.ts +3 -4
- package/temp/player.api.json +373 -11
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TimePosition](./player.timeposition.md)
|
|
4
|
+
|
|
5
|
+
## TimePosition type
|
|
6
|
+
|
|
7
|
+
> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
|
|
8
|
+
>
|
|
9
|
+
|
|
10
|
+
For the plugin development
|
|
11
|
+
|
|
12
|
+
**Signature:**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
export type TimePosition = {
|
|
16
|
+
current: TimeValue;
|
|
17
|
+
total: TimeValue;
|
|
18
|
+
};
|
|
19
|
+
```
|
|
20
|
+
**References:** [TimeValue](./player.timevalue.md)
|
|
21
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TimeProgress](./player.timeprogress.md)
|
|
4
|
+
|
|
5
|
+
## TimeProgress type
|
|
6
|
+
|
|
7
|
+
> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
|
|
8
|
+
>
|
|
9
|
+
|
|
10
|
+
For the plugin development
|
|
11
|
+
|
|
12
|
+
**Signature:**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
export type TimeProgress = TimePosition & {
|
|
16
|
+
start: number;
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
**References:** [TimePosition](./player.timeposition.md)
|
|
20
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TimeUpdate](./player.timeupdate.md)
|
|
4
|
+
|
|
5
|
+
## TimeUpdate type
|
|
6
|
+
|
|
7
|
+
> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
|
|
8
|
+
>
|
|
9
|
+
|
|
10
|
+
For the plugin development
|
|
11
|
+
|
|
12
|
+
**Signature:**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
export type TimeUpdate = TimePosition & {
|
|
16
|
+
firstFragDateTime: number;
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
**References:** [TimePosition](./player.timeposition.md)
|
|
20
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
|
2
|
+
|
|
3
|
+
[Home](./index.md) > [@gcorevideo/player](./player.md) > [TimeValue](./player.timevalue.md)
|
|
4
|
+
|
|
5
|
+
## TimeValue type
|
|
6
|
+
|
|
7
|
+
> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
|
|
8
|
+
>
|
|
9
|
+
|
|
10
|
+
Playback time in seconds since the beginning of the stream (or a segment for the live streams) For the plugin development
|
|
11
|
+
|
|
12
|
+
**Signature:**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
export type TimeValue = number;
|
|
16
|
+
```
|
package/lib/index.d.ts
CHANGED
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
|
package/lib/index.js
CHANGED
package/lib/playback.types.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Playback time in seconds since the beginning of the stream (or a segment for the live streams)
|
|
3
3
|
* For the plugin development
|
|
4
|
-
* @
|
|
4
|
+
* @beta
|
|
5
5
|
*/
|
|
6
6
|
export type TimeValue = number;
|
|
7
7
|
/**
|
|
8
8
|
* For the plugin development
|
|
9
|
-
* @
|
|
9
|
+
* @beta
|
|
10
10
|
*/
|
|
11
11
|
export type TimePosition = {
|
|
12
12
|
current: TimeValue;
|
|
@@ -14,14 +14,14 @@ export type TimePosition = {
|
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
16
|
* For the plugin development
|
|
17
|
-
* @
|
|
17
|
+
* @beta
|
|
18
18
|
*/
|
|
19
19
|
export type TimeProgress = TimePosition & {
|
|
20
20
|
start: number;
|
|
21
21
|
};
|
|
22
22
|
/**
|
|
23
23
|
* For the plugin development
|
|
24
|
-
* @
|
|
24
|
+
* @beta
|
|
25
25
|
*/
|
|
26
26
|
export type TimeUpdate = TimePosition & {
|
|
27
27
|
firstFragDateTime: number;
|
|
@@ -43,6 +43,9 @@ export declare enum PlaybackErrorCode {
|
|
|
43
43
|
MediaSourceUnavailable = 1,
|
|
44
44
|
QualityLevelUnavailable = 2
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* @beta
|
|
48
|
+
*/
|
|
46
49
|
export type ErrorLevel = 'FATAL' | 'WARN' | 'INFO';
|
|
47
50
|
/**
|
|
48
51
|
* @beta
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playback.types.d.ts","sourceRoot":"","sources":["../src/playback.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,SAAS,CAAA;IAClB,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IACtC,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,oBAAY,iBAAiB;IAC3B,OAAO,IAAI;IACX,sBAAsB,IAAI;IAC1B,uBAAuB,IAAI;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAElD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,UAAU,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB"}
|
|
1
|
+
{"version":3,"file":"playback.types.d.ts","sourceRoot":"","sources":["../src/playback.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,SAAS,CAAA;IAClB,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IACtC,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,oBAAY,iBAAiB;IAC3B,OAAO,IAAI;IACX,sBAAsB,IAAI;IAC1B,uBAAuB,IAAI;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAElD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,UAAU,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import EventLite from 'event-lite';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export declare class _MockPlayback extends EventLite {
|
|
6
|
+
protected options: any;
|
|
7
|
+
readonly i18n: any;
|
|
8
|
+
protected playerError?: any | undefined;
|
|
9
|
+
constructor(options: any, i18n: any, playerError?: any | undefined);
|
|
10
|
+
get name(): string;
|
|
11
|
+
consent(): void;
|
|
12
|
+
play(): void;
|
|
13
|
+
pause(): void;
|
|
14
|
+
stop(): void;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
seek(): void;
|
|
17
|
+
seekPercentage(): void;
|
|
18
|
+
getDuration(): number;
|
|
19
|
+
enterPiP(): void;
|
|
20
|
+
exitPiP(): void;
|
|
21
|
+
getPlaybackType(): string;
|
|
22
|
+
getStartTimeOffset(): number;
|
|
23
|
+
getCurrentTime(): number;
|
|
24
|
+
isHighDefinitionInUse(): boolean;
|
|
25
|
+
mute(): void;
|
|
26
|
+
unmute(): void;
|
|
27
|
+
volume(): void;
|
|
28
|
+
configure(): void;
|
|
29
|
+
attemptAutoPlay(): boolean;
|
|
30
|
+
canAutoPlay(): boolean;
|
|
31
|
+
onResize(): boolean;
|
|
32
|
+
trigger(event: string, ...args: any[]): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=testUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAA;AAElC;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAExC,SAAS,CAAC,OAAO,EAAE,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,GAAG;IAClB,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG;gBAFjB,OAAO,EAAE,GAAG,EACb,IAAI,EAAE,GAAG,EACR,WAAW,CAAC,EAAE,GAAG,YAAA;IAK7B,IAAI,IAAI,WAEP;IAED,OAAO;IAEP,IAAI;IAEJ,KAAK;IAEL,IAAI;IAEJ,OAAO;IAEP,IAAI;IAEJ,cAAc;IAEd,WAAW;IAIX,QAAQ;IAER,OAAO;IAEP,eAAe;IAIf,kBAAkB;IAIlB,cAAc;IAId,qBAAqB;IAIrB,IAAI;IAEJ,MAAM;IAEN,MAAM;IAEN,SAAS;IAET,eAAe;IAIf,WAAW;IAIX,QAAQ;IAIR,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGtC"}
|
package/lib/testUtils.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import EventLite from 'event-lite';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export class _MockPlayback extends EventLite {
|
|
6
|
+
options;
|
|
7
|
+
i18n;
|
|
8
|
+
playerError;
|
|
9
|
+
constructor(options, i18n, playerError) {
|
|
10
|
+
super();
|
|
11
|
+
this.options = options;
|
|
12
|
+
this.i18n = i18n;
|
|
13
|
+
this.playerError = playerError;
|
|
14
|
+
}
|
|
15
|
+
get name() {
|
|
16
|
+
return 'mock';
|
|
17
|
+
}
|
|
18
|
+
consent() { }
|
|
19
|
+
play() { }
|
|
20
|
+
pause() { }
|
|
21
|
+
stop() { }
|
|
22
|
+
destroy() { }
|
|
23
|
+
seek() { }
|
|
24
|
+
seekPercentage() { }
|
|
25
|
+
getDuration() {
|
|
26
|
+
return 100;
|
|
27
|
+
}
|
|
28
|
+
enterPiP() { }
|
|
29
|
+
exitPiP() { }
|
|
30
|
+
getPlaybackType() {
|
|
31
|
+
return 'live';
|
|
32
|
+
}
|
|
33
|
+
getStartTimeOffset() {
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
getCurrentTime() {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
isHighDefinitionInUse() {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
mute() { }
|
|
43
|
+
unmute() { }
|
|
44
|
+
volume() { }
|
|
45
|
+
configure() { }
|
|
46
|
+
attemptAutoPlay() {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
canAutoPlay() {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
onResize() {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
trigger(event, ...args) {
|
|
56
|
+
this.emit(event, ...args);
|
|
57
|
+
}
|
|
58
|
+
}
|
package/lib/types.d.ts
CHANGED
|
@@ -42,7 +42,7 @@ export type MediaTransport = 'dash' | 'hls';
|
|
|
42
42
|
/**
|
|
43
43
|
* @beta
|
|
44
44
|
*/
|
|
45
|
-
export type TransportPreference = MediaTransport
|
|
45
|
+
export type TransportPreference = MediaTransport;
|
|
46
46
|
/**
|
|
47
47
|
* @beta
|
|
48
48
|
* @see {@link https://clappr.github.io/classes/UIContainerPlugin.html}, {@link https://clappr.github.io/classes/ContainerPlugin.html}
|
|
@@ -133,7 +133,7 @@ export interface PlayerConfig extends Record<string, unknown> {
|
|
|
133
133
|
playbackType?: PlaybackType;
|
|
134
134
|
/**
|
|
135
135
|
* Preferred transport protocol when multiple sources are available.
|
|
136
|
-
* @defaultValue '
|
|
136
|
+
* @defaultValue 'dash'
|
|
137
137
|
*/
|
|
138
138
|
priorityTransport?: TransportPreference;
|
|
139
139
|
/**
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,qBAAqB,CAAA;AAE9D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAEvE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,OAAO,CAAA;AAE1D;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAA;AAEzC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,qBAAqB,CAAA;AAE9D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAEvE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,OAAO,CAAA;AAE1D;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAA;AAEzC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAA;AAEhD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3D;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,IAAI,CAAC,EAAE,YAAY,CAAA;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAE3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,mBAAmB,CAAA;IAEvC;;OAEG;IACH,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAE5B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAA;AAEnC;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,CACvC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAChD,CAAA;AAED;;;GAGG;AACH,oBAAY,WAAW;IACrB;;OAEG;IACH,KAAK,UAAU;IACf;;OAEG;IACH,IAAI,SAAS;IACb;;OAEG;IACH,KAAK,UAAU;IACf;;OAEG;IACH,IAAI,SAAS;IACb;;OAEG;IACH,KAAK,UAAU;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaSources.d.ts","sourceRoot":"","sources":["../../src/utils/mediaSources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,UAAU,CAAA;AAGjB,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAA;IAClC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACjC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;CACrC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,cAAc,CAiB5E;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,qBAAqB,EAAE,EAChC,iBAAiB,GAAE,mBAA4B,GAC9C,qBAAqB,EAAE,CA4BzB;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAEzD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,iBAAiB,GAAG,qBAAqB,CAEtE;
|
|
1
|
+
{"version":3,"file":"mediaSources.d.ts","sourceRoot":"","sources":["../../src/utils/mediaSources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,UAAU,CAAA;AAGjB,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAA;IAClC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACjC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;CACrC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,cAAc,CAiB5E;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,qBAAqB,EAAE,EAChC,iBAAiB,GAAE,mBAA4B,GAC9C,qBAAqB,EAAE,CA4BzB;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAEzD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,iBAAiB,GAAG,qBAAqB,CAEtE;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,WAK7D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,WAO5D"}
|
|
@@ -25,8 +25,8 @@ export function buildSourcesSet(sources) {
|
|
|
25
25
|
});
|
|
26
26
|
return sv;
|
|
27
27
|
}
|
|
28
|
-
export function buildMediaSourcesList(sources, priorityTransport = '
|
|
29
|
-
const [preferred, rest] = sources.reduce(priorityTransport === 'dash'
|
|
28
|
+
export function buildMediaSourcesList(sources, priorityTransport = 'dash') {
|
|
29
|
+
const [preferred, rest] = sources.reduce(priorityTransport === 'dash'
|
|
30
30
|
? (acc, item) => {
|
|
31
31
|
if (canPlayDash(item.source, item.mimeType)) {
|
|
32
32
|
acc[0].push(item);
|
|
@@ -60,7 +60,6 @@ function guessMimeType(s) {
|
|
|
60
60
|
if (s.endsWith('.m3u8')) {
|
|
61
61
|
return 'application/vnd.apple.mpegurl';
|
|
62
62
|
}
|
|
63
|
-
throw new Error('Unrecognized media source type');
|
|
64
63
|
}
|
|
65
64
|
export function isDashSource(source, mimeType) {
|
|
66
65
|
if (mimeType) {
|
package/package.json
CHANGED
|
@@ -87,17 +87,12 @@ describe('Player', () => {
|
|
|
87
87
|
})
|
|
88
88
|
describe('selecting media source', () => {
|
|
89
89
|
describe.each([
|
|
90
|
-
[undefined, true, true, 'http://0eab.cdn.globo.com/1932-1447.mpd'],
|
|
91
90
|
['dash', true, true, 'http://0eab.cdn.globo.com/1932-1447.mpd'],
|
|
92
91
|
['dash', false, true, 'http://0eab.cdn.globo.com/1932-1447.m3u8'],
|
|
93
92
|
['dash', false, false, undefined],
|
|
94
93
|
['hls', true, true, 'http://0eab.cdn.globo.com/1932-1447.m3u8'],
|
|
95
94
|
['hls', true, false, 'http://0eab.cdn.globo.com/1932-1447.mpd'],
|
|
96
95
|
['hls', false, false, undefined],
|
|
97
|
-
['auto', true, true, 'http://0eab.cdn.globo.com/1932-1447.mpd'],
|
|
98
|
-
['auto', true, false, 'http://0eab.cdn.globo.com/1932-1447.mpd'],
|
|
99
|
-
['auto', false, true, 'http://0eab.cdn.globo.com/1932-1447.m3u8'],
|
|
100
|
-
['auto', false, false, undefined],
|
|
101
96
|
])(
|
|
102
97
|
' according to the preference (%s) and capabilities (dash=%s, hls=%s)',
|
|
103
98
|
(priority, dash, hls, source: string | undefined) => {
|
|
@@ -143,123 +138,6 @@ describe('Player', () => {
|
|
|
143
138
|
},
|
|
144
139
|
)
|
|
145
140
|
})
|
|
146
|
-
describe('on media source failure', () => {
|
|
147
|
-
let player: Player
|
|
148
|
-
let clappr: any
|
|
149
|
-
let clock: ReturnType<typeof FakeTimers.install>
|
|
150
|
-
beforeEach(async () => {
|
|
151
|
-
Logger.enable('*')
|
|
152
|
-
clock = FakeTimers.install()
|
|
153
|
-
vi.mocked(Loader).registeredPlaybacks = [
|
|
154
|
-
MockDashPlayback,
|
|
155
|
-
MockHlsPlayback,
|
|
156
|
-
MockHTML5VideoPlayback,
|
|
157
|
-
]
|
|
158
|
-
clappr = createMockClapprPlayer() as any
|
|
159
|
-
const playback = new MockDashPlayback({} as any, {} as any)
|
|
160
|
-
clappr.core.activePlayback = playback
|
|
161
|
-
vi.mocked(PlayerClappr).mockReturnValue(clappr as any)
|
|
162
|
-
player = new Player({
|
|
163
|
-
sources: [
|
|
164
|
-
{
|
|
165
|
-
source: 'http://0eab.cdn.globo.com/1932-1447.mpd',
|
|
166
|
-
mimeType: 'application/dash+xml',
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
source: 'http://0eab.cdn.globo.com/1932-1447.m3u8',
|
|
170
|
-
mimeType: 'application/vnd.apple.mpegurl',
|
|
171
|
-
},
|
|
172
|
-
// TODO configure as a separate fallback source
|
|
173
|
-
// {
|
|
174
|
-
// source: 'http://0eab.cdn.globo.com/1932-1447_mpegts.m3u8',
|
|
175
|
-
// mimeType: 'application/mpegts',
|
|
176
|
-
// },
|
|
177
|
-
],
|
|
178
|
-
})
|
|
179
|
-
const node = document.createElement('div')
|
|
180
|
-
player.attachTo(node)
|
|
181
|
-
await clock.tickAsync(4000)
|
|
182
|
-
playback.trigger('playback:error', {
|
|
183
|
-
code: PlaybackErrorCode.MediaSourceUnavailable, // TODO rename to MediaSourceUnavailable
|
|
184
|
-
message: 'Failed to download http://0eab.cdn.globo.com/1932-1447.mpd',
|
|
185
|
-
})
|
|
186
|
-
})
|
|
187
|
-
afterEach(() => {
|
|
188
|
-
clock.uninstall()
|
|
189
|
-
Logger.enable('')
|
|
190
|
-
})
|
|
191
|
-
it('should try the next sources with a short delay', async () => {
|
|
192
|
-
await clock.tickAsync(400) // 250 initial + random jitter up to 150
|
|
193
|
-
expect(clappr.core.load).toHaveBeenCalledWith(
|
|
194
|
-
'http://0eab.cdn.globo.com/1932-1447.m3u8',
|
|
195
|
-
'application/vnd.apple.mpegurl',
|
|
196
|
-
)
|
|
197
|
-
|
|
198
|
-
// const playback = new MockHlsPlayback({} as any, {} as any)
|
|
199
|
-
// clappr.core.activePlayback = playback
|
|
200
|
-
// clappr.core.trigger('core:active:container:changed', {})
|
|
201
|
-
// await clock.tickAsync(300)
|
|
202
|
-
// clappr.core.load.mockClear()
|
|
203
|
-
// playback.trigger('playback:error', {
|
|
204
|
-
// code: PlaybackErrorCode.MediaSourceUnavailable,
|
|
205
|
-
// message: 'Failed to download http://0eab.cdn.globo.com/1932-1447.m3u8',
|
|
206
|
-
// })
|
|
207
|
-
// await clock.tickAsync(400)
|
|
208
|
-
// expect(clappr.core.load).toHaveBeenCalledWith(
|
|
209
|
-
// 'http://0eab.cdn.globo.com/1932-1447_mpegts.m3u8',
|
|
210
|
-
// 'application/mpegts',
|
|
211
|
-
// )
|
|
212
|
-
})
|
|
213
|
-
describe('when rolled over to the first source', () => {
|
|
214
|
-
beforeEach(async () => {
|
|
215
|
-
await clock.tickAsync(400) // initial retry has passed
|
|
216
|
-
clappr.core.load.mockClear()
|
|
217
|
-
const playback = new MockHlsPlayback({} as any, {} as any)
|
|
218
|
-
clappr.core.activePlayback = playback
|
|
219
|
-
clappr.core.trigger('core:active:container:changed', {})
|
|
220
|
-
await clock.tickAsync(300)
|
|
221
|
-
playback.trigger('playback:error', {
|
|
222
|
-
code: PlaybackErrorCode.MediaSourceUnavailable,
|
|
223
|
-
message:
|
|
224
|
-
'Failed to download http://0eab.cdn.globo.com/1932-1447.m3u8',
|
|
225
|
-
})
|
|
226
|
-
await clock.tickAsync(400)
|
|
227
|
-
clappr.core.load.mockClear()
|
|
228
|
-
})
|
|
229
|
-
afterEach(() => {
|
|
230
|
-
// Logger.enable('')
|
|
231
|
-
})
|
|
232
|
-
it('should start increasing the delay exponentially per source', async () => {
|
|
233
|
-
expect(clappr.core.load).not.toHaveBeenCalled()
|
|
234
|
-
await clock.tickAsync(250)
|
|
235
|
-
expect(clappr.core.load).toHaveBeenCalledWith(
|
|
236
|
-
'http://0eab.cdn.globo.com/1932-1447.mpd',
|
|
237
|
-
'application/dash+xml',
|
|
238
|
-
)
|
|
239
|
-
// )
|
|
240
|
-
// // TODO
|
|
241
|
-
// clappr.core.load.mockClear()
|
|
242
|
-
// const p2 = new MockDashPlayback({} as any, {} as any)
|
|
243
|
-
// clappr.core.activePlayback = p2
|
|
244
|
-
// clappr.core.trigger('core:active:container:changed', {})
|
|
245
|
-
// await clock.tickAsync(300)
|
|
246
|
-
// p2.trigger('playback:error', {
|
|
247
|
-
// code: PlaybackErrorCode.MediaSourceUnavailable,
|
|
248
|
-
// message: 'Failed to download http://0eab.cdn.globo.com/1932-1447.mpd',
|
|
249
|
-
// })
|
|
250
|
-
// await clock.tickAsync(400)
|
|
251
|
-
// expect(clappr.core.load).not.toHaveBeenCalledWith(
|
|
252
|
-
// 'http://0eab.cdn.globo.com/1932-1447.m3u8',
|
|
253
|
-
// 'application/vnd.apple.mpegurl',
|
|
254
|
-
// )
|
|
255
|
-
// await clock.tickAsync(250)
|
|
256
|
-
// expect(clappr.core.load).toHaveBeenCalledWith(
|
|
257
|
-
// 'http://0eab.cdn.globo.com/1932-1447.m3u8',
|
|
258
|
-
// 'application/vnd.apple.mpegurl',
|
|
259
|
-
// )
|
|
260
|
-
})
|
|
261
|
-
})
|
|
262
|
-
})
|
|
263
141
|
})
|
|
264
142
|
|
|
265
143
|
class MockPlayback extends EventLite {
|
package/src/index.ts
CHANGED
package/src/playback.types.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Playback time in seconds since the beginning of the stream (or a segment for the live streams)
|
|
3
3
|
* For the plugin development
|
|
4
|
-
* @
|
|
4
|
+
* @beta
|
|
5
5
|
*/
|
|
6
6
|
export type TimeValue = number
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* For the plugin development
|
|
10
|
-
* @
|
|
10
|
+
* @beta
|
|
11
11
|
*/
|
|
12
12
|
export type TimePosition = {
|
|
13
13
|
current: TimeValue
|
|
@@ -16,13 +16,13 @@ export type TimePosition = {
|
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* For the plugin development
|
|
19
|
-
* @
|
|
19
|
+
* @beta
|
|
20
20
|
*/
|
|
21
21
|
export type TimeProgress = TimePosition & { start: number }
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* For the plugin development
|
|
25
|
-
* @
|
|
25
|
+
* @beta
|
|
26
26
|
*/
|
|
27
27
|
export type TimeUpdate = TimePosition & {
|
|
28
28
|
firstFragDateTime: number
|
|
@@ -47,6 +47,9 @@ export enum PlaybackErrorCode {
|
|
|
47
47
|
QualityLevelUnavailable = 2,
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* @beta
|
|
52
|
+
*/
|
|
50
53
|
export type ErrorLevel = 'FATAL' | 'WARN' | 'INFO'
|
|
51
54
|
|
|
52
55
|
/**
|
package/src/testUtils.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import EventLite from 'event-lite'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export class _MockPlayback extends EventLite {
|
|
7
|
+
constructor(
|
|
8
|
+
protected options: any,
|
|
9
|
+
readonly i18n: any,
|
|
10
|
+
protected playerError?: any,
|
|
11
|
+
) {
|
|
12
|
+
super()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get name() {
|
|
16
|
+
return 'mock'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
consent() {}
|
|
20
|
+
|
|
21
|
+
play() {}
|
|
22
|
+
|
|
23
|
+
pause() {}
|
|
24
|
+
|
|
25
|
+
stop() {}
|
|
26
|
+
|
|
27
|
+
destroy() {}
|
|
28
|
+
|
|
29
|
+
seek() {}
|
|
30
|
+
|
|
31
|
+
seekPercentage() {}
|
|
32
|
+
|
|
33
|
+
getDuration() {
|
|
34
|
+
return 100
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
enterPiP() {}
|
|
38
|
+
|
|
39
|
+
exitPiP() {}
|
|
40
|
+
|
|
41
|
+
getPlaybackType() {
|
|
42
|
+
return 'live'
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getStartTimeOffset() {
|
|
46
|
+
return 0
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
getCurrentTime() {
|
|
50
|
+
return 0
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
isHighDefinitionInUse() {
|
|
54
|
+
return false
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
mute() {}
|
|
58
|
+
|
|
59
|
+
unmute() {}
|
|
60
|
+
|
|
61
|
+
volume() {}
|
|
62
|
+
|
|
63
|
+
configure() {}
|
|
64
|
+
|
|
65
|
+
attemptAutoPlay() {
|
|
66
|
+
return true
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
canAutoPlay() {
|
|
70
|
+
return true
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
onResize() {
|
|
74
|
+
return true
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
trigger(event: string, ...args: any[]) {
|
|
78
|
+
this.emit(event, ...args)
|
|
79
|
+
}
|
|
80
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -51,7 +51,7 @@ export type MediaTransport = 'dash' | 'hls'
|
|
|
51
51
|
/**
|
|
52
52
|
* @beta
|
|
53
53
|
*/
|
|
54
|
-
export type TransportPreference = MediaTransport
|
|
54
|
+
export type TransportPreference = MediaTransport
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
57
|
* @beta
|
|
@@ -151,7 +151,7 @@ export interface PlayerConfig extends Record<string, unknown> {
|
|
|
151
151
|
|
|
152
152
|
/**
|
|
153
153
|
* Preferred transport protocol when multiple sources are available.
|
|
154
|
-
* @defaultValue '
|
|
154
|
+
* @defaultValue 'dash'
|
|
155
155
|
*/
|
|
156
156
|
priorityTransport?: TransportPreference
|
|
157
157
|
|
|
@@ -58,47 +58,6 @@ describe('mediaSources', () => {
|
|
|
58
58
|
},
|
|
59
59
|
],
|
|
60
60
|
],
|
|
61
|
-
[
|
|
62
|
-
'auto',
|
|
63
|
-
true,
|
|
64
|
-
true,
|
|
65
|
-
[
|
|
66
|
-
{
|
|
67
|
-
source: 'http://example.com/video.m3u8',
|
|
68
|
-
mimeType: 'application/vnd.apple.mpegurl',
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
source: 'http://example.com/video.mpd',
|
|
72
|
-
mimeType: 'application/dash+xml',
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
source: 'http://example.com/video2.mpd',
|
|
76
|
-
mimeType: 'application/dash+xml',
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
source: 'http://example.com/video3.m3u8',
|
|
80
|
-
mimeType: 'application/vnd.apple.mpegurl',
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
[
|
|
84
|
-
{
|
|
85
|
-
source: 'http://example.com/video.mpd',
|
|
86
|
-
mimeType: 'application/dash+xml',
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
source: 'http://example.com/video2.mpd',
|
|
90
|
-
mimeType: 'application/dash+xml',
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
source: 'http://example.com/video.m3u8',
|
|
94
|
-
mimeType: 'application/vnd.apple.mpegurl',
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
source: 'http://example.com/video3.m3u8',
|
|
98
|
-
mimeType: 'application/vnd.apple.mpegurl',
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
],
|
|
102
61
|
[
|
|
103
62
|
'hls',
|
|
104
63
|
true,
|