@gcorevideo/player 2.3.1 → 2.4.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 +147 -103
- package/lib/Player.d.ts +1 -1
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +23 -68
- package/lib/internal.types.d.ts +2 -3
- package/lib/internal.types.d.ts.map +1 -1
- package/lib/plugins/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/plugins/dash-playback/DashPlayback.js +52 -34
- package/lib/types.d.ts +2 -1
- package/lib/types.d.ts.map +1 -1
- package/lib/utils/mediaSources.d.ts +13 -0
- package/lib/utils/mediaSources.d.ts.map +1 -0
- package/lib/utils/mediaSources.js +82 -0
- package/package.json +1 -1
- package/src/Player.ts +26 -77
- package/src/internal.types.ts +2 -2
- package/src/plugins/dash-playback/DashPlayback.ts +349 -258
- package/src/types.ts +3 -2
- package/src/typings/@clappr/core/player.d.ts +58 -58
- package/src/utils/mediaSources.ts +104 -0
- package/tsconfig.tsbuildinfo +1 -1
package/dist/index.js
CHANGED
|
@@ -12218,7 +12218,7 @@ const DASHJS = /*@__PURE__*/getDefaultExportFromCjs$1(dash_all_minExports);
|
|
|
12218
12218
|
// license that can be found in the LICENSE file.
|
|
12219
12219
|
const AUTO$1 = -1;
|
|
12220
12220
|
const { now: now$2 } = Utils;
|
|
12221
|
-
const T$2 =
|
|
12221
|
+
const T$2 = 'DashPlayback';
|
|
12222
12222
|
class DashPlayback extends HTML5Video {
|
|
12223
12223
|
_levels = null;
|
|
12224
12224
|
_currentLevel = null;
|
|
@@ -12270,8 +12270,8 @@ class DashPlayback extends HTML5Video {
|
|
|
12270
12270
|
autoSwitchBitrate: {
|
|
12271
12271
|
video: id === -1,
|
|
12272
12272
|
},
|
|
12273
|
-
ABRStrategy: 'abrL2A'
|
|
12274
|
-
}
|
|
12273
|
+
ABRStrategy: 'abrL2A',
|
|
12274
|
+
},
|
|
12275
12275
|
},
|
|
12276
12276
|
};
|
|
12277
12277
|
assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to switch levels');
|
|
@@ -12292,7 +12292,8 @@ class DashPlayback extends HTML5Video {
|
|
|
12292
12292
|
}
|
|
12293
12293
|
}
|
|
12294
12294
|
get _startTime() {
|
|
12295
|
-
if (this._playbackType === Playback.LIVE &&
|
|
12295
|
+
if (this._playbackType === Playback.LIVE &&
|
|
12296
|
+
this._playlistType !== 'EVENT') {
|
|
12296
12297
|
return this._extrapolatedStartTime;
|
|
12297
12298
|
}
|
|
12298
12299
|
return this._playableRegionStartTime;
|
|
@@ -12338,7 +12339,8 @@ class DashPlayback extends HTML5Video {
|
|
|
12338
12339
|
// Should be 2 or higher, or 0 to disable. Should only need to be increased above 2 if more than one segment is
|
|
12339
12340
|
// removed from the start of the playlist at a time. E.g if the playlist is cached for 10 seconds and new chunks are
|
|
12340
12341
|
// added/removed every 5.
|
|
12341
|
-
this._extrapolatedWindowNumSegments =
|
|
12342
|
+
this._extrapolatedWindowNumSegments =
|
|
12343
|
+
this.options.playback?.extrapolatedWindowNumSegments ?? 2;
|
|
12342
12344
|
if (this.options.playbackType) {
|
|
12343
12345
|
this._playbackType = this.options.playbackType;
|
|
12344
12346
|
}
|
|
@@ -12403,7 +12405,8 @@ class DashPlayback extends HTML5Video {
|
|
|
12403
12405
|
});
|
|
12404
12406
|
this._dash.on(DASHJS.MediaPlayer.events.METRIC_ADDED, (e) => {
|
|
12405
12407
|
// Listen for the first manifest request in order to update player UI
|
|
12406
|
-
if (e.metric === 'DVRInfo') {
|
|
12408
|
+
if (e.metric === 'DVRInfo') {
|
|
12409
|
+
// TODO fix typings
|
|
12407
12410
|
assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to get metrics');
|
|
12408
12411
|
const dvrInfo = this._dash.getDashMetrics().getCurrentDVRInfo('video');
|
|
12409
12412
|
if (dvrInfo) {
|
|
@@ -12508,7 +12511,7 @@ class DashPlayback extends HTML5Video {
|
|
|
12508
12511
|
}
|
|
12509
12512
|
_updateDvr(status) {
|
|
12510
12513
|
this.trigger(Events$1.PLAYBACK_DVR, status);
|
|
12511
|
-
this.trigger(Events$1.PLAYBACK_STATS_ADD, {
|
|
12514
|
+
this.trigger(Events$1.PLAYBACK_STATS_ADD, { dvr: status });
|
|
12512
12515
|
}
|
|
12513
12516
|
_updateSettings() {
|
|
12514
12517
|
if (this._playbackType === Playback.VOD) {
|
|
@@ -12539,19 +12542,19 @@ class DashPlayback extends HTML5Video {
|
|
|
12539
12542
|
Log.error('The media cannot be played because it requires a feature ' +
|
|
12540
12543
|
'that your browser does not support.');
|
|
12541
12544
|
}
|
|
12542
|
-
else if (event.error === 'manifestError' &&
|
|
12543
|
-
|
|
12544
|
-
|
|
12545
|
-
|
|
12546
|
-
|
|
12547
|
-
|
|
12548
|
-
|
|
12549
|
-
|
|
12550
|
-
|
|
12551
|
-
|
|
12552
|
-
|
|
12553
|
-
|
|
12554
|
-
|
|
12545
|
+
else if (event.error === 'manifestError' &&
|
|
12546
|
+
// Manifest type not supported
|
|
12547
|
+
(event.event.id === 'createParser' ||
|
|
12548
|
+
// Codec(s) not supported
|
|
12549
|
+
event.event.id === 'codec' ||
|
|
12550
|
+
// No streams available to stream
|
|
12551
|
+
event.event.id === 'nostreams' ||
|
|
12552
|
+
// Error creating Stream object
|
|
12553
|
+
event.event.id === 'nostreamscomposed' ||
|
|
12554
|
+
// syntax error parsing the manifest
|
|
12555
|
+
event.event.id === 'parse' ||
|
|
12556
|
+
// a stream has multiplexed audio+video
|
|
12557
|
+
event.event.id === 'multiplexedrep')) {
|
|
12555
12558
|
// These errors have useful error messages, so we forward it on
|
|
12556
12559
|
const formattedError = this.createError(event.error);
|
|
12557
12560
|
this.trigger(Events$1.PLAYBACK_ERROR, formattedError);
|
|
@@ -12570,7 +12573,8 @@ class DashPlayback extends HTML5Video {
|
|
|
12570
12573
|
this.trigger(Events$1.PLAYBACK_ERROR, formattedError);
|
|
12571
12574
|
Log.error(event.event);
|
|
12572
12575
|
}
|
|
12573
|
-
else if (event.error === 'capability' &&
|
|
12576
|
+
else if (event.error === 'capability' &&
|
|
12577
|
+
event.event === 'encryptedmedia') {
|
|
12574
12578
|
// Browser doesn't support EME
|
|
12575
12579
|
const formattedError = this.createError(event.error);
|
|
12576
12580
|
this.trigger(Events$1.PLAYBACK_ERROR, formattedError);
|
|
@@ -12598,7 +12602,7 @@ class DashPlayback extends HTML5Video {
|
|
|
12598
12602
|
}
|
|
12599
12603
|
else {
|
|
12600
12604
|
// ignore the error
|
|
12601
|
-
if (typeof event.error ===
|
|
12605
|
+
if (typeof event.error === 'object') {
|
|
12602
12606
|
const formattedError = this.createError(event.error);
|
|
12603
12607
|
this.trigger(Events$1.PLAYBACK_ERROR, formattedError);
|
|
12604
12608
|
Log.error(event.error.message);
|
|
@@ -12622,10 +12626,11 @@ class DashPlayback extends HTML5Video {
|
|
|
12622
12626
|
const update = {
|
|
12623
12627
|
current: this.getCurrentTime(),
|
|
12624
12628
|
total: this.getDuration(),
|
|
12625
|
-
firstFragDateTime: this.getProgramDateTime()
|
|
12629
|
+
firstFragDateTime: this.getProgramDateTime(),
|
|
12626
12630
|
};
|
|
12627
|
-
const isSame = this._lastTimeUpdate &&
|
|
12628
|
-
update.
|
|
12631
|
+
const isSame = this._lastTimeUpdate &&
|
|
12632
|
+
update.current === this._lastTimeUpdate.current &&
|
|
12633
|
+
update.total === this._lastTimeUpdate.total;
|
|
12629
12634
|
if (isSame) {
|
|
12630
12635
|
return;
|
|
12631
12636
|
}
|
|
@@ -12642,7 +12647,8 @@ class DashPlayback extends HTML5Video {
|
|
|
12642
12647
|
}
|
|
12643
12648
|
get dvrEnabled() {
|
|
12644
12649
|
assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to get the DVR status');
|
|
12645
|
-
return this._dash?.getDVRWindowSize() >= this._minDvrSize &&
|
|
12650
|
+
return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
|
|
12651
|
+
this.getPlaybackType() === Playback.LIVE);
|
|
12646
12652
|
}
|
|
12647
12653
|
_onProgress() {
|
|
12648
12654
|
if (!this._dash) {
|
|
@@ -12655,7 +12661,7 @@ class DashPlayback extends HTML5Video {
|
|
|
12655
12661
|
const progress = {
|
|
12656
12662
|
start: this.getCurrentTime(),
|
|
12657
12663
|
current: this.getCurrentTime() + buffer,
|
|
12658
|
-
total: this.getDuration()
|
|
12664
|
+
total: this.getDuration(),
|
|
12659
12665
|
};
|
|
12660
12666
|
this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
|
|
12661
12667
|
}
|
|
@@ -12836,23 +12842,35 @@ class DashPlayback extends HTML5Video {
|
|
|
12836
12842
|
height: currentLevel.height,
|
|
12837
12843
|
width: currentLevel.width,
|
|
12838
12844
|
bitrate: currentLevel.bitrate,
|
|
12839
|
-
level: currentLevel.qualityIndex
|
|
12845
|
+
level: currentLevel.qualityIndex,
|
|
12840
12846
|
});
|
|
12841
12847
|
}
|
|
12842
12848
|
getPlaybackType() {
|
|
12843
12849
|
return this._playbackType;
|
|
12844
12850
|
}
|
|
12845
12851
|
isSeekEnabled() {
|
|
12846
|
-
return
|
|
12852
|
+
return this._playbackType === Playback.VOD || this.dvrEnabled;
|
|
12847
12853
|
}
|
|
12848
12854
|
}
|
|
12849
12855
|
DashPlayback.canPlay = function (resource, mimeType) {
|
|
12850
12856
|
const resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || [];
|
|
12851
|
-
const isDash = (
|
|
12852
|
-
mimeType === 'application/dash+xml' ||
|
|
12853
|
-
|
|
12857
|
+
const isDash = (resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'mpd') ||
|
|
12858
|
+
mimeType === 'application/dash+xml' ||
|
|
12859
|
+
mimeType === 'video/mp4';
|
|
12860
|
+
// TODO check
|
|
12861
|
+
const ms = window.MediaSource;
|
|
12862
|
+
const mms = 'ManagedMediaSource' in window ? window.ManagedMediaSource : undefined;
|
|
12863
|
+
const wms = 'WebKitMediaSource' in window ? window.WebKitMediaSource : undefined;
|
|
12864
|
+
const ctor = ms || mms || wms;
|
|
12854
12865
|
const hasSupport = typeof ctor === 'function';
|
|
12855
|
-
trace(`${T$2} canPlay`, {
|
|
12866
|
+
trace(`${T$2} canPlay`, {
|
|
12867
|
+
hasSupport,
|
|
12868
|
+
isDash,
|
|
12869
|
+
resource,
|
|
12870
|
+
ms: typeof ms === 'function',
|
|
12871
|
+
mms: typeof mms === 'function',
|
|
12872
|
+
wms: typeof wms === 'function',
|
|
12873
|
+
});
|
|
12856
12874
|
return !!(hasSupport && isDash);
|
|
12857
12875
|
};
|
|
12858
12876
|
|
|
@@ -42187,18 +42205,91 @@ HlsPlayback.canPlay = function (resource, mimeType) {
|
|
|
42187
42205
|
return !!(hasSupport && isHls);
|
|
42188
42206
|
};
|
|
42189
42207
|
|
|
42208
|
+
function buildSourcesSet(sources) {
|
|
42209
|
+
const sv = {
|
|
42210
|
+
dash: null,
|
|
42211
|
+
master: null,
|
|
42212
|
+
hls: null,
|
|
42213
|
+
mpegts: null,
|
|
42214
|
+
};
|
|
42215
|
+
sources.forEach((ps) => {
|
|
42216
|
+
const [s, t] = typeof ps === 'string' ? [ps, ''] : [ps.source, ps.mimeType];
|
|
42217
|
+
if (DashPlayback.canPlay(s, t)) {
|
|
42218
|
+
sv.dash = s;
|
|
42219
|
+
}
|
|
42220
|
+
else if (HlsPlayback.canPlay(s, t)) {
|
|
42221
|
+
sv.hls = s;
|
|
42222
|
+
}
|
|
42223
|
+
else {
|
|
42224
|
+
sv.master = s;
|
|
42225
|
+
}
|
|
42226
|
+
});
|
|
42227
|
+
return sv;
|
|
42228
|
+
}
|
|
42229
|
+
function buildSourcesPriorityList(sources, priorityTransport = 'auto') {
|
|
42230
|
+
const msl = [];
|
|
42231
|
+
switch (priorityTransport) {
|
|
42232
|
+
case 'dash':
|
|
42233
|
+
addDash();
|
|
42234
|
+
break;
|
|
42235
|
+
case 'hls':
|
|
42236
|
+
addHls();
|
|
42237
|
+
break;
|
|
42238
|
+
case 'mpegts':
|
|
42239
|
+
addMpegts();
|
|
42240
|
+
break;
|
|
42241
|
+
case 'auto':
|
|
42242
|
+
addDash();
|
|
42243
|
+
addHls();
|
|
42244
|
+
break;
|
|
42245
|
+
}
|
|
42246
|
+
Object.values(sources).forEach((s) => {
|
|
42247
|
+
if (s) {
|
|
42248
|
+
msl.push(s);
|
|
42249
|
+
}
|
|
42250
|
+
});
|
|
42251
|
+
return msl;
|
|
42252
|
+
function addMpegts() {
|
|
42253
|
+
if (sources.mpegts) {
|
|
42254
|
+
msl.push(sources.mpegts);
|
|
42255
|
+
sources.mpegts = null;
|
|
42256
|
+
}
|
|
42257
|
+
}
|
|
42258
|
+
function addHls() {
|
|
42259
|
+
if (sources.hls && HlsPlayback.canPlay(sources.hls)) {
|
|
42260
|
+
msl.push(sources.hls);
|
|
42261
|
+
sources.hls = null;
|
|
42262
|
+
}
|
|
42263
|
+
if (sources.master?.endsWith('.m3u8') &&
|
|
42264
|
+
HlsPlayback.canPlay(sources.master)) {
|
|
42265
|
+
msl.push(sources.master);
|
|
42266
|
+
sources.master = null;
|
|
42267
|
+
}
|
|
42268
|
+
}
|
|
42269
|
+
function addDash() {
|
|
42270
|
+
if (sources.dash && DashPlayback.canPlay(sources.dash)) {
|
|
42271
|
+
msl.push(sources.dash);
|
|
42272
|
+
sources.dash = null;
|
|
42273
|
+
}
|
|
42274
|
+
}
|
|
42275
|
+
}
|
|
42276
|
+
function unwrapSource(s) {
|
|
42277
|
+
return typeof s === 'string' ? s : s.source;
|
|
42278
|
+
}
|
|
42279
|
+
|
|
42190
42280
|
const T = 'GPlayer';
|
|
42191
42281
|
const DEFAULT_OPTIONS = {
|
|
42192
42282
|
autoPlay: false,
|
|
42193
|
-
|
|
42283
|
+
debug: 'none',
|
|
42194
42284
|
loop: false,
|
|
42285
|
+
mute: false,
|
|
42195
42286
|
multisources: [],
|
|
42196
42287
|
playbackType: 'vod',
|
|
42197
|
-
priorityTransport: 'dash',
|
|
42198
|
-
debug: 'none',
|
|
42199
42288
|
pluginSettings: {},
|
|
42200
|
-
strings: {},
|
|
42201
42289
|
poster: '',
|
|
42290
|
+
priorityTransport: 'dash',
|
|
42291
|
+
sources: [],
|
|
42292
|
+
strings: {},
|
|
42202
42293
|
};
|
|
42203
42294
|
/**
|
|
42204
42295
|
* @beta
|
|
@@ -42353,7 +42444,6 @@ class Player {
|
|
|
42353
42444
|
this.bindBitrateChangeHandler();
|
|
42354
42445
|
}
|
|
42355
42446
|
player.core.on(Events$1.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
42356
|
-
// this.trigger(Events.ContainerChanged)
|
|
42357
42447
|
this.bindBitrateChangeHandler();
|
|
42358
42448
|
}, null);
|
|
42359
42449
|
if (Browser.isiOS && player.core.activePlayback) {
|
|
@@ -42455,15 +42545,19 @@ class Player {
|
|
|
42455
42545
|
},
|
|
42456
42546
|
};
|
|
42457
42547
|
buildCoreOptions(rootNode) {
|
|
42458
|
-
|
|
42459
|
-
const
|
|
42460
|
-
|
|
42461
|
-
|
|
42462
|
-
|
|
42463
|
-
|
|
42464
|
-
|
|
42548
|
+
// TODO extract
|
|
42549
|
+
// const multisources = this.config.multisources
|
|
42550
|
+
// const mainSource =
|
|
42551
|
+
// this.config.playbackType === 'live'
|
|
42552
|
+
// ? multisources.find((ms) => ms.live !== false)
|
|
42553
|
+
// : multisources[0]
|
|
42554
|
+
// const mediaSources = mainSource
|
|
42555
|
+
// ? this.buildMediaSourcesList(mainSource)
|
|
42556
|
+
// : []
|
|
42465
42557
|
// const mainSourceUrl = mediaSources[0];
|
|
42466
|
-
const poster = mainSource?.poster ?? this.config.poster
|
|
42558
|
+
// const poster = mainSource?.poster ?? this.config.poster
|
|
42559
|
+
const poster = this.config.poster;
|
|
42560
|
+
const source = this.selectMediaSource(); // TODO
|
|
42467
42561
|
this.rootNode = rootNode;
|
|
42468
42562
|
const coreOptions = {
|
|
42469
42563
|
...this.config.pluginSettings,
|
|
@@ -42473,7 +42567,6 @@ class Player {
|
|
|
42473
42567
|
events: this.events,
|
|
42474
42568
|
height: rootNode.clientHeight,
|
|
42475
42569
|
loop: this.config.loop,
|
|
42476
|
-
multisources,
|
|
42477
42570
|
mute: this.config.mute,
|
|
42478
42571
|
playback: {
|
|
42479
42572
|
controls: false,
|
|
@@ -42489,8 +42582,8 @@ class Player {
|
|
|
42489
42582
|
playbackType: this.config.playbackType,
|
|
42490
42583
|
poster,
|
|
42491
42584
|
width: rootNode.clientWidth,
|
|
42492
|
-
|
|
42493
|
-
sources: mediaSources,
|
|
42585
|
+
source: source ? unwrapSource(source) : undefined,
|
|
42586
|
+
// sources: mediaSources,
|
|
42494
42587
|
strings: this.config.strings,
|
|
42495
42588
|
};
|
|
42496
42589
|
return coreOptions;
|
|
@@ -42505,58 +42598,9 @@ class Player {
|
|
|
42505
42598
|
this.qLevel = bitrate;
|
|
42506
42599
|
});
|
|
42507
42600
|
}
|
|
42508
|
-
|
|
42509
|
-
|
|
42510
|
-
|
|
42511
|
-
dash: ms.sourceDash,
|
|
42512
|
-
master: ms.source,
|
|
42513
|
-
hls: ms.hlsCmafUrl,
|
|
42514
|
-
mpegts: ms.hlsMpegtsUrl,
|
|
42515
|
-
};
|
|
42516
|
-
switch (this.config.priorityTransport) {
|
|
42517
|
-
case 'dash':
|
|
42518
|
-
addDash();
|
|
42519
|
-
break;
|
|
42520
|
-
case 'hls':
|
|
42521
|
-
addHls();
|
|
42522
|
-
break;
|
|
42523
|
-
case 'mpegts':
|
|
42524
|
-
addMpegts();
|
|
42525
|
-
break;
|
|
42526
|
-
case 'auto':
|
|
42527
|
-
addDash();
|
|
42528
|
-
addHls();
|
|
42529
|
-
break;
|
|
42530
|
-
}
|
|
42531
|
-
Object.values(sources).forEach((s) => {
|
|
42532
|
-
if (s) {
|
|
42533
|
-
msl.push(s);
|
|
42534
|
-
}
|
|
42535
|
-
});
|
|
42536
|
-
return msl;
|
|
42537
|
-
function addMpegts() {
|
|
42538
|
-
if (sources.mpegts) {
|
|
42539
|
-
msl.push(sources.mpegts);
|
|
42540
|
-
sources.mpegts = null;
|
|
42541
|
-
}
|
|
42542
|
-
}
|
|
42543
|
-
function addHls() {
|
|
42544
|
-
if (sources.hls && HlsPlayback.canPlay(sources.hls)) {
|
|
42545
|
-
msl.push(sources.hls);
|
|
42546
|
-
sources.hls = null;
|
|
42547
|
-
}
|
|
42548
|
-
if (sources.master?.endsWith('.m3u8') &&
|
|
42549
|
-
HlsPlayback.canPlay(sources.master)) {
|
|
42550
|
-
msl.push(sources.master);
|
|
42551
|
-
sources.master = null;
|
|
42552
|
-
}
|
|
42553
|
-
}
|
|
42554
|
-
function addDash() {
|
|
42555
|
-
if (sources.dash && DashPlayback.canPlay(sources.dash)) {
|
|
42556
|
-
msl.push(sources.dash);
|
|
42557
|
-
sources.dash = null;
|
|
42558
|
-
}
|
|
42559
|
-
}
|
|
42601
|
+
// Select a single source to play according to the priority transport and the modules support
|
|
42602
|
+
selectMediaSource() {
|
|
42603
|
+
return buildSourcesPriorityList(buildSourcesSet(this.config.sources), this.config.priorityTransport)[0];
|
|
42560
42604
|
}
|
|
42561
42605
|
}
|
|
42562
42606
|
|
|
@@ -42682,12 +42726,12 @@ class SentryTracer {
|
|
|
42682
42726
|
}
|
|
42683
42727
|
}
|
|
42684
42728
|
|
|
42685
|
-
var version$1 = "2.
|
|
42729
|
+
var version$1 = "2.4.1";
|
|
42686
42730
|
|
|
42687
42731
|
var packages = {
|
|
42688
42732
|
"": {
|
|
42689
42733
|
name: "@gcorevideo/player",
|
|
42690
|
-
version: "2.
|
|
42734
|
+
version: "2.4.1",
|
|
42691
42735
|
license: "Apache-2.0",
|
|
42692
42736
|
dependencies: {
|
|
42693
42737
|
"@clappr/core": "^0.11.3",
|
package/lib/Player.d.ts
CHANGED
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":"AAiBA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAGjB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAOtD,KAAK,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAA;AAkB3D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAItD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAgC;IAE9C,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;IAEvB,IAAI,cAAc,IAAI,cAAc,GAAG,IAAI,CAY1C;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAKhC;IAED,IAAI,OAAO,IAAI,gBAAgB,GAAG,IAAI,CAErC;IAED,IAAI,EAAE,QAEL;IAED,IAAI,YAAY,IAAI,YAAY,GAAG,SAAS,CAE3C;gBAEW,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;IAiBP,KAAK;IAKL,IAAI;IAKJ,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;IA+EpB,OAAO,CAAC,MAAM,CAgDb;IAED,OAAO,CAAC,gBAAgB;IAgDxB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,iBAAiB;CAG1B"}
|
package/lib/Player.js
CHANGED
|
@@ -5,18 +5,20 @@ import { reportError, trace } from './trace/index.js';
|
|
|
5
5
|
import { PlayerEvent } from './types.js';
|
|
6
6
|
import DashPlayback from './plugins/dash-playback/DashPlayback.js';
|
|
7
7
|
import HlsPlayback from './plugins/hls-playback/HlsPlayback.js';
|
|
8
|
+
import { buildSourcesPriorityList, buildSourcesSet, unwrapSource } from './utils/mediaSources.js';
|
|
8
9
|
const T = 'GPlayer';
|
|
9
10
|
const DEFAULT_OPTIONS = {
|
|
10
11
|
autoPlay: false,
|
|
11
|
-
|
|
12
|
+
debug: 'none',
|
|
12
13
|
loop: false,
|
|
14
|
+
mute: false,
|
|
13
15
|
multisources: [],
|
|
14
16
|
playbackType: 'vod',
|
|
15
|
-
priorityTransport: 'dash',
|
|
16
|
-
debug: 'none',
|
|
17
17
|
pluginSettings: {},
|
|
18
|
-
strings: {},
|
|
19
18
|
poster: '',
|
|
19
|
+
priorityTransport: 'dash',
|
|
20
|
+
sources: [],
|
|
21
|
+
strings: {},
|
|
20
22
|
};
|
|
21
23
|
/**
|
|
22
24
|
* @beta
|
|
@@ -171,7 +173,6 @@ export class Player {
|
|
|
171
173
|
this.bindBitrateChangeHandler();
|
|
172
174
|
}
|
|
173
175
|
player.core.on(ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
174
|
-
// this.trigger(Events.ContainerChanged)
|
|
175
176
|
this.bindBitrateChangeHandler();
|
|
176
177
|
}, null);
|
|
177
178
|
if (Browser.isiOS && player.core.activePlayback) {
|
|
@@ -273,15 +274,19 @@ export class Player {
|
|
|
273
274
|
},
|
|
274
275
|
};
|
|
275
276
|
buildCoreOptions(rootNode) {
|
|
276
|
-
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
277
|
+
// TODO extract
|
|
278
|
+
// const multisources = this.config.multisources
|
|
279
|
+
// const mainSource =
|
|
280
|
+
// this.config.playbackType === 'live'
|
|
281
|
+
// ? multisources.find((ms) => ms.live !== false)
|
|
282
|
+
// : multisources[0]
|
|
283
|
+
// const mediaSources = mainSource
|
|
284
|
+
// ? this.buildMediaSourcesList(mainSource)
|
|
285
|
+
// : []
|
|
283
286
|
// const mainSourceUrl = mediaSources[0];
|
|
284
|
-
const poster = mainSource?.poster ?? this.config.poster
|
|
287
|
+
// const poster = mainSource?.poster ?? this.config.poster
|
|
288
|
+
const poster = this.config.poster;
|
|
289
|
+
const source = this.selectMediaSource(); // TODO
|
|
285
290
|
this.rootNode = rootNode;
|
|
286
291
|
const coreOptions = {
|
|
287
292
|
...this.config.pluginSettings,
|
|
@@ -291,7 +296,6 @@ export class Player {
|
|
|
291
296
|
events: this.events,
|
|
292
297
|
height: rootNode.clientHeight,
|
|
293
298
|
loop: this.config.loop,
|
|
294
|
-
multisources,
|
|
295
299
|
mute: this.config.mute,
|
|
296
300
|
playback: {
|
|
297
301
|
controls: false,
|
|
@@ -307,8 +311,8 @@ export class Player {
|
|
|
307
311
|
playbackType: this.config.playbackType,
|
|
308
312
|
poster,
|
|
309
313
|
width: rootNode.clientWidth,
|
|
310
|
-
|
|
311
|
-
sources: mediaSources,
|
|
314
|
+
source: source ? unwrapSource(source) : undefined,
|
|
315
|
+
// sources: mediaSources,
|
|
312
316
|
strings: this.config.strings,
|
|
313
317
|
};
|
|
314
318
|
return coreOptions;
|
|
@@ -323,57 +327,8 @@ export class Player {
|
|
|
323
327
|
this.qLevel = bitrate;
|
|
324
328
|
});
|
|
325
329
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
dash: ms.sourceDash,
|
|
330
|
-
master: ms.source,
|
|
331
|
-
hls: ms.hlsCmafUrl,
|
|
332
|
-
mpegts: ms.hlsMpegtsUrl,
|
|
333
|
-
};
|
|
334
|
-
switch (this.config.priorityTransport) {
|
|
335
|
-
case 'dash':
|
|
336
|
-
addDash();
|
|
337
|
-
break;
|
|
338
|
-
case 'hls':
|
|
339
|
-
addHls();
|
|
340
|
-
break;
|
|
341
|
-
case 'mpegts':
|
|
342
|
-
addMpegts();
|
|
343
|
-
break;
|
|
344
|
-
case 'auto':
|
|
345
|
-
addDash();
|
|
346
|
-
addHls();
|
|
347
|
-
break;
|
|
348
|
-
}
|
|
349
|
-
Object.values(sources).forEach((s) => {
|
|
350
|
-
if (s) {
|
|
351
|
-
msl.push(s);
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
return msl;
|
|
355
|
-
function addMpegts() {
|
|
356
|
-
if (sources.mpegts) {
|
|
357
|
-
msl.push(sources.mpegts);
|
|
358
|
-
sources.mpegts = null;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
function addHls() {
|
|
362
|
-
if (sources.hls && HlsPlayback.canPlay(sources.hls)) {
|
|
363
|
-
msl.push(sources.hls);
|
|
364
|
-
sources.hls = null;
|
|
365
|
-
}
|
|
366
|
-
if (sources.master?.endsWith('.m3u8') &&
|
|
367
|
-
HlsPlayback.canPlay(sources.master)) {
|
|
368
|
-
msl.push(sources.master);
|
|
369
|
-
sources.master = null;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
function addDash() {
|
|
373
|
-
if (sources.dash && DashPlayback.canPlay(sources.dash)) {
|
|
374
|
-
msl.push(sources.dash);
|
|
375
|
-
sources.dash = null;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
330
|
+
// Select a single source to play according to the priority transport and the modules support
|
|
331
|
+
selectMediaSource() {
|
|
332
|
+
return buildSourcesPriorityList(buildSourcesSet(this.config.sources), this.config.priorityTransport)[0];
|
|
378
333
|
}
|
|
379
334
|
}
|
package/lib/internal.types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CorePlugin, ContainerPlugin, Playback as ClapprPlayback } from "@clappr/core";
|
|
2
|
-
import { PlaybackType, PlayerDebugTag
|
|
2
|
+
import { PlaybackType, PlayerDebugTag } from "./types";
|
|
3
3
|
type ExternalTrack = {
|
|
4
4
|
kind?: "subtitles" | "captions";
|
|
5
5
|
src: string;
|
|
@@ -10,7 +10,7 @@ type MediacontrolStyles = {
|
|
|
10
10
|
seekbar?: string;
|
|
11
11
|
buttons?: string;
|
|
12
12
|
};
|
|
13
|
-
type PlayerMediaSourceDesc = {
|
|
13
|
+
export type PlayerMediaSourceDesc = {
|
|
14
14
|
mimeType?: string;
|
|
15
15
|
source: string;
|
|
16
16
|
};
|
|
@@ -92,7 +92,6 @@ export type CoreOptions = {
|
|
|
92
92
|
maxBufferLength?: number;
|
|
93
93
|
mediacontrol?: MediacontrolStyles;
|
|
94
94
|
mimeType?: string;
|
|
95
|
-
multisources: StreamMediaSource[];
|
|
96
95
|
mute?: boolean;
|
|
97
96
|
persistConfig?: boolean;
|
|
98
97
|
preload?: "auto" | "metadata" | "none";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.types.d.ts","sourceRoot":"","sources":["../src/internal.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,QAAQ,IAAI,cAAc,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"internal.types.d.ts","sourceRoot":"","sources":["../src/internal.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,QAAQ,IAAI,cAAc,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAqB,MAAM,SAAS,CAAC;AAE1E,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAA;AAED,KAAK,kBAAkB,GAAG;IAExB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,qBAAqB,CAAC;AAE/D,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,KAAK,kBAAkB,GAAG;IAExB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAC;IAE9C,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;IAK1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;IAEvC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,CAAA;AAED,KAAK,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAE7B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7D,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1E,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;CAEb,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,cAAc,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACnC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,EAAE,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}
|