@gcorevideo/player 2.22.18 → 2.22.20

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 (84) hide show
  1. package/assets/audio-selector/track-selector.ejs +3 -3
  2. package/assets/bottom-gear/bottomgear.ejs +3 -3
  3. package/assets/dvr-controls/dvr_controls.scss +0 -12
  4. package/dist/core.js +1 -1
  5. package/dist/index.css +803 -810
  6. package/dist/index.js +195 -176
  7. package/dist/player.d.ts +121 -108
  8. package/dist/plugins/index.css +904 -911
  9. package/dist/plugins/index.js +132 -112
  10. package/docs/api/player.bitratetrackrecord.md +20 -0
  11. package/docs/api/player.clapprstats.exportmetrics.md +2 -2
  12. package/docs/api/player.clapprstats.md +0 -4
  13. package/docs/api/player.clapprstatschronograph.md +115 -0
  14. package/docs/api/player.clapprstatscounter.md +211 -0
  15. package/docs/api/player.clapprstatsevents.md +51 -0
  16. package/docs/api/player.clapprstatsmetrics.md +52 -0
  17. package/docs/api/player.clipspluginsettings.md +1 -1
  18. package/docs/api/player.md +57 -2
  19. package/docs/api/player.nerdstats.md +3 -3
  20. package/docs/api/player.playerconfig.md +1 -1
  21. package/docs/api/player.playerconfig.playbacktype.md +6 -1
  22. package/docs/api/player.timeupdate.md +6 -3
  23. package/lib/plugins/audio-selector/AudioSelector.d.ts +1 -1
  24. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  25. package/lib/plugins/audio-selector/AudioSelector.js +15 -8
  26. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
  27. package/lib/plugins/bottom-gear/BottomGear.js +2 -2
  28. package/lib/plugins/clappr-nerd-stats/NerdStats.d.ts +4 -4
  29. package/lib/plugins/clappr-nerd-stats/NerdStats.js +4 -4
  30. package/lib/plugins/clappr-stats/ClapprStats.d.ts +5 -2
  31. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
  32. package/lib/plugins/clappr-stats/ClapprStats.js +31 -33
  33. package/lib/plugins/clappr-stats/types.d.ts +21 -21
  34. package/lib/plugins/clappr-stats/types.d.ts.map +1 -1
  35. package/lib/plugins/clappr-stats/types.js +22 -22
  36. package/lib/plugins/clappr-stats/utils.d.ts +2 -2
  37. package/lib/plugins/clappr-stats/utils.d.ts.map +1 -1
  38. package/lib/plugins/click-to-pause/ClickToPause.js +1 -1
  39. package/lib/plugins/clips/Clips.d.ts +1 -1
  40. package/lib/plugins/dvr-controls/DvrControls.d.ts +6 -2
  41. package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
  42. package/lib/plugins/dvr-controls/DvrControls.js +39 -27
  43. package/lib/plugins/media-control/MediaControl.d.ts +6 -2
  44. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  45. package/lib/plugins/media-control/MediaControl.js +20 -9
  46. package/lib/plugins/picture-in-picture/PictureInPicture.js +1 -1
  47. package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
  48. package/lib/plugins/vast-ads/VastAds.js +1 -1
  49. package/lib/plugins/vast-ads/rollmanager.js +1 -1
  50. package/lib/testUtils.d.ts.map +1 -1
  51. package/lib/testUtils.js +7 -4
  52. package/lib/types.d.ts +1 -1
  53. package/package.json +3 -3
  54. package/src/playback/__tests__/HTML5Video.test.ts +2 -2
  55. package/src/plugins/audio-selector/AudioSelector.ts +14 -7
  56. package/src/plugins/audio-selector/__tests__/AudioSelector.test.ts +8 -8
  57. package/src/plugins/audio-selector/__tests__/__snapshots__/AudioSelector.test.ts.snap +15 -15
  58. package/src/plugins/bottom-gear/BottomGear.ts +2 -2
  59. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +8 -5
  60. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +3 -3
  61. package/src/plugins/clappr-nerd-stats/NerdStats.ts +5 -5
  62. package/src/plugins/clappr-stats/ClapprStats.ts +41 -40
  63. package/src/plugins/clappr-stats/__tests__/ClapprStats.test.ts +12 -12
  64. package/src/plugins/clappr-stats/types.ts +21 -21
  65. package/src/plugins/clappr-stats/utils.ts +2 -2
  66. package/src/plugins/click-to-pause/ClickToPause.ts +1 -1
  67. package/src/plugins/clips/Clips.ts +1 -1
  68. package/src/plugins/clips/__tests__/Clips.test.ts +1 -1
  69. package/src/plugins/clips/__tests__/__snapshots__/Clips.test.ts.snap +1 -1
  70. package/src/plugins/dvr-controls/DvrControls.ts +51 -37
  71. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +84 -26
  72. package/src/plugins/dvr-controls/__tests__/__snapshots__/DvrControls.test.ts.snap +0 -12
  73. package/src/plugins/media-control/MediaControl.ts +21 -9
  74. package/src/plugins/media-control/__tests__/MediaControl.test.ts +8 -5
  75. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +20 -20
  76. package/src/plugins/picture-in-picture/PictureInPicture.ts +1 -1
  77. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  78. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
  79. package/src/plugins/vast-ads/VastAds.ts +1 -1
  80. package/src/plugins/vast-ads/rollmanager.ts +1 -1
  81. package/src/testUtils.ts +11 -5
  82. package/src/types.ts +1 -1
  83. package/temp/player.api.json +630 -12
  84. package/tsconfig.tsbuildinfo +1 -1
package/dist/index.js CHANGED
@@ -12680,7 +12680,7 @@ var PlaybackEvents;
12680
12680
  // https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
12681
12681
  const AUTO$1 = -1;
12682
12682
  const { now: now$2 } = Utils;
