@gcorevideo/player 2.22.20 → 2.22.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 (50) hide show
  1. package/assets/clappr-nerd-stats/clappr-nerd-stats.ejs +30 -30
  2. package/assets/clappr-nerd-stats/clappr-nerd-stats.scss +21 -14
  3. package/assets/level-selector/button.ejs +1 -1
  4. package/dist/core.js +1 -1
  5. package/dist/index.css +696 -688
  6. package/dist/index.js +271 -247
  7. package/dist/player.d.ts +57 -27
  8. package/dist/plugins/index.css +335 -327
  9. package/dist/plugins/index.js +109 -89
  10. package/docs/api/{player.bitratetrackrecord.md → player.clapprstatsbitratetrack.md} +3 -3
  11. package/docs/api/player.clapprstatsmetrics.md +2 -2
  12. package/docs/api/player.extendedevents.md +45 -0
  13. package/docs/api/player.gearevents.md +1 -1
  14. package/docs/api/player.md +22 -2
  15. package/docs/api/player.mediacontrol.mount.md +0 -5
  16. package/docs/api/player.mediacontrol.putelement.md +5 -0
  17. package/docs/api/player.mediacontrol.toggleelement.md +1 -1
  18. package/docs/api/player.volumefade._constructor_.md +50 -0
  19. package/docs/api/player.volumefade.md +40 -1
  20. package/docs/api/player.volumefadesettings.md +18 -0
  21. package/lib/plugins/clappr-nerd-stats/NerdStats.d.ts +1 -0
  22. package/lib/plugins/clappr-nerd-stats/NerdStats.d.ts.map +1 -1
  23. package/lib/plugins/clappr-nerd-stats/NerdStats.js +13 -3
  24. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.d.ts.map +1 -1
  25. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.js +1 -0
  26. package/lib/plugins/clappr-nerd-stats/speedtest/index.js +1 -1
  27. package/lib/plugins/clappr-nerd-stats/utils.d.ts.map +1 -1
  28. package/lib/plugins/clappr-nerd-stats/utils.js +17 -15
  29. package/lib/plugins/clappr-stats/ClapprStats.d.ts +1 -0
  30. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
  31. package/lib/plugins/clappr-stats/ClapprStats.js +3 -0
  32. package/lib/plugins/click-to-pause/ClickToPause.js +6 -7
  33. package/lib/plugins/media-control/MediaControl.d.ts +3 -0
  34. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  35. package/lib/plugins/media-control/MediaControl.js +6 -1
  36. package/lib/plugins/volume-fade/VolumeFade.d.ts +28 -11
  37. package/lib/plugins/volume-fade/VolumeFade.d.ts.map +1 -1
  38. package/lib/plugins/volume-fade/VolumeFade.js +66 -61
  39. package/package.json +1 -1
  40. package/src/plugins/clappr-nerd-stats/NerdStats.ts +21 -8
  41. package/src/plugins/clappr-nerd-stats/speedtest/Speedtest.ts +1 -0
  42. package/src/plugins/clappr-nerd-stats/speedtest/index.ts +1 -1
  43. package/src/plugins/clappr-nerd-stats/utils.ts +23 -13
  44. package/src/plugins/clappr-stats/ClapprStats.ts +4 -0
  45. package/src/plugins/click-to-pause/ClickToPause.ts +6 -6
  46. package/src/plugins/level-selector/__tests__/__snapshots__/QualityLevels.test.ts.snap +1 -1
  47. package/src/plugins/media-control/MediaControl.ts +6 -1
  48. package/src/plugins/volume-fade/VolumeFade.ts +96 -76
  49. package/temp/player.api.json +132 -34
  50. package/tsconfig.tsbuildinfo +1 -1
