@gcorevideo/player 2.20.7 → 2.20.8

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 (49) hide show
  1. package/dist/core.js +37 -13
  2. package/dist/index.css +1343 -1343
  3. package/dist/index.js +241 -217
  4. package/dist/plugins/index.css +475 -475
  5. package/dist/plugins/index.js +152 -154
  6. package/lib/playback/BasePlayback.d.ts +5 -0
  7. package/lib/playback/BasePlayback.d.ts.map +1 -1
  8. package/lib/playback/BasePlayback.js +8 -0
  9. package/lib/playback/HTML5Video.d.ts +4 -0
  10. package/lib/playback/HTML5Video.d.ts.map +1 -0
  11. package/lib/playback/HTML5Video.js +3 -0
  12. package/lib/playback/dash-playback/DashPlayback.d.ts +1 -0
  13. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  14. package/lib/playback/dash-playback/DashPlayback.js +6 -2
  15. package/lib/playback/index.d.ts.map +1 -1
  16. package/lib/playback/index.js +2 -0
  17. package/lib/playback/types.d.ts +9 -0
  18. package/lib/playback/types.d.ts.map +1 -0
  19. package/lib/playback/types.js +9 -0
  20. package/lib/plugins/bottom-gear/BottomGear.d.ts +6 -11
  21. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  22. package/lib/plugins/bottom-gear/BottomGear.js +5 -14
  23. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +2 -2
  24. package/lib/plugins/dvr-controls/DvrControls.d.ts +1 -1
  25. package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
  26. package/lib/plugins/dvr-controls/DvrControls.js +27 -16
  27. package/lib/plugins/level-selector/LevelSelector.d.ts +2 -0
  28. package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
  29. package/lib/plugins/level-selector/LevelSelector.js +14 -3
  30. package/lib/plugins/media-control/MediaControl.d.ts +1 -0
  31. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  32. package/lib/plugins/media-control/MediaControl.js +5 -3
  33. package/lib/plugins/playback-rate/PlaybackRate.d.ts +11 -10
  34. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  35. package/lib/plugins/playback-rate/PlaybackRate.js +83 -91
  36. package/package.json +1 -1
  37. package/src/playback/BasePlayback.ts +12 -4
  38. package/src/playback/HTML5Video.ts +3 -0
  39. package/src/playback/dash-playback/DashPlayback.ts +15 -11
  40. package/src/playback/index.ts +2 -1
  41. package/src/playback/types.ts +9 -0
  42. package/src/plugins/bottom-gear/BottomGear.ts +6 -15
  43. package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +3 -3
  44. package/src/plugins/dvr-controls/DvrControls.ts +87 -54
  45. package/src/plugins/level-selector/LevelSelector.ts +17 -5
  46. package/src/plugins/media-control/MediaControl.ts +9 -6
  47. package/src/plugins/playback-rate/PlaybackRate.ts +89 -105
  48. package/tsconfig.tsbuildinfo +1 -1
  49. package/assets/playback-rate/playback-rate-selector.ejs +0 -9
@@ -1,12 +1,15 @@
1
1
  import { Events, UICorePlugin, Playback, template } from '@clappr/core';
2
+ import { trace } from '@gcorevideo/utils';
3
+ import assert from 'assert';
2
4
  import { CLAPPR_VERSION } from '../../build.js';
3
- import pluginHtml from '../../../assets/playback-rate/playback-rate-selector.ejs';
4
5
  import buttonHtml from '../../../assets/playback-rate/button.ejs';
5
6
  import listHtml from '../../../assets/playback-rate/list.ejs';
6
7
  import speedIcon from '../../../assets/icons/new/speed.svg';
7
8
  import arrowRightIcon from '../../../assets/icons/new/arrow-right.svg';
8
9
  import arrowLeftIcon from '../../../assets/icons/new/arrow-left.svg';
9
10
  import checkIcon from '../../../assets/icons/new/check.svg';
