@gcorevideo/player 0.0.4 → 0.1.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 +42701 -1
- package/lib/Player.d.ts +12 -0
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +53 -11
- package/lib/plugins/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/plugins/dash-playback/DashPlayback.js +4 -7
- package/package.json +3 -9
- package/src/Player.ts +78 -9
- package/src/plugins/dash-playback/DashPlayback.ts +4 -7
- package/tsconfig.tsbuildinfo +1 -1
- package/src/typings/@clappr/plugins.d.ts +0 -29
- package/src/typings/clappr-zepto.xd.xts +0 -44
- package/src/utils/canAutoplay.ts +0 -39
- /package/src/{typings → xtypings}/@clappr/core/error_mixin.d.ts +0 -0
- /package/src/{typings → xtypings}/@clappr/core/events.d.ts +0 -0
- /package/src/{typings → xtypings}/@clappr/core/html5_video.d.ts +0 -0
- /package/src/{typings → xtypings}/@clappr/core/playback.d.ts +0 -0
- /package/src/{typings → xtypings}/@clappr/core/player.d.ts +0 -0
- /package/src/{typings → xtypings}/globals.d.ts +0 -0
package/lib/Player.d.ts
CHANGED
|
@@ -9,6 +9,13 @@ export declare enum PlayerEvent {
|
|
|
9
9
|
Ended = "ended"
|
|
10
10
|
}
|
|
11
11
|
type PlayerEventHandler<T extends PlayerEvent> = () => void;
|
|
12
|
+
export type PlaybackModule = 'dash' | 'hls' | 'native';
|
|
13
|
+
type BitrateInfo = {
|
|
14
|
+
height: number;
|
|
15
|
+
width: number;
|
|
16
|
+
bitrate: number;
|
|
17
|
+
level: number;
|
|
18
|
+
};
|
|
12
19
|
/**
|
|
13
20
|
* @beta
|
|
14
21
|
*/
|
|
@@ -21,6 +28,10 @@ export declare class Player {
|
|
|
21
28
|
private tuneInEntered;
|
|
22
29
|
private supportedMediaTransports;
|
|
23
30
|
private config;
|
|
31
|
+
private bitrateInfo;
|
|
32
|
+
get playbackModule(): PlaybackModule | null;
|
|
33
|
+
get bitrate(): BitrateInfo | null;
|
|
34
|
+
get hd(): any;
|
|
24
35
|
get playing(): boolean;
|
|
25
36
|
get ready(): boolean;
|
|
26
37
|
constructor(config: PlayerConfig);
|
|
@@ -45,6 +56,7 @@ export declare class Player {
|
|
|
45
56
|
private getAvailableTransportsPreference;
|
|
46
57
|
private checkMediaTransportsSupport;
|
|
47
58
|
private processMultisources;
|
|
59
|
+
private bindBitrateChangeHandler;
|
|
48
60
|
}
|
|
49
61
|
export {};
|
|
50
62
|
//# sourceMappingURL=Player.d.ts.map
|
package/lib/Player.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAYA,OAAO,2BAA2B,CAAC;AAQnC,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EAGb,MAAM,YAAY,CAAC;AAKpB,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAID,KAAK,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAC;AAU5D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AASvD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAA;AAID;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAmB;IAElC,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO,CAAC,aAAa,CAAkC;IAEvD,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,KAAK,CAA8C;IAE3D,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,wBAAwB,CAAwB;IAExD,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,WAAW,CAA4B;IAE/C,IAAI,cAAc,IAAI,cAAc,GAAG,IAAI,CAY1C;IAED,IAAI,OAAO,IAAI,WAAW,GAAG,IAAI,CAEhC;IAED,IAAI,EAAE,QAEL;IAED,IAAI,OAAO,YAEV;IAED,IAAI,KAAK,YAER;gBAGC,MAAM,EAAE,YAAY;IAKtB,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIlE,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAI7D,IAAI,CAAC,aAAa,EAAE,WAAW;IA4BrC,OAAO;IAQP,KAAK;IAKL,IAAI;IAKJ,MAAM,CAAC,IAAI,EAAE,MAAM;IAKnB,IAAI;IAKJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY;IAI1C,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;YA0BJ,MAAM;IAwCpB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,MAAM,CA6CZ;IAEF,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,gCAAgC;IAaxC,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,wBAAwB;CAOjC"}
|
package/lib/Player.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { Browser, Log, Player as PlayerClappr, $, Loader, } from '@clappr/core';
|
|
1
|
+
import { Browser, Events as ClapprEvents, Log, Player as PlayerClappr, $, Loader, } from '@clappr/core';
|
|
2
2
|
import assert from 'assert';
|
|
3
3
|
import Hls from 'hls.js';
|
|
4
4
|
import EventLite from "event-lite";
|
|
5
5
|
import '../assets/style/main.scss'; // TODO check if needed
|
|
6
6
|
import { reportError, trace } from "./trace/index.js";
|
|
7
|
+
import DashPlayback from './plugins/dash-playback/DashPlayback.js';
|
|
8
|
+
import HlsPlayback from './plugins/hls-playback/HlsPlayback.js';
|
|
7
9
|
export var PlayerEvent;
|
|
8
10
|
(function (PlayerEvent) {
|
|
9
11
|
PlayerEvent["Ready"] = "ready";
|
|
@@ -30,6 +32,26 @@ export class Player {
|
|
|
30
32
|
tuneInEntered = false;
|
|
31
33
|
supportedMediaTransports = [];
|
|
32
34
|
config;
|
|
35
|
+
bitrateInfo = null;
|
|
36
|
+
get playbackModule() {
|
|
37
|
+
if (!this.player?.core.activePlayback) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
switch (this.player.core.activePlayback.name) {
|
|
41
|
+
case 'dash':
|
|
42
|
+
return 'dash';
|
|
43
|
+
case 'hls':
|
|
44
|
+
return 'hls';
|
|
45
|
+
default:
|
|
46
|
+
return 'native';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
get bitrate() {
|
|
50
|
+
return this.bitrateInfo;
|
|
51
|
+
}
|
|
52
|
+
get hd() {
|
|
53
|
+
return this.player?.core.activePlayback?.isHighDefinitionInUse || false;
|
|
54
|
+
}
|
|
33
55
|
get playing() {
|
|
34
56
|
return this.player ? this.player.isPlaying() : false;
|
|
35
57
|
}
|
|
@@ -62,7 +84,6 @@ export class Player {
|
|
|
62
84
|
container: Object.values(container),
|
|
63
85
|
playback: Loader.registeredPlaybacks,
|
|
64
86
|
};
|
|
65
|
-
console.log('plugins', coreOpts.plugins);
|
|
66
87
|
return this.initPlayer(coreOpts);
|
|
67
88
|
});
|
|
68
89
|
}
|
|
@@ -126,6 +147,19 @@ export class Player {
|
|
|
126
147
|
}
|
|
127
148
|
this.tuneInEntered = true;
|
|
128
149
|
const player = this.player;
|
|
150
|
+
try {
|
|
151
|
+
this.emitter.emit(PlayerEvent.Ready);
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
reportError(e);
|
|
155
|
+
}
|
|
156
|
+
if (player.core.activeContainer) {
|
|
157
|
+
this.bindBitrateChangeHandler();
|
|
158
|
+
}
|
|
159
|
+
player.core.on(ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
160
|
+
trace(`${T} onActiveContainerChanged`);
|
|
161
|
+
this.bindBitrateChangeHandler();
|
|
162
|
+
}, null);
|
|
129
163
|
if (Browser.isiOS &&
|
|
130
164
|
player.core.activePlayback) {
|
|
131
165
|
player.core.activePlayback.$el.on('webkitendfullscreen', () => {
|
|
@@ -139,7 +173,9 @@ export class Player {
|
|
|
139
173
|
}
|
|
140
174
|
}
|
|
141
175
|
configurePlugins() {
|
|
142
|
-
|
|
176
|
+
// TODO remove !isiOS?
|
|
177
|
+
const useDash = !Browser.isiOS && this.config.multisources.some((el) => el.sourceDash && DashPlayback.canPlay(el.sourceDash));
|
|
178
|
+
if (useDash) {
|
|
143
179
|
this.scheduleLoad(async () => {
|
|
144
180
|
const module = await import('./plugins/dash-playback/DashPlayback.js');
|
|
145
181
|
Loader.registerPlayback(module.default);
|
|
@@ -147,7 +183,8 @@ export class Player {
|
|
|
147
183
|
}
|
|
148
184
|
// TODO remove !isiOS?
|
|
149
185
|
// if (!Browser.isiOS && this.config.multisources.some((el) => el.hls_mpegts_url)) {
|
|
150
|
-
|
|
186
|
+
const useHls = this.config.multisources.some((el) => HlsPlayback.canPlay(el.hlsCmafUrl || el.hlsMpegtsUrl || el.source));
|
|
187
|
+
if (useHls) {
|
|
151
188
|
this.scheduleLoad(async () => {
|
|
152
189
|
const module = await import('./plugins/hls-playback/HlsPlayback.js');
|
|
153
190
|
Loader.registerPlayback(module.default);
|
|
@@ -156,22 +193,20 @@ export class Player {
|
|
|
156
193
|
}
|
|
157
194
|
events = {
|
|
158
195
|
onReady: () => {
|
|
196
|
+
trace(`${T} onReady`, { clapprReady: this.clapprReady, player: !!this.player, core: !!this.player?.core, activeContainer: !!this.player?.core.activeContainer });
|
|
159
197
|
if (this.clapprReady) {
|
|
160
198
|
return;
|
|
161
199
|
}
|
|
162
200
|
this.clapprReady = true;
|
|
201
|
+
// TODO figure out what's for
|
|
163
202
|
if (this.timer) {
|
|
164
203
|
clearTimeout(this.timer);
|
|
165
204
|
this.timer = null;
|
|
166
205
|
}
|
|
167
|
-
trace(`${T} onReady
|
|
206
|
+
// trace(`${T} onReady`, {
|
|
207
|
+
// activeContainer: !!this.player?.core.activeContainer,
|
|
208
|
+
// });
|
|
168
209
|
setTimeout(() => this.tuneIn(), 0);
|
|
169
|
-
try {
|
|
170
|
-
this.emitter.emit(PlayerEvent.Ready);
|
|
171
|
-
}
|
|
172
|
-
catch (e) {
|
|
173
|
-
reportError(e);
|
|
174
|
-
}
|
|
175
210
|
},
|
|
176
211
|
onPlay: () => {
|
|
177
212
|
try {
|
|
@@ -301,6 +336,13 @@ export class Player {
|
|
|
301
336
|
source: this.selectMediaTransport(ms, transport),
|
|
302
337
|
})).filter((el) => !!el.source);
|
|
303
338
|
}
|
|
339
|
+
bindBitrateChangeHandler() {
|
|
340
|
+
trace(`${T} bindBitrateChangeHandler`, { activePlayback: !!this.player?.core.activePlayback });
|
|
341
|
+
this.player?.core.activeContainer.on(ClapprEvents.CONTAINER_BITRATE, (bitrate) => {
|
|
342
|
+
trace(`${T} onPlaybackBitrate`, { bitrate });
|
|
343
|
+
this.bitrateInfo = bitrate;
|
|
344
|
+
});
|
|
345
|
+
}
|
|
304
346
|
}
|
|
305
347
|
function unwrapSource(s) {
|
|
306
348
|
if (!s) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAO,QAAQ,EAA4B,MAAM,cAAc,CAAC;AAE3F,OAAO,MAAM,EAAG,EACd,UAAU,IAAI,cAAc,EAC5B,kBAAkB,IAAI,sBAAsB,EAC5C,KAAK,WAAW,EAEhB,aAAa,EACd,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAM5E,KAAK,YAAY,GACb,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,IAAI,GACpB,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,KAAK,CAAC;AAE1B,KAAK,YAAY,GAAG,MAAM,CAAC;AAE3B,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAID,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU;IAClD,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAQ;IAEtC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,mCAAmC,EAAE,OAAO,CAAS;IAErD,aAAa,EAAE,OAAO,CAAS;IAE/B,uBAAuB,EAAE,MAAM,CAAK;IAEpC,wBAAwB,EAAE,MAAM,CAAK;IAErC,aAAa,EAAE,YAAY,CAAgB;IAE3C,aAAa,EAAE,YAAY,GAAG,IAAI,CAAQ;IAG1C,gBAAgB,EAAE,SAAS,CAAK;IAEhC,KAAK,EAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAQ;IAE7C,2BAA2B,EAAE,MAAM,CAAK;IAExC,8BAA8B,EAAE,MAAM,CAAK;IAE3C,aAAa,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAEtC,eAAe,EAAE,YAAY,CAA4B;IAEzD,0BAA0B,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE/D,wBAAwB,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE7D,yBAAyB,EAAE,MAAM,CAAK;IAEtC,yBAAyB,UAAS;IAElC,uBAAuB,UAAS;IAEhC,kBAAkB,UAAS;IAE3B,YAAY,EAAE,aAAa,GAAG,IAAI,CAAQ;IAG1C,sBAAsB,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAE/C,gBAAgB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAQ;IAE/D,IAAI,IAAI,WAEP;IAED,IAAI,MAAM,IAAI,YAAY,EAAE,CAE3B;IAED,IAAI,YAAY,IAAI,MAAM,CAMzB;IAED,IAAI,OAAO,YAEV;IAED,IAAI,YAAY,CAAC,EAAE,EAZC,MAYD,EAgClB;IAED,IAAI,UAAU,WAMb;IAED,IAAI,IAAI,WAEP;IAID,IAAI,sBAAsB,WAWzB;IAID,IAAI,oBAAoB,WAYvB;IAED,IAAI,SAAS,kBAMZ;gBAEW,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG;IAiDzD,MAAM;
|
|
1
|
+
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}
|
|
@@ -193,13 +193,10 @@ export default class DashPlayback extends HTML5Video {
|
|
|
193
193
|
});
|
|
194
194
|
});
|
|
195
195
|
this._dash.on(DASHJS.MediaPlayer.events.METRIC_ADDED, (e) => {
|
|
196
|
-
// console.log(`${T} onMetricAdded`, e);
|
|
197
|
-
// TODO
|
|
198
196
|
// Listen for the first manifest request in order to update player UI
|
|
199
197
|
if (e.metric === 'DVRInfo') { // TODO fix typings
|
|
200
198
|
assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to get metrics');
|
|
201
199
|
const dvrInfo = this._dash.getDashMetrics().getCurrentDVRInfo('video');
|
|
202
|
-
// trace(`${T} onMetricAdded DVRInfo`, {metric: e.metric, dvrInfo});
|
|
203
200
|
if (dvrInfo) {
|
|
204
201
|
// Extract time info
|
|
205
202
|
this.manifestInfo = dvrInfo.manifestInfo;
|
|
@@ -647,12 +644,12 @@ export default class DashPlayback extends HTML5Video {
|
|
|
647
644
|
}
|
|
648
645
|
}
|
|
649
646
|
DashPlayback.canPlay = function (resource, mimeType) {
|
|
650
|
-
|
|
647
|
+
trace(`${T} canPlay resource:%s mimeType:%s`, { resource, mimeType });
|
|
651
648
|
const resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || [];
|
|
652
649
|
const isDash = ((resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'mpd') ||
|
|
653
650
|
mimeType === 'application/dash+xml' || mimeType === 'video/mp4');
|
|
654
651
|
const ctor = window.MediaSource || ('WebKitMediaSource' in window ? window.WebKitMediaSource : undefined);
|
|
655
|
-
const
|
|
656
|
-
|
|
657
|
-
return !!(
|
|
652
|
+
const hasBrowserSupport = typeof ctor === 'function';
|
|
653
|
+
trace(`${T} canPlay isSupportByBrowser:%s isDash:%s`, { isSupportByBrowser: hasBrowserSupport, isDash });
|
|
654
|
+
return !!(hasBrowserSupport && isDash);
|
|
658
655
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gcorevideo/player",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Gcore JavaScript video player",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -32,26 +32,20 @@
|
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@rollup/plugin-commonjs": "^28.0.1",
|
|
34
34
|
"@rollup/plugin-node-resolve": "^15.3.0",
|
|
35
|
-
"@types/can-autoplay": "^3.0.5",
|
|
36
35
|
"@types/node": "^22.10.1",
|
|
37
|
-
"@types/ua-parser-js": "^0.7.39",
|
|
38
36
|
"assert": "^2.1.0",
|
|
39
37
|
"rollup": "^4.27.4",
|
|
40
38
|
"rollup-plugin-polyfill-node": "^0.13.0",
|
|
41
39
|
"rollup-plugin-sass": "^1.14.0",
|
|
42
|
-
"rollup-plugin-scss": "^4.0.1",
|
|
43
40
|
"rollup-plugin-string": "^3.0.0",
|
|
44
41
|
"sass": "^1.83.0",
|
|
45
42
|
"typescript": "^5.7.2"
|
|
46
43
|
},
|
|
47
44
|
"dependencies": {
|
|
48
45
|
"@clappr/core": "^0.11.3",
|
|
49
|
-
"@
|
|
50
|
-
"@sentry/browser": "^8.41.0",
|
|
51
|
-
"can-autoplay": "^3.0.2",
|
|
46
|
+
"@sentry/types": "^8.47.0",
|
|
52
47
|
"dashjs": "^4.7.4",
|
|
53
48
|
"event-lite": "^1.0.0",
|
|
54
|
-
"hls.js": "^1.5.17"
|
|
55
|
-
"ua-parser-js": "^2.0.0"
|
|
49
|
+
"hls.js": "^1.5.17"
|
|
56
50
|
}
|
|
57
51
|
}
|
package/src/Player.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Browser,
|
|
3
|
+
Events as ClapprEvents,
|
|
3
4
|
Log,
|
|
4
5
|
Player as PlayerClappr,
|
|
5
6
|
$,
|
|
@@ -28,6 +29,9 @@ import {
|
|
|
28
29
|
MediaTransport,
|
|
29
30
|
TransportPreference,
|
|
30
31
|
} from "./types.js";
|
|
32
|
+
import DashPlayback from './plugins/dash-playback/DashPlayback.js';
|
|
33
|
+
import HlsPlayback from './plugins/hls-playback/HlsPlayback.js';
|
|
34
|
+
import Playback from '@clappr/core/types/base/playback/playback';
|
|
31
35
|
|
|
32
36
|
export enum PlayerEvent {
|
|
33
37
|
Ready = 'ready',
|
|
@@ -49,6 +53,22 @@ const DEFAULT_OPTIONS: Partial<PlayerConfig> = {
|
|
|
49
53
|
loop: false,
|
|
50
54
|
}
|
|
51
55
|
|
|
56
|
+
export type PlaybackModule = 'dash' | 'hls' | 'native';
|
|
57
|
+
|
|
58
|
+
// TODO drop
|
|
59
|
+
// export type PlaybackInfo = {
|
|
60
|
+
// bitrate: number;
|
|
61
|
+
// hd: boolean;
|
|
62
|
+
// latency: number;
|
|
63
|
+
// }
|
|
64
|
+
|
|
65
|
+
type BitrateInfo = {
|
|
66
|
+
height: number;
|
|
67
|
+
width: number;
|
|
68
|
+
bitrate: number;
|
|
69
|
+
level: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
52
72
|
type PluginOptions = Record<string, unknown>;
|
|
53
73
|
|
|
54
74
|
/**
|
|
@@ -71,6 +91,30 @@ export class Player {
|
|
|
71
91
|
|
|
72
92
|
private config: PlayerConfig;
|
|
73
93
|
|
|
94
|
+
private bitrateInfo: BitrateInfo | null = null;
|
|
95
|
+
|
|
96
|
+
get playbackModule(): PlaybackModule | null {
|
|
97
|
+
if (!this.player?.core.activePlayback) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
switch (this.player.core.activePlayback.name) {
|
|
101
|
+
case 'dash':
|
|
102
|
+
return 'dash';
|
|
103
|
+
case 'hls':
|
|
104
|
+
return 'hls';
|
|
105
|
+
default:
|
|
106
|
+
return 'native';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
get bitrate(): BitrateInfo | null {
|
|
111
|
+
return this.bitrateInfo;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
get hd() {
|
|
115
|
+
return this.player?.core.activePlayback?.isHighDefinitionInUse || false;
|
|
116
|
+
}
|
|
117
|
+
|
|
74
118
|
get playing() {
|
|
75
119
|
return this.player ? this.player.isPlaying() : false;
|
|
76
120
|
}
|
|
@@ -117,7 +161,6 @@ export class Player {
|
|
|
117
161
|
container: Object.values(container),
|
|
118
162
|
playback: Loader.registeredPlaybacks,
|
|
119
163
|
} as CorePluginOptions;
|
|
120
|
-
console.log('plugins', coreOpts.plugins);
|
|
121
164
|
return this.initPlayer(coreOpts);
|
|
122
165
|
});
|
|
123
166
|
}
|
|
@@ -195,6 +238,18 @@ export class Player {
|
|
|
195
238
|
}
|
|
196
239
|
this.tuneInEntered = true;
|
|
197
240
|
const player = this.player;
|
|
241
|
+
try {
|
|
242
|
+
this.emitter.emit(PlayerEvent.Ready);
|
|
243
|
+
} catch (e) {
|
|
244
|
+
reportError(e);
|
|
245
|
+
}
|
|
246
|
+
if (player.core.activeContainer) {
|
|
247
|
+
this.bindBitrateChangeHandler();
|
|
248
|
+
}
|
|
249
|
+
player.core.on(ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
250
|
+
trace(`${T} onActiveContainerChanged`);
|
|
251
|
+
this.bindBitrateChangeHandler();
|
|
252
|
+
}, null);
|
|
198
253
|
if (
|
|
199
254
|
Browser.isiOS &&
|
|
200
255
|
player.core.activePlayback
|
|
@@ -213,7 +268,11 @@ export class Player {
|
|
|
213
268
|
}
|
|
214
269
|
|
|
215
270
|
private configurePlugins() {
|
|
216
|
-
|
|
271
|
+
// TODO remove !isiOS?
|
|
272
|
+
const useDash = !Browser.isiOS && this.config.multisources.some(
|
|
273
|
+
(el) => el.sourceDash && DashPlayback.canPlay(el.sourceDash)
|
|
274
|
+
);
|
|
275
|
+
if (useDash) {
|
|
217
276
|
this.scheduleLoad(async () => {
|
|
218
277
|
const module = await import('./plugins/dash-playback/DashPlayback.js');
|
|
219
278
|
Loader.registerPlayback(module.default);
|
|
@@ -221,7 +280,10 @@ export class Player {
|
|
|
221
280
|
}
|
|
222
281
|
// TODO remove !isiOS?
|
|
223
282
|
// if (!Browser.isiOS && this.config.multisources.some((el) => el.hls_mpegts_url)) {
|
|
224
|
-
|
|
283
|
+
const useHls = this.config.multisources.some(
|
|
284
|
+
(el) => HlsPlayback.canPlay(el.hlsCmafUrl || el.hlsMpegtsUrl || el.source)
|
|
285
|
+
);
|
|
286
|
+
if (useHls) {
|
|
225
287
|
this.scheduleLoad(async () => {
|
|
226
288
|
const module = await import('./plugins/hls-playback/HlsPlayback.js');
|
|
227
289
|
Loader.registerPlayback(module.default);
|
|
@@ -231,21 +293,20 @@ export class Player {
|
|
|
231
293
|
|
|
232
294
|
private events: CorePlayerEvents = {
|
|
233
295
|
onReady: () => {
|
|
296
|
+
trace(`${T} onReady`, { clapprReady: this.clapprReady, player: !!this.player, core: !!this.player?.core, activeContainer: !!this.player?.core.activeContainer });
|
|
234
297
|
if (this.clapprReady) {
|
|
235
298
|
return;
|
|
236
299
|
}
|
|
237
300
|
this.clapprReady = true;
|
|
301
|
+
// TODO figure out what's for
|
|
238
302
|
if (this.timer) {
|
|
239
303
|
clearTimeout(this.timer);
|
|
240
304
|
this.timer = null;
|
|
241
305
|
}
|
|
242
|
-
trace(`${T} onReady
|
|
306
|
+
// trace(`${T} onReady`, {
|
|
307
|
+
// activeContainer: !!this.player?.core.activeContainer,
|
|
308
|
+
// });
|
|
243
309
|
setTimeout(() => this.tuneIn(), 0);
|
|
244
|
-
try {
|
|
245
|
-
this.emitter.emit(PlayerEvent.Ready);
|
|
246
|
-
} catch (e) {
|
|
247
|
-
reportError(e);
|
|
248
|
-
}
|
|
249
310
|
},
|
|
250
311
|
onPlay: () => {
|
|
251
312
|
try {
|
|
@@ -380,6 +441,14 @@ export class Player {
|
|
|
380
441
|
source: this.selectMediaTransport(ms, transport),
|
|
381
442
|
})).filter((el): el is StreamMediaSource => !!el.source);
|
|
382
443
|
}
|
|
444
|
+
|
|
445
|
+
private bindBitrateChangeHandler() {
|
|
446
|
+
trace(`${T} bindBitrateChangeHandler`, { activePlayback: !!this.player?.core.activePlayback });
|
|
447
|
+
this.player?.core.activeContainer.on(ClapprEvents.CONTAINER_BITRATE, (bitrate: BitrateInfo) => {
|
|
448
|
+
trace(`${T} onPlaybackBitrate`, { bitrate });
|
|
449
|
+
this.bitrateInfo = bitrate;
|
|
450
|
+
});
|
|
451
|
+
}
|
|
383
452
|
}
|
|
384
453
|
|
|
385
454
|
function unwrapSource(s: PlayerMediaSource | undefined): string | undefined {
|
|
@@ -279,13 +279,10 @@ export default class DashPlayback extends HTML5Video {
|
|
|
279
279
|
});
|
|
280
280
|
|
|
281
281
|
this._dash.on(DASHJS.MediaPlayer.events.METRIC_ADDED, (e: DashMetricEvent) => {
|
|
282
|
-
// console.log(`${T} onMetricAdded`, e);
|
|
283
|
-
// TODO
|
|
284
282
|
// Listen for the first manifest request in order to update player UI
|
|
285
283
|
if ((e.metric as string) === 'DVRInfo') { // TODO fix typings
|
|
286
284
|
assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to get metrics');
|
|
287
285
|
const dvrInfo = this._dash.getDashMetrics().getCurrentDVRInfo('video');
|
|
288
|
-
// trace(`${T} onMetricAdded DVRInfo`, {metric: e.metric, dvrInfo});
|
|
289
286
|
if (dvrInfo) {
|
|
290
287
|
// Extract time info
|
|
291
288
|
this.manifestInfo = dvrInfo.manifestInfo;
|
|
@@ -797,12 +794,12 @@ export default class DashPlayback extends HTML5Video {
|
|
|
797
794
|
}
|
|
798
795
|
|
|
799
796
|
DashPlayback.canPlay = function (resource, mimeType) {
|
|
800
|
-
|
|
797
|
+
trace(`${T} canPlay resource:%s mimeType:%s`, {resource, mimeType});
|
|
801
798
|
const resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || [];
|
|
802
799
|
const isDash = ((resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'mpd') ||
|
|
803
800
|
mimeType === 'application/dash+xml' || mimeType === 'video/mp4');
|
|
804
801
|
const ctor = window.MediaSource || ('WebKitMediaSource' in window ? window.WebKitMediaSource : undefined);
|
|
805
|
-
const
|
|
806
|
-
|
|
807
|
-
return !!(
|
|
802
|
+
const hasBrowserSupport = typeof ctor === 'function';
|
|
803
|
+
trace(`${T} canPlay isSupportByBrowser:%s isDash:%s`, {isSupportByBrowser: hasBrowserSupport, isDash});
|
|
804
|
+
return !!(hasBrowserSupport && isDash);
|
|
808
805
|
};
|