@gcorevideo/player 2.22.3 → 2.22.5
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 +4 -2
- package/assets/audio-selector/track-selector.ejs +2 -2
- package/assets/level-selector/button.ejs +1 -1
- package/assets/level-selector/list.ejs +10 -4
- package/assets/level-selector/style.scss +8 -3
- package/dist/core.js +1 -1
- package/dist/index.css +1435 -1429
- package/dist/index.js +402 -419
- package/dist/plugins/index.css +1192 -1186
- package/dist/plugins/index.js +428 -438
- package/lib/index.plugins.d.ts +3 -1
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +3 -1
- package/lib/plugins/audio-selector/AudioSelector.d.ts +3 -9
- package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.js +34 -57
- package/lib/plugins/level-selector/LevelSelector.d.ts +6 -5
- package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
- package/lib/plugins/level-selector/LevelSelector.js +11 -8
- package/lib/plugins/level-selector/QualityLevels.d.ts +112 -0
- package/lib/plugins/level-selector/QualityLevels.d.ts.map +1 -0
- package/lib/plugins/level-selector/QualityLevels.js +280 -0
- package/lib/plugins/vast-ads/VastAds.d.ts +1 -0
- package/lib/plugins/vast-ads/VastAds.d.ts.map +1 -1
- package/lib/plugins/vast-ads/VastAds.js +6 -3
- package/lib/testUtils.d.ts +2 -0
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +2 -0
- package/package.json +1 -1
- package/src/index.plugins.ts +3 -1
- package/src/plugins/audio-selector/AudioSelector.ts +36 -72
- package/src/plugins/audio-selector/__tests__/AudioSelector.test.ts +176 -0
- package/src/plugins/audio-selector/__tests__/__snapshots__/AudioSelector.test.ts.snap +67 -0
- package/src/plugins/level-selector/{LevelSelector.ts → QualityLevels.ts} +19 -13
- package/src/plugins/level-selector/__tests__/{LevelSelector.test.ts → QualityLevels.test.ts} +20 -6
- package/src/plugins/level-selector/__tests__/__snapshots__/{LevelSelector.test.ts.snap → QualityLevels.test.ts.snap} +58 -25
- package/src/plugins/vast-ads/VastAds.ts +8 -4
- package/src/testUtils.ts +2 -0
- package/tsconfig.tsbuildinfo +1 -1
package/lib/index.plugins.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import '../assets/style/main.scss';
|
|
2
2
|
export * from "./plugins/audio-selector/AudioSelector.js";
|
|
3
|
+
export { AudioTracks as AudioSelector } from "./plugins/audio-selector/AudioSelector.js";
|
|
3
4
|
export * from "./plugins/big-mute-button/BigMuteButton.js";
|
|
4
5
|
export * from "./plugins/bottom-gear/BottomGear.js";
|
|
5
6
|
export * from "./plugins/clappr-nerd-stats/ClapprNerdStats.js";
|
|
@@ -11,13 +12,14 @@ export * from "./plugins/dvr-controls/DvrControls.js";
|
|
|
11
12
|
export * from "./plugins/error-screen/ErrorScreen.js";
|
|
12
13
|
export * from "./plugins/favicon/Favicon.js";
|
|
13
14
|
export * from "./plugins/google-analytics/GoogleAnalytics.js";
|
|
14
|
-
export * from "./plugins/level-selector/LevelSelector.js";
|
|
15
15
|
export * from "./plugins/logo/Logo.js";
|
|
16
16
|
export * from "./plugins/media-control/MediaControl.js";
|
|
17
17
|
export * from "./plugins/multi-camera/MultiCamera.js";
|
|
18
18
|
export * from "./plugins/picture-in-picture/PictureInPicture.js";
|
|
19
19
|
export * from "./plugins/playback-rate/PlaybackRate.js";
|
|
20
20
|
export * from "./plugins/poster/Poster.js";
|
|
21
|
+
export * from "./plugins/level-selector/QualityLevels.js";
|
|
22
|
+
export { QualityLevels as LevelSelector } from "./plugins/level-selector/QualityLevels.js";
|
|
21
23
|
export * from "./plugins/seek-time/SeekTime.js";
|
|
22
24
|
export * from "./plugins/share/Share.js";
|
|
23
25
|
export * from "./plugins/skip-time/SkipTime.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.plugins.d.ts","sourceRoot":"","sources":["../src/index.plugins.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AAEnC,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,
|
|
1
|
+
{"version":3,"file":"index.plugins.d.ts","sourceRoot":"","sources":["../src/index.plugins.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AAEnC,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAC;AACzF,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wBAAwB,CAAC;AACvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC3F,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sDAAsD,CAAC;AACrE,OAAO,EAAE,kBAAkB,IAAI,OAAO,EAAE,MAAM,sDAAsD,CAAC;AACrG,cAAc,iDAAiD,CAAC;AAChE,cAAc,uCAAuC,CAAC;AACtD,OAAO,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,uCAAuC,CAAC;AACpF,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AAGnD,cAAc,qCAAqC,CAAC"}
|
package/lib/index.plugins.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import '../assets/style/main.scss';
|
|
2
2
|
export * from "./plugins/audio-selector/AudioSelector.js";
|
|
3
|
+
export { AudioTracks as AudioSelector } from "./plugins/audio-selector/AudioSelector.js";
|
|
3
4
|
export * from "./plugins/big-mute-button/BigMuteButton.js";
|
|
4
5
|
export * from "./plugins/bottom-gear/BottomGear.js";
|
|
5
6
|
export * from "./plugins/clappr-nerd-stats/ClapprNerdStats.js";
|
|
@@ -12,13 +13,14 @@ export * from "./plugins/error-screen/ErrorScreen.js";
|
|
|
12
13
|
export * from "./plugins/favicon/Favicon.js";
|
|
13
14
|
// _ ga-events
|
|
14
15
|
export * from "./plugins/google-analytics/GoogleAnalytics.js";
|
|
15
|
-
export * from "./plugins/level-selector/LevelSelector.js";
|
|
16
16
|
export * from "./plugins/logo/Logo.js";
|
|
17
17
|
export * from "./plugins/media-control/MediaControl.js";
|
|
18
18
|
export * from "./plugins/multi-camera/MultiCamera.js";
|
|
19
19
|
export * from "./plugins/picture-in-picture/PictureInPicture.js";
|
|
20
20
|
export * from "./plugins/playback-rate/PlaybackRate.js";
|
|
21
21
|
export * from "./plugins/poster/Poster.js";
|
|
22
|
+
export * from "./plugins/level-selector/QualityLevels.js";
|
|
23
|
+
export { QualityLevels as LevelSelector } from "./plugins/level-selector/QualityLevels.js";
|
|
22
24
|
export * from "./plugins/seek-time/SeekTime.js";
|
|
23
25
|
export * from "./plugins/share/Share.js";
|
|
24
26
|
export * from "./plugins/skip-time/SkipTime.js";
|
|
@@ -10,7 +10,7 @@ import '../../../assets/audio-selector/style.scss';
|
|
|
10
10
|
*
|
|
11
11
|
* - {@link MediaControl}
|
|
12
12
|
*/
|
|
13
|
-
export declare class
|
|
13
|
+
export declare class AudioTracks extends UICorePlugin {
|
|
14
14
|
private currentTrack;
|
|
15
15
|
private tracks;
|
|
16
16
|
/**
|
|
@@ -39,28 +39,22 @@ export declare class AudioSelector extends UICorePlugin {
|
|
|
39
39
|
*/
|
|
40
40
|
get events(): {
|
|
41
41
|
'click [data-audiotracks-select]': string;
|
|
42
|
-
'click
|
|
42
|
+
'click #audiotracks-button': string;
|
|
43
43
|
};
|
|
44
44
|
/**
|
|
45
45
|
* @internal
|
|
46
46
|
*/
|
|
47
47
|
bindEvents(): void;
|
|
48
48
|
private onCoreReady;
|
|
49
|
-
private bindPlaybackEvents;
|
|
50
|
-
private setupAudioTrackListeners;
|
|
51
|
-
private onStop;
|
|
52
49
|
private onActiveContainerChanged;
|
|
53
50
|
private shouldRender;
|
|
54
51
|
/**
|
|
55
52
|
* @internal
|
|
56
53
|
*/
|
|
57
54
|
render(): this;
|
|
58
|
-
private fillTracks;
|
|
59
|
-
private findTrackBy;
|
|
60
55
|
private onTrackSelect;
|
|
61
56
|
private selectAudioTrack;
|
|
62
|
-
private
|
|
63
|
-
private hideSelectTrackMenu;
|
|
57
|
+
private hideMenu;
|
|
64
58
|
private toggleContextMenu;
|
|
65
59
|
private buttonElement;
|
|
66
60
|
private buttonElementText;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/audio-selector/AudioSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAY,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"AudioSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/audio-selector/AudioSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAY,MAAM,cAAc,CAAA;AAO7D,OAAO,2CAA2C,CAAA;AASlD;;;;;;;;;GASG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,YAAY,CAA0B;IAE9C,OAAO,CAAC,MAAM,CAAmB;IAEjC;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACM,MAAM;IAmBf,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,qBAAqB;CAW9B"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Events, UICorePlugin, template } from '@clappr/core';
|
|
2
|
-
import { trace } from '@gcorevideo/utils';
|
|
3
2
|
import assert from 'assert';
|
|
4
3
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
5
4
|
import pluginHtml from '../../../assets/audio-selector/track-selector.ejs';
|
|
6
5
|
import '../../../assets/audio-selector/style.scss';
|
|
7
6
|
import audioArrow from '../../../assets/icons/old/quality-arrow.svg';
|
|
8
|
-
const VERSION = '
|
|
9
|
-
const T = 'plugins.
|
|
7
|
+
const VERSION = '2.22.4';
|
|
8
|
+
// const T = 'plugins.audiotracks'
|
|
10
9
|
/**
|
|
11
10
|
* `PLUGIN` that makes possible to switch audio tracks via the media control UI.
|
|
12
11
|
* @beta
|
|
@@ -17,14 +16,14 @@ const T = 'plugins.audio_selector';
|
|
|
17
16
|
*
|
|
18
17
|
* - {@link MediaControl}
|
|
19
18
|
*/
|
|
20
|
-
export class
|
|
19
|
+
export class AudioTracks extends UICorePlugin {
|
|
21
20
|
currentTrack = null;
|
|
22
21
|
tracks = [];
|
|
23
22
|
/**
|
|
24
23
|
* @internal
|
|
25
24
|
*/
|
|
26
25
|
get name() {
|
|
27
|
-
return 'audio_selector';
|
|
26
|
+
return 'audio_selector'; // TODO rename to audiotracks
|
|
28
27
|
}
|
|
29
28
|
/**
|
|
30
29
|
* @internal
|
|
@@ -53,58 +52,43 @@ export class AudioSelector extends UICorePlugin {
|
|
|
53
52
|
get events() {
|
|
54
53
|
return {
|
|
55
54
|
'click [data-audiotracks-select]': 'onTrackSelect',
|
|
56
|
-
'click
|
|
55
|
+
'click #audiotracks-button': 'toggleContextMenu',
|
|
57
56
|
};
|
|
58
57
|
}
|
|
59
58
|
/**
|
|
60
59
|
* @internal
|
|
61
60
|
*/
|
|
62
61
|
bindEvents() {
|
|
63
|
-
this.
|
|
62
|
+
this.listenToOnce(this.core, Events.CORE_READY, this.onCoreReady);
|
|
64
63
|
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
65
64
|
}
|
|
66
65
|
onCoreReady() {
|
|
67
|
-
trace(`${T} onCoreReady`);
|
|
68
66
|
const mediaControl = this.core.getPlugin('media_control');
|
|
69
67
|
assert(mediaControl, 'media_control plugin is required');
|
|
70
|
-
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED,
|
|
71
|
-
|
|
68
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, () => {
|
|
69
|
+
mediaControl.putElement('audiotracks', this.$el);
|
|
70
|
+
});
|
|
71
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_HIDE, this.hideMenu);
|
|
72
72
|
}
|
|
73
|
-
|
|
74
|
-
trace(`${T} bindPlaybackEvents`);
|
|
73
|
+
onActiveContainerChanged() {
|
|
75
74
|
this.currentTrack = null;
|
|
76
|
-
this.listenTo(this.core.
|
|
77
|
-
this.setupAudioTrackListeners();
|
|
78
|
-
}
|
|
79
|
-
setupAudioTrackListeners() {
|
|
80
|
-
this.listenTo(this.core.activePlayback, Events.PLAYBACK_AUDIO_AVAILABLE, (tracks) => {
|
|
81
|
-
trace(`${T} on PLAYBACK_AUDIO_AVAILABLE`, { audioTracks: tracks });
|
|
75
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_AUDIO_AVAILABLE, (tracks) => {
|
|
82
76
|
this.currentTrack =
|
|
83
|
-
tracks.find((track) => track.kind === 'main') ?? null;
|
|
84
|
-
this.
|
|
77
|
+
tracks.find((track) => track.kind === 'main') ?? null; // TODO test
|
|
78
|
+
this.tracks = tracks;
|
|
79
|
+
this.render();
|
|
85
80
|
});
|
|
86
|
-
this.listenTo(this.core.
|
|
87
|
-
trace(`${T} PLAYBACK_AUDIO_CHANGED`, { audioTrack: track });
|
|
81
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_AUDIO_CHANGED, (track) => {
|
|
88
82
|
this.currentTrack = track;
|
|
89
83
|
this.highlightCurrentTrack();
|
|
90
84
|
this.buttonElement().removeClass('changing');
|
|
91
85
|
this.updateText();
|
|
92
86
|
});
|
|
93
87
|
}
|
|
94
|
-
onStop() {
|
|
95
|
-
trace(`${T} onStop`);
|
|
96
|
-
}
|
|
97
|
-
onActiveContainerChanged() {
|
|
98
|
-
trace(`${T} onActiveContainerChanged`);
|
|
99
|
-
this.bindPlaybackEvents();
|
|
100
|
-
}
|
|
101
88
|
shouldRender() {
|
|
102
|
-
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
this.tracks = this.core.activePlayback.audioTracks;
|
|
89
|
+
// Render is called from the parent class constructor so tracks aren't available
|
|
106
90
|
// Only care if we have at least 2 to choose from
|
|
107
|
-
return this.tracks
|
|
91
|
+
return this.tracks?.length > 1;
|
|
108
92
|
}
|
|
109
93
|
/**
|
|
110
94
|
* @internal
|
|
@@ -114,44 +98,34 @@ export class AudioSelector extends UICorePlugin {
|
|
|
114
98
|
return this;
|
|
115
99
|
}
|
|
116
100
|
const mediaControl = this.core.getPlugin('media_control');
|
|
117
|
-
this.$el.html(
|
|
118
|
-
|
|
119
|
-
|
|
101
|
+
this.$el.html(AudioTracks.template({
|
|
102
|
+
tracks: this.tracks,
|
|
103
|
+
title: this.getTitle(),
|
|
104
|
+
icon: audioArrow,
|
|
105
|
+
}));
|
|
120
106
|
this.updateText();
|
|
121
107
|
this.highlightCurrentTrack();
|
|
122
108
|
return this;
|
|
123
109
|
}
|
|
124
|
-
fillTracks(tracks) {
|
|
125
|
-
this.tracks = tracks;
|
|
126
|
-
this.render();
|
|
127
|
-
}
|
|
128
|
-
findTrackBy(id) {
|
|
129
|
-
return this.tracks.find((track) => track.id === id);
|
|
130
|
-
}
|
|
131
110
|
onTrackSelect(event) {
|
|
132
111
|
const id = event.target?.dataset?.audiotracksSelect;
|
|
133
112
|
if (id) {
|
|
134
113
|
this.selectAudioTrack(id);
|
|
135
114
|
}
|
|
136
|
-
this.
|
|
115
|
+
this.hideMenu();
|
|
137
116
|
event.stopPropagation();
|
|
138
117
|
return false;
|
|
139
118
|
}
|
|
140
119
|
selectAudioTrack(id) {
|
|
141
120
|
this.startTrackSwitch();
|
|
142
|
-
this.core.
|
|
121
|
+
this.core.activeContainer.switchAudioTrack(id);
|
|
143
122
|
this.updateText();
|
|
144
123
|
}
|
|
145
|
-
|
|
146
|
-
this.
|
|
147
|
-
}
|
|
148
|
-
hideSelectTrackMenu() {
|
|
149
|
-
;
|
|
150
|
-
this.$('ul').hide();
|
|
124
|
+
hideMenu() {
|
|
125
|
+
this.$el.find('#audiotracks-select').addClass('hidden');
|
|
151
126
|
}
|
|
152
127
|
toggleContextMenu() {
|
|
153
|
-
;
|
|
154
|
-
this.$('ul').toggle();
|
|
128
|
+
this.$el.find('#audiotracks-select').toggleClass('hidden');
|
|
155
129
|
}
|
|
156
130
|
buttonElement() {
|
|
157
131
|
return this.$('button');
|
|
@@ -160,11 +134,14 @@ export class AudioSelector extends UICorePlugin {
|
|
|
160
134
|
return this.$('button .audio-text');
|
|
161
135
|
}
|
|
162
136
|
trackElement(id) {
|
|
163
|
-
return this.$('
|
|
164
|
-
(id !== undefined ?
|
|
137
|
+
return this.$('#audiotracks-select a' +
|
|
138
|
+
(id !== undefined ? `[data-audiotracks-select="${id}"]` : '')).parent();
|
|
165
139
|
}
|
|
166
140
|
getTitle() {
|
|
167
|
-
|
|
141
|
+
if (!this.currentTrack) {
|
|
142
|
+
return '';
|
|
143
|
+
}
|
|
144
|
+
return this.currentTrack.label || this.currentTrack.language;
|
|
168
145
|
}
|
|
169
146
|
startTrackSwitch() {
|
|
170
147
|
this.buttonElement().addClass('changing');
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { UICorePlugin } from '@clappr/core';
|
|
2
2
|
import '../../../assets/level-selector/style.scss';
|
|
3
3
|
/**
|
|
4
|
-
* Configuration options for the {@link
|
|
4
|
+
* Configuration options for the {@link QualityLevels} plugin.
|
|
5
5
|
* @beta
|
|
6
6
|
*/
|
|
7
|
-
export interface
|
|
7
|
+
export interface QualityLevelsPluginSettings {
|
|
8
8
|
/**
|
|
9
9
|
* The maximum resolution to allow in the level selector.
|
|
10
10
|
*/
|
|
@@ -31,19 +31,19 @@ export interface LevelSelectorPluginSettings {
|
|
|
31
31
|
*
|
|
32
32
|
* The plugin is rendered as an item in the gear menu, which, when clicked, shows a list of quality levels to choose from.
|
|
33
33
|
*
|
|
34
|
-
* Configuration options - {@link
|
|
34
|
+
* Configuration options - {@link QualityLevelsPluginSettings}
|
|
35
35
|
*
|
|
36
36
|
* @example
|
|
37
37
|
* ```ts
|
|
38
38
|
* new Player({
|
|
39
|
-
*
|
|
39
|
+
* qualityLevels: {
|
|
40
40
|
* restrictResolution: 360,
|
|
41
41
|
* labels: { 360: 'SD', 720: 'HD' },
|
|
42
42
|
* },
|
|
43
43
|
* })
|
|
44
44
|
* ```
|
|
45
45
|
*/
|
|
46
|
-
export declare class
|
|
46
|
+
export declare class QualityLevels extends UICorePlugin {
|
|
47
47
|
private levels;
|
|
48
48
|
private levelLabels;
|
|
49
49
|
private removeAuto;
|
|
@@ -93,6 +93,7 @@ export declare class LevelSelector extends UICorePlugin {
|
|
|
93
93
|
render(): this;
|
|
94
94
|
private renderDropdown;
|
|
95
95
|
private updateButton;
|
|
96
|
+
private get pluginOptions();
|
|
96
97
|
private get maxLevel();
|
|
97
98
|
private onLevelsAvailable;
|
|
98
99
|
private makeLevelsLabels;
|
|
@@ -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,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
|
+
{"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,aAAa,GAExB;IAED,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"}
|
|
@@ -25,19 +25,19 @@ const VERSION = '2.19.4';
|
|
|
25
25
|
*
|
|
26
26
|
* The plugin is rendered as an item in the gear menu, which, when clicked, shows a list of quality levels to choose from.
|
|
27
27
|
*
|
|
28
|
-
* Configuration options - {@link
|
|
28
|
+
* Configuration options - {@link QualityLevelsPluginSettings}
|
|
29
29
|
*
|
|
30
30
|
* @example
|
|
31
31
|
* ```ts
|
|
32
32
|
* new Player({
|
|
33
|
-
*
|
|
33
|
+
* qualityLevels: {
|
|
34
34
|
* restrictResolution: 360,
|
|
35
35
|
* labels: { 360: 'SD', 720: 'HD' },
|
|
36
36
|
* },
|
|
37
37
|
* })
|
|
38
38
|
* ```
|
|
39
39
|
*/
|
|
40
|
-
export class
|
|
40
|
+
export class QualityLevels extends UICorePlugin {
|
|
41
41
|
levels = [];
|
|
42
42
|
levelLabels = [];
|
|
43
43
|
removeAuto = false;
|
|
@@ -156,7 +156,7 @@ export class LevelSelector extends UICorePlugin {
|
|
|
156
156
|
return this;
|
|
157
157
|
}
|
|
158
158
|
renderDropdown() {
|
|
159
|
-
this.$el.html(
|
|
159
|
+
this.$el.html(QualityLevels.listTemplate({
|
|
160
160
|
arrowLeftIcon,
|
|
161
161
|
checkIcon,
|
|
162
162
|
current: this.selectedLevelId,
|
|
@@ -171,7 +171,7 @@ export class LevelSelector extends UICorePlugin {
|
|
|
171
171
|
;
|
|
172
172
|
this.core.getPlugin('bottom_gear')
|
|
173
173
|
?.addItem('quality', this.$el)
|
|
174
|
-
.html(
|
|
174
|
+
.html(QualityLevels.buttonTemplate({
|
|
175
175
|
arrowRightIcon,
|
|
176
176
|
currentText: this.currentText,
|
|
177
177
|
isHd: this.isHd,
|
|
@@ -179,15 +179,18 @@ export class LevelSelector extends UICorePlugin {
|
|
|
179
179
|
i18n: this.core.i18n,
|
|
180
180
|
}));
|
|
181
181
|
}
|
|
182
|
+
get pluginOptions() {
|
|
183
|
+
return this.core.options.qualityLevels || this.core.options.levelSelector;
|
|
184
|
+
}
|
|
182
185
|
get maxLevel() {
|
|
183
|
-
const maxRes = this.
|
|
186
|
+
const maxRes = this.pluginOptions.restrictResolution;
|
|
184
187
|
return maxRes
|
|
185
188
|
? this.levels.find((level) => (level.height > level.width ? level.width : level.height) ===
|
|
186
189
|
maxRes)?.level ?? -1
|
|
187
190
|
: -1;
|
|
188
191
|
}
|
|
189
192
|
onLevelsAvailable(levels) {
|
|
190
|
-
const maxResolution = this.
|
|
193
|
+
const maxResolution = this.pluginOptions.restrictResolution;
|
|
191
194
|
this.levels = levels;
|
|
192
195
|
this.makeLevelsLabels();
|
|
193
196
|
if (maxResolution) {
|
|
@@ -201,7 +204,7 @@ export class LevelSelector extends UICorePlugin {
|
|
|
201
204
|
this.render();
|
|
202
205
|
}
|
|
203
206
|
makeLevelsLabels() {
|
|
204
|
-
const labels = this.
|
|
207
|
+
const labels = this.pluginOptions.labels ?? {};
|
|
205
208
|
this.levelLabels = [];
|
|
206
209
|
for (const level of this.levels) {
|
|
207
210
|
const ll = level.width > level.height ? level.height : level.width;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { UICorePlugin } from '@clappr/core';
|
|
2
|
+
import '../../../assets/level-selector/style.scss';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration options for the {@link QualityLevels} plugin.
|
|
5
|
+
* @beta
|
|
6
|
+
*/
|
|
7
|
+
export interface QualityLevelsPluginSettings {
|
|
8
|
+
/**
|
|
9
|
+
* The maximum resolution to allow in the level selector.
|
|
10
|
+
*/
|
|
11
|
+
restrictResolution?: number;
|
|
12
|
+
/**
|
|
13
|
+
* The labels to show in the level selector.
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* { 360: 'SD', 720: 'HD' }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
labels?: Record<number, string>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* `PLUGIN` that provides a UI to select the desired quality level of the playback.
|
|
23
|
+
* @beta
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
* Depends on:
|
|
27
|
+
*
|
|
28
|
+
* - {@link MediaControl}
|
|
29
|
+
*
|
|
30
|
+
* - {@link BottomGear}
|
|
31
|
+
*
|
|
32
|
+
* The plugin is rendered as an item in the gear menu, which, when clicked, shows a list of quality levels to choose from.
|
|
33
|
+
*
|
|
34
|
+
* Configuration options - {@link QualityLevelsPluginSettings}
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* new Player({
|
|
39
|
+
* qualityLevels: {
|
|
40
|
+
* restrictResolution: 360,
|
|
41
|
+
* labels: { 360: 'SD', 720: 'HD' },
|
|
42
|
+
* },
|
|
43
|
+
* })
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class QualityLevels extends UICorePlugin {
|
|
47
|
+
private levels;
|
|
48
|
+
private levelLabels;
|
|
49
|
+
private removeAuto;
|
|
50
|
+
private isHd;
|
|
51
|
+
private currentText;
|
|
52
|
+
private selectedLevelId;
|
|
53
|
+
private static readonly buttonTemplate;
|
|
54
|
+
private static readonly listTemplate;
|
|
55
|
+
/**
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
get name(): string;
|
|
59
|
+
/**
|
|
60
|
+
* @internal
|
|
61
|
+
*/
|
|
62
|
+
get supportedVersion(): {
|
|
63
|
+
min: string;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
static get version(): string;
|
|
69
|
+
/**
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
get attributes(): {
|
|
73
|
+
class: string;
|
|
74
|
+
'data-level-selector': string;
|
|
75
|
+
};
|
|
76
|
+
get events(): {
|
|
77
|
+
'click .gear-sub-menu_btn': string;
|
|
78
|
+
'click .go-back': string;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
bindEvents(): void;
|
|
84
|
+
private onCoreReady;
|
|
85
|
+
private onGearRendered;
|
|
86
|
+
private onActiveContainerChange;
|
|
87
|
+
private updateHd;
|
|
88
|
+
private onStop;
|
|
89
|
+
private shouldRender;
|
|
90
|
+
/**
|
|
91
|
+
* @internal
|
|
92
|
+
*/
|
|
93
|
+
render(): this;
|
|
94
|
+
private renderDropdown;
|
|
95
|
+
private updateButton;
|
|
96
|
+
private get pluginOptions();
|
|
97
|
+
private get maxLevel();
|
|
98
|
+
private onLevelsAvailable;
|
|
99
|
+
private makeLevelsLabels;
|
|
100
|
+
private onSelect;
|
|
101
|
+
private goBack;
|
|
102
|
+
private setLevel;
|
|
103
|
+
private allLevelElements;
|
|
104
|
+
private levelElement;
|
|
105
|
+
private onLevelSwitchStart;
|
|
106
|
+
private onLevelSwitchEnd;
|
|
107
|
+
private updateText;
|
|
108
|
+
private getLevelLabel;
|
|
109
|
+
private onBitrate;
|
|
110
|
+
private highlightCurrentLevel;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=QualityLevels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QualityLevels.d.ts","sourceRoot":"","sources":["../../../src/plugins/level-selector/QualityLevels.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,aAAa,GAIxB;IAED,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"}
|