@gcorevideo/player 2.20.22 → 2.21.3
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 -25
- package/assets/media-control/media-control.scss +114 -34
- package/assets/media-control/width370.scss +35 -109
- package/assets/picture-in-picture/button.ejs +1 -1
- package/assets/picture-in-picture/button.scss +5 -4
- package/assets/subtitles/combobox.ejs +7 -9
- package/assets/subtitles/style.scss +8 -15
- package/dist/core.js +151 -23
- package/dist/index.css +897 -1000
- package/dist/index.js +416 -438
- package/dist/player.d.ts +19 -16
- package/dist/plugins/index.css +1454 -1557
- package/dist/plugins/index.js +826 -23550
- 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 +1 -1
- package/lib/playback/BasePlayback.d.ts.map +1 -1
- package/lib/playback/BasePlayback.js +3 -1
- package/lib/playback/HTML5Video.d.ts +4 -0
- package/lib/playback/HTML5Video.d.ts.map +1 -1
- package/lib/playback/HTML5Video.js +53 -4
- 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/playback.types.d.ts +5 -0
- package/lib/playback.types.d.ts.map +1 -1
- 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 +2 -2
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +12 -10
- package/lib/plugins/level-selector/LevelSelector.js +1 -1
- package/lib/plugins/media-control/MediaControl.d.ts +3 -4
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +23 -13
- 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/playback-rate/PlaybackRate.d.ts +1 -0
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +1 -0
- 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/plugins/subtitles/Subtitles.d.ts +21 -19
- package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -1
- package/lib/plugins/subtitles/Subtitles.js +121 -151
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +2 -0
- package/package.json +1 -1
- package/src/playback/BasePlayback.ts +4 -1
- package/src/playback/HTML5Video.ts +57 -4
- package/src/playback/dash-playback/DashPlayback.ts +64 -6
- package/src/playback/hls-playback/HlsPlayback.ts +82 -40
- package/src/playback.types.ts +6 -0
- package/src/plugins/audio-selector/AudioSelector.ts +84 -278
- package/src/plugins/bottom-gear/BottomGear.ts +14 -11
- 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 +54 -32
- package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -1
- package/src/plugins/playback-rate/PlaybackRate.ts +1 -0
- package/src/plugins/source-controller/SourceController.ts +0 -1
- package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +1 -20
- package/src/plugins/subtitles/Subtitles.ts +144 -179
- 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,9 +12626,11 @@ 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 {
|
|
12631
|
+
get isHTML5Video() {
|
|
12632
|
+
return true;
|
|
12633
|
+
}
|
|
12632
12634
|
createError(errorData, options) {
|
|
12633
12635
|
const i18n = this.i18n ||
|
|
12634
12636
|
// @ts-ignore
|
|
@@ -12672,13 +12674,13 @@ var PlaybackEvents;
|
|
|
12672
12674
|
PlaybackEvents["PLAYBACK_RATE_CHANGED"] = "playback:rate-changed";
|
|
12673
12675
|
})(PlaybackEvents || (PlaybackEvents = {}));
|
|
12674
12676
|
|
|
12675
|
-
//
|
|
12676
|
-
//
|
|
12677
|
-
// license
|
|
12678
|
-
|
|
12677
|
+
// This code is derived on works by Globo.com.
|
|
12678
|
+
// This code is distributed under the terms of the Apache License 2.0.
|
|
12679
|
+
// Original code's license can be found on
|
|
12680
|
+
// https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
|
|
12681
|
+
const AUTO$1 = -1;
|
|
12679
12682
|
const { now: now$2 } = Utils;
|
|
12680
|
-
const T$
|
|
12681
|
-
// @ts-expect-error
|
|
12683
|
+
const T$k = 'playback.dash';
|
|
12682
12684
|
class DashPlayback extends BasePlayback {
|
|
12683
12685
|
_levels = null;
|
|
12684
12686
|
_currentLevel = null;
|
|
@@ -12724,7 +12726,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12724
12726
|
}
|
|
12725
12727
|
get currentLevel() {
|
|
12726
12728
|
if (this._currentLevel === null) {
|
|
12727
|
-
return AUTO$
|
|
12729
|
+
return AUTO$1;
|
|
12728
12730
|
}
|
|
12729
12731
|
// 0 is a valid level ID
|
|
12730
12732
|
return this._currentLevel;
|
|
@@ -12838,6 +12840,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12838
12840
|
const newLevel = this.getLevel(evt.newQuality);
|
|
12839
12841
|
this.onLevelSwitch(newLevel);
|
|
12840
12842
|
});
|
|
12843
|
+
this.checkAudioTracks();
|
|
12841
12844
|
});
|
|
12842
12845
|
this._dash.on(DASHJS.MediaPlayer.events.QUALITY_CHANGE_RENDERED, (evt) => {
|
|
12843
12846
|
const currentLevel = this.getLevel(evt.newQuality);
|
|
@@ -12858,6 +12861,11 @@ class DashPlayback extends BasePlayback {
|
|
|
12858
12861
|
this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e) => {
|
|
12859
12862
|
this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate);
|
|
12860
12863
|
});
|
|
12864
|
+
this._dash.on(DASHJS.MediaPlayer.events.TRACK_CHANGE_RENDERED, (e) => {
|
|
12865
|
+
if (e.mediaType === 'audio') {
|
|
12866
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack$1(e.newMediaInfo));
|
|
12867
|
+
}
|
|
12868
|
+
});
|
|
12861
12869
|
}
|
|
12862
12870
|
render() {
|
|
12863
12871
|
this._ready();
|
|
@@ -12947,10 +12955,10 @@ class DashPlayback extends BasePlayback {
|
|
|
12947
12955
|
}
|
|
12948
12956
|
_onPlaybackError = (event) => {
|
|
12949
12957
|
// TODO
|
|
12950
|
-
trace(`${T$
|
|
12958
|
+
trace(`${T$k} _onPlaybackError`, { event });
|
|
12951
12959
|
};
|
|
12952
12960
|
_onDASHJSSError = (event) => {
|
|
12953
|
-
trace(`${T$
|
|
12961
|
+
trace(`${T$k} _onDASHJSSError`, { event });
|
|
12954
12962
|
this._stopTimeUpdateTimer();
|
|
12955
12963
|
// Note that the other error types are deprecated
|
|
12956
12964
|
const e = event.error;
|
|
@@ -12985,7 +12993,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12985
12993
|
}
|
|
12986
12994
|
};
|
|
12987
12995
|
triggerError(error) {
|
|
12988
|
-
trace(`${T$
|
|
12996
|
+
trace(`${T$k} triggerError`, { error });
|
|
12989
12997
|
// this triggers Events.ERROR to be handled by the UI
|
|
12990
12998
|
this.trigger(Events$1.PLAYBACK_ERROR, this.createError(error, {
|
|
12991
12999
|
useCodePrefix: false,
|
|
@@ -13024,7 +13032,7 @@ class DashPlayback extends BasePlayback {
|
|
|
13024
13032
|
}
|
|
13025
13033
|
get dvrEnabled() {
|
|
13026
13034
|
if (!this._dash) {
|
|
13027
|
-
trace(`${T$
|
|
13035
|
+
trace(`${T$k} dvrEnable no dash player instance`);
|
|
13028
13036
|
return false;
|
|
13029
13037
|
}
|
|
13030
13038
|
return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
|
|
@@ -13046,7 +13054,7 @@ class DashPlayback extends BasePlayback {
|
|
|
13046
13054
|
this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
|
|
13047
13055
|
}
|
|
13048
13056
|
play() {
|
|
13049
|
-
trace(`${T$
|
|
13057
|
+
trace(`${T$k} play`, { dash: !!this._dash });
|
|
13050
13058
|
if (!this._dash) {
|
|
13051
13059
|
this._setup();
|
|
13052
13060
|
}
|
|
@@ -13125,6 +13133,36 @@ class DashPlayback extends BasePlayback {
|
|
|
13125
13133
|
setPlaybackRate(rate) {
|
|
13126
13134
|
this._dash?.setPlaybackRate(rate);
|
|
13127
13135
|
}
|
|
13136
|
+
get audioTracks() {
|
|
13137
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
|
|
13138
|
+
const tracks = this._dash.getTracksFor('audio');
|
|
13139
|
+
trace(`${T$k} get audioTracks`, { tracks });
|
|
13140
|
+
return tracks.map(toClapprTrack$1);
|
|
13141
|
+
}
|
|
13142
|
+
// @ts-expect-error
|
|
13143
|
+
get currentAudioTrack() {
|
|
13144
|
+
trace(`${T$k} get currentAudioTrack`);
|
|
13145
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
|
|
13146
|
+
const t = this._dash.getCurrentTrackFor('audio');
|
|
13147
|
+
if (!t) {
|
|
13148
|
+
return null;
|
|
13149
|
+
}
|
|
13150
|
+
return toClapprTrack$1(t);
|
|
13151
|
+
}
|
|
13152
|
+
switchAudioTrack(id) {
|
|
13153
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
|
|
13154
|
+
const tracks = this._dash.getTracksFor('audio');
|
|
13155
|
+
const track = tracks.find((t) => t.id === id);
|
|
13156
|
+
assert.ok(track, 'Invalid audio track ID');
|
|
13157
|
+
this._dash.setCurrentTrack(track);
|
|
13158
|
+
}
|
|
13159
|
+
checkAudioTracks() {
|
|
13160
|
+
// @ts-ignore
|
|
13161
|
+
const tracks = this._dash.getTracksFor('audio');
|
|
13162
|
+
if (tracks.length) {
|
|
13163
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack$1));
|
|
13164
|
+
}
|
|
13165
|
+
}
|
|
13128
13166
|
}
|
|
13129
13167
|
DashPlayback.canPlay = function (resource, mimeType) {
|
|
13130
13168
|
if (!isDashSource(resource, mimeType)) {
|
|
@@ -13136,6 +13174,14 @@ DashPlayback.canPlay = function (resource, mimeType) {
|
|
|
13136
13174
|
const ctor = ms || mms || wms;
|
|
13137
13175
|
return typeof ctor === 'function';
|
|
13138
13176
|
};
|
|
13177
|
+
function toClapprTrack$1(t) {
|
|
13178
|
+
return {
|
|
13179
|
+
id: t.id,
|
|
13180
|
+
kind: t.roles && t.roles?.length > 0 ? t.roles[0] : 'main', // TODO
|
|
13181
|
+
label: t.labels.map((l) => l.text).join(' '), // TODO
|
|
13182
|
+
language: t.lang,
|
|
13183
|
+
};
|
|
13184
|
+
}
|
|
13139
13185
|
|
|
13140
13186
|
function getDefaultExportFromCjs (x) {
|
|
13141
13187
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
@@ -41792,12 +41838,11 @@ const CLAPPR_VERSION = '0.11.3';
|
|
|
41792
41838
|
// Use of this source code is governed by a BSD-style
|
|
41793
41839
|
// license that can be found on https://github.com/clappr/hlsjs-playback/blob/main/LICENSE
|
|
41794
41840
|
const { now } = Utils;
|
|
41795
|
-
const AUTO
|
|
41841
|
+
const AUTO = -1;
|
|
41796
41842
|
const DEFAULT_RECOVER_ATTEMPTS = 16;
|
|
41797
41843
|
Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
|
|
41798
41844
|
Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
|
|
41799
|
-
const T$
|
|
41800
|
-
// @ts-expect-error
|
|
41845
|
+
const T$j = 'playback.hls';
|
|
41801
41846
|
class HlsPlayback extends BasePlayback {
|
|
41802
41847
|
_ccIsSetup = false;
|
|
41803
41848
|
_ccTracksUpdated = false;
|
|
@@ -41834,7 +41879,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
41834
41879
|
return this._levels || [];
|
|
41835
41880
|
}
|
|
41836
41881
|
get currentLevel() {
|
|
41837
|
-
return this._currentLevel ?? AUTO
|
|
41882
|
+
return this._currentLevel ?? AUTO;
|
|
41838
41883
|
}
|
|
41839
41884
|
get isReady() {
|
|
41840
41885
|
return this._isReadyState;
|
|
@@ -41842,7 +41887,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
41842
41887
|
set currentLevel(id) {
|
|
41843
41888
|
this._currentLevel = id;
|
|
41844
41889
|
this.trigger(Events$1.PLAYBACK_LEVEL_SWITCH_START);
|
|
41845
|
-
assert.ok(this._hls, '
|
|
41890
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
41846
41891
|
if (this.options.playback.hlsUseNextLevel) {
|
|
41847
41892
|
this._hls.nextLevel = this._currentLevel;
|
|
41848
41893
|
}
|
|
@@ -41851,11 +41896,11 @@ class HlsPlayback extends BasePlayback {
|
|
|
41851
41896
|
}
|
|
41852
41897
|
}
|
|
41853
41898
|
get latency() {
|
|
41854
|
-
assert.ok(this._hls, '
|
|
41899
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
41855
41900
|
return this._hls.latency;
|
|
41856
41901
|
}
|
|
41857
41902
|
get currentProgramDateTime() {
|
|
41858
|
-
assert.ok(this._hls, '
|
|
41903
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
41859
41904
|
assert.ok(this._hls.playingDate, 'Hls.js playingDate is not defined');
|
|
41860
41905
|
return this._hls.playingDate;
|
|
41861
41906
|
}
|
|
@@ -42026,7 +42071,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42026
42071
|
maxBufferLength: 2,
|
|
42027
42072
|
maxMaxBufferLength: 4,
|
|
42028
42073
|
}, this.options.playback.hlsjsConfig);
|
|
42029
|
-
trace(`${T$
|
|
42074
|
+
trace(`${T$j} _createHLSInstance`, { config });
|
|
42030
42075
|
this._hls = new Hls(config);
|
|
42031
42076
|
}
|
|
42032
42077
|
_attachHLSMedia() {
|
|
@@ -42040,7 +42085,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42040
42085
|
return;
|
|
42041
42086
|
}
|
|
42042
42087
|
this._hls.once(Hls.Events.MEDIA_ATTACHED, () => {
|
|
42043
|
-
assert.ok(this._hls, '
|
|
42088
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42044
42089
|
this.options.hlsPlayback.preload && this._hls.loadSource(this.options.src);
|
|
42045
42090
|
});
|
|
42046
42091
|
const onPlaying = () => {
|
|
@@ -42065,13 +42110,15 @@ class HlsPlayback extends BasePlayback {
|
|
|
42065
42110
|
// this._hls.on(HLSJS.Events.SUBTITLE_TRACK_LOADED, (evt, data) => this._onSubtitleLoaded(evt, data));
|
|
42066
42111
|
this._hls.on(Hls.Events.SUBTITLE_TRACK_LOADED, () => this._onSubtitleLoaded());
|
|
42067
42112
|
this._hls.on(Hls.Events.SUBTITLE_TRACKS_UPDATED, () => (this._ccTracksUpdated = true));
|
|
42113
|
+
this._hls.on(Events.AUDIO_TRACKS_UPDATED, (evt, data) => this._onAudioTracksUpdated(evt, data));
|
|
42114
|
+
this._hls.on(Events.AUDIO_TRACK_SWITCHED, (evt, data) => this._onAudioTrackSwitched(evt, data));
|
|
42068
42115
|
this.bindCustomListeners();
|
|
42069
42116
|
}
|
|
42070
42117
|
bindCustomListeners() {
|
|
42071
42118
|
this.customListeners.forEach((item) => {
|
|
42072
42119
|
const requestedEventName = item.eventName;
|
|
42073
42120
|
const typeOfListener = item.once ? 'once' : 'on';
|
|
42074
|
-
assert.ok(this._hls, '
|
|
42121
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42075
42122
|
requestedEventName &&
|
|
42076
42123
|
this._hls[`${typeOfListener}`](requestedEventName, item.callback);
|
|
42077
42124
|
});
|
|
@@ -42079,7 +42126,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42079
42126
|
unbindCustomListeners() {
|
|
42080
42127
|
this.customListeners.forEach((item) => {
|
|
42081
42128
|
const requestedEventName = item.eventName;
|
|
42082
|
-
assert.ok(this._hls, '
|
|
42129
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42083
42130
|
requestedEventName && this._hls.off(requestedEventName, item.callback);
|
|
42084
42131
|
});
|
|
42085
42132
|
}
|
|
@@ -42103,7 +42150,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42103
42150
|
this.trigger(Events$1.PLAYBACK_READY, this.name);
|
|
42104
42151
|
}
|
|
42105
42152
|
_recover(evt, data, error) {
|
|
42106
|
-
assert(this._hls, '
|
|
42153
|
+
assert(this._hls, 'HLS.js is not initialized');
|
|
42107
42154
|
if (!this._recoveredDecodingError) {
|
|
42108
42155
|
this._recoveredDecodingError = true;
|
|
42109
42156
|
this._hls.recoverMediaError();
|
|
@@ -42115,7 +42162,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42115
42162
|
}
|
|
42116
42163
|
else {
|
|
42117
42164
|
Log.error('hlsjs: failed to recover', { evt, data });
|
|
42118
|
-
trace(`${T$
|
|
42165
|
+
trace(`${T$j} _recover failed to recover`, {
|
|
42119
42166
|
type: data.type,
|
|
42120
42167
|
details: data.details,
|
|
42121
42168
|
});
|
|
@@ -42201,7 +42248,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42201
42248
|
this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
|
|
42202
42249
|
}
|
|
42203
42250
|
_onHLSJSError(evt, data) {
|
|
42204
|
-
trace(`${T$
|
|
42251
|
+
trace(`${T$j} _onHLSJSError`, {
|
|
42205
42252
|
fatal: data.fatal,
|
|
42206
42253
|
type: data.type,
|
|
42207
42254
|
details: data.details,
|
|
@@ -42249,7 +42296,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42249
42296
|
evt,
|
|
42250
42297
|
data,
|
|
42251
42298
|
});
|
|
42252
|
-
trace(`${T$
|
|
42299
|
+
trace(`${T$j} _onHLSJSError trying to recover from network error`, {
|
|
42253
42300
|
details: data.details,
|
|
42254
42301
|
});
|
|
42255
42302
|
error.level = PlayerError.Levels.WARN;
|
|
@@ -42262,14 +42309,10 @@ class HlsPlayback extends BasePlayback {
|
|
|
42262
42309
|
evt,
|
|
42263
42310
|
data,
|
|
42264
42311
|
});
|
|
42265
|
-
trace(`${T$
|
|
42312
|
+
trace(`${T$j} _onHLSJSError trying to recover from media error`, {
|
|
42266
42313
|
details: data.details,
|
|
42267
42314
|
});
|
|
42268
42315
|
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
42316
|
this._recover(evt, data, error);
|
|
42274
42317
|
break;
|
|
42275
42318
|
default:
|
|
@@ -42296,7 +42339,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42296
42339
|
return;
|
|
42297
42340
|
}
|
|
42298
42341
|
Log.warn('hlsjs: non-fatal error occurred', { evt, data });
|
|
42299
|
-
trace(`${T$
|
|
42342
|
+
trace(`${T$j} _onHLSJSError non-fatal error occurred`, {
|
|
42300
42343
|
type: data.type,
|
|
42301
42344
|
details: data.details,
|
|
42302
42345
|
});
|
|
@@ -42411,7 +42454,7 @@ class HlsPlayback extends BasePlayback {
|
|
|
42411
42454
|
}
|
|
42412
42455
|
}
|
|
42413
42456
|
_fillLevels() {
|
|
42414
|
-
assert.ok(this._hls, '
|
|
42457
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42415
42458
|
this._levels = this._hls.levels.map((level, index) => {
|
|
42416
42459
|
return {
|
|
42417
42460
|
level: index, // or level.id?
|
|
@@ -42612,6 +42655,34 @@ class HlsPlayback extends BasePlayback {
|
|
|
42612
42655
|
}));
|
|
42613
42656
|
this.stop();
|
|
42614
42657
|
}
|
|
42658
|
+
get audioTracks() {
|
|
42659
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42660
|
+
return this._hls.audioTracks.map(toClapprTrack);
|
|
42661
|
+
}
|
|
42662
|
+
// @ts-expect-error
|
|
42663
|
+
get currentAudioTrack() {
|
|
42664
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42665
|
+
const idx = this._hls.audioTrack;
|
|
42666
|
+
const track = this._hls.audioTracks[idx]; // TODO or find by .id == idx?
|
|
42667
|
+
if (track) {
|
|
42668
|
+
return toClapprTrack(track);
|
|
42669
|
+
}
|
|
42670
|
+
return null;
|
|
42671
|
+
}
|
|
42672
|
+
switchAudioTrack(id) {
|
|
42673
|
+
assert.ok(this._hls, 'HLS.js is not initialized');
|
|
42674
|
+
this._hls.audioTrack = Number(id); // TODO or find index by .id == id?
|
|
42675
|
+
}
|
|
42676
|
+
_onAudioTracksUpdated(_, data) {
|
|
42677
|
+
trace(`${T$j} onAudioTracksUpdated`);
|
|
42678
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, data.audioTracks.map(toClapprTrack));
|
|
42679
|
+
}
|
|
42680
|
+
_onAudioTrackSwitched(_, data) {
|
|
42681
|
+
trace(`${T$j} onAudioTrackSwitched`);
|
|
42682
|
+
// @ts-ignore
|
|
42683
|
+
const track = this._hls.audioTracks[data.id];
|
|
42684
|
+
this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack(track));
|
|
42685
|
+
}
|
|
42615
42686
|
}
|
|
42616
42687
|
HlsPlayback.canPlay = function (resource, mimeType) {
|
|
42617
42688
|
if (!isHlsSource(resource, mimeType)) {
|
|
@@ -42619,8 +42690,16 @@ HlsPlayback.canPlay = function (resource, mimeType) {
|
|
|
42619
42690
|
}
|
|
42620
42691
|
return Hls.isSupported();
|
|
42621
42692
|
};
|
|
42693
|
+
function toClapprTrack(t) {
|
|
42694
|
+
return {
|
|
42695
|
+
id: String(t.id),
|
|
42696
|
+
language: t.lang ?? '',
|
|
42697
|
+
kind: t.type === 'main' ? 'main' : 'description', // TODO check
|
|
42698
|
+
label: t.name,
|
|
42699
|
+
};
|
|
42700
|
+
}
|
|
42622
42701
|
|
|
42623
|
-
const T$
|
|
42702
|
+
const T$i = 'playback.html5_video';
|
|
42624
42703
|
const STALL_TIMEOUT = 15000;
|
|
42625
42704
|
class HTML5Video extends BasePlayback {
|
|
42626
42705
|
stallTimerId = null;
|
|
@@ -42628,7 +42707,7 @@ class HTML5Video extends BasePlayback {
|
|
|
42628
42707
|
* @internal
|
|
42629
42708
|
*/
|
|
42630
42709
|
createError(errorData, options) {
|
|
42631
|
-
trace(`${T$
|
|
42710
|
+
trace(`${T$i} createError`, {
|
|
42632
42711
|
errorData: { ...errorData },
|
|
42633
42712
|
});
|
|
42634
42713
|
const i18n = this.i18n ||
|
|
@@ -42639,20 +42718,16 @@ class HTML5Video extends BasePlayback {
|
|
|
42639
42718
|
if (i18n &&
|
|
42640
42719
|
!errorData.UI &&
|
|
42641
42720
|
errorData.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {
|
|
42642
|
-
// errorData.UI = {
|
|
42643
|
-
// title: i18n.t('no_broadcast'),
|
|
42644
|
-
// message: errorData.message,
|
|
42645
|
-
// }
|
|
42646
42721
|
errorData.code = PlaybackErrorCode.MediaSourceUnavailable;
|
|
42647
42722
|
}
|
|
42648
42723
|
return super.createError(errorData, { ...options, useCodePrefix: false });
|
|
42649
42724
|
}
|
|
42650
42725
|
_onWaiting() {
|
|
42651
|
-
trace(`${T$
|
|
42726
|
+
trace(`${T$i} _onWaiting`);
|
|
42652
42727
|
super._onWaiting();
|
|
42653
42728
|
}
|
|
42654
42729
|
_onEnded() {
|
|
42655
|
-
trace(`${T$
|
|
42730
|
+
trace(`${T$i} _onEnded`);
|
|
42656
42731
|
if (this.stallTimerId) {
|
|
42657
42732
|
clearTimeout(this.stallTimerId);
|
|
42658
42733
|
this.stallTimerId = null;
|
|
@@ -42660,12 +42735,12 @@ class HTML5Video extends BasePlayback {
|
|
|
42660
42735
|
super._onEnded();
|
|
42661
42736
|
}
|
|
42662
42737
|
_handleBufferingEvents() {
|
|
42663
|
-
trace(`${T$
|
|
42738
|
+
trace(`${T$i} _handleBufferingEvents`, {
|
|
42664
42739
|
networkState: this.el.networkState,
|
|
42665
42740
|
});
|
|
42666
42741
|
if (!this.stallTimerId) {
|
|
42667
42742
|
this.stallTimerId = setTimeout(() => {
|
|
42668
|
-
trace(`${T$
|
|
42743
|
+
trace(`${T$i} _handleBufferingEvents stall timeout`, {
|
|
42669
42744
|
buffering: this.buffering,
|
|
42670
42745
|
ended: this.ended,
|
|
42671
42746
|
});
|
|
@@ -42683,7 +42758,7 @@ class HTML5Video extends BasePlayback {
|
|
|
42683
42758
|
super._handleBufferingEvents();
|
|
42684
42759
|
}
|
|
42685
42760
|
_onPlaying() {
|
|
42686
|
-
trace(`${T$
|
|
42761
|
+
trace(`${T$i} _onPlaying`);
|
|
42687
42762
|
if (this.stallTimerId) {
|
|
42688
42763
|
clearTimeout(this.stallTimerId);
|
|
42689
42764
|
this.stallTimerId = null;
|
|
@@ -42691,13 +42766,66 @@ class HTML5Video extends BasePlayback {
|
|
|
42691
42766
|
super._onPlaying();
|
|
42692
42767
|
}
|
|
42693
42768
|
_onPause() {
|
|
42694
|
-
trace(`${T$
|
|
42769
|
+
trace(`${T$i} _onPause`);
|
|
42695
42770
|
super._onPause();
|
|
42696
42771
|
if (this.stallTimerId) {
|
|
42697
42772
|
clearTimeout(this.stallTimerId);
|
|
42698
42773
|
this.stallTimerId = null;
|
|
42699
42774
|
}
|
|
42700
42775
|
}
|
|
42776
|
+
get audioTracks() {
|
|
42777
|
+
const tracks = this.el.audioTracks;
|
|
42778
|
+
const supported = !!tracks;
|
|
42779
|
+
trace(`${T$i} get audioTracks`, { supported });
|
|
42780
|
+
const retval = [];
|
|
42781
|
+
if (supported) {
|
|
42782
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
42783
|
+
const track = tracks[i];
|
|
42784
|
+
retval.push({
|
|
42785
|
+
id: track.id,
|
|
42786
|
+
label: track.label,
|
|
42787
|
+
language: track.language,
|
|
42788
|
+
kind: track.kind, // TODO check
|
|
42789
|
+
});
|
|
42790
|
+
}
|
|
42791
|
+
}
|
|
42792
|
+
return retval;
|
|
42793
|
+
}
|
|
42794
|
+
// @ts-expect-error
|
|
42795
|
+
get currentAudioTrack() {
|
|
42796
|
+
const tracks = this.el.audioTracks;
|
|
42797
|
+
const supported = !!tracks;
|
|
42798
|
+
trace(`${T$i} get currentAudioTrack`, {
|
|
42799
|
+
supported,
|
|
42800
|
+
});
|
|
42801
|
+
if (supported) {
|
|
42802
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
42803
|
+
const track = tracks[i];
|
|
42804
|
+
if (track.enabled) {
|
|
42805
|
+
return {
|
|
42806
|
+
id: track.id,
|
|
42807
|
+
label: track.label,
|
|
42808
|
+
language: track.language,
|
|
42809
|
+
kind: track.kind,
|
|
42810
|
+
};
|
|
42811
|
+
}
|
|
42812
|
+
}
|
|
42813
|
+
}
|
|
42814
|
+
return null;
|
|
42815
|
+
}
|
|
42816
|
+
switchAudioTrack(id) {
|
|
42817
|
+
const tracks = this.el.audioTracks;
|
|
42818
|
+
const supported = !!tracks;
|
|
42819
|
+
trace(`${T$i} switchAudioTrack`, {
|
|
42820
|
+
supported,
|
|
42821
|
+
});
|
|
42822
|
+
if (supported) {
|
|
42823
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
42824
|
+
const track = tracks[i];
|
|
42825
|
+
track.enabled = track.id === id;
|
|
42826
|
+
}
|
|
42827
|
+
}
|
|
42828
|
+
}
|
|
42701
42829
|
}
|
|
42702
42830
|
|
|
42703
42831
|
// TODO consider allowing the variation of the order of playback modules
|
|
@@ -42707,7 +42835,7 @@ function registerPlaybacks() {
|
|
|
42707
42835
|
Loader.registerPlayback(DashPlayback);
|
|
42708
42836
|
}
|
|
42709
42837
|
|
|
42710
|
-
const T$
|
|
42838
|
+
const T$h = 'GPlayer';
|
|
42711
42839
|
const DEFAULT_OPTIONS = {
|
|
42712
42840
|
autoPlay: false,
|
|
42713
42841
|
debug: 'none',
|
|
@@ -42802,7 +42930,7 @@ class Player {
|
|
|
42802
42930
|
}
|
|
42803
42931
|
const coreOpts = this.buildCoreOptions(playerElement);
|
|
42804
42932
|
const { core, container } = Player.getRegisteredPlugins();
|
|
42805
|
-
trace(`${T$
|
|
42933
|
+
trace(`${T$h} init`, {
|
|
42806
42934
|
registeredPlaybacks: Loader.registeredPlaybacks.map((p) => p.prototype.name),
|
|
42807
42935
|
});
|
|
42808
42936
|
coreOpts.plugins = {
|
|
@@ -42816,7 +42944,7 @@ class Player {
|
|
|
42816
42944
|
* Destroys the player, releasing all resources and unmounting its UI from the DOM.
|
|
42817
42945
|
*/
|
|
42818
42946
|
destroy() {
|
|
42819
|
-
trace(`${T$
|
|
42947
|
+
trace(`${T$h} destroy`, {
|
|
42820
42948
|
player: !!this.player,
|
|
42821
42949
|
});
|
|
42822
42950
|
if (this.player) {
|
|
@@ -43003,7 +43131,7 @@ class Player {
|
|
|
43003
43131
|
this.config = $.extend(true, this.config, config);
|
|
43004
43132
|
}
|
|
43005
43133
|
initPlayer(coreOptions) {
|
|
43006
|
-
trace(`${T$
|
|
43134
|
+
trace(`${T$h} initPlayer`, {
|
|
43007
43135
|
autoPlay: coreOptions.autoPlay,
|
|
43008
43136
|
sources: coreOptions.sources,
|
|
43009
43137
|
// TODO selected options
|
|
@@ -43028,7 +43156,7 @@ class Player {
|
|
|
43028
43156
|
}
|
|
43029
43157
|
}
|
|
43030
43158
|
triggerAutoPlay() {
|
|
43031
|
-
trace(`${T$
|
|
43159
|
+
trace(`${T$h} triggerAutoPlay`);
|
|
43032
43160
|
setTimeout(() => {
|
|
43033
43161
|
this.player?.play({
|
|
43034
43162
|
autoPlay: true,
|
|
@@ -43046,7 +43174,7 @@ class Player {
|
|
|
43046
43174
|
// TODO test
|
|
43047
43175
|
events = {
|
|
43048
43176
|
onReady: () => {
|
|
43049
|
-
trace(`${T$
|
|
43177
|
+
trace(`${T$h} onReady`, {
|
|
43050
43178
|
ready: this.ready,
|
|
43051
43179
|
});
|
|
43052
43180
|
if (this.ready) {
|
|
@@ -43080,7 +43208,7 @@ class Player {
|
|
|
43080
43208
|
buildCoreOptions(rootNode) {
|
|
43081
43209
|
const sources = this.buildMediaSourcesList();
|
|
43082
43210
|
const source = sources[0];
|
|
43083
|
-
trace(`${T$
|
|
43211
|
+
trace(`${T$h} buildCoreOptions`, {
|
|
43084
43212
|
source,
|
|
43085
43213
|
sources,
|
|
43086
43214
|
});
|
|
@@ -43141,7 +43269,7 @@ class Player {
|
|
|
43141
43269
|
assert.ok(this.player, 'Player is not initialized');
|
|
43142
43270
|
const core = this.player.core;
|
|
43143
43271
|
core.on(Events$1.CORE_SCREEN_ORIENTATION_CHANGED, ({ orientation }) => {
|
|
43144
|
-
trace(`${T$
|
|
43272
|
+
trace(`${T$h} on CORE_SCREEN_ORIENTATION_CHANGED`, {
|
|
43145
43273
|
orientation,
|
|
43146
43274
|
rootNode: {
|
|
43147
43275
|
width: this.rootNode?.clientWidth,
|
|
@@ -43156,14 +43284,14 @@ class Player {
|
|
|
43156
43284
|
}
|
|
43157
43285
|
}, null);
|
|
43158
43286
|
core.on(Events$1.CORE_RESIZE, ({ width, height }) => {
|
|
43159
|
-
trace(`${T$
|
|
43287
|
+
trace(`${T$h} on CORE_RESIZE`, {
|
|
43160
43288
|
width,
|
|
43161
43289
|
height,
|
|
43162
43290
|
});
|
|
43163
43291
|
this.safeTriggerEvent(PlayerEvent.Resize, { width, height });
|
|
43164
43292
|
}, null);
|
|
43165
43293
|
core.on(Events$1.CORE_FULLSCREEN, (isFullscreen) => {
|
|
43166
|
-
trace(`${T$
|
|
43294
|
+
trace(`${T$h} CORE_FULLSCREEN`, {
|
|
43167
43295
|
isFullscreen,
|
|
43168
43296
|
});
|
|
43169
43297
|
this.safeTriggerEvent(PlayerEvent.Fullscreen, isFullscreen);
|
|
@@ -43171,7 +43299,7 @@ class Player {
|
|
|
43171
43299
|
}
|
|
43172
43300
|
}
|
|
43173
43301
|
|
|
43174
|
-
var version$1 = "2.
|
|
43302
|
+
var version$1 = "2.21.3";
|
|
43175
43303
|
|
|
43176
43304
|
var packages = {
|
|
43177
43305
|
"node_modules/@clappr/core": {
|
|
@@ -43195,20 +43323,23 @@ function version() {
|
|
|
43195
43323
|
};
|
|
43196
43324
|
}
|
|
43197
43325
|
|
|
43198
|
-
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 (
|
|
43326
|
+
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";
|
|
43199
43327
|
|
|
43200
43328
|
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";
|
|
43201
43329
|
|
|
43202
43330
|
const VERSION$6 = '0.0.1';
|
|
43203
|
-
|
|
43204
|
-
const AUTO = 0;
|
|
43331
|
+
const T$g = 'plugins.audio_selector';
|
|
43205
43332
|
/**
|
|
43206
|
-
* `PLUGIN` that
|
|
43333
|
+
* `PLUGIN` that makes possible to switch audio tracks via the media control UI.
|
|
43207
43334
|
* @beta
|
|
43335
|
+
* @remarks
|
|
43336
|
+
* The plugin is activated when there are multiple audio tracks available.
|
|
43337
|
+
* The plugin adds a button showing the current audio track and a dropdown to switch to another audio track.
|
|
43338
|
+
* Depends on:
|
|
43339
|
+
*
|
|
43340
|
+
* - {@link MediaControl}
|
|
43208
43341
|
*/
|
|
43209
43342
|
class AudioSelector extends UICorePlugin {
|
|
43210
|
-
// TODO
|
|
43211
|
-
selectedTrackId;
|
|
43212
43343
|
currentTrack = null;
|
|
43213
43344
|
tracks = [];
|
|
43214
43345
|
/**
|
|
@@ -43235,7 +43366,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43235
43366
|
*/
|
|
43236
43367
|
get attributes() {
|
|
43237
43368
|
return {
|
|
43238
|
-
class:
|
|
43369
|
+
class: 'media-control-audio-tracks',
|
|
43239
43370
|
'data-track-selector': '',
|
|
43240
43371
|
};
|
|
43241
43372
|
}
|
|
@@ -43252,101 +43383,49 @@ class AudioSelector extends UICorePlugin {
|
|
|
43252
43383
|
* @internal
|
|
43253
43384
|
*/
|
|
43254
43385
|
bindEvents() {
|
|
43255
|
-
this.listenTo(this.core, Events$1.CORE_READY, this.
|
|
43256
|
-
|
|
43257
|
-
this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED, this.reload);
|
|
43258
|
-
this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
43259
|
-
this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectTrackMenu);
|
|
43386
|
+
this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
|
|
43387
|
+
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
43260
43388
|
}
|
|
43261
|
-
|
|
43262
|
-
|
|
43263
|
-
this.
|
|
43264
|
-
|
|
43265
|
-
this.
|
|
43266
|
-
|
|
43267
|
-
this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED);
|
|
43268
|
-
// @ts-ignore
|
|
43269
|
-
this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE);
|
|
43389
|
+
onCoreReady() {
|
|
43390
|
+
trace(`${T$g} onCoreReady`);
|
|
43391
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
43392
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
43393
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
43394
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectTrackMenu);
|
|
43270
43395
|
}
|
|
43271
43396
|
bindPlaybackEvents() {
|
|
43272
|
-
|
|
43273
|
-
|
|
43274
|
-
this.
|
|
43275
|
-
const currentPlayback = this.core.activePlayback;
|
|
43276
|
-
this.listenTo(currentPlayback, Events$1.PLAYBACK_STOP, this.onStop);
|
|
43397
|
+
trace(`${T$g} bindPlaybackEvents`);
|
|
43398
|
+
this.currentTrack = null;
|
|
43399
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_STOP, this.onStop);
|
|
43277
43400
|
this.setupAudioTrackListeners();
|
|
43278
43401
|
}
|
|
43279
43402
|
setupAudioTrackListeners() {
|
|
43280
|
-
|
|
43281
|
-
|
|
43282
|
-
|
|
43283
|
-
|
|
43284
|
-
|
|
43285
|
-
|
|
43286
|
-
|
|
43287
|
-
|
|
43288
|
-
|
|
43289
|
-
|
|
43290
|
-
|
|
43291
|
-
|
|
43292
|
-
|
|
43293
|
-
const defaultTrack = data.audioTracks.find((track) => track.default);
|
|
43294
|
-
if (defaultTrack) {
|
|
43295
|
-
this.currentTrack = {
|
|
43296
|
-
id: defaultTrack.id,
|
|
43297
|
-
label: defaultTrack.name,
|
|
43298
|
-
};
|
|
43299
|
-
}
|
|
43300
|
-
this.fillTracks(data.audioTracks.map((p) => ({
|
|
43301
|
-
id: p.id,
|
|
43302
|
-
label: p.name,
|
|
43303
|
-
})), defaultTrack?.id);
|
|
43304
|
-
});
|
|
43305
|
-
currentPlayback._hls.on(Events.AUDIO_TRACK_SWITCHING, this.startTrackSwitch.bind(this));
|
|
43306
|
-
currentPlayback._hls.on(Events.AUDIO_TRACK_SWITCHED, this.updateCurrentTrack.bind(this));
|
|
43307
|
-
currentPlayback._hls.on(Events.AUDIO_TRACK_LOADED, this.updateCurrentTrack.bind(this));
|
|
43308
|
-
}
|
|
43309
|
-
else {
|
|
43310
|
-
this.listenToOnce(currentPlayback, Events$1.PLAYBACK_PLAY, () => {
|
|
43311
|
-
const mediaElement = currentPlayback.$el.get(0);
|
|
43312
|
-
// const { audioTracks } = currentPlayback.$el.get(0);
|
|
43313
|
-
const audioTracks = mediaElement.audioTracks;
|
|
43314
|
-
if (audioTracks && audioTracks.length) {
|
|
43315
|
-
let index = 0;
|
|
43316
|
-
const trackItems = [];
|
|
43317
|
-
for (const audioTrack of audioTracks) {
|
|
43318
|
-
if (audioTrack.enabled) {
|
|
43319
|
-
const t = {
|
|
43320
|
-
id: index,
|
|
43321
|
-
label: audioTrack.label,
|
|
43322
|
-
};
|
|
43323
|
-
this.currentTrack = t;
|
|
43324
|
-
trackItems.push(t);
|
|
43325
|
-
index++;
|
|
43326
|
-
}
|
|
43327
|
-
}
|
|
43328
|
-
audioTracks.addEventListener('change', () => this.updateCurrentTrackW3C());
|
|
43329
|
-
this.fillTracks(trackItems, trackItems[0].id);
|
|
43330
|
-
}
|
|
43331
|
-
});
|
|
43332
|
-
}
|
|
43403
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_AUDIO_AVAILABLE, (tracks) => {
|
|
43404
|
+
trace(`${T$g} on PLAYBACK_AUDIO_AVAILABLE`, { audioTracks: tracks });
|
|
43405
|
+
this.currentTrack =
|
|
43406
|
+
tracks.find((track) => track.kind === 'main') ?? null;
|
|
43407
|
+
this.fillTracks(tracks);
|
|
43408
|
+
});
|
|
43409
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_AUDIO_CHANGED, (track) => {
|
|
43410
|
+
trace(`${T$g} PLAYBACK_AUDIO_CHANGED`, { audioTrack: track });
|
|
43411
|
+
this.currentTrack = track;
|
|
43412
|
+
this.highlightCurrentTrack();
|
|
43413
|
+
this.buttonElement().removeClass('changing');
|
|
43414
|
+
this.updateText();
|
|
43415
|
+
});
|
|
43333
43416
|
}
|
|
43334
|
-
onStop() {
|
|
43335
|
-
|
|
43336
|
-
|
|
43337
|
-
|
|
43417
|
+
onStop() {
|
|
43418
|
+
trace(`${T$g} onStop`);
|
|
43419
|
+
}
|
|
43420
|
+
onActiveContainerChanged() {
|
|
43421
|
+
trace(`${T$g} onActiveContainerChanged`);
|
|
43338
43422
|
this.bindPlaybackEvents();
|
|
43339
43423
|
}
|
|
43340
43424
|
shouldRender() {
|
|
43341
|
-
if (!this.core.
|
|
43342
|
-
return false;
|
|
43343
|
-
}
|
|
43344
|
-
const currentPlayback = this.core.activePlayback;
|
|
43345
|
-
if (!currentPlayback) {
|
|
43425
|
+
if (!this.core.activePlayback) {
|
|
43346
43426
|
return false;
|
|
43347
43427
|
}
|
|
43348
|
-
|
|
43349
|
-
this.tracks = audioTracks;
|
|
43428
|
+
this.tracks = this.core.activePlayback.audioTracks;
|
|
43350
43429
|
// Only care if we have at least 2 to choose from
|
|
43351
43430
|
return this.tracks && this.tracks.length > 1;
|
|
43352
43431
|
}
|
|
@@ -43358,145 +43437,74 @@ class AudioSelector extends UICorePlugin {
|
|
|
43358
43437
|
return this;
|
|
43359
43438
|
}
|
|
43360
43439
|
const mediaControl = this.core.getPlugin('media_control');
|
|
43361
|
-
assert(mediaControl, 'media_control plugin is required');
|
|
43362
43440
|
this.$el.html(AudioSelector.template({ tracks: this.tracks, title: this.getTitle() }));
|
|
43363
|
-
|
|
43364
|
-
|
|
43365
|
-
|
|
43366
|
-
}
|
|
43367
|
-
ats.append(this.el);
|
|
43441
|
+
this.$('.audio-arrow').append(audioArrow);
|
|
43442
|
+
mediaControl.putElement('audioTracksSelector', this.$el);
|
|
43443
|
+
this.updateText();
|
|
43368
43444
|
this.highlightCurrentTrack();
|
|
43369
|
-
const aa = ats.find('audioArrow');
|
|
43370
|
-
if (aa.length > 0) {
|
|
43371
|
-
aa.append(audioArrow);
|
|
43372
|
-
}
|
|
43373
43445
|
return this;
|
|
43374
43446
|
}
|
|
43375
|
-
fillTracks(tracks
|
|
43376
|
-
if (this.selectedTrackId === undefined) {
|
|
43377
|
-
this.selectedTrackId = selected;
|
|
43378
|
-
}
|
|
43379
|
-
// this.tracks = levels.audioTracks;
|
|
43380
|
-
// for (let i = 0; i < this.tracks.length; i++) {
|
|
43381
|
-
// if (this.tracks[i].name && !this.tracks[i].label) {
|
|
43382
|
-
// this.tracks[i].label = this.tracks[i].name;
|
|
43383
|
-
// }
|
|
43384
|
-
// }
|
|
43447
|
+
fillTracks(tracks) {
|
|
43385
43448
|
this.tracks = tracks;
|
|
43386
|
-
// Player.player.trigger('tracks', this.tracks);
|
|
43387
|
-
// this.core.trigger('tracks', this.tracks);
|
|
43388
43449
|
this.render();
|
|
43389
43450
|
}
|
|
43390
43451
|
findTrackBy(id) {
|
|
43391
43452
|
return this.tracks.find((track) => track.id === id);
|
|
43392
43453
|
}
|
|
43393
43454
|
onTrackSelect(event) {
|
|
43394
|
-
// this.selectedTrackId = parseInt(event.target.dataset.levelSelectorSelect, 10)
|
|
43395
43455
|
const id = event.target?.dataset?.trackSelectorSelect;
|
|
43396
43456
|
if (id) {
|
|
43397
|
-
this.
|
|
43457
|
+
this.selectAudioTrack(id);
|
|
43398
43458
|
}
|
|
43399
43459
|
this.toggleContextMenu();
|
|
43400
43460
|
event.stopPropagation();
|
|
43401
43461
|
return false;
|
|
43402
43462
|
}
|
|
43403
|
-
|
|
43404
|
-
this.
|
|
43405
|
-
|
|
43406
|
-
|
|
43407
|
-
return;
|
|
43408
|
-
}
|
|
43409
|
-
this.core.activePlayback._hls.audioTrack = this.selectedTrackId;
|
|
43410
|
-
}
|
|
43411
|
-
else {
|
|
43412
|
-
const { audioTracks } = this.core.activePlayback.$el.get(0);
|
|
43413
|
-
for (const track of audioTracks) {
|
|
43414
|
-
track.enabled = track.id === this.selectedTrackId;
|
|
43415
|
-
}
|
|
43416
|
-
}
|
|
43417
|
-
this.updateText(this.selectedTrackId);
|
|
43463
|
+
selectAudioTrack(id) {
|
|
43464
|
+
this.startTrackSwitch();
|
|
43465
|
+
this.core.activePlayback.switchAudioTrack(id);
|
|
43466
|
+
this.updateText();
|
|
43418
43467
|
}
|
|
43419
43468
|
onShowLevelSelectMenu() {
|
|
43420
43469
|
this.toggleContextMenu();
|
|
43421
43470
|
}
|
|
43422
43471
|
hideSelectTrackMenu() {
|
|
43423
|
-
this.$('
|
|
43472
|
+
this.$('ul').hide();
|
|
43424
43473
|
}
|
|
43425
43474
|
toggleContextMenu() {
|
|
43426
|
-
this.$('
|
|
43475
|
+
this.$('ul').toggle();
|
|
43427
43476
|
}
|
|
43428
43477
|
buttonElement() {
|
|
43429
|
-
return this.$('
|
|
43478
|
+
return this.$('button');
|
|
43430
43479
|
}
|
|
43431
43480
|
buttonElementText() {
|
|
43432
|
-
return this.$('
|
|
43481
|
+
return this.$('button .audio-text');
|
|
43433
43482
|
}
|
|
43434
43483
|
trackElement(id) {
|
|
43435
|
-
return this.$('
|
|
43484
|
+
return this.$('ul a' +
|
|
43436
43485
|
(id !== undefined ? '[data-track-selector-select="' + id + '"]' : '')).parent();
|
|
43437
43486
|
}
|
|
43438
43487
|
getTitle() {
|
|
43439
|
-
|
|
43440
|
-
return '';
|
|
43441
|
-
}
|
|
43442
|
-
const selectedTrackId = this.selectedTrackId || 0;
|
|
43443
|
-
const selectedTrack = this.tracks[selectedTrackId];
|
|
43444
|
-
return selectedTrack?.label || '';
|
|
43488
|
+
return this.currentTrack?.label || '';
|
|
43445
43489
|
}
|
|
43446
43490
|
startTrackSwitch() {
|
|
43447
43491
|
this.buttonElement().addClass('changing');
|
|
43448
43492
|
}
|
|
43449
|
-
updateText(
|
|
43450
|
-
if (
|
|
43493
|
+
updateText() {
|
|
43494
|
+
if (!this.currentTrack) {
|
|
43451
43495
|
return;
|
|
43452
43496
|
}
|
|
43453
|
-
|
|
43454
|
-
if (track) {
|
|
43455
|
-
this.buttonElementText().text(track.label);
|
|
43456
|
-
}
|
|
43457
|
-
}
|
|
43458
|
-
updateCurrentTrack(e, info) {
|
|
43459
|
-
// if (!info) {
|
|
43460
|
-
// const { audioTracks } = this.core.activePlayback.$el.get(0);
|
|
43461
|
-
// for (const track of audioTracks) {
|
|
43462
|
-
// if (track.enabled) {
|
|
43463
|
-
// info = track;
|
|
43464
|
-
// }
|
|
43465
|
-
// }
|
|
43466
|
-
// }
|
|
43467
|
-
// if (!info) {
|
|
43468
|
-
// return;
|
|
43469
|
-
// }
|
|
43470
|
-
// const track = this.findTrackBy(info.id);
|
|
43471
|
-
// this.currentTrack = track ? track : null;
|
|
43472
|
-
// this.selectedTrackId = track?.id;
|
|
43473
|
-
// this.highlightCurrentTrack();
|
|
43474
|
-
// this.buttonElement().removeClass('changing');
|
|
43475
|
-
this.setCurrentTrack(info.id);
|
|
43476
|
-
}
|
|
43477
|
-
updateCurrentTrackW3C() {
|
|
43478
|
-
const { audioTracks } = this.core.activePlayback.$el.get(0);
|
|
43479
|
-
const index = audioTracks.findIndex((track) => track.enabled);
|
|
43480
|
-
if (index >= 0) {
|
|
43481
|
-
this.setCurrentTrack(index);
|
|
43482
|
-
}
|
|
43483
|
-
}
|
|
43484
|
-
setCurrentTrack(index) {
|
|
43485
|
-
const track = this.findTrackBy(index);
|
|
43486
|
-
this.currentTrack = track ?? null;
|
|
43487
|
-
this.selectedTrackId = index;
|
|
43488
|
-
this.highlightCurrentTrack();
|
|
43489
|
-
this.buttonElement().removeClass('changing');
|
|
43497
|
+
this.buttonElementText().text(this.currentTrack.label);
|
|
43490
43498
|
}
|
|
43491
43499
|
highlightCurrentTrack() {
|
|
43492
43500
|
this.trackElement().removeClass('current');
|
|
43493
43501
|
this.trackElement().find('a').removeClass('gcore-skin-active');
|
|
43494
43502
|
if (this.currentTrack) {
|
|
43495
|
-
|
|
43496
|
-
|
|
43497
|
-
|
|
43503
|
+
this.trackElement(this.currentTrack.id)
|
|
43504
|
+
.addClass('current')
|
|
43505
|
+
.find('a')
|
|
43506
|
+
.addClass('gcore-skin-active');
|
|
43498
43507
|
}
|
|
43499
|
-
this.updateText(this.selectedTrackId);
|
|
43500
43508
|
}
|
|
43501
43509
|
}
|
|
43502
43510
|
|
|
@@ -43650,7 +43658,7 @@ class BigMuteButton extends UICorePlugin {
|
|
|
43650
43658
|
}
|
|
43651
43659
|
}
|
|
43652
43660
|
|
|
43653
|
-
const pluginHtml$5 = "<
|
|
43661
|
+
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>";
|
|
43654
43662
|
|
|
43655
43663
|
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";
|
|
43656
43664
|
|
|
@@ -43913,7 +43921,7 @@ function getPageX(event) {
|
|
|
43913
43921
|
return 0;
|
|
43914
43922
|
}
|
|
43915
43923
|
|
|
43916
|
-
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
|
|
43924
|
+
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 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 === \"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";
|
|
43917
43925
|
|
|
43918
43926
|
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";
|
|
43919
43927
|
|
|
@@ -43993,7 +44001,6 @@ class MediaControl extends UICorePlugin {
|
|
|
43993
44001
|
userKeepVisible = false;
|
|
43994
44002
|
verticalVolume = false;
|
|
43995
44003
|
$audioTracksSelector = null;
|
|
43996
|
-
$bottomGear = null;
|
|
43997
44004
|
$clipText = null;
|
|
43998
44005
|
$clipTextContainer = null;
|
|
43999
44006
|
$duration = null;
|
|
@@ -44009,7 +44016,6 @@ class MediaControl extends UICorePlugin {
|
|
|
44009
44016
|
$seekBarLoaded = null;
|
|
44010
44017
|
$seekBarPosition = null;
|
|
44011
44018
|
$seekBarScrubber = null;
|
|
44012
|
-
$subtitlesSelector = null;
|
|
44013
44019
|
$volumeBarContainer = null;
|
|
44014
44020
|
$volumeBarBackground = null;
|
|
44015
44021
|
$volumeBarFill = null;
|
|
@@ -44030,7 +44036,8 @@ class MediaControl extends UICorePlugin {
|
|
|
44030
44036
|
return { min: CLAPPR_VERSION };
|
|
44031
44037
|
}
|
|
44032
44038
|
get disabled() {
|
|
44033
|
-
const playbackIsNOOP = this.core.activeContainer &&
|
|
44039
|
+
const playbackIsNOOP = this.core.activeContainer &&
|
|
44040
|
+
this.core.activeContainer.getPlaybackType() === Playback.NO_OP;
|
|
44034
44041
|
return this.userDisabled || playbackIsNOOP;
|
|
44035
44042
|
}
|
|
44036
44043
|
/**
|
|
@@ -44690,10 +44697,6 @@ class MediaControl extends UICorePlugin {
|
|
|
44690
44697
|
this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
|
|
44691
44698
|
this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
|
|
44692
44699
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
44693
|
-
this.$bottomGear = this.$el.find('.media-control-bottomgear');
|
|
44694
|
-
this.$pip = this.$el.find('.media-control-pip');
|
|
44695
|
-
this.$audioTracksSelector = this.$el.find('.media-control-audio-tracks[data-audiotracks]');
|
|
44696
|
-
this.$subtitlesSelector = this.$el.find('.media-control-subtitles[data-subtitles]');
|
|
44697
44700
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
44698
44701
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
44699
44702
|
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
|
|
@@ -44705,6 +44708,7 @@ class MediaControl extends UICorePlugin {
|
|
|
44705
44708
|
* Get a media control element DOM node
|
|
44706
44709
|
* @param name - The name of the media control element
|
|
44707
44710
|
* @returns The DOM node to render to or extend
|
|
44711
|
+
* @deprecated Use {@link MediaControl.putElement} instead
|
|
44708
44712
|
* @remarks
|
|
44709
44713
|
* Use this method to render custom media control UI in a plugin
|
|
44710
44714
|
* @example
|
|
@@ -44722,20 +44726,35 @@ class MediaControl extends UICorePlugin {
|
|
|
44722
44726
|
getElement(name) {
|
|
44723
44727
|
switch (name) {
|
|
44724
44728
|
case 'audioTracksSelector':
|
|
44725
|
-
return
|
|
44729
|
+
return null;
|
|
44726
44730
|
case 'clipText':
|
|
44727
44731
|
return this.$clipText;
|
|
44728
|
-
case 'bottomGear':
|
|
44729
44732
|
case 'gear':
|
|
44730
|
-
return
|
|
44733
|
+
return null;
|
|
44731
44734
|
case 'pip':
|
|
44732
|
-
return
|
|
44735
|
+
return null;
|
|
44733
44736
|
case 'playbackRate':
|
|
44734
44737
|
return this.$playbackRate;
|
|
44735
44738
|
case 'seekBarContainer':
|
|
44736
44739
|
return this.$seekBarContainer;
|
|
44737
44740
|
case 'subtitlesSelector':
|
|
44738
|
-
return
|
|
44741
|
+
return null;
|
|
44742
|
+
}
|
|
44743
|
+
}
|
|
44744
|
+
putElement(name, element) {
|
|
44745
|
+
switch (name) {
|
|
44746
|
+
case 'audioTracksSelector':
|
|
44747
|
+
this.getRightPanel().append(element);
|
|
44748
|
+
break;
|
|
44749
|
+
case 'gear':
|
|
44750
|
+
this.getRightPanel().append(element);
|
|
44751
|
+
break;
|
|
44752
|
+
case 'pip':
|
|
44753
|
+
this.getRightPanel().append(element);
|
|
44754
|
+
break;
|
|
44755
|
+
case 'subtitlesSelector':
|
|
44756
|
+
this.getRightPanel().append(element);
|
|
44757
|
+
break;
|
|
44739
44758
|
}
|
|
44740
44759
|
}
|
|
44741
44760
|
/**
|
|
@@ -45029,6 +45048,7 @@ MediaControl.extend = function (properties) {
|
|
|
45029
45048
|
|
|
45030
45049
|
const VERSION$5 = '2.19.12';
|
|
45031
45050
|
const T$d = 'plugins.bottom_gear';
|
|
45051
|
+
// TODO disabled if no items added
|
|
45032
45052
|
/**
|
|
45033
45053
|
* `PLUGIN` that adds the gear button with an extra options menu on the right side of the {@link MediaControl | media control} UI
|
|
45034
45054
|
* @beta
|
|
@@ -45037,7 +45057,7 @@ const T$d = 'plugins.bottom_gear';
|
|
|
45037
45057
|
*
|
|
45038
45058
|
* Depends on:
|
|
45039
45059
|
*
|
|
45040
|
-
* - {@link MediaControl
|
|
45060
|
+
* - {@link MediaControl}
|
|
45041
45061
|
*/
|
|
45042
45062
|
class BottomGear extends UICorePlugin {
|
|
45043
45063
|
isHd = false;
|
|
@@ -45065,8 +45085,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45065
45085
|
*/
|
|
45066
45086
|
get attributes() {
|
|
45067
45087
|
return {
|
|
45068
|
-
'class':
|
|
45069
|
-
'data-track-selector': ''
|
|
45088
|
+
'class': 'media-control-gear',
|
|
45070
45089
|
};
|
|
45071
45090
|
}
|
|
45072
45091
|
/**
|
|
@@ -45081,18 +45100,15 @@ class BottomGear extends UICorePlugin {
|
|
|
45081
45100
|
* @internal
|
|
45082
45101
|
*/
|
|
45083
45102
|
bindEvents() {
|
|
45084
|
-
|
|
45085
|
-
assert(mediaControl, 'media_control plugin is required');
|
|
45103
|
+
this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
|
|
45086
45104
|
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
45087
|
-
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
45088
|
-
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
|
|
45089
45105
|
}
|
|
45090
45106
|
/**
|
|
45091
45107
|
* @param name - Name of a gear menu placeholder item to attach custom UI
|
|
45092
45108
|
* @returns Zepto result of the element
|
|
45093
45109
|
*/
|
|
45094
45110
|
getElement(name) {
|
|
45095
|
-
return this.
|
|
45111
|
+
return this.$el.find(`.gear-options-list [data-${name}]`);
|
|
45096
45112
|
}
|
|
45097
45113
|
/**
|
|
45098
45114
|
* Replaces the content of the gear menu
|
|
@@ -45119,7 +45135,6 @@ class BottomGear extends UICorePlugin {
|
|
|
45119
45135
|
*/
|
|
45120
45136
|
render() {
|
|
45121
45137
|
const mediaControl = this.core.getPlugin('media_control');
|
|
45122
|
-
assert(mediaControl, 'media_control plugin is required');
|
|
45123
45138
|
// TODO use options.mediaControl.gear.items
|
|
45124
45139
|
const items = [
|
|
45125
45140
|
'quality',
|
|
@@ -45128,7 +45143,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45128
45143
|
];
|
|
45129
45144
|
const icon = this.isHd ? gearHdIcon : gearIcon;
|
|
45130
45145
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
45131
|
-
mediaControl.
|
|
45146
|
+
mediaControl.putElement('gear', this.$el);
|
|
45132
45147
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
45133
45148
|
return this;
|
|
45134
45149
|
}
|
|
@@ -45147,6 +45162,12 @@ class BottomGear extends UICorePlugin {
|
|
|
45147
45162
|
hide() {
|
|
45148
45163
|
this.$el.find('.gear-wrapper').hide();
|
|
45149
45164
|
}
|
|
45165
|
+
onCoreReady() {
|
|
45166
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
45167
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
45168
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
45169
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
|
|
45170
|
+
}
|
|
45150
45171
|
}
|
|
45151
45172
|
|
|
45152
45173
|
var mousetrap = {exports: {}};
|
|
@@ -48774,7 +48795,7 @@ class LevelSelector extends UICorePlugin {
|
|
|
48774
48795
|
*/
|
|
48775
48796
|
get attributes() {
|
|
48776
48797
|
return {
|
|
48777
|
-
class:
|
|
48798
|
+
class: 'level-selector',
|
|
48778
48799
|
'data-level-selector': '',
|
|
48779
48800
|
};
|
|
48780
48801
|
}
|
|
@@ -49589,7 +49610,7 @@ class MultiCamera extends UICorePlugin {
|
|
|
49589
49610
|
|
|
49590
49611
|
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";
|
|
49591
49612
|
|
|
49592
|
-
const buttonHtml$1 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n
|
|
49613
|
+
const buttonHtml$1 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n <%= pipIcon %>\n</button>\n";
|
|
49593
49614
|
|
|
49594
49615
|
const VERSION$2 = '0.0.1';
|
|
49595
49616
|
const T$7 = `plugins.pip`;
|
|
@@ -49630,6 +49651,11 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49630
49651
|
'click button': 'togglePictureInPicture',
|
|
49631
49652
|
};
|
|
49632
49653
|
}
|
|
49654
|
+
get attributes() {
|
|
49655
|
+
return {
|
|
49656
|
+
'class': 'media-control-pip',
|
|
49657
|
+
};
|
|
49658
|
+
}
|
|
49633
49659
|
get videoElement() {
|
|
49634
49660
|
return this.core.activePlayback.el;
|
|
49635
49661
|
}
|
|
@@ -49657,7 +49683,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49657
49683
|
this.$el.html(t({ pipIcon }));
|
|
49658
49684
|
const mediaControl = this.core.getPlugin('media_control');
|
|
49659
49685
|
if (mediaControl) {
|
|
49660
|
-
mediaControl.
|
|
49686
|
+
mediaControl.putElement('pip', this.el);
|
|
49661
49687
|
}
|
|
49662
49688
|
return this;
|
|
49663
49689
|
}
|
|
@@ -49711,6 +49737,7 @@ const T$6 = 'plugins.playback_rate';
|
|
|
49711
49737
|
* - {@link BottomGear | bottom_gear}
|
|
49712
49738
|
*
|
|
49713
49739
|
* It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
|
|
49740
|
+
* Note that the playback rate change is supported only for VOD or DVR enabled live streams.
|
|
49714
49741
|
*/
|
|
49715
49742
|
class PlaybackRate extends UICorePlugin {
|
|
49716
49743
|
playbackRates = DEFAULT_PLAYBACK_RATES;
|
|
@@ -50608,7 +50635,6 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50608
50635
|
template = tmpl(spinnerHTML);
|
|
50609
50636
|
hasFatalError = false;
|
|
50610
50637
|
hasBuffering = false;
|
|
50611
|
-
_showOnError = false;
|
|
50612
50638
|
constructor(container) {
|
|
50613
50639
|
super(container);
|
|
50614
50640
|
this.listenTo(this.container, Events$1.CONTAINER_STATE_BUFFERING, this.onBuffering);
|
|
@@ -50619,9 +50645,6 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50619
50645
|
this.listenTo(this.container, Events$1.CONTAINER_ERROR, this.onError);
|
|
50620
50646
|
this.listenTo(this.container, Events$1.CONTAINER_READY, this.render);
|
|
50621
50647
|
}
|
|
50622
|
-
showOnError() {
|
|
50623
|
-
this._showOnError = true;
|
|
50624
|
-
}
|
|
50625
50648
|
onBuffering() {
|
|
50626
50649
|
this.hasBuffering = true;
|
|
50627
50650
|
this._show();
|
|
@@ -50638,27 +50661,17 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50638
50661
|
}
|
|
50639
50662
|
onStop() {
|
|
50640
50663
|
trace(`${T$4} onStop`, {
|
|
50641
|
-
showOnError: this._showOnError,
|
|
50642
50664
|
hasFatalError: this.hasFatalError,
|
|
50643
50665
|
});
|
|
50644
|
-
// if (!(this.hasFatalError && this._showOnError)) {
|
|
50645
|
-
// this._hide()
|
|
50646
|
-
// }
|
|
50647
50666
|
this._hide();
|
|
50648
50667
|
}
|
|
50649
50668
|
onError(e) {
|
|
50650
50669
|
this.hasFatalError = e.code === PlaybackErrorCode.MediaSourceUnavailable;
|
|
50651
50670
|
trace(`${T$4} onError`, {
|
|
50652
50671
|
e,
|
|
50653
|
-
showOnError: this._showOnError,
|
|
50654
50672
|
hasFatalError: this.hasFatalError,
|
|
50655
50673
|
error: e.code,
|
|
50656
50674
|
});
|
|
50657
|
-
// if (this._showOnError) {
|
|
50658
|
-
// this._show()
|
|
50659
|
-
// } else {
|
|
50660
|
-
// this._hide()
|
|
50661
|
-
// }
|
|
50662
50675
|
this._hide();
|
|
50663
50676
|
}
|
|
50664
50677
|
/**
|
|
@@ -50704,18 +50717,15 @@ class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
50704
50717
|
* @internal
|
|
50705
50718
|
*/
|
|
50706
50719
|
render() {
|
|
50707
|
-
// TODO control via sourcecontroller instead
|
|
50708
|
-
const showOnStart = this.options.spinner?.showOnStart;
|
|
50709
50720
|
trace(`${T$4} render`, {
|
|
50710
50721
|
buffering: this.container.buffering,
|
|
50711
|
-
showOnStart,
|
|
50712
50722
|
});
|
|
50713
50723
|
this.$el.html(this.template());
|
|
50714
50724
|
this.el.firstElementChild?.addEventListener('animationiteration', () => {
|
|
50715
50725
|
this.trigger(SpinnerEvents.SYNC);
|
|
50716
50726
|
});
|
|
50717
50727
|
this.container.$el.append(this.$el[0]);
|
|
50718
|
-
if (
|
|
50728
|
+
if (this.container.buffering) {
|
|
50719
50729
|
this._show();
|
|
50720
50730
|
}
|
|
50721
50731
|
else {
|
|
@@ -50832,7 +50842,6 @@ class SourceController extends CorePlugin {
|
|
|
50832
50842
|
onCoreReady() {
|
|
50833
50843
|
trace(`${T$3} onCoreReady`);
|
|
50834
50844
|
this.core.getPlugin('error_screen')?.disable(); // TODO test
|
|
50835
|
-
// this.core.getPlugin('spinner')?.showOnError()
|
|
50836
50845
|
}
|
|
50837
50846
|
onActiveContainerChanged() {
|
|
50838
50847
|
trace(`${T$3} onActiveContainerChanged`, {
|
|
@@ -50941,14 +50950,13 @@ const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
|
|
|
50941
50950
|
|
|
50942
50951
|
const subtitlesOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.238 16.1C13.979 16.1 12.578 14.538 12.578 11.997C12.578 9.462 13.973 7.9 16.238 7.9C18.087 7.9 19.5029 9.127 19.6219 10.824H18.032C17.876 9.927 17.168 9.338 16.238 9.338C15.011 9.338 14.249 10.354 14.249 11.997C14.249 13.641 15.011 14.662 16.243 14.662C17.178 14.662 17.881 14.111 18.038 13.251H19.627C19.492 14.938 18.119 16.1 16.238 16.1ZM8.03198 16.1C5.77298 16.1 4.37299 14.538 4.37299 11.997C4.37299 9.462 5.76798 7.9 8.03198 7.9C9.88098 7.9 11.298 9.127 11.416 10.824H9.82697C9.67097 9.927 8.96198 9.338 8.03198 9.338C6.80598 9.338 6.04297 10.354 6.04297 11.997C6.04297 13.641 6.80596 14.662 8.03796 14.662C8.97296 14.662 9.67601 14.111 9.83301 13.251H11.422C11.287 14.938 9.91398 16.1 8.03198 16.1ZM22.5 3H1.5C0.672 3 0 3.671 0 4.5V19.5C0 20.329 0.672 21 1.5 21H22.5C23.329 21 24 20.329 24 19.5V4.5C24 3.671 23.329 3 22.5 3Z\"\n fill=\"#C9C9C9\"/>\n <rect y=\"22\" width=\"24\" height=\"2\" rx=\"1\" fill=\"#F6413B\"/>\n</svg>\n";
|
|
50943
50952
|
|
|
50944
|
-
const comboboxHTML = "<button data-subtitles-button class='media-control-button media-control-icon gcore-skin-button-color'>\n <span class='subtitle-text'></span>\n</button>\n\n<ul class='gcore-skin-bg-color'>\n
|
|
50953
|
+
const comboboxHTML = "<button data-subtitles-button class='media-control-button media-control-icon gcore-skin-button-color'>\n <span class='subtitle-text'></span>\n</button>\n\n<ul class='gcore-skin-bg-color'>\n <% for (const t of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-subtitles-select=\"<%= t.id %>\">\n <%= t.name %>\n </a>\n </li>\n <% } %>\n <li><a href=\"#\" class='gcore-skin-text-color' data-subtitles-select=\"-1\">Off</a></li>\n</ul>\n";
|
|
50945
50954
|
|
|
50946
50955
|
const stringHTML = "<div class=\"subtitle-string\">\n <p></p>\n</div>\n";
|
|
50947
50956
|
|
|
50948
50957
|
const VERSION = '2.19.14';
|
|
50949
50958
|
const LOCAL_STORAGE_SUBTITLES_ID = 'gplayer.plugins.subtitles.selected';
|
|
50950
50959
|
const T$2 = 'plugins.subtitles';
|
|
50951
|
-
const NO_TRACK = { language: 'off' };
|
|
50952
50960
|
/**
|
|
50953
50961
|
* `PLUGIN` that provides a UI to select the subtitles when available.
|
|
50954
50962
|
* @beta
|
|
@@ -50958,10 +50966,7 @@ const NO_TRACK = { language: 'off' };
|
|
|
50958
50966
|
*
|
|
50959
50967
|
* - {@link MediaControl}
|
|
50960
50968
|
*
|
|
50961
|
-
* Configuration options
|
|
50962
|
-
*
|
|
50963
|
-
* - subtitles.language - The language of the subtitles to select by default.
|
|
50964
|
-
*
|
|
50969
|
+
* Configuration options - {@link SubtitlesPluginSettings}
|
|
50965
50970
|
* @example
|
|
50966
50971
|
* ```ts
|
|
50967
50972
|
* import { Subtitles } from '@gcorevideo/player'
|
|
@@ -50977,11 +50982,10 @@ const NO_TRACK = { language: 'off' };
|
|
|
50977
50982
|
* ```
|
|
50978
50983
|
*/
|
|
50979
50984
|
class Subtitles extends UICorePlugin {
|
|
50980
|
-
currentLevel = null;
|
|
50981
50985
|
isPreselectedApplied = false;
|
|
50982
50986
|
isShowing = false;
|
|
50983
|
-
track =
|
|
50984
|
-
tracks =
|
|
50987
|
+
track = null;
|
|
50988
|
+
tracks = [];
|
|
50985
50989
|
$string = null;
|
|
50986
50990
|
/**
|
|
50987
50991
|
* @internal
|
|
@@ -51008,7 +51012,7 @@ class Subtitles extends UICorePlugin {
|
|
|
51008
51012
|
*/
|
|
51009
51013
|
get attributes() {
|
|
51010
51014
|
return {
|
|
51011
|
-
class:
|
|
51015
|
+
class: 'media-control-subtitles',
|
|
51012
51016
|
'data-subtitles': '',
|
|
51013
51017
|
};
|
|
51014
51018
|
}
|
|
@@ -51017,28 +51021,34 @@ class Subtitles extends UICorePlugin {
|
|
|
51017
51021
|
*/
|
|
51018
51022
|
get events() {
|
|
51019
51023
|
return {
|
|
51020
|
-
'click [data-subtitles-select]': '
|
|
51021
|
-
'click [data-subtitles-button]': '
|
|
51024
|
+
'click [data-subtitles-select]': 'onItemSelect',
|
|
51025
|
+
'click [data-subtitles-button]': 'toggleMenu',
|
|
51022
51026
|
};
|
|
51023
51027
|
}
|
|
51024
51028
|
get preselectedLanguage() {
|
|
51025
|
-
return this.core.options.subtitles?.language ?? '
|
|
51029
|
+
return this.core.options.subtitles?.language ?? '';
|
|
51026
51030
|
}
|
|
51027
51031
|
/**
|
|
51028
51032
|
* @internal
|
|
51029
51033
|
*/
|
|
51030
51034
|
bindEvents() {
|
|
51035
|
+
this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
|
|
51036
|
+
this.listenTo(this.core, Events$1.CORE_RESIZE, this.playerResize);
|
|
51037
|
+
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
|
|
51038
|
+
}
|
|
51039
|
+
onCoreReady() {
|
|
51040
|
+
trace(`${T$2} onCoreReady`);
|
|
51031
51041
|
const mediaControl = this.core.getPlugin('media_control');
|
|
51032
51042
|
assert(mediaControl, 'media_control plugin is required');
|
|
51033
|
-
this.listenTo(this.core, Events$1.CORE_RESIZE, this.playerResize);
|
|
51034
|
-
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.bindPlaybackEvents);
|
|
51035
51043
|
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
51036
|
-
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.
|
|
51044
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideMenu);
|
|
51037
51045
|
}
|
|
51038
|
-
|
|
51046
|
+
onContainerChanged() {
|
|
51047
|
+
trace(`${T$2} onContainerChanged`);
|
|
51039
51048
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_FULLSCREEN, this.playerResize);
|
|
51040
|
-
this.listenToOnce(this.core.activePlayback, Events$1.PLAYBACK_PLAY, this.getTracks);
|
|
51041
51049
|
this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
|
|
51050
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
|
|
51051
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
|
|
51042
51052
|
// fix for iOS
|
|
51043
51053
|
const video = this.core.activePlayback.el;
|
|
51044
51054
|
assert(video, 'video element is required');
|
|
@@ -51053,20 +51063,50 @@ class Subtitles extends UICorePlugin {
|
|
|
51053
51063
|
}
|
|
51054
51064
|
});
|
|
51055
51065
|
}
|
|
51056
|
-
|
|
51057
|
-
|
|
51058
|
-
|
|
51059
|
-
|
|
51060
|
-
|
|
51061
|
-
|
|
51062
|
-
|
|
51063
|
-
|
|
51066
|
+
onSubtitleAvailable() {
|
|
51067
|
+
trace(`${T$2} onSubtitleAvailable`);
|
|
51068
|
+
this.applyTracks();
|
|
51069
|
+
}
|
|
51070
|
+
onSubtitleChanged({ id }) {
|
|
51071
|
+
trace(`${T$2} onSubtitleChanged`, { id });
|
|
51072
|
+
if (id === -1) {
|
|
51073
|
+
this.clearSubtitleText();
|
|
51074
|
+
}
|
|
51075
|
+
for (const track of this.tracks) {
|
|
51076
|
+
if (track.id === id) {
|
|
51077
|
+
track.track.mode = 'showing';
|
|
51078
|
+
this.setSubtitleText(this.getSubtitleText(track.track));
|
|
51079
|
+
track.track.oncuechange = (e) => {
|
|
51080
|
+
try {
|
|
51081
|
+
if (track.track.activeCues?.length) {
|
|
51082
|
+
const html = track.track.activeCues[0].getCueAsHTML();
|
|
51083
|
+
this.setSubtitleText(html);
|
|
51084
|
+
}
|
|
51085
|
+
else {
|
|
51086
|
+
this.clearSubtitleText();
|
|
51087
|
+
}
|
|
51088
|
+
}
|
|
51089
|
+
catch (error) {
|
|
51090
|
+
reportError(error);
|
|
51091
|
+
}
|
|
51092
|
+
};
|
|
51064
51093
|
}
|
|
51065
|
-
|
|
51066
|
-
|
|
51094
|
+
else {
|
|
51095
|
+
track.track.oncuechange = null;
|
|
51096
|
+
track.track.mode = 'hidden';
|
|
51067
51097
|
}
|
|
51068
51098
|
}
|
|
51069
51099
|
}
|
|
51100
|
+
applyTracks() {
|
|
51101
|
+
try {
|
|
51102
|
+
this.tracks = this.core.activePlayback.closedCaptionsTracks;
|
|
51103
|
+
this.applyPreselectedSubtitles();
|
|
51104
|
+
this.render();
|
|
51105
|
+
}
|
|
51106
|
+
catch (error) {
|
|
51107
|
+
reportError(error);
|
|
51108
|
+
}
|
|
51109
|
+
}
|
|
51070
51110
|
onStartAd() {
|
|
51071
51111
|
if (this.isShowing && this.core.activeContainer) {
|
|
51072
51112
|
this.hide();
|
|
@@ -51078,10 +51118,11 @@ class Subtitles extends UICorePlugin {
|
|
|
51078
51118
|
this.stopListening(this.core.activeContainer, 'container:advertisement:finish', this.onFinishAd);
|
|
51079
51119
|
}
|
|
51080
51120
|
playerResize() {
|
|
51121
|
+
trace(`${T$2} playerResize`);
|
|
51081
51122
|
const shouldShow = this.core.activeContainer &&
|
|
51082
51123
|
isFullscreen(this.core.activeContainer.el) &&
|
|
51083
|
-
this.
|
|
51084
|
-
this.
|
|
51124
|
+
this.track &&
|
|
51125
|
+
this.track.track.mode &&
|
|
51085
51126
|
Browser.isiOS &&
|
|
51086
51127
|
this.isShowing;
|
|
51087
51128
|
if (shouldShow) {
|
|
@@ -51103,7 +51144,7 @@ class Subtitles extends UICorePlugin {
|
|
|
51103
51144
|
this.$string.hide();
|
|
51104
51145
|
if (this.tracks) {
|
|
51105
51146
|
for (const t of this.tracks) {
|
|
51106
|
-
t.mode = 'hidden';
|
|
51147
|
+
t.track.mode = 'hidden';
|
|
51107
51148
|
}
|
|
51108
51149
|
}
|
|
51109
51150
|
}
|
|
@@ -51115,23 +51156,20 @@ class Subtitles extends UICorePlugin {
|
|
|
51115
51156
|
this.renderIcon();
|
|
51116
51157
|
if (this.core.activeContainer &&
|
|
51117
51158
|
isFullscreen(this.core.activeContainer.el) &&
|
|
51118
|
-
this.
|
|
51119
|
-
this.
|
|
51159
|
+
this.track &&
|
|
51160
|
+
this.track.track.mode &&
|
|
51120
51161
|
Browser.isiOS) {
|
|
51121
51162
|
this.$string.hide();
|
|
51122
|
-
this.
|
|
51163
|
+
this.track.track.mode = 'showing';
|
|
51123
51164
|
}
|
|
51124
51165
|
else {
|
|
51125
51166
|
this.$string.show();
|
|
51126
51167
|
}
|
|
51127
51168
|
}
|
|
51128
51169
|
shouldRender() {
|
|
51129
|
-
return
|
|
51170
|
+
return this.tracks.length > 0;
|
|
51130
51171
|
}
|
|
51131
51172
|
resizeFont() {
|
|
51132
|
-
if (!this.core.activeContainer) {
|
|
51133
|
-
return;
|
|
51134
|
-
}
|
|
51135
51173
|
if (!this.$string) {
|
|
51136
51174
|
return;
|
|
51137
51175
|
}
|
|
@@ -51148,132 +51186,72 @@ class Subtitles extends UICorePlugin {
|
|
|
51148
51186
|
if (!this.shouldRender()) {
|
|
51149
51187
|
return this;
|
|
51150
51188
|
}
|
|
51151
|
-
trace(`${T$2} render`, {
|
|
51152
|
-
tracks: this.tracks?.length,
|
|
51153
|
-
track: this.track?.language,
|
|
51154
|
-
});
|
|
51155
51189
|
const mediaControl = this.core.getPlugin('media_control');
|
|
51156
|
-
assert(mediaControl, 'media_control plugin is required');
|
|
51157
51190
|
this.$el.html(Subtitles.template({ tracks: this.tracks }));
|
|
51158
51191
|
this.core.activeContainer.$el.find('.subtitle-string').remove();
|
|
51159
51192
|
this.$string = $(Subtitles.templateString());
|
|
51160
51193
|
this.resizeFont();
|
|
51161
|
-
this.core.activeContainer.$el.append(this.$string
|
|
51162
|
-
|
|
51163
|
-
|
|
51164
|
-
ss.append(this.el);
|
|
51165
|
-
}
|
|
51166
|
-
else {
|
|
51167
|
-
mediaControl.getRightPanel().append(this.el);
|
|
51168
|
-
}
|
|
51169
|
-
this.updateCurrentLevel(this.track);
|
|
51170
|
-
this.highlightCurrentSubtitles();
|
|
51171
|
-
this.applyPreselectedSubtitles();
|
|
51194
|
+
this.core.activeContainer.$el.append(this.$string);
|
|
51195
|
+
mediaControl.putElement('subtitlesSelector', this.$el);
|
|
51196
|
+
this.updateSelection();
|
|
51172
51197
|
this.renderIcon();
|
|
51173
51198
|
return this;
|
|
51174
51199
|
}
|
|
51175
|
-
|
|
51176
|
-
this.tracks
|
|
51177
|
-
this.render();
|
|
51178
|
-
}
|
|
51179
|
-
findLevelBy(id) {
|
|
51180
|
-
if (this.tracks) {
|
|
51181
|
-
for (const track of this.tracks) {
|
|
51182
|
-
if (track.language === id) {
|
|
51183
|
-
return track; // TODO TrackInfo?
|
|
51184
|
-
}
|
|
51185
|
-
}
|
|
51186
|
-
}
|
|
51200
|
+
findById(id) {
|
|
51201
|
+
return this.tracks.find((track) => track.id === id) ?? null;
|
|
51187
51202
|
}
|
|
51188
|
-
|
|
51203
|
+
selectItem(item) {
|
|
51189
51204
|
this.clearSubtitleText();
|
|
51190
|
-
this.track =
|
|
51191
|
-
this.
|
|
51192
|
-
|
|
51193
|
-
|
|
51194
|
-
|
|
51195
|
-
|
|
51196
|
-
|
|
51197
|
-
|
|
51198
|
-
|
|
51199
|
-
if (id) {
|
|
51200
|
-
localStorage.setItem(LOCAL_STORAGE_SUBTITLES_ID, id);
|
|
51201
|
-
this.selectLevel(id);
|
|
51202
|
-
}
|
|
51205
|
+
this.track = item;
|
|
51206
|
+
this.hideMenu();
|
|
51207
|
+
this.updateSelection();
|
|
51208
|
+
}
|
|
51209
|
+
onItemSelect(event) {
|
|
51210
|
+
const id = event.target.dataset.subtitlesSelect ?? '-1';
|
|
51211
|
+
trace(`${T$2} onItemSelect`, { id });
|
|
51212
|
+
localStorage.setItem(LOCAL_STORAGE_SUBTITLES_ID, id);
|
|
51213
|
+
this.selectItem(this.findById(Number(id)));
|
|
51203
51214
|
return false;
|
|
51204
51215
|
}
|
|
51205
51216
|
applyPreselectedSubtitles() {
|
|
51206
51217
|
if (!this.isPreselectedApplied) {
|
|
51207
51218
|
this.isPreselectedApplied = true;
|
|
51219
|
+
if (!this.preselectedLanguage) {
|
|
51220
|
+
return;
|
|
51221
|
+
}
|
|
51208
51222
|
setTimeout(() => {
|
|
51209
|
-
this.
|
|
51210
|
-
}, 300);
|
|
51223
|
+
this.selectItem(this.tracks.find((t) => t.track.language === this.preselectedLanguage) ?? null);
|
|
51224
|
+
}, 300); // TODO why delay?
|
|
51211
51225
|
}
|
|
51212
51226
|
}
|
|
51213
|
-
|
|
51214
|
-
trace(`${T$2} onShowLevelSelectMenu`);
|
|
51215
|
-
this.toggleContextMenu();
|
|
51216
|
-
}
|
|
51217
|
-
hideSelectLevelMenu() {
|
|
51227
|
+
hideMenu() {
|
|
51218
51228
|
this.$('[data-subtitles] ul').hide();
|
|
51219
51229
|
}
|
|
51220
|
-
|
|
51230
|
+
toggleMenu() {
|
|
51221
51231
|
this.$('[data-subtitles] ul').toggle();
|
|
51222
51232
|
}
|
|
51223
|
-
|
|
51224
|
-
return this.$(
|
|
51225
|
-
}
|
|
51226
|
-
levelElement(id) {
|
|
51227
|
-
return this.$('[data-subtitles] ul a' + (id ? '[data-subtitles-select="' + id + '"]' : '')).parent();
|
|
51228
|
-
}
|
|
51229
|
-
startLevelSwitch() {
|
|
51230
|
-
this.buttonElement().addClass('changing');
|
|
51233
|
+
itemElement(id) {
|
|
51234
|
+
return this.$(`ul li a[data-subtitles-select="${id}"]`).parent();
|
|
51231
51235
|
}
|
|
51232
|
-
|
|
51233
|
-
this
|
|
51236
|
+
allItemElements() {
|
|
51237
|
+
return this.$('[data-subtitles] li');
|
|
51234
51238
|
}
|
|
51235
51239
|
selectSubtitles() {
|
|
51236
|
-
|
|
51237
|
-
|
|
51238
|
-
|
|
51239
|
-
|
|
51240
|
-
|
|
51241
|
-
|
|
51242
|
-
|
|
51243
|
-
|
|
51244
|
-
|
|
51245
|
-
|
|
51246
|
-
|
|
51247
|
-
if (cues && cues.length) {
|
|
51248
|
-
for (const cue of cues) {
|
|
51249
|
-
if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
|
|
51250
|
-
subtitleText +=
|
|
51251
|
-
cue.getCueAsHTML().textContent + '\n';
|
|
51252
|
-
}
|
|
51253
|
-
}
|
|
51254
|
-
}
|
|
51255
|
-
this.setSubtitleText(subtitleText);
|
|
51256
|
-
track.oncuechange = (e) => {
|
|
51257
|
-
try {
|
|
51258
|
-
if (track.activeCues?.length) {
|
|
51259
|
-
const html = track.activeCues[0].getCueAsHTML();
|
|
51260
|
-
this.setSubtitleText(html);
|
|
51261
|
-
}
|
|
51262
|
-
else {
|
|
51263
|
-
this.clearSubtitleText();
|
|
51264
|
-
}
|
|
51265
|
-
}
|
|
51266
|
-
catch (error) {
|
|
51267
|
-
// console.error(error);
|
|
51268
|
-
reportError(error);
|
|
51269
|
-
}
|
|
51270
|
-
};
|
|
51271
|
-
continue;
|
|
51240
|
+
const trackId = this.track ? this.track.id : -1;
|
|
51241
|
+
this.core.activePlayback.closedCaptionsTrackId = trackId;
|
|
51242
|
+
}
|
|
51243
|
+
getSubtitleText(track) {
|
|
51244
|
+
const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
|
|
51245
|
+
const cues = track.cues;
|
|
51246
|
+
const lines = [];
|
|
51247
|
+
if (cues && cues.length) {
|
|
51248
|
+
for (const cue of cues) {
|
|
51249
|
+
if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
|
|
51250
|
+
lines.push(cue.getCueAsHTML().textContent);
|
|
51272
51251
|
}
|
|
51273
|
-
this.tracks[i].oncuechange = null;
|
|
51274
|
-
this.tracks[i].mode = 'hidden';
|
|
51275
51252
|
}
|
|
51276
51253
|
}
|
|
51254
|
+
return lines.join('\n');
|
|
51277
51255
|
}
|
|
51278
51256
|
setSubtitleText(text) {
|
|
51279
51257
|
this.$string.find('p').html(text);
|
|
@@ -51281,9 +51259,8 @@ class Subtitles extends UICorePlugin {
|
|
|
51281
51259
|
clearSubtitleText() {
|
|
51282
51260
|
this.setSubtitleText('');
|
|
51283
51261
|
}
|
|
51284
|
-
|
|
51285
|
-
this.
|
|
51286
|
-
if (track.language === 'off') {
|
|
51262
|
+
updateSelection() {
|
|
51263
|
+
if (!this.track) {
|
|
51287
51264
|
this.hide();
|
|
51288
51265
|
}
|
|
51289
51266
|
else {
|
|
@@ -51293,21 +51270,22 @@ class Subtitles extends UICorePlugin {
|
|
|
51293
51270
|
this.highlightCurrentSubtitles();
|
|
51294
51271
|
}
|
|
51295
51272
|
highlightCurrentSubtitles() {
|
|
51296
|
-
this.
|
|
51297
|
-
|
|
51298
|
-
|
|
51299
|
-
|
|
51300
|
-
|
|
51301
|
-
|
|
51302
|
-
}
|
|
51273
|
+
this.allItemElements()
|
|
51274
|
+
.removeClass('current')
|
|
51275
|
+
.find('a')
|
|
51276
|
+
.removeClass('gcore-skin-active');
|
|
51277
|
+
trace(`${T$2} highlightCurrentSubtitles`, {
|
|
51278
|
+
track: this.track?.id,
|
|
51279
|
+
});
|
|
51280
|
+
const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
|
|
51281
|
+
currentLevelElement
|
|
51282
|
+
.addClass('current')
|
|
51283
|
+
.find('a')
|
|
51284
|
+
.addClass('gcore-skin-active');
|
|
51303
51285
|
}
|
|
51304
51286
|
renderIcon() {
|
|
51305
51287
|
const icon = this.isShowing ? subtitlesOnIcon : subtitlesOffIcon;
|
|
51306
|
-
this.
|
|
51307
|
-
.getPlugin('media_control')
|
|
51308
|
-
.getElement('subtitlesSelector')
|
|
51309
|
-
?.find('span.subtitle-text')
|
|
51310
|
-
.html(icon);
|
|
51288
|
+
this.$el.find('span.subtitle-text').html(icon);
|
|
51311
51289
|
}
|
|
51312
51290
|
}
|
|
51313
51291
|
|