12683
- const T$l = 'playback.dash';
12683
+ const T$k = 'playback.dash';
12684
12684
  class DashPlayback extends BasePlayback {
12685
12685
  _levels = null;
12686
12686
  _currentLevel = null;
@@ -12955,10 +12955,10 @@ class DashPlayback extends BasePlayback {
12955
12955
  }
12956
12956
  _onPlaybackError = (event) => {
12957
12957
  // TODO
12958
- trace(`${T$l} _onPlaybackError`, { event });
12958
+ trace(`${T$k} _onPlaybackError`, { event });
12959
12959
  };
12960
12960
  _onDASHJSSError = (event) => {
12961
- trace(`${T$l} _onDASHJSSError`, { event });
12961
+ trace(`${T$k} _onDASHJSSError`, { event });
12962
12962
  this._stopTimeUpdateTimer();
12963
12963
  // Note that the other error types are deprecated
12964
12964
  const e = event.error;
@@ -12993,7 +12993,7 @@ class DashPlayback extends BasePlayback {
12993
12993
  }
12994
12994
  };
12995
12995
  triggerError(error) {
12996
- trace(`${T$l} triggerError`, { error });
12996
+ trace(`${T$k} triggerError`, { error });
12997
12997
  // this triggers Events.ERROR to be handled by the UI
12998
12998
  this.trigger(Events$1.PLAYBACK_ERROR, this.createError(error, {
12999
12999
  useCodePrefix: false,
@@ -13032,10 +13032,10 @@ class DashPlayback extends BasePlayback {
13032
13032
  }
13033
13033
  get dvrEnabled() {
13034
13034
  if (!this._dash) {
13035
- trace(`${T$l} dvrEnable no dash player instance`);
13035
+ trace(`${T$k} dvrEnable no dash player instance`);
13036
13036
  return false;
13037
13037
  }
13038
- trace(`${T$l} get.dvrEnabled`, {
13038
+ trace(`${T$k} get.dvrEnabled`, {
13039
13039
  dvrWindowSize: this._dash?.getDVRWindowSize(),
13040
13040
  minDvrSize: this._minDvrSize,
13041
13041
  playbackType: this.getPlaybackType(),
@@ -13057,7 +13057,7 @@ class DashPlayback extends BasePlayback {
13057
13057
  this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
13058
13058
  }
13059
13059
  play() {
13060
- trace(`${T$l} play`, { dash: !!this._dash });
13060
+ trace(`${T$k} play`, { dash: !!this._dash });
13061
13061
  if (!this._dash) {
13062
13062
  this._setup();
13063
13063
  }
@@ -13143,7 +13143,7 @@ class DashPlayback extends BasePlayback {
13143
13143
  }
13144
13144
  // @ts-expect-error
13145
13145
  get currentAudioTrack() {
13146
- trace(`${T$l} get currentAudioTrack`);
13146
+ trace(`${T$k} get currentAudioTrack`);
13147
13147
  assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
13148
13148
  const t = this._dash.getCurrentTrackFor('audio');
13149
13149
  if (!t) {
@@ -41844,7 +41844,7 @@ const AUTO = -1;
41844
41844
  const DEFAULT_RECOVER_ATTEMPTS = 16;
41845
41845
  Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
41846
41846
  Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
41847
- const T$k = 'playback.hls';
41847
+ const T$j = 'playback.hls';
41848
41848
  class HlsPlayback extends BasePlayback {
41849
41849
  _ccIsSetup = false;
41850
41850
  _ccTracksUpdated = false;
@@ -42073,7 +42073,7 @@ class HlsPlayback extends BasePlayback {
42073
42073
  maxBufferLength: 2,
42074
42074
  maxMaxBufferLength: 4,
42075
42075
  }, this.options.playback.hlsjsConfig);
42076
- trace(`${T$k} _createHLSInstance`, { config });
42076
+ trace(`${T$j} _createHLSInstance`, { config });
42077
42077
  this._hls = new Hls(config);
42078
42078
  }
42079
42079
  _attachHLSMedia() {
@@ -42164,7 +42164,7 @@ class HlsPlayback extends BasePlayback {
42164
42164
  }
42165
42165
  else {
42166
42166
  Log.error('hlsjs: failed to recover', { evt, data });
42167
- trace(`${T$k} _recover failed to recover`, {
42167
+ trace(`${T$j} _recover failed to recover`, {
42168
42168
  type: data.type,
42169
42169
  details: data.details,
42170
42170
  });
@@ -42250,7 +42250,7 @@ class HlsPlayback extends BasePlayback {
42250
42250
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
42251
42251
  }
42252
42252
  _onHLSJSError(evt, data) {
42253
- trace(`${T$k} _onHLSJSError`, {
42253
+ trace(`${T$j} _onHLSJSError`, {
42254
42254
  fatal: data.fatal,
42255
42255
  type: data.type,
42256
42256
  details: data.details,
@@ -42298,7 +42298,7 @@ class HlsPlayback extends BasePlayback {
42298
42298
  evt,
42299
42299
  data,
42300
42300
  });
42301
- trace(`${T$k} _onHLSJSError trying to recover from network error`, {
42301
+ trace(`${T$j} _onHLSJSError trying to recover from network error`, {
42302
42302
  details: data.details,
42303
42303
  });
42304
42304
  error.level = PlayerError.Levels.WARN;
@@ -42311,7 +42311,7 @@ class HlsPlayback extends BasePlayback {
42311
42311
  evt,
42312
42312
  data,
42313
42313
  });
42314
- trace(`${T$k} _onHLSJSError trying to recover from media error`, {
42314
+ trace(`${T$j} _onHLSJSError trying to recover from media error`, {
42315
42315
  details: data.details,
42316
42316
  });
42317
42317
  error.level = PlayerError.Levels.WARN;
@@ -42341,7 +42341,7 @@ class HlsPlayback extends BasePlayback {
42341
42341
  return;
42342
42342
  }
42343
42343
  Log.warn('hlsjs: non-fatal error occurred', { evt, data });
42344
- trace(`${T$k} _onHLSJSError non-fatal error occurred`, {
42344
+ trace(`${T$j} _onHLSJSError non-fatal error occurred`, {
42345
42345
  type: data.type,
42346
42346
  details: data.details,
42347
42347
  });
@@ -42675,11 +42675,11 @@ class HlsPlayback extends BasePlayback {
42675
42675
  this._hls.audioTrack = Number(id); // TODO or find index by .id == id?
42676
42676
  }
42677
42677
  _onAudioTracksUpdated(_, data) {
42678
- trace(`${T$k} onAudioTracksUpdated`);
42678
+ trace(`${T$j} onAudioTracksUpdated`);
42679
42679
  this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, data.audioTracks.map(toClapprTrack));
42680
42680
  }
42681
42681
  _onAudioTrackSwitched(_, data) {
42682
- trace(`${T$k} onAudioTrackSwitched`);
42682
+ trace(`${T$j} onAudioTrackSwitched`);
42683
42683
  // @ts-ignore
42684
42684
  const track = this._hls.audioTracks[data.id];
42685
42685
  this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack(track));
@@ -42700,7 +42700,7 @@ function toClapprTrack(t) {
42700
42700
  };
42701
42701
  }
42702
42702
 
42703
- const T$j = 'playback.html5_video';
42703
+ const T$i = 'playback.html5_video';
42704
42704
  const STALL_TIMEOUT = 15000;
42705
42705
  class HTML5Video extends BasePlayback {
42706
42706
  stallTimerId = null;
@@ -42708,7 +42708,7 @@ class HTML5Video extends BasePlayback {
42708
42708
  * @internal
42709
42709
  */
42710
42710
  createError(errorData, options) {
42711
- trace(`${T$j} createError`, {
42711
+ trace(`${T$i} createError`, {
42712
42712
  errorData: { ...errorData },
42713
42713
  });
42714
42714
  const i18n = this.i18n ||
@@ -42724,11 +42724,11 @@ class HTML5Video extends BasePlayback {
42724
42724
  return super.createError(errorData, { ...options, useCodePrefix: false });
42725
42725
  }
42726
42726
  _onWaiting() {
42727
- trace(`${T$j} _onWaiting`);
42727
+ trace(`${T$i} _onWaiting`);
42728
42728
  super._onWaiting();
42729
42729
  }
42730
42730
  _onEnded() {
42731
- trace(`${T$j} _onEnded`);
42731
+ trace(`${T$i} _onEnded`);
42732
42732
  if (this.stallTimerId) {
42733
42733
  clearTimeout(this.stallTimerId);
42734
42734
  this.stallTimerId = null;
@@ -42736,12 +42736,12 @@ class HTML5Video extends BasePlayback {
42736
42736
  super._onEnded();
42737
42737
  }
42738
42738
  _handleBufferingEvents() {
42739
- trace(`${T$j} _handleBufferingEvents`, {
42739
+ trace(`${T$i} _handleBufferingEvents`, {
42740
42740
  networkState: this.el.networkState,
42741
42741
  });
42742
42742
  if (!this.stallTimerId) {
42743
42743
  this.stallTimerId = setTimeout(() => {
42744
- trace(`${T$j} _handleBufferingEvents stall timeout`, {
42744
+ trace(`${T$i} _handleBufferingEvents stall timeout`, {
42745
42745
  buffering: this.buffering,
42746
42746
  ended: this.ended,
42747
42747
  });
@@ -42759,7 +42759,7 @@ class HTML5Video extends BasePlayback {
42759
42759
  super._handleBufferingEvents();
42760
42760
  }
42761
42761
  _onPlaying() {
42762
- trace(`${T$j} _onPlaying`);
42762
+ trace(`${T$i} _onPlaying`);
42763
42763
  if (this.stallTimerId) {
42764
42764
  clearTimeout(this.stallTimerId);
42765
42765
  this.stallTimerId = null;
@@ -42767,7 +42767,7 @@ class HTML5Video extends BasePlayback {
42767
42767
  super._onPlaying();
42768
42768
  }
42769
42769
  _onPause() {
42770
- trace(`${T$j} _onPause`);
42770
+ trace(`${T$i} _onPause`);
42771
42771
  super._onPause();
42772
42772
  if (this.stallTimerId) {
42773
42773
  clearTimeout(this.stallTimerId);
@@ -42777,7 +42777,7 @@ class HTML5Video extends BasePlayback {
42777
42777
  get audioTracks() {
42778
42778
  const tracks = this.el.audioTracks;
42779
42779
  const supported = !!tracks;
42780
- trace(`${T$j} get audioTracks`, { supported });
42780
+ trace(`${T$i} get audioTracks`, { supported });
42781
42781
  const retval = [];
42782
42782
  if (supported) {
42783
42783
  for (let i = 0; i < tracks.length; i++) {
@@ -42796,7 +42796,7 @@ class HTML5Video extends BasePlayback {
42796
42796
  get currentAudioTrack() {
42797
42797
  const tracks = this.el.audioTracks;
42798
42798
  const supported = !!tracks;
42799
- trace(`${T$j} get currentAudioTrack`, {
42799
+ trace(`${T$i} get currentAudioTrack`, {
42800
42800
  supported,
42801
42801
  });
42802
42802
  if (supported) {
@@ -42817,7 +42817,7 @@ class HTML5Video extends BasePlayback {
42817
42817
  switchAudioTrack(id) {
42818
42818
  const tracks = this.el.audioTracks;
42819
42819
  const supported = !!tracks;
42820
- trace(`${T$j} switchAudioTrack`, {
42820
+ trace(`${T$i} switchAudioTrack`, {
42821
42821
  supported,
42822
42822
  });
42823
42823
  if (supported) {
@@ -42836,7 +42836,7 @@ function registerPlaybacks() {
42836
42836
  Loader.registerPlayback(DashPlayback);
42837
42837
  }
42838
42838
 
42839
- const T$i = 'GPlayer';
42839
+ const T$h = 'GPlayer';
42840
42840
  const DEFAULT_OPTIONS = {
42841
42841
  autoPlay: false,
42842
42842
  debug: 'none',
@@ -42924,7 +42924,7 @@ class Player {
42924
42924
  * ```
42925
42925
  */
42926
42926
  attachTo(playerElement) {
42927
- trace(`${T$i} attachTo`, {
42927
+ trace(`${T$h} attachTo`, {
42928
42928
  player: !!this.player,
42929
42929
  });
42930
42930
  assert.ok(!this.player, 'Player already initialized');
@@ -42934,7 +42934,7 @@ class Player {
42934
42934
  }
42935
42935
  const coreOpts = this.buildCoreOptions(playerElement);
42936
42936
  const { core, container } = Player.getRegisteredPlugins();
42937
- trace(`${T$i} init`, {
42937
+ trace(`${T$h} init`, {
42938
42938
  registeredPlaybacks: Loader.registeredPlaybacks.map((p) => p.prototype.name),
42939
42939
  });
42940
42940
  coreOpts.plugins = {
@@ -42948,7 +42948,7 @@ class Player {
42948
42948
  * Destroys the player, releasing all resources and unmounting its UI from the DOM.
42949
42949
  */
42950
42950
  destroy() {
42951
- trace(`${T$i} destroy`, {
42951
+ trace(`${T$h} destroy`, {
42952
42952
  player: !!this.player,
42953
42953
  });
42954
42954
  if (this.player) {
@@ -43135,7 +43135,7 @@ class Player {
43135
43135
  this.config = $.extend(true, this.config, config);
43136
43136
  }
43137
43137
  initPlayer(coreOptions) {
43138
- trace(`${T$i} initPlayer`, {
43138
+ trace(`${T$h} initPlayer`, {
43139
43139
  autoPlay: coreOptions.autoPlay,
43140
43140
  sources: coreOptions.sources,
43141
43141
  player: !!this.player,
@@ -43160,7 +43160,7 @@ class Player {
43160
43160
  }
43161
43161
  }
43162
43162
  triggerAutoPlay() {
43163
- trace(`${T$i} triggerAutoPlay`);
43163
+ trace(`${T$h} triggerAutoPlay`);
43164
43164
  setTimeout(() => {
43165
43165
  this.player?.play({
43166
43166
  autoPlay: true,
@@ -43178,7 +43178,7 @@ class Player {
43178
43178
  // TODO test
43179
43179
  events = {
43180
43180
  onReady: () => {
43181
- trace(`${T$i} onReady`, {
43181
+ trace(`${T$h} onReady`, {
43182
43182
  ready: this.ready,
43183
43183
  });
43184
43184
  if (this.ready) {
@@ -43212,7 +43212,7 @@ class Player {
43212
43212
  buildCoreOptions(rootNode) {
43213
43213
  const sources = this.buildMediaSourcesList();
43214
43214
  const source = sources[0];
43215
- trace(`${T$i} buildCoreOptions`, {
43215
+ trace(`${T$h} buildCoreOptions`, {
43216
43216
  source,
43217
43217
  sources,
43218
43218
  });
@@ -43273,7 +43273,7 @@ class Player {
43273
43273
  assert.ok(this.player, 'Player is not initialized');
43274
43274
  const core = this.player.core;
43275
43275
  core.on(Events$1.CORE_SCREEN_ORIENTATION_CHANGED, ({ orientation }) => {
43276
- trace(`${T$i} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43276
+ trace(`${T$h} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43277
43277
  orientation,
43278
43278
  rootNode: {
43279
43279
  width: this.rootNode?.clientWidth,
@@ -43288,14 +43288,14 @@ class Player {
43288
43288
  }
43289
43289
  }, null);
43290
43290
  core.on(Events$1.CORE_RESIZE, ({ width, height }) => {
43291
- trace(`${T$i} on CORE_RESIZE`, {
43291
+ trace(`${T$h} on CORE_RESIZE`, {
43292
43292
  width,
43293
43293
  height,
43294
43294
  });
43295
43295
  this.safeTriggerEvent(PlayerEvent.Resize, { width, height });
43296
43296
  }, null);
43297
43297
  core.on(Events$1.CORE_FULLSCREEN, (isFullscreen) => {
43298
- trace(`${T$i} CORE_FULLSCREEN`, {
43298
+ trace(`${T$h} CORE_FULLSCREEN`, {
43299
43299
  isFullscreen,
43300
43300
  });
43301
43301
  this.safeTriggerEvent(PlayerEvent.Fullscreen, isFullscreen);
@@ -43303,7 +43303,7 @@ class Player {
43303
43303
  }
43304
43304
  }
43305
43305
 
43306
- var version$1 = "2.22.18";
43306
+ var version$1 = "2.22.20";
43307
43307
 
43308
43308
  var packages = {
43309
43309
  "node_modules/@clappr/core": {
@@ -43327,10 +43327,11 @@ function version() {
43327
43327
  };
43328
43328
  }
43329
43329
 
43330
- const pluginHtml$7 = "<button data-audiotracks-button class='gcore-skin-button-color' id=\"audiotracks-button\">\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"><%= icon %></span>\n</button>\n<ul class='gcore-skin-bg-color menu hidden' id=\"audiotracks-select\">\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-audiotracks-select=\"<%= track.id %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43330
+ const pluginHtml$7 = "<button data-audiotracks-button class='gcore-skin-button-color' id=\"audiotracks-button\" aria-haspopup=\"menu\" aria-expanded=\"false\">\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"><%= icon %></span>\n</button>\n<ul class='gcore-skin-bg-color menu hidden' id=\"audiotracks-select\" role=\"menu\">\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-audiotracks-select=\"<%= track.id %>\" role=\"menuitemradio\" aria-checked=\"<%= track.id === current %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43331
43331
 
43332
43332
  const audioArrow = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg width=\"9px\" height=\"6px\" viewBox=\"0 0 9 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <!-- Generator: Sketch 49 (51002) - http://www.bohemiancoding.com/sketch -->\n <title>quality-arrow</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"quality-arrow\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M5.07079194,5.78553848 C4.91457318,5.94277844 4.70551573,6.00941824 4.50028717,5.99893557 C4.2950586,6.00941824 4.08676693,5.94277844 3.92978239,5.78553848 L0.221118462,1.2997069 C-0.0737061539,1.00469478 -0.0737061539,0.526236029 0.221118462,0.231972666 C0.515177299,-0.0630394586 1.23500883,0.00734414472 1.64852907,0.00734414472 L7.77475484,0.00734414472 C8.21201421,0.00734414472 8.48539703,-0.0630394586 8.77945587,0.231972666 C9.07351471,0.526236029 9.07351471,1.00469478 8.77945587,1.2997069 L5.07079194,5.78553848 Z\"\n fill=\"#FFFFFE\"></path>\n </g>\n</svg>\n";
43333
43333
 
43334
+ // import { trace } from '@gcorevideo/utils'
43334
43335
  const VERSION$7 = '2.22.4';
43335
43336
  // const T = 'plugins.audiotracks'
43336
43337
  /**
@@ -43393,7 +43394,7 @@ class AudioTracks extends UICorePlugin {
43393
43394
  const mediaControl = this.core.getPlugin('media_control');
43394
43395
  assert(mediaControl, 'media_control plugin is required');
43395
43396
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, () => {
43396
- mediaControl.putElement('audiotracks', this.$el);
43397
+ mediaControl.mount('audiotracks', this.$el);
43397
43398
  });
43398
43399
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideMenu);
43399
43400
  }
@@ -43424,18 +43425,18 @@ class AudioTracks extends UICorePlugin {
43424
43425
  if (!this.shouldRender()) {
43425
43426
  return this;
43426
43427
  }
43427
- this.core.getPlugin('media_control');
43428
43428
  this.$el.html(AudioTracks.template({
43429
43429
  tracks: this.tracks,
43430
43430
  title: this.getTitle(),
43431
43431
  icon: audioArrow,
43432
+ current: this.currentTrack?.id,
43432
43433
  }));
43433
43434
  this.updateText();
43434
43435
  this.highlightCurrentTrack();
43435
43436
  return this;
43436
43437
  }
43437
43438
  onTrackSelect(event) {
43438
- const id = event.target?.dataset?.audiotracksSelect;
43439
+ const id = event.currentTarget?.dataset?.audiotracksSelect;
43439
43440
  if (id) {
43440
43441
  this.selectAudioTrack(id);
43441
43442
  }
@@ -43444,7 +43445,7 @@ class AudioTracks extends UICorePlugin {
43444
43445
  return false;
43445
43446
  }
43446
43447
  selectAudioTrack(id) {
43447
- this.startTrackSwitch();
43448
+ this.startTrackSwitching();
43448
43449
  this.core.activeContainer.switchAudioTrack(id);
43449
43450
  this.updateText();
43450
43451
  }
@@ -43452,7 +43453,9 @@ class AudioTracks extends UICorePlugin {
43452
43453
  this.$el.find('#audiotracks-select').addClass('hidden');
43453
43454
  }
43454
43455
  toggleContextMenu() {
43455
- this.$el.find('#audiotracks-select').toggleClass('hidden');
43456
+ this.$el.find('#audiotracks-select').toggleClass('hidden'); // TODO use plain CSS display: none
43457
+ const open = !this.$el.find('#audiotracks-select').hasClass('hidden'); // TODO hold state
43458
+ this.$el.find('#audiotracks-button').attr('aria-expanded', open);
43456
43459
  }
43457
43460
  buttonElement() {
43458
43461
  return this.$('button');
@@ -43470,7 +43473,7 @@ class AudioTracks extends UICorePlugin {
43470
43473
  }
43471
43474
  return this.currentTrack.label || this.currentTrack.language;
43472
43475
  }
43473
- startTrackSwitch() {
43476
+ startTrackSwitching() {
43474
43477
  this.buttonElement().addClass('changing');
43475
43478
  }
43476
43479
  updateText() {
@@ -43481,12 +43484,16 @@ class AudioTracks extends UICorePlugin {
43481
43484
  }
43482
43485
  highlightCurrentTrack() {
43483
43486
  this.trackElement().removeClass('current');
43484
- this.trackElement().find('a').removeClass('gcore-skin-active');
43487
+ this.trackElement()
43488
+ .find('a')
43489
+ .removeClass('gcore-skin-active')
43490
+ .attr('aria-checked', 'false');
43485
43491
  if (this.currentTrack) {
43486
43492
  this.trackElement(this.currentTrack.id)
43487
43493
  .addClass('current')
43488
43494
  .find('a')
43489
- .addClass('gcore-skin-active');
43495
+ .addClass('gcore-skin-active')
43496
+ .attr('aria-checked', 'true');
43490
43497
  }
43491
43498
  }
43492
43499
  }
@@ -43495,7 +43502,7 @@ const volumeOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fil
43495
43502
 
43496
43503
  const pluginHtml$6 = "<div class=\"big-mute-icon-wrapper\" data-big-mute>\n <div class=\"big-mute-icon gcore-skin-border-color\" data-big-mute-icon></div>\n</div>\n";
43497
43504
 
43498
- const T$h = 'plugins.big_mute_button';
43505
+ const T$g = 'plugins.big_mute_button';
43499
43506
  // TODO rewrite as a container plugin
43500
43507
  /**
43501
43508
  * `PLUGIN` that displays a big mute button over the video when it's muted.
@@ -43536,7 +43543,7 @@ class BigMuteButton extends UICorePlugin {
43536
43543
  this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
43537
43544
  this.listenTo(this.core, 'core:advertisement:start', this.onStartAd);
43538
43545
  this.listenTo(this.core, 'core:advertisement:finish', this.onFinishAd);
43539
- trace(`${T$h} bindEvents`, {
43546
+ trace(`${T$g} bindEvents`, {
43540
43547
  mediacontrol: !!this.core.mediaControl,
43541
43548
  });
43542
43549
  this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.mediaControlRendered);
@@ -43561,12 +43568,12 @@ class BigMuteButton extends UICorePlugin {
43561
43568
  }
43562
43569
  mediaControlRendered() {
43563
43570
  const container = this.core.activeContainer;
43564
- trace(`${T$h} mediaControlRendered`, {
43571
+ trace(`${T$g} mediaControlRendered`, {
43565
43572
  container: !!container,
43566
43573
  });
43567
43574
  if (container) {
43568
43575
  this.listenTo(container.playback, Events$1.PLAYBACK_PLAY, () => {
43569
- trace(`${T$h} PLAYBACK_PLAY`);
43576
+ trace(`${T$g} PLAYBACK_PLAY`);
43570
43577
  this.render();
43571
43578
  });
43572
43579
  }
@@ -43590,7 +43597,7 @@ class BigMuteButton extends UICorePlugin {
43590
43597
  }
43591
43598
  const { autoPlay, wasMuted } = this.options;
43592
43599
  const volume = container.volume;
43593
- trace(`${T$h} shouldRender`, {
43600
+ trace(`${T$g} shouldRender`, {
43594
43601
  autoPlay,
43595
43602
  wasMuted,
43596
43603
  volume,
@@ -43602,7 +43609,7 @@ class BigMuteButton extends UICorePlugin {
43602
43609
  */
43603
43610
  render() {
43604
43611
  if (this.shouldRender()) {
43605
- trace(`${T$h} render`, {
43612
+ trace(`${T$g} render`, {
43606
43613
  el: !!this.$el,
43607
43614
  });
43608
43615
  this.$el.html(BigMuteButton.template());
@@ -43641,14 +43648,14 @@ class BigMuteButton extends UICorePlugin {
43641
43648
  }
43642
43649
  }
43643
43650
 
43644
- const pluginHtml$5 = "<button type=\"button\" class=\"media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" id=\"gear-button\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\" id=\"gear-options-wrapper\" style=\"display: none;\">\n <ul class=\"gear-options-list\" id=\"gear-options\"></ul>\n</div>\n";
43651
+ const pluginHtml$5 = "<button class=\"media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" id=\"gear-button\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\" id=\"gear-options-wrapper\" style=\"display:none\">\n <ul class=\"gear-options-list\" id=\"gear-options\" role=\"menu\"></ul>\n</div>\n";
43645
43652
 
43646
43653
  const gearIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_660_1503)\">\n <path\n d=\"M19.14 12.94C19.18 12.64 19.2 12.33 19.2 12C19.2 11.68 19.18 11.36 19.13 11.06L21.16 9.47999C21.34 9.33999 21.39 9.06999 21.28 8.86999L19.36 5.54999C19.24 5.32999 18.99 5.25999 18.77 5.32999L16.38 6.28999C15.88 5.90999 15.35 5.58999 14.76 5.34999L14.4 2.80999C14.36 2.56999 14.16 2.39999 13.92 2.39999H10.08C9.83999 2.39999 9.64999 2.56999 9.60999 2.80999L9.24999 5.34999C8.65999 5.58999 8.11999 5.91999 7.62999 6.28999L5.23999 5.32999C5.01999 5.24999 4.76999 5.32999 4.64999 5.54999L2.73999 8.86999C2.61999 9.07999 2.65999 9.33999 2.85999 9.47999L4.88999 11.06C4.83999 11.36 4.79999 11.69 4.79999 12C4.79999 12.31 4.81999 12.64 4.86999 12.94L2.83999 14.52C2.65999 14.66 2.60999 14.93 2.71999 15.13L4.63999 18.45C4.75999 18.67 5.00999 18.74 5.22999 18.67L7.61999 17.71C8.11999 18.09 8.64999 18.41 9.23999 18.65L9.59999 21.19C9.64999 21.43 9.83999 21.6 10.08 21.6H13.92C14.16 21.6 14.36 21.43 14.39 21.19L14.75 18.65C15.34 18.41 15.88 18.09 16.37 17.71L18.76 18.67C18.98 18.75 19.23 18.67 19.35 18.45L21.27 15.13C21.39 14.91 21.34 14.66 21.15 14.52L19.14 12.94ZM12 15.6C10.02 15.6 8.39999 13.98 8.39999 12C8.39999 10.02 10.02 8.39999 12 8.39999C13.98 8.39999 15.6 10.02 15.6 12C15.6 13.98 13.98 15.6 12 15.6Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_660_1503\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
43647
43654
 
43648
43655
  const gearHdIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1567)\">\n <path\n d=\"M19.14 12.94C19.18 12.64 19.2 12.33 19.2 12C19.2 11.68 19.18 11.36 19.13 11.06L21.16 9.47999C21.34 9.33999 21.39 9.06999 21.28 8.86999L19.36 5.54999C19.24 5.32999 18.99 5.25999 18.77 5.32999L16.38 6.28999C15.88 5.90999 15.35 5.58999 14.76 5.34999L14.4 2.80999C14.36 2.56999 14.16 2.39999 13.92 2.39999H10.08C9.83999 2.39999 9.64999 2.56999 9.60999 2.80999L9.24999 5.34999C8.65999 5.58999 8.11999 5.91999 7.62999 6.28999L5.23999 5.32999C5.01999 5.24999 4.76999 5.32999 4.64999 5.54999L2.73999 8.86999C2.61999 9.07999 2.65999 9.33999 2.85999 9.47999L4.88999 11.06C4.83999 11.36 4.79999 11.69 4.79999 12C4.79999 12.31 4.81999 12.64 4.86999 12.94L2.83999 14.52C2.65999 14.66 2.60999 14.93 2.71999 15.13L4.63999 18.45C4.75999 18.67 5.00999 18.74 5.22999 18.67L7.61999 17.71C8.11999 18.09 8.64999 18.41 9.23999 18.65L9.59999 21.19C9.64999 21.43 9.83999 21.6 10.08 21.6H13.92C14.16 21.6 14.36 21.43 14.39 21.19L14.75 18.65C15.34 18.41 15.88 18.09 16.37 17.71L18.76 18.67C18.98 18.75 19.23 18.67 19.35 18.45L21.27 15.13C21.39 14.91 21.34 14.66 21.15 14.52L19.14 12.94ZM12 15.6C10.02 15.6 8.39999 13.98 8.39999 12C8.39999 10.02 10.02 8.39999 12 8.39999C13.98 8.39999 15.6 10.02 15.6 12C15.6 13.98 13.98 15.6 12 15.6Z\"\n fill=\"#C9C9C9\"/>\n <rect x=\"13\" width=\"11\" height=\"7\" rx=\"1\" fill=\"#F6413B\"/>\n <path\n d=\"M14.6962 6V1.63636H15.3546V3.53267H17.53V1.63636H18.1905V6H17.53V4.0973H15.3546V6H14.6962ZM20.562 6H19.1493V1.63636H20.6067C21.0343 1.63636 21.4015 1.72372 21.7083 1.89844C22.0151 2.07173 22.2502 2.32102 22.4135 2.64631C22.5783 2.97017 22.6607 3.35866 22.6607 3.81179C22.6607 4.26634 22.5776 4.65696 22.4114 4.98366C22.2466 5.31037 22.008 5.56179 21.6955 5.73793C21.383 5.91264 21.0051 6 20.562 6ZM19.8077 5.42472H20.5257C20.8581 5.42472 21.1344 5.36222 21.3546 5.23722C21.5748 5.1108 21.7395 4.92827 21.8489 4.68963C21.9583 4.44957 22.013 4.15696 22.013 3.81179C22.013 3.46946 21.9583 3.17898 21.8489 2.94034C21.7409 2.7017 21.5797 2.5206 21.3652 2.39702C21.1507 2.27344 20.8844 2.21165 20.5662 2.21165H19.8077V5.42472Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1567\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
43649
43656
 
43650
43657
  const VERSION$6 = '2.19.12';
43651
- const T$g = 'plugins.bottom_gear';
43658
+ const T$f = 'plugins.bottom_gear';
43652
43659
  /**
43653
43660
  * Events triggered by the plugin
43654
43661
  * @beta
@@ -43656,7 +43663,7 @@ const T$g = 'plugins.bottom_gear';
43656
43663
  var GearEvents;
43657
43664
  (function (GearEvents) {
43658
43665
  /**
43659
- * Use this event to accurately attach an item to the gear menu
43666
+ * Subscribe to this event to accurately attach an item to the gear menu
43660
43667
  */
43661
43668
  GearEvents["RENDERED"] = "rendered";
43662
43669
  })(GearEvents || (GearEvents = {}));
@@ -43798,20 +43805,20 @@ class BottomGear extends UICorePlugin {
43798
43805
  addItem(name, $subMenu) {
43799
43806
  const $existingItem = this.$el.find(`#gear-options li[data-${name}`);
43800
43807
  if ($existingItem.length) {
43801
- trace(`${T$g} addItem already exists`, { name });
43808
+ trace(`${T$f} addItem already exists`, { name });
43802
43809
  return $existingItem;
43803
43810
  }
43804
43811
  const $item = $('<li></li>')
43805
43812
  .attr(`data-${name}`, '')
43806
43813
  .appendTo(this.$el.find('#gear-options'));
43807
43814
  if ($subMenu) {
43808
- trace(`${T$g} addItem adding submenu`, { name });
43815
+ trace(`${T$f} addItem adding submenu`, { name });
43809
43816
  $subMenu
43810
43817
  .addClass('gear-sub-menu-wrapper')
43811
43818
  .hide()
43812
43819
  .appendTo(this.$el.find('#gear-options-wrapper'));
43813
43820
  $item.on('click', (e) => {
43814
- trace(`${T$g} addItem submenu clicked`, { name });
43821
+ trace(`${T$f} addItem submenu clicked`, { name });
43815
43822
  e.stopPropagation();
43816
43823
  $subMenu.show();
43817
43824
  this.$el.find('#gear-options').hide();
@@ -43820,15 +43827,15 @@ class BottomGear extends UICorePlugin {
43820
43827
  return $item;
43821
43828
  }
43822
43829
  onActiveContainerChanged() {
43823
- trace(`${T$g} onActiveContainerChanged`);
43830
+ trace(`${T$f} onActiveContainerChanged`);
43824
43831
  this.bindContainerEvents();
43825
43832
  }
43826
43833
  bindContainerEvents() {
43827
- trace(`${T$g} bindContainerEvents`);
43834
+ trace(`${T$f} bindContainerEvents`);
43828
43835
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
43829
43836
  }
43830
43837
  highDefinitionUpdate(isHd) {
43831
- trace(`${T$g} highDefinitionUpdate`, { isHd });
43838
+ trace(`${T$f} highDefinitionUpdate`, { isHd });
43832
43839
  this.isHd = isHd;
43833
43840
  this.$el.find('.gear-icon').html(isHd ? gearHdIcon : gearIcon);
43834
43841
  }
@@ -43836,7 +43843,7 @@ class BottomGear extends UICorePlugin {
43836
43843
  * @internal
43837
43844
  */
43838
43845
  render() {
43839
- trace(`${T$g} render`);
43846
+ trace(`${T$f} render`);
43840
43847
  const mediaControl = this.core.getPlugin('media_control');
43841
43848
  if (!mediaControl) {
43842
43849
  return this; // TODO test
@@ -43868,48 +43875,48 @@ class BottomGear extends UICorePlugin {
43868
43875
  this.$el.find('#gear-options-wrapper').hide();
43869
43876
  }
43870
43877
  onCoreReady() {
43871
- trace(`${T$g} onCoreReady`);
43878
+ trace(`${T$f} onCoreReady`);
43872
43879
  const mediaControl = this.core.getPlugin('media_control');
43873
43880
  assert(mediaControl, 'media_control plugin is required');
43874
43881
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.onMediaControlRendered);
43875
43882
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide);
43876
43883
  }
43877
43884
  onMediaControlRendered() {
43878
- trace(`${T$g} onMediaControlRendered`);
43885
+ trace(`${T$f} onMediaControlRendered`);
43879
43886
  const mediaControl = this.core.getPlugin('media_control');
43880
- mediaControl.putElement('gear', this.$el);
43887
+ mediaControl.mount('gear', this.$el);
43881
43888
  }
43882
43889
  }
43883
43890
 
43884
43891
  /**
43885
43892
  * @beta
43886
43893
  */
43887
- var Chronograph;
43888
- (function (Chronograph) {
43889
- Chronograph["Startup"] = "startup";
43890
- Chronograph["Watch"] = "watch";
43891
- Chronograph["Pause"] = "pause";
43892
- Chronograph["Buffering"] = "buffering";
43893
- Chronograph["Session"] = "session";
43894
+ var ClapprStatsChronograph;
43895
+ (function (ClapprStatsChronograph) {
43896
+ ClapprStatsChronograph["Startup"] = "startup";
43897
+ ClapprStatsChronograph["Watch"] = "watch";
43898
+ ClapprStatsChronograph["Pause"] = "pause";
43899
+ ClapprStatsChronograph["Buffering"] = "buffering";
43900
+ ClapprStatsChronograph["Session"] = "session";
43894
43901
  // Latency = 'latency',
43895
- })(Chronograph || (Chronograph = {}));
43902
+ })(ClapprStatsChronograph || (ClapprStatsChronograph = {}));
43896
43903
  /**
43897
43904
  * @beta
43898
43905
  */
43899
- var Counter;
43900
- (function (Counter) {
43901
- Counter["Play"] = "play";
43902
- Counter["Pause"] = "pause";
43903
- Counter["Error"] = "error";
43904
- Counter["Buffering"] = "buffering";
43905
- Counter["DecodedFrames"] = "decodedFrames";
43906
- Counter["DroppedFrames"] = "droppedFrames";
43907
- Counter["Fps"] = "fps";
43908
- Counter["ChangeLevel"] = "changeLevel";
43909
- Counter["Seek"] = "seek";
43910
- Counter["Fullscreen"] = "fullscreen";
43911
- Counter["DvrUsage"] = "dvrUsage";
43912
- })(Counter || (Counter = {}));
43906
+ var ClapprStatsCounter;
43907
+ (function (ClapprStatsCounter) {
43908
+ ClapprStatsCounter["Play"] = "play";
43909
+ ClapprStatsCounter["Pause"] = "pause";
43910
+ ClapprStatsCounter["Error"] = "error";
43911
+ ClapprStatsCounter["Buffering"] = "buffering";
43912
+ ClapprStatsCounter["DecodedFrames"] = "decodedFrames";
43913
+ ClapprStatsCounter["DroppedFrames"] = "droppedFrames";
43914
+ ClapprStatsCounter["Fps"] = "fps";
43915
+ ClapprStatsCounter["ChangeLevel"] = "changeLevel";
43916
+ ClapprStatsCounter["Seek"] = "seek";
43917
+ ClapprStatsCounter["Fullscreen"] = "fullscreen";
43918
+ ClapprStatsCounter["DvrUsage"] = "dvrUsage";
43919
+ })(ClapprStatsCounter || (ClapprStatsCounter = {}));
43913
43920
  /**
43914
43921
  * @beta
43915
43922
  */
@@ -43970,6 +43977,8 @@ function newMetrics$1() {
43970
43977
  * @remarks
43971
43978
  * This plugin does not render anything and is supposed to be extended or used together with other plugins that actually render something.
43972
43979
  *
43980
+ * @see {@link NerdStats} - a plugin that visualises the playback metrics
43981
+ *
43973
43982
  * Configuration options - {@link ClapprStatsSettings}
43974
43983
  *
43975
43984
  * Events - {@link ClapprStatsEvents}
@@ -43979,11 +43988,11 @@ class ClapprStats extends ContainerPlugin {
43979
43988
  lastDecodedFramesCount = 0;
43980
43989
  metrics = newMetrics$1();
43981
43990
  timers = {
43982
- [Chronograph.Startup]: 0,
43983
- [Chronograph.Watch]: 0,
43984
- [Chronograph.Pause]: 0,
43985
- [Chronograph.Buffering]: 0,
43986
- [Chronograph.Session]: 0,
43991
+ [ClapprStatsChronograph.Startup]: 0,
43992
+ [ClapprStatsChronograph.Watch]: 0,
43993
+ [ClapprStatsChronograph.Pause]: 0,
43994
+ [ClapprStatsChronograph.Buffering]: 0,
43995
+ [ClapprStatsChronograph.Session]: 0,
43987
43996
  };
43988
43997
  runEach;
43989
43998
  /**
@@ -44013,15 +44022,10 @@ class ClapprStats extends ContainerPlugin {
44013
44022
  inc(counter) {
44014
44023
  this.metrics.counters[counter] += 1;
44015
44024
  }
44016
- // _timerHasStarted(timer) {
44017
- // return this[`_start${timer}`] !== undefined;
44018
- // }
44019
44025
  start(timer) {
44020
- // this[`_start${timer}`] = this._now();
44021
44026
  this.timers[timer] = this.now();
44022
44027
  }
44023
44028
  stop(timer) {
44024
- // this._metrics.timers[timer] += this._now() - this[`_start${timer}`];
44025
44029
  this.metrics.chrono[timer] += this.now() - this.timers[timer];
44026
44030
  }
44027
44031
  constructor(container) {
@@ -44041,10 +44045,10 @@ class ClapprStats extends ContainerPlugin {
44041
44045
  this.listenTo(this.container, Events$1.CONTAINER_PAUSE, this.onPause);
44042
44046
  this.listenToOnce(this.container, Events$1.CONTAINER_STATE_BUFFERING, this.onBuffering);
44043
44047
  this.listenTo(this.container, Events$1.CONTAINER_SEEK, this.onSeek);
44044
- this.listenTo(this.container, Events$1.CONTAINER_ERROR, () => this.inc(Counter.Error));
44045
- this.listenTo(this.container, Events$1.CONTAINER_FULLSCREEN, () => this.inc(Counter.Fullscreen));
44048
+ this.listenTo(this.container, Events$1.CONTAINER_ERROR, () => this.inc(ClapprStatsCounter.Error));
44049
+ this.listenTo(this.container, Events$1.CONTAINER_FULLSCREEN, () => this.inc(ClapprStatsCounter.Fullscreen));
44046
44050
  this.listenTo(this.container, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, (dvrInUse) => {
44047
- dvrInUse && this.inc(Counter.DvrUsage);
44051
+ dvrInUse && this.inc(ClapprStatsCounter.DvrUsage);
44048
44052
  });
44049
44053
  this.listenTo(this.container.playback, Events$1.PLAYBACK_PROGRESS, this.onProgress);
44050
44054
  this.listenTo(this.container.playback, Events$1.PLAYBACK_TIMEUPDATE, this.onTimeUpdate);
@@ -44072,7 +44076,7 @@ class ClapprStats extends ContainerPlugin {
44072
44076
  last.time = now - last.start;
44073
44077
  }
44074
44078
  this.metrics.extra.bitratesHistory.push({ start: this.now(), bitrate });
44075
- this.inc(Counter.ChangeLevel);
44079
+ this.inc(ClapprStatsCounter.ChangeLevel);
44076
44080
  }
44077
44081
  stopReporting() {
44078
44082
  this.buildReport();
@@ -44083,31 +44087,31 @@ class ClapprStats extends ContainerPlugin {
44083
44087
  }
44084
44088
  startTimers() {
44085
44089
  this.timerId = setInterval(this.buildReport.bind(this), this.runEach);
44086
- this.start(Chronograph.Session);
44087
- this.start(Chronograph.Startup);
44090
+ this.start(ClapprStatsChronograph.Session);
44091
+ this.start(ClapprStatsChronograph.Startup);
44088
44092
  }
44089
44093
  onFirstPlaying() {
44090
44094
  this.listenTo(this.container, Events$1.CONTAINER_TIMEUPDATE, this.onContainerUpdateWhilePlaying);
44091
- this.start(Chronograph.Watch);
44092
- this.stop(Chronograph.Startup);
44095
+ this.start(ClapprStatsChronograph.Watch);
44096
+ this.stop(ClapprStatsChronograph.Startup);
44093
44097
  }
44094
44098
  playAfterPause() {
44095
44099
  this.listenTo(this.container, Events$1.CONTAINER_TIMEUPDATE, this.onContainerUpdateWhilePlaying);
44096
- this.stop(Chronograph.Pause);
44097
- this.start(Chronograph.Watch);
44100
+ this.stop(ClapprStatsChronograph.Pause);
44101
+ this.start(ClapprStatsChronograph.Watch);
44098
44102
  }
44099
44103
  onPlay() {
44100
- this.inc(Counter.Play);
44104
+ this.inc(ClapprStatsCounter.Play);
44101
44105
  }
44102
44106
  onPause() {
44103
- this.stop(Chronograph.Watch);
44104
- this.start(Chronograph.Pause);
44105
- this.inc(Counter.Pause);
44107
+ this.stop(ClapprStatsChronograph.Watch);
44108
+ this.start(ClapprStatsChronograph.Pause);
44109
+ this.inc(ClapprStatsCounter.Pause);
44106
44110
  this.listenToOnce(this.container, Events$1.CONTAINER_PLAY, this.playAfterPause);
44107
44111
  this.stopListening(this.container, Events$1.CONTAINER_TIMEUPDATE, this.onContainerUpdateWhilePlaying);
44108
44112
  }
44109
44113
  onSeek(e) {
44110
- this.inc(Counter.Seek);
44114
+ this.inc(ClapprStatsCounter.Seek);
44111
44115
  this.metrics.extra.watchHistory.push([e * 1000, e * 1000]);
44112
44116
  }
44113
44117
  onTimeUpdate(e) {
@@ -44132,17 +44136,17 @@ class ClapprStats extends ContainerPlugin {
44132
44136
  }
44133
44137
  onContainerUpdateWhilePlaying() {
44134
44138
  if (this.container.playback.isPlaying()) {
44135
- this.stop(Chronograph.Watch);
44136
- this.start(Chronograph.Watch);
44139
+ this.stop(ClapprStatsChronograph.Watch);
44140
+ this.start(ClapprStatsChronograph.Watch);
44137
44141
  }
44138
44142
  }
44139
44143
  onBuffering() {
44140
- this.inc(Counter.Buffering);
44141
- this.start(Chronograph.Buffering);
44144
+ this.inc(ClapprStatsCounter.Buffering);
44145
+ this.start(ClapprStatsChronograph.Buffering);
44142
44146
  this.listenToOnce(this.container, Events$1.CONTAINER_STATE_BUFFERFULL, this.onBufferfull);
44143
44147
  }
44144
44148
  onBufferfull() {
44145
- this.stop(Chronograph.Buffering);
44149
+ this.stop(ClapprStatsChronograph.Buffering);
44146
44150
  this.listenToOnce(this.container, Events$1.CONTAINER_STATE_BUFFERING, this.onBuffering);
44147
44151
  }
44148
44152
  onProgress(progress) {
@@ -44154,8 +44158,8 @@ class ClapprStats extends ContainerPlugin {
44154
44158
  // this.trigger(ClapprStatsEvents.PERCENTAGE, currentPercentage);
44155
44159
  }
44156
44160
  buildReport() {
44157
- this.stop(Chronograph.Session);
44158
- this.start(Chronograph.Session);
44161
+ this.stop(ClapprStatsChronograph.Session);
44162
+ this.start(ClapprStatsChronograph.Session);
44159
44163
  this.metrics.extra.playbackName = this.playbackName;
44160
44164
  this.metrics.extra.playbackType = this.playbackType;
44161
44165
  this.calcBitrates();
@@ -46342,18 +46346,18 @@ const PLAYBACK_NAMES = {
46342
46346
  hls: 'HLS.js',
46343
46347
  html5_video: 'Native',
46344
46348
  };
46345
- const T$f = 'plugins.nerd_stats';
46349
+ const T$e = 'plugins.nerd_stats';
46346
46350
  /**
46347
- * `PLUGIN` that displays useful network-related statistics.
46351
+ * `PLUGIN` that displays useful statistics regarding the playback as well as the network quality estimation.
46348
46352
  * @beta
46349
46353
  *
46350
46354
  * @remarks
46351
46355
  * Depends on:
46352
46356
  *
46353
- * - {@link BottomGear}
46354
- *
46355
- * - {@link ClapprStats}
46357
+ * - {@link BottomGear} - where the button is attached
46356
46358
  *
46359
+ * - {@link ClapprStats} - to get the metrics from
46360
+ *
46357
46361
  * The plugin is rendered as an item in the gear menu.
46358
46362
  *
46359
46363
  * When clicked, it shows an overlay window with the information about the network speed, latency, etc,
@@ -46522,7 +46526,7 @@ class NerdStats extends UICorePlugin {
46522
46526
  .text(this.metrics.general.resolution.height);
46523
46527
  }
46524
46528
  estimateQuality() {
46525
- trace(`${T$f} estimateQuality`);
46529
+ trace(`${T$e} estimateQuality`);
46526
46530
  const videoQualityNames = [
46527
46531
  'SD (480p)',
46528
46532
  'HD (720p)',
@@ -46547,7 +46551,7 @@ class NerdStats extends UICorePlugin {
46547
46551
  prefix + videoQualityNames[liveQuality - 1];
46548
46552
  }
46549
46553
  updateMetrics(metrics) {
46550
- trace(`${T$f} updateMetrics`, { custom: this.speedtestMetrics });
46554
+ trace(`${T$e} updateMetrics`, { custom: this.speedtestMetrics });
46551
46555
  Object.assign(this.metrics, metrics);
46552
46556
  this.updateEstimatedQuality();
46553
46557
  this.$el
@@ -46649,7 +46653,7 @@ class NerdStats extends UICorePlugin {
46649
46653
  return this;
46650
46654
  }
46651
46655
  attach() {
46652
- trace(`${T$f} attach`);
46656
+ trace(`${T$e} attach`);
46653
46657
  const gear = this.core.getPlugin('bottom_gear');
46654
46658
  gear
46655
46659
  .addItem('nerd_stats')
@@ -46716,7 +46720,7 @@ function newMetrics() {
46716
46720
  // Copyright 2014 Globo.com Player authors. All rights reserved.
46717
46721
  // Use of this source code is governed by a BSD-style
46718
46722
  // license that can be found at https://github.com/clappr/clappr-plugins/blob/master/LICENSE.
46719
- const T$e = 'plugins.click_to_pause';
46723
+ const T$d = 'plugins.click_to_pause';
46720
46724
  /**
46721
46725
  * A small `PLUGIN` that toggles the playback state on click over the video container
46722
46726
  * @beta
@@ -46728,7 +46732,7 @@ class ClickToPause extends ContainerPlugin {
46728
46732
  * @internal
46729
46733
  */
46730
46734
  get name() {
46731
- return 'click_to_pause_custom';
46735
+ return 'click_to_pause';
46732
46736
  }
46733
46737
  /**
46734
46738
  * @internal
@@ -46746,7 +46750,7 @@ class ClickToPause extends ContainerPlugin {
46746
46750
  click() {
46747
46751
  const isLivePlayback = this.container.getPlaybackType() === Playback.LIVE;
46748
46752
  const isDvrEnabled = this.container.isDvrEnabled();
46749
- trace(`${T$e} click`, {
46753
+ trace(`${T$d} click`, {
46750
46754
  isLivePlayback,
46751
46755
  isDvrEnabled,
46752
46756
  });
@@ -46861,7 +46865,7 @@ function buildSvg(clips, duration, barWidth) {
46861
46865
 
46862
46866
  const clipsHTML = "<div class=\"media-clip-text\" id=\"clips-text\"></div>";
46863
46867
 
46864
- const T$d = 'plugins.clips';
46868
+ const T$c = 'plugins.clips';
46865
46869
  const VERSION$5 = '2.22.16';
46866
46870
  const CLAPPR_VERSION = '0.11.4';
46867
46871
  /**
@@ -46911,7 +46915,7 @@ class Clips extends UICorePlugin {
46911
46915
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
46912
46916
  }
46913
46917
  render() {
46914
- trace(`${T$d} render`);
46918
+ trace(`${T$c} render`);
46915
46919
  if (!this.options.clips) {
46916
46920
  return this;
46917
46921
  }
@@ -46938,19 +46942,19 @@ class Clips extends UICorePlugin {
46938
46942
  return super.enable();
46939
46943
  }
46940
46944
  onCoreReady() {
46941
- trace(`${T$d} onCoreReady`);
46945
+ trace(`${T$c} onCoreReady`);
46942
46946
  const mediaControl = this.core.getPlugin('media_control');
46943
46947
  assert(mediaControl, 'media_control plugin is required');
46944
46948
  this.parseClips(this.options.clips.text);
46945
46949
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.onMcRender);
46946
46950
  }
46947
46951
  onMcRender() {
46948
- trace(`${T$d} onMcRender`);
46952
+ trace(`${T$c} onMcRender`);
46949
46953
  const mediaControl = this.core.getPlugin('media_control');
46950
46954
  mediaControl.mount('clips', this.$el);
46951
46955
  }
46952
46956
  onContainerChanged() {
46953
- trace(`${T$d} onContainerChanged`);
46957
+ trace(`${T$c} onContainerChanged`);
46954
46958
  // TODO figure out the conditions of changing the container (without destroying the previous one)
46955
46959
  if (this.oldContainer) {
46956
46960
  this.stopListening(this.oldContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
@@ -47128,7 +47132,7 @@ class ContextMenu extends UIContainerPlugin {
47128
47132
 
47129
47133
  const dvrHTML = "<div class=\"live-info\" id=\"media-control-live\"><%= i18n.t('live') %></div>\n<button type=\"button\" class=\"live-button\" aria-label=\"<%= i18n.t('back_to_live') %>\" id=\"media-control-back-to-live\"><%= i18n.t('back_to_live') %></button>\n";
47130
47134
 
47131
- const T$c = 'plugins.dvr_controls';
47135
+ // const T = 'plugins.dvr_controls'
47132
47136
  /**
47133
47137
  * `PLUGIN` that adds the DVR controls to the media control UI
47134
47138
  *
@@ -47177,19 +47181,17 @@ class DvrControls extends UICorePlugin {
47177
47181
  * @internal
47178
47182
  */
47179
47183
  bindEvents() {
47180
- this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
47181
- this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.bindContainerEvents);
47184
+ this.listenToOnce(this.core, Events$1.CORE_READY, this.onCoreReady);
47185
+ this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
47182
47186
  }
47183
47187
  onCoreReady() {
47184
47188
  const mediaControl = this.core.getPlugin('media_control');
47185
47189
  assert(mediaControl, 'media_control plugin is required');
47186
- this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
47187
- // MediaControl has been rendered
47188
- this.render();
47190
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.mount);
47189
47191
  }
47190
- bindContainerEvents() {
47191
- trace(`${T$c} bindContainerEvents`);
47192
- this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.render);
47192
+ onActiveContainerChanged() {
47193
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_LOADEDMETADATA, this.onMetadataLoaded);
47194
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
47193
47195
  }
47194
47196
  click() {
47195
47197
  const container = this.core.activeContainer;
@@ -47198,32 +47200,47 @@ class DvrControls extends UICorePlugin {
47198
47200
  }
47199
47201
  container.seek(container.getDuration());
47200
47202
  }
47201
- shouldRender() {
47202
- return this.core.getPlaybackType() === Playback.LIVE;
47203
- }
47204
47203
  /**
47205
47204
  * @internal
47206
47205
  */
47207
47206
  render() {
47208
- trace(`${T$c} render`, {
47209
- dvrEnabled: this.core.activePlayback?.dvrEnabled,
47210
- playbackType: this.core.getPlaybackType(),
47211
- });
47212
- const mediaControl = this.core.getPlugin('media_control');
47213
- if (!mediaControl) {
47214
- return this;
47215
- }
47216
- if (!this.shouldRender()) {
47217
- return this;
47218
- }
47219
- mediaControl.toggleElement('duration', false);
47220
- mediaControl.toggleElement('position', false);
47221
47207
  this.$el.html(DvrControls.template({
47222
47208
  i18n: this.core.i18n,
47223
47209
  }));
47224
- mediaControl.putElement('dvr', this.$el);
47225
47210
  return this;
47226
47211
  }
47212
+ onMediacontrolRendered() {
47213
+ this.render();
47214
+ }
47215
+ onMetadataLoaded() {
47216
+ this.mount();
47217
+ this.toggleState(this.core.activeContainer.isDvrInUse());
47218
+ }
47219
+ mount() {
47220
+ // TODO move mount point management logic to MediaControl
47221
+ if (this.core.getPlaybackType() !== Playback.LIVE) {
47222
+ return;
47223
+ }
47224
+ const mediaControl = this.core.getPlugin('media_control');
47225
+ assert(mediaControl, 'media_control plugin is required');
47226
+ // TODO -> to MediaControl
47227
+ mediaControl.toggleElement('duration', false);
47228
+ mediaControl.toggleElement('position', false);
47229
+ mediaControl.mount('dvr', this.$el);
47230
+ }
47231
+ onDvrStateChanged(dvrInUse) {
47232
+ this.toggleState(dvrInUse);
47233
+ }
47234
+ toggleState(dvrInUse) {
47235
+ if (dvrInUse) {
47236
+ this.$el.find('#media-control-back-to-live').show();
47237
+ this.$el.find('#media-control-live').hide();
47238
+ }
47239
+ else {
47240
+ this.$el.find('#media-control-back-to-live').hide();
47241
+ this.$el.find('#media-control-live').show();
47242
+ }
47243
+ }
47227
47244
  }
47228
47245
 
47229
47246
  const reloadIcon = "<svg fill=\"#FFFFFF\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"/>\n <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\n</svg>";
@@ -48033,8 +48050,6 @@ const DEFAULT_SETTINGS = {
48033
48050
  right: [
48034
48051
  'audiotracks',
48035
48052
  'cc',
48036
- // 'dvr',
48037
- // 'duration',
48038
48053
  'fullscreen',
48039
48054
  'gear',
48040
48055
  'multicamera',
@@ -48051,10 +48066,10 @@ const T$a = 'plugins.media_control';
48051
48066
  const LEFT_ORDER = [
48052
48067
  'playpause',
48053
48068
  'playstop',
48054
- 'dvr',
48055
48069
  'volume',
48056
48070
  'position',
48057
48071
  'duration',
48072
+ 'dvr',
48058
48073
  ];
48059
48074
  const { Config, Fullscreen, formatTime: formatTime$1, extend, removeArrayItem } = Utils;
48060
48075
  function orderByOrderPattern(arr, order) {
@@ -48701,8 +48716,7 @@ class MediaControl extends UICorePlugin {
48701
48716
  }
48702
48717
  this.$el.show();
48703
48718
  this.trigger(Events$1.MEDIACONTROL_SHOW, this.name);
48704
- this.container &&
48705
- this.container.trigger(Events$1.CONTAINER_MEDIACONTROL_SHOW, this.name);
48719
+ this.core.activeContainer?.trigger(Events$1.CONTAINER_MEDIACONTROL_SHOW, this.name);
48706
48720
  this.$el.removeClass('media-control-hide');
48707
48721
  this.hideId = setTimeout(() => this.hide(), timeout);
48708
48722
  if (event) {
@@ -48756,7 +48770,7 @@ class MediaControl extends UICorePlugin {
48756
48770
  right: [],
48757
48771
  }, this.core.activeContainer.settings);
48758
48772
  trace(`${T$a} updateSettings`, { newSettings });
48759
- newSettings.left.push('clips'); // TODO
48773
+ newSettings.left.push('clips'); // TODO settings
48760
48774
  // TODO make order controlled via CSS
48761
48775
  newSettings.left = orderByOrderPattern([...newSettings.left, 'volume', 'clips'], LEFT_ORDER);
48762
48776
  if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
@@ -48819,7 +48833,6 @@ class MediaControl extends UICorePlugin {
48819
48833
  * Get a media control element DOM node
48820
48834
  * @param name - The name of the media control element
48821
48835
  * @returns The DOM node to render to or extend
48822
- * @deprecated Use {@link MediaControl.putElement} instead
48823
48836
  * @remarks
48824
48837
  * Use this method to render custom media control UI in a plugin
48825
48838
  * @example
@@ -48835,7 +48848,7 @@ class MediaControl extends UICorePlugin {
48835
48848
  */
48836
48849
  mount(name, element) {
48837
48850
  const panel = this.getElementLocation(name);
48838
- trace(`${T$a} putElement`, { name, panel: !!panel });
48851
+ trace(`${T$a} mount`, { name, panel: !!panel });
48839
48852
  if (panel) {
48840
48853
  const current = panel.find(`[data-${name}]`);
48841
48854
  element.attr(`data-${name}`, '');
@@ -48852,13 +48865,18 @@ class MediaControl extends UICorePlugin {
48852
48865
  return;
48853
48866
  }
48854
48867
  }
48868
+ /**
48869
+ * @deprecated Use {@link MediaControl.mount} instead
48870
+ * @param name
48871
+ * @param element
48872
+ */
48855
48873
  putElement(name, element) {
48856
48874
  this.mount(name, element);
48857
48875
  }
48858
48876
  /**
48859
48877
  * Toggle the visibility of a media control element
48860
48878
  * @param name - The name of the media control element
48861
- * @param show - Whether to show or hide the element
48879
+ * @param show - Visibility state
48862
48880
  */
48863
48881
  toggleElement(area, show) {
48864
48882
  this.$el.find(`[data-${area}]`).toggle(show);
@@ -49074,6 +49092,7 @@ class MediaControl extends UICorePlugin {
49074
49092
  width: this.options.width,
49075
49093
  height: this.options.height,
49076
49094
  });
49095
+ // TODO check out
49077
49096
  this.hideVolumeBar(0);
49078
49097
  }, 0);
49079
49098
  this.parseColors();
@@ -49629,7 +49648,7 @@ class PictureInPicture extends UICorePlugin {
49629
49648
  this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
49630
49649
  const mediaControl = this.core.getPlugin('media_control');
49631
49650
  if (mediaControl) {
49632
- mediaControl.putElement('pip', this.$el);
49651
+ mediaControl.mount('pip', this.$el);
49633
49652
  }
49634
49653
  return this;
49635
49654
  }
@@ -51533,7 +51552,7 @@ class ClosedCaptions extends UICorePlugin {
51533
51552
  this.$line = $(ClosedCaptions.templateString());
51534
51553
  this.resizeFont();
51535
51554
  this.core.activeContainer.$el.append(this.$line);
51536
- mediaControl.putElement('cc', this.$el);
51555
+ mediaControl.mount('cc', this.$el);
51537
51556
  this.updateSelection();
51538
51557
  this.renderIcon();
51539
51558
  return this;
@@ -52471,4 +52490,4 @@ class VolumeFade extends UICorePlugin {
52471
52490
  }
52472
52491
  }
52473
52492
 
52474
- export { AudioTracks as AudioSelector, AudioTracks, BigMuteButton, BottomGear, NerdStats as ClapprNerdStats, ClapprStats, ClickToPause, Clips, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, Favicon, GearEvents, GoogleAnalytics, QualityLevels as LevelSelector, LogTracer, Logger, Logo, MediaControl, MultiCamera, NerdStats, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, QualityLevels, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerThreeBounce as Spinner, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };
52493
+ export { AudioTracks as AudioSelector, AudioTracks, BigMuteButton, BottomGear, NerdStats as ClapprNerdStats, ClapprStats, ClapprStatsChronograph, ClapprStatsCounter, ClapprStatsEvents, ClickToPause, Clips, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, Favicon, GearEvents, GoogleAnalytics, QualityLevels as LevelSelector, LogTracer, Logger, Logo, MediaControl, MultiCamera, NerdStats, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, QualityLevels, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerThreeBounce as Spinner, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };