@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
package/dist/index.js CHANGED
@@ -7761,7 +7761,7 @@ var UNKNOWN_ERROR = {
7761
7761
  };
7762
7762
 
7763
7763
  // TODO: rename this Playback to HTML5Playback (breaking change, only after 0.3.0)
7764
- var HTML5Video = /*#__PURE__*/function (_Playback) {
7764
+ var HTML5Video$1 = /*#__PURE__*/function (_Playback) {
7765
7765
  function HTML5Video() {
7766
7766
  var _this;
7767
7767
  _classCallCheck(this, HTML5Video);
@@ -8553,7 +8553,7 @@ var HTML5Video = /*#__PURE__*/function (_Playback) {
8553
8553
  }
8554
8554
  }]);
8555
8555
  }(Playback);
8556
- HTML5Video._mimeTypesForUrl = function () {
8556
+ HTML5Video$1._mimeTypesForUrl = function () {
8557
8557
  var resourceUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8558
8558
  var mimeTypesByExtension = arguments.length > 1 ? arguments[1] : undefined;
8559
8559
  var mimeType = arguments.length > 2 ? arguments[2] : undefined;
@@ -8561,15 +8561,15 @@ HTML5Video._mimeTypesForUrl = function () {
8561
8561
  var mimeTypes = mimeType || extension && mimeTypesByExtension[extension.toLowerCase()] || [];
8562
8562
  return mimeTypes.constructor === Array ? mimeTypes : [mimeTypes];
8563
8563
  };
8564
- HTML5Video._canPlay = function (type, mimeTypesByExtension, resourceUrl, mimeType) {
8565
- var mimeTypes = HTML5Video._mimeTypesForUrl(resourceUrl, mimeTypesByExtension, mimeType);
8564
+ HTML5Video$1._canPlay = function (type, mimeTypesByExtension, resourceUrl, mimeType) {
8565
+ var mimeTypes = HTML5Video$1._mimeTypesForUrl(resourceUrl, mimeTypesByExtension, mimeType);
8566
8566
  var media = document.createElement(type);
8567
8567
  return !!mimeTypes.filter(function (mediaType) {
8568
8568
  return !!media.canPlayType(mediaType).replace(/no/, '');
8569
8569
  })[0];
8570
8570
  };
8571
- HTML5Video.canPlay = function (resourceUrl, mimeType) {
8572
- return HTML5Video._canPlay('audio', AUDIO_MIMETYPES, resourceUrl, mimeType) || HTML5Video._canPlay('video', MIMETYPES, resourceUrl, mimeType);
8571
+ HTML5Video$1.canPlay = function (resourceUrl, mimeType) {
8572
+ return HTML5Video$1._canPlay('audio', AUDIO_MIMETYPES, resourceUrl, mimeType) || HTML5Video$1._canPlay('video', MIMETYPES, resourceUrl, mimeType);
8573
8573
  };
8574
8574
 
8575
8575
  // TODO: remove this playback and change HTML5Video to HTML5Playback (breaking change, only after 0.3.0)
@@ -8614,7 +8614,7 @@ var HTML5Audio = /*#__PURE__*/function (_HTML5Video) {
8614
8614
  return Playback.AOD;
8615
8615
  }
8616
8616
  }]);
8617
- }(HTML5Video);
8617
+ }(HTML5Video$1);
8618
8618
  HTML5Audio.canPlay = function (resourceUrl, mimeType) {
8619
8619
  var mimetypes = {
8620
8620
  'wav': ['audio/wav'],
@@ -8622,7 +8622,7 @@ HTML5Audio.canPlay = function (resourceUrl, mimeType) {
8622
8622
  'aac': ['audio/mp4;codecs="mp4a.40.5"'],
8623
8623
  'oga': ['audio/ogg']
8624
8624
  };
8625
- return HTML5Video._canPlay('audio', mimetypes, resourceUrl, mimeType);
8625
+ return HTML5Video$1._canPlay('audio', mimetypes, resourceUrl, mimeType);
8626
8626
  };
8627
8627
 
8628
8628
  var css_248z$1 = "[data-html-img] {\n max-width: 100%;\n max-height: 100%; }\n";
@@ -9024,7 +9024,7 @@ Loader.registerPlugin(SourcesPlugin);
9024
9024
  Loader.registerPlayback(NoOp);
9025
9025
  Loader.registerPlayback(HTMLImg);
9026
9026
  Loader.registerPlayback(HTML5Audio);
9027
- Loader.registerPlayback(HTML5Video);
9027
+ Loader.registerPlayback(HTML5Video$1);
9028
9028
 
9029
9029
  const global$1 = (typeof global !== "undefined" ? global :
9030
9030
  typeof self !== "undefined" ? self :
@@ -12628,7 +12628,7 @@ var PlaybackErrorCode;
12628
12628
  * @internal
12629
12629
  * TODO use custom HTML5Video playback with this layer applied
12630
12630
  */
12631
- class BasePlayback extends HTML5Video {
12631
+ class BasePlayback extends HTML5Video$1 {
12632
12632
  createError(errorData, options) {
12633
12633
  const i18n = this.i18n ||
12634
12634
  // @ts-ignore
@@ -12649,18 +12649,35 @@ class BasePlayback extends HTML5Video {
12649
12649
  }
12650
12650
  return super.createError(errorData, options);
12651
12651
  }
12652
+ /**
12653
+ * Sets the playback rate.
12654
+ * @param rate - The playback rate to set.
12655
+ */
12656
+ setPlaybackRate(rate) {
12657
+ this.el.playbackRate = rate;
12658
+ }
12652
12659
  _onPlaying() {
12653
12660
  super._onPlaying();
12654
12661
  this.trigger(Events$1.PLAYBACK_MEDIACONTROL_ENABLE);
12655
12662
  }
12656
12663
  }
12657
12664
 
12665
+ var PlaybackEvents;
12666
+ (function (PlaybackEvents) {
12667
+ /**
12668
+ * Emitted when the playback rate changes.
12669
+ * Payload:
12670
+ * - playbackRate number
12671
+ */
12672
+ PlaybackEvents["PLAYBACK_RATE_CHANGED"] = "playback:rate-changed";
12673
+ })(PlaybackEvents || (PlaybackEvents = {}));
12674
+
12658
12675
  // Copyright 2014 Globo.com Player authors. All rights reserved.
12659
12676
  // Use of this source code is governed by a BSD-style
12660
12677
  // license that can be found in the LICENSE file.
12661
12678
  const AUTO$2 = -1;
12662
12679
  const { now: now$2 } = Utils;
12663
- const T$g = 'playback.dash';
12680
+ const T$i = 'playback.dash';
12664
12681
  // @ts-expect-error
12665
12682
  class DashPlayback extends BasePlayback {
12666
12683
  _levels = null;
@@ -12838,8 +12855,8 @@ class DashPlayback extends BasePlayback {
12838
12855
  }
12839
12856
  }
12840
12857
  });
12841
- this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, () => {
12842
- this.trigger('dash:playback-rate-changed');
12858
+ this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e) => {
12859
+ this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate);
12843
12860
  });
12844
12861
  }
