@gcorevideo/player 2.7.5 → 2.8.1
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 +22 -75
- package/lib/Player.d.ts +1 -7
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +1 -68
- package/lib/plugins/dash-playback/DashPlayback.d.ts +6 -6
- package/lib/plugins/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/plugins/dash-playback/DashPlayback.js +11 -2
- package/lib/plugins/hls-playback/HlsPlayback.d.ts +3 -3
- package/lib/plugins/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/plugins/hls-playback/HlsPlayback.js +5 -0
- package/lib/utils/mediaSources.js +3 -3
- package/licenses.json +782 -0
- package/package.json +1 -1
- package/src/Player.ts +1 -86
- package/src/plugins/dash-playback/DashPlayback.ts +16 -11
- package/src/plugins/hls-playback/HlsPlayback.ts +6 -1
- package/src/typings/@clappr/core/html5_video.d.ts +20 -21
- package/src/utils/mediaSources.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/src/typings/@clappr/core/events.d.ts +0 -7
- package/src/typings/@clappr/core/player.d.ts +0 -8
package/dist/index.js
CHANGED
|
@@ -12219,6 +12219,7 @@ const DASHJS = /*@__PURE__*/getDefaultExportFromCjs$1(dash_all_minExports);
|
|
|
12219
12219
|
const AUTO$1 = -1;
|
|
12220
12220
|
const { now: now$2 } = Utils;
|
|
12221
12221
|
const T$2 = 'DashPlayback';
|
|
12222
|
+
// @ts-expect-error
|
|
12222
12223
|
class DashPlayback extends HTML5Video {
|
|
12223
12224
|
_levels = null;
|
|
12224
12225
|
_currentLevel = null;
|
|
@@ -12471,24 +12472,29 @@ class DashPlayback extends HTML5Video {
|
|
|
12471
12472
|
}
|
|
12472
12473
|
_updateSettings() {
|
|
12473
12474
|
if (this._playbackType === Playback.VOD) {
|
|
12475
|
+
// @ts-expect-error
|
|
12474
12476
|
this.settings.left = ['playpause', 'position', 'duration'];
|
|
12475
12477
|
}
|
|
12476
12478
|
else if (this.dvrEnabled) {
|
|
12479
|
+
// @ts-expect-error
|
|
12477
12480
|
this.settings.left = ['playpause'];
|
|
12478
12481
|
}
|
|
12479
12482
|
else {
|
|
12483
|
+
// @ts-expect-error
|
|
12480
12484
|
this.settings.left = ['playstop'];
|
|
12481
12485
|
}
|
|
12486
|
+
// @ts-expect-error
|
|
12482
12487
|
this.settings.seekEnabled = this.isSeekEnabled();
|
|
12483
12488
|
this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
|
|
12484
12489
|
}
|
|
12485
12490
|
_onPlaybackError = (event) => {
|
|
12486
12491
|
// TODO
|
|
12492
|
+
trace(`${T$2} _onPlaybackError`, { event });
|
|
12487
12493
|
};
|
|
12488
12494
|
_onDASHJSSError = (event) => {
|
|
12495
|
+
trace(`${T$2} _onDASHJSSError`, { event });
|
|
12489
12496
|
// TODO
|
|
12490
12497
|
// only report/handle errors if they are fatal
|
|
12491
|
-
// hlsjs should automatically handle non fatal errors
|
|
12492
12498
|
this._stopTimeUpdateTimer();
|
|
12493
12499
|
if (event.error === 'capability' && event.event === 'mediasource') {
|
|
12494
12500
|
// No support for MSE
|
|
@@ -12601,7 +12607,10 @@ class DashPlayback extends HTML5Video {
|
|
|
12601
12607
|
super._onDurationChange();
|
|
12602
12608
|
}
|
|
12603
12609
|
get dvrEnabled() {
|
|
12604
|
-
|
|
12610
|
+
if (!this._dash) {
|
|
12611
|
+
trace(`${T$2} dvrEnable no dash player instance`);
|
|
12612
|
+
return false;
|
|
12613
|
+
}
|
|
12605
12614
|
return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
|
|
12606
12615
|
this.getPlaybackType() === Playback.LIVE);
|
|
12607
12616
|
}
|
|
@@ -41303,6 +41312,7 @@ const DEFAULT_RECOVER_ATTEMPTS = 16;
|
|
|
41303
41312
|
Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
|
|
41304
41313
|
Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
|
|
41305
41314
|
const T$1 = 'plugins.hls';
|
|
41315
|
+
// @ts-expect-error
|
|
41306
41316
|
class HlsPlayback extends HTML5Video {
|
|
41307
41317
|
_ccIsSetup = false;
|
|
41308
41318
|
_ccTracksUpdated = false;
|
|
@@ -41671,14 +41681,18 @@ class HlsPlayback extends HTML5Video {
|
|
|
41671
41681
|
}
|
|
41672
41682
|
_updateSettings() {
|
|
41673
41683
|
if (this._playbackType === Playback.VOD) {
|
|
41684
|
+
// @ts-expect-error
|
|
41674
41685
|
this.settings.left = ['playpause', 'position', 'duration'];
|
|
41675
41686
|
}
|
|
41676
41687
|
else if (this.dvrEnabled) {
|
|
41688
|
+
// @ts-expect-error
|
|
41677
41689
|
this.settings.left = ['playpause'];
|
|
41678
41690
|
}
|
|
41679
41691
|
else {
|
|
41692
|
+
// @ts-expect-error
|
|
41680
41693
|
this.settings.left = ['playstop'];
|
|
41681
41694
|
}
|
|
41695
|
+
// @ts-expect-error
|
|
41682
41696
|
this.settings.seekEnabled = this.isSeekEnabled();
|
|
41683
41697
|
this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
|
|
41684
41698
|
}
|
|
@@ -42100,18 +42114,18 @@ function buildSourcesPriorityList(sources, priorityTransport = 'auto') {
|
|
|
42100
42114
|
}
|
|
42101
42115
|
}
|
|
42102
42116
|
function addHls() {
|
|
42103
|
-
if (sources.hls && HlsPlayback.canPlay(sources.hls)) {
|
|
42117
|
+
if (sources.hls && HlsPlayback.canPlay(sources.hls, undefined)) {
|
|
42104
42118
|
msl.push(sources.hls);
|
|
42105
42119
|
sources.hls = null;
|
|
42106
42120
|
}
|
|
42107
42121
|
if (sources.master?.endsWith('.m3u8') &&
|
|
42108
|
-
HlsPlayback.canPlay(sources.master)) {
|
|
42122
|
+
HlsPlayback.canPlay(sources.master, undefined)) {
|
|
42109
42123
|
msl.push(sources.master);
|
|
42110
42124
|
sources.master = null;
|
|
42111
42125
|
}
|
|
42112
42126
|
}
|
|
42113
42127
|
function addDash() {
|
|
42114
|
-
if (sources.dash && DashPlayback.canPlay(sources.dash)) {
|
|
42128
|
+
if (sources.dash && DashPlayback.canPlay(sources.dash, undefined)) {
|
|
42115
42129
|
msl.push(sources.dash);
|
|
42116
42130
|
sources.dash = null;
|
|
42117
42131
|
}
|
|
@@ -42138,7 +42152,6 @@ const DEFAULT_OPTIONS = {
|
|
|
42138
42152
|
* @beta
|
|
42139
42153
|
*/
|
|
42140
42154
|
class Player {
|
|
42141
|
-
qLevel = null;
|
|
42142
42155
|
config = DEFAULT_OPTIONS;
|
|
42143
42156
|
emitter = new EventLite();
|
|
42144
42157
|
player = null;
|
|
@@ -42146,34 +42159,6 @@ class Player {
|
|
|
42146
42159
|
rootNode = null;
|
|
42147
42160
|
tuneInTimerId = null;
|
|
42148
42161
|
tunedIn = false;
|
|
42149
|
-
// get activePlayback(): PlaybackModule | null {
|
|
42150
|
-
// if (!this.player?.core.activePlayback) {
|
|
42151
|
-
// return null
|
|
42152
|
-
// }
|
|
42153
|
-
// switch (this.player.core.activePlayback.name) {
|
|
42154
|
-
// case 'dash':
|
|
42155
|
-
// return 'dash'
|
|
42156
|
-
// case 'hls':
|
|
42157
|
-
// return 'hls'
|
|
42158
|
-
// default:
|
|
42159
|
-
// return 'native'
|
|
42160
|
-
// }
|
|
42161
|
-
// }
|
|
42162
|
-
// get activeSource(): string | null {
|
|
42163
|
-
// if (!this.player?.core.activePlayback) {
|
|
42164
|
-
// return null
|
|
42165
|
-
// }
|
|
42166
|
-
// return this.player.core.activePlayback.options.src
|
|
42167
|
-
// }
|
|
42168
|
-
get bitrate() {
|
|
42169
|
-
return this.qLevel;
|
|
42170
|
-
}
|
|
42171
|
-
get hd() {
|
|
42172
|
-
return this.player?.core.activePlayback?.isHighDefinitionInUse || false;
|
|
42173
|
-
}
|
|
42174
|
-
get playbackType() {
|
|
42175
|
-
return this.player?.core.activePlayback?.getPlaybackType();
|
|
42176
|
-
}
|
|
42177
42162
|
constructor(config) {
|
|
42178
42163
|
this.setConfig(config);
|
|
42179
42164
|
}
|
|
@@ -42225,7 +42210,6 @@ class Player {
|
|
|
42225
42210
|
clearTimeout(this.tuneInTimerId);
|
|
42226
42211
|
this.tuneInTimerId = null;
|
|
42227
42212
|
}
|
|
42228
|
-
this.qLevel = null;
|
|
42229
42213
|
}
|
|
42230
42214
|
pause() {
|
|
42231
42215
|
assert.ok(this.player, 'Player not initialized');
|
|
@@ -42261,19 +42245,11 @@ class Player {
|
|
|
42261
42245
|
}
|
|
42262
42246
|
initPlayer(coreOptions) {
|
|
42263
42247
|
trace(`${T} initPlayer`, {
|
|
42264
|
-
// coreOptions,
|
|
42265
42248
|
// TODO selected options
|
|
42266
42249
|
});
|
|
42267
42250
|
assert.ok(!this.player, 'Player already initialized');
|
|
42268
42251
|
const player = new Player$1(coreOptions);
|
|
42269
42252
|
this.player = player;
|
|
42270
|
-
if (player.core.activeContainer) {
|
|
42271
|
-
trace(`${T} tuneIn bindBitrateChangeHandler`);
|
|
42272
|
-
this.bindBitrateChangeHandler();
|
|
42273
|
-
}
|
|
42274
|
-
player.core.on(Events$1.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
42275
|
-
this.bindBitrateChangeHandler();
|
|
42276
|
-
}, null);
|
|
42277
42253
|
// TODO checks if the whole thing is necessary
|
|
42278
42254
|
this.tuneInTimerId = globalThis.setTimeout(() => {
|
|
42279
42255
|
trace(`${T} tuneInTimer`, {
|
|
@@ -42402,19 +42378,7 @@ class Player {
|
|
|
42402
42378
|
},
|
|
42403
42379
|
};
|
|
42404
42380
|
buildCoreOptions(rootNode) {
|
|
42405
|
-
|
|
42406
|
-
// const multisources = this.config.multisources
|
|
42407
|
-
// const mainSource =
|
|
42408
|
-
// this.config.playbackType === 'live'
|
|
42409
|
-
// ? multisources.find((ms) => ms.live !== false)
|
|
42410
|
-
// : multisources[0]
|
|
42411
|
-
// const mediaSources = mainSource
|
|
42412
|
-
// ? this.buildMediaSourcesList(mainSource)
|
|
42413
|
-
// : []
|
|
42414
|
-
// const mainSourceUrl = mediaSources[0];
|
|
42415
|
-
// const poster = mainSource?.poster ?? this.config.poster
|
|
42416
|
-
// const poster = this.config.poster
|
|
42417
|
-
const source = this.selectMediaSource(); // TODO
|
|
42381
|
+
const source = this.selectMediaSource();
|
|
42418
42382
|
this.rootNode = rootNode;
|
|
42419
42383
|
const coreOptions = {
|
|
42420
42384
|
...this.config.pluginSettings,
|
|
@@ -42438,10 +42402,8 @@ class Player {
|
|
|
42438
42402
|
},
|
|
42439
42403
|
parent: rootNode,
|
|
42440
42404
|
playbackType: this.config.playbackType,
|
|
42441
|
-
// poster,
|
|
42442
42405
|
width: rootNode.clientWidth,
|
|
42443
42406
|
source: source ? unwrapSource(source) : undefined,
|
|
42444
|
-
// sources: mediaSources,
|
|
42445
42407
|
strings: this.config.strings,
|
|
42446
42408
|
};
|
|
42447
42409
|
return coreOptions;
|
|
@@ -42451,21 +42413,6 @@ class Player {
|
|
|
42451
42413
|
Loader.registerPlayback(DashPlayback);
|
|
42452
42414
|
Loader.registerPlayback(HlsPlayback);
|
|
42453
42415
|
}
|
|
42454
|
-
bindBitrateChangeHandler() {
|
|
42455
|
-
// TODO implement a plugin for the whole thing
|
|
42456
|
-
trace(`${T} bindBitrateChangeHandler`, { activeContainer: this.player?.core?.activeContainer?.name });
|
|
42457
|
-
const currentPlayback = this.player?.core.activePlayback;
|
|
42458
|
-
currentPlayback.on(Events$1.PLAYBACK_LEVELS_AVAILABLE, (levels) => {
|
|
42459
|
-
// TODO test
|
|
42460
|
-
if (!this.qLevel) {
|
|
42461
|
-
this.qLevel = levels[0];
|
|
42462
|
-
}
|
|
42463
|
-
});
|
|
42464
|
-
this.player?.core.activeContainer.on(Events$1.CONTAINER_BITRATE, (bitrate) => {
|
|
42465
|
-
trace(`${T} bitrate has changed`, { bitrate });
|
|
42466
|
-
this.qLevel = bitrate;
|
|
42467
|
-
});
|
|
42468
|
-
}
|
|
42469
42416
|
// Select a single source to play according to the priority transport and the modules support
|
|
42470
42417
|
selectMediaSource() {
|
|
42471
42418
|
return buildSourcesPriorityList(buildSourcesSet(this.config.sources), this.config.priorityTransport)[0];
|
|
@@ -42594,12 +42541,12 @@ class SentryTracer {
|
|
|
42594
42541
|
}
|
|
42595
42542
|
}
|
|
42596
42543
|
|
|
42597
|
-
var version$1 = "2.
|
|
42544
|
+
var version$1 = "2.8.1";
|
|
42598
42545
|
|
|
42599
42546
|
var packages = {
|
|
42600
42547
|
"": {
|
|
42601
42548
|
name: "@gcorevideo/player",
|
|
42602
|
-
version: "2.
|
|
42549
|
+
version: "2.8.1",
|
|
42603
42550
|
license: "Apache-2.0",
|
|
42604
42551
|
dependencies: {
|
|
42605
42552
|
"@clappr/core": "^0.11.3",
|
package/lib/Player.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PlayerPlugin } from './types.js';
|
|
2
2
|
import { PlayerConfig, PlayerEvent } from './types.js';
|
|
3
|
-
import { QualityLevel } from './playback.types.js';
|
|
4
3
|
type PlayerEventHandler<T extends PlayerEvent> = () => void;
|
|
5
4
|
export type PlaybackModule = 'dash' | 'hls' | 'native';
|
|
6
5
|
/**
|
|
7
6
|
* @beta
|
|
8
7
|
*/
|
|
9
8
|
export declare class Player {
|
|
10
|
-
private qLevel;
|
|
11
9
|
private config;
|
|
12
10
|
private emitter;
|
|
13
11
|
private player;
|
|
@@ -15,9 +13,6 @@ export declare class Player {
|
|
|
15
13
|
private rootNode;
|
|
16
14
|
private tuneInTimerId;
|
|
17
15
|
private tunedIn;
|
|
18
|
-
get bitrate(): QualityLevel | null;
|
|
19
|
-
get hd(): any;
|
|
20
|
-
get playbackType(): PlaybackType | undefined;
|
|
21
16
|
constructor(config: PlayerConfig);
|
|
22
17
|
on<T extends PlayerEvent>(event: T, handler: PlayerEventHandler<T>): void;
|
|
23
18
|
off<T extends PlayerEvent>(event: T, handler: PlayerEventHandler<T>): void;
|
|
@@ -40,7 +35,6 @@ export declare class Player {
|
|
|
40
35
|
private events;
|
|
41
36
|
private buildCoreOptions;
|
|
42
37
|
private configurePlaybacks;
|
|
43
|
-
private bindBitrateChangeHandler;
|
|
44
38
|
private selectMediaSource;
|
|
45
39
|
}
|
|
46
40
|
export {};
|
package/lib/Player.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,YAAY,EACb,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAWtD,KAAK,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAA;AAiB3D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAItD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO,CAAC,OAAO,CAAkB;IAEjC,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,QAAQ,CAA2B;IAE3C,OAAO,CAAC,aAAa,CAA6C;IAElE,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,YAAY;IAIhC,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;IAInE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;IAIvC,OAAO,CAAC,SAAS;IAIX,IAAI,CAAC,aAAa,EAAE,WAAW;IAyBrC,OAAO;IAgBP,KAAK;IAKL,IAAI;IAKJ,MAAM,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAWjD,MAAM,CAAC,IAAI,EAAE,MAAM;IAKnB,IAAI;IAKJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY;IAI1C,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY;IAI5C,OAAO,CAAC,UAAU;YAqBJ,MAAM;IA2EpB,OAAO,CAAC,MAAM,CAgDb;IAED,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,iBAAiB;CAM1B"}
|
package/lib/Player.js
CHANGED
|
@@ -23,7 +23,6 @@ const DEFAULT_OPTIONS = {
|
|
|
23
23
|
* @beta
|
|
24
24
|
*/
|
|
25
25
|
export class Player {
|
|
26
|
-
qLevel = null;
|
|
27
26
|
config = DEFAULT_OPTIONS;
|
|
28
27
|
emitter = new EventLite();
|
|
29
28
|
player = null;
|
|
@@ -31,34 +30,6 @@ export class Player {
|
|
|
31
30
|
rootNode = null;
|
|
32
31
|
tuneInTimerId = null;
|
|
33
32
|
tunedIn = false;
|
|
34
|
-
// get activePlayback(): PlaybackModule | null {
|
|
35
|
-
// if (!this.player?.core.activePlayback) {
|
|
36
|
-
// return null
|
|
37
|
-
// }
|
|
38
|
-
// switch (this.player.core.activePlayback.name) {
|
|
39
|
-
// case 'dash':
|
|
40
|
-
// return 'dash'
|
|
41
|
-
// case 'hls':
|
|
42
|
-
// return 'hls'
|
|
43
|
-
// default:
|
|
44
|
-
// return 'native'
|
|
45
|
-
// }
|
|
46
|
-
// }
|
|
47
|
-
// get activeSource(): string | null {
|
|
48
|
-
// if (!this.player?.core.activePlayback) {
|
|
49
|
-
// return null
|
|
50
|
-
// }
|
|
51
|
-
// return this.player.core.activePlayback.options.src
|
|
52
|
-
// }
|
|
53
|
-
get bitrate() {
|
|
54
|
-
return this.qLevel;
|
|
55
|
-
}
|
|
56
|
-
get hd() {
|
|
57
|
-
return this.player?.core.activePlayback?.isHighDefinitionInUse || false;
|
|
58
|
-
}
|
|
59
|
-
get playbackType() {
|
|
60
|
-
return this.player?.core.activePlayback?.getPlaybackType();
|
|
61
|
-
}
|
|
62
33
|
constructor(config) {
|
|
63
34
|
this.setConfig(config);
|
|
64
35
|
}
|
|
@@ -110,7 +81,6 @@ export class Player {
|
|
|
110
81
|
clearTimeout(this.tuneInTimerId);
|
|
111
82
|
this.tuneInTimerId = null;
|
|
112
83
|
}
|
|
113
|
-
this.qLevel = null;
|
|
114
84
|
}
|
|
115
85
|
pause() {
|
|
116
86
|
assert.ok(this.player, 'Player not initialized');
|
|
@@ -146,19 +116,11 @@ export class Player {
|
|
|
146
116
|
}
|
|
147
117
|
initPlayer(coreOptions) {
|
|
148
118
|
trace(`${T} initPlayer`, {
|
|
149
|
-
// coreOptions,
|
|
150
119
|
// TODO selected options
|
|
151
120
|
});
|
|
152
121
|
assert.ok(!this.player, 'Player already initialized');
|
|
153
122
|
const player = new PlayerClappr(coreOptions);
|
|
154
123
|
this.player = player;
|
|
155
|
-
if (player.core.activeContainer) {
|
|
156
|
-
trace(`${T} tuneIn bindBitrateChangeHandler`);
|
|
157
|
-
this.bindBitrateChangeHandler();
|
|
158
|
-
}
|
|
159
|
-
player.core.on(ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
160
|
-
this.bindBitrateChangeHandler();
|
|
161
|
-
}, null);
|
|
162
124
|
// TODO checks if the whole thing is necessary
|
|
163
125
|
this.tuneInTimerId = globalThis.setTimeout(() => {
|
|
164
126
|
trace(`${T} tuneInTimer`, {
|
|
@@ -287,19 +249,7 @@ export class Player {
|
|
|
287
249
|
},
|
|
288
250
|
};
|
|
289
251
|
buildCoreOptions(rootNode) {
|
|
290
|
-
|
|
291
|
-
// const multisources = this.config.multisources
|
|
292
|
-
// const mainSource =
|
|
293
|
-
// this.config.playbackType === 'live'
|
|
294
|
-
// ? multisources.find((ms) => ms.live !== false)
|
|
295
|
-
// : multisources[0]
|
|
296
|
-
// const mediaSources = mainSource
|
|
297
|
-
// ? this.buildMediaSourcesList(mainSource)
|
|
298
|
-
// : []
|
|
299
|
-
// const mainSourceUrl = mediaSources[0];
|
|
300
|
-
// const poster = mainSource?.poster ?? this.config.poster
|
|
301
|
-
// const poster = this.config.poster
|
|
302
|
-
const source = this.selectMediaSource(); // TODO
|
|
252
|
+
const source = this.selectMediaSource();
|
|
303
253
|
this.rootNode = rootNode;
|
|
304
254
|
const coreOptions = {
|
|
305
255
|
...this.config.pluginSettings,
|
|
@@ -323,10 +273,8 @@ export class Player {
|
|
|
323
273
|
},
|
|
324
274
|
parent: rootNode,
|
|
325
275
|
playbackType: this.config.playbackType,
|
|
326
|
-
// poster,
|
|
327
276
|
width: rootNode.clientWidth,
|
|
328
277
|
source: source ? unwrapSource(source) : undefined,
|
|
329
|
-
// sources: mediaSources,
|
|
330
278
|
strings: this.config.strings,
|
|
331
279
|
};
|
|
332
280
|
return coreOptions;
|
|
@@ -336,21 +284,6 @@ export class Player {
|
|
|
336
284
|
Loader.registerPlayback(DashPlayback);
|
|
337
285
|
Loader.registerPlayback(HlsPlayback);
|
|
338
286
|
}
|
|
339
|
-
bindBitrateChangeHandler() {
|
|
340
|
-
// TODO implement a plugin for the whole thing
|
|
341
|
-
trace(`${T} bindBitrateChangeHandler`, { activeContainer: this.player?.core?.activeContainer?.name });
|
|
342
|
-
const currentPlayback = this.player?.core.activePlayback;
|
|
343
|
-
currentPlayback.on(ClapprEvents.PLAYBACK_LEVELS_AVAILABLE, (levels) => {
|
|
344
|
-
// TODO test
|
|
345
|
-
if (!this.qLevel) {
|
|
346
|
-
this.qLevel = levels[0];
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
this.player?.core.activeContainer.on(ClapprEvents.CONTAINER_BITRATE, (bitrate) => {
|
|
350
|
-
trace(`${T} bitrate has changed`, { bitrate });
|
|
351
|
-
this.qLevel = bitrate;
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
287
|
// Select a single source to play according to the priority transport and the modules support
|
|
355
288
|
selectMediaSource() {
|
|
356
289
|
return buildSourcesPriorityList(buildSourcesSet(this.config.sources), this.config.priorityTransport)[0];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HTML5Video, Playback } from '@clappr/core';
|
|
2
|
-
import DASHJS, {
|
|
2
|
+
import DASHJS, { type BitrateInfo as DashBitrateInfo, IManifestInfo } from 'dashjs';
|
|
3
3
|
import { QualityLevel, TimePosition, TimeValue } from '../../playback.types.js';
|
|
4
4
|
type PlaybackType = typeof Playback.VOD | typeof Playback.LIVE | typeof Playback.AOD | typeof Playback.NO_OP;
|
|
5
5
|
type PlaylistType = string;
|
|
@@ -39,9 +39,9 @@ export default class DashPlayback extends HTML5Video {
|
|
|
39
39
|
get _duration(): number;
|
|
40
40
|
constructor(options: any, i18n: string, playerError?: any);
|
|
41
41
|
_setup(): void;
|
|
42
|
-
render():
|
|
42
|
+
render(): this;
|
|
43
43
|
_ready(): void;
|
|
44
|
-
_setupSrc
|
|
44
|
+
private _setupSrc;
|
|
45
45
|
_startTimeUpdateTimer(): void;
|
|
46
46
|
_stopTimeUpdateTimer(): void;
|
|
47
47
|
getProgramDateTime(): number;
|
|
@@ -53,8 +53,8 @@ export default class DashPlayback extends HTML5Video {
|
|
|
53
53
|
seekToLivePoint(): void;
|
|
54
54
|
_updateDvr(status: boolean): void;
|
|
55
55
|
_updateSettings(): void;
|
|
56
|
-
_onPlaybackError
|
|
57
|
-
_onDASHJSSError
|
|
56
|
+
private _onPlaybackError;
|
|
57
|
+
private _onDASHJSSError;
|
|
58
58
|
_onTimeUpdate(): void;
|
|
59
59
|
_onDurationChange(): void;
|
|
60
60
|
get dvrEnabled(): boolean;
|
|
@@ -62,7 +62,7 @@ export default class DashPlayback extends HTML5Video {
|
|
|
62
62
|
play(): void;
|
|
63
63
|
pause(): void;
|
|
64
64
|
stop(): void;
|
|
65
|
-
destroy():
|
|
65
|
+
destroy(): void;
|
|
66
66
|
_updatePlaybackType(): void;
|
|
67
67
|
_fillLevels(levels: DashBitrateInfo[]): void;
|
|
68
68
|
private onLevelSwitch;
|
|
@@ -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,EAAS,MAAM,cAAc,CAAA;AAEvE,OAAO,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAO,QAAQ,EAAS,MAAM,cAAc,CAAA;AAEvE,OAAO,MAAM,EAAE,EAGb,KAAK,WAAW,IAAI,eAAe,EAEnC,aAAa,EACd,MAAM,QAAQ,CAAA;AAGf,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAM/E,KAAK,YAAY,GACb,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,IAAI,GACpB,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,KAAK,CAAA;AAEzB,KAAK,YAAY,GAAG,MAAM,CAAA;AAE1B,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAKD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU;IAClD,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAO;IAErC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IAKnC,mCAAmC,EAAE,OAAO,CAAQ;IAEpD,aAAa,EAAE,OAAO,CAAQ;IAI9B,uBAAuB,EAAE,MAAM,CAAI;IASnC,wBAAwB,EAAE,MAAM,CAAI;IAEpC,aAAa,EAAE,YAAY,CAAe;IAG1C,aAAa,EAAE,YAAY,GAAG,IAAI,CAAO;IAGzC,gBAAgB,EAAE,SAAS,CAAI;IAE/B,KAAK,EAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAO;IAE5C,2BAA2B,EAAE,MAAM,CAAI;IAEvC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAO;IAEtC,eAAe,EAAE,YAAY,CAA2B;IAIxD,0BAA0B,EAAE,oBAAoB,GAAG,IAAI,CAAO;IAI9D,wBAAwB,EAAE,oBAAoB,GAAG,IAAI,CAAO;IAE5D,kBAAkB,UAAQ;IAE1B,YAAY,EAAE,aAAa,GAAG,IAAI,CAAO;IAGzC,sBAAsB,EAAE,SAAS,GAAG,IAAI,CAAO;IAE/C,gBAAgB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAO;IAE9D,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,EAAE,MAAM,EAiC1B;IAED,IAAI,UAAU,WASb;IAED,IAAI,IAAI,WAEP;IAID,IAAI,sBAAsB,WAczB;IAID,IAAI,oBAAoB,WAgBvB;IAED,IAAI,SAAS,WAKZ;gBAEW,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG;IAOzD,MAAM;IAyEN,MAAM;IAMN,MAAM;YAMW,SAAS;IAI1B,qBAAqB;IAQrB,oBAAoB;IAMpB,kBAAkB;IAOlB,WAAW,IAAI,SAAS;IAQxB,cAAc,IAAI,SAAS;IAU3B,kBAAkB,IAAI,SAAS;IAI/B,cAAc,CAAC,UAAU,EAAE,MAAM;IAejC,IAAI,CAAC,IAAI,EAAE,SAAS;IAgBpB,eAAe;IAIf,UAAU,CAAC,MAAM,EAAE,OAAO;IAKjB,eAAe;IAgBxB,OAAO,CAAC,gBAAgB,CAGvB;IAED,OAAO,CAAC,eAAe,CAwGtB;IAED,aAAa;IAqBb,iBAAiB;IAWjB,IAAI,UAAU,YASb;IAED,WAAW;IAmBX,IAAI;IAUJ,KAAK;IAWL,IAAI;IASJ,OAAO;IAkBP,mBAAmB;IAYnB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE;IAarC,OAAO,CAAC,aAAa;IAMrB,eAAe;IAIf,aAAa;CAGd"}
|
|
@@ -8,6 +8,7 @@ import { trace } from '../../trace/index.js';
|
|
|
8
8
|
const AUTO = -1;
|
|
9
9
|
const { now } = Utils;
|
|
10
10
|
const T = 'DashPlayback';
|
|
11
|
+
// @ts-expect-error
|
|
11
12
|
export default class DashPlayback extends HTML5Video {
|
|
12
13
|
_levels = null;
|
|
13
14
|
_currentLevel = null;
|
|
@@ -260,24 +261,29 @@ export default class DashPlayback extends HTML5Video {
|
|
|
260
261
|
}
|
|
261
262
|
_updateSettings() {
|
|
262
263
|
if (this._playbackType === Playback.VOD) {
|
|
264
|
+
// @ts-expect-error
|
|
263
265
|
this.settings.left = ['playpause', 'position', 'duration'];
|
|
264
266
|
}
|
|
265
267
|
else if (this.dvrEnabled) {
|
|
268
|
+
// @ts-expect-error
|
|
266
269
|
this.settings.left = ['playpause'];
|
|
267
270
|
}
|
|
268
271
|
else {
|
|
272
|
+
// @ts-expect-error
|
|
269
273
|
this.settings.left = ['playstop'];
|
|
270
274
|
}
|
|
275
|
+
// @ts-expect-error
|
|
271
276
|
this.settings.seekEnabled = this.isSeekEnabled();
|
|
272
277
|
this.trigger(Events.PLAYBACK_SETTINGSUPDATE);
|
|
273
278
|
}
|
|
274
279
|
_onPlaybackError = (event) => {
|
|
275
280
|
// TODO
|
|
281
|
+
trace(`${T} _onPlaybackError`, { event });
|
|
276
282
|
};
|
|
277
283
|
_onDASHJSSError = (event) => {
|
|
284
|
+
trace(`${T} _onDASHJSSError`, { event });
|
|
278
285
|
// TODO
|
|
279
286
|
// only report/handle errors if they are fatal
|
|
280
|
-
// hlsjs should automatically handle non fatal errors
|
|
281
287
|
this._stopTimeUpdateTimer();
|
|
282
288
|
if (event.error === 'capability' && event.event === 'mediasource') {
|
|
283
289
|
// No support for MSE
|
|
@@ -390,7 +396,10 @@ export default class DashPlayback extends HTML5Video {
|
|
|
390
396
|
super._onDurationChange();
|
|
391
397
|
}
|
|
392
398
|
get dvrEnabled() {
|
|
393
|
-
|
|
399
|
+
if (!this._dash) {
|
|
400
|
+
trace(`${T} dvrEnable no dash player instance`);
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
394
403
|
return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
|
|
395
404
|
this.getPlaybackType() === Playback.LIVE);
|
|
396
405
|
}
|
|
@@ -63,10 +63,10 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
63
63
|
bindCustomListeners(): void;
|
|
64
64
|
unbindCustomListeners(): void;
|
|
65
65
|
_onFragmentParsingMetadata(evt: HlsEvents.FRAG_PARSING_METADATA, data: FragParsingMetadataData): void;
|
|
66
|
-
render():
|
|
66
|
+
render(): this;
|
|
67
67
|
_ready(): void;
|
|
68
68
|
_recover(evt: HlsEvents.ERROR, data: HlsErrorData, error: ErrorInfo): void;
|
|
69
|
-
_setupSrc
|
|
69
|
+
private _setupSrc;
|
|
70
70
|
_startTimeUpdateTimer(): void;
|
|
71
71
|
_stopTimeUpdateTimer(): void;
|
|
72
72
|
getProgramDateTime(): string | null;
|
|
@@ -87,7 +87,7 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
87
87
|
play(): void;
|
|
88
88
|
pause(): void;
|
|
89
89
|
stop(): void;
|
|
90
|
-
destroy():
|
|
90
|
+
destroy(): void;
|
|
91
91
|
private _updatePlaybackType;
|
|
92
92
|
private _fillLevels;
|
|
93
93
|
private _onLevelUpdated;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAqC,MAAM,cAAc,CAAC;AAErF,OAAO,KAAK,EAAE,EACZ,SAAS,EAET,KAAK,YAAY,EAEjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAG5B,KAAK,kBAAkB,EACxB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,YAAY,EAAgB,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwC3C,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ const DEFAULT_RECOVER_ATTEMPTS = 16;
|
|
|
12
12
|
Events.register('PLAYBACK_FRAGMENT_CHANGED');
|
|
13
13
|
Events.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
|
|
14
14
|
const T = 'plugins.hls';
|
|
15
|
+
// @ts-expect-error
|
|
15
16
|
export default class HlsPlayback extends HTML5Video {
|
|
16
17
|
_ccIsSetup = false;
|
|
17
18
|
_ccTracksUpdated = false;
|
|
@@ -380,14 +381,18 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
380
381
|
}
|
|
381
382
|
_updateSettings() {
|
|
382
383
|
if (this._playbackType === Playback.VOD) {
|
|
384
|
+
// @ts-expect-error
|
|
383
385
|
this.settings.left = ['playpause', 'position', 'duration'];
|
|
384
386
|
}
|
|
385
387
|
else if (this.dvrEnabled) {
|
|
388
|
+
// @ts-expect-error
|
|
386
389
|
this.settings.left = ['playpause'];
|
|
387
390
|
}
|
|
388
391
|
else {
|
|
392
|
+
// @ts-expect-error
|
|
389
393
|
this.settings.left = ['playstop'];
|
|
390
394
|
}
|
|
395
|
+
// @ts-expect-error
|
|
391
396
|
this.settings.seekEnabled = this.isSeekEnabled();
|
|
392
397
|
this.trigger(Events.PLAYBACK_SETTINGSUPDATE);
|
|
393
398
|
}
|
|
@@ -51,18 +51,18 @@ export function buildSourcesPriorityList(sources, priorityTransport = 'auto') {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
function addHls() {
|
|
54
|
-
if (sources.hls && HlsPlayback.canPlay(sources.hls)) {
|
|
54
|
+
if (sources.hls && HlsPlayback.canPlay(sources.hls, undefined)) {
|
|
55
55
|
msl.push(sources.hls);
|
|
56
56
|
sources.hls = null;
|
|
57
57
|
}
|
|
58
58
|
if (sources.master?.endsWith('.m3u8') &&
|
|
59
|
-
HlsPlayback.canPlay(sources.master)) {
|
|
59
|
+
HlsPlayback.canPlay(sources.master, undefined)) {
|
|
60
60
|
msl.push(sources.master);
|
|
61
61
|
sources.master = null;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
function addDash() {
|
|
65
|
-
if (sources.dash && DashPlayback.canPlay(sources.dash)) {
|
|
65
|
+
if (sources.dash && DashPlayback.canPlay(sources.dash, undefined)) {
|
|
66
66
|
msl.push(sources.dash);
|
|
67
67
|
sources.dash = null;
|
|
68
68
|
}
|