@gcorevideo/player 2.22.13 → 2.22.15

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 (39) hide show
  1. package/assets/bottom-gear/gear.scss +20 -13
  2. package/assets/clappr-nerd-stats/button.ejs +2 -2
  3. package/assets/clappr-nerd-stats/clappr-nerd-stats.scss +0 -43
  4. package/assets/context-menu/context_menu.ejs +14 -6
  5. package/assets/context-menu/context_menu.scss +18 -4
  6. package/assets/level-selector/button.ejs +3 -3
  7. package/assets/level-selector/style.scss +0 -5
  8. package/assets/playback-rate/button.ejs +2 -2
  9. package/dist/core.js +5 -2
  10. package/dist/index.css +815 -834
  11. package/dist/index.js +79 -78
  12. package/dist/plugins/index.css +669 -688
  13. package/dist/plugins/index.js +73 -99
  14. package/lib/Player.d.ts.map +1 -1
  15. package/lib/Player.js +4 -1
  16. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -1
  17. package/lib/plugins/click-to-pause/ClickToPause.js +1 -1
  18. package/lib/plugins/context-menu/ContextMenu.d.ts +33 -12
  19. package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -1
  20. package/lib/plugins/context-menu/ContextMenu.js +40 -37
  21. package/lib/plugins/media-control/MediaControl.d.ts +4 -1
  22. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  23. package/lib/plugins/media-control/MediaControl.js +30 -14
  24. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  25. package/lib/plugins/playback-rate/PlaybackRate.js +1 -22
  26. package/package.json +1 -1
  27. package/src/Player.ts +4 -3
  28. package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +0 -1
  29. package/src/plugins/click-to-pause/ClickToPause.ts +1 -1
  30. package/src/plugins/context-menu/ContextMenu.ts +72 -56
  31. package/src/plugins/level-selector/__tests__/__snapshots__/QualityLevels.test.ts.snap +3 -3
  32. package/src/plugins/media-control/MediaControl.ts +36 -15
  33. package/src/plugins/media-control/__tests__/MediaControl.test.ts +101 -32
  34. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +20 -20
  35. package/src/plugins/playback-rate/PlaybackRate.ts +1 -24
  36. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +2 -1
  37. package/tsconfig.tsbuildinfo +1 -1
  38. package/assets/clappr-nerd-stats/options-list.ejs +0 -9
  39. package/assets/clappr-nerd-stats/settings.ejs +0 -12
@@ -1,18 +1,18 @@
1
- import { Events, template, $, UIContainerPlugin, } from '@clappr/core';
1
+ import { Events, template, $, UIContainerPlugin } from '@clappr/core';
2
2
  import { CLAPPR_VERSION } from '../../build.js';
3
3
  import '../../../assets/context-menu/context_menu.scss';
4
4
  import templateHtml from '../../../assets/context-menu/context_menu.ejs';
5
- import { version } from '../../version.js';
5
+ const T = 'plugins.context_menu';
6
6
  /**
7
7
  * `PLUGIN` that displays a small context menu when clicked on the player container.
8
8
  * @beta
9
9
  * @remarks
10
10
  * Configuration options - {@link ContextMenuPluginSettings}
11
+ *
12
+ * Should not be used together with {@link ClickToPause} plugin
11
13
  */
