@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.
Files changed (35) hide show
  1. package/dist/core.js +1 -1
  2. package/dist/index.css +442 -442
  3. package/dist/index.embed.js +2805 -210
  4. package/dist/index.js +2806 -211
  5. package/lib/plugins/audio-selector/AudioTracks.d.ts +2 -0
  6. package/lib/plugins/audio-selector/AudioTracks.d.ts.map +1 -1
  7. package/lib/plugins/audio-selector/AudioTracks.js +11 -0
  8. package/lib/plugins/bottom-gear/BottomGear.d.ts +2 -0
  9. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  10. package/lib/plugins/bottom-gear/BottomGear.js +11 -0
  11. package/lib/plugins/media-control/MediaControl.d.ts +10 -0
  12. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  13. package/lib/plugins/media-control/MediaControl.js +20 -23
  14. package/lib/plugins/subtitles/ClosedCaptions.d.ts +2 -0
  15. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  16. package/lib/plugins/subtitles/ClosedCaptions.js +11 -0
  17. package/lib/plugins/thumbnails/Thumbnails.d.ts +1 -1
  18. package/lib/plugins/thumbnails/Thumbnails.js +23 -3
  19. package/lib/testUtils.d.ts.map +1 -1
  20. package/lib/testUtils.js +2 -0
  21. package/lib/utils/clickaway.d.ts +15 -0
  22. package/lib/utils/clickaway.d.ts.map +1 -0
  23. package/lib/utils/clickaway.js +40 -0
  24. package/package.json +3 -2
  25. package/src/plugins/audio-selector/AudioTracks.ts +15 -1
  26. package/src/plugins/bottom-gear/BottomGear.ts +13 -0
  27. package/src/plugins/media-control/MediaControl.ts +20 -25
  28. package/src/plugins/subtitles/ClosedCaptions.ts +13 -0
  29. package/src/plugins/thumbnails/Thumbnails.ts +35 -4
  30. package/src/plugins/thumbnails/__tests__/Thumbnails.test.ts +108 -53
  31. package/src/plugins/thumbnails/__tests__/__snapshots__/Thumbnails.test.ts.snap +37 -1
  32. package/src/testUtils.ts +2 -0
  33. package/src/utils/clickaway.ts +43 -0
  34. package/tsconfig.tsbuildinfo +1 -1
  35. 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;AAgB7D;;;;;;;;;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;IA6BhC,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACM,MAAM;IAgBf,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,UAAU;IAgBlB,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;CAKd"}
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;AAS5C;;;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;IAW3B,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACM,MAAM;IAqBf;;;;OAIG;IACH,OAAO;IAIP,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,UAAU;CAQnB"}
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":"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"}
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
- // 2 seconds delay is needed since on mobile devices mouse(touch)move events are not dispatched immediately
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;AAgB7C;;;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;IAgD1B,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;IAMhB,OAAO,CAAC,UAAU;IAalB,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;CAMd"}
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 consist of timestamp records followed by a thumbnail area
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 parseSRT from 'parse-srt';
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 consist of timestamp records followed by a thumbnail area
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(parseSRT(vtt), spriteSheet);
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
+ }
@@ -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,gBAuB/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAe7C"}
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.20",
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
- "parse-srt": "^1.0.0-alpha"
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
- (id !== undefined ? `[data-item="${id}"]` : ''),
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
  }