@gcorevideo/player 2.20.21 → 2.21.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/assets/audio-selector/style.scss +48 -82
- package/assets/audio-selector/track-selector.ejs +3 -3
- package/assets/bottom-gear/bottomgear.ejs +10 -12
- package/assets/bottom-gear/gear-sub-menu.scss +0 -15
- package/assets/bottom-gear/gear.scss +3 -32
- package/assets/media-control/media-control.ejs +5 -20
- package/assets/media-control/media-control.scss +124 -34
- package/assets/media-control/width370.scss +32 -104
- package/assets/picture-in-picture/button.ejs +1 -1
- package/assets/picture-in-picture/button.scss +5 -4
- package/dist/core.js +151 -24
- package/dist/index.css +1063 -1149
- package/dist/index.js +287 -283
- package/dist/player.d.ts +19 -16
- package/dist/plugins/index.css +953 -1039
- package/dist/plugins/index.js +709 -23402
- package/docs/api/player.audioselector.md +4 -59
- package/docs/api/player.md +1 -1
- package/docs/api/player.mediacontrol.getelement.md +5 -0
- package/docs/api/player.mediacontrol.md +14 -0
- package/docs/api/{player.audioselector.updatecurrenttrack.md → player.mediacontrol.putelement.md} +7 -7
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/docs/api/{player.audioselector.starttrackswitch.md → player.pictureinpicture.attributes.md} +5 -7
- package/docs/api/player.pictureinpicture.md +45 -0
- package/lib/playback/BasePlayback.d.ts +0 -1
- package/lib/playback/BasePlayback.d.ts.map +1 -1
- package/lib/playback/BasePlayback.js +0 -1
- package/lib/playback/HTML5Video.d.ts +4 -0
- package/lib/playback/HTML5Video.d.ts.map +1 -1
- package/lib/playback/HTML5Video.js +57 -6
- package/lib/playback/dash-playback/DashPlayback.d.ts +5 -0
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +48 -4
- package/lib/playback/hls-playback/HlsPlayback.d.ts +31 -25
- package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/playback/hls-playback/HlsPlayback.js +47 -14
- package/lib/plugins/audio-selector/AudioSelector.d.ts +12 -11
- package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.js +65 -185
- package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +10 -9
- package/lib/plugins/level-selector/LevelSelector.js +1 -1
- package/lib/plugins/media-control/MediaControl.d.ts +3 -3
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +17 -9
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +3 -0
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
- package/lib/plugins/picture-in-picture/PictureInPicture.js +6 -1
- package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
- package/lib/plugins/source-controller/SourceController.js +0 -1
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +0 -2
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +1 -18
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +2 -0
- package/package.json +1 -1
- package/src/playback/BasePlayback.ts +0 -1
- package/src/playback/HTML5Video.ts +61 -6
- package/src/playback/dash-playback/DashPlayback.ts +64 -6
- package/src/playback/hls-playback/HlsPlayback.ts +82 -40
- package/src/plugins/audio-selector/AudioSelector.ts +84 -278
- package/src/plugins/bottom-gear/BottomGear.ts +11 -10
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -3
- package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +14 -37
- package/src/plugins/level-selector/LevelSelector.ts +1 -1
- package/src/plugins/media-control/MediaControl.ts +18 -13
- package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -1
- package/src/plugins/source-controller/SourceController.ts +0 -1
- package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +1 -20
- package/src/testUtils.ts +2 -0
- package/src/typings/globals.d.ts +19 -0
- package/temp/player.api.json +102 -143
- package/tsconfig.tsbuildinfo +1 -1
- package/assets/media-control/plugins.scss +0 -94
- package/docs/api/player.audioselector.highlightcurrenttrack.md +0 -18
package/dist/index.js
CHANGED
|
@@ -12626,7 +12626,6 @@ var PlaybackErrorCode;
|
|
|
12626
12626
|
/**
|
|
12627
12627
|
* This class adds common behaviors to all playback modules.
|
|
12628
12628
|
* @internal
|
|
12629
|
-
* TODO use custom HTML5Video playback with this layer applied
|
|
12630
12629
|
*/
|
|
12631
12630
|
class BasePlayback extends HTML5Video$1 {
|
|
12632
12631
|
createError(errorData, options) {
|
|
@@ -12672,13 +12671,13 @@ var PlaybackEvents;
|
|
|
12672
12671
|
PlaybackEvents["PLAYBACK_RATE_CHANGED"] = "playback:rate-changed";
|
|
12673
12672
|
})(PlaybackEvents || (PlaybackEvents = {}));
|
|
12674
12673
|
|
|
12675
|
-
//
|
|
12676
|
-
//
|
|
12677
|
-
// license
|
|
12678
|
-
|
|
12674
|
+
// This code is derived on works by Globo.com.
|
|
12675
|
+
// This code is distributed under the terms of the Apache License 2.0.
|
|
12676
|
+
// Original code's license can be found on
|
|
12677
|
+
// https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
|
|
12678
|
+
const AUTO$1 = -1;
|
|
12679
12679
|
const { now: now$2 } = Utils;
|
|
12680
|
-
const T$
|
|
12681
|
-
// @ts-expect-error
|
|
12680
|
+
const T$k = 'playback.dash';
|
|
12682
12681
|
class DashPlayback extends BasePlayback {
|
|
12683
12682
|
_levels = null;
|
|
12684
12683
|
_currentLevel = null;
|
|
@@ -12724,7 +12723,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12724
12723
|
}
|
|
12725
12724
|
get currentLevel() {
|
|
12726
12725
|
if (this._currentLevel === null) {
|
|
12727
|
-
return AUTO$
|
|
12726
|
+
return AUTO$1;
|
|
12728
12727
|
}
|
|
12729
12728
|
// 0 is a valid level ID
|
|
12730
12729
|
return this._currentLevel;
|
|
@@ -12838,6 +12837,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12838
12837
|
const newLevel = this.getLevel(evt.newQuality);
|
|
12839
12838
|
this.onLevelSwitch(newLevel);
|
|
12840
12839
|
});
|
|
12840
|
+
this.checkAudioTracks();
|
|
12841
12841
|
});
|
|
12842
12842
|
this._dash.on(DASHJS.MediaPlayer.events.QUALITY_CHANGE_RENDERED, (evt) => {
|
|
12843
12843
|
const currentLevel = this.getLevel(evt.newQuality);
|
|
@@ -12858,6 +12858,11 @@ class DashPlayback extends BasePlayback {
|
|
|
12858
12858
|
this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e) => {
|
|
12859
12859
|
this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate);
|
|
12860
12860
|
});
|
|
12861
|
+
this._dash.on(DASHJS.MediaPlayer.events.TRACK_CHANGE_RENDERED, (e) => {
|
|
12862
|
+
if (e.mediaType === 'audio') {
|
|
12863
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack$1(e.newMediaInfo));
|
|
12864
|
+
}
|
|
12865
|
+
});
|
|
12861
12866
|
}
|
|
12862
12867
|
render() {
|
|
12863
12868
|
this._ready();
|
|
@@ -12947,10 +12952,10 @@ class DashPlayback extends BasePlayback {
|
|
|
12947
12952
|
}
|
|
12948
12953
|
_onPlaybackError = (event) => {
|
|
12949
12954
|
// TODO
|
|
12950
|
-
trace(`${T$
|
|
12955
|
+
trace(`${T$k} _onPlaybackError`, { event });
|
|
12951
12956
|
};
|
|
12952
12957
|
_onDASHJSSError = (event) => {
|
|
12953
|
-
trace(`${T$
|
|
12958
|
+
trace(`${T$k} _onDASHJSSError`, { event });
|
|
12954
12959
|
this._stopTimeUpdateTimer();
|
|
12955
12960
|
// Note that the other error types are deprecated
|
|
12956
12961
|
const e = event.error;
|
|
@@ -12985,7 +12990,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12985
12990
|
}
|
|
12986
12991
|
};
|
|
12987
12992
|
triggerError(error) {
|
|
12988
|
-
trace(`${T$
|
|
12993
|
+
trace(`${T$k} triggerError`, { error });
|
|
12989
12994
|
// this triggers Events.ERROR to be handled by the UI
|
|
12990
12995
|
this.trigger(Events$1.PLAYBACK_ERROR, this.createError(error, {
|
|
12991
12996
|
useCodePrefix: false,
|
|
@@ -13024,7 +13029,7 @@ class DashPlayback extends BasePlayback {
|
|
|
13024
13029
|
}
|
|
13025
13030
|
get dvrEnabled() {
|
|
13026
13031
|
if (!this._dash) {
|
|
13027
|
-
trace(`${T$
|
|
13032
|
+
trace(`${T$k} dvrEnable no dash player instance`);
|
|
13028
13033
|
return false;
|
|
13029
13034
|
}
|
|
13030
13035
|
return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
|
|
@@ -13046,7 +13051,7 @@ class DashPlayback extends BasePlayback {
|
|
|
13046
13051
|
this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
|
|
13047
13052
|
}
|
|
13048
13053
|
play() {
|
|
13049
|
-
trace(`${T$
|
|
13054
|
+
trace(`${T$k} play`, { dash: !!this._dash });
|
|
13050
13055
|
if (!this._dash) {
|
|
13051
13056
|
this._setup();
|
|
13052
13057
|
}
|
|
@@ -13125,6 +13130,36 @@ class DashPlayback extends BasePlayback {
|
|
|
13125
13130
|
setPlaybackRate(rate) {
|
|
13126
13131
|
this._dash?.setPlaybackRate(rate);
|
|
13127
13132
|
}
|
|
13133
|
+
get audioTracks() {
|
|
13134
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
|
|
13135
|
+
const tracks = this._dash.getTracksFor('audio');
|
|
13136
|
+
trace(`${T$k} get audioTracks`, { tracks });
|
|
13137
|
+
return tracks.map(toClapprTrack$1);
|
|
13138
|
+
}
|
|
13139
|
+
// @ts-expect-error
|
|
13140
|
+
get currentAudioTrack() {
|
|
13141
|
+
trace(`${T$k} get currentAudioTrack`);
|
|
13142
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
|
|
13143
|
+
const t = this._dash.getCurrentTrackFor('audio');
|
|
13144
|
+
if (!t) {
|
|
13145
|
+
return null;
|
|
13146
|
+
}
|
|
13147
|
+
return toClapprTrack$1(t);
|
|
13148
|
+
}
|
|
13149
|
+
switchAudioTrack(id) {
|
|
13150
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
|
|
13151
|
+
const tracks = this._dash.getTracksFor('audio');
|
|
13152
|
+
const track = tracks.find((t) => t.id === id);
|
|
13153
|
+
assert.ok(track, 'Invalid audio track ID');
|
|
13154
|
+
this._dash.setCurrentTrack(track);
|
|
13155
|
+
}
|
|
13156
|
+
checkAudioTracks() {
|
|
13157
|
+
// @ts-ignore
|
|
13158
|
+
const tracks = this._dash.getTracksFor('audio');
|
|
13159
|
+
if (tracks.length) {
|
|
13160
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack$1));
|
|
13161
|
+
}
|
|
13162
|
+
}
|
|
13128
13163
|
}
|
|
13129
13164
|
DashPlayback.canPlay = function (resource, mimeType) {
|
|
13130
13165
|
if (!isDashSource(resource, mimeType)) {
|
|
@@ -13136,6 +13171,14 @@ DashPlayback.canPlay = function (resource, mimeType) {
|
|
|
13136
13171
|
const ctor = ms || mms || wms;
|
|
13137
13172
|
return typeof ctor === 'function';
|
|
13138
13173
|
};
|
|
13174
|
+
function toClapprTrack$1(t) {
|
|
13175
|
+
return {
|
|
13176
|
+
id: t.id,
|
|
13177
|
+
kind: t.roles && t.roles?.length > 0 ? t.roles[0] : 'main', // TODO
|
|
13178
|
+
label: t.labels.map((l) => l.text).join(' '), // TODO
|
|
13179
|
+
language: t.lang,
|
|
13180
|
+
};
|
|
13181
|
+
}
|
|
13139
13182
|
|
|
13140
13183
|
function getDefaultExportFromCjs (x) {
|
|
13141
13184
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
@@ -41792,12 +41835,11 @@ const CLAPPR_VERSION = '0.11.3';
|
|
|
41792
41835
|
// Use of this source code is governed by a BSD-style
|
|
41793
41836
|
// license that can be found on https://github.com/clappr/hlsjs-playback/blob/main/LICENSE
|
|
41794
41837
|
const { now } = Utils;
|
|
41795
|
-
const AUTO
|
|
41838
|
+
const AUTO = -1;
|
|
41796
41839
|
const DEFAULT_RECOVER_ATTEMPTS = 16;
|
|
41797
41840
|
Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
|
|
41798
41841
|
Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
|
|
41799
|
-
const T$
|
|
41800
|
-
// @ts-expect-error
|
|
41842
|
+
const T$j = 'playback.hls';
|
|
41801
41843
|
class HlsPlayback extends BasePlayback {
|
|
41802
41844
|
_ccIsSetup = false;
|
|
41803
41845
|
_ccTracksUpdated = false;
|
|
@@ -41834,7 +41876,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
41834
41876
|
return this._levels || [];
|
|
41835
41877
|
}
|
|
41836
41878
|
get currentLevel() {
|
|
41837
|
-
return this._currentLevel ?? AUTO
|
|
41879
|
+
return this._currentLevel ?? AUTO;
|
|
41838
41880
|
}
|
|
41839
41881
|
get isReady() {
|
|
41840
41882
|
return this._isReadyState;
|
|
@@ -41842,7 +41884,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
41842
41884
|
set currentLevel(id) {
|
|
41843
41885
|
this._currentLevel = id;
|
|
41844
41886
|
this.trigger(Events$1.PLAYBACK_LEVEL_SWITCH_START);
|
|
41845
|
-
assert.ok(this._hls, '
|
|
41887
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
41846
41888
|
if (this.options.playback.hlsUseNextLevel) {
|
|
41847
41889
|
this._hls.nextLevel = this._currentLevel;
|
|
41848
41890
|
}
|
|
@@ -41851,11 +41893,11 @@ class HlsPlayback extends BasePlayback {
|
|
|
41851
41893
|
}
|
|
41852
41894
|
}
|
|
41853
41895
|
get latency() {
|
|
41854
|
-
assert.ok(this._hls, '
|
|
41896
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
41855
41897
|
return this._hls.latency;
|
|
41856
41898
|
}
|
|
41857
41899
|
get currentProgramDateTime() {
|
|
41858
|
-
assert.ok(this._hls, '
|
|
41900
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
41859
41901
|
assert.ok(this._hls.playingDate, 'Hls.js playingDate is not defined');
|
|
41860
41902
|
return this._hls.playingDate;
|
|
41861
41903
|
}
|
|
@@ -42026,7 +42068,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42026
42068
|
maxBufferLength: 2,
|
|
42027
42069
|
maxMaxBufferLength: 4,
|
|
42028
42070
|
}, this.options.playback.hlsjsConfig);
|
|
42029
|
-
trace(`${T$
|
|
42071
|
+
trace(`${T$j} _createHLSInstance`, { config });
|
|
42030
42072
|
this._hls = new Hls(config);
|
|
42031
42073
|
}
|
|
42032
42074
|
_attachHLSMedia() {
|
|
@@ -42040,7 +42082,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42040
42082
|
return;
|
|
42041
42083
|
}
|
|
42042
42084
|
this._hls.once(Hls.Events.MEDIA_ATTACHED, () => {
|
|
42043
|
-
assert.ok(this._hls, '
|
|
42085
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42044
42086
|
this.options.hlsPlayback.preload && this._hls.loadSource(this.options.src);
|
|
42045
42087
|
});
|
|
42046
42088
|
const onPlaying = () => {
|
|
@@ -42065,13 +42107,15 @@ class HlsPlayback extends BasePlayback {
|
|
|
42065
42107
|
// this._hls.on(HLSJS.Events.SUBTITLE_TRACK_LOADED, (evt, data) => this._onSubtitleLoaded(evt, data));
|
|
42066
42108
|
this._hls.on(Hls.Events.SUBTITLE_TRACK_LOADED, () => this._onSubtitleLoaded());
|
|
42067
42109
|
this._hls.on(Hls.Events.SUBTITLE_TRACKS_UPDATED, () => (this._ccTracksUpdated = true));
|
|
42110
|
+
this._hls.on(Events.AUDIO_TRACKS_UPDATED, (evt, data) => this._onAudioTracksUpdated(evt, data));
|
|
42111
|
+
this._hls.on(Events.AUDIO_TRACK_SWITCHED, (evt, data) => this._onAudioTrackSwitched(evt, data));
|
|
42068
42112
|
this.bindCustomListeners();
|
|
42069
42113
|
}
|
|
42070
42114
|
bindCustomListeners() {
|
|
42071
42115
|
this.customListeners.forEach((item) => {
|
|
42072
42116
|
const requestedEventName = item.eventName;
|
|
42073
42117
|
const typeOfListener = item.once ? 'once' : 'on';
|
|
42074
|
-
assert.ok(this._hls, '
|
|
42118
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42075
42119
|
requestedEventName &&
|
|
42076
42120
|
this._hls[`${typeOfListener}`](requestedEventName, item.callback);
|
|
42077
42121
|
});
|
|
@@ -42079,7 +42123,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42079
42123
|
unbindCustomListeners() {
|
|
42080
42124
|
this.customListeners.forEach((item) => {
|
|
42081
42125
|
const requestedEventName = item.eventName;
|
|
42082
|
-
assert.ok(this._hls, '
|
|
42126
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42083
42127
|
requestedEventName && this._hls.off(requestedEventName, item.callback);
|
|
42084
42128
|
});
|
|
42085
42129
|
}
|
|
@@ -42103,7 +42147,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42103
42147
|
this.trigger(Events$1.PLAYBACK_READY, this.name);
|
|
42104
42148
|
}
|
|
42105
42149
|
_recover(evt, data, error) {
|
|
42106
|
-
assert(this._hls, '
|
|
42150
|
+
assert(this._hls, 'HLS.js is not initialized');
|
|
42107
42151
|
if (!this._recoveredDecodingError) {
|
|
42108
42152
|
this._recoveredDecodingError = true;
|
|
42109
42153
|
this._hls.recoverMediaError();
|
|
@@ -42115,7 +42159,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42115
42159
|
}
|
|
42116
42160
|
else {
|
|
42117
42161
|
Log.error('hlsjs: failed to recover', { evt, data });
|
|
42118
|
-
trace(`${T$
|
|
42162
|
+
trace(`${T$j} _recover failed to recover`, {
|
|
42119
42163
|
type: data.type,
|
|
42120
42164
|
details: data.details,
|
|
42121
42165
|
});
|
|
@@ -42201,7 +42245,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42201
42245
|
this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
|
|
42202
42246
|
}
|
|
42203
42247
|
_onHLSJSError(evt, data) {
|
|
42204
|
-
trace(`${T$
|
|
42248
|
+
trace(`${T$j} _onHLSJSError`, {
|
|
42205
42249
|
fatal: data.fatal,
|
|
42206
42250
|
type: data.type,
|
|
42207
42251
|
details: data.details,
|
|
@@ -42249,7 +42293,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42249
42293
|
evt,
|
|
42250
42294
|
data,
|
|
42251
42295
|
});
|
|
42252
|
-
trace(`${T$
|
|
42296
|
+
trace(`${T$j} _onHLSJSError trying to recover from network error`, {
|
|
42253
42297
|
details: data.details,
|
|
42254
42298
|
});
|
|
42255
42299
|
error.level = PlayerError.Levels.WARN;
|
|
@@ -42262,14 +42306,10 @@ class HlsPlayback extends BasePlayback {
|
|
|
42262
42306
|
evt,
|
|
42263
42307
|
data,
|
|
42264
42308
|
});
|
|
42265
|
-
trace(`${T$
|
|
42309
|
+
trace(`${T$j} _onHLSJSError trying to recover from media error`, {
|
|
42266
42310
|
details: data.details,
|
|
42267
42311
|
});
|
|
42268
42312
|
error.level = PlayerError.Levels.WARN;
|
|
42269
|
-
// TODO check
|
|
42270
|
-
// if (data.error instanceof MediaError && data.error.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {
|
|
42271
|
-
// error.code = PlaybackErrorCode.MediaSourceUnavailable
|
|
42272
|
-
// }
|
|
42273
42313
|
this._recover(evt, data, error);
|
|
42274
42314
|
break;
|
|
42275
42315
|
default:
|
|
@@ -42296,7 +42336,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42296
42336
|
return;
|
|
42297
42337
|
}
|
|
42298
42338
|
Log.warn('hlsjs: non-fatal error occurred', { evt, data });
|
|
42299
|
-
trace(`${T$
|
|
42339
|
+
trace(`${T$j} _onHLSJSError non-fatal error occurred`, {
|
|
42300
42340
|
type: data.type,
|
|
42301
42341
|
details: data.details,
|
|
42302
42342
|
});
|
|
@@ -42411,7 +42451,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42411
42451
|
}
|
|
42412
42452
|
}
|
|
42413
42453
|
_fillLevels() {
|
|
42414
|
-
assert.ok(this._hls, '
|
|
42454
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42415
42455
|
this._levels = this._hls.levels.map((level, index) => {
|
|
42416
42456
|
return {
|
|
42417
42457
|
level: index, // or level.id?
|
|
@@ -42612,6 +42652,34 @@ class HlsPlayback extends BasePlayback {
|
|
|
42612
42652
|
}));
|
|
42613
42653
|
this.stop();
|
|
42614
42654
|
}
|
|
42655
|
+
get audioTracks() {
|
|
42656
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42657
|
+
return this._hls.audioTracks.map(toClapprTrack);
|
|
42658
|
+
}
|
|
42659
|
+
// @ts-expect-error
|
|
42660
|
+
get currentAudioTrack() {
|
|
42661
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42662
|
+
const idx = this._hls.audioTrack;
|
|
42663
|
+
const track = this._hls.audioTracks[idx]; // TODO or find by .id == idx?
|
|
42664
|
+
if (track) {
|
|
42665
|
+
return toClapprTrack(track);
|
|
42666
|
+
}
|
|
42667
|
+
return null;
|
|
42668
|
+
}
|
|
42669
|
+
switchAudioTrack(id) {
|
|
42670
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42671
|
+
this._hls.audioTrack = Number(id); // TODO or find index by .id == id?
|
|
42672
|
+
}
|
|
42673
|
+
_onAudioTracksUpdated(_, data) {
|
|
42674
|
+
trace(`${T$j} onAudioTracksUpdated`);
|
|
42675
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, data.audioTracks.map(toClapprTrack));
|
|
42676
|
+
}
|
|
42677
|
+
_onAudioTrackSwitched(_, data) {
|
|
42678
|
+
trace(`${T$j} onAudioTrackSwitched`);
|
|
42679
|
+
// @ts-ignore
|
|
42680
|
+
const track = this._hls.audioTracks[data.id];
|
|
42681
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack(track));
|
|
42682
|
+
}
|
|
42615
42683
|
}
|
|
42616
42684
|
HlsPlayback.canPlay = function (resource, mimeType) {
|
|
42617
42685
|
if (!isHlsSource(resource, mimeType)) {
|
|
@@ -42619,8 +42687,16 @@ HlsPlayback.canPlay = function (resource, mimeType) {
|
|
|
42619
42687
|
}
|
|
42620
42688
|
return Hls.isSupported();
|
|
42621
42689
|
};
|
|
42690
|
+
function toClapprTrack(t) {
|
|
42691
|
+
return {
|
|
42692
|
+
id: String(t.id),
|
|
42693
|
+
language: t.lang ?? '',
|
|
42694
|
+
kind: t.type === 'main' ? 'main' : 'description', // TODO check
|
|
42695
|
+
label: t.name,
|
|
42696
|
+
};
|
|
42697
|
+
}
|
|
42622
42698
|
|
|
42623
|
-
const T$
|
|
42699
|
+
const T$i = 'playback.html5_video';
|
|
42624
42700
|
const STALL_TIMEOUT = 15000;
|
|
42625
42701
|
class HTML5Video extends BasePlayback {
|
|
42626
42702
|
stallTimerId = null;
|
|
@@ -42628,7 +42704,7 @@ class HTML5Video extends BasePlayback {
|
|
|
42628
42704
|
* @internal
|
|
42629
42705
|
*/
|
|
42630
42706
|
createError(errorData, options) {
|
|
42631
|
-
trace(`${T$
|
|
42707
|
+
trace(`${T$i} createError`, {
|
|
42632
42708
|
errorData: { ...errorData },
|
|
42633
42709
|
});
|
|
42634
42710
|
const i18n = this.i18n ||
|
|
@@ -42639,20 +42715,16 @@ class HTML5Video extends BasePlayback {
|
|
|
42639
42715
|
if (i18n &&
|
|
42640
42716
|
!errorData.UI &&
|
|
42641
42717
|
errorData.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {
|
|
42642
|
-
// errorData.UI = {
|
|
42643
|
-
// title: i18n.t('no_broadcast'),
|
|
42644
|
-
// message: errorData.message,
|
|
42645
|
-
// }
|
|
42646
42718
|
errorData.code = PlaybackErrorCode.MediaSourceUnavailable;
|
|
42647
42719
|
}
|
|
42648
42720
|
return super.createError(errorData, { ...options, useCodePrefix: false });
|
|
42649
42721
|
}
|
|
42650
42722
|
_onWaiting() {
|
|
42651
|
-
trace(`${T$
|
|
42723
|
+
trace(`${T$i} _onWaiting`);
|
|
42652
42724
|
super._onWaiting();
|
|
42653
42725
|
}
|
|
42654
42726
|
_onEnded() {
|
|
42655
|
-
trace(`${T$
|
|
42727
|
+
trace(`${T$i} _onEnded`);
|
|
42656
42728
|
if (this.stallTimerId) {
|
|
42657
42729
|
clearTimeout(this.stallTimerId);
|
|
42658
42730
|
this.stallTimerId = null;
|
|
@@ -42660,28 +42732,30 @@ class HTML5Video extends BasePlayback {
|
|
|
42660
42732
|
super._onEnded();
|
|
42661
42733
|
}
|
|
42662
42734
|
_handleBufferingEvents() {
|
|
42663
|
-
trace(`${T$
|
|
42735
|
+
trace(`${T$i} _handleBufferingEvents`, {
|
|
42664
42736
|
networkState: this.el.networkState,
|
|
42665
42737
|
});
|
|
42666
42738
|
if (!this.stallTimerId) {
|
|
42667
42739
|
this.stallTimerId = setTimeout(() => {
|
|
42668
|
-
trace(`${T$
|
|
42740
|
+
trace(`${T$i} _handleBufferingEvents stall timeout`, {
|
|
42669
42741
|
buffering: this.buffering,
|
|
42670
42742
|
ended: this.ended,
|
|
42671
42743
|
});
|
|
42672
42744
|
this.stallTimerId = null;
|
|
42673
|
-
this.createError({
|
|
42745
|
+
const error = this.createError({
|
|
42674
42746
|
code: PlaybackErrorCode.MediaSourceUnavailable,
|
|
42675
42747
|
level: PlayerError.Levels.FATAL,
|
|
42676
42748
|
message: 'Stall timeout',
|
|
42677
42749
|
description: 'Playback stalled for too long',
|
|
42678
42750
|
});
|
|
42751
|
+
this.trigger(Events$1.PLAYBACK_ERROR, error);
|
|
42752
|
+
setTimeout(() => this.stop(), 0);
|
|
42679
42753
|
}, STALL_TIMEOUT);
|
|
42680
42754
|
}
|
|
42681
42755
|
super._handleBufferingEvents();
|
|
42682
42756
|
}
|
|
42683
42757
|
_onPlaying() {
|
|
42684
|
-
trace(`${T$
|
|
42758
|
+
trace(`${T$i} _onPlaying`);
|
|
42685
42759
|
if (this.stallTimerId) {
|
|
42686
42760
|
clearTimeout(this.stallTimerId);
|
|
42687
42761
|
this.stallTimerId = null;
|
|
@@ -42689,13 +42763,66 @@ class HTML5Video extends BasePlayback {
|
|
|
42689
42763
|
super._onPlaying();
|
|
42690
42764
|
}
|
|
42691
42765
|
_onPause() {
|
|
42692
|
-
trace(`${T$
|
|
42766
|
+
trace(`${T$i} _onPause`);
|
|
42693
42767
|
super._onPause();
|
|
42694
42768
|
if (this.stallTimerId) {
|
|
42695
42769
|
clearTimeout(this.stallTimerId);
|
|
42696
42770
|
this.stallTimerId = null;
|
|
42697
42771
|
}
|
|
42698
42772
|
}
|
|
42773
|
+
get audioTracks() {
|
|
42774
|
+
const tracks = this.el.audioTracks;
|
|
42775
|
+
const supported = !!tracks;
|
|
42776
|
+
trace(`${T$i} get audioTracks`, { supported });
|
|
42777
|
+
const retval = [];
|
|
42778
|
+
if (supported) {
|
|
42779
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
42780
|
+
const track = tracks[i];
|
|
42781
|
+
retval.push({
|
|
42782
|
+
id: track.id,
|
|
42783
|
+
label: track.label,
|
|
42784
|
+
language: track.language,
|
|
42785
|
+
kind: track.kind, // TODO check
|
|
42786
|
+
});
|
|
42787
|
+
}
|
|
42788
|
+
}
|
|
42789
|
+
return retval;
|
|
42790
|
+
}
|
|
42791
|
+
// @ts-expect-error
|
|
42792
|
+
get currentAudioTrack() {
|
|
42793
|
+
const tracks = this.el.audioTracks;
|
|
42794
|
+
const supported = !!tracks;
|
|
42795
|
+
trace(`${T$i} get currentAudioTrack`, {
|
|
42796
|
+
supported,
|
|
42797
|
+
});
|
|
42798
|
+
if (supported) {
|
|
42799
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
42800
|
+
const track = tracks[i];
|
|
42801
|
+
if (track.enabled) {
|
|
42802
|
+
return {
|
|
42803
|
+
id: track.id,
|
|
42804
|
+
label: track.label,
|
|
42805
|
+
language: track.language,
|
|
42806
|
+
kind: track.kind,
|
|
42807
|
+
};
|
|
42808
|
+
}
|
|
42809
|
+
}
|
|
42810
|
+
}
|
|
42811
|
+
return null;
|
|
42812
|
+
}
|
|
42813
|
+
switchAudioTrack(id) {
|
|
42814
|
+
const tracks = this.el.audioTracks;
|
|
42815
|
+
const supported = !!tracks;
|
|
42816
|
+
trace(`${T$i} switchAudioTrack`, {
|
|
42817
|
+
supported,
|
|
42818
|
+
});
|
|
42819
|
+
if (supported) {
|
|
42820
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
42821
|
+
const track = tracks[i];
|
|
42822
|
+
track.enabled = track.id === id;
|
|
42823
|
+
}
|
|
42824
|
+
}
|
|
42825
|
+
}
|
|
42699
42826
|
}
|
|
42700
42827
|
|
|
42701
42828
|
// TODO consider allowing the variation of the order of playback modules
|
|
@@ -42705,7 +42832,7 @@ function registerPlaybacks() {
|
|
|
42705
42832
|
Loader.registerPlayback(DashPlayback);
|
|
42706
42833
|
}
|
|
42707
42834
|
|
|
42708
|
-
const T$
|
|
42835
|
+
const T$h = 'GPlayer';
|
|
42709
42836
|
const DEFAULT_OPTIONS = {
|
|
42710
42837
|
autoPlay: false,
|
|
42711
42838
|
debug: 'none',
|
|
@@ -42800,7 +42927,7 @@ class Player {
|
|
|
42800
42927
|
}
|
|
42801
42928
|
const coreOpts = this.buildCoreOptions(playerElement);
|
|
42802
42929
|
const { core, container } = Player.getRegisteredPlugins();
|
|
42803
|
-
trace(`${T$
|
|
42930
|
+
trace(`${T$h} init`, {
|
|
42804
42931
|
registeredPlaybacks: Loader.registeredPlaybacks.map((p) => p.prototype.name),
|
|
42805
42932
|
});
|
|
42806
42933
|
coreOpts.plugins = {
|
|
@@ -42814,7 +42941,7 @@ class Player {
|
|
|
42814
42941
|
* Destroys the player, releasing all resources and unmounting its UI from the DOM.
|
|
42815
42942
|
*/
|
|
42816
42943
|
destroy() {
|
|
42817
|
-
trace(`${T$
|
|
42944
|
+
trace(`${T$h} destroy`, {
|
|
42818
42945
|
player: !!this.player,
|
|
42819
42946
|
});
|
|
42820
42947
|
if (this.player) {
|
|
@@ -43001,7 +43128,7 @@ class Player {
|
|
|
43001
43128
|
this.config = $.extend(true, this.config, config);
|
|
43002
43129
|
}
|
|
43003
43130
|
initPlayer(coreOptions) {
|
|
43004
|
-
trace(`${T$
|
|
43131
|
+
trace(`${T$h} initPlayer`, {
|
|
43005
43132
|
autoPlay: coreOptions.autoPlay,
|
|
43006
43133
|
sources: coreOptions.sources,
|
|
43007
43134
|
// TODO selected options
|
|
@@ -43026,7 +43153,7 @@ class Player {
|
|
|
43026
43153
|
}
|
|
43027
43154
|
}
|
|
43028
43155
|
triggerAutoPlay() {
|
|
43029
|
-
trace(`${T$
|
|
43156
|
+
trace(`${T$h} triggerAutoPlay`);
|
|
43030
43157
|
setTimeout(() => {
|
|
43031
43158
|
this.player?.play({
|
|
43032
43159
|
autoPlay: true,
|
|
@@ -43044,7 +43171,7 @@ class Player {
|
|
|
43044
43171
|
// TODO test
|
|
43045
43172
|
events = {
|
|
43046
43173
|
onReady: () => {
|
|
43047
|
-
trace(`${T$
|
|
43174
|
+
trace(`${T$h} onReady`, {
|
|
43048
43175
|
ready: this.ready,
|
|
43049
43176
|
});
|
|
43050
43177
|
if (this.ready) {
|
|
@@ -43078,7 +43205,7 @@ class Player {
|
|
|
43078
43205
|
buildCoreOptions(rootNode) {
|
|
43079
43206
|
const sources = this.buildMediaSourcesList();
|
|
43080
43207
|
const source = sources[0];
|
|
43081
|
-
trace(`${T$
|
|
43208
|
+
trace(`${T$h} buildCoreOptions`, {
|
|
43082
43209
|
source,
|
|
43083
43210
|
sources,
|
|
43084
43211
|
});
|
|
@@ -43139,7 +43266,7 @@ class Player {
|
|
|
43139
43266
|
assert.ok(this.player, 'Player is not initialized');
|
|
43140
43267
|
const core = this.player.core;
|
|
43141
43268
|
core.on(Events$1.CORE_SCREEN_ORIENTATION_CHANGED, ({ orientation }) => {
|
|
43142
|
-
trace(`${T$
|
|
43269
|
+
trace(`${T$h} on CORE_SCREEN_ORIENTATION_CHANGED`, {
|
|
43143
43270
|
orientation,
|
|
43144
43271
|
rootNode: {
|
|
43145
43272
|
width: this.rootNode?.clientWidth,
|
|
@@ -43154,14 +43281,14 @@ class Player {
|
|
|
43154
43281
|
}
|
|
43155
43282
|
}, null);
|
|
43156
43283
|
core.on(Events$1.CORE_RESIZE, ({ width, height }) => {
|
|
43157
|
-
trace(`${T$
|
|
43284
|
+
trace(`${T$h} on CORE_RESIZE`, {
|
|
43158
43285
|
width,
|
|
43159
43286
|
height,
|
|
43160
43287
|
});
|
|
43161
43288
|
this.safeTriggerEvent(PlayerEvent.Resize, { width, height });
|
|
43162
43289
|
}, null);
|
|
43163
43290
|
core.on(Events$1.CORE_FULLSCREEN, (isFullscreen) => {
|
|
43164
|
-
trace(`${T$
|
|
43291
|
+
trace(`${T$h} CORE_FULLSCREEN`, {
|
|
43165
43292
|
isFullscreen,
|
|
43166
43293
|
});
|
|
43167
43294
|
this.safeTriggerEvent(PlayerEvent.Fullscreen, isFullscreen);
|
|
@@ -43169,7 +43296,7 @@ class Player {
|
|
|
43169
43296
|
}
|
|
43170
43297
|
}
|
|
43171
43298
|
|
|
43172
|
-
var version$1 = "2.
|
|
43299
|
+
var version$1 = "2.21.1";
|
|
43173
43300
|
|
|
43174
43301
|
var packages = {
|
|
43175
43302
|
"node_modules/@clappr/core": {
|
|
@@ -43193,20 +43320,23 @@ function version() {
|
|
|
43193
43320
|
};
|
|
43194
43321
|
}
|
|
43195
43322
|
|
|
43196
|
-
const pluginHtml$7 = "<button data-track-selector-button class='gcore-skin-button-color'>\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color'>\n <% for (
|
|
43323
|
+
const pluginHtml$7 = "<button data-track-selector-button class='gcore-skin-button-color'>\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color'>\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-track-selector-select=\"<%= track.id %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
|
|
43197
43324
|
|
|
43198
43325
|
const audioArrow = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg width=\"9px\" height=\"6px\" viewBox=\"0 0 9 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <!-- Generator: Sketch 49 (51002) - http://www.bohemiancoding.com/sketch -->\n <title>quality-arrow</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"quality-arrow\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M5.07079194,5.78553848 C4.91457318,5.94277844 4.70551573,6.00941824 4.50028717,5.99893557 C4.2950586,6.00941824 4.08676693,5.94277844 3.92978239,5.78553848 L0.221118462,1.2997069 C-0.0737061539,1.00469478 -0.0737061539,0.526236029 0.221118462,0.231972666 C0.515177299,-0.0630394586 1.23500883,0.00734414472 1.64852907,0.00734414472 L7.77475484,0.00734414472 C8.21201421,0.00734414472 8.48539703,-0.0630394586 8.77945587,0.231972666 C9.07351471,0.526236029 9.07351471,1.00469478 8.77945587,1.2997069 L5.07079194,5.78553848 Z\"\n fill=\"#FFFFFE\"></path>\n </g>\n</svg>\n";
|
|
43199
43326
|
|
|
43200
43327
|
const VERSION$6 = '0.0.1';
|
|
43201
|
-
|
|
43202
|
-
const AUTO = 0;
|
|
43328
|
+
const T$g = 'plugins.audio_selector';
|
|
43203
43329
|
/**
|
|
43204
|
-
* `PLUGIN` that
|
|
43330
|
+
* `PLUGIN` that makes possible to switch audio tracks via the media control UI.
|
|
43205
43331
|
* @beta
|
|
43332
|
+
* @remarks
|
|
43333
|
+
* The plugin is activated when there are multiple audio tracks available.
|
|
43334
|
+
* The plugin adds a button showing the current audio track and a dropdown to switch to another audio track.
|
|
43335
|
+
* Depends on:
|
|
43336
|
+
*
|
|
43337
|
+
* - {@link MediaControl}
|
|
43206
43338
|
*/
|
|
43207
43339
|
class AudioSelector extends UICorePlugin {
|
|
43208
|
-
// TODO
|
|
43209
|
-
selectedTrackId;
|
|
43210
43340
|
currentTrack = null;
|
|
43211
43341
|
tracks = [];
|
|
43212
43342
|
/**
|
|
@@ -43233,7 +43363,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43233
43363
|
*/
|
|
43234
43364
|
get attributes() {
|
|
43235
43365
|
return {
|
|
43236
|
-
class:
|
|
43366
|
+
class: 'media-control-audio-tracks',
|
|
43237
43367
|
'data-track-selector': '',
|
|
43238
43368
|
};
|
|
43239
43369
|
}
|
|
@@ -43250,101 +43380,49 @@ class AudioSelector extends UICorePlugin {
|
|
|
43250
43380
|
* @internal
|
|
43251
43381
|
*/
|
|
43252
43382
|
bindEvents() {
|
|
43253
|
-
this.listenTo(this.core, Events$1.CORE_READY, this.
|
|
43254
|
-
|
|
43255
|
-
this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED, this.reload);
|
|
43256
|
-
this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
43257
|
-
this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectTrackMenu);
|
|
43383
|
+
this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
|
|
43384
|
+
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
43258
43385
|
}
|
|
43259
|
-
|
|
43260
|
-
|
|
43261
|
-
this.
|
|
43262
|
-
|
|
43263
|
-
this.
|
|
43264
|
-
|
|
43265
|
-
this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED);
|
|
43266
|
-
// @ts-ignore
|
|
43267
|
-
this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE);
|
|
43386
|
+
onCoreReady() {
|
|
43387
|
+
trace(`${T$g} onCoreReady`);
|
|
43388
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
43389
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
43390
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
43391
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectTrackMenu);
|
|
43268
43392
|
}
|
|
43269
43393
|
bindPlaybackEvents() {
|
|
43270
|
-
|
|
43271
|
-
|
|
43272
|
-
this.
|
|
43273
|
-
const currentPlayback = this.core.activePlayback;
|
|
43274
|
-
this.listenTo(currentPlayback, Events$1.PLAYBACK_STOP, this.onStop);
|
|
43394
|
+
trace(`${T$g} bindPlaybackEvents`);
|
|
43395
|
+
this.currentTrack = null;
|
|
43396
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_STOP, this.onStop);
|
|
43275
43397
|
this.setupAudioTrackListeners();
|
|
43276
43398
|
}
|
|
43277
43399
|
setupAudioTrackListeners() {
|
|
43278
|
-
|
|
43279
|
-
|
|
43280
|
-
|
|
43281
|
-
|
|
43282
|
-
|
|
43283
|
-
|
|
43284
|
-
|
|
43285
|
-
|
|
43286
|
-
|
|
43287
|
-
|
|
43288
|
-
|
|
43289
|
-
|
|
43290
|
-
|
|
43291
|
-
const defaultTrack = data.audioTracks.find((track) => track.default);
|
|
43292
|
-
if (defaultTrack) {
|
|
43293
|
-
this.currentTrack = {
|
|
43294
|
-
id: defaultTrack.id,
|
|
43295
|
-
label: defaultTrack.name,
|
|
43296
|
-
};
|
|
43297
|
-
}
|
|
43298
|
-
this.fillTracks(data.audioTracks.map((p) => ({
|
|
43299
|
-
id: p.id,
|
|
43300
|
-
label: p.name,
|
|
43301
|
-
})), defaultTrack?.id);
|
|
43302
|
-
});
|
|
43303
|
-
currentPlayback._hls.on(Events.AUDIO_TRACK_SWITCHING, this.startTrackSwitch.bind(this));
|
|
43304
|
-
currentPlayback._hls.on(Events.AUDIO_TRACK_SWITCHED, this.updateCurrentTrack.bind(this));
|
|
43305
|
-
currentPlayback._hls.on(Events.AUDIO_TRACK_LOADED, this.updateCurrentTrack.bind(this));
|
|
43306
|
-
}
|
|
43307
|
-
else {
|
|
43308
|
-
this.listenToOnce(currentPlayback, Events$1.PLAYBACK_PLAY, () => {
|
|
43309
|
-
const mediaElement = currentPlayback.$el.get(0);
|
|
43310
|
-
// const { audioTracks } = currentPlayback.$el.get(0);
|
|
43311
|
-
const audioTracks = mediaElement.audioTracks;
|
|
43312
|
-
if (audioTracks && audioTracks.length) {
|
|
43313
|
-
let index = 0;
|
|
43314
|
-
const trackItems = [];
|
|
43315
|
-
for (const audioTrack of audioTracks) {
|
|
43316
|
-
if (audioTrack.enabled) {
|
|
43317
|
-
const t = {
|
|
43318
|
-
id: index,
|
|
43319
|
-
label: audioTrack.label,
|
|
43320
|
-
};
|
|
43321
|
-
this.currentTrack = t;
|
|
43322
|
-
trackItems.push(t);
|
|
43323
|
-
index++;
|
|
43324
|
-
}
|
|
43325
|
-
}
|
|
43326
|
-
audioTracks.addEventListener('change', () => this.updateCurrentTrackW3C());
|
|
43327
|
-
this.fillTracks(trackItems, trackItems[0].id);
|
|
43328
|
-
}
|
|
43329
|
-
});
|
|
43330
|
-
}
|
|
43400
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_AUDIO_AVAILABLE, (tracks) => {
|
|
43401
|
+
trace(`${T$g} on PLAYBACK_AUDIO_AVAILABLE`, { audioTracks: tracks });
|
|
43402
|
+
this.currentTrack =
|
|
43403
|
+
tracks.find((track) => track.kind === 'main') ?? null;
|
|
43404
|
+
this.fillTracks(tracks);
|
|
43405
|
+
});
|
|
43406
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_AUDIO_CHANGED, (track) => {
|
|
43407
|
+
trace(`${T$g} PLAYBACK_AUDIO_CHANGED`, { audioTrack: track });
|
|
43408
|
+
this.currentTrack = track;
|
|
43409
|
+
this.highlightCurrentTrack();
|
|
43410
|
+
this.buttonElement().removeClass('changing');
|
|
43411
|
+
this.updateText();
|
|
43412
|
+
});
|
|
43331
43413
|
}
|
|
43332
|
-
onStop() {
|
|
43333
|
-
|
|
43334
|
-
|
|
43335
|
-
|
|
43414
|
+
onStop() {
|
|
43415
|
+
trace(`${T$g} onStop`);
|
|
43416
|
+
}
|
|
43417
|
+
onActiveContainerChanged() {
|
|
43418
|
+
trace(`${T$g} onActiveContainerChanged`);
|
|
43336
43419
|
this.bindPlaybackEvents();
|
|
43337
43420
|
}
|
|
43338
43421
|
shouldRender() {
|
|
43339
|
-
if (!this.core.
|
|
43340
|
-
return false;
|
|
43341
|
-
}
|
|
43342
|
-
const currentPlayback = this.core.activePlayback;
|
|
43343
|
-
if (!currentPlayback) {
|
|
43422
|
+
if (!this.core.activePlayback) {
|
|
43344
43423
|
return false;
|
|
43345
43424
|
}
|
|
43346
|
-
|
|
43347
|
-
this.tracks = audioTracks;
|
|
43425
|
+
this.tracks = this.core.activePlayback.audioTracks;
|
|
43348
43426
|
// Only care if we have at least 2 to choose from
|
|
43349
43427
|
return this.tracks && this.tracks.length > 1;
|
|
43350
43428
|
}
|
|
@@ -43356,145 +43434,74 @@ class AudioSelector extends UICorePlugin {
|
|
|
43356
43434
|
return this;
|
|
43357
43435
|
}
|
|
43358
43436
|
const mediaControl = this.core.getPlugin('media_control');
|
|
43359
|
-
assert(mediaControl, 'media_control plugin is required');
|
|
43360
43437
|
this.$el.html(AudioSelector.template({ tracks: this.tracks, title: this.getTitle() }));
|
|
43361
|
-
|
|
43362
|
-
|
|
43363
|
-
|
|
43364
|
-
}
|
|
43365
|
-
ats.append(this.el);
|
|
43438
|
+
this.$('.audio-arrow').append(audioArrow);
|
|
43439
|
+
mediaControl.putElement('audioTracksSelector', this.$el);
|
|
43440
|
+
this.updateText();
|
|
43366
43441
|
this.highlightCurrentTrack();
|
|
43367
|
-
const aa = ats.find('audioArrow');
|
|
43368
|
-
if (aa.length > 0) {
|
|
43369
|
-
aa.append(audioArrow);
|
|
43370
|
-
}
|
|
43371
43442
|
return this;
|
|
43372
43443
|
}
|
|
43373
|
-
fillTracks(tracks
|
|
43374
|
-
if (this.selectedTrackId === undefined) {
|
|
43375
|
-
this.selectedTrackId = selected;
|
|
43376
|
-
}
|
|
43377
|
-
// this.tracks = levels.audioTracks;
|
|
43378
|
-
// for (let i = 0; i < this.tracks.length; i++) {
|
|
43379
|
-
// if (this.tracks[i].name && !this.tracks[i].label) {
|
|
43380
|
-
// this.tracks[i].label = this.tracks[i].name;
|
|
43381
|
-
// }
|
|
43382
|
-
// }
|
|
43444
|
+
fillTracks(tracks) {
|
|
43383
43445
|
this.tracks = tracks;
|
|
43384
|
-
// Player.player.trigger('tracks', this.tracks);
|
|
43385
|
-
// this.core.trigger('tracks', this.tracks);
|
|
43386
43446
|
this.render();
|
|
43387
43447
|
}
|
|
43388
43448
|
findTrackBy(id) {
|
|
43389
43449
|
return this.tracks.find((track) => track.id === id);
|
|
43390
43450
|
}
|
|
43391
43451
|
onTrackSelect(event) {
|
|
43392
|
-
// this.selectedTrackId = parseInt(event.target.dataset.levelSelectorSelect, 10)
|
|
43393
43452
|
const id = event.target?.dataset?.trackSelectorSelect;
|
|
43394
43453
|
if (id) {
|
|
43395
|
-
this.
|
|
43454
|
+
this.selectAudioTrack(id);
|
|
43396
43455
|
}
|
|
43397
43456
|
this.toggleContextMenu();
|
|
43398
43457
|
event.stopPropagation();
|
|
43399
43458
|
return false;
|
|
43400
43459
|
}
|
|
43401
|
-
|
|
43402
|
-
this.
|
|
43403
|
-
|
|
43404
|
-
|
|
43405
|
-
return;
|
|
43406
|
-
}
|
|
43407
|
-
this.core.activePlayback._hls.audioTrack = this.selectedTrackId;
|
|
43408
|
-
}
|
|
43409
|
-
else {
|
|
43410
|
-
const { audioTracks } = this.core.activePlayback.$el.get(0);
|
|
43411
|
-
for (const track of audioTracks) {
|
|
43412
|
-
track.enabled = track.id === this.selectedTrackId;
|
|
43413
|
-
}
|
|
43414
|
-
}
|
|
43415
|
-
this.updateText(this.selectedTrackId);
|
|
43460
|
+
selectAudioTrack(id) {
|
|
43461
|
+
this.startTrackSwitch();
|
|
43462
|
+
this.core.activePlayback.switchAudioTrack(id);
|
|
43463
|
+
this.updateText();
|
|
43416
43464
|
}
|
|
43417
43465
|
onShowLevelSelectMenu() {
|
|
43418
43466
|
this.toggleContextMenu();
|
|
43419
43467
|
}
|
|
43420
43468
|
hideSelectTrackMenu() {
|
|
43421
|
-
this.$('
|
|
43469
|
+
this.$('ul').hide();
|
|
43422
43470
|
}
|
|
43423
43471
|
toggleContextMenu() {
|
|
43424
|
-
this.$('
|
|
43472
|
+
this.$('ul').toggle();
|
|
43425
43473
|
}
|
|
43426
43474
|
buttonElement() {
|
|
43427
|
-
return this.$('
|
|
43475
|
+
return this.$('button');
|
|
43428
43476
|
}
|
|
43429
43477
|
buttonElementText() {
|
|
43430
|
-
return this.$('
|
|
43478
|
+
return this.$('button .audio-text');
|
|
43431
43479
|
}
|
|
43432
43480
|
trackElement(id) {
|
|
43433
|
-
return this.$('
|
|
43481
|
+
return this.$('ul a' +
|
|
43434
43482
|
(id !== undefined ? '[data-track-selector-select="' + id + '"]' : '')).parent();
|
|
43435
43483
|
}
|
|
43436
43484
|
getTitle() {
|
|
43437
|
-
|
|
43438
|
-
return '';
|
|
43439
|
-
}
|
|
43440
|
-
const selectedTrackId = this.selectedTrackId || 0;
|
|
43441
|
-
const selectedTrack = this.tracks[selectedTrackId];
|
|
43442
|
-
return selectedTrack?.label || '';
|
|
43485
|
+
return this.currentTrack?.label || '';
|
|
43443
43486
|
}
|
|
43444
43487
|
startTrackSwitch() {
|
|
43445
43488
|
this.buttonElement().addClass('changing');
|
|
43446
43489
|
}
|
|
43447
|
-
updateText(
|
|
43448
|
-
if (
|
|
43490
|
+
updateText() {
|
|
43491
|
+
if (!this.currentTrack) {
|
|
43449
43492
|
return;
|
|
43450
43493
|
}
|
|
43451
|
-
|
|
43452
|
-
if (track) {
|
|
43453
|
-
this.buttonElementText().text(track.label);
|
|
43454
|
-
}
|
|
43455
|
-
}
|
|
43456
|
-
updateCurrentTrack(e, info) {
|
|
43457
|
-
// if (!info) {
|
|
43458
|
-
// const { audioTracks } = this.core.activePlayback.$el.get(0);
|
|
43459
|
-
// for (const track of audioTracks) {
|
|
43460
|
-
// if (track.enabled) {
|
|
43461
|
-
// info = track;
|
|
43462
|
-
// }
|
|
43463
|
-
// }
|
|
43464
|
-
// }
|
|
43465
|
-
// if (!info) {
|
|
43466
|
-
// return;
|
|
43467
|
-
// }
|
|
43468
|
-
// const track = this.findTrackBy(info.id);
|
|
43469
|
-
// this.currentTrack = track ? track : null;
|
|
43470
|
-
// this.selectedTrackId = track?.id;
|
|
43471
|
-
// this.highlightCurrentTrack();
|
|
43472
|
-
// this.buttonElement().removeClass('changing');
|
|
43473
|
-
this.setCurrentTrack(info.id);
|
|
43474
|
-
}
|
|
43475
|
-
updateCurrentTrackW3C() {
|
|
43476
|
-
const { audioTracks } = this.core.activePlayback.$el.get(0);
|
|
43477
|
-
const index = audioTracks.findIndex((track) => track.enabled);
|
|
43478
|
-
if (index >= 0) {
|
|
43479
|
-
this.setCurrentTrack(index);
|
|
43480
|
-
}
|
|
43481
|
-
}
|
|
43482
|
-
setCurrentTrack(index) {
|
|
43483
|
-
const track = this.findTrackBy(index);
|
|
43484
|
-
this.currentTrack = track ?? null;
|
|
43485
|
-
this.selectedTrackId = index;
|
|
43486
|
-
this.highlightCurrentTrack();
|
|
43487
|
-
this.buttonElement().removeClass('changing');
|
|
43494
|
+
this.buttonElementText().text(this.currentTrack.label);
|
|
43488
43495
|
}
|
|
43489
43496
|
highlightCurrentTrack() {
|
|
43490
43497
|
this.trackElement().removeClass('current');
|
|
43491
43498
|
this.trackElement().find('a').removeClass('gcore-skin-active');
|
|
43492
43499
|
if (this.currentTrack) {
|
|
43493
|
-
|
|
43494
|
-
|
|
43495
|
-
|
|
43500
|
+
this.trackElement(this.currentTrack.id)
|
|
43501
|
+
.addClass('current')
|
|
43502
|
+
.find('a')
|
|
43503
|
+
.addClass('gcore-skin-active');
|
|
43496
43504
|
}
|
|
43497
|
-
this.updateText(this.selectedTrackId);
|
|
43498
43505
|
}
|
|
43499
43506
|
}
|
|
43500
43507
|
|
|
@@ -43648,7 +43655,7 @@ class BigMuteButton extends UICorePlugin {
|
|
|
43648
43655
|
}
|
|
43649
43656
|
}
|
|
43650
43657
|
|
|
43651
|
-
const pluginHtml$5 = "<
|
|
43658
|
+
const pluginHtml$5 = "<button type=\"button\" class=\"button-gear media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" data-gear-button=\"-1\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\">\n <% for (const item of items) { %>\n <li data-<%= item %>></li>\n <% } %>\n </ul>\n</div>";
|
|
43652
43659
|
|
|
43653
43660
|
const gearIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_660_1503)\">\n <path\n d=\"M19.14 12.94C19.18 12.64 19.2 12.33 19.2 12C19.2 11.68 19.18 11.36 19.13 11.06L21.16 9.47999C21.34 9.33999 21.39 9.06999 21.28 8.86999L19.36 5.54999C19.24 5.32999 18.99 5.25999 18.77 5.32999L16.38 6.28999C15.88 5.90999 15.35 5.58999 14.76 5.34999L14.4 2.80999C14.36 2.56999 14.16 2.39999 13.92 2.39999H10.08C9.83999 2.39999 9.64999 2.56999 9.60999 2.80999L9.24999 5.34999C8.65999 5.58999 8.11999 5.91999 7.62999 6.28999L5.23999 5.32999C5.01999 5.24999 4.76999 5.32999 4.64999 5.54999L2.73999 8.86999C2.61999 9.07999 2.65999 9.33999 2.85999 9.47999L4.88999 11.06C4.83999 11.36 4.79999 11.69 4.79999 12C4.79999 12.31 4.81999 12.64 4.86999 12.94L2.83999 14.52C2.65999 14.66 2.60999 14.93 2.71999 15.13L4.63999 18.45C4.75999 18.67 5.00999 18.74 5.22999 18.67L7.61999 17.71C8.11999 18.09 8.64999 18.41 9.23999 18.65L9.59999 21.19C9.64999 21.43 9.83999 21.6 10.08 21.6H13.92C14.16 21.6 14.36 21.43 14.39 21.19L14.75 18.65C15.34 18.41 15.88 18.09 16.37 17.71L18.76 18.67C18.98 18.75 19.23 18.67 19.35 18.45L21.27 15.13C21.39 14.91 21.34 14.66 21.15 14.52L19.14 12.94ZM12 15.6C10.02 15.6 8.39999 13.98 8.39999 12C8.39999 10.02 10.02 8.39999 12 8.39999C13.98 8.39999 15.6 10.02 15.6 12C15.6 13.98 13.98 15.6 12 15.6Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_660_1503\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
|
|
43654
43661
|
|
|
@@ -43911,7 +43918,7 @@ function getPageX(event) {
|
|
|
43911
43918
|
return 0;
|
|
43912
43919
|
}
|
|
43913
43920
|
|
|
43914
|
-
const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var
|
|
43921
|
+
const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderSubtitles = function(name) { %>\n <div class=\"media-control-subtitles\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderClipsText = function(name) { %>\n\n <div class=\"media-clip-container gcore-skin-text-color\" data-<%= name %>>\n <div class=\"media-clip-point gcore-skin-text-color\" data-<%= name %>>•</div>\n <div class=\"media-clip-text gcore-skin-text-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderPlaybackRate = function(name) { %>\n <div class=\"media-control-playbackrate\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"subtitles\") {\n renderSubtitles(setting)\n } else if (setting === \"playbackrate\") {\n renderPlaybackRate(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if (setting === \"clipsText\") {\n renderClipsText(setting)\n } else {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
|
|
43915
43922
|
|
|
43916
43923
|
const playIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1564)\">\n <path d=\"M6 3V20L19.3571 11.5L6 3Z\" fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1564\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
|
|
43917
43924
|
|
|
@@ -43991,7 +43998,6 @@ class MediaControl extends UICorePlugin {
|
|
|
43991
43998
|
userKeepVisible = false;
|
|
43992
43999
|
verticalVolume = false;
|
|
43993
44000
|
$audioTracksSelector = null;
|
|
43994
|
-
$bottomGear = null;
|
|
43995
44001
|
$clipText = null;
|
|
43996
44002
|
$clipTextContainer = null;
|
|
43997
44003
|
$duration = null;
|
|
@@ -44688,9 +44694,6 @@ class MediaControl extends UICorePlugin {
|
|
|
44688
44694
|
this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
|
|
44689
44695
|
this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
|
|
44690
44696
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
44691
|
-
this.$bottomGear = this.$el.find('.media-control-bottomgear');
|
|
44692
|
-
this.$pip = this.$el.find('.media-control-pip');
|
|
44693
|
-
this.$audioTracksSelector = this.$el.find('.media-control-audio-tracks[data-audiotracks]');
|
|
44694
44697
|
this.$subtitlesSelector = this.$el.find('.media-control-subtitles[data-subtitles]');
|
|
44695
44698
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
44696
44699
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
@@ -44703,6 +44706,7 @@ class MediaControl extends UICorePlugin {
|
|
|
44703
44706
|
* Get a media control element DOM node
|
|
44704
44707
|
* @param name - The name of the media control element
|
|
44705
44708
|
* @returns The DOM node to render to or extend
|
|
44709
|
+
* @deprecated Use {@link MediaControl.putElement} instead
|
|
44706
44710
|
* @remarks
|
|
44707
44711
|
* Use this method to render custom media control UI in a plugin
|
|
44708
44712
|
* @example
|
|
@@ -44720,14 +44724,13 @@ class MediaControl extends UICorePlugin {
|
|
|
44720
44724
|
getElement(name) {
|
|
44721
44725
|
switch (name) {
|
|
44722
44726
|
case 'audioTracksSelector':
|
|
44723
|
-
return
|
|
44727
|
+
return null;
|
|
44724
44728
|
case 'clipText':
|
|
44725
44729
|
return this.$clipText;
|
|
44726
|
-
case 'bottomGear':
|
|
44727
44730
|
case 'gear':
|
|
44728
|
-
return
|
|
44731
|
+
return null;
|
|
44729
44732
|
case 'pip':
|
|
44730
|
-
return
|
|
44733
|
+
return null;
|
|
44731
44734
|
case 'playbackRate':
|
|
44732
44735
|
return this.$playbackRate;
|
|
44733
44736
|
case 'seekBarContainer':
|
|
@@ -44736,6 +44739,19 @@ class MediaControl extends UICorePlugin {
|
|
|
44736
44739
|
return this.$subtitlesSelector;
|
|
44737
44740
|
}
|
|
44738
44741
|
}
|
|
44742
|
+
putElement(name, element) {
|
|
44743
|
+
switch (name) {
|
|
44744
|
+
case 'audioTracksSelector':
|
|
44745
|
+
this.getRightPanel().append(element);
|
|
44746
|
+
break;
|
|
44747
|
+
case 'pip':
|
|
44748
|
+
this.getRightPanel().append(element);
|
|
44749
|
+
break;
|
|
44750
|
+
case 'gear':
|
|
44751
|
+
this.getRightPanel().append(element);
|
|
44752
|
+
break;
|
|
44753
|
+
}
|
|
44754
|
+
}
|
|
44739
44755
|
/**
|
|
44740
44756
|
* Get the right panel area to append custom elements to
|
|
44741
44757
|
* @returns ZeptoSelector of the right panel element
|
|
@@ -45063,8 +45079,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45063
45079
|
*/
|
|
45064
45080
|
get attributes() {
|
|
45065
45081
|
return {
|
|
45066
|
-
'class':
|
|
45067
|
-
'data-track-selector': ''
|
|
45082
|
+
'class': 'media-control-gear',
|
|
45068
45083
|
};
|
|
45069
45084
|
}
|
|
45070
45085
|
/**
|
|
@@ -45079,18 +45094,15 @@ class BottomGear extends UICorePlugin {
|
|
|
45079
45094
|
* @internal
|
|
45080
45095
|
*/
|
|
45081
45096
|
bindEvents() {
|
|
45082
|
-
|
|
45083
|
-
assert(mediaControl, 'media_control plugin is required');
|
|
45097
|
+
this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
|
|
45084
45098
|
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
45085
|
-
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
45086
|
-
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
|
|
45087
45099
|
}
|
|
45088
45100
|
/**
|
|
45089
45101
|
* @param name - Name of a gear menu placeholder item to attach custom UI
|
|
45090
45102
|
* @returns Zepto result of the element
|
|
45091
45103
|
*/
|
|
45092
45104
|
getElement(name) {
|
|
45093
|
-
return this.
|
|
45105
|
+
return this.$el.find(`.gear-options-list [data-${name}]`);
|
|
45094
45106
|
}
|
|
45095
45107
|
/**
|
|
45096
45108
|
* Replaces the content of the gear menu
|
|
@@ -45117,7 +45129,6 @@ class BottomGear extends UICorePlugin {
|
|
|
45117
45129
|
*/
|
|
45118
45130
|
render() {
|
|
45119
45131
|
const mediaControl = this.core.getPlugin('media_control');
|
|
45120
|
-
assert(mediaControl, 'media_control plugin is required');
|
|
45121
45132
|
// TODO use options.mediaControl.gear.items
|
|
45122
45133
|
const items = [
|
|
45123
45134
|
'quality',
|
|
@@ -45126,7 +45137,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45126
45137
|
];
|
|
45127
45138
|
const icon = this.isHd ? gearHdIcon : gearIcon;
|
|
45128
45139
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
45129
|
-
mediaControl.
|
|
45140
|
+
mediaControl.putElement('gear', this.$el);
|
|
45130
45141
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
45131
45142
|
return this;
|
|
45132
45143
|
}
|
|
@@ -45145,6 +45156,12 @@ class BottomGear extends UICorePlugin {
|
|
|
45145
45156
|
hide() {
|
|
45146
45157
|
this.$el.find('.gear-wrapper').hide();
|
|
45147
45158
|
}
|
|
45159
|
+
onCoreReady() {
|
|
45160
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
45161
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
45162
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
45163
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
|
|
45164
|
+
}
|
|
45148
45165
|
}
|
|
45149
45166
|
|
|
45150
45167
|
var mousetrap = {exports: {}};
|
|
@@ -48772,7 +48789,7 @@ class LevelSelector extends UICorePlugin {
|
|
|
48772
48789
|
*/
|
|
48773
48790
|
get attributes() {
|
|
48774
48791
|
return {
|
|
48775
|
-
class:
|
|
48792
|
+
class: 'level-selector',
|
|
48776
48793
|
'data-level-selector': '',
|
|
48777
48794
|
};
|
|
48778
48795
|
}
|
|
@@ -49587,7 +49604,7 @@ class MultiCamera extends UICorePlugin {
|
|
|
49587
49604
|
|
|
49588
49605
|
const pipIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21.05 3.00001C21.302 3.00001 21.5435 3.10003 21.7217 3.27833C21.9 3.45646 22 3.69802 22 3.95003V10.6H20.1V4.90003H4.90001V18.2H10.6V20.1H3.95001C3.69802 20.1 3.45647 20 3.27832 19.8217C3.10002 19.6436 3 19.402 3 19.15V3.95001C3 3.69802 3.10002 3.45647 3.27832 3.27832C3.45644 3.10002 3.69801 3 3.95001 3L21.05 3.00001ZM21.05 12.5C21.302 12.5 21.5435 12.6 21.7217 12.7783C21.9 12.9565 22 13.198 22 13.45V19.15C22 19.402 21.9 19.6436 21.7217 19.8217C21.5436 20 21.302 20.1 21.05 20.1H13.45C13.198 20.1 12.9564 20 12.7783 19.8217C12.6 19.6436 12.5 19.402 12.5 19.15V13.45C12.5 13.198 12.6 12.9565 12.7783 12.7783C12.9564 12.6 13.198 12.5 13.45 12.5H21.05ZM7.47178 6.12823L9.60928 8.26572L11.5501 6.32492V11.5499H6.32509L8.26589 9.60911L6.12839 7.47161L7.47178 6.12823Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
|
|
49589
49606
|
|
|
49590
|
-
const buttonHtml$1 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n
|
|
49607
|
+
const buttonHtml$1 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n <%= pipIcon %>\n</button>\n";
|
|
49591
49608
|
|
|
49592
49609
|
const VERSION$2 = '0.0.1';
|
|
49593
49610
|
const T$7 = `plugins.pip`;
|
|
@@ -49628,6 +49645,11 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49628
49645
|
'click button': 'togglePictureInPicture',
|
|
49629
49646
|
};
|
|
49630
49647
|
}
|
|
49648
|
+
get attributes() {
|
|
49649
|
+
return {
|
|
49650
|
+
'class': 'media-control-pip',
|
|
49651
|
+
};
|
|
49652
|
+
}
|
|
49631
49653
|
get videoElement() {
|
|
49632
49654
|
return this.core.activePlayback.el;
|
|
49633
49655
|
}
|
|
@@ -49655,7 +49677,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49655
49677
|
this.$el.html(t({ pipIcon }));
|
|
49656
49678
|
const mediaControl = this.core.getPlugin('media_control');
|
|
49657
49679
|
if (mediaControl) {
|
|
49658
|
-
mediaControl.
|
|
49680
|
+
mediaControl.putElement('pip', this.el);
|
|
49659
49681
|
}
|
|
49660
49682
|
return this;
|
|
49661
49683
|
}
|
|
@@ -50606,7 +50628,6 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50606
50628
|
template = tmpl(spinnerHTML);
|
|
50607
50629
|
hasFatalError = false;
|
|
50608
50630
|
hasBuffering = false;
|
|
50609
|
-
_showOnError = false;
|
|
50610
50631
|
constructor(container) {
|
|
50611
50632
|
super(container);
|
|
50612
50633
|
this.listenTo(this.container, Events$1.CONTAINER_STATE_BUFFERING, this.onBuffering);
|
|
@@ -50617,9 +50638,6 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50617
50638
|
this.listenTo(this.container, Events$1.CONTAINER_ERROR, this.onError);
|
|
50618
50639
|
this.listenTo(this.container, Events$1.CONTAINER_READY, this.render);
|
|
50619
50640
|
}
|
|
50620
|
-
showOnError() {
|
|
50621
|
-
this._showOnError = true;
|
|
50622
|
-
}
|
|
50623
50641
|
onBuffering() {
|
|
50624
50642
|
this.hasBuffering = true;
|
|
50625
50643
|
this._show();
|
|
@@ -50636,27 +50654,17 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50636
50654
|
}
|
|
50637
50655
|
onStop() {
|
|
50638
50656
|
trace(`${T$4} onStop`, {
|
|
50639
|
-
showOnError: this._showOnError,
|
|
50640
50657
|
hasFatalError: this.hasFatalError,
|
|
50641
50658
|
});
|
|
50642
|
-
// if (!(this.hasFatalError && this._showOnError)) {
|
|
50643
|
-
// this._hide()
|
|
50644
|
-
// }
|
|
50645
50659
|
this._hide();
|
|
50646
50660
|
}
|
|
50647
50661
|
onError(e) {
|
|
50648
50662
|
this.hasFatalError = e.code === PlaybackErrorCode.MediaSourceUnavailable;
|
|
50649
50663
|
trace(`${T$4} onError`, {
|
|
50650
50664
|
e,
|
|
50651
|
-
showOnError: this._showOnError,
|
|
50652
50665
|
hasFatalError: this.hasFatalError,
|
|
50653
50666
|
error: e.code,
|
|
50654
50667
|
});
|
|
50655
|
-
// if (this._showOnError) {
|
|
50656
|
-
// this._show()
|
|
50657
|
-
// } else {
|
|
50658
|
-
// this._hide()
|
|
50659
|
-
// }
|
|
50660
50668
|
this._hide();
|
|
50661
50669
|
}
|
|
50662
50670
|
/**
|
|
@@ -50702,18 +50710,15 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50702
50710
|
* @internal
|
|
50703
50711
|
*/
|
|
50704
50712
|
render() {
|
|
50705
|
-
// TODO control via sourcecontroller instead
|
|
50706
|
-
const showOnStart = this.options.spinner?.showOnStart;
|
|
50707
50713
|
trace(`${T$4} render`, {
|
|
50708
50714
|
buffering: this.container.buffering,
|
|
50709
|
-
showOnStart,
|
|
50710
50715
|
});
|
|
50711
50716
|
this.$el.html(this.template());
|
|
50712
50717
|
this.el.firstElementChild?.addEventListener('animationiteration', () => {
|
|
50713
50718
|
this.trigger(SpinnerEvents.SYNC);
|
|
50714
50719
|
});
|
|
50715
50720
|
this.container.$el.append(this.$el[0]);
|
|
50716
|
-
if (
|
|
50721
|
+
if (this.container.buffering) {
|
|
50717
50722
|
this._show();
|
|
50718
50723
|
}
|
|
50719
50724
|
else {
|
|
@@ -50830,7 +50835,6 @@ class SourceController extends CorePlugin {
|
|
|
50830
50835
|
onCoreReady() {
|
|
50831
50836
|
trace(`${T$3} onCoreReady`);
|
|
50832
50837
|
this.core.getPlugin('error_screen')?.disable(); // TODO test
|
|
50833
|
-
// this.core.getPlugin('spinner')?.showOnError()
|
|
50834
50838
|
}
|
|
50835
50839
|
onActiveContainerChanged() {
|
|
50836
50840
|
trace(`${T$3} onActiveContainerChanged`, {
|