12
14
  export class ContextMenu extends UIContainerPlugin {
13
- _label = '';
14
- _url = '';
15
- menuOptions = [];
15
+ open = false;
16
16
  /**
17
17
  * @internal
18
18
  */
@@ -32,34 +32,16 @@ export class ContextMenu extends UIContainerPlugin {
32
32
  return { class: 'context-menu' };
33
33
  }
34
34
  static template = template(templateHtml);
35
- get label() {
36
- return this._label || 'Gcore player ver. ' + version().gplayer;
37
- }
38
- get url() {
39
- return this._url || 'https://gcore.com/';
40
- }
41
- get exposeVersion() {
42
- return {
43
- label: this.label,
44
- name: 'version',
45
- };
46
- }
47
35
  /**
48
36
  * @internal
49
37
  */
50
38
  get events() {
51
39
  return {
52
- 'click [data-version]': 'onOpenMainPage',
40
+ 'click [role="menuitem"]': 'runAction',
53
41
  };
54
42
  }
55
43
  constructor(container) {
56
44
  super(container);
57
- if (this.options.contextMenu && this.options.contextMenu.label) {
58
- this._label = this.options.contextMenu.label;
59
- }
60
- if (this.options.contextMenu && this.options.contextMenu.url) {
61
- this._url = this.options.contextMenu.url;
62
- }
63
45
  this.render();
64
46
  $('body').on('click', this.hideOnBodyClick);
65
47
  }
@@ -67,8 +49,8 @@ export class ContextMenu extends UIContainerPlugin {
67
49
  * @internal
68
50
  */
69
51
  bindEvents() {
70
- this.listenTo(this.container, Events.CONTAINER_CONTEXTMENU, this.toggleContextMenu);
71
- this.listenTo(this.container, Events.CONTAINER_CLICK, this.hide);
52
+ this.listenTo(this.container, Events.CONTAINER_CONTEXTMENU, this.onContextMenu);
53
+ this.listenTo(this.container, Events.CONTAINER_CLICK, this.onContainerClick);
72
54
  }
73
55
  /**
74
56
  * @internal
@@ -77,34 +59,55 @@ export class ContextMenu extends UIContainerPlugin {
77
59
  $('body').off('click', this.hideOnBodyClick);
78
60
  return super.destroy();
79
61
  }
80
- toggleContextMenu(event) {
62
+ onContainerClick() {
63
+ this.hide();
64
+ }
65
+ onContextMenu(event) {
66
+ if (!this.options.contextMenu?.options?.length) {
67
+ return;
68
+ }
81
69
  event.preventDefault();
70
+ event.stopPropagation();
82
71
  const offset = this.container?.$el.offset();
83
72
  this.show(event.pageY - offset.top, event.pageX - offset.left);
84
73
  }
85
74
  show(top, left) {
86
- this.hide();
87
- if (this.options.contextMenu &&
88
- this.options.contextMenu.preventShowContextMenu) {
89
- return;
90
- }
75
+ this.open = true;
91
76
  this.$el.css({ top, left });
92
77
  this.$el.show();
93
78
  }
94
79
  hide() {
80
+ this.open = false;
95
81
  this.$el.hide();
96
82
  }
97
- onOpenMainPage() {
98
- window.open(this.url, '_blank');
83
+ runAction(event) {
84
+ event.preventDefault();
85
+ event.stopPropagation();
86
+ const itemName = event.currentTarget.dataset.name;
87
+ if (!itemName) {
88
+ return;
89
+ }
90
+ const item = this.options.contextMenu?.options.find((option) => option.name === itemName);
91
+ if (item?.handler) {
92
+ item.handler();
93
+ }
94
+ this.hide();
99
95
  }
100
96
  /**
101
97
  * @internal
102
98
  */
103
99
  render() {
104
- this.menuOptions = [this.exposeVersion];
105
- this.$el.html(ContextMenu.template({ options: this.menuOptions }));
100
+ if (!this.options.contextMenu?.options?.length) {
101
+ return this;
102
+ }
103
+ const options = this.options.contextMenu.options;
104
+ this.$el.html(ContextMenu.template({
105
+ options,
106
+ i18n: this.container.i18n,
107
+ iconic: options.some((option) => option.icon),
108
+ }));
106
109
  this.container.$el.append(this.$el); // TODO append to the container, turn into a container plugin
107
- this.hide();
110
+ this.$el.hide();
108
111
  return this;
109
112
  }
110
113
  hideOnBodyClick = () => {
@@ -65,8 +65,10 @@ export declare class MediaControl extends UICorePlugin {
65
65
  private kibo;
66
66
  private lastMouseX;
67
67
  private lastMouseY;
68
- private needsUpdate;
68
+ private metadataLoaded;
69
+ private hasUpdate;
69
70
  private persistConfig;
71
+ private renderTimerId;
70
72
  private rendered;
71
73
  private settings;
72
74
  private userDisabled;
@@ -271,6 +273,7 @@ export declare class MediaControl extends UICorePlugin {
271
273
  * @internal
272
274
  */
273
275
  destroy(): import("@clappr/core").UIObject;
276
+ private cancelRenderTimer;
274
277
  private configure;
275
278
  /**
276
279
  * @internal
@@ -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":"AAOA,OAAO,EAEL,YAAY,EAMZ,IAAI,EACL,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAI5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,UAAU,GACV,QAAQ,CAAA;AAEZ;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAChC,SAAS,GACT,kBAAkB,CAAA;AAEtB;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,IAAI,GACJ,YAAY,GACZ,cAAc,GACd,MAAM,GACN,aAAa,GACb,KAAK,GACL,IAAI,CAAA;AAER;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,uBAAuB,GACvB,wBAAwB,GACxB,wBAAwB,CAAA;AAE5B;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,uBAAuB,EAAE,CAAA;IAC/B,KAAK,EAAE,wBAAwB,EAAE,CAAA;IACjC,OAAO,EAAE,wBAAwB,EAAE,CAAA;IACnC,WAAW,EAAE,OAAO,CAAA;CACrB,CAAA;AA0DD;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAG5C,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,wBAAwB,CAAI;IAEpC,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,0BAA0B,CAAsB;IAExD,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,OAAO,CAAC,6BAA6B,CAAQ;IAE7C,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,YAAY,CAA6C;IAEjE,OAAO,CAAC,cAAc,CAAM;IAE5B,OAAO,CAAC,WAAW,CAAQ;IAE3B,OAAO,CAAC,IAAI,CAAM;IAElB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,UAAU,CAAI;IAEtB,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,aAAa,CAA6C;IAElE,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,QAAQ,CAAyC;IAEzD,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,eAAe,CAAQ;IAE/B,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,kBAAkB,CAA2B;IAErD,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,mBAAmB,CAA2B;IAEtD,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,kBAAkB,CAA2B;IAErD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,WAAW,CAA2B;IAE9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAE7D;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,KAAK,QAAQ,GAMnB;IAED;;;OAGG;IACH,IAAI,SAAS,QAEZ;IAED;;;OAGG;IACH,IAAI,QAAQ,QAEX;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED;;OAEG;IACH,IAAa,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;MA4BlB;IAED,IAAI,cAAc,WAEjB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAInB;IAED;;OAEG;IACH,IAAI,KAAK,YAER;gBAEW,IAAI,EAAE,IAAI;IAqBtB;;OAEG;IACM,oBAAoB;2BA8ZZ,MAAM;;;IAvZvB;;OAEG;IACM,UAAU;IAuCnB,OAAO,CAAC,mBAAmB;IAiF3B;;OAEG;IACM,OAAO;IAQhB;;OAEG;IACM,MAAM;IAUf;;OAEG;IACH,gBAAgB;IAOhB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,cAAc;IAwDtB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ,CAQf;IAED,OAAO,CAAC,UAAU,CAgBjB;IAED,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,UAAU;IAIlB;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,UAAQ;IA+BhD,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,IAAI;IAkBZ,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,IAAI;IAgCZ,OAAO,CAAC,IAAI;IAmCZ,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,cAAc;IAgEtB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,oBAAoB;IAqC5B;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,GAAG,IAAI;IAWzD,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW;IAmB1D;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO;IAItD,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IA8CrB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,WAAW;IAiCnB,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACM,OAAO;IAUhB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACM,MAAM;IAyEf,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAcvB;;OAEG;IACH,mBAAmB;IAMnB;;OAEG;IACH,qBAAqB;IAOrB,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,iBAAiB;CAO1B"}
@@ -94,8 +94,10 @@ export class MediaControl extends UICorePlugin {
94
94
  kibo;
95
95
  lastMouseX = 0;
96
96
  lastMouseY = 0;
97
- needsUpdate = false;
97
+ metadataLoaded = false;
98
+ hasUpdate = false;
98
99
  persistConfig;
100
+ renderTimerId = null;
99
101
  rendered = false;
100
102
  settings = INITIAL_SETTINGS;
101
103
  userDisabled = false;
@@ -281,8 +283,10 @@ export class MediaControl extends UICorePlugin {
281
283
  this.listenTo(this.core.activeContainer, Events.CONTAINER_ENDED, this.ended);
282
284
  this.listenTo(this.core.activeContainer, Events.CONTAINER_VOLUME, this.onVolumeChanged);
283
285
  this.listenTo(this.core.activeContainer, Events.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
284
- // wait until the metadata has loaded and then check if fullscreen on video tag is supported
285
- this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
286
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
287
+ this.listenTo(this.core, Events.CONTAINER_DESTROYED, () => {
288
+ this.cancelRenderTimer();
289
+ });
286
290
  }
287
291
  /**
288
292
  * Hides the media control UI
@@ -325,13 +329,17 @@ export class MediaControl extends UICorePlugin {
325
329
  // TODO sort out, use single utility function
326
330
  this.fullScreenOnVideoTagSupported = true;
327
331
  }
328
- this.updateSettings();
329
- if (this.core.activeContainer.getPlaybackType() === Playback.LIVE) {
330
- this.$el.addClass('live');
331
- }
332
- else {
333
- this.$el.removeClass('live');
334
- }
332
+ this.renderTimerId = setTimeout(() => {
333
+ this.renderTimerId = null;
334
+ this.metadataLoaded = true;
335
+ this.render();
336
+ if (this.core.activeContainer.getPlaybackType() === Playback.LIVE) {
337
+ this.$el.addClass('live');
338
+ }
339
+ else {
340
+ this.$el.removeClass('live');
341
+ }
342
+ }, 25);
335
343
  }
336
344
  updateVolumeUI() {
337
345
  // this will be called after a render
@@ -555,6 +563,7 @@ export class MediaControl extends UICorePlugin {
555
563
  }
556
564
  onActiveContainerChanged() {
557
565
  this.fullScreenOnVideoTagSupported = false;
566
+ this.metadataLoaded = false;
558
567
  // set the new container to match the volume of the last one
559
568
  this.setInitialVolume();
560
569
  this.changeTogglePlay();
@@ -776,7 +785,7 @@ export class MediaControl extends UICorePlugin {
776
785
  const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
777
786
  if (settingsChanged) {
778
787
  this.settings = newSettings;
779
- this.needsUpdate = true;
788
+ this.hasUpdate = true;
780
789
  this.render();
781
790
  }
782
791
  }
@@ -1005,6 +1014,7 @@ export class MediaControl extends UICorePlugin {
1005
1014
  * @internal
1006
1015
  */
1007
1016
  destroy() {
1017
+ this.cancelRenderTimer();
1008
1018
  $(document).unbind('mouseup', this.stopDrag);
1009
1019
  $(document).unbind('mousemove', this.updateDrag);
1010
1020
  $(document).unbind('touchend', this.stopDrag);
@@ -1012,6 +1022,12 @@ export class MediaControl extends UICorePlugin {
1012
1022
  this.unbindKeyEvents();
1013
1023
  return super.destroy();
1014
1024
  }
1025
+ cancelRenderTimer() {
1026
+ if (this.renderTimerId) {
1027
+ clearTimeout(this.renderTimerId);
1028
+ this.renderTimerId = null;
1029
+ }
1030
+ }
1015
1031
  configure() {
1016
1032
  this.trigger(Events.MEDIACONTROL_OPTIONS_CHANGE);
1017
1033
  }
@@ -1019,8 +1035,8 @@ export class MediaControl extends UICorePlugin {
1019
1035
  * @internal
1020
1036
  */
1021
1037
  render() {
1022
- trace(`${T} render`, { needsUpdate: this.needsUpdate });
1023
- if (!this.needsUpdate) {
1038
+ trace(`${T} render`, { needsUpdate: this.hasUpdate, metadataLoaded: this.metadataLoaded });
1039
+ if (!this.hasUpdate || !this.metadataLoaded) {
1024
1040
  return this;
1025
1041
  }
1026
1042
  const timeout = this.options.hideMediaControlDelay || 2000;
@@ -1070,7 +1086,7 @@ export class MediaControl extends UICorePlugin {
1070
1086
  this.core.$el.append(this.el);
1071
1087
  this.rendered = true;
1072
1088
  this.updateVolumeUI();
1073
- this.needsUpdate = false;
1089
+ this.hasUpdate = false;
1074
1090
  // TODO setTimeout?
1075
1091
  this.trigger(Events.MEDIACONTROL_RENDERED);
1076
1092
  return this;
@@ -1 +1 @@
1
- {"version":3,"file":"PlaybackRate.d.ts","sourceRoot":"","sources":["../../../src/plugins/playback-rate/PlaybackRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAsB,IAAI,EAAK,MAAM,cAAc,CAAA;AAkBhF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAI5C,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO,CAAC,cAAc,CAAQ;IAI9B,OAAO,CAAC,YAAY,CAAuB;IAE3C;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAuB;IAE7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAE7C,IAAI,EAAE,IAAI;IAOtB,OAAO,KAAK,aAAa,GAExB;IAED;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,KAAK;IAqCb,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACM,MAAM;IAkBf;;OAEG;IACM,OAAO;IAwBhB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,qBAAqB;CAM9B"}
1
+ {"version":3,"file":"PlaybackRate.d.ts","sourceRoot":"","sources":["../../../src/plugins/playback-rate/PlaybackRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAsB,IAAI,EAAK,MAAM,cAAc,CAAA;AAkBhF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAI5C,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,YAAY,CAAuB;IAE3C;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAuB;IAE7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAE7C,IAAI,EAAE,IAAI;IAOtB,OAAO,KAAK,aAAa,GAExB;IAED;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,KAAK;IAsBb,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACM,MAAM;IAkBf;;OAEG;IACM,OAAO;IAwBhB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,qBAAqB;CAM9B"}
@@ -57,7 +57,6 @@ export class PlaybackRate extends UICorePlugin {
57
57
  // private prevSelectedRate: string | undefined
58
58
  selectedRate = DEFAULT_PLAYBACK_RATE;
59
59
  metadataLoaded = false;
60
- // private playbackSettingsUpdateReceived = false
61
60
  mountTimerId = null;
62
61
  /**
63
62
  * @internal
@@ -118,14 +117,8 @@ export class PlaybackRate extends UICorePlugin {
118
117
  onActiveContainerChange() {
119
118
  trace(`${T} onActiveContainerChange`);
120
119
  this.metadataLoaded = false;
121
- // this.playbackSettingsUpdateReceived = false
122
120
  this.listenTo(this.core.activePlayback, Events.PLAYBACK_STOP, this.onStop);
123
121
  this.listenTo(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onPlay);
124
- // this.listenTo(
125
- // this.core.activePlayback,
126
- // Events.PLAYBACK_SETTINGSUPDATE,
127
- // this.onSettingsUpdate,
128
- // )
129
122
  this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
130
123
  this.listenTo(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onMetaDataLoaded);
131
124
  }
@@ -154,27 +147,13 @@ export class PlaybackRate extends UICorePlugin {
154
147
  i18n: this.core.i18n,
155
148
  })));
156
149
  }
157
- // private onSettingsUpdate() {
158
- // trace(`${T} onSettingsUpdate`, {
159
- // playbackType: this.core.activePlayback.getPlaybackType(),
160
- // dvrEnabled: this.core.activePlayback.dvrEnabled,
161
- // })
162
- // this.playbackSettingsUpdateReceived = true
163
- // if (this.metadataLoaded) {
164
- // if (this.mountTimerId) {
165
- // clearTimeout(this.mountTimerId)
166
- // this.mountTimerId = null
167
- // }
168
- // this.mount()
169
- // }
170
- // }
171
150
  onMetaDataLoaded() {
172
151
  trace(`${T} onMetaDataLoaded`, {
173
152
  playbackType: this.core.activePlayback.getPlaybackType(),
174
153
  dvrEnabled: this.core.activePlayback.dvrEnabled,
175
154
  });
176
- this.metadataLoaded = true;
177
155
  this.mountTimerId = setTimeout(() => {
156
+ this.metadataLoaded = true;
178
157
  this.mountTimerId = null;
179
158
  this.mount();
180
159
  }, 25);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.22.13",
3
+ "version": "2.22.15",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
package/src/Player.ts CHANGED
@@ -159,6 +159,9 @@ export class Player {
159
159
  * ```
160
160
  */
161
161
  attachTo(playerElement: HTMLElement): void {
162
+ trace(`${T} attachTo`, {
163
+ player: !!this.player,
164
+ })
162
165
  assert.ok(!this.player, 'Player already initialized')
163
166
  assert.ok(playerElement, 'Player container element is required')
164
167
  if (this.config.debug === 'all' || this.config.debug === 'clappr') {
@@ -398,11 +401,9 @@ export class Player {
398
401
  trace(`${T} initPlayer`, {
399
402
  autoPlay: coreOptions.autoPlay,
400
403
  sources: coreOptions.sources,
404
+ player: !!this.player,
401
405
  // TODO selected options
402
406
  })
403
-
404
- assert.ok(!this.player, 'Player already initialized')
405
-
406
407
  const player = new PlayerClappr(coreOptions)
407
408
  this.player = player
408
409
  this.bindCoreListeners()
@@ -25,7 +25,6 @@ import pluginHtml from '../../../assets/clappr-nerd-stats/clappr-nerd-stats.ejs'
25
25
  import buttonHtml from '../../../assets/clappr-nerd-stats/button.ejs'
26
26
  import statsIcon from '../../../assets/icons/new/stats.svg'
27
27
  import { BottomGear, GearEvents } from '../bottom-gear/BottomGear.js'
28
- import { MediaControl } from '../media-control/MediaControl.js'
29
28
  import assert from 'assert'
30
29
 
31
30
  const qualityClasses = [
@@ -10,7 +10,7 @@ import { CLAPPR_VERSION } from '../../build.js'
10
10
 
11
11
  type Timer = ReturnType<typeof setTimeout>
12
12
 
13
- const T = 'plugins.click_to_pause_custom'
13
+ const T = 'plugins.click_to_pause'
14
14
 
15
15
  /**
16
16
  * A small `PLUGIN` that toggles the playback state on click over the video container
@@ -1,20 +1,34 @@
1
- import {
2
- Events,
3
- template,
4
- $,
5
- Container,
6
- UIContainerPlugin,
7
- } from '@clappr/core'
1
+ import { Events, template, $, Container, UIContainerPlugin } from '@clappr/core'
8
2
 
9
3
  import { CLAPPR_VERSION } from '../../build.js'
10
4
 
11
5
  import '../../../assets/context-menu/context_menu.scss'
12
6
  import templateHtml from '../../../assets/context-menu/context_menu.ejs'
13
- import { version } from '../../version.js'
14
7
 
15
- type MenuOption = {
16
- label: string
8
+ /**
9
+ * @beta
10
+ */
11
+ export type MenuOption = {
12
+ /**
13
+ * Menu item label text. One of `label` or `labelKey` must be specified.
14
+ */
15
+ label?: string
16
+ /**
17
+ * Menu item label localisation key, if specified, the `label` will be ignored
18
+ */
19
+ labelKey?: string
20
+ /**
21
+ * Menu item name. Must be unique.
22
+ */
17
23
  name: string
24
+ /**
25
+ * Menu item handler function
26
+ */
27
+ handler?: () => void
28
+ /**
29
+ * Menu item icon, plain HTML string
30
+ */
31
+ icon?: string
18
32
  }
19
33
 
20
34
  /**
@@ -22,23 +36,21 @@ type MenuOption = {
22
36
  * @beta
23
37
  */
24
38
  export interface ContextMenuPluginSettings {
25
- label?: string
26
- url?: string
27
- preventShowContextMenu?: boolean
39
+ options?: MenuOption[]
28
40
  }
29
41
 
42
+ const T = 'plugins.context_menu'
43
+
30
44
  /**
31
45
  * `PLUGIN` that displays a small context menu when clicked on the player container.
32
46
  * @beta
33
47
  * @remarks
34
48
  * Configuration options - {@link ContextMenuPluginSettings}
49
+ *
50
+ * Should not be used together with {@link ClickToPause} plugin
35
51
  */
36
52
  export class ContextMenu extends UIContainerPlugin {
37
- private _label: string = ''
38
-
39
- private _url: string = ''
40
-
41
- private menuOptions: MenuOption[] = []
53
+ private open = false
42
54
 
43
55
  /**
44
56
  * @internal
@@ -63,38 +75,17 @@ export class ContextMenu extends UIContainerPlugin {
63
75
 
64
76
  private static readonly template = template(templateHtml)
65
77
 
66
- private get label() {
67
- return this._label || 'Gcore player ver. ' + version().gplayer
68
- }
69
-
70
- private get url() {
71
- return this._url || 'https://gcore.com/'
72
- }
73
-
74
- private get exposeVersion() {
75
- return {
76
- label: this.label,
77
- name: 'version',
78
- }
79
- }
80
-
81
78
  /**
82
79
  * @internal
83
80
  */
84
81
  override get events() {
85
82
  return {
86
- 'click [data-version]': 'onOpenMainPage',
83
+ 'click [role="menuitem"]': 'runAction',
87
84
  }
88
85
  }
89
86
 
90
87
  constructor(container: Container) {
91
88
  super(container)
92
- if (this.options.contextMenu && this.options.contextMenu.label) {
93
- this._label = this.options.contextMenu.label
94
- }
95
- if (this.options.contextMenu && this.options.contextMenu.url) {
96
- this._url = this.options.contextMenu.url
97
- }
98
89
  this.render()
99
90
  $('body').on('click', this.hideOnBodyClick)
100
91
  }
@@ -106,9 +97,9 @@ export class ContextMenu extends UIContainerPlugin {
106
97
  this.listenTo(
107
98
  this.container,
108
99
  Events.CONTAINER_CONTEXTMENU,
109
- this.toggleContextMenu,
100
+ this.onContextMenu,
110
101
  )
111
- this.listenTo(this.container, Events.CONTAINER_CLICK, this.hide)
102
+ this.listenTo(this.container, Events.CONTAINER_CLICK, this.onContainerClick)
112
103
  }
113
104
 
114
105
  /**
@@ -119,41 +110,66 @@ export class ContextMenu extends UIContainerPlugin {
119
110
  return super.destroy()
120
111
  }
121
112
 
122
- private toggleContextMenu(event: MouseEvent) {
113
+ private onContainerClick() {
114
+ this.hide()
115
+ }
116
+
117
+ private onContextMenu(event: MouseEvent) {
118
+ if (!this.options.contextMenu?.options?.length) {
119
+ return
120
+ }
123
121
  event.preventDefault()
124
- const offset = this.container?.$el.offset()
122
+ event.stopPropagation()
125
123
 
124
+ const offset = this.container?.$el.offset()
126
125
  this.show(event.pageY - offset.top, event.pageX - offset.left)
127
126
  }
128
127
 
129
128
  private show(top: number, left: number) {
130
- this.hide()
131
- if (
132
- this.options.contextMenu &&
133
- this.options.contextMenu.preventShowContextMenu
134
- ) {
135
- return
136
- }
129
+ this.open = true
137
130
  this.$el.css({ top, left })
138
131
  this.$el.show()
139
132
  }
140
133
 
141
134
  private hide() {
135
+ this.open = false
142
136
  this.$el.hide()
143
137
  }
144
138
 
145
- private onOpenMainPage() {
146
- window.open(this.url, '_blank')
139
+ private runAction(event: MouseEvent) {
140
+ event.preventDefault()
141
+ event.stopPropagation()
142
+
143
+ const itemName = (event.currentTarget as HTMLButtonElement).dataset.name
144
+ if (!itemName) {
145
+ return
146
+ }
147
+ const item = this.options.contextMenu?.options.find(
148
+ (option: MenuOption) => option.name === itemName,
149
+ )
150
+ if (item?.handler) {
151
+ item.handler()
152
+ }
153
+ this.hide()
147
154
  }
148
155
 
149
156
  /**
150
157
  * @internal
151
158
  */
152
159
  override render() {
153
- this.menuOptions = [this.exposeVersion]
154
- this.$el.html(ContextMenu.template({ options: this.menuOptions }))
160
+ if (!this.options.contextMenu?.options?.length) {
161
+ return this
162
+ }
163
+ const options = this.options.contextMenu.options
164
+ this.$el.html(
165
+ ContextMenu.template({
166
+ options,
167
+ i18n: this.container.i18n,
168
+ iconic: options.some((option: MenuOption) => option.icon),
169
+ }),
170
+ )
155
171
  this.container.$el.append(this.$el) // TODO append to the container, turn into a container plugin
156
- this.hide()
172
+ this.$el.hide()
157
173
 
158
174
  return this
159
175
  }
@@ -155,10 +155,10 @@ exports[`QualityLevels > options.restrictResolution > given vertical video forma
155
155
 
156
156
  exports[`QualityLevels > options.restrictResolution > initially > should render the restricted quality level label 1`] = `
157
157
  "<button class="gplayer-lite-btn gcore-skin-text-color gear-option" aria-haspopup="menu">
158
- <span class="gear-option_hd-icon hidden">/assets/icons/new/hd.svg</span>
159
- <span>quality</span>
160
- <span class="gear-option_arrow-right-icon">/assets/icons/new/arrow-right.svg</span>
158
+ <span class="gear-option_icon hidden">/assets/icons/new/hd.svg</span>
159
+ <span class="gear-option_label">quality</span>
161
160
  <span class="gear-option_value">360p</span>
161
+ <span class="gear-option_arrow-right-icon">/assets/icons/new/arrow-right.svg</span>
162
162
  </button>
163
163
  "
164
164
  `;