12845
12862
  render() {
@@ -12930,10 +12947,10 @@ class DashPlayback extends BasePlayback {
12930
12947
  }
12931
12948
  _onPlaybackError = (event) => {
12932
12949
  // TODO
12933
- trace(`${T$g} _onPlaybackError`, { event });
12950
+ trace(`${T$i} _onPlaybackError`, { event });
12934
12951
  };
12935
12952
  _onDASHJSSError = (event) => {
12936
- trace(`${T$g} _onDASHJSSError`, { event });
12953
+ trace(`${T$i} _onDASHJSSError`, { event });
12937
12954
  this._stopTimeUpdateTimer();
12938
12955
  // Note that the other error types are deprecated
12939
12956
  const e = event.error;
@@ -12968,7 +12985,7 @@ class DashPlayback extends BasePlayback {
12968
12985
  }
12969
12986
  };
12970
12987
  triggerError(error) {
12971
- trace(`${T$g} triggerError`, { error });
12988
+ trace(`${T$i} triggerError`, { error });
12972
12989
  // this triggers Events.ERROR to be handled by the UI
12973
12990
  this.trigger(Events$1.PLAYBACK_ERROR, this.createError(error, {
12974
12991
  useCodePrefix: false,
@@ -13007,7 +13024,7 @@ class DashPlayback extends BasePlayback {
13007
13024
  }
13008
13025
  get dvrEnabled() {
13009
13026
  if (!this._dash) {
13010
- trace(`${T$g} dvrEnable no dash player instance`);
13027
+ trace(`${T$i} dvrEnable no dash player instance`);
13011
13028
  return false;
13012
13029
  }
13013
13030
  return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
@@ -13029,7 +13046,7 @@ class DashPlayback extends BasePlayback {
13029
13046
  this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
13030
13047
  }
13031
13048
  play() {
13032
- trace(`${T$g} play`, { dash: !!this._dash });
13049
+ trace(`${T$i} play`, { dash: !!this._dash });
13033
13050
  if (!this._dash) {
13034
13051
  this._setup();
13035
13052
  }
@@ -13105,6 +13122,9 @@ class DashPlayback extends BasePlayback {
13105
13122
  assert.ok(ret, 'Invalid quality level');
13106
13123
  return ret;
13107
13124
  }
13125
+ setPlaybackRate(rate) {
13126
+ this._dash?.setPlaybackRate(rate);
13127
+ }
13108
13128
  }
13109
13129
  DashPlayback.canPlay = function (resource, mimeType) {
13110
13130
  if (!isDashSource(resource, mimeType)) {
@@ -41776,7 +41796,7 @@ const AUTO$1 = -1;
41776
41796
  const DEFAULT_RECOVER_ATTEMPTS = 16;
41777
41797
  Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
41778
41798
  Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
41779
- const T$f = 'playback.hls';
41799
+ const T$h = 'playback.hls';
41780
41800
  // @ts-expect-error
41781
41801
  class HlsPlayback extends BasePlayback {
41782
41802
  _ccIsSetup = false;
@@ -42006,7 +42026,7 @@ class HlsPlayback extends BasePlayback {
42006
42026
  maxBufferLength: 2,
42007
42027
  maxMaxBufferLength: 4,
42008
42028
  }, this.options.playback.hlsjsConfig);
42009
- trace(`${T$f} _createHLSInstance`, { config });
42029
+ trace(`${T$h} _createHLSInstance`, { config });
42010
42030
  this._hls = new Hls(config);
42011
42031
  }
42012
42032
  _attachHLSMedia() {
@@ -42095,7 +42115,7 @@ class HlsPlayback extends BasePlayback {
42095
42115
  }
42096
42116
  else {
42097
42117
  Log.error('hlsjs: failed to recover', { evt, data });
42098
- trace(`${T$f} _recover failed to recover`, {
42118
+ trace(`${T$h} _recover failed to recover`, {
42099
42119
  type: data.type,
42100
42120
  details: data.details,
42101
42121
  });
@@ -42181,7 +42201,7 @@ class HlsPlayback extends BasePlayback {
42181
42201
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
42182
42202
  }
42183
42203
  _onHLSJSError(evt, data) {
42184
- trace(`${T$f} _onHLSJSError`, {
42204
+ trace(`${T$h} _onHLSJSError`, {
42185
42205
  fatal: data.fatal,
42186
42206
  type: data.type,
42187
42207
  details: data.details,
@@ -42229,7 +42249,7 @@ class HlsPlayback extends BasePlayback {
42229
42249
  evt,
42230
42250
  data,
42231
42251
  });
42232
- trace(`${T$f} _onHLSJSError trying to recover from network error`, {
42252
+ trace(`${T$h} _onHLSJSError trying to recover from network error`, {
42233
42253
  details: data.details,
42234
42254
  });
42235
42255
  error.level = PlayerError.Levels.WARN;
@@ -42242,7 +42262,7 @@ class HlsPlayback extends BasePlayback {
42242
42262
  evt,
42243
42263
  data,
42244
42264
  });
42245
- trace(`${T$f} _onHLSJSError trying to recover from media error`, {
42265
+ trace(`${T$h} _onHLSJSError trying to recover from media error`, {
42246
42266
  details: data.details,
42247
42267
  });
42248
42268
  error.level = PlayerError.Levels.WARN;
@@ -42272,7 +42292,7 @@ class HlsPlayback extends BasePlayback {
42272
42292
  return;
42273
42293
  }
42274
42294
  Log.warn('hlsjs: non-fatal error occurred', { evt, data });
42275
- trace(`${T$f} _onHLSJSError non-fatal error occurred`, {
42295
+ trace(`${T$h} _onHLSJSError non-fatal error occurred`, {
42276
42296
  type: data.type,
42277
42297
  details: data.details,
42278
42298
  });
@@ -42596,13 +42616,17 @@ HlsPlayback.canPlay = function (resource, mimeType) {
42596
42616
  return Hls.isSupported();
42597
42617
  };
42598
42618
 
42619
+ class HTML5Video extends BasePlayback {
42620
+ }
42621
+
42599
42622
  // TODO consider allowing the variation of the order of playback modules
42600
42623
  function registerPlaybacks() {
42624
+ Loader.registerPlayback(HTML5Video); // TODO check it overrides the default HTML5Video
42601
42625
  Loader.registerPlayback(HlsPlayback);
42602
42626
  Loader.registerPlayback(DashPlayback);
42603
42627
  }
42604
42628
 
42605
- const T$e = 'GPlayer';
42629
+ const T$g = 'GPlayer';
42606
42630
  const DEFAULT_OPTIONS = {
42607
42631
  autoPlay: false,
42608
42632
  debug: 'none',
@@ -42697,7 +42721,7 @@ class Player {
42697
42721
  }
42698
42722
  const coreOpts = this.buildCoreOptions(playerElement);
42699
42723
  const { core, container } = Player.getRegisteredPlugins();
42700
- trace(`${T$e} init`, {
42724
+ trace(`${T$g} init`, {
42701
42725
  registeredPlaybacks: Loader.registeredPlaybacks.map((p) => p.name),
42702
42726
  });
42703
42727
  coreOpts.plugins = {
@@ -42711,7 +42735,7 @@ class Player {
42711
42735
  * Destroys the player, releasing all resources and unmounting its UI from the DOM.
42712
42736
  */
42713
42737
  destroy() {
42714
- trace(`${T$e} destroy`, {
42738
+ trace(`${T$g} destroy`, {
42715
42739
  player: !!this.player,
42716
42740
  });
42717
42741
  if (this.player) {
@@ -42893,7 +42917,7 @@ class Player {
42893
42917
  this.config = $.extend(true, this.config, config);
42894
42918
  }
42895
42919
  initPlayer(coreOptions) {
42896
- trace(`${T$e} initPlayer`, {
42920
+ trace(`${T$g} initPlayer`, {
42897
42921
  autoPlay: coreOptions.autoPlay,
42898
42922
  sources: coreOptions.sources,
42899
42923
  // TODO selected options
@@ -42918,7 +42942,7 @@ class Player {
42918
42942
  }
42919
42943
  }
42920
42944
  triggerAutoPlay() {
42921
- trace(`${T$e} triggerAutoPlay`);
42945
+ trace(`${T$g} triggerAutoPlay`);
42922
42946
  setTimeout(() => {
42923
42947
  this.player?.play({
42924
42948
  autoPlay: true,
@@ -42936,7 +42960,7 @@ class Player {
42936
42960
  // TODO test
42937
42961
  events = {
42938
42962
  onReady: () => {
42939
- trace(`${T$e} onReady`, {
42963
+ trace(`${T$g} onReady`, {
42940
42964
  ready: this.ready,
42941
42965
  });
42942
42966
  if (this.ready) {
@@ -42970,7 +42994,7 @@ class Player {
42970
42994
  buildCoreOptions(rootNode) {
42971
42995
  const sources = this.buildMediaSourcesList();
42972
42996
  const source = sources[0];
42973
- trace(`${T$e} buildCoreOptions`, {
42997
+ trace(`${T$g} buildCoreOptions`, {
42974
42998
  source,
42975
42999
  sources,
42976
43000
  });
@@ -43031,7 +43055,7 @@ class Player {
43031
43055
  assert.ok(this.player, 'Player is not initialized');
43032
43056
  const core = this.player.core;
43033
43057
  core.on(Events$1.CORE_SCREEN_ORIENTATION_CHANGED, ({ orientation }) => {
43034
- trace(`${T$e} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43058
+ trace(`${T$g} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43035
43059
  orientation,
43036
43060
  rootNode: {
43037
43061
  width: this.rootNode?.clientWidth,
@@ -43046,14 +43070,14 @@ class Player {
43046
43070
  }
43047
43071
  }, null);
43048
43072
  core.on(Events$1.CORE_RESIZE, ({ width, height }) => {
43049
- trace(`${T$e} on CORE_RESIZE`, {
43073
+ trace(`${T$g} on CORE_RESIZE`, {
43050
43074
  width,
43051
43075
  height,
43052
43076
  });
43053
43077
  this.safeTriggerEvent(PlayerEvent.Resize, { width, height });
43054
43078
  }, null);
43055
43079
  core.on(Events$1.CORE_FULLSCREEN, (isFullscreen) => {
43056
- trace(`${T$e} CORE_FULLSCREEN`, {
43080
+ trace(`${T$g} CORE_FULLSCREEN`, {
43057
43081
  isFullscreen,
43058
43082
  });
43059
43083
  this.safeTriggerEvent(PlayerEvent.Fullscreen, isFullscreen);
@@ -43061,7 +43085,7 @@ class Player {
43061
43085
  }
43062
43086
  }
43063
43087
 
43064
- var version$1 = "2.20.7";
43088
+ var version$1 = "2.20.8";
43065
43089
 
43066
43090
  var packages = {
43067
43091
  "node_modules/@clappr/core": {
@@ -43085,7 +43109,7 @@ function version() {
43085
43109
  };
43086
43110
  }
43087
43111
 
43088
- const pluginHtml$8 = "<button data-track-selector-button class='gcore-skin-button-color'>\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color'>\n <% for (var i = 0; i < tracks.length; i++) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-track-selector-select=\"<%= tracks[i].id %>\">\n <%= tracks[i].label || tracks[i].name %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43112
+ const pluginHtml$7 = "<button data-track-selector-button class='gcore-skin-button-color'>\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color'>\n <% for (var i = 0; i < tracks.length; i++) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-track-selector-select=\"<%= tracks[i].id %>\">\n <%= tracks[i].label || tracks[i].name %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43089
43113
 
43090
43114
  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";
43091
43115
 
@@ -43119,7 +43143,7 @@ class AudioSelector extends UICorePlugin {
43119
43143
  static get version() {
43120
43144
  return VERSION$6;
43121
43145
  }
43122
- static template = tmpl(pluginHtml$8);
43146
+ static template = tmpl(pluginHtml$7);
43123
43147
  /**
43124
43148
  * @internal
43125
43149
  */
@@ -43392,9 +43416,9 @@ class AudioSelector extends UICorePlugin {
43392
43416
 
43393
43417
  const volumeOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.50025 8.00025C4.67125 8.00025 4.00025 8.67225 4.00025 9.50025V14.5003C4.00025 15.3283 4.67125 16.0003 5.50025 16.0003H7.24824C7.65024 16.0003 8.03627 16.1613 8.31727 16.4483L12.5443 20.7413C12.7083 20.9073 12.9262 20.9963 13.1492 20.9963C13.2572 20.9963 13.3672 20.9763 13.4722 20.9333C13.7932 20.8013 14.0003 20.4923 14.0003 20.1462V16.3283C14.0003 16.1963 13.9473 16.0683 13.8543 15.9753L6.02528 8.14625C5.93228 8.05325 5.80425 8.00025 5.67225 8.00025H5.50025ZM14.0003 3.85426C14.0003 3.50826 13.7932 3.19927 13.4722 3.06727C13.1502 2.93627 12.7873 3.01226 12.5443 3.25926L9.33827 6.51527C9.14627 6.71127 9.14626 7.02625 9.34126 7.22025L13.5733 11.4522C13.7313 11.6102 14.0003 11.4982 14.0003 11.2752V3.85426ZM20.8543 20.8543C20.7563 20.9513 20.6283 21.0003 20.5003 21.0003C20.3723 21.0003 20.2442 20.9513 20.1462 20.8543L3.14625 3.85426C2.95125 3.65826 2.95125 3.34225 3.14625 3.14625C3.34225 2.95125 3.65826 2.95125 3.85426 3.14625L20.8543 20.1462C21.0493 20.3422 21.0493 20.6583 20.8543 20.8543Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
43394
43418
 
43395
- const pluginHtml$7 = "<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";
43419
+ 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";
43396
43420
 
43397
- const T$d = 'plugins.big_mute_button';
43421
+ const T$f = 'plugins.big_mute_button';
43398
43422
  // TODO rewrite as a container plugin
43399
43423
  /**
43400
43424
  * Displays a big mute button over the video when it's muted.
@@ -43418,7 +43442,7 @@ class BigMuteButton extends UICorePlugin {
43418
43442
  get supportedVersion() {
43419
43443
  return { min: CLAPPR_VERSION };
43420
43444
  }
43421
- static template = tmpl(pluginHtml$7);
43445
+ static template = tmpl(pluginHtml$6);
43422
43446
  /**
43423
43447
  * @internal
43424
43448
  */
@@ -43436,7 +43460,7 @@ class BigMuteButton extends UICorePlugin {
43436
43460
  this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
43437
43461
  this.listenTo(this.core, 'core:advertisement:start', this.onStartAd);
43438
43462
  this.listenTo(this.core, 'core:advertisement:finish', this.onFinishAd);
43439
- trace(`${T$d} bindEvents`, {
43463
+ trace(`${T$f} bindEvents`, {
43440
43464
  mediacontrol: !!this.core.mediaControl,
43441
43465
  });
43442
43466
  this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.mediaControlRendered);
@@ -43461,12 +43485,12 @@ class BigMuteButton extends UICorePlugin {
43461
43485
  }
43462
43486
  mediaControlRendered() {
43463
43487
  const container = this.core.activeContainer;
43464
- trace(`${T$d} mediaControlRendered`, {
43488
+ trace(`${T$f} mediaControlRendered`, {
43465
43489
  container: !!container,
43466
43490
  });
43467
43491
  if (container) {
43468
43492
  this.listenTo(container.playback, Events$1.PLAYBACK_PLAY, () => {
43469
- trace(`${T$d} PLAYBACK_PLAY`);
43493
+ trace(`${T$f} PLAYBACK_PLAY`);
43470
43494
  this.render();
43471
43495
  });
43472
43496
  }
@@ -43490,7 +43514,7 @@ class BigMuteButton extends UICorePlugin {
43490
43514
  }
43491
43515
  const { autoPlay, wasMuted } = this.options;
43492
43516
  const volume = container.volume;
43493
- trace(`${T$d} shouldRender`, {
43517
+ trace(`${T$f} shouldRender`, {
43494
43518
  autoPlay,
43495
43519
  wasMuted,
43496
43520
  volume,
@@ -43502,7 +43526,7 @@ class BigMuteButton extends UICorePlugin {
43502
43526
  */
43503
43527
  render() {
43504
43528
  if (this.shouldRender()) {
43505
- trace(`${T$d} render`, {
43529
+ trace(`${T$f} render`, {
43506
43530
  el: !!this.$el,
43507
43531
  });
43508
43532
  this.$el.html(BigMuteButton.template());
@@ -43541,7 +43565,7 @@ class BigMuteButton extends UICorePlugin {
43541
43565
  }
43542
43566
  }
43543
43567
 
43544
- const pluginHtml$6 = "<div class=\"media-control-gear\" data-<%= name %>>\n <button type=\"button\" class=\"button-gear gplayer-lite-btn gcore-skin-button-color\" data-gear-button=\"-1\">\n <span class=\"gear-icon\"><%= icon %></span>\n </button>\n <div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\">\n <% items.forEach(function (gear) { %>\n <li data-<%= gear %>></li>\n <% }); %>\n </ul>\n </div>\n</div>\n";
43568
+ const pluginHtml$5 = "<div class=\"media-control-gear\" data-<%= name %>>\n <button type=\"button\" class=\"button-gear gplayer-lite-btn gcore-skin-button-color\" data-gear-button=\"-1\">\n <span class=\"gear-icon\"><%= icon %></span>\n </button>\n <div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\">\n <% items.forEach(function (gear) { %>\n <li data-<%= gear %>></li>\n <% }); %>\n </ul>\n </div>\n</div>\n";
43545
43569
 
43546
43570
  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";
43547
43571
 
@@ -43835,7 +43859,7 @@ var MediaControlEvents;
43835
43859
  */
43836
43860
  MediaControlEvents["MEDIACONTROL_GEAR_RENDERED"] = "mediacontrol:gear:rendered";
43837
43861
  })(MediaControlEvents || (MediaControlEvents = {}));
43838
- const T$c = 'plugins.media_control';
43862
+ const T$e = 'plugins.media_control';
43839
43863
  const LEFT_ORDER = [
43840
43864
  'playpause',
43841
43865
  'playstop',
@@ -43869,7 +43893,7 @@ class MediaControl extends UICorePlugin {
43869
43893
  buttonsColor = null;
43870
43894
  currentDurationValue = 0;
43871
43895
  currentPositionValue = 0;
43872
- currentSeekBarPercentage = null;
43896
+ currentSeekBarPercentage = 0;
43873
43897
  disabledClickableList = [];
43874
43898
  displayedDuration = null;
43875
43899
  displayedPosition = null;
@@ -43987,6 +44011,9 @@ class MediaControl extends UICorePlugin {
43987
44011
  'mouseleave .media-control-layer[data-controls]': 'resetUserKeepVisible',
43988
44012
  };
43989
44013
  }
44014
+ get currentSeekPos() {
44015
+ return this.currentSeekBarPercentage;
44016
+ }
43990
44017
  /**
43991
44018
  * Current volume [0..100]
43992
44019
  */
@@ -44083,7 +44110,7 @@ class MediaControl extends UICorePlugin {
44083
44110
  * Hides the media control UI
44084
44111
  */
44085
44112
  disable() {
44086
- trace(`${T$c} disable`);
44113
+ trace(`${T$e} disable`);
44087
44114
  this.userDisabled = true; // TODO distinguish between user and system (e.g., unplayable) disabled?
44088
44115
  this.hide();
44089
44116
  this.unbindKeyEvents();
@@ -44093,7 +44120,7 @@ class MediaControl extends UICorePlugin {
44093
44120
  * Reenables the plugin disabled earlier with the {@link MediaControl.disable} method
44094
44121
  */
44095
44122
  enable() {
44096
- trace(`${T$c} enable`);
44123
+ trace(`${T$e} enable`);
44097
44124
  if (this.options.chromeless) {
44098
44125
  return;
44099
44126
  }
@@ -44349,8 +44376,7 @@ class MediaControl extends UICorePlugin {
44349
44376
  this.changeTogglePlay();
44350
44377
  this.bindContainerEvents();
44351
44378
  this.settingsUpdate();
44352
- this.core.activeContainer &&
44353
- this.core.activeContainer.trigger(Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
44379
+ this.core.activeContainer.trigger(Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
44354
44380
  // TODO test
44355
44381
  if (this.core.activeContainer.mediaControlDisabled) {
44356
44382
  this.disable();
@@ -44916,18 +44942,7 @@ MediaControl.extend = function (properties) {
44916
44942
  };
44917
44943
 
44918
44944
  const VERSION$5 = '2.19.12';
44919
- const T$b = 'plugins.bottom_gear';
44920
- /**
44921
- * Custom events emitted by the plugin
44922
- * @beta
44923
- */
44924
- var GearEvents;
44925
- (function (GearEvents) {
44926
- /**
44927
- * Emitted when the gear menu is rendered
44928
- */
44929
- GearEvents["MEDIACONTROL_GEAR_RENDERED"] = "mediacontrol:gear:rendered";
44930
- })(GearEvents || (GearEvents = {}));
44945
+ const T$d = 'plugins.bottom_gear';
44931
44946
  /**
44932
44947
  * Adds the gear button that triggers extra options menu on the right side of the {@link MediaControl | media control} UI
44933
44948
  * @beta
@@ -44958,7 +44973,7 @@ class BottomGear extends UICorePlugin {
44958
44973
  static get version() {
44959
44974
  return VERSION$5;
44960
44975
  }
44961
- static template = tmpl(pluginHtml$6);
44976
+ static template = tmpl(pluginHtml$5);
44962
44977
  /**
44963
44978
  * @internal
44964
44979
  */
@@ -44983,7 +44998,6 @@ class BottomGear extends UICorePlugin {
44983
44998
  const mediaControl = this.core.getPlugin('media_control');
44984
44999
  assert(mediaControl, 'media_control plugin is required');
44985
45000
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
44986
- this.listenTo(this.core, 'gear:refresh', this.refresh); // TODO use direct plugin method call
44987
45001
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
44988
45002
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
44989
45003
  }
@@ -45002,15 +45016,15 @@ class BottomGear extends UICorePlugin {
45002
45016
  this.$el.find('.gear-wrapper').html(content);
45003
45017
  }
45004
45018
  onActiveContainerChanged() {
45005
- trace(`${T$b} onActiveContainerChanged`);
45019
+ trace(`${T$d} onActiveContainerChanged`);
45006
45020
  this.bindContainerEvents();
45007
45021
  }
45008
45022
  bindContainerEvents() {
45009
- trace(`${T$b} bindContainerEvents`);
45023
+ trace(`${T$d} bindContainerEvents`);
45010
45024
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
45011
45025
  }
45012
45026
  highDefinitionUpdate(isHd) {
45013
- trace(`${T$b} highDefinitionUpdate`, { isHd });
45027
+ trace(`${T$d} highDefinitionUpdate`, { isHd });
45014
45028
  this.isHd = isHd;
45015
45029
  this.$el.find('.gear-icon').html(isHd ? gearHdIcon : gearIcon);
45016
45030
  }
@@ -45029,11 +45043,14 @@ class BottomGear extends UICorePlugin {
45029
45043
  const icon = this.isHd ? gearHdIcon : gearIcon;
45030
45044
  this.$el.html(BottomGear.template({ icon, items }));
45031
45045
  mediaControl.getElement('gear')?.html(this.el);
45032
- this.core.trigger('gear:rendered'); // @deprecated
45033
- mediaControl.trigger(GearEvents.MEDIACONTROL_GEAR_RENDERED); // TODO drop
45034
45046
  mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
45035
45047
  return this;
45036
45048
  }
45049
+ /**
45050
+ * Re-renders the gear menu.
45051
+ * It fires the {@link MediaControlEvents.MEDIACONTROL_GEAR_RENDERED | MEDIACONTROL_GEAR_RENDERED} event,
45052
+ * which the plugins that attach to the gear menu can listen to to re-render themselves.
45053
+ */
45037
45054
  refresh() {
45038
45055
  this.render();
45039
45056
  this.$el.find('.gear-wrapper').show();
@@ -47114,7 +47131,7 @@ function rankConnectionSpeed(dlSpeed) {
47114
47131
  return 0;
47115
47132
  }
47116
47133
 
47117
- const pluginHtml$5 = "<% general = metrics.general %>\n<% counters = metrics.counters %>\n<% timers = metrics.timers %>\n<% extra = metrics.extra %>\n<% custom = metrics.custom %>\n\n<div class=\"stats-box\">\n <div class=\"stats-box-top\">\n <a class=\"close-button gplayer-lite-btn\" data-close-button>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <g clip-path=\"url(#clip0_184_1489)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.41376 6.00013L13.7068 -0.292872C14.0978 -0.683872 14.0978 -1.31587 13.7068 -1.70687C13.3158 -2.09787 12.6838 -2.09787 12.2928 -1.70687L5.99976 4.58613L-0.293238 -1.70687C-0.684238 -2.09787 -1.31624 -2.09787 -1.70724 -1.70687C-2.09824 -1.31587 -2.09824 -0.683872 -1.70724 -0.292872L4.58576 6.00013L-1.70724 12.2931C-2.09824 12.6841 -2.09824 13.3161 -1.70724 13.7071C-1.51224 13.9021 -1.25624 14.0001 -1.00024 14.0001C-0.744238 14.0001 -0.488238 13.9021 -0.293238 13.7071L5.99976 7.41413L12.2928 13.7071C12.4878 13.9021 12.7438 14.0001 12.9998 14.0001C13.2558 14.0001 13.5118 13.9021 13.7068 13.7071C14.0978 13.3161 14.0978 12.6841 13.7068 12.2931L7.41376 6.00013Z\"\n fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_184_1489\">\n <rect width=\"12\" height=\"12\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n </a>\n </div>\n <div class=\"stats-box-main\">\n <ul>\n <li class=\"title\"><span>General</span></li>\n <li>\n Display resolution:\n <div><span><%= general.displayResolution %></span></div>\n </li>\n <li>\n Volume:\n <div><span><%= general.volume %></span></div>\n </li>\n <li>\n Connection speed:\n <div><span id=\"dlText\"><%= custom.connectionSpeed %></span> Mbps</div>\n </li>\n <li class=\"canvas-wrapper\">\n <canvas id=\"speedTestCanvas\" width=\"190\" height=\"20\"></canvas>\n </li>\n <li>\n Ping:\n <div><span id=\"pingText\"><%= custom.ping %></span> ms</div>\n </li>\n <li>\n Jitter:\n <div><span id=\"jitterText\"><%= custom.jitter %></span> ms</div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span>Counters</span></li>\n <li>\n Plays:\n <div><span><%= counters.play %></span></div>\n </li>\n <li>\n Pauses:\n <div><span><%= counters.pause %></span></div>\n </li>\n <li>\n Errors:\n <div><span><%= counters.error %></span></div>\n </li>\n <li>\n Bufferings:\n <div><span><%= counters.buffering %></span></div>\n </li>\n <li>\n Decoded frames:\n <div><span><%= counters.decodedFrames %></span></div>\n </li>\n <li>\n Dropped frames:\n <div><span><%= counters.droppedFrames %></span></div>\n </li>\n <li>\n Frames per second:\n <div><span><%= counters.fps %></span></div>\n </li>\n <li>\n Bitrate changes:\n <div><span><%= counters.changeLevel %></span></div>\n </li>\n <li>\n Seeks:\n <div><span><%= counters.seek %></span></div>\n </li>\n <li>\n Fullscreen:\n <div><span><%= counters.fullscreen %></span></div>\n </li>\n <li>\n DVR seeks:\n <div><span><%= counters.dvrUsage %></span></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span>Timers</span></li>\n <li>\n Startup time:\n <div><span><%= timers.startup %></span></div>\n </li>\n <li>\n Watching time:\n <div><span><%= timers.watch %></span></div>\n </li>\n <li>\n Pause time:\n <div><span><%= timers.pause %></span></div>\n </li>\n <li>\n Buffering time:\n <div><span><%= timers.buffering %></span></div>\n </li>\n <li>\n Session time:\n <div><span><%= timers.session %></span></div>\n </li>\n <!-- <li>-->\n <!-- Latency:-->\n <!-- <div><span><%= timers.latency %></span></div>-->\n <!-- </li>-->\n </ul>\n\n <ul>\n <li class=\"title\"><span>Extra</span></li>\n <li>\n Playback:\n <div><span><%= extra.playbackName %></span></div>\n </li>\n <li>\n Playback type:\n <div><span><%= extra.playbackType %></span></div>\n </li>\n <li>\n Buffer size:\n <div><span><%= extra.buffersize %></span></div>\n </li>\n <li>\n Video duration:\n <div><span><%= extra.duration %></span></div>\n </li>\n <li>\n Current time:\n <div><span><%= extra.currentTime %></span></div>\n </li>\n <li>\n Bitrate weighted mean:\n <div><span><%= extra.bitrateWeightedMean %></span></div>\n </li>\n <li>\n Bitrate most used:\n <div><span><%= extra.bitrateMostUsed %></span></div>\n </li>\n <li>\n % Watched:\n <div><span><%= extra.watchedPercentage %></span></div>\n </li>\n <li>\n % Buffering:\n <div><span><%= extra.bufferingPercentage %></span></div>\n </li>\n </ul>\n </div>\n <div class=\"speedtest-summary\">\n <div class=\"speedtest-summary-header\">Your internet quality summary</div>\n <div class=\"speedtest-summary-block\">\n <div class=\"speedtest-summary-subblock\">\n <div class=\"speedtest-summary-subblock-content\">\n <div class=\"speedtest-quality\">\n <div class=\"speedtest-quality-header\">VOD: <%= custom.vodQuality %></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"vod\">\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"speedtest-summary-subblock\">\n <div class=\"speedtest-summary-subblock-content\">\n <div class=\"speedtest-quality\">\n <div class=\"speedtest-quality-header\">Live: <%= custom.liveQuality %></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"live\">\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"speedtest-footer\">\n <!-- <a class=\"speedtest-footer-about-link\" href=\"\" target=\"_blank\">I am not a nerd, what's this all about?</a>-->\n <button class=\"gplayer-lite-btn speedtest-btn speedtest-footer-refresh\" data-refresh-button type=\"button\">\n <svg width=\"12\" height=\"10\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path\n d=\"M6.03968 0.124998C3.64268 0.124998 1.67268 1.9565 1.48068 4.2915H1.00018C0.925833 4.29146 0.853156 4.31353 0.791378 4.35489C0.729601 4.39625 0.681511 4.45503 0.653218 4.52378C0.624925 4.59253 0.617705 4.66814 0.632476 4.74101C0.647248 4.81387 0.683343 4.88069 0.736177 4.933L1.57618 5.766C1.64641 5.83561 1.74129 5.87467 1.84018 5.87467C1.93906 5.87467 2.03395 5.83561 2.10418 5.766L2.94418 4.933C2.99701 4.88069 3.03311 4.81387 3.04788 4.74101C3.06265 4.66814 3.05543 4.59253 3.02714 4.52378C2.99884 4.45503 2.95075 4.39625 2.88898 4.35489C2.8272 4.31353 2.75452 4.29146 2.68018 4.2915H2.23368C2.42368 2.376 4.05268 0.874998 6.03968 0.874998C6.6948 0.873639 7.33932 1.04039 7.91158 1.35931C8.48384 1.67822 8.9647 2.13863 9.30818 2.6965C9.33331 2.73978 9.36686 2.7776 9.40684 2.80771C9.44682 2.83783 9.49243 2.85963 9.54097 2.87184C9.58951 2.88405 9.64001 2.88643 9.68948 2.87881C9.73895 2.8712 9.7864 2.85377 9.82902 2.82753C9.87165 2.80129 9.90859 2.76679 9.93767 2.72605C9.96675 2.68531 9.98739 2.63916 9.99835 2.59032C10.0093 2.54148 10.0104 2.49095 10.0015 2.44168C9.99264 2.39242 9.974 2.34544 9.94668 2.3035C9.53615 1.63664 8.96146 1.08621 8.27752 0.704805C7.59359 0.323402 6.82277 0.123774 6.03968 0.124998ZM10.4207 4.2335C10.3505 4.16419 10.2558 4.12532 10.1572 4.12532C10.0585 4.12532 9.96386 4.16419 9.89368 4.2335L9.05018 5.0665C8.9972 5.11874 8.96096 5.18557 8.94608 5.25847C8.93119 5.33137 8.93833 5.40705 8.96658 5.47588C8.99483 5.54472 9.04292 5.60359 9.10473 5.64501C9.16654 5.68644 9.23927 5.70853 9.31368 5.7085H9.76318C9.57218 7.6235 7.93768 9.125 5.94118 9.125C5.28399 9.12683 4.63729 8.96035 4.06269 8.64141C3.48808 8.32247 3.00473 7.86169 2.65868 7.303C2.63281 7.26107 2.59893 7.22465 2.55899 7.19582C2.51904 7.16699 2.47381 7.14631 2.42587 7.13495C2.37793 7.1236 2.32823 7.1218 2.27959 7.12966C2.23096 7.13752 2.18435 7.15488 2.14243 7.18075C2.05776 7.233 1.99731 7.31674 1.97438 7.41355C1.95146 7.51037 1.96793 7.61233 2.02018 7.697C2.43345 8.36457 3.01076 8.91521 3.69713 9.29647C4.38349 9.67772 5.15604 9.87689 5.94118 9.875C8.34518 9.875 10.3237 8.045 10.5162 5.7085H11.0002C11.0746 5.70853 11.1473 5.68644 11.2091 5.64501C11.2709 5.60359 11.319 5.54472 11.3473 5.47588C11.3755 5.40705 11.3827 5.33137 11.3678 5.25847C11.3529 5.18557 11.3167 5.11874 11.2637 5.0665L10.4207 4.2335Z\"\n fill=\"white\"/>\n </svg>\n Refresh\n </button>\n </div>\n</div>\n";
47134
+ const pluginHtml$4 = "<% general = metrics.general %>\n<% counters = metrics.counters %>\n<% timers = metrics.timers %>\n<% extra = metrics.extra %>\n<% custom = metrics.custom %>\n\n<div class=\"stats-box\">\n <div class=\"stats-box-top\">\n <a class=\"close-button gplayer-lite-btn\" data-close-button>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <g clip-path=\"url(#clip0_184_1489)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.41376 6.00013L13.7068 -0.292872C14.0978 -0.683872 14.0978 -1.31587 13.7068 -1.70687C13.3158 -2.09787 12.6838 -2.09787 12.2928 -1.70687L5.99976 4.58613L-0.293238 -1.70687C-0.684238 -2.09787 -1.31624 -2.09787 -1.70724 -1.70687C-2.09824 -1.31587 -2.09824 -0.683872 -1.70724 -0.292872L4.58576 6.00013L-1.70724 12.2931C-2.09824 12.6841 -2.09824 13.3161 -1.70724 13.7071C-1.51224 13.9021 -1.25624 14.0001 -1.00024 14.0001C-0.744238 14.0001 -0.488238 13.9021 -0.293238 13.7071L5.99976 7.41413L12.2928 13.7071C12.4878 13.9021 12.7438 14.0001 12.9998 14.0001C13.2558 14.0001 13.5118 13.9021 13.7068 13.7071C14.0978 13.3161 14.0978 12.6841 13.7068 12.2931L7.41376 6.00013Z\"\n fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_184_1489\">\n <rect width=\"12\" height=\"12\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n </a>\n </div>\n <div class=\"stats-box-main\">\n <ul>\n <li class=\"title\"><span>General</span></li>\n <li>\n Display resolution:\n <div><span><%= general.displayResolution %></span></div>\n </li>\n <li>\n Volume:\n <div><span><%= general.volume %></span></div>\n </li>\n <li>\n Connection speed:\n <div><span id=\"dlText\"><%= custom.connectionSpeed %></span> Mbps</div>\n </li>\n <li class=\"canvas-wrapper\">\n <canvas id=\"speedTestCanvas\" width=\"190\" height=\"20\"></canvas>\n </li>\n <li>\n Ping:\n <div><span id=\"pingText\"><%= custom.ping %></span> ms</div>\n </li>\n <li>\n Jitter:\n <div><span id=\"jitterText\"><%= custom.jitter %></span> ms</div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span>Counters</span></li>\n <li>\n Plays:\n <div><span><%= counters.play %></span></div>\n </li>\n <li>\n Pauses:\n <div><span><%= counters.pause %></span></div>\n </li>\n <li>\n Errors:\n <div><span><%= counters.error %></span></div>\n </li>\n <li>\n Bufferings:\n <div><span><%= counters.buffering %></span></div>\n </li>\n <li>\n Decoded frames:\n <div><span><%= counters.decodedFrames %></span></div>\n </li>\n <li>\n Dropped frames:\n <div><span><%= counters.droppedFrames %></span></div>\n </li>\n <li>\n Frames per second:\n <div><span><%= counters.fps %></span></div>\n </li>\n <li>\n Bitrate changes:\n <div><span><%= counters.changeLevel %></span></div>\n </li>\n <li>\n Seeks:\n <div><span><%= counters.seek %></span></div>\n </li>\n <li>\n Fullscreen:\n <div><span><%= counters.fullscreen %></span></div>\n </li>\n <li>\n DVR seeks:\n <div><span><%= counters.dvrUsage %></span></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span>Timers</span></li>\n <li>\n Startup time:\n <div><span><%= timers.startup %></span></div>\n </li>\n <li>\n Watching time:\n <div><span><%= timers.watch %></span></div>\n </li>\n <li>\n Pause time:\n <div><span><%= timers.pause %></span></div>\n </li>\n <li>\n Buffering time:\n <div><span><%= timers.buffering %></span></div>\n </li>\n <li>\n Session time:\n <div><span><%= timers.session %></span></div>\n </li>\n <!-- <li>-->\n <!-- Latency:-->\n <!-- <div><span><%= timers.latency %></span></div>-->\n <!-- </li>-->\n </ul>\n\n <ul>\n <li class=\"title\"><span>Extra</span></li>\n <li>\n Playback:\n <div><span><%= extra.playbackName %></span></div>\n </li>\n <li>\n Playback type:\n <div><span><%= extra.playbackType %></span></div>\n </li>\n <li>\n Buffer size:\n <div><span><%= extra.buffersize %></span></div>\n </li>\n <li>\n Video duration:\n <div><span><%= extra.duration %></span></div>\n </li>\n <li>\n Current time:\n <div><span><%= extra.currentTime %></span></div>\n </li>\n <li>\n Bitrate weighted mean:\n <div><span><%= extra.bitrateWeightedMean %></span></div>\n </li>\n <li>\n Bitrate most used:\n <div><span><%= extra.bitrateMostUsed %></span></div>\n </li>\n <li>\n % Watched:\n <div><span><%= extra.watchedPercentage %></span></div>\n </li>\n <li>\n % Buffering:\n <div><span><%= extra.bufferingPercentage %></span></div>\n </li>\n </ul>\n </div>\n <div class=\"speedtest-summary\">\n <div class=\"speedtest-summary-header\">Your internet quality summary</div>\n <div class=\"speedtest-summary-block\">\n <div class=\"speedtest-summary-subblock\">\n <div class=\"speedtest-summary-subblock-content\">\n <div class=\"speedtest-quality\">\n <div class=\"speedtest-quality-header\">VOD: <%= custom.vodQuality %></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"vod\">\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"speedtest-summary-subblock\">\n <div class=\"speedtest-summary-subblock-content\">\n <div class=\"speedtest-quality\">\n <div class=\"speedtest-quality-header\">Live: <%= custom.liveQuality %></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"live\">\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n <div class=\"speedtest-quality-content-item\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"speedtest-footer\">\n <!-- <a class=\"speedtest-footer-about-link\" href=\"\" target=\"_blank\">I am not a nerd, what's this all about?</a>-->\n <button class=\"gplayer-lite-btn speedtest-btn speedtest-footer-refresh\" data-refresh-button type=\"button\">\n <svg width=\"12\" height=\"10\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path\n d=\"M6.03968 0.124998C3.64268 0.124998 1.67268 1.9565 1.48068 4.2915H1.00018C0.925833 4.29146 0.853156 4.31353 0.791378 4.35489C0.729601 4.39625 0.681511 4.45503 0.653218 4.52378C0.624925 4.59253 0.617705 4.66814 0.632476 4.74101C0.647248 4.81387 0.683343 4.88069 0.736177 4.933L1.57618 5.766C1.64641 5.83561 1.74129 5.87467 1.84018 5.87467C1.93906 5.87467 2.03395 5.83561 2.10418 5.766L2.94418 4.933C2.99701 4.88069 3.03311 4.81387 3.04788 4.74101C3.06265 4.66814 3.05543 4.59253 3.02714 4.52378C2.99884 4.45503 2.95075 4.39625 2.88898 4.35489C2.8272 4.31353 2.75452 4.29146 2.68018 4.2915H2.23368C2.42368 2.376 4.05268 0.874998 6.03968 0.874998C6.6948 0.873639 7.33932 1.04039 7.91158 1.35931C8.48384 1.67822 8.9647 2.13863 9.30818 2.6965C9.33331 2.73978 9.36686 2.7776 9.40684 2.80771C9.44682 2.83783 9.49243 2.85963 9.54097 2.87184C9.58951 2.88405 9.64001 2.88643 9.68948 2.87881C9.73895 2.8712 9.7864 2.85377 9.82902 2.82753C9.87165 2.80129 9.90859 2.76679 9.93767 2.72605C9.96675 2.68531 9.98739 2.63916 9.99835 2.59032C10.0093 2.54148 10.0104 2.49095 10.0015 2.44168C9.99264 2.39242 9.974 2.34544 9.94668 2.3035C9.53615 1.63664 8.96146 1.08621 8.27752 0.704805C7.59359 0.323402 6.82277 0.123774 6.03968 0.124998ZM10.4207 4.2335C10.3505 4.16419 10.2558 4.12532 10.1572 4.12532C10.0585 4.12532 9.96386 4.16419 9.89368 4.2335L9.05018 5.0665C8.9972 5.11874 8.96096 5.18557 8.94608 5.25847C8.93119 5.33137 8.93833 5.40705 8.96658 5.47588C8.99483 5.54472 9.04292 5.60359 9.10473 5.64501C9.16654 5.68644 9.23927 5.70853 9.31368 5.7085H9.76318C9.57218 7.6235 7.93768 9.125 5.94118 9.125C5.28399 9.12683 4.63729 8.96035 4.06269 8.64141C3.48808 8.32247 3.00473 7.86169 2.65868 7.303C2.63281 7.26107 2.59893 7.22465 2.55899 7.19582C2.51904 7.16699 2.47381 7.14631 2.42587 7.13495C2.37793 7.1236 2.32823 7.1218 2.27959 7.12966C2.23096 7.13752 2.18435 7.15488 2.14243 7.18075C2.05776 7.233 1.99731 7.31674 1.97438 7.41355C1.95146 7.51037 1.96793 7.61233 2.02018 7.697C2.43345 8.36457 3.01076 8.91521 3.69713 9.29647C4.38349 9.67772 5.15604 9.87689 5.94118 9.875C8.34518 9.875 10.3237 8.045 10.5162 5.7085H11.0002C11.0746 5.70853 11.1473 5.68644 11.2091 5.64501C11.2709 5.60359 11.319 5.54472 11.3473 5.47588C11.3755 5.40705 11.3827 5.33137 11.3678 5.25847C11.3529 5.18557 11.3167 5.11874 11.2637 5.0665L10.4207 4.2335Z\"\n fill=\"white\"/>\n </svg>\n Refresh\n </button>\n </div>\n</div>\n";
47118
47135
 
47119
47136
  const buttonHtml$3 = "<button class='nerd-button gplayer-lite-btn gcore-skin-text-color gear-option'>\n <span class=\"stats-icon\"></span>\n <span>Statistics</span>\n</button>\n";
47120
47137
 
@@ -47229,7 +47246,7 @@ class ClapprNerdStats extends UICorePlugin {
47229
47246
  get supportedVersion() {
47230
47247
  return { min: CLAPPR_VERSION };
47231
47248
  }
47232
- static template = tmpl(pluginHtml$5);
47249
+ static template = tmpl(pluginHtml$4);
47233
47250
  /**
47234
47251
  * @internal
47235
47252
  */
@@ -47283,7 +47300,7 @@ class ClapprNerdStats extends UICorePlugin {
47283
47300
  const mediaControl = this.core.getPlugin('media_control');
47284
47301
  assert(mediaControl, 'media_control plugin is required');
47285
47302
  this.listenToOnce(this.core, Events$1.CORE_READY, this.init);
47286
- this.listenTo(mediaControl, GearEvents.MEDIACONTROL_GEAR_RENDERED, this.addToBottomGear);
47303
+ this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.addToBottomGear);
47287
47304
  }
47288
47305
  init() {
47289
47306
  this.container = this.core.activeContainer;
@@ -47804,7 +47821,7 @@ class ClapprStats extends ContainerPlugin {
47804
47821
  //Copyright 2014 Globo.com Player authors. All rights reserved.
47805
47822
  // Use of this source code is governed by a BSD-style
47806
47823
  // license that can be found at https://github.com/clappr/clappr-plugins/blob/master/LICENSE.
47807
- const T$a = 'plugins.click_to_pause_custom';
47824
+ const T$c = 'plugins.click_to_pause_custom';
47808
47825
  /**
47809
47826
  * Adds a behavior of toggling the playback state on click over the container
47810
47827
  * @beta
@@ -47834,7 +47851,7 @@ class ClickToPause extends ContainerPlugin {
47834
47851
  click() {
47835
47852
  const isLivePlayback = this.container.getPlaybackType() === Playback.LIVE;
47836
47853
  const isDvrEnabled = this.container.isDvrEnabled();
47837
- trace(`${T$a} click`, {
47854
+ trace(`${T$c} click`, {
47838
47855
  isLivePlayback,
47839
47856
  isDvrEnabled,
47840
47857
  });
@@ -47852,7 +47869,7 @@ class ClickToPause extends ContainerPlugin {
47852
47869
  settingsUpdate() {
47853
47870
  const isLivePlayback = this.container.getPlaybackType() === Playback.LIVE;
47854
47871
  const pointerEnabled = !isLivePlayback || this.container.isDvrEnabled();
47855
- trace(`${T$a} settingsUpdate`, {
47872
+ trace(`${T$c} settingsUpdate`, {
47856
47873
  isLivePlayback,
47857
47874
  pointerEnabled,
47858
47875
  });
@@ -48148,6 +48165,7 @@ class ContextMenu extends UIContainerPlugin {
48148
48165
 
48149
48166
  const dvrHTML = "<div class=\"live-info\"><%= live %></div>\n<button type=\"button\" class=\"live-button\" aria-label=\"<%= backToLive %>\"><%= backToLive %></button>\n";
48150
48167
 
48168
+ const T$b = 'plugins.dvr_controls';
48151
48169
  /**
48152
48170
  * Adds the DVR controls to the media control UI
48153
48171
  * @beta
@@ -48178,7 +48196,7 @@ class DvrControls extends UICorePlugin {
48178
48196
  */
48179
48197
  get events() {
48180
48198
  return {
48181
- 'click .live-button': 'click'
48199
+ 'click .live-button': 'click',
48182
48200
  };
48183
48201
  }
48184
48202
  /**
@@ -48186,8 +48204,8 @@ class DvrControls extends UICorePlugin {
48186
48204
  */
48187
48205
  get attributes() {
48188
48206
  return {
48189
- 'class': 'dvr-controls',
48190
- 'data-dvr-controls': ''
48207
+ class: 'dvr-controls',
48208
+ 'data-dvr-controls': '',
48191
48209
  };
48192
48210
  }
48193
48211
  constructor(core) {
@@ -48206,23 +48224,25 @@ class DvrControls extends UICorePlugin {
48206
48224
  }
48207
48225
  bindContainerEvents() {
48208
48226
  this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.render);
48209
- this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.dvrChanged);
48227
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrChanged);
48210
48228
  }
48211
- dvrChanged(dvrEnabled) {
48229
+ onDvrChanged(dvrEnabled) {
48230
+ trace(`${T$b} onDvrChanged`, {
48231
+ dvrEnabled,
48232
+ });
48212
48233
  if (this.core.getPlaybackType() !== Playback.LIVE) {
48213
48234
  return;
48214
48235
  }
48215
48236
  this.settingsUpdate();
48216
48237
  this.core.mediaControl.$el.addClass('live');
48217
48238
  if (dvrEnabled) {
48218
- this.core.mediaControl.$playbackRate.removeClass('playbackrate-enable');
48239
+ // TODO
48219
48240
  this.core.mediaControl.$el
48220
48241
  .addClass('dvr')
48221
48242
  .find('.media-control-indicator[data-position], .media-control-indicator[data-duration]')
48222
48243
  .hide();
48223
48244
  }
48224
48245
  else {
48225
- this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
48226
48246
  this.core.mediaControl.$el.removeClass('dvr');
48227
48247
  }
48228
48248
  }
@@ -48247,24 +48267,31 @@ class DvrControls extends UICorePlugin {
48247
48267
  this.bindEvents();
48248
48268
  }
48249
48269
  shouldRender() {
48250
- const useDvrControls = this.core.options.useDvrControls === undefined || !!this.core.options.useDvrControls;
48270
+ const useDvrControls = this.core.options.useDvrControls === undefined ||
48271
+ !!this.core.options.useDvrControls;
48251
48272
  return useDvrControls && this.core.getPlaybackType() === Playback.LIVE;
48252
48273
  }
48253
48274
  /**
48254
48275
  * @internal
48255
48276
  */
48256
48277
  render() {
48278
+ trace(`${T$b} render`, {
48279
+ dvrEnabled: this.core.activePlayback?.dvrEnabled,
48280
+ });
48281
+ if (!this.shouldRender()) {
48282
+ return this;
48283
+ }
48257
48284
  this.$el.html(DvrControls.template({
48258
48285
  live: this.core.i18n.t('live'),
48259
- backToLive: this.core.i18n.t('back_to_live')
48286
+ backToLive: this.core.i18n.t('back_to_live'),
48260
48287
  }));
48261
- if (this.shouldRender()) {
48262
- const mediaControl = this.core.getPlugin('media_control');
48263
- assert(mediaControl, 'media_control plugin is required');
48264
- // TODO don't tap into the $el directly
48265
- mediaControl.$el.addClass('live');
48266
- mediaControl.$('.media-control-left-panel[data-media-control]').append(this.$el);
48267
- }
48288
+ const mediaControl = this.core.getPlugin('media_control');
48289
+ assert(mediaControl, 'media_control plugin is required');
48290
+ // TODO don't tap into the $el directly
48291
+ mediaControl.$el.addClass('live');
48292
+ mediaControl
48293
+ .$('.media-control-left-panel[data-media-control]')
48294
+ .append(this.$el);
48268
48295
  return this;
48269
48296
  }
48270
48297
  }
@@ -48273,7 +48300,7 @@ const reloadIcon = "<svg fill=\"#FFFFFF\" height=\"24\" viewBox=\"0 0 24 24\" wi
48273
48300
 
48274
48301
  const templateHtml = "<div class=\"player-error-screen__content\" data-error-screen>\n <% if (icon) { %>\n <div class=\"player-error-screen__icon\" data-error-screen><%= icon %></div>\n <% } %>\n <div class=\"player-error-screen__title\" data-error-screen><%= title %></div>\n <% if (message) { %>\n <div class=\"player-error-screen__message\" data-error-screen><%= message %></div>\n <% } %>\n <% if (code) { %>\n <div class=\"player-error-screen__code\" data-error-screen>Error code: <%= code %></div>\n <% } %>\n <% if (reloadIcon) { %>\n <div class=\"player-error-screen__reload\" data-error-screen><%= reloadIcon %></div>\n <% } %>\n</div>\n";
48275
48302
 
48276
- const T$9 = 'plugins.error_screen';
48303
+ const T$a = 'plugins.error_screen';
48277
48304
  /**
48278
48305
  * Displays an error nicely in the overlay on top of the player.
48279
48306
  * @beta
@@ -48310,11 +48337,11 @@ class ErrorScreen extends UICorePlugin {
48310
48337
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
48311
48338
  }
48312
48339
  onPlay() {
48313
- trace(`${T$9} onPlay`);
48340
+ trace(`${T$a} onPlay`);
48314
48341
  this.unmount();
48315
48342
  }
48316
48343
  unmount() {
48317
- trace(`${T$9} unmount`);
48344
+ trace(`${T$a} unmount`);
48318
48345
  this.err = null;
48319
48346
  this.$el.remove();
48320
48347
  }
@@ -48336,7 +48363,7 @@ class ErrorScreen extends UICorePlugin {
48336
48363
  }, 0);
48337
48364
  }
48338
48365
  onActiveContainerChanged() {
48339
- trace(`${T$9} onActiveContainerChanged`, {
48366
+ trace(`${T$a} onActiveContainerChanged`, {
48340
48367
  reloading: this.core.options.reloading,
48341
48368
  });
48342
48369
  this.err = null;
@@ -48352,7 +48379,7 @@ class ErrorScreen extends UICorePlugin {
48352
48379
  }
48353
48380
  }
48354
48381
  onError(err) {
48355
- trace(`${T$9} onError`, { err });
48382
+ trace(`${T$a} onError`, { err });
48356
48383
  if (err.UI) {
48357
48384
  if (this.err) {
48358
48385
  this.unmount();
@@ -48620,7 +48647,7 @@ const arrowLeftIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fil
48620
48647
 
48621
48648
  const checkIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M20.5793 4.19296C20.1216 3.86696 19.4777 3.96396 19.1424 4.40896L9.37295 17.3809L4.81634 12.107C4.45222 11.683 3.80218 11.6289 3.36709 11.9839C2.932 12.3389 2.87543 12.97 3.2416 13.393L8.64165 19.643C8.83708 19.869 9.12506 20 9.42849 20C9.4398 20 9.45114 20 9.46246 19.999C9.77926 19.989 10.0724 19.838 10.2586 19.59L20.8015 5.58996C21.1368 5.14496 21.0371 4.51896 20.5793 4.19296Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
48622
48649
 
48623
- const T$8 = 'plugins.level_selector';
48650
+ const T$9 = 'plugins.level_selector';
48624
48651
  const VERSION$4 = '2.19.4';
48625
48652
  /**
48626
48653
  * A {@link MediaControl | media control} plugin that provides a UI to control the quality level of the playback.
@@ -48697,9 +48724,18 @@ class LevelSelector extends UICorePlugin {
48697
48724
  * @internal
48698
48725
  */
48699
48726
  bindEvents() {
48727
+ this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
48728
+ this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.bindPlaybackEvents);
48729
+ }
48730
+ onCoreReady() {
48731
+ trace(`${T$9} onCoreReady`);
48700
48732
  const mediaControl = this.core.getPlugin('media_control');
48701
48733
  assert(mediaControl, 'media_control plugin is required');
48702
- this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.bindPlaybackEvents);
48734
+ this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
48735
+ }
48736
+ onGearRendered() {
48737
+ trace(`${T$9} onGearRendered`);
48738
+ this.deferRender();
48703
48739
  }
48704
48740
  bindPlaybackEvents() {
48705
48741
  this.removeAuto = false;
@@ -48719,9 +48755,9 @@ class LevelSelector extends UICorePlugin {
48719
48755
  }
48720
48756
  }
48721
48757
  onStop() {
48722
- trace(`${T$8} onStop`);
48758
+ trace(`${T$9} onStop`);
48723
48759
  this.listenToOnce(this.core.activePlayback, Events$1.PLAYBACK_PLAY, () => {
48724
- trace(`${T$8} on PLAYBACK_PLAY after stop`, {
48760
+ trace(`${T$9} on PLAYBACK_PLAY after stop`, {
48725
48761
  selectedLevelId: this.selectedLevelId,
48726
48762
  });
48727
48763
  if (this.core.activePlayback.getPlaybackType() === 'live') {
@@ -48764,7 +48800,7 @@ class LevelSelector extends UICorePlugin {
48764
48800
  this.$el.html(html);
48765
48801
  const gear = this.core.getPlugin('bottom_gear');
48766
48802
  if (!gear) {
48767
- trace(`${T$8} renderButton: bottom_gear plugin not found`);
48803
+ trace(`${T$9} renderButton: bottom_gear plugin not found`);
48768
48804
  }
48769
48805
  gear?.getElement('quality')?.html(this.el);
48770
48806
  }
@@ -48780,7 +48816,7 @@ class LevelSelector extends UICorePlugin {
48780
48816
  });
48781
48817
  this.$el.html(html);
48782
48818
  const gear = this.core.getPlugin('bottom_gear');
48783
- trace(`${T$8} renderDropdown: bottom_gear plugin not found`);
48819
+ trace(`${T$9} renderDropdown: bottom_gear plugin not found`);
48784
48820
  gear?.setContent(this.el);
48785
48821
  }
48786
48822
  get maxLevel() {
@@ -48821,13 +48857,14 @@ class LevelSelector extends UICorePlugin {
48821
48857
  return false;
48822
48858
  }
48823
48859
  goBack() {
48824
- trace(`${T$8} goBack`);
48860
+ trace(`${T$9} goBack`);
48825
48861
  this.isOpen = false;
48826
- this.core.trigger('gear:refresh');
48827
- this.deferRender();
48862
+ setTimeout(() => {
48863
+ this.core.getPlugin('bottom_gear').refresh();
48864
+ }, 0);
48828
48865
  }
48829
48866
  setLevel(index) {
48830
- trace(`${T$8} setIndexLevel`, { index });
48867
+ trace(`${T$9} setIndexLevel`, { index });
48831
48868
  this.selectedLevelId = index;
48832
48869
  if (!this.core.activePlayback) {
48833
48870
  return;
@@ -48845,7 +48882,7 @@ class LevelSelector extends UICorePlugin {
48845
48882
  this.deferRender();
48846
48883
  }
48847
48884
  onShowLevelSelectMenu() {
48848
- trace(`${T$8} onShowLevelSelectMenu`);
48885
+ trace(`${T$9} onShowLevelSelectMenu`);
48849
48886
  this.isOpen = true;
48850
48887
  this.renderDropdown();
48851
48888
  this.highlightCurrentLevel();
@@ -48881,11 +48918,11 @@ class LevelSelector extends UICorePlugin {
48881
48918
  return this.levelLabels[index] ?? formatLevelLabel(this.levels[index]);
48882
48919
  }
48883
48920
  updateCurrentLevel(info) {
48884
- trace(`${T$8} updateCurrentLevel`, { info });
48921
+ trace(`${T$9} updateCurrentLevel`, { info });
48885
48922
  this.highlightCurrentLevel();
48886
48923
  }
48887
48924
  highlightCurrentLevel() {
48888
- trace(`${T$8} highlightCurrentLevel`, {
48925
+ trace(`${T$9} highlightCurrentLevel`, {
48889
48926
  selectedLevelId: this.selectedLevelId,
48890
48927
  });
48891
48928
  this.allLevelElements().removeClass('current');
@@ -49126,7 +49163,7 @@ class Logo extends UIContainerPlugin {
49126
49163
  }
49127
49164
  }
49128
49165
 
49129
- const pluginHtml$4 = "<button data-multicamera-button class='gcore-skin-button-color'>\n <span class=\"multicamera-icon\"></span>\n</button>\n\n<ul class=\"gcore-skin-bg-color\">\n <% for (var i = 0; i < streams.length; i++) { %>\n <% if(!streams[i].live && multisources_mode === 'only_live') { %>\n <% continue; %>\n <% } %>\n <li>\n <div class=\"multicamera-item\" data-multicamera-selector-live=\"<%= streams[i].live %>\"\n data-multicamera-selector-select=\"<%= streams[i].id %>\">\n <div class=\"multicamera-screenshot\">\n <% if (streams[i].screenshot) { %>\n <img src=\"<%= streams[i].screenshot %>\" alt=\"<%= streams[i].title %>\"/>\n <% } %>\n </div>\n <div class=\"multicamera-text gcore-skin-text-color\">\n <% if (streams[i].title) { %>\n <div class=\"multicamera-title gcore-skin-text-color\"><%= streams[i].title %></div>\n <% } %>\n <% if (streams[i].description) { %>\n <div class=\"multicamera-description gcore-skin-text-color\"><%= streams[i].description %></div>\n <% } %>\n </div>\n </div>\n </li>\n <% } %>\n</ul>\n";
49166
+ const pluginHtml$3 = "<button data-multicamera-button class='gcore-skin-button-color'>\n <span class=\"multicamera-icon\"></span>\n</button>\n\n<ul class=\"gcore-skin-bg-color\">\n <% for (var i = 0; i < streams.length; i++) { %>\n <% if(!streams[i].live && multisources_mode === 'only_live') { %>\n <% continue; %>\n <% } %>\n <li>\n <div class=\"multicamera-item\" data-multicamera-selector-live=\"<%= streams[i].live %>\"\n data-multicamera-selector-select=\"<%= streams[i].id %>\">\n <div class=\"multicamera-screenshot\">\n <% if (streams[i].screenshot) { %>\n <img src=\"<%= streams[i].screenshot %>\" alt=\"<%= streams[i].title %>\"/>\n <% } %>\n </div>\n <div class=\"multicamera-text gcore-skin-text-color\">\n <% if (streams[i].title) { %>\n <div class=\"multicamera-title gcore-skin-text-color\"><%= streams[i].title %></div>\n <% } %>\n <% if (streams[i].description) { %>\n <div class=\"multicamera-description gcore-skin-text-color\"><%= streams[i].description %></div>\n <% } %>\n </div>\n </div>\n </li>\n <% } %>\n</ul>\n";
49130
49167
 
49131
49168
  const streamsIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"20\" viewBox=\"0 0 24 20\">\n <path fill=\"#FFF\" fill-rule=\"nonzero\" d=\"M24 1.5v13a1.5 1.5 0 0 1-1.5 1.5h-1a.5.5 0 0 1-.5-.5v-10A2.5 2.5 0 0 0 18.5 3h-14a.5.5 0 0 1-.5-.5v-1A1.5 1.5 0 0 1 5.5 0h17A1.5 1.5 0 0 1 24 1.5M12.724 12.447l-5 2.5a.505.505 0 0 1-.487-.021A.503.503 0 0 1 7 14.5v-5c0-.173.09-.334.237-.426a.505.505 0 0 1 .487-.021l5 2.5a.5.5 0 0 1 0 .894M18.5 4h-17C.673 4 0 4.673 0 5.5v13c0 .827.673 1.5 1.5 1.5h17c.827 0 1.5-.673 1.5-1.5v-13c0-.827-.673-1.5-1.5-1.5\"/>\n</svg>\n";
49132
49169
 
@@ -49135,7 +49172,7 @@ const streamsMomentoIcon = "<svg id=\"Слой_1\" data-name=\"Слой 1\" xmln
49135
49172
  const streamsWhiteNightsIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"50\" height=\"50\" viewBox=\"0 0 50 50\">\n <defs>\n <clipPath id=\"clip-Icon\">\n <rect width=\"50\" height=\"50\"/>\n </clipPath>\n </defs>\n <g id=\"Icon\" clip-path=\"url(#clip-Icon)\">\n <g id=\"icon2\" transform=\"translate(-0.041 0)\">\n <path id=\"Контур_77\" data-name=\"Контур 77\" d=\"M6.493,13v8.266h6.275V19.74H8.31V17.714h4.006V16.3H8.31V14.53h4.365V13Zm7.5,0v8.266h1.7V15.732h.023l3.438,5.534h1.818V13h-1.7v5.545h-.023L15.8,13Z\" fill=\"#fff\"/>\n <path id=\"Контур_76\" data-name=\"Контур 76\" d=\"M29.949,29.1V26.774H31.94a1.4,1.4,0,0,1,.938.272,1.1,1.1,0,0,1,.313.874,1.155,1.155,0,0,1-.313.9,1.375,1.375,0,0,1-.938.278ZM28.132,25.36v8.266h1.817V30.4h1.818a1.353,1.353,0,0,1,.984.3,1.637,1.637,0,0,1,.394.949c.046.333.079.681.1,1.042a3.2,3.2,0,0,0,.185.938h1.819a1.218,1.218,0,0,1-.191-.423,3.611,3.611,0,0,1-.093-.527c-.019-.185-.033-.367-.041-.544s-.016-.332-.023-.463a5.052,5.052,0,0,0-.087-.625,2.109,2.109,0,0,0-.2-.573,1.586,1.586,0,0,0-.359-.451,1.414,1.414,0,0,0-.556-.284v-.023a1.926,1.926,0,0,0,1-.81,2.494,2.494,0,0,0,.307-1.262,2.308,2.308,0,0,0-.165-.88,2.128,2.128,0,0,0-.486-.724,2.3,2.3,0,0,0-.764-.492,2.67,2.67,0,0,0-1-.179ZM43.506,30.5V25.36H41.689V30.5a2.065,2.065,0,0,1-.37,1.36,1.7,1.7,0,0,1-1.343.434,2.086,2.086,0,0,1-.886-.156,1.283,1.283,0,0,1-.758-.978,3.748,3.748,0,0,1-.058-.66V25.36H36.456V30.5a3.16,3.16,0,0,0,.92,2.5,3.807,3.807,0,0,0,2.6.81,3.82,3.82,0,0,0,2.593-.816,3.132,3.132,0,0,0,.937-2.492Z\" fill=\"#fff\"/>\n <path id=\"Контур_80\" data-name=\"Контур 80\" d=\"M22.646,31.2H4.689a4.505,4.505,0,0,1-4.5-4.5V8.5A4.505,4.505,0,0,1,4.689,4h18.2a4.505,4.505,0,0,1,4.5,4.5v8.445l-.893.1a3.184,3.184,0,0,0-2.846,3.177V30.5l-.465.7ZM4.689,6a2.5,2.5,0,0,0-2.5,2.5V26.7a2.5,2.5,0,0,0,2.5,2.5H21.65V20.22a5.18,5.18,0,0,1,3.739-4.992V8.5a2.5,2.5,0,0,0-2.5-2.5Z\" fill=\"#fff\"/>\n <path id=\"Контур_81\" data-name=\"Контур 81\" d=\"M30.127,47.884a1,1,0,0,1-1-1V43.267H26.846a5.206,5.206,0,0,1-5.2-5.2V20.222a5.206,5.206,0,0,1,5.2-5.2H44.692a5.206,5.206,0,0,1,5.2,5.2V38.068a5.206,5.206,0,0,1-5.2,5.2H35.058l-4.216,4.316A1,1,0,0,1,30.127,47.884ZM26.846,17.022a3.2,3.2,0,0,0-3.2,3.2V38.067a3.2,3.2,0,0,0,3.2,3.2h3.281a1,1,0,0,1,1,1v2.162l2.8-2.86a1,1,0,0,1,.715-.3H44.692a3.2,3.2,0,0,0,3.2-3.2V20.222a3.2,3.2,0,0,0-3.2-3.2Z\" fill=\"#fff\"/>\n </g>\n </g>\n</svg>\n";
49136
49173
 
49137
49174
  const VERSION$3 = '0.0.1';
49138
- const T$7 = 'plugins.multicamera';
49175
+ const T$8 = 'plugins.multicamera';
49139
49176
  /**
49140
49177
  * The plugin adds support for loading multiple streams and switching between them using the media control UI.
49141
49178
  * @beta
@@ -49156,7 +49193,7 @@ class MultiCamera extends UICorePlugin {
49156
49193
  return VERSION$3;
49157
49194
  }
49158
49195
  get template() {
49159
- return tmpl(pluginHtml$4);
49196
+ return tmpl(pluginHtml$3);
49160
49197
  }
49161
49198
  get attributes() {
49162
49199
  return {
@@ -49281,7 +49318,7 @@ class MultiCamera extends UICorePlugin {
49281
49318
  }
49282
49319
  onCameraSelect(event) {
49283
49320
  const value = event.currentTarget.dataset.multicameraSelectorSelect;
49284
- trace(`${T$7} onCameraSelect`, { value });
49321
+ trace(`${T$8} onCameraSelect`, { value });
49285
49322
  if (value !== undefined) {
49286
49323
  this.changeById(parseInt(value, 10));
49287
49324
  }
@@ -49407,13 +49444,13 @@ class MultiCamera extends UICorePlugin {
49407
49444
  }
49408
49445
  }
49409
49446
  changeById(id) {
49410
- trace(`${T$7} changeById`, { id });
49447
+ trace(`${T$8} changeById`, { id });
49411
49448
  queueMicrotask(() => {
49412
49449
  const playbackOptions = this.core.options.playback || {};
49413
49450
  // TODO figure out what this does
49414
49451
  playbackOptions.recycleVideo = Browser.isMobile;
49415
49452
  this.currentCamera = this.findElementById(id) ?? null;
49416
- trace(`${T$7} changeById`, { id, currentCamera: this.currentCamera, multicamera: this.multicamera });
49453
+ trace(`${T$8} changeById`, { id, currentCamera: this.currentCamera, multicamera: this.multicamera });
49417
49454
  if (!this.currentCamera) {
49418
49455
  return;
49419
49456
  }
@@ -49430,7 +49467,7 @@ class MultiCamera extends UICorePlugin {
49430
49467
  // TODO remove?
49431
49468
  // for html5 playback:
49432
49469
  this.options.dvrEnabled = this.currentCamera.dvr;
49433
- trace(`${T$7} changeById`, { currentCamera: this.currentCamera });
49470
+ trace(`${T$8} changeById`, { currentCamera: this.currentCamera });
49434
49471
  // TODO
49435
49472
  this.core.configure({
49436
49473
  playback: playbackOptions,
@@ -49488,7 +49525,7 @@ const pipIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"no
49488
49525
  const buttonHtml$1 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n <span><%= pipIcon %></span>\n</button>\n";
49489
49526
 
49490
49527
  const VERSION$2 = '0.0.1';
49491
- const T$6 = `plugins.pip`;
49528
+ const T$7 = `plugins.pip`;
49492
49529
  /**
49493
49530
  * Enables picture in picture mode.
49494
49531
  * @beta
@@ -49536,7 +49573,7 @@ class PictureInPicture extends UICorePlugin {
49536
49573
  this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
49537
49574
  }
49538
49575
  isPiPSupported() {
49539
- trace(`${T$6} isPiPSupported`, {
49576
+ trace(`${T$7} isPiPSupported`, {
49540
49577
  pictureInPictureEnabled: document.pictureInPictureEnabled,
49541
49578
  requestPictureInPicture: HTMLVideoElement.prototype.requestPictureInPicture,
49542
49579
  });
@@ -49558,7 +49595,7 @@ class PictureInPicture extends UICorePlugin {
49558
49595
  return this;
49559
49596
  }
49560
49597
  togglePictureInPicture() {
49561
- trace(`${T$6} togglePictureInPicture`);
49598
+ trace(`${T$7} togglePictureInPicture`);
49562
49599
  if (this.videoElement !== document.pictureInPictureElement) {
49563
49600
  this.requestPictureInPicture();
49564
49601
  }
@@ -49567,19 +49604,17 @@ class PictureInPicture extends UICorePlugin {
49567
49604
  }
49568
49605
  }
49569
49606
  requestPictureInPicture() {
49570
- trace(`${T$6} requestPictureInPicture`, {
49607
+ trace(`${T$7} requestPictureInPicture`, {
49571
49608
  videoElement: !!this.videoElement,
49572
49609
  });
49573
49610
  this.videoElement.requestPictureInPicture();
49574
49611
  }
49575
49612
  exitPictureInPicture() {
49576
- trace(`${T$6} exitPictureInPicture`);
49613
+ trace(`${T$7} exitPictureInPicture`);
49577
49614
  document.exitPictureInPicture();
49578
49615
  }
49579
49616
  }
49580
49617
 
49581
- const pluginHtml$3 = "<button class=\"gcore-skin-button-color\" data-playback-rate-button>\n <span><%= title %></span>\n</button>\n<ul>\n <% for (var i = 0; i < playbackRates.length; i++) { %>\n <li data-playback-rate-select=\"<%= playbackRates[i].value %>\"><a\n data-playback-rate-a=\"<%= playbackRates[i].value %>\" href=\"#\"><%= playbackRates[i].label %></a></li>\n <% }; %>\n</ul>\n";
49582
-
49583
49618
  const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option'>\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span>Playback speed</span>\n <span class=\"gear-option_arrow-right-icon\"><%= arrowRightIcon %></span>\n <span class='gear-option_value'><%= title %></span>\n</button>\n";
49584
49619
 
49585
49620
  const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n Playback speed\n</button>\n<ul class=\"gear-sub-menu\">\n <% for (var i = playbackRates.length - 1; i >= 0; i--) { %>\n <li>\n <a href=\"#\" class='gear-sub-menu_btn gcore-skin-text-color' data-rate=\"<%= playbackRates[i].value %>\">\n <span class=\"check-icon\"><%= checkIcon %></span>\n <%= playbackRates[i].label %>\n </a>\n </li>\n <% } %>\n</ul>\n";
@@ -49596,10 +49631,9 @@ const DEFAULT_PLAYBACK_RATES = [
49596
49631
  { value: '2.0', label: '2x' }
49597
49632
  ];
49598
49633
  const DEFAULT_PLAYBACK_RATE = '1.0';
49599
- // TODO
49600
- const MEDIACONTROL_PLAYBACKRATE = 'playbackRate';
49634
+ const T$6 = 'plugins.playback_rate';
49601
49635
  /**
49602
- * Allows changing the playback speed of the video.
49636
+ * PLUGIN that allows changing the playback speed of the video.
49603
49637
  * @beta
49604
49638
  *
49605
49639
  * @remarks
@@ -49609,12 +49643,13 @@ const MEDIACONTROL_PLAYBACKRATE = 'playbackRate';
49609
49643
  *
49610
49644
  * - {@link BottomGear | bottom_gear}
49611
49645
  *
49612
- * It renders a button in the gear menu, which opens a dropdown with the available playback rates.
49646
+ * It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
49613
49647
  */
49614
49648
  class PlaybackRate extends UICorePlugin {
49615
- currentPlayback = null;
49616
49649
  playbackRates = DEFAULT_PLAYBACK_RATES;
49650
+ // Saved when an ad starts to restore after it finishes
49617
49651
  prevSelectedRate;
49652
+ rendered = false;
49618
49653
  selectedRate = DEFAULT_PLAYBACK_RATE;
49619
49654
  /**
49620
49655
  * @internal
@@ -49628,9 +49663,13 @@ class PlaybackRate extends UICorePlugin {
49628
49663
  get supportedVersion() {
49629
49664
  return { min: CLAPPR_VERSION };
49630
49665
  }
49631
- static template = tmpl(pluginHtml$3);
49632
49666
  static buttonTemplate = tmpl(buttonHtml);
49633
49667
  static listTemplate = tmpl(listHtml);
49668
+ constructor(core) {
49669
+ super(core);
49670
+ this.playbackRates = core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
49671
+ this.selectedRate = core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
49672
+ }
49634
49673
  /**
49635
49674
  * @internal
49636
49675
  */
@@ -49654,27 +49693,36 @@ class PlaybackRate extends UICorePlugin {
49654
49693
  * @internal
49655
49694
  */
49656
49695
  bindEvents() {
49657
- this.listenTo(this.core, 'gear:rendered', this.render);
49658
- // TODO this.core.getPlugin('media_control'), bottom_gear
49659
- this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED, this.reload);
49660
- this.listenTo(this.core.mediaControl, MEDIACONTROL_PLAYBACKRATE, this.updatePlaybackRate);
49661
- this.listenTo(this.core, 'core:advertisement:start', this.onStartAd);
49662
- this.listenTo(this.core, 'core:advertisement:finish', this.onFinishAd);
49663
- if (this.core.activeContainer) {
49664
- this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_BUFFERFULL, this.updateLiveStatus);
49665
- }
49666
- if (this.currentPlayback) {
49667
- this.listenTo(this.currentPlayback, Events$1.PLAYBACK_STOP, this.onStop);
49668
- this.listenTo(this.currentPlayback, Events$1.PLAYBACK_PLAY, this.onPlay);
49669
- // TODO import dash playback events
49670
- this.listenTo(this.currentPlayback, 'dash:playback-rate-changed', this.onDashRateChange);
49671
- }
49696
+ this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
49697
+ this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
49672
49698
  }
49673
- unBindEvents() {
49674
- this.stopListening(this.core, 'gear:rendered', this.render);
49675
- this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED, this.reload);
49676
- this.stopListening(this.core, 'core:advertisement:start', this.onStartAd);
49677
- this.stopListening(this.core, 'core:advertisement:finish', this.onFinishAd);
49699
+ onCoreReady() {
49700
+ const mediaControl = this.core.getPlugin('media_control');
49701
+ assert(mediaControl, 'media_control plugin is required');
49702
+ const gear = this.core.getPlugin('bottom_gear');
49703
+ assert(gear, 'bottom_gear plugin is required');
49704
+ this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
49705
+ }
49706
+ onActiveContainerChange() {
49707
+ this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_STOP, this.onStop);
49708
+ this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_PLAY, this.onPlay);
49709
+ this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
49710
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
49711
+ }
49712
+ onGearRendered() {
49713
+ trace(`${T$6} onGearRendered`, {
49714
+ rendered: this.rendered,
49715
+ });
49716
+ this.rendered = false;
49717
+ this.render();
49718
+ }
49719
+ onDvrStateChanged(dvrEnabled) {
49720
+ trace(`${T$6} onDvrStateChanged`, {
49721
+ dvrEnabled,
49722
+ });
49723
+ if (dvrEnabled) {
49724
+ this.render();
49725
+ }
49678
49726
  }
49679
49727
  allRateElements() {
49680
49728
  return this.$('ul.gear-sub-menu li');
@@ -49682,68 +49730,53 @@ class PlaybackRate extends UICorePlugin {
49682
49730
  rateElement(rate = "1") {
49683
49731
  return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
49684
49732
  }
49685
- onDashRateChange() {
49686
- // TODO consider removing
49687
- this.currentPlayback._dash?.setPlaybackRate(this.selectedRate);
49688
- }
49689
- updateLiveStatus() {
49690
- if (this.core.getPlaybackType() === Playback.LIVE) {
49691
- if (this.core.mediaControl.currentSeekBarPercentage <= 98.9) {
49692
- this.core.mediaControl.$playbackRate.removeClass('playbackrate-enable');
49693
- this.core.mediaControl.$el.addClass('dvr');
49694
- return;
49695
- }
49696
- this.updatePlaybackRate(DEFAULT_PLAYBACK_RATE);
49697
- this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
49698
- this.core.mediaControl.$el.removeClass('dvr');
49733
+ onPlaybackRateChange(playbackRate) {
49734
+ const selectedRate = parseInt(this.selectedRate, 10);
49735
+ if (playbackRate !== selectedRate) {
49736
+ trace(`${T$6} onPlaybackRateChange setting target rate`, {
49737
+ playbackRate,
49738
+ selectedRate,
49739
+ });
49740
+ this.core.activePlayback?.setPlaybackRate(selectedRate);
49699
49741
  }
49700
49742
  }
49701
- reload() {
49702
- this.unBindEvents();
49703
- this.bindEvents();
49704
- }
49705
49743
  shouldRender() {
49706
49744
  if (!this.core.activeContainer) {
49707
49745
  return false;
49708
49746
  }
49709
- this.currentPlayback = this.core.activePlayback;
49710
- return !(this.currentPlayback?.tagName !== 'video' && this.currentPlayback?.tagName !== 'audio');
49747
+ if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
49748
+ return false;
49749
+ }
49750
+ return 'setPlaybackRate' in this.core.activePlayback;
49711
49751
  }
49712
49752
  /**
49713
49753
  * @internal
49714
49754
  */
49715
49755
  render() {
49716
- const container = this.core.activeContainer;
49717
- if (this.core.getPlaybackType() === Playback.LIVE && !container.isDvrEnabled()) {
49756
+ trace(`${T$6} render`, {
49757
+ rendered: this.rendered,
49758
+ shouldRender: this.shouldRender(),
49759
+ });
49760
+ if (!this.shouldRender()) {
49718
49761
  return this;
49719
49762
  }
49720
- const cfg = this.core.options.playbackRateConfig || {};
49721
- if (!this.playbackRates) {
49722
- this.playbackRates = cfg.options || DEFAULT_PLAYBACK_RATES;
49723
- }
49724
- if (!this.selectedRate) {
49725
- this.selectedRate = cfg.defaultValue || DEFAULT_PLAYBACK_RATE;
49726
- }
49727
- if (this.shouldRender()) {
49728
- const button = PlaybackRate.buttonTemplate({
49729
- title: this.getTitle(),
49730
- speedIcon,
49731
- arrowRightIcon,
49732
- });
49733
- this.$el.html(button);
49734
- // if (this.core.getPlaybackType() === Playback.LIVE) {
49735
- // this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
49736
- // }
49737
- // this.core.mediaControl.$playbackRate.append(this.el);
49738
- this.core.mediaControl.$el?.find('.gear-options-list [data-rate]').html(this.el);
49739
- // this.updateText();
49763
+ if (this.rendered) {
49764
+ return this;
49740
49765
  }
49766
+ const button = PlaybackRate.buttonTemplate({
49767
+ title: this.getTitle(),
49768
+ speedIcon,
49769
+ arrowRightIcon,
49770
+ });
49771
+ this.$el.html(button);
49772
+ this.core.getPlugin('bottom_gear')?.getElement('rate')?.html(this.el);
49773
+ this.rendered = true;
49741
49774
  return this;
49742
49775
  }
49743
49776
  onStartAd() {
49744
49777
  this.prevSelectedRate = this.selectedRate;
49745
- this.setSelectedRate('1.0');
49746
- this.listenToOnce(this.currentPlayback, Events$1.PLAYBACK_PLAY, this.onFinishAd);
49778
+ this.resetPlaybackRate();
49779
+ this.listenToOnce(this.core.activePlayback, Events$1.PLAYBACK_PLAY, this.onFinishAd);
49747
49780
  }
49748
49781
  onFinishAd() {
49749
49782
  if (this.prevSelectedRate) {
@@ -49751,16 +49784,16 @@ class PlaybackRate extends UICorePlugin {
49751
49784
  }
49752
49785
  }
49753
49786
  onPlay() {
49754
- if (!this.core.mediaControl.$el.hasClass('dvr')) {
49755
- if (this.core.getPlaybackType() === Playback.LIVE) {
49756
- this.updatePlaybackRate(DEFAULT_PLAYBACK_RATE);
49757
- this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
49758
- }
49787
+ if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
49788
+ this.resetPlaybackRate();
49759
49789
  }
49760
49790
  else {
49761
49791
  this.setSelectedRate(this.selectedRate);
49762
49792
  }
49763
49793
  }
49794
+ resetPlaybackRate() {
49795
+ this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
49796
+ }
49764
49797
  onStop() {
49765
49798
  }
49766
49799
  onRateSelect(event) {
@@ -49778,30 +49811,21 @@ class PlaybackRate extends UICorePlugin {
49778
49811
  arrowLeftIcon,
49779
49812
  checkIcon,
49780
49813
  }));
49781
- this.core.mediaControl.$el?.find('.gear-wrapper').html(this.el);
49814
+ this.core.getPlugin('bottom_gear')?.setContent(this.el);
49782
49815
  this.highlightCurrentRate();
49783
49816
  }
49784
49817
  goBack() {
49785
- this.core.trigger('gear:refresh');
49786
- }
49787
- updatePlaybackRate(rate) {
49788
- this.setSelectedRate(rate);
49818
+ setTimeout(() => {
49819
+ this.core.getPlugin('bottom_gear').refresh();
49820
+ }, 0);
49789
49821
  }
49790
49822
  setSelectedRate(rate) {
49791
49823
  // Set <video playbackRate="..."
49792
- this.core.$el.find('video,audio').get(0).playbackRate = rate;
49824
+ this.core.activePlayback?.setPlaybackRate(rate);
49793
49825
  this.selectedRate = rate;
49794
- // TODO
49795
- // Player.player.trigger('playbackRateChanged', rate);
49796
49826
  }
49797
49827
  getTitle() {
49798
- let title = this.selectedRate;
49799
- this.playbackRates.forEach((r) => {
49800
- if (r.value === this.selectedRate) {
49801
- title = r.label;
49802
- }
49803
- });
49804
- return title;
49828
+ return this.playbackRates.find((r) => r.value === this.selectedRate)?.label || this.selectedRate;
49805
49829
  }
49806
49830
  highlightCurrentRate() {
49807
49831
  this.allRateElements().removeClass('current');
@@ -52044,4 +52068,4 @@ class VolumeFade extends UICorePlugin {
52044
52068
  }
52045
52069
  }
52046
52070
 
52047
- export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ContextMenu, DvrControls, ErrorScreen, Favicon, GearEvents, GoogleAnalytics, Kibo, LevelSelector, LogTracer, Logger, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };
52071
+ export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ContextMenu, DvrControls, ErrorScreen, Favicon, GoogleAnalytics, Kibo, LevelSelector, LogTracer, Logger, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };