@gcorevideo/player 2.28.20 → 2.28.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.js +1 -1
- package/dist/index.css +442 -442
- package/dist/index.embed.js +2805 -210
- package/dist/index.js +2806 -211
- package/lib/plugins/audio-selector/AudioTracks.d.ts +2 -0
- package/lib/plugins/audio-selector/AudioTracks.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioTracks.js +11 -0
- package/lib/plugins/bottom-gear/BottomGear.d.ts +2 -0
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +11 -0
- package/lib/plugins/media-control/MediaControl.d.ts +10 -0
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +20 -23
- package/lib/plugins/subtitles/ClosedCaptions.d.ts +2 -0
- package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
- package/lib/plugins/subtitles/ClosedCaptions.js +11 -0
- package/lib/plugins/thumbnails/Thumbnails.d.ts +1 -1
- package/lib/plugins/thumbnails/Thumbnails.js +23 -3
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +2 -0
- package/lib/utils/clickaway.d.ts +15 -0
- package/lib/utils/clickaway.d.ts.map +1 -0
- package/lib/utils/clickaway.js +40 -0
- package/package.json +3 -2
- package/src/plugins/audio-selector/AudioTracks.ts +15 -1
- package/src/plugins/bottom-gear/BottomGear.ts +13 -0
- package/src/plugins/media-control/MediaControl.ts +20 -25
- package/src/plugins/subtitles/ClosedCaptions.ts +13 -0
- package/src/plugins/thumbnails/Thumbnails.ts +35 -4
- package/src/plugins/thumbnails/__tests__/Thumbnails.test.ts +108 -53
- package/src/plugins/thumbnails/__tests__/__snapshots__/Thumbnails.test.ts.snap +37 -1
- package/src/testUtils.ts +2 -0
- package/src/utils/clickaway.ts +43 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/src/plugins/typings/parse-srt.d.ts +0 -14
|
@@ -56,6 +56,7 @@ export declare class AudioTracks extends UICorePlugin {
|
|
|
56
56
|
private selectAudioTrack;
|
|
57
57
|
private hideMenu;
|
|
58
58
|
private toggleMenu;
|
|
59
|
+
private setKeepVisible;
|
|
59
60
|
private buttonElement;
|
|
60
61
|
private buttonElementText;
|
|
61
62
|
private trackElement;
|
|
@@ -64,5 +65,6 @@ export declare class AudioTracks extends UICorePlugin {
|
|
|
64
65
|
private updateText;
|
|
65
66
|
private highlightCurrentTrack;
|
|
66
67
|
private mount;
|
|
68
|
+
private clickaway;
|
|
67
69
|
}
|
|
68
70
|
//# sourceMappingURL=AudioTracks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioTracks.d.ts","sourceRoot":"","sources":["../../../src/plugins/audio-selector/AudioTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAY,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"AudioTracks.d.ts","sourceRoot":"","sources":["../../../src/plugins/audio-selector/AudioTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAY,MAAM,cAAc,CAAA;AAiB7D;;;;;;;;;GASG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,YAAY,CAA0B;IAE9C,OAAO,CAAC,IAAI,CAAQ;IAEpB,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;IAoBnB,OAAO,CAAC,wBAAwB;IAgChC,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACM,MAAM;IAgBf,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,SAAS,CAA+C;CACjE"}
|
|
@@ -5,6 +5,7 @@ import { CLAPPR_VERSION } from '../../build.js';
|
|
|
5
5
|
import pluginHtml from '../../../assets/audio-tracks/template.ejs';
|
|
6
6
|
import audioArrow from '../../../assets/icons/old/quality-arrow.svg';
|
|
7
7
|
import { ExtendedEvents } from '../media-control/MediaControl.js';
|
|
8
|
+
import { mediaControlClickaway } from '../../utils/clickaway.js';
|
|
8
9
|
const VERSION = '2.22.4';
|
|
9
10
|
// const T = 'plugins.audiotracks'
|
|
10
11
|
/**
|
|
@@ -97,6 +98,9 @@ export class AudioTracks extends UICorePlugin {
|
|
|
97
98
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_CLICK, () => {
|
|
98
99
|
this.hideMenu();
|
|
99
100
|
});
|
|
101
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_DESTROYED, () => {
|
|
102
|
+
this.clickaway(null);
|
|
103
|
+
});
|
|
100
104
|
}
|
|
101
105
|
shouldRender() {
|
|
102
106
|
// Render is called from the parent class constructor so tracks aren't available
|
|
@@ -136,6 +140,7 @@ export class AudioTracks extends UICorePlugin {
|
|
|
136
140
|
this.open = false;
|
|
137
141
|
this.$el.find('#gplayer-audiotracks-menu').hide();
|
|
138
142
|
this.$el.find('#gplayer-audiotracks-button').attr('aria-expanded', 'false');
|
|
143
|
+
this.setKeepVisible(false);
|
|
139
144
|
}
|
|
140
145
|
toggleMenu() {
|
|
141
146
|
this.open = !this.open;
|
|
@@ -151,6 +156,11 @@ export class AudioTracks extends UICorePlugin {
|
|
|
151
156
|
this.$el
|
|
152
157
|
.find('#gplayer-audiotracks-button')
|
|
153
158
|
.attr('aria-expanded', this.open);
|
|
159
|
+
this.setKeepVisible(this.open);
|
|
160
|
+
}
|
|
161
|
+
setKeepVisible(keepVisible) {
|
|
162
|
+
this.core.getPlugin('media_control').setKeepVisible(keepVisible);
|
|
163
|
+
this.clickaway(keepVisible ? this.core.activeContainer.$el[0] : null);
|
|
154
164
|
}
|
|
155
165
|
buttonElement() {
|
|
156
166
|
return this.$('#gplayer-audiotracks-button');
|
|
@@ -196,4 +206,5 @@ export class AudioTracks extends UICorePlugin {
|
|
|
196
206
|
this.core.getPlugin('media_control')?.slot('audiotracks', this.$el);
|
|
197
207
|
}
|
|
198
208
|
}
|
|
209
|
+
clickaway = mediaControlClickaway(() => this.hideMenu());
|
|
199
210
|
}
|
|
@@ -152,10 +152,12 @@ export declare class BottomGear extends UICorePlugin {
|
|
|
152
152
|
refresh(): void;
|
|
153
153
|
private collapseSubmenus;
|
|
154
154
|
private toggleMenu;
|
|
155
|
+
private setKeepVisible;
|
|
155
156
|
private collapse;
|
|
156
157
|
private onCoreReady;
|
|
157
158
|
private onMediaControlRendered;
|
|
158
159
|
private mount;
|
|
159
160
|
private clampPopup;
|
|
161
|
+
private clickaway;
|
|
160
162
|
}
|
|
161
163
|
//# sourceMappingURL=BottomGear.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAKb,MAAM,cAAc,CAAA;AAOrB,OAAO,uCAAuC,CAAA;AAC9C,OAAO,gDAAgD,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAKb,MAAM,cAAc,CAAA;AAOrB,OAAO,uCAAuC,CAAA;AAC9C,OAAO,gDAAgD,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAU5C;;;GAGG;AACH,oBAAY,UAAU;IACpB;;OAEG;IACH,QAAQ,aAAa;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,EAAE,CAAQ;IAElB,OAAO,CAAC,QAAQ,CAAI;IAEpB,OAAO,CAAC,SAAS,CAAO;IAExB;;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;;MAIlB;IAED;;OAEG;IACM,UAAU;IAInB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW;IAyB1D,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACM,MAAM;IAqBf;;;;OAIG;IACH,OAAO;IAIP,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,SAAS,CAA+C;CACjE"}
|
|
@@ -8,6 +8,7 @@ import '../../../assets/bottom-gear/gear-sub-menu.scss';
|
|
|
8
8
|
import gearIcon from '../../../assets/icons/new/gear.svg';
|
|
9
9
|
import gearHdIcon from '../../../assets/icons/new/gear-hd.svg';
|
|
10
10
|
import { ExtendedEvents } from '../media-control/MediaControl.js';
|
|
11
|
+
import { mediaControlClickaway } from '../../utils/clickaway.js';
|
|
11
12
|
const VERSION = '2.19.12';
|
|
12
13
|
// const T = 'plugins.bottom_gear'
|
|
13
14
|
const MENU_BACKLINK_HEIGHT = 44;
|
|
@@ -186,6 +187,9 @@ export class BottomGear extends UICorePlugin {
|
|
|
186
187
|
this.listenTo(container, ClapprEvents.CONTAINER_CLICK, () => {
|
|
187
188
|
this.collapse();
|
|
188
189
|
});
|
|
190
|
+
this.listenTo(container, ClapprEvents.CONTAINER_DESTROYED, () => {
|
|
191
|
+
this.clickaway(null);
|
|
192
|
+
});
|
|
189
193
|
}
|
|
190
194
|
highDefinitionUpdate(isHd) {
|
|
191
195
|
this.hd = isHd;
|
|
@@ -238,6 +242,11 @@ export class BottomGear extends UICorePlugin {
|
|
|
238
242
|
this.$el
|
|
239
243
|
.find('#gear-button')
|
|
240
244
|
.attr('aria-expanded', (!this.collapsed).toString());
|
|
245
|
+
this.setKeepVisible(!this.collapsed);
|
|
246
|
+
}
|
|
247
|
+
setKeepVisible(keepVisible) {
|
|
248
|
+
this.core.getPlugin('media_control').setKeepVisible(keepVisible);
|
|
249
|
+
this.clickaway(keepVisible ? this.core.activeContainer.$el[0] : null);
|
|
241
250
|
}
|
|
242
251
|
collapse() {
|
|
243
252
|
this.collapsed = true;
|
|
@@ -245,6 +254,7 @@ export class BottomGear extends UICorePlugin {
|
|
|
245
254
|
this.$el.find('#gear-button').attr('aria-expanded', 'false');
|
|
246
255
|
// TODO hide submenus
|
|
247
256
|
this.collapseSubmenus();
|
|
257
|
+
this.setKeepVisible(false);
|
|
248
258
|
}
|
|
249
259
|
onCoreReady() {
|
|
250
260
|
const mediaControl = this.core.getPlugin('media_control');
|
|
@@ -277,4 +287,5 @@ export class BottomGear extends UICorePlugin {
|
|
|
277
287
|
.find('.gear-sub-menu')
|
|
278
288
|
.css('max-height', `${availableHeight - MENU_BACKLINK_HEIGHT}px`);
|
|
279
289
|
}
|
|
290
|
+
clickaway = mediaControlClickaway(() => this.collapse());
|
|
280
291
|
}
|
|
@@ -205,6 +205,7 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
205
205
|
constructor(core: Core);
|
|
206
206
|
/**
|
|
207
207
|
* @internal
|
|
208
|
+
* The methods declared here will be exposed via the main player object API
|
|
208
209
|
*/
|
|
209
210
|
getExternalInterface(): {
|
|
210
211
|
setVolume: (value: number, isInitialVolume?: boolean) => void;
|
|
@@ -330,6 +331,15 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
330
331
|
* ```
|
|
331
332
|
*/
|
|
332
333
|
mount(name: MediaControlSlotMountPoint, element: ZeptoResult): void;
|
|
334
|
+
/**
|
|
335
|
+
* Set or reset the keep visibility state
|
|
336
|
+
*
|
|
337
|
+
* Keep visibility state controls whether the media control is hidden automatically after a delay.
|
|
338
|
+
* Keep visibility prevents the the auto-hide behaviour
|
|
339
|
+
*
|
|
340
|
+
* @param keepVisible - The state
|
|
341
|
+
*/
|
|
342
|
+
setKeepVisible(keepVisible: boolean): void;
|
|
333
343
|
private getMountParent;
|
|
334
344
|
/**
|
|
335
345
|
* Toggle the visibility of a media control element
|
|
@@ -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;AAI5C,OAAO,kDAAkD,CAAA;
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ import volumeMaxIcon from '../../../assets/icons/new/volume-max.svg';
|
|
|
20
20
|
import volumeOffIcon from '../../../assets/icons/new/volume-off.svg';
|
|
21
21
|
import fullscreenOffIcon from '../../../assets/icons/new/fullscreen-off.svg';
|
|
22
22
|
import fullscreenOnIcon from '../../../assets/icons/new/fullscreen-on.svg';
|
|
23
|
+
import { mediaControlClickaway } from '../../utils/clickaway.js';
|
|
23
24
|
const STANDARD_MEDIA_CONTROL_ELEMENTS = [
|
|
24
25
|
'duration',
|
|
25
26
|
'fullscreen',
|
|
@@ -268,6 +269,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
268
269
|
}
|
|
269
270
|
/**
|
|
270
271
|
* @internal
|
|
272
|
+
* The methods declared here will be exposed via the main player object API
|
|
271
273
|
*/
|
|
272
274
|
getExternalInterface() {
|
|
273
275
|
return {
|
|
@@ -936,6 +938,23 @@ export class MediaControl extends UICorePlugin {
|
|
|
936
938
|
mount(name, element) {
|
|
937
939
|
mountTo(this.getMountParent(name), element);
|
|
938
940
|
}
|
|
941
|
+
/**
|
|
942
|
+
* Set or reset the keep visibility state
|
|
943
|
+
*
|
|
944
|
+
* Keep visibility state controls whether the media control is hidden automatically after a delay.
|
|
945
|
+
* Keep visibility prevents the the auto-hide behaviour
|
|
946
|
+
*
|
|
947
|
+
* @param keepVisible - The state
|
|
948
|
+
*/
|
|
949
|
+
setKeepVisible(keepVisible) {
|
|
950
|
+
this.keepVisible = keepVisible;
|
|
951
|
+
if (keepVisible) {
|
|
952
|
+
this.clickaway(this.core.activeContainer.$el[0]);
|
|
953
|
+
}
|
|
954
|
+
else {
|
|
955
|
+
this.clickaway(null);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
939
958
|
getMountParent(name) {
|
|
940
959
|
switch (name) {
|
|
941
960
|
case 'root':
|
|
@@ -1235,13 +1254,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
1235
1254
|
delayHide() {
|
|
1236
1255
|
this.hide(this.options.hideMediaControlDelay || DEFAULT_HIDE_DELAY);
|
|
1237
1256
|
}
|
|
1238
|
-
|
|
1239
|
-
// as opposed to the click event
|
|
1240
|
-
clickaway = clickaway(() => {
|
|
1241
|
-
if (Browser.isMobile) {
|
|
1242
|
-
setTimeout(this.resetUserKeepVisible, 0);
|
|
1243
|
-
}
|
|
1244
|
-
});
|
|
1257
|
+
clickaway = mediaControlClickaway(() => this.resetUserKeepVisible());
|
|
1245
1258
|
}
|
|
1246
1259
|
MediaControl.extend = function (properties) {
|
|
1247
1260
|
return extend(MediaControl, properties);
|
|
@@ -1282,19 +1295,3 @@ function mergeElements(a, b) {
|
|
|
1282
1295
|
return acc;
|
|
1283
1296
|
}, a);
|
|
1284
1297
|
}
|
|
1285
|
-
function clickaway(callback) {
|
|
1286
|
-
let handler = (event) => { };
|
|
1287
|
-
return (node) => {
|
|
1288
|
-
window.removeEventListener('click', handler);
|
|
1289
|
-
if (!node) {
|
|
1290
|
-
return;
|
|
1291
|
-
}
|
|
1292
|
-
handler = (event) => {
|
|
1293
|
-
if (!node.contains(event.target)) {
|
|
1294
|
-
window.removeEventListener('click', handler);
|
|
1295
|
-
callback();
|
|
1296
|
-
}
|
|
1297
|
-
};
|
|
1298
|
-
window.addEventListener('click', handler);
|
|
1299
|
-
};
|
|
1300
|
-
}
|
|
@@ -114,6 +114,7 @@ export declare class ClosedCaptions extends UICorePlugin {
|
|
|
114
114
|
private applyPreselectedSubtitles;
|
|
115
115
|
private hideMenu;
|
|
116
116
|
private toggleMenu;
|
|
117
|
+
private setKeepVisible;
|
|
117
118
|
private itemElement;
|
|
118
119
|
private allItemElements;
|
|
119
120
|
private selectSubtitles;
|
|
@@ -125,5 +126,6 @@ export declare class ClosedCaptions extends UICorePlugin {
|
|
|
125
126
|
private renderIcon;
|
|
126
127
|
private clampPopup;
|
|
127
128
|
private mount;
|
|
129
|
+
private clickaway;
|
|
128
130
|
}
|
|
129
131
|
//# sourceMappingURL=ClosedCaptions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClosedCaptions.d.ts","sourceRoot":"","sources":["../../../src/plugins/subtitles/ClosedCaptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAwB,MAAM,cAAc,CAAA;AAOzE,OAAO,sCAAsC,CAAA;
|
|
1
|
+
{"version":3,"file":"ClosedCaptions.d.ts","sourceRoot":"","sources":["../../../src/plugins/subtitles/ClosedCaptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAwB,MAAM,cAAc,CAAA;AAOzE,OAAO,sCAAsC,CAAA;AAiB7C;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,oBAAoB,CAAQ;IAEpC,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,KAAK,CAA6B;IAE1C,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,KAAK,CAA2B;IAExC;;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,eAAe,CAAyB;IAEhE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAE3D;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED,OAAO,KAAK,mBAAmB,GAK9B;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,kBAAkB;IAmD1B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,IAAI;IAcJ;;OAEG;IACH,IAAI;IAiBJ,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IA4Bf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,SAAS,CAA+C;CACjE"}
|
|
@@ -9,6 +9,7 @@ import comboboxHTML from '../../../assets/subtitles/combobox.ejs';
|
|
|
9
9
|
import stringHTML from '../../../assets/subtitles/string.ejs';
|
|
10
10
|
import { isFullscreen } from '../utils/fullscreen.js';
|
|
11
11
|
import { ExtendedEvents } from '../media-control/MediaControl.js';
|
|
12
|
+
import { mediaControlClickaway } from '../../utils/clickaway.js';
|
|
12
13
|
const VERSION = '2.19.14';
|
|
13
14
|
const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
|
|
14
15
|
const T = 'plugins.cc';
|
|
@@ -118,6 +119,9 @@ export class ClosedCaptions extends UICorePlugin {
|
|
|
118
119
|
onContainerChanged() {
|
|
119
120
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_FULLSCREEN, this.onContainerResize);
|
|
120
121
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_RESIZE, this.onContainerResize);
|
|
122
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_DESTROYED, () => {
|
|
123
|
+
this.clickaway(null);
|
|
124
|
+
});
|
|
121
125
|
this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
|
|
122
126
|
this.listenTo(this.core.activePlayback, Events.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
|
|
123
127
|
this.listenTo(this.core.activePlayback, Events.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
|
|
@@ -315,6 +319,7 @@ export class ClosedCaptions extends UICorePlugin {
|
|
|
315
319
|
this.open = false;
|
|
316
320
|
this.$el.find('#gplayer-cc-menu').hide();
|
|
317
321
|
this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
|
|
322
|
+
this.setKeepVisible(false);
|
|
318
323
|
}
|
|
319
324
|
toggleMenu() {
|
|
320
325
|
this.core
|
|
@@ -328,6 +333,11 @@ export class ClosedCaptions extends UICorePlugin {
|
|
|
328
333
|
this.$el.find('#gplayer-cc-menu').hide();
|
|
329
334
|
}
|
|
330
335
|
this.$el.find('#gplayer-cc-button').attr('aria-expanded', this.open);
|
|
336
|
+
this.setKeepVisible(this.open);
|
|
337
|
+
}
|
|
338
|
+
setKeepVisible(keepVisible) {
|
|
339
|
+
this.core.getPlugin('media_control').setKeepVisible(keepVisible);
|
|
340
|
+
this.clickaway(keepVisible ? this.core.activeContainer.$el[0] : null);
|
|
331
341
|
}
|
|
332
342
|
itemElement(id) {
|
|
333
343
|
// TODO fix semantically
|
|
@@ -402,4 +412,5 @@ export class ClosedCaptions extends UICorePlugin {
|
|
|
402
412
|
mediaControl.slot('cc', this.$el);
|
|
403
413
|
}
|
|
404
414
|
}
|
|
415
|
+
clickaway = mediaControlClickaway(() => this.hideMenu());
|
|
405
416
|
}
|
|
@@ -32,7 +32,7 @@ export interface ThumbnailsPluginSettings {
|
|
|
32
32
|
* @public
|
|
33
33
|
* @remarks
|
|
34
34
|
* The plugin needs specially crafted VTT file with a thumbnail sprite sheet to work.
|
|
35
|
-
* The VTT
|
|
35
|
+
* The VTT cues refer to a thumbnail, an area within the sprite sheet, to associate with a time span.
|
|
36
36
|
*
|
|
37
37
|
* Configuration options - {@link ThumbnailsPluginSettings}
|
|
38
38
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { UICorePlugin, Events, template, $, } from '@clappr/core';
|
|
2
2
|
import { trace } from '@gcorevideo/utils';
|
|
3
|
-
import
|
|
3
|
+
import { WebVTT } from 'videojs-vtt.js';
|
|
4
4
|
import assert from 'assert';
|
|
5
5
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
6
6
|
import pluginHtml from '../../../assets/thumbnails/scrub-thumbnails.ejs';
|
|
@@ -12,7 +12,7 @@ const T = 'plugins.thumbnails';
|
|
|
12
12
|
* @public
|
|
13
13
|
* @remarks
|
|
14
14
|
* The plugin needs specially crafted VTT file with a thumbnail sprite sheet to work.
|
|
15
|
-
* The VTT
|
|
15
|
+
* The VTT cues refer to a thumbnail, an area within the sprite sheet, to associate with a time span.
|
|
16
16
|
*
|
|
17
17
|
* Configuration options - {@link ThumbnailsPluginSettings}
|
|
18
18
|
*
|
|
@@ -129,7 +129,7 @@ export class Thumbnails extends UICorePlugin {
|
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
131
|
const { sprite: spriteSheet, vtt } = this.options.thumbnails;
|
|
132
|
-
this.thumbs = this.buildSpriteConfig(
|
|
132
|
+
this.thumbs = this.buildSpriteConfig(parseVTT(vtt), spriteSheet);
|
|
133
133
|
if (!this.thumbs.length) {
|
|
134
134
|
trace(`${T} failed to parse the sprite sheet`);
|
|
135
135
|
this.destroy();
|
|
@@ -358,3 +358,23 @@ export class Thumbnails extends UICorePlugin {
|
|
|
358
358
|
return this;
|
|
359
359
|
}
|
|
360
360
|
}
|
|
361
|
+
function parseVTT(vtt) {
|
|
362
|
+
const correctedVTT = vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt;
|
|
363
|
+
const parser = new WebVTT.Parser(window);
|
|
364
|
+
const cues = [];
|
|
365
|
+
parser.oncue = (cue) => {
|
|
366
|
+
cues.push({
|
|
367
|
+
id: cue.id,
|
|
368
|
+
start: cue.startTime,
|
|
369
|
+
end: cue.endTime,
|
|
370
|
+
text: cue.text
|
|
371
|
+
});
|
|
372
|
+
};
|
|
373
|
+
// TextEncoder is available in all modern browsers and Node >=v11
|
|
374
|
+
const uint8Array = typeof TextEncoder !== 'undefined'
|
|
375
|
+
? new TextEncoder().encode(correctedVTT)
|
|
376
|
+
: Buffer.from(correctedVTT, 'utf-8');
|
|
377
|
+
parser.parse(uint8Array);
|
|
378
|
+
parser.flush();
|
|
379
|
+
return cues;
|
|
380
|
+
}
|
package/lib/testUtils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC;;;;;;;;;;;;;;;;;EAsB9C;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAChC,IAAI,SAAS,EACb,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCtC;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,QAAQ,GAAE,GAAgD;;;;;;;;;;;;;;;;;;;;;;;;;EA8B3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC;;;;;;;;;;;;;;;;;EAsB9C;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAChC,IAAI,SAAS,EACb,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCtC;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,QAAQ,GAAE,GAAgD;;;;;;;;;;;;;;;;;;;;;;;;;EA8B3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAyB/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAe7C"}
|
package/lib/testUtils.js
CHANGED
|
@@ -120,6 +120,8 @@ export function createMockMediaControl(core) {
|
|
|
120
120
|
mediaControl.getAvailablePopupHeight = vi.fn().mockReturnValue(286);
|
|
121
121
|
// @ts-ignore
|
|
122
122
|
mediaControl.toggleElement = vi.fn();
|
|
123
|
+
// @ts-ignore
|
|
124
|
+
mediaControl.setKeepVisible = vi.fn();
|
|
123
125
|
vi.spyOn(mediaControl, 'trigger');
|
|
124
126
|
core.$el.append(mediaControl.$el);
|
|
125
127
|
return mediaControl;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {() => void} callback - The callback to call when the user clicks away from the element
|
|
4
|
+
* @returns {(HTMLElement | null) => void}
|
|
5
|
+
*/
|
|
6
|
+
export declare function clickaway(callback: () => void): (node: HTMLElement | null) => void;
|
|
7
|
+
/**
|
|
8
|
+
* Sets up a clickaway handler for the media control on mobile devices.
|
|
9
|
+
* The handler is deferred to ensure it is called after the next event loop tick.
|
|
10
|
+
*
|
|
11
|
+
* @param {() => void} callback - The callback to call when the user clicks away from the media control
|
|
12
|
+
* @returns {(HTMLElement | null) => void}
|
|
13
|
+
*/
|
|
14
|
+
export declare function mediaControlClickaway(callback: () => void): (node: HTMLElement | null) => void;
|
|
15
|
+
//# sourceMappingURL=clickaway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickaway.d.ts","sourceRoot":"","sources":["../../src/utils/clickaway.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,IAGlC,MAAM,WAAW,GAAG,IAAI,UAanC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,UAKxC,WAAW,GAAG,IAAI,UAKnC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Browser } from '@clappr/core';
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param {() => void} callback - The callback to call when the user clicks away from the element
|
|
5
|
+
* @returns {(HTMLElement | null) => void}
|
|
6
|
+
*/
|
|
7
|
+
export function clickaway(callback) {
|
|
8
|
+
let handler = (event) => { };
|
|
9
|
+
return (node) => {
|
|
10
|
+
window.removeEventListener('click', handler);
|
|
11
|
+
if (!node) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
handler = (event) => {
|
|
15
|
+
if (!node.contains(event.target)) {
|
|
16
|
+
window.removeEventListener('click', handler);
|
|
17
|
+
callback();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
window.addEventListener('click', handler);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Sets up a clickaway handler for the media control on mobile devices.
|
|
25
|
+
* The handler is deferred to ensure it is called after the next event loop tick.
|
|
26
|
+
*
|
|
27
|
+
* @param {() => void} callback - The callback to call when the user clicks away from the media control
|
|
28
|
+
* @returns {(HTMLElement | null) => void}
|
|
29
|
+
*/
|
|
30
|
+
export function mediaControlClickaway(callback) {
|
|
31
|
+
if (!Browser.isMobile) {
|
|
32
|
+
return () => { };
|
|
33
|
+
}
|
|
34
|
+
const cw = clickaway(callback);
|
|
35
|
+
return (node) => {
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
cw(node);
|
|
38
|
+
}, 0);
|
|
39
|
+
};
|
|
40
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gcorevideo/player",
|
|
3
|
-
"version": "2.28.
|
|
3
|
+
"version": "2.28.22",
|
|
4
4
|
"description": "Gcore JavaScript video player",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"@types/mousetrap": "^1.6.15",
|
|
45
45
|
"@types/node": "^22.10.1",
|
|
46
46
|
"@types/sinonjs__fake-timers": "^8.1.5",
|
|
47
|
+
"@types/videojs-vtt.js": "^0.15.3",
|
|
47
48
|
"assert": "^2.1.0",
|
|
48
49
|
"eventemitter3": "^5.0.1",
|
|
49
50
|
"happy-dom": "^20.0.8",
|
|
@@ -64,6 +65,6 @@
|
|
|
64
65
|
"hls.js": "^1.5.17",
|
|
65
66
|
"human-format": "^1.2.1",
|
|
66
67
|
"mousetrap": "^1.6.5",
|
|
67
|
-
"
|
|
68
|
+
"videojs-vtt.js": "^0.15.5"
|
|
68
69
|
}
|
|
69
70
|
}
|
|
@@ -9,6 +9,7 @@ import pluginHtml from '../../../assets/audio-tracks/template.ejs'
|
|
|
9
9
|
import audioArrow from '../../../assets/icons/old/quality-arrow.svg'
|
|
10
10
|
import { ZeptoResult } from '../../types.js'
|
|
11
11
|
import { ExtendedEvents, MediaControl } from '../media-control/MediaControl.js'
|
|
12
|
+
import { mediaControlClickaway } from '../../utils/clickaway.js'
|
|
12
13
|
|
|
13
14
|
const VERSION: string = '2.22.4'
|
|
14
15
|
|
|
@@ -132,6 +133,9 @@ export class AudioTracks extends UICorePlugin {
|
|
|
132
133
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_CLICK, () => {
|
|
133
134
|
this.hideMenu()
|
|
134
135
|
})
|
|
136
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_DESTROYED, () => {
|
|
137
|
+
this.clickaway(null)
|
|
138
|
+
})
|
|
135
139
|
}
|
|
136
140
|
|
|
137
141
|
private shouldRender() {
|
|
@@ -179,6 +183,7 @@ export class AudioTracks extends UICorePlugin {
|
|
|
179
183
|
this.open = false
|
|
180
184
|
this.$el.find('#gplayer-audiotracks-menu').hide()
|
|
181
185
|
this.$el.find('#gplayer-audiotracks-button').attr('aria-expanded', 'false')
|
|
186
|
+
this.setKeepVisible(false)
|
|
182
187
|
}
|
|
183
188
|
|
|
184
189
|
private toggleMenu() {
|
|
@@ -195,6 +200,13 @@ export class AudioTracks extends UICorePlugin {
|
|
|
195
200
|
this.$el
|
|
196
201
|
.find('#gplayer-audiotracks-button')
|
|
197
202
|
.attr('aria-expanded', this.open)
|
|
203
|
+
|
|
204
|
+
this.setKeepVisible(this.open)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private setKeepVisible(keepVisible: boolean) {
|
|
208
|
+
this.core.getPlugin('media_control').setKeepVisible(keepVisible)
|
|
209
|
+
this.clickaway(keepVisible ? this.core.activeContainer.$el[0] : null)
|
|
198
210
|
}
|
|
199
211
|
|
|
200
212
|
private buttonElement(): ZeptoResult {
|
|
@@ -209,7 +221,7 @@ export class AudioTracks extends UICorePlugin {
|
|
|
209
221
|
return (
|
|
210
222
|
this.$(
|
|
211
223
|
'#gplayer-audiotracks-menu a' +
|
|
212
|
-
|
|
224
|
+
(id !== undefined ? `[data-item="${id}"]` : ''),
|
|
213
225
|
) as ZeptoResult
|
|
214
226
|
).parent()
|
|
215
227
|
}
|
|
@@ -253,4 +265,6 @@ export class AudioTracks extends UICorePlugin {
|
|
|
253
265
|
this.core.getPlugin('media_control')?.slot('audiotracks', this.$el)
|
|
254
266
|
}
|
|
255
267
|
}
|
|
268
|
+
|
|
269
|
+
private clickaway = mediaControlClickaway(() => this.hideMenu())
|
|
256
270
|
}
|
|
@@ -17,6 +17,7 @@ import gearIcon from '../../../assets/icons/new/gear.svg'
|
|
|
17
17
|
import gearHdIcon from '../../../assets/icons/new/gear-hd.svg'
|
|
18
18
|
import { ZeptoResult } from '../../types.js'
|
|
19
19
|
import { ExtendedEvents } from '../media-control/MediaControl.js'
|
|
20
|
+
import { mediaControlClickaway } from '../../utils/clickaway.js'
|
|
20
21
|
|
|
21
22
|
const VERSION = '2.19.12'
|
|
22
23
|
|
|
@@ -214,6 +215,9 @@ export class BottomGear extends UICorePlugin {
|
|
|
214
215
|
this.listenTo(container, ClapprEvents.CONTAINER_CLICK, () => {
|
|
215
216
|
this.collapse()
|
|
216
217
|
})
|
|
218
|
+
this.listenTo(container, ClapprEvents.CONTAINER_DESTROYED, () => {
|
|
219
|
+
this.clickaway(null)
|
|
220
|
+
})
|
|
217
221
|
}
|
|
218
222
|
|
|
219
223
|
private highDefinitionUpdate(isHd: boolean) {
|
|
@@ -272,6 +276,12 @@ export class BottomGear extends UICorePlugin {
|
|
|
272
276
|
this.$el
|
|
273
277
|
.find('#gear-button')
|
|
274
278
|
.attr('aria-expanded', (!this.collapsed).toString())
|
|
279
|
+
this.setKeepVisible(!this.collapsed)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
private setKeepVisible(keepVisible: boolean) {
|
|
283
|
+
this.core.getPlugin('media_control').setKeepVisible(keepVisible)
|
|
284
|
+
this.clickaway(keepVisible ? this.core.activeContainer.$el[0] : null)
|
|
275
285
|
}
|
|
276
286
|
|
|
277
287
|
private collapse() {
|
|
@@ -280,6 +290,7 @@ export class BottomGear extends UICorePlugin {
|
|
|
280
290
|
this.$el.find('#gear-button').attr('aria-expanded', 'false')
|
|
281
291
|
// TODO hide submenus
|
|
282
292
|
this.collapseSubmenus()
|
|
293
|
+
this.setKeepVisible(false)
|
|
283
294
|
}
|
|
284
295
|
|
|
285
296
|
private onCoreReady() {
|
|
@@ -328,4 +339,6 @@ export class BottomGear extends UICorePlugin {
|
|
|
328
339
|
.find('.gear-sub-menu')
|
|
329
340
|
.css('max-height', `${availableHeight - MENU_BACKLINK_HEIGHT}px`)
|
|
330
341
|
}
|
|
342
|
+
|
|
343
|
+
private clickaway = mediaControlClickaway(() => this.collapse())
|
|
331
344
|
}
|