@gcorevideo/player 2.21.6 → 2.22.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/bottom-gear/bottomgear copy.ejs +10 -0
- package/assets/bottom-gear/bottomgear.ejs +4 -8
- package/assets/bottom-gear/gear-sub-menu.scss +0 -1
- package/assets/bottom-gear/gear.scss +0 -1
- package/assets/clappr-nerd-stats/button.ejs +3 -3
- package/assets/level-selector/button.ejs +2 -4
- package/assets/level-selector/list.ejs +14 -10
- package/assets/level-selector/style.scss +9 -4
- package/assets/media-control/media-control.ejs +1 -1
- package/assets/playback-rate/list.ejs +5 -5
- package/dist/core.js +1 -2
- package/dist/index.css +652 -651
- package/dist/index.js +3850 -3766
- package/dist/player.d.ts +10 -17
- package/dist/plugins/index.css +742 -741
- package/dist/plugins/index.js +3951 -3868
- package/docs/api/player.mediacontrol.md +8 -36
- package/docs/api/player.mediacontrol.toggleelement.md +72 -0
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +0 -1
- package/lib/plugins/bottom-gear/BottomGear.d.ts +65 -14
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +113 -37
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +2 -3
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -1
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +18 -15
- package/lib/plugins/dvr-controls/DvrControls.js +1 -1
- package/lib/plugins/level-selector/LevelSelector.d.ts +8 -11
- package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
- package/lib/plugins/level-selector/LevelSelector.js +66 -102
- package/lib/plugins/media-control/MediaControl.d.ts +7 -5
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +40 -20
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
- package/lib/plugins/picture-in-picture/PictureInPicture.js +7 -2
- package/lib/plugins/playback-rate/PlaybackRate.d.ts +42 -14
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +101 -83
- package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
- package/lib/testUtils.d.ts +1 -0
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +13 -0
- package/package.json +1 -1
- package/src/playback/dash-playback/DashPlayback.ts +0 -1
- package/src/plugins/bottom-gear/BottomGear.ts +162 -72
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +21 -5
- package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +5 -12
- package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +27 -25
- package/src/plugins/dvr-controls/DvrControls.ts +1 -1
- package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +6 -4
- package/src/plugins/dvr-controls/__tests__/__snapshots__/DvrControls.test.ts.snap +2 -2
- package/src/plugins/level-selector/LevelSelector.ts +80 -120
- package/src/plugins/level-selector/__tests__/LevelSelector.test.ts +69 -79
- package/src/plugins/level-selector/__tests__/__snapshots__/LevelSelector.test.ts.snap +38 -71
- package/src/plugins/media-control/MediaControl.ts +54 -26
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +4 -4
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +4 -0
- package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -2
- package/src/plugins/playback-rate/PlaybackRate.ts +136 -108
- package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +84 -37
- package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +55 -6
- package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
- package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
- package/src/testUtils.ts +14 -0
- package/src/typings/vitest.d.ts +1 -0
- package/temp/player.api.json +66 -94
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.mediacontrol.getcenterpanel.md +0 -18
- package/docs/api/player.mediacontrol.getleftpanel.md +0 -22
- package/docs/api/player.mediacontrol.getrightpanel.md +0 -22
|
@@ -48,7 +48,8 @@ export declare class LevelSelector extends UICorePlugin {
|
|
|
48
48
|
private levelLabels;
|
|
49
49
|
private removeAuto;
|
|
50
50
|
private isHd;
|
|
51
|
-
private
|
|
51
|
+
private currentText;
|
|
52
|
+
private selectedLevelId;
|
|
52
53
|
private static readonly buttonTemplate;
|
|
53
54
|
private static readonly listTemplate;
|
|
54
55
|
/**
|
|
@@ -72,11 +73,8 @@ export declare class LevelSelector extends UICorePlugin {
|
|
|
72
73
|
class: string;
|
|
73
74
|
'data-level-selector': string;
|
|
74
75
|
};
|
|
75
|
-
private currentText;
|
|
76
|
-
private selectedLevelId;
|
|
77
76
|
get events(): {
|
|
78
77
|
'click .gear-sub-menu_btn': string;
|
|
79
|
-
'click .gear-option': string;
|
|
80
78
|
'click .go-back': string;
|
|
81
79
|
};
|
|
82
80
|
/**
|
|
@@ -85,30 +83,29 @@ export declare class LevelSelector extends UICorePlugin {
|
|
|
85
83
|
bindEvents(): void;
|
|
86
84
|
private onCoreReady;
|
|
87
85
|
private onGearRendered;
|
|
88
|
-
private
|
|
86
|
+
private onActiveContainerChange;
|
|
87
|
+
private updateHd;
|
|
89
88
|
private onStop;
|
|
90
89
|
private shouldRender;
|
|
91
90
|
/**
|
|
92
91
|
* @internal
|
|
93
92
|
*/
|
|
94
93
|
render(): this;
|
|
95
|
-
private renderButton;
|
|
96
94
|
private renderDropdown;
|
|
95
|
+
private updateButton;
|
|
97
96
|
private get maxLevel();
|
|
98
|
-
private
|
|
97
|
+
private onLevelsAvailable;
|
|
99
98
|
private makeLevelsLabels;
|
|
100
|
-
private
|
|
99
|
+
private onSelect;
|
|
101
100
|
private goBack;
|
|
102
101
|
private setLevel;
|
|
103
|
-
private onShowLevelSelectMenu;
|
|
104
102
|
private allLevelElements;
|
|
105
103
|
private levelElement;
|
|
106
104
|
private onLevelSwitchStart;
|
|
107
105
|
private onLevelSwitchEnd;
|
|
108
106
|
private updateText;
|
|
109
107
|
private getLevelLabel;
|
|
110
|
-
private
|
|
108
|
+
private onBitrate;
|
|
111
109
|
private highlightCurrentLevel;
|
|
112
|
-
private deferRender;
|
|
113
110
|
}
|
|
114
111
|
//# sourceMappingURL=LevelSelector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LevelSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/level-selector/LevelSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAA;AAgB7D,OAAO,2CAA2C,CAAA;AAMlD;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,UAAU,CAAQ;IAE1B,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"LevelSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/level-selector/LevelSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAA;AAgB7D,OAAO,2CAA2C,CAAA;AAMlD;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,UAAU,CAAQ;IAE1B,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,eAAe,CAAK;IAE5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAChB;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAE3E;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACM,MAAM;IAUf,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,YAAY;IAcpB,OAAO,KAAK,QAAQ,GASnB;IAED,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,qBAAqB;CAkB9B"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Events, template, UICorePlugin } from '@clappr/core';
|
|
2
|
-
import {
|
|
2
|
+
import { trace } from '@gcorevideo/utils';
|
|
3
3
|
import assert from 'assert';
|
|
4
4
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
5
|
+
import { GearEvents } from '../bottom-gear/BottomGear.js';
|
|
5
6
|
import buttonHtml from '../../../assets/level-selector/button.ejs';
|
|
6
7
|
import listHtml from '../../../assets/level-selector/list.ejs';
|
|
7
8
|
import hdIcon from '../../../assets/icons/new/hd.svg';
|
|
@@ -9,7 +10,6 @@ import arrowRightIcon from '../../../assets/icons/new/arrow-right.svg';
|
|
|
9
10
|
import arrowLeftIcon from '../../../assets/icons/new/arrow-left.svg';
|
|
10
11
|
import checkIcon from '../../../assets/icons/new/check.svg';
|
|
11
12
|
import '../../../assets/level-selector/style.scss';
|
|
12
|
-
import { MediaControlEvents } from '../media-control/MediaControl.js';
|
|
13
13
|
const T = 'plugins.level_selector';
|
|
14
14
|
const VERSION = '2.19.4';
|
|
15
15
|
/**
|
|
@@ -42,7 +42,8 @@ export class LevelSelector extends UICorePlugin {
|
|
|
42
42
|
levelLabels = [];
|
|
43
43
|
removeAuto = false;
|
|
44
44
|
isHd = false;
|
|
45
|
-
|
|
45
|
+
currentText = '';
|
|
46
|
+
selectedLevelId = -1;
|
|
46
47
|
static buttonTemplate = template(buttonHtml);
|
|
47
48
|
static listTemplate = template(listHtml);
|
|
48
49
|
/**
|
|
@@ -72,12 +73,9 @@ export class LevelSelector extends UICorePlugin {
|
|
|
72
73
|
'data-level-selector': '',
|
|
73
74
|
};
|
|
74
75
|
}
|
|
75
|
-
currentText = 'Auto';
|
|
76
|
-
selectedLevelId = -1;
|
|
77
76
|
get events() {
|
|
78
77
|
return {
|
|
79
|
-
'click .gear-sub-menu_btn': '
|
|
80
|
-
'click .gear-option': 'onShowLevelSelectMenu',
|
|
78
|
+
'click .gear-sub-menu_btn': 'onSelect',
|
|
81
79
|
'click .go-back': 'goBack',
|
|
82
80
|
};
|
|
83
81
|
}
|
|
@@ -85,42 +83,48 @@ export class LevelSelector extends UICorePlugin {
|
|
|
85
83
|
* @internal
|
|
86
84
|
*/
|
|
87
85
|
bindEvents() {
|
|
88
|
-
this.
|
|
89
|
-
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.
|
|
86
|
+
this.listenToOnce(this.core, Events.CORE_READY, this.onCoreReady);
|
|
87
|
+
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
|
|
90
88
|
}
|
|
91
89
|
onCoreReady() {
|
|
92
90
|
trace(`${T} onCoreReady`);
|
|
93
|
-
const
|
|
94
|
-
assert(
|
|
95
|
-
this.
|
|
91
|
+
const gear = this.core.getPlugin('bottom_gear');
|
|
92
|
+
assert(gear, 'bottom_gear plugin is required');
|
|
93
|
+
this.currentText = this.core.i18n.t('auto');
|
|
94
|
+
this.listenTo(gear, GearEvents.RENDERED, this.onGearRendered);
|
|
96
95
|
}
|
|
97
96
|
onGearRendered() {
|
|
98
97
|
trace(`${T} onGearRendered`);
|
|
99
|
-
this.
|
|
98
|
+
this.render();
|
|
100
99
|
}
|
|
101
|
-
|
|
100
|
+
onActiveContainerChange() {
|
|
102
101
|
this.removeAuto = false;
|
|
103
102
|
this.isHd = false;
|
|
104
103
|
const activePlayback = this.core.activePlayback;
|
|
105
|
-
this.listenTo(activePlayback, Events.PLAYBACK_LEVELS_AVAILABLE, this.
|
|
104
|
+
this.listenTo(activePlayback, Events.PLAYBACK_LEVELS_AVAILABLE, this.onLevelsAvailable);
|
|
106
105
|
this.listenTo(activePlayback, Events.PLAYBACK_LEVEL_SWITCH_START, this.onLevelSwitchStart);
|
|
107
106
|
this.listenTo(activePlayback, Events.PLAYBACK_LEVEL_SWITCH_END, this.onLevelSwitchEnd);
|
|
108
|
-
this.listenTo(activePlayback, Events.PLAYBACK_BITRATE, this.
|
|
107
|
+
this.listenTo(activePlayback, Events.PLAYBACK_BITRATE, this.onBitrate);
|
|
109
108
|
this.listenTo(activePlayback, Events.PLAYBACK_STOP, this.onStop);
|
|
110
109
|
this.listenTo(activePlayback, Events.PLAYBACK_HIGHDEFINITIONUPDATE, (isHd) => {
|
|
111
110
|
this.isHd = isHd;
|
|
112
|
-
this.
|
|
111
|
+
this.updateHd();
|
|
113
112
|
});
|
|
114
113
|
if (activePlayback.levels?.length > 0) {
|
|
115
|
-
this.
|
|
114
|
+
this.onLevelsAvailable(activePlayback.levels);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
updateHd() {
|
|
118
|
+
if (this.isHd) {
|
|
119
|
+
this.$el.find('.gear-option_hd-icon').removeClass('hidden');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.$el.find('.gear-option_hd-icon').addClass('hidden');
|
|
116
123
|
}
|
|
117
124
|
}
|
|
118
125
|
onStop() {
|
|
119
126
|
trace(`${T} onStop`);
|
|
120
127
|
this.listenToOnce(this.core.activePlayback, Events.PLAYBACK_PLAY, () => {
|
|
121
|
-
trace(`${T} on PLAYBACK_PLAY after stop`, {
|
|
122
|
-
selectedLevelId: this.selectedLevelId,
|
|
123
|
-
});
|
|
124
128
|
if (this.core.activePlayback.getPlaybackType() === 'live') {
|
|
125
129
|
if (this.selectedLevelId !== -1) {
|
|
126
130
|
this.core.activePlayback.currentLevel = this.selectedLevelId;
|
|
@@ -147,47 +151,42 @@ export class LevelSelector extends UICorePlugin {
|
|
|
147
151
|
if (!this.shouldRender()) {
|
|
148
152
|
return this;
|
|
149
153
|
}
|
|
150
|
-
this.
|
|
154
|
+
this.renderDropdown();
|
|
155
|
+
this.updateButton();
|
|
151
156
|
return this;
|
|
152
157
|
}
|
|
153
|
-
renderButton() {
|
|
154
|
-
if (!this.isOpen) {
|
|
155
|
-
const html = LevelSelector.buttonTemplate({
|
|
156
|
-
arrowRightIcon,
|
|
157
|
-
currentText: this.currentText,
|
|
158
|
-
isHd: this.isHd,
|
|
159
|
-
hdIcon,
|
|
160
|
-
});
|
|
161
|
-
this.$el.html(html);
|
|
162
|
-
const gear = this.core.getPlugin('bottom_gear');
|
|
163
|
-
if (!gear) {
|
|
164
|
-
trace(`${T} renderButton: bottom_gear plugin not found`);
|
|
165
|
-
}
|
|
166
|
-
gear?.getElement('quality')?.html(this.el);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
158
|
renderDropdown() {
|
|
170
|
-
|
|
159
|
+
this.$el.html(LevelSelector.listTemplate({
|
|
171
160
|
arrowLeftIcon,
|
|
172
161
|
checkIcon,
|
|
162
|
+
current: this.selectedLevelId,
|
|
173
163
|
labels: this.levelLabels,
|
|
174
164
|
levels: this.levels,
|
|
175
165
|
maxLevel: this.maxLevel,
|
|
176
166
|
removeAuto: this.removeAuto,
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
167
|
+
i18n: this.core.i18n,
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
updateButton() {
|
|
171
|
+
;
|
|
172
|
+
this.core.getPlugin('bottom_gear')
|
|
173
|
+
?.addItem('quality', this.$el)
|
|
174
|
+
.html(LevelSelector.buttonTemplate({
|
|
175
|
+
arrowRightIcon,
|
|
176
|
+
currentText: this.currentText,
|
|
177
|
+
isHd: this.isHd,
|
|
178
|
+
hdIcon,
|
|
179
|
+
i18n: this.core.i18n,
|
|
180
|
+
}));
|
|
182
181
|
}
|
|
183
182
|
get maxLevel() {
|
|
184
183
|
const maxRes = this.core.options.levelSelector?.restrictResolution;
|
|
185
184
|
return maxRes
|
|
186
|
-
? this.levels.
|
|
187
|
-
maxRes)
|
|
185
|
+
? this.levels.find((level) => (level.height > level.width ? level.width : level.height) ===
|
|
186
|
+
maxRes)?.level ?? -1
|
|
188
187
|
: -1;
|
|
189
188
|
}
|
|
190
|
-
|
|
189
|
+
onLevelsAvailable(levels) {
|
|
191
190
|
const maxResolution = this.core.options.levelSelector?.restrictResolution;
|
|
192
191
|
this.levels = levels;
|
|
193
192
|
this.makeLevelsLabels();
|
|
@@ -199,86 +198,60 @@ export class LevelSelector extends UICorePlugin {
|
|
|
199
198
|
.pop();
|
|
200
199
|
this.setLevel(initialLevel?.level ?? 0);
|
|
201
200
|
}
|
|
202
|
-
this.
|
|
201
|
+
this.render();
|
|
203
202
|
}
|
|
204
203
|
makeLevelsLabels() {
|
|
205
204
|
const labels = this.core.options.levelSelector?.labels ?? {};
|
|
206
205
|
this.levelLabels = [];
|
|
207
|
-
for (
|
|
208
|
-
const level = this.levels[i];
|
|
206
|
+
for (const level of this.levels) {
|
|
209
207
|
const ll = level.width > level.height ? level.height : level.width;
|
|
210
208
|
const label = labels[ll] || `${ll}p`;
|
|
211
209
|
this.levelLabels.push(label);
|
|
212
210
|
}
|
|
213
211
|
}
|
|
214
|
-
|
|
212
|
+
onSelect(event) {
|
|
215
213
|
const selectedLevel = parseInt(event.currentTarget?.dataset?.id ?? '-1', 10);
|
|
216
214
|
this.setLevel(selectedLevel);
|
|
217
215
|
event.stopPropagation();
|
|
216
|
+
event.preventDefault();
|
|
218
217
|
return false;
|
|
219
218
|
}
|
|
220
219
|
goBack() {
|
|
221
220
|
trace(`${T} goBack`);
|
|
222
|
-
this.
|
|
223
|
-
setTimeout(() => {
|
|
224
|
-
this.core.getPlugin('bottom_gear').refresh();
|
|
225
|
-
}, 0);
|
|
221
|
+
this.core.getPlugin('bottom_gear').refresh();
|
|
226
222
|
}
|
|
227
223
|
setLevel(index) {
|
|
228
|
-
trace(`${T} setIndexLevel`, { index });
|
|
229
224
|
this.selectedLevelId = index;
|
|
230
|
-
if (!this.core.activePlayback) {
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
if (this.core.activePlayback.currentLevel === this.selectedLevelId) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
225
|
this.core.activePlayback.currentLevel = this.selectedLevelId;
|
|
237
|
-
try {
|
|
238
|
-
this.highlightCurrentLevel();
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
reportError(error);
|
|
242
|
-
}
|
|
243
|
-
this.deferRender();
|
|
244
|
-
}
|
|
245
|
-
onShowLevelSelectMenu() {
|
|
246
|
-
trace(`${T} onShowLevelSelectMenu`);
|
|
247
|
-
this.isOpen = true;
|
|
248
|
-
this.renderDropdown();
|
|
249
226
|
this.highlightCurrentLevel();
|
|
250
227
|
}
|
|
251
228
|
allLevelElements() {
|
|
252
|
-
return this.$('
|
|
229
|
+
return this.$('#level-selector-menu li');
|
|
253
230
|
}
|
|
254
231
|
levelElement(id = -1) {
|
|
255
|
-
return this.$(
|
|
232
|
+
return this.$(`#level-selector-menu a[data-id="${id}"]`).parent();
|
|
256
233
|
}
|
|
257
234
|
onLevelSwitchStart() {
|
|
258
|
-
this.core.activePlayback.trigger('playback:level:select:start');
|
|
259
235
|
this.levelElement(this.selectedLevelId).addClass('changing');
|
|
260
236
|
}
|
|
261
237
|
onLevelSwitchEnd() {
|
|
262
238
|
this.levelElement(this.selectedLevelId).removeClass('changing');
|
|
263
239
|
}
|
|
264
240
|
updateText(level) {
|
|
265
|
-
if (level === undefined || isNaN(level)) {
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
241
|
this.currentText = this.getLevelLabel(level);
|
|
269
|
-
this.
|
|
242
|
+
this.updateButton();
|
|
270
243
|
}
|
|
271
244
|
getLevelLabel(id) {
|
|
272
|
-
if (id
|
|
273
|
-
return '
|
|
245
|
+
if (id < 0) {
|
|
246
|
+
return this.core.i18n.t('auto');
|
|
274
247
|
}
|
|
275
248
|
const index = this.levels.findIndex((l) => l.level === id);
|
|
276
249
|
if (index < 0) {
|
|
277
|
-
return '
|
|
250
|
+
return this.core.i18n.t('auto');
|
|
278
251
|
}
|
|
279
252
|
return this.levelLabels[index] ?? formatLevelLabel(this.levels[index]);
|
|
280
253
|
}
|
|
281
|
-
|
|
254
|
+
onBitrate(info) {
|
|
282
255
|
trace(`${T} updateCurrentLevel`, { info });
|
|
283
256
|
this.highlightCurrentLevel();
|
|
284
257
|
}
|
|
@@ -286,28 +259,19 @@ export class LevelSelector extends UICorePlugin {
|
|
|
286
259
|
trace(`${T} highlightCurrentLevel`, {
|
|
287
260
|
selectedLevelId: this.selectedLevelId,
|
|
288
261
|
});
|
|
289
|
-
this.allLevelElements()
|
|
290
|
-
|
|
262
|
+
this.allLevelElements()
|
|
263
|
+
.removeClass('current')
|
|
264
|
+
.find('a')
|
|
265
|
+
.removeClass('gcore-skin-active');
|
|
291
266
|
const currentLevelElement = this.levelElement(this.selectedLevelId);
|
|
292
|
-
currentLevelElement
|
|
293
|
-
|
|
267
|
+
currentLevelElement
|
|
268
|
+
.addClass('current')
|
|
269
|
+
.find('a')
|
|
270
|
+
.addClass('gcore-skin-active');
|
|
294
271
|
this.updateText(this.selectedLevelId);
|
|
295
272
|
}
|
|
296
|
-
deferRender = debounce(() => this.render(), 0);
|
|
297
273
|
}
|
|
298
274
|
function formatLevelLabel(level) {
|
|
299
275
|
const h = level.width > level.height ? level.height : level.width;
|
|
300
276
|
return `${h}p`;
|
|
301
277
|
}
|
|
302
|
-
function debounce(fn, wait) {
|
|
303
|
-
let timerId = null;
|
|
304
|
-
return function () {
|
|
305
|
-
if (timerId !== null) {
|
|
306
|
-
clearTimeout(timerId);
|
|
307
|
-
}
|
|
308
|
-
timerId = setTimeout(() => {
|
|
309
|
-
timerId = null;
|
|
310
|
-
fn();
|
|
311
|
-
}, wait);
|
|
312
|
-
};
|
|
313
|
-
}
|
|
@@ -5,10 +5,11 @@ import '../../../assets/media-control/media-control.scss';
|
|
|
5
5
|
* Media control elements, mount points for additional plugins
|
|
6
6
|
* @beta
|
|
7
7
|
*/
|
|
8
|
-
export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'gear' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer';
|
|
8
|
+
export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'fullscreen' | 'gear' | 'multicamera' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer' | 'vr' | 'volume';
|
|
9
9
|
/**
|
|
10
10
|
* Custom events emitted by the plugins to communicate with one another
|
|
11
11
|
* @beta
|
|
12
|
+
* @deprecated
|
|
12
13
|
*/
|
|
13
14
|
export declare enum MediaControlEvents {
|
|
14
15
|
/**
|
|
@@ -23,6 +24,8 @@ export declare enum MediaControlEvents {
|
|
|
23
24
|
* The methods exposed are to be used by the other plugins that extend the media control UI.
|
|
24
25
|
*/
|
|
25
26
|
export declare class MediaControl extends UICorePlugin {
|
|
27
|
+
private customAreaElements;
|
|
28
|
+
private customAreaHandler?;
|
|
26
29
|
private buttonsColor;
|
|
27
30
|
private currentDurationValue;
|
|
28
31
|
private currentPositionValue;
|
|
@@ -47,13 +50,11 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
47
50
|
private userDisabled;
|
|
48
51
|
private userKeepVisible;
|
|
49
52
|
private verticalVolume;
|
|
50
|
-
private $audioTracksSelector;
|
|
51
53
|
private $clipText;
|
|
52
54
|
private $clipTextContainer;
|
|
53
55
|
private $duration;
|
|
54
56
|
private $fullscreenToggle;
|
|
55
57
|
private $multiCameraSelector;
|
|
56
|
-
private $pip;
|
|
57
58
|
private $playPauseToggle;
|
|
58
59
|
private $playStopToggle;
|
|
59
60
|
private $playbackRate;
|
|
@@ -226,13 +227,14 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
226
227
|
* ```
|
|
227
228
|
*/
|
|
228
229
|
getElement(name: MediaControlElement): ZeptoResult | null;
|
|
229
|
-
putElement(name: MediaControlElement, element:
|
|
230
|
+
putElement(name: MediaControlElement, element: ZeptoResult): void;
|
|
231
|
+
handleCustomArea(handler: (name: string, content: HTMLElement) => void): void;
|
|
230
232
|
/**
|
|
231
233
|
* Toggle the visibility of a media control element
|
|
232
234
|
* @param name - The name of the media control element
|
|
233
235
|
* @param show - Whether to show or hide the element
|
|
234
236
|
*/
|
|
235
|
-
toggleElement(
|
|
237
|
+
toggleElement(area: MediaControlElement, show: boolean): void;
|
|
236
238
|
private getRightPanel;
|
|
237
239
|
private getLeftPanel;
|
|
238
240
|
private getCenterPanel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,YAAY,EAMZ,IAAI,EACL,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,aAAa,GACb,IAAI,GACJ,UAAU,GACV,KAAK,GACL,UAAU,GACV,MAAM,GACN,KAAK,GACL,cAAc,GACd,UAAU,GACV,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,13 +21,23 @@ import fullscreenOffIcon from '../../../assets/icons/new/fullscreen-off.svg';
|
|
|
21
21
|
import fullscreenOnIcon from '../../../assets/icons/new/fullscreen-on.svg';
|
|
22
22
|
const DEFAULT_SETTINGS = {
|
|
23
23
|
left: [],
|
|
24
|
-
right: [
|
|
24
|
+
right: [
|
|
25
|
+
'fullscreen',
|
|
26
|
+
'pip',
|
|
27
|
+
'gear',
|
|
28
|
+
'cc',
|
|
29
|
+
'multicamera',
|
|
30
|
+
// 'playbackrate',
|
|
31
|
+
'vr',
|
|
32
|
+
'audiotracks',
|
|
33
|
+
],
|
|
25
34
|
default: [],
|
|
26
35
|
seekEnabled: true,
|
|
27
36
|
};
|
|
28
37
|
/**
|
|
29
38
|
* Custom events emitted by the plugins to communicate with one another
|
|
30
39
|
* @beta
|
|
40
|
+
* @deprecated
|
|
31
41
|
*/
|
|
32
42
|
export var MediaControlEvents;
|
|
33
43
|
(function (MediaControlEvents) {
|
|
@@ -40,7 +50,6 @@ const T = 'plugins.media_control';
|
|
|
40
50
|
const LEFT_ORDER = [
|
|
41
51
|
'playpause',
|
|
42
52
|
'playstop',
|
|
43
|
-
// 'live',
|
|
44
53
|
'dvr',
|
|
45
54
|
'volume',
|
|
46
55
|
'position',
|
|
@@ -61,6 +70,8 @@ function orderByOrderPattern(arr, order) {
|
|
|
61
70
|
*/
|
|
62
71
|
export class MediaControl extends UICorePlugin {
|
|
63
72
|
// private advertisementPlaying = false
|
|
73
|
+
customAreaElements = {};
|
|
74
|
+
customAreaHandler;
|
|
64
75
|
buttonsColor = null;
|
|
65
76
|
currentDurationValue = 0;
|
|
66
77
|
currentPositionValue = 0;
|
|
@@ -85,13 +96,11 @@ export class MediaControl extends UICorePlugin {
|
|
|
85
96
|
userDisabled = false;
|
|
86
97
|
userKeepVisible = false;
|
|
87
98
|
verticalVolume = false;
|
|
88
|
-
$audioTracksSelector = null;
|
|
89
99
|
$clipText = null;
|
|
90
100
|
$clipTextContainer = null;
|
|
91
101
|
$duration = null;
|
|
92
102
|
$fullscreenToggle = null;
|
|
93
103
|
$multiCameraSelector = null;
|
|
94
|
-
$pip = null;
|
|
95
104
|
$playPauseToggle = null;
|
|
96
105
|
$playStopToggle = null;
|
|
97
106
|
$playbackRate = null;
|
|
@@ -571,18 +580,22 @@ export class MediaControl extends UICorePlugin {
|
|
|
571
580
|
seekTimePlugin?.$el.find('span').addClass('gcore-skin-text-color');
|
|
572
581
|
}
|
|
573
582
|
showVolumeBar() {
|
|
574
|
-
|
|
583
|
+
if (this.hideVolumeId) {
|
|
584
|
+
clearTimeout(this.hideVolumeId);
|
|
585
|
+
}
|
|
575
586
|
this.$volumeBarContainer?.removeClass('volume-bar-hide');
|
|
576
587
|
}
|
|
577
588
|
hideVolumeBar(timeout = 400) {
|
|
578
589
|
if (!this.$volumeBarContainer) {
|
|
579
590
|
return;
|
|
580
591
|
}
|
|
592
|
+
if (this.hideVolumeId) {
|
|
593
|
+
clearTimeout(this.hideVolumeId);
|
|
594
|
+
}
|
|
581
595
|
if (this.draggingVolumeBar) {
|
|
582
596
|
this.hideVolumeId = setTimeout(() => this.hideVolumeBar(), timeout);
|
|
583
597
|
}
|
|
584
598
|
else {
|
|
585
|
-
this.hideVolumeId && clearTimeout(this.hideVolumeId);
|
|
586
599
|
this.hideVolumeId = setTimeout(() => this.$volumeBarContainer?.addClass('volume-bar-hide'), timeout);
|
|
587
600
|
}
|
|
588
601
|
}
|
|
@@ -734,16 +747,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
734
747
|
newSettings.left.push('dvr');
|
|
735
748
|
}
|
|
736
749
|
// actual order of the items appear rendered is controlled by CSS
|
|
737
|
-
newSettings.right =
|
|
738
|
-
'fullscreen',
|
|
739
|
-
'pip',
|
|
740
|
-
'gear',
|
|
741
|
-
'cc',
|
|
742
|
-
'multicamera',
|
|
743
|
-
'playbackrate',
|
|
744
|
-
'vr',
|
|
745
|
-
'audiotracks',
|
|
746
|
-
];
|
|
750
|
+
newSettings.right = DEFAULT_SETTINGS.right;
|
|
747
751
|
if ((!this.fullScreenOnVideoTagSupported &&
|
|
748
752
|
!Fullscreen.fullscreenEnabled()) ||
|
|
749
753
|
this.options.fullscreenDisable) {
|
|
@@ -828,10 +832,10 @@ export class MediaControl extends UICorePlugin {
|
|
|
828
832
|
trace(`${T} putElement`, { name, panel: !!panel });
|
|
829
833
|
if (panel) {
|
|
830
834
|
const current = panel.find(`[data-${name}]`);
|
|
831
|
-
element.
|
|
835
|
+
element.attr(`data-${name}`, '');
|
|
832
836
|
// TODO test
|
|
833
837
|
if (current.length) {
|
|
834
|
-
if (current[0] === element) {
|
|
838
|
+
if (current[0] === element[0]) {
|
|
835
839
|
return;
|
|
836
840
|
}
|
|
837
841
|
current.replaceWith(element);
|
|
@@ -839,15 +843,23 @@ export class MediaControl extends UICorePlugin {
|
|
|
839
843
|
else {
|
|
840
844
|
panel.append(element);
|
|
841
845
|
}
|
|
846
|
+
return;
|
|
842
847
|
}
|
|
843
848
|
}
|
|
849
|
+
handleCustomArea(handler) {
|
|
850
|
+
this.customAreaHandler = handler;
|
|
851
|
+
Object.entries(this.customAreaElements).forEach(([name, element]) => {
|
|
852
|
+
handler(name, element);
|
|
853
|
+
});
|
|
854
|
+
this.customAreaElements = {};
|
|
855
|
+
}
|
|
844
856
|
/**
|
|
845
857
|
* Toggle the visibility of a media control element
|
|
846
858
|
* @param name - The name of the media control element
|
|
847
859
|
* @param show - Whether to show or hide the element
|
|
848
860
|
*/
|
|
849
|
-
toggleElement(
|
|
850
|
-
this.$el.find(`[data-${
|
|
861
|
+
toggleElement(area, show) {
|
|
862
|
+
this.$el.find(`[data-${area}]`).toggle(show);
|
|
851
863
|
}
|
|
852
864
|
getRightPanel() {
|
|
853
865
|
return this.$el.find('.media-control-right-panel');
|
|
@@ -1005,6 +1017,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
1005
1017
|
* @internal
|
|
1006
1018
|
*/
|
|
1007
1019
|
render() {
|
|
1020
|
+
trace(`${T} render`);
|
|
1008
1021
|
const timeout = this.options.hideMediaControlDelay || 2000;
|
|
1009
1022
|
const html = MediaControl.template({ settings: this.settings ?? {} });
|
|
1010
1023
|
this.$el.html(html);
|
|
@@ -1053,6 +1066,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
1053
1066
|
this.core.$el.append(this.el);
|
|
1054
1067
|
this.rendered = true;
|
|
1055
1068
|
this.updateVolumeUI();
|
|
1069
|
+
// TODO setTimeout
|
|
1056
1070
|
this.trigger(Events.MEDIACONTROL_RENDERED);
|
|
1057
1071
|
return this;
|
|
1058
1072
|
}
|
|
@@ -1125,6 +1139,12 @@ export class MediaControl extends UICorePlugin {
|
|
|
1125
1139
|
return isFinite(this.core.activePlayback.getDuration());
|
|
1126
1140
|
}
|
|
1127
1141
|
getElementLocation(name) {
|
|
1142
|
+
trace(`${T} getElementLocation`, {
|
|
1143
|
+
name,
|
|
1144
|
+
right: this.settings.right,
|
|
1145
|
+
left: this.settings.left,
|
|
1146
|
+
default: this.settings.default,
|
|
1147
|
+
});
|
|
1128
1148
|
if (this.settings.right?.includes(name)) {
|
|
1129
1149
|
return this.getRightPanel();
|
|
1130
1150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;AAOxD;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,cAAc,CAAwB;IAErD;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED,IAAa,UAAU;;MAItB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACM,UAAU;IAQnB,OAAO,CAAC,cAAc;IAStB;;OAEG;IACM,MAAM;IAef,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;CAI7B"}
|
|
@@ -4,6 +4,7 @@ import { CLAPPR_VERSION } from '../../build.js';
|
|
|
4
4
|
import pipIcon from '../../../assets/icons/new/pip.svg';
|
|
5
5
|
import buttonHtml from '../../../assets/picture-in-picture/button.ejs';
|
|
6
6
|
import '../../../assets/picture-in-picture/button.scss';
|
|
7
|
+
import assert from 'assert';
|
|
7
8
|
const VERSION = '0.0.1';
|
|
8
9
|
const T = `plugins.pip`;
|
|
9
10
|
/**
|
|
@@ -56,7 +57,11 @@ export class PictureInPicture extends UICorePlugin {
|
|
|
56
57
|
* @internal
|
|
57
58
|
*/
|
|
58
59
|
bindEvents() {
|
|
59
|
-
this.
|
|
60
|
+
this.listenToOnce(this.core, Events.CORE_READY, () => {
|
|
61
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
62
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
63
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
|
|
64
|
+
});
|
|
60
65
|
}
|
|
61
66
|
isPiPSupported() {
|
|
62
67
|
trace(`${T} isPiPSupported`, {
|
|
@@ -75,7 +80,7 @@ export class PictureInPicture extends UICorePlugin {
|
|
|
75
80
|
this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
|
|
76
81
|
const mediaControl = this.core.getPlugin('media_control');
|
|
77
82
|
if (mediaControl) {
|
|
78
|
-
mediaControl.putElement('pip', this
|
|
83
|
+
mediaControl.putElement('pip', this.$el);
|
|
79
84
|
}
|
|
80
85
|
return this;
|
|
81
86
|
}
|