@@ -312,8 +312,12 @@ export class NerdStats extends UICorePlugin {
312
312
 
313
313
  private updateMetrics(metrics: PerfMetrics) {
314
314
  trace(`${T} updateMetrics`, { custom: this.speedtestMetrics })
315
- Object.assign(this.metrics, metrics)
316
- this.updateEstimatedQuality()
315
+ Object.assign(this.metrics, metrics) // TODO no Object.assign
316
+ this.metrics.custom = {
317
+ ...this.speedtestMetrics,
318
+ }
319
+
320
+ this.updateCustomMetrics()
317
321
 
318
322
  this.$el
319
323
  .find('#nerd-stats-current-time')
@@ -382,17 +386,19 @@ export class NerdStats extends UICorePlugin {
382
386
 
383
387
  this.setStatsBoxSize()
384
388
  drawSpeedTestResults()
385
- drawSummary(
386
- this.speedtestMetrics,
387
- this.$el.find('#nerd-stats-quality-vod'),
388
- this.$el.find('#nerd-stats-quality-live'),
389
- )
389
+ this.updateEstimatedQuality()
390
390
 
391
391
  if (!this.open) {
392
392
  this.hide()
393
393
  }
394
394
  }
395
395
 
396
+ private updateCustomMetrics() {
397
+ this.$el.find('#nerd-stats-dl-text').text(this.metrics.custom.connectionSpeed.toFixed(2))
398
+ this.$el.find('#nerd-stats-ping-text').text(this.metrics.custom.ping.toFixed(2))
399
+ this.$el.find('#nerd-stats-jitter-text').text(this.metrics.custom.jitter.toFixed(2))
400
+ }
401
+
396
402
  private updateEstimatedQuality() {
397
403
  this.estimateQuality()
398
404
  this.$el
@@ -401,6 +407,12 @@ export class NerdStats extends UICorePlugin {
401
407
  this.$el
402
408
  .find('#nerd-stats-quality-live-text')
403
409
  .html(this.metrics.custom.liveQuality)
410
+
411
+ drawSummary(
412
+ this.speedtestMetrics,
413
+ this.$el.find('#nerd-stats-quality-vod'),
414
+ this.$el.find('#nerd-stats-quality-live'),
415
+ )
404
416
  }
405
417
 
406
418
  private setStatsBoxSize() {
@@ -453,8 +465,9 @@ export class NerdStats extends UICorePlugin {
453
465
  this.speedtestMetrics.connectionSpeed = 0
454
466
  this.speedtestMetrics.ping = 0
455
467
  this.speedtestMetrics.jitter = 0
456
-
468
+
457
469
  if (clapprStats) {
470
+ clapprStats.clearMetrics()
458
471
  this.updateMetrics(clapprStats.exportMetrics())
459
472
  }
460
473
  }
@@ -116,6 +116,7 @@ export class Speedtest {
116
116
 
117
117
  addTestPoint(server: Server) {
118
118
  this._checkServerDefinition(server)
119
+ console.log('Speedtest addTestPoint %o', server)
119
120
  if (this._state === 0) {
120
121
  this._state = 1
121
122
  }
@@ -37,7 +37,7 @@ const getColor = (speedValue: number): string => {
37
37
  };
38
38
 
39
39
  export function drawSpeedTestResults() {
40
- const canvas = document.getElementById('speedTestCanvas');
40
+ const canvas = document.getElementById('nerd-stats-speed-test-canvas');
41
41
  if (!canvas) {
42
42
  return;
43
43
  }
@@ -10,31 +10,41 @@ const qualityClasses = [
10
10
  ]
11
11
 
12
12
  export const getDownloadQuality = (speedValue: number): number => {
13
+ if (!speedValue) {
14
+ return 0
15
+ }
13
16
  if (speedValue < 3) {
14
17
  return 1
15
- } else if (speedValue < 7) {
18
+ }
19
+ if (speedValue < 7) {
16
20
  return 2
17
- } else if (speedValue < 13) {
21
+ }
22
+ if (speedValue < 13) {
18
23
  return 3
19
- } else if (speedValue < 25) {
24
+ }
25
+ if (speedValue < 25) {
20
26
  return 4
21
- } else {
22
- return 5
23
27
  }
28
+ return 5
24
29
  }
25
30
 
26
31
  export const getPingQuality = (pingValue: number): number => {
32
+ if (!pingValue) {
33
+ return 0
34
+ }
27
35
  if (pingValue < 20) {
28
36
  return 5
29
- } else if (pingValue < 50) {
37
+ }
38
+ if (pingValue < 50) {
30
39
  return 4
31
- } else if (pingValue < 100) {
40
+ }
41
+ if (pingValue < 100) {
32
42
  return 3
33
- } else if (pingValue < 150) {
43
+ }
44
+ if (pingValue < 150) {
34
45
  return 2
35
- } else {
36
- return 1
37
46
  }
47
+ return 1
38
48
  }
39
49
 
40
50
  export const generateQualityHtml = (quality: number): string => {
@@ -61,9 +71,9 @@ export const drawSummary = (
61
71
  ) => {
62
72
  const { connectionSpeed, ping } = customMetrics
63
73
 
64
- if (!connectionSpeed || !ping) {
65
- return
66
- }
74
+ // if (!connectionSpeed || !ping) {
75
+ // return
76
+ // }
67
77
  const downloadQuality = getDownloadQuality(connectionSpeed)
68
78
  const pingQuality = getPingQuality(ping)
69
79
  const liveQuality = Math.min(downloadQuality, pingQuality)
@@ -172,6 +172,10 @@ export class ClapprStats extends ContainerPlugin {
172
172
  return structuredClone(this.metrics)
173
173
  }
174
174
 
175
+ clearMetrics() {
176
+ this.metrics = newMetrics()
177
+ }
178
+
175
179
  private onBitrate(newBitrate: QualityLevel) {
176
180
  const bitrate = newBitrate.bitrate
177
181
  const now = this.now()
@@ -58,13 +58,13 @@ export class ClickToPause extends ContainerPlugin {
58
58
 
59
59
  if (isLivePlayback && !isDvrEnabled) {
60
60
  this.togglePlay(true)
61
- } else if (!isLivePlayback || isDvrEnabled) {
62
- this.clearTimer()
63
- this.timer = setTimeout(() => {
64
- this.timer = null
65
- this.togglePlay(false)
66
- }, 300)
61
+ return
67
62
  }
63
+ this.clearTimer()
64
+ this.timer = setTimeout(() => {
65
+ this.timer = null
66
+ this.togglePlay(false)
67
+ }, 300)
68
68
  }
69
69
 
70
70
  private settingsUpdate() {
@@ -154,7 +154,7 @@ exports[`QualityLevels > options.restrictResolution > given vertical video forma
154
154
  `;
155
155
 
156
156
  exports[`QualityLevels > options.restrictResolution > initially > should render the restricted quality level label 1`] = `
157
- "<button class="gplayer-lite-btn gcore-skin-text-color gear-option" aria-haspopup="menu">
157
+ "<button class="gplayer-lite-btn gcore-skin-text-color gear-option" aria-haspopup="menu" id="quality-levels">
158
158
  <span class="gear-option_icon hidden">/assets/icons/new/hd.svg</span>
159
159
  <span class="gear-option_label">quality</span>
160
160
  <span class="gear-option_value">360p</span>
@@ -136,6 +136,10 @@ const LEFT_ORDER = [
136
136
  'dvr',
137
137
  ]
138
138
 
139
+ export enum ExtendedEvents {
140
+ MEDIACONTROL_VOLUME = 'mediacontrol:volume',
141
+ }
142
+
139
143
  const { Config, Fullscreen, formatTime, extend, removeArrayItem } = Utils
140
144
 
141
145
  function orderByOrderPattern(arr: string[], order: string[]): string[] {
@@ -793,16 +797,17 @@ export class MediaControl extends UICorePlugin {
793
797
  // if the container is not ready etc
794
798
  this.intendedVolume = value
795
799
  this.persistConfig && !isInitialVolume && Config.persist('volume', value)
796
- // TODO
797
800
  const setWhenContainerReady = () => {
798
801
  if (this.core.activeContainer && this.core.activeContainer.isReady) {
799
802
  this.core.activeContainer.setVolume(value)
803
+ this.trigger(ExtendedEvents.MEDIACONTROL_VOLUME, value)
800
804
  } else {
801
805
  this.listenToOnce(
802
806
  this.core.activeContainer,
803
807
  Events.CONTAINER_READY,
804
808
  () => {
805
809
  this.core.activeContainer.setVolume(value)
810
+ this.trigger(ExtendedEvents.MEDIACONTROL_VOLUME, value)
806
811
  },
807
812
  )
808
813
  }
@@ -1,7 +1,8 @@
1
- import { UICorePlugin, Events, Browser, $, Container } from '@clappr/core';
2
- import { reportError } from '@gcorevideo/utils';
1
+ import { UICorePlugin, Events, Browser, $, Core } from '@clappr/core'
2
+ import { reportError, trace } from '@gcorevideo/utils'
3
3
 
4
- import { TimerId } from '../../utils/types.js';
4
+ import { TimerId } from '../../utils/types.js'
5
+ import { ExtendedEvents } from '../media-control/MediaControl.js'
5
6
 
6
7
  /**
7
8
  * Events emitted by the VolumeFade plugin.
@@ -11,114 +12,133 @@ export enum VolumeFadeEvents {
11
12
  FADE = 'core:volume:fade',
12
13
  }
13
14
 
15
+ const T = 'plugins.volume_fade'
16
+
17
+ const DEFAULT_DURATION = 600
18
+ const DEFAULT_VOLUME_LEVEL = 80
19
+
14
20
  /**
15
- * `PLUGIN` that applies fade effect to the player's volume change.
16
21
  * @beta
17
22
  */
18
- export class VolumeFade extends UICorePlugin {
19
- private _aboveBorderVolume = 0;
23
+ export type VolumeFadeSettings = {
24
+ /**
25
+ * Initial active volume level, effective until volume is changed via media control
26
+ */
27
+ level?: number
28
+ /**
29
+ * Fade duration, ms
30
+ */
31
+ duration?: number
32
+ }
20
33
 
21
- private container: Container | null = null;
34
+ /**
35
+ * `PLUGIN` that mutes the sound and fades it in when the mouse is over the player.
36
+ * @beta
37
+ *
38
+ * @remarks
39
+ * When the user moves the mouse over and away from the player, the sound is unmuted and unmuted with a fade effect.
40
+ *
41
+ * Depends on {@link MediaControl} plugin.
42
+ * Configuration options - {@link VolumeFadeSettings}
43
+ */
44
+ export class VolumeFade extends UICorePlugin {
45
+ private activeVolume = 0
22
46
 
23
- private delay = 0;
47
+ private duration = 0
24
48
 
25
- private interval: TimerId | null = null;
49
+ private timerId: TimerId | null = null
26
50
 
27
51
  /**
28
52
  * @internal
29
53
  */
30
54
  get name() {
31
- return 'volume_fade';
55
+ return 'volume_fade'
56
+ }
57
+
58
+ constructor(core: Core) {
59
+ super(core)
60
+ if (typeof this.options.volumeFade?.level === 'number') {
61
+ this.activeVolume = this.options.volumeFade.level
62
+ }
32
63
  }
33
64
 
34
65
  /**
35
66
  * @internal
36
67
  */
37
68
  override bindEvents() {
38
- // TODO on container changed
39
- this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
40
- if (this.core.mediaControl) {
41
- this.listenTo(this.core.mediaControl, 'mediacontrol:volume:user', this._onUserChangeVolume);
42
- }
43
- // this.listenTo(this.core, 'core:volume:config', this._onVolumeConfig);
44
- }
45
-
46
- private unBindEvents() {
47
- this.core.$el.off('mouseleave.volume');
48
- this.core.$el.off('mouseenter.volume');
49
- }
50
-
51
- private _onUserChangeVolume(volume: number) {
52
- this._aboveBorderVolume = volume;
53
- }
54
-
55
- private _onVolumeConfig(value: number) {
56
- this._aboveBorderVolume = value;
57
- this.container?.setVolume(0);
69
+ this.listenTo(this.core, Events.CORE_READY, this.onCoreReady)
58
70
  }
59
71
 
60
72
  private onCoreReady() {
61
- this.unBindEvents();
62
- this.container = this.core.activeContainer;
63
- if (this.core && this.core.$el) {
64
- // TODO find out why options.playerElement instead of this.core.$el or this.container.$el
65
- $(this.options.playerElement).on('mouseenter.volume', () => {
66
- this.onEnter();
67
- });
68
- $(this.options.playerElement).on('mouseleave.volume', () => {
69
- this.onLeave();
70
- });
73
+ const mediaControl = this.core.getPlugin('media_control')
74
+ if (Browser.isMobile) {
75
+ this.destroy()
76
+ return
71
77
  }
72
- if (!this._aboveBorderVolume) {
73
- this._aboveBorderVolume = this.container?.volume && !isNaN(this.container.volume) ? this.container.volume : 80;
78
+ if (mediaControl) {
79
+ this.listenTo(
80
+ mediaControl,
81
+ ExtendedEvents.MEDIACONTROL_VOLUME,
82
+ this.onVolumeChange,
83
+ )
74
84
  }
75
- if (this.options.mute || Browser.isMobile) {
76
- this.destroy();
77
-
78
- return;
85
+ $(this.core.$el).on('mouseenter', () => this.onEnter())
86
+ $(this.core.$el).on('mouseleave', () => this.onLeave())
87
+ if (!this.activeVolume) {
88
+ this.activeVolume =
89
+ this.core.activeContainer?.volume &&
90
+ !isNaN(this.core.activeContainer.volume)
91
+ ? this.core.activeContainer.volume
92
+ : DEFAULT_VOLUME_LEVEL
79
93
  }
80
- this.delay = this.options.volumeFade && this.options.volumeFade.delay || 600;
81
- this.container?.setVolume(0);
82
- }
83
94
 
84
- private onEnter() {
85
- this.numberTo(this.delay);
95
+ this.duration = this.options.volumeFade?.duration || DEFAULT_DURATION
96
+ // TODO check if `mute` must be respected
97
+ this.core.activeContainer?.setVolume(this.activeVolume)
98
+ this.core.activePlayback.volume(0)
86
99
  }
87
100
 
88
- private numberTo(duration: number, contra = 0) {
89
- this.clearCurrentInterval();
90
- const start = new Date().getTime();
101
+ private onVolumeChange(volume: number) {
102
+ trace(`${T} onVolumeChange`, { volume })
103
+ this.activeVolume = volume
104
+ }
91
105
 
92
- this.interval = setInterval(() => {
93
- let now = (new Date().getTime()) - start;
106
+ private onEnter() {
107
+ trace(`${T} onEnter`)
108
+ this.fade(this.duration, 1)
109
+ }
94
110
 
95
- if (now > duration) {
96
- now = duration;
97
- }
98
- const progress = Math.abs(contra - now / duration);
111
+ private onLeave() {
112
+ trace(`${T} onLeave`)
113
+ this.fade(this.duration, 0)
114
+ }
99
115
 
116
+ private fade(duration: number, to: 0 | 1) {
117
+ this.stopFade()
118
+ const start = new Date().getTime()
119
+ const from = 1 - to
120
+ this.timerId = setInterval(() => {
121
+ const delta = new Date().getTime() - start
122
+ const progress = Math.min(1, delta / duration)
123
+ const normVol = progress * to + (1 - progress) * from
124
+ const volume = normVol * this.activeVolume
125
+ this.core.activePlayback.volume(volume)
100
126
  try {
101
- this.container?.setVolume(progress * this._aboveBorderVolume);
102
- this.core.trigger(VolumeFadeEvents.FADE, progress * this._aboveBorderVolume);
127
+ this.core.trigger(VolumeFadeEvents.FADE, volume)
103
128
  } catch (error) {
104
- // LogManager.exception(error);
105
- reportError(error);
106
- this.clearCurrentInterval();
129
+ reportError(error)
107
130
  }
108
- if (progress >= 1 || progress <= 0) {
109
- this.clearCurrentInterval();
131
+ if (progress >= 1) {
132
+ this.stopFade()
110
133
  }
111
- }, 10);
134
+ }, 10)
112
135
  }
113
136
 
114
- private clearCurrentInterval() {
115
- if (this.interval !== null) {
116
- clearInterval(this.interval);
117
- this.interval = null;
137
+ private stopFade() {
138
+ trace(`${T} stopFade`)
139
+ if (this.timerId !== null) {
140
+ clearInterval(this.timerId)
141
+ this.timerId = null
118
142
  }
119
143
  }
120
-
121
- private onLeave() {
122
- this.numberTo(this.delay, 1);
123
- }
124
144
  }
@@ -234,32 +234,6 @@
234
234
  },
235
235
  "implementsTokenRanges": []
236
236
  },
237
- {
238
- "kind": "TypeAlias",
239
- "canonicalReference": "@gcorevideo/player!BitrateTrackRecord:type",
240
- "docComment": "/**\n * @beta\n */\n",
241
- "excerptTokens": [
242
- {
243
- "kind": "Content",
244
- "text": "export type BitrateTrackRecord = "
245
- },
246
- {
247
- "kind": "Content",
248
- "text": "{\n start: number;\n end?: number;\n time?: number;\n bitrate: number;\n}"
249
- },
250
- {
251
- "kind": "Content",
252
- "text": ";"
253
- }
254
- ],
255
- "fileUrlPath": "src/plugins/clappr-stats/types.ts",
256
- "releaseTag": "Beta",
257
- "name": "BitrateTrackRecord",
258
- "typeTokenRange": {
259
- "startIndex": 1,
260
- "endIndex": 2
261
- }
262
- },
263
237
  {
264
238
  "kind": "Class",
265
239
  "canonicalReference": "@gcorevideo/player!BottomGear:class",
@@ -486,6 +460,32 @@
486
460
  },
487
461
  "implementsTokenRanges": []
488
462
  },
463
+ {
464
+ "kind": "TypeAlias",
465
+ "canonicalReference": "@gcorevideo/player!ClapprStatsBitrateTrack:type",
466
+ "docComment": "/**\n * @beta\n */\n",
467
+ "excerptTokens": [
468
+ {
469
+ "kind": "Content",
470
+ "text": "export type ClapprStatsBitrateTrack = "
471
+ },
472
+ {
473
+ "kind": "Content",
474
+ "text": "{\n start: number;\n end?: number;\n time?: number;\n bitrate: number;\n}"
475
+ },
476
+ {
477
+ "kind": "Content",
478
+ "text": ";"
479
+ }
480
+ ],
481
+ "fileUrlPath": "src/plugins/clappr-stats/types.ts",
482
+ "releaseTag": "Beta",
483
+ "name": "ClapprStatsBitrateTrack",
484
+ "typeTokenRange": {
485
+ "startIndex": 1,
486
+ "endIndex": 2
487
+ }
488
+ },
489
489
  {
490
490
  "kind": "Enum",
491
491
  "canonicalReference": "@gcorevideo/player!ClapprStatsChronograph:enum",
@@ -1053,8 +1053,8 @@
1053
1053
  },
1054
1054
  {
1055
1055
  "kind": "Reference",
1056
- "text": "BitrateTrackRecord",
1057
- "canonicalReference": "@gcorevideo/player!BitrateTrackRecord:type"
1056
+ "text": "ClapprStatsBitrateTrack",
1057
+ "canonicalReference": "@gcorevideo/player!ClapprStatsBitrateTrack:type"
1058
1058
  },
1059
1059
  {
1060
1060
  "kind": "Content",
@@ -1925,6 +1925,44 @@
1925
1925
  "endIndex": 2
1926
1926
  }
1927
1927
  },
1928
+ {
1929
+ "kind": "Enum",
1930
+ "canonicalReference": "@gcorevideo/player!ExtendedEvents:enum",
1931
+ "docComment": "",
1932
+ "excerptTokens": [
1933
+ {
1934
+ "kind": "Content",
1935
+ "text": "export declare enum ExtendedEvents "
1936
+ }
1937
+ ],
1938
+ "fileUrlPath": "src/plugins/media-control/MediaControl.ts",
1939
+ "releaseTag": "Public",
1940
+ "name": "ExtendedEvents",
1941
+ "preserveMemberOrder": false,
1942
+ "members": [
1943
+ {
1944
+ "kind": "EnumMember",
1945
+ "canonicalReference": "@gcorevideo/player!ExtendedEvents.MEDIACONTROL_VOLUME:member",
1946
+ "docComment": "",
1947
+ "excerptTokens": [
1948
+ {
1949
+ "kind": "Content",
1950
+ "text": "MEDIACONTROL_VOLUME = "
1951
+ },
1952
+ {
1953
+ "kind": "Content",
1954
+ "text": "\"mediacontrol:volume\""
1955
+ }
1956
+ ],
1957
+ "initializerTokenRange": {
1958
+ "startIndex": 1,
1959
+ "endIndex": 2
1960
+ },
1961
+ "releaseTag": "Public",
1962
+ "name": "MEDIACONTROL_VOLUME"
1963
+ }
1964
+ ]
1965
+ },
1928
1966
  {
1929
1967
  "kind": "Class",
1930
1968
  "canonicalReference": "@gcorevideo/player!Favicon:class",
@@ -2019,7 +2057,7 @@
2019
2057
  {
2020
2058
  "kind": "EnumMember",
2021
2059
  "canonicalReference": "@gcorevideo/player!GearEvents.RENDERED:member",
2022
- "docComment": "/**\n * Use this event to accurately attach an item to the gear menu\n */\n",
2060
+ "docComment": "/**\n * Subscribe to this event to accurately attach an item to the gear menu\n */\n",
2023
2061
  "excerptTokens": [
2024
2062
  {
2025
2063
  "kind": "Content",
@@ -3276,7 +3314,7 @@
3276
3314
  {
3277
3315
  "kind": "Method",
3278
3316
  "canonicalReference": "@gcorevideo/player!MediaControl#mount:member(1)",
3279
- "docComment": "/**\n * Get a media control element DOM node\n *\n * @remarks\n *\n * Use this method to render custom media control UI in a plugin\n *\n * @deprecated\n *\n * Use {@link MediaControl.putElement} instead\n *\n * @param name - The name of the media control element\n *\n * @returns The DOM node to render to or extend\n *\n * @example\n * ```ts\n * class MyPlugin extends UICorePlugin {\n * override render() {\n * this.$el.html('<div data-clips>Here we go</div>')\n * this.core.getPlugin('media_control').mount('clips', this.$el)\n * return this\n * }\n * }\n * ```\n *\n */\n",
3317
+ "docComment": "/**\n * Get a media control element DOM node\n *\n * @remarks\n *\n * Use this method to render custom media control UI in a plugin\n *\n * @param name - The name of the media control element\n *\n * @returns The DOM node to render to or extend\n *\n * @example\n * ```ts\n * class MyPlugin extends UICorePlugin {\n * override render() {\n * this.$el.html('<div data-clips>Here we go</div>')\n * this.core.getPlugin('media_control').mount('clips', this.$el)\n * return this\n * }\n * }\n * ```\n *\n */\n",
3280
3318
  "excerptTokens": [
3281
3319
  {
3282
3320
  "kind": "Content",
@@ -3372,7 +3410,7 @@
3372
3410
  {
3373
3411
  "kind": "Method",
3374
3412
  "canonicalReference": "@gcorevideo/player!MediaControl#putElement:member(1)",
3375
- "docComment": "",
3413
+ "docComment": "/**\n * @deprecated\n *\n * Use {@link MediaControl.mount} instead\n *\n * @param name - \n *\n * @param element - \n */\n",
3376
3414
  "excerptTokens": [
3377
3415
  {
3378
3416
  "kind": "Content",
@@ -3533,7 +3571,7 @@
3533
3571
  {
3534
3572
  "kind": "Method",
3535
3573
  "canonicalReference": "@gcorevideo/player!MediaControl#toggleElement:member(1)",
3536
- "docComment": "/**\n * Toggle the visibility of a media control element\n *\n * @param name - The name of the media control element\n *\n * @param show - Whether to show or hide the element\n */\n",
3574
+ "docComment": "/**\n * Toggle the visibility of a media control element\n *\n * @param name - The name of the media control element\n *\n * @param show - Visibility state\n */\n",
3537
3575
  "excerptTokens": [
3538
3576
  {
3539
3577
  "kind": "Content",
@@ -9818,7 +9856,7 @@
9818
9856
  {
9819
9857
  "kind": "Class",
9820
9858
  "canonicalReference": "@gcorevideo/player!VolumeFade:class",
9821
- "docComment": "/**\n * `PLUGIN` that applies fade effect to the player's volume change.\n *\n * @beta\n */\n",
9859
+ "docComment": "/**\n * `PLUGIN` that mutes the sound and fades it in when the mouse is over the player.\n *\n * @remarks\n *\n * When the user moves the mouse over and away from the player, the sound is unmuted and unmuted with a fade effect.\n *\n * Depends on {@link MediaControl} plugin. Configuration options - {@link VolumeFadeSettings}\n *\n * @beta\n */\n",
9822
9860
  "excerptTokens": [
9823
9861
  {
9824
9862
  "kind": "Content",
@@ -9839,7 +9877,41 @@
9839
9877
  "isAbstract": false,
9840
9878
  "name": "VolumeFade",
9841
9879
  "preserveMemberOrder": false,
9842
- "members": [],
9880
+ "members": [
9881
+ {
9882
+ "kind": "Constructor",
9883
+ "canonicalReference": "@gcorevideo/player!VolumeFade:constructor(1)",
9884
+ "docComment": "/**\n * Constructs a new instance of the `VolumeFade` class\n */\n",
9885
+ "excerptTokens": [
9886
+ {
9887
+ "kind": "Content",
9888
+ "text": "constructor(core: "
9889
+ },
9890
+ {
9891
+ "kind": "Reference",
9892
+ "text": "Core",
9893
+ "canonicalReference": "@clappr/core!default:class"
9894
+ },
9895
+ {
9896
+ "kind": "Content",
9897
+ "text": ");"
9898
+ }
9899
+ ],
9900
+ "releaseTag": "Beta",
9901
+ "isProtected": false,
9902
+ "overloadIndex": 1,
9903
+ "parameters": [
9904
+ {
9905
+ "parameterName": "core",
9906
+ "parameterTypeTokenRange": {
9907
+ "startIndex": 1,
9908
+ "endIndex": 2
9909
+ },
9910
+ "isOptional": false
9911
+ }
9912
+ ]
9913
+ }
9914
+ ],
9843
9915
  "extendsTokenRange": {
9844
9916
  "startIndex": 1,
9845
9917
  "endIndex": 2
@@ -9884,6 +9956,32 @@
9884
9956
  }
9885
9957
  ]
9886
9958
  },
9959
+ {
9960
+ "kind": "TypeAlias",
9961
+ "canonicalReference": "@gcorevideo/player!VolumeFadeSettings:type",
9962
+ "docComment": "/**\n * @beta\n */\n",
9963
+ "excerptTokens": [
9964
+ {
9965
+ "kind": "Content",
9966
+ "text": "export type VolumeFadeSettings = "
9967
+ },
9968
+ {
9969
+ "kind": "Content",
9970
+ "text": "{\n level?: number;\n duration?: number;\n}"
9971
+ },
9972
+ {
9973
+ "kind": "Content",
9974
+ "text": ";"
9975
+ }
9976
+ ],
9977
+ "fileUrlPath": "src/plugins/volume-fade/VolumeFade.ts",
9978
+ "releaseTag": "Beta",
9979
+ "name": "VolumeFadeSettings",
9980
+ "typeTokenRange": {
9981
+ "startIndex": 1,
9982
+ "endIndex": 2
9983
+ }
9984
+ },
9887
9985
  {
9888
9986
  "kind": "Interface",
9889
9987
  "canonicalReference": "@gcorevideo/player!WatchEventData:interface",