11
+ import { PlaybackEvents } from '../../playback/types.js';
12
+ import { MediaControlEvents } from '../media-control/MediaControl.js';
10
13
  const DEFAULT_PLAYBACK_RATES = [
11
14
  { value: '0.5', label: '0.5x' },
12
15
  { value: '0.75', label: '0.75x' },
@@ -17,10 +20,9 @@ const DEFAULT_PLAYBACK_RATES = [
17
20
  { value: '2.0', label: '2x' }
18
21
  ];
19
22
  const DEFAULT_PLAYBACK_RATE = '1.0';
20
- // TODO
21
- const MEDIACONTROL_PLAYBACKRATE = 'playbackRate';
23
+ const T = 'plugins.playback_rate';
22
24
  /**
23
- * Allows changing the playback speed of the video.
25
+ * PLUGIN that allows changing the playback speed of the video.
24
26
  * @beta
25
27
  *
26
28
  * @remarks
@@ -30,12 +32,13 @@ const MEDIACONTROL_PLAYBACKRATE = 'playbackRate';
30
32
  *
31
33
  * - {@link BottomGear | bottom_gear}
32
34
  *
33
- * It renders a button in the gear menu, which opens a dropdown with the available playback rates.
35
+ * It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
34
36
  */
35
37
  export class PlaybackRate extends UICorePlugin {
36
- currentPlayback = null;
37
38
  playbackRates = DEFAULT_PLAYBACK_RATES;
39
+ // Saved when an ad starts to restore after it finishes
38
40
  prevSelectedRate;
41
+ rendered = false;
39
42
  selectedRate = DEFAULT_PLAYBACK_RATE;
40
43
  /**
41
44
  * @internal
@@ -49,9 +52,13 @@ export class PlaybackRate extends UICorePlugin {
49
52
  get supportedVersion() {
50
53
  return { min: CLAPPR_VERSION };
51
54
  }
52
- static template = template(pluginHtml);
53
55
  static buttonTemplate = template(buttonHtml);
54
56
  static listTemplate = template(listHtml);
57
+ constructor(core) {
58
+ super(core);
59
+ this.playbackRates = core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
60
+ this.selectedRate = core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
61
+ }
55
62
  /**
56
63
  * @internal
57
64
  */
@@ -75,27 +82,36 @@ export class PlaybackRate extends UICorePlugin {
75
82
  * @internal
76
83
  */
77
84
  bindEvents() {
78
- this.listenTo(this.core, 'gear:rendered', this.render);
79
- // TODO this.core.getPlugin('media_control'), bottom_gear
80
- this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED, this.reload);
81
- this.listenTo(this.core.mediaControl, MEDIACONTROL_PLAYBACKRATE, this.updatePlaybackRate);
82
- this.listenTo(this.core, 'core:advertisement:start', this.onStartAd);
83
- this.listenTo(this.core, 'core:advertisement:finish', this.onFinishAd);
84
- if (this.core.activeContainer) {
85
- this.listenTo(this.core.activePlayback, Events.PLAYBACK_BUFFERFULL, this.updateLiveStatus);
86
- }
87
- if (this.currentPlayback) {
88
- this.listenTo(this.currentPlayback, Events.PLAYBACK_STOP, this.onStop);
89
- this.listenTo(this.currentPlayback, Events.PLAYBACK_PLAY, this.onPlay);
90
- // TODO import dash playback events
91
- this.listenTo(this.currentPlayback, 'dash:playback-rate-changed', this.onDashRateChange);
92
- }
85
+ this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
86
+ this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
87
+ }
88
+ onCoreReady() {
89
+ const mediaControl = this.core.getPlugin('media_control');
90
+ assert(mediaControl, 'media_control plugin is required');
91
+ const gear = this.core.getPlugin('bottom_gear');
92
+ assert(gear, 'bottom_gear plugin is required');
93
+ this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
94
+ }
95
+ onActiveContainerChange() {
96
+ this.listenTo(this.core.activePlayback, Events.PLAYBACK_STOP, this.onStop);
97
+ this.listenTo(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onPlay);
98
+ this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
99
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
100
+ }
101
+ onGearRendered() {
102
+ trace(`${T} onGearRendered`, {
103
+ rendered: this.rendered,
104
+ });
105
+ this.rendered = false;
106
+ this.render();
93
107
  }
94
- unBindEvents() {
95
- this.stopListening(this.core, 'gear:rendered', this.render);
96
- this.stopListening(this.core.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED, this.reload);
97
- this.stopListening(this.core, 'core:advertisement:start', this.onStartAd);
98
- this.stopListening(this.core, 'core:advertisement:finish', this.onFinishAd);
108
+ onDvrStateChanged(dvrEnabled) {
109
+ trace(`${T} onDvrStateChanged`, {
110
+ dvrEnabled,
111
+ });
112
+ if (dvrEnabled) {
113
+ this.render();
114
+ }
99
115
  }
100
116
  allRateElements() {
101
117
  return this.$('ul.gear-sub-menu li');
@@ -103,68 +119,53 @@ export class PlaybackRate extends UICorePlugin {
103
119
  rateElement(rate = "1") {
104
120
  return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
105
121
  }
106
- onDashRateChange() {
107
- // TODO consider removing
108
- this.currentPlayback._dash?.setPlaybackRate(this.selectedRate);
109
- }
110
- updateLiveStatus() {
111
- if (this.core.getPlaybackType() === Playback.LIVE) {
112
- if (this.core.mediaControl.currentSeekBarPercentage <= 98.9) {
113
- this.core.mediaControl.$playbackRate.removeClass('playbackrate-enable');
114
- this.core.mediaControl.$el.addClass('dvr');
115
- return;
116
- }
117
- this.updatePlaybackRate(DEFAULT_PLAYBACK_RATE);
118
- this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
119
- this.core.mediaControl.$el.removeClass('dvr');
122
+ onPlaybackRateChange(playbackRate) {
123
+ const selectedRate = parseInt(this.selectedRate, 10);
124
+ if (playbackRate !== selectedRate) {
125
+ trace(`${T} onPlaybackRateChange setting target rate`, {
126
+ playbackRate,
127
+ selectedRate,
128
+ });
129
+ this.core.activePlayback?.setPlaybackRate(selectedRate);
120
130
  }
121
131
  }
122
- reload() {
123
- this.unBindEvents();
124
- this.bindEvents();
125
- }
126
132
  shouldRender() {
127
133
  if (!this.core.activeContainer) {
128
134
  return false;
129
135
  }
130
- this.currentPlayback = this.core.activePlayback;
131
- return !(this.currentPlayback?.tagName !== 'video' && this.currentPlayback?.tagName !== 'audio');
136
+ if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
137
+ return false;
138
+ }
139
+ return 'setPlaybackRate' in this.core.activePlayback;
132
140
  }
133
141
  /**
134
142
  * @internal
135
143
  */
136
144
  render() {
137
- const container = this.core.activeContainer;
138
- if (this.core.getPlaybackType() === Playback.LIVE && !container.isDvrEnabled()) {
145
+ trace(`${T} render`, {
146
+ rendered: this.rendered,
147
+ shouldRender: this.shouldRender(),
148
+ });
149
+ if (!this.shouldRender()) {
139
150
  return this;
140
151
  }
141
- const cfg = this.core.options.playbackRateConfig || {};
142
- if (!this.playbackRates) {
143
- this.playbackRates = cfg.options || DEFAULT_PLAYBACK_RATES;
144
- }
145
- if (!this.selectedRate) {
146
- this.selectedRate = cfg.defaultValue || DEFAULT_PLAYBACK_RATE;
147
- }
148
- if (this.shouldRender()) {
149
- const button = PlaybackRate.buttonTemplate({
150
- title: this.getTitle(),
151
- speedIcon,
152
- arrowRightIcon,
153
- });
154
- this.$el.html(button);
155
- // if (this.core.getPlaybackType() === Playback.LIVE) {
156
- // this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
157
- // }
158
- // this.core.mediaControl.$playbackRate.append(this.el);
159
- this.core.mediaControl.$el?.find('.gear-options-list [data-rate]').html(this.el);
160
- // this.updateText();
152
+ if (this.rendered) {
153
+ return this;
161
154
  }
155
+ const button = PlaybackRate.buttonTemplate({
156
+ title: this.getTitle(),
157
+ speedIcon,
158
+ arrowRightIcon,
159
+ });
160
+ this.$el.html(button);
161
+ this.core.getPlugin('bottom_gear')?.getElement('rate')?.html(this.el);
162
+ this.rendered = true;
162
163
  return this;
163
164
  }
164
165
  onStartAd() {
165
166
  this.prevSelectedRate = this.selectedRate;
166
- this.setSelectedRate('1.0');
167
- this.listenToOnce(this.currentPlayback, Events.PLAYBACK_PLAY, this.onFinishAd);
167
+ this.resetPlaybackRate();
168
+ this.listenToOnce(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onFinishAd);
168
169
  }
169
170
  onFinishAd() {
170
171
  if (this.prevSelectedRate) {
@@ -172,16 +173,16 @@ export class PlaybackRate extends UICorePlugin {
172
173
  }
173
174
  }
174
175
  onPlay() {
175
- if (!this.core.mediaControl.$el.hasClass('dvr')) {
176
- if (this.core.getPlaybackType() === Playback.LIVE) {
177
- this.updatePlaybackRate(DEFAULT_PLAYBACK_RATE);
178
- this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
179
- }
176
+ if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
177
+ this.resetPlaybackRate();
180
178
  }
181
179
  else {
182
180
  this.setSelectedRate(this.selectedRate);
183
181
  }
184
182
  }
183
+ resetPlaybackRate() {
184
+ this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
185
+ }
185
186
  onStop() {
186
187
  }
187
188
  onRateSelect(event) {
@@ -199,30 +200,21 @@ export class PlaybackRate extends UICorePlugin {
199
200
  arrowLeftIcon,
200
201
  checkIcon,
201
202
  }));
202
- this.core.mediaControl.$el?.find('.gear-wrapper').html(this.el);
203
+ this.core.getPlugin('bottom_gear')?.setContent(this.el);
203
204
  this.highlightCurrentRate();
204
205
  }
205
206
  goBack() {
206
- this.core.trigger('gear:refresh');
207
- }
208
- updatePlaybackRate(rate) {
209
- this.setSelectedRate(rate);
207
+ setTimeout(() => {
208
+ this.core.getPlugin('bottom_gear').refresh();
209
+ }, 0);
210
210
  }
211
211
  setSelectedRate(rate) {
212
212
  // Set <video playbackRate="..."
213
- this.core.$el.find('video,audio').get(0).playbackRate = rate;
213
+ this.core.activePlayback?.setPlaybackRate(rate);
214
214
  this.selectedRate = rate;
215
- // TODO
216
- // Player.player.trigger('playbackRateChanged', rate);
217
215
  }
218
216
  getTitle() {
219
- let title = this.selectedRate;
220
- this.playbackRates.forEach((r) => {
221
- if (r.value === this.selectedRate) {
222
- title = r.label;
223
- }
224
- });
225
- return title;
217
+ return this.playbackRates.find((r) => r.value === this.selectedRate)?.label || this.selectedRate;
226
218
  }
227
219
  highlightCurrentRate() {
228
220
  this.allRateElements().removeClass('current');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.20.7",
3
+ "version": "2.20.8",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -11,10 +11,10 @@ export class BasePlayback extends HTML5Video {
11
11
  createError(errorData: any, options?: ErrorOptions) {
12
12
  const i18n =
13
13
  this.i18n ||
14
- // @ts-ignore
15
- (this.core && this.core.i18n) ||
16
- // @ts-ignore
17
- (this.container && this.container.i18n)
14
+ // @ts-ignore
15
+ (this.core && this.core.i18n) ||
16
+ // @ts-ignore
17
+ (this.container && this.container.i18n)
18
18
 
19
19
  if (
20
20
  i18n &&
@@ -34,6 +34,14 @@ export class BasePlayback extends HTML5Video {
34
34
  return super.createError(errorData, options)
35
35
  }
36
36
 
37
+ /**
38
+ * Sets the playback rate.
39
+ * @param rate - The playback rate to set.
40
+ */
41
+ setPlaybackRate(rate: number) {
42
+ ;(this.el as HTMLMediaElement).playbackRate = rate
43
+ }
44
+
37
45
  override _onPlaying() {
38
46
  super._onPlaying()
39
47
  this.trigger(Events.PLAYBACK_MEDIACONTROL_ENABLE)
@@ -0,0 +1,3 @@
1
+ import { BasePlayback } from './BasePlayback.js'
2
+
3
+ export default class HTML5Video extends BasePlayback {}
@@ -17,7 +17,6 @@ import DASHJS, {
17
17
  import {
18
18
  PlaybackError,
19
19
  PlaybackErrorCode,
20
- PlayerComponentType,
21
20
  QualityLevel,
22
21
  TimePosition,
23
22
  TimeUpdate,
@@ -25,6 +24,7 @@ import {
25
24
  } from '../../playback.types.js'
26
25
  import { isDashSource } from '../../utils/mediaSources.js'
27
26
  import { BasePlayback } from '../BasePlayback.js'
27
+ import { PlaybackEvents } from '../types.js'
28
28
 
29
29
  const AUTO = -1
30
30
 
@@ -300,8 +300,8 @@ export default class DashPlayback extends BasePlayback {
300
300
  },
301
301
  )
302
302
 
303
- this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, () => {
304
- this.trigger('dash:playback-rate-changed')
303
+ this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e: DASHJS.PlaybackRateChangedEvent) => {
304
+ this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate)
305
305
  })
306
306
  }
307
307
 
@@ -361,7 +361,7 @@ export default class DashPlayback extends BasePlayback {
361
361
  return this._startTime
362
362
  }
363
363
 
364
- seekPercentage(percentage: number) {
364
+ override seekPercentage(percentage: number) {
365
365
  let seekTo = this._duration
366
366
 
367
367
  if (percentage > 0) {
@@ -376,7 +376,7 @@ export default class DashPlayback extends BasePlayback {
376
376
  this.seek(seekTo)
377
377
  }
378
378
 
379
- seek(time: TimeValue) {
379
+ override seek(time: TimeValue) {
380
380
  if (time < 0) {
381
381
  // eslint-disable-next-line max-len
382
382
  Log.warn(
@@ -478,7 +478,7 @@ export default class DashPlayback extends BasePlayback {
478
478
  }, 10)
479
479
  }
480
480
 
481
- _onTimeUpdate() {
481
+ override _onTimeUpdate() {
482
482
  if (this.startChangeQuality) {
483
483
  return
484
484
  }
@@ -499,7 +499,7 @@ export default class DashPlayback extends BasePlayback {
499
499
  this.trigger(Events.PLAYBACK_TIMEUPDATE, update, this.name)
500
500
  }
501
501
 
502
- _onDurationChange() {
502
+ override _onDurationChange() {
503
503
  const duration = this.getDuration()
504
504
 
505
505
  if (this._lastDuration === duration) {
@@ -540,7 +540,7 @@ export default class DashPlayback extends BasePlayback {
540
540
  this.trigger(Events.PLAYBACK_PROGRESS, progress, {})
541
541
  }
542
542
 
543
- play() {
543
+ override play() {
544
544
  trace(`${T} play`, { dash: !!this._dash })
545
545
  if (!this._dash) {
546
546
  this._setup()
@@ -550,7 +550,7 @@ export default class DashPlayback extends BasePlayback {
550
550
  this._startTimeUpdateTimer()
551
551
  }
552
552
 
553
- pause() {
553
+ override pause() {
554
554
  if (!this._dash) {
555
555
  return
556
556
  }
@@ -560,7 +560,7 @@ export default class DashPlayback extends BasePlayback {
560
560
  }
561
561
  }
562
562
 
563
- stop() {
563
+ override stop() {
564
564
  if (this._dash) {
565
565
  this._stopTimeUpdateTimer()
566
566
  this._dash.reset()
@@ -569,7 +569,7 @@ export default class DashPlayback extends BasePlayback {
569
569
  }
570
570
  }
571
571
 
572
- destroy() {
572
+ override destroy() {
573
573
  this._stopTimeUpdateTimer()
574
574
  if (this._dash) {
575
575
  this._dash.off(DASHJS.MediaPlayer.events.ERROR, this._onDASHJSSError)
@@ -638,6 +638,10 @@ export default class DashPlayback extends BasePlayback {
638
638
  assert.ok(ret, 'Invalid quality level')
639
639
  return ret
640
640
  }
641
+
642
+ setPlaybackRate(rate: number) {
643
+ this._dash?.setPlaybackRate(rate)
644
+ }
641
645
  }
642
646
 
643
647
  DashPlayback.canPlay = function (resource, mimeType) {
@@ -2,9 +2,10 @@ import { Loader } from '@clappr/core'
2
2
 
3
3
  import DashPlayback from './dash-playback/DashPlayback.js'
4
4
  import HlsPlayback from './hls-playback/HlsPlayback.js'
5
-
5
+ import HTML5Video from './HTML5Video.js'
6
6
  // TODO consider allowing the variation of the order of playback modules
7
7
  export function registerPlaybacks() {
8
+ Loader.registerPlayback(HTML5Video) // TODO check it overrides the default HTML5Video
8
9
  Loader.registerPlayback(HlsPlayback)
9
10
  Loader.registerPlayback(DashPlayback)
10
11
  }
@@ -0,0 +1,9 @@
1
+
2
+ export enum PlaybackEvents {
3
+ /**
4
+ * Emitted when the playback rate changes.
5
+ * Payload:
6
+ * - playbackRate number
7
+ */
8
+ PLAYBACK_RATE_CHANGED = 'playback:rate-changed',
9
+ }
@@ -16,17 +16,6 @@ const VERSION = '2.19.12';
16
16
 
17
17
  const T = 'plugins.bottom_gear';
18
18
 
19
- /**
20
- * Custom events emitted by the plugin
21
- * @beta
22
- */
23
- export enum GearEvents {
24
- /**
25
- * Emitted when the gear menu is rendered
26
- */
27
- MEDIACONTROL_GEAR_RENDERED = 'mediacontrol:gear:rendered',
28
- }
29
-
30
19
  /**
31
20
  * An element inside the gear menu
32
21
  * @beta
@@ -96,7 +85,6 @@ export class BottomGear extends UICorePlugin {
96
85
  assert(mediaControl, 'media_control plugin is required');
97
86
 
98
87
  this.listenTo(this.core, ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
99
- this.listenTo(this.core, 'gear:refresh', this.refresh); // TODO use direct plugin method call
100
88
  this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_RENDERED, this.render);
101
89
  this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
102
90
  }
@@ -150,13 +138,16 @@ export class BottomGear extends UICorePlugin {
150
138
  this.$el.html(BottomGear.template({ icon, items }));
151
139
 
152
140
  mediaControl.getElement('gear')?.html(this.el);
153
- this.core.trigger('gear:rendered'); // @deprecated
154
- mediaControl.trigger(GearEvents.MEDIACONTROL_GEAR_RENDERED); // TODO drop
155
141
  mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
156
142
  return this;
157
143
  }
158
144
 
159
- private refresh() {
145
+ /**
146
+ * Re-renders the gear menu.
147
+ * It fires the {@link MediaControlEvents.MEDIACONTROL_GEAR_RENDERED | MEDIACONTROL_GEAR_RENDERED} event,
148
+ * which the plugins that attach to the gear menu can listen to to re-render themselves.
149
+ */
150
+ refresh() {
160
151
  this.render();
161
152
  this.$el.find('.gear-wrapper').show();
162
153
  }
@@ -24,8 +24,8 @@ import '../../../assets/clappr-nerd-stats/clappr-nerd-stats.scss'
24
24
  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
- import { BottomGear, GearEvents } from '../bottom-gear/BottomGear.js'
28
- import { MediaControl } from '../media-control/MediaControl.js'
27
+ import { BottomGear } from '../bottom-gear/BottomGear.js'
28
+ import { MediaControl, MediaControlEvents } from '../media-control/MediaControl.js'
29
29
  import assert from 'assert'
30
30
 
31
31
  const qualityClasses = [
@@ -229,7 +229,7 @@ export class ClapprNerdStats extends UICorePlugin {
229
229
  this.listenToOnce(this.core, Events.CORE_READY, this.init)
230
230
  this.listenTo(
231
231
  mediaControl,
232
- GearEvents.MEDIACONTROL_GEAR_RENDERED,
232
+ MediaControlEvents.MEDIACONTROL_GEAR_RENDERED,
233
233
  this.addToBottomGear,
234
234
  )
235
235
  }