@gcorevideo/player 2.28.16 → 2.28.17

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.
@@ -49802,7 +49802,7 @@ const AUTO = -1;
49802
49802
  const DEFAULT_RECOVER_ATTEMPTS = 16;
49803
49803
  Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
49804
49804
  Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
49805
- const T$7 = 'playback.hls';
49805
+ const T$8 = 'playback.hls';
49806
49806
  class HlsPlayback extends BasePlayback {
49807
49807
  _ccIsSetup = false;
49808
49808
  _ccTracksUpdated = false;
@@ -50126,7 +50126,7 @@ class HlsPlayback extends BasePlayback {
50126
50126
  }
50127
50127
  else {
50128
50128
  Log.error('hlsjs: failed to recover', { evt, data });
50129
- trace(`${T$7} _recover failed to recover`, {
50129
+ trace(`${T$8} _recover failed to recover`, {
50130
50130
  type: data.type,
50131
50131
  details: data.details,
50132
50132
  });
@@ -50212,7 +50212,7 @@ class HlsPlayback extends BasePlayback {
50212
50212
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
50213
50213
  }
50214
50214
  _onHLSJSError(evt, data) {
50215
- trace(`${T$7} _onHLSJSError`, {
50215
+ trace(`${T$8} _onHLSJSError`, {
50216
50216
  fatal: data.fatal,
50217
50217
  type: data.type,
50218
50218
  details: data.details,
@@ -50260,7 +50260,7 @@ class HlsPlayback extends BasePlayback {
50260
50260
  evt,
50261
50261
  data,
50262
50262
  });
50263
- trace(`${T$7} _onHLSJSError trying to recover from network error`, {
50263
+ trace(`${T$8} _onHLSJSError trying to recover from network error`, {
50264
50264
  details: data.details,
50265
50265
  });
50266
50266
  error.level = PlayerError.Levels.WARN;
@@ -50273,7 +50273,7 @@ class HlsPlayback extends BasePlayback {
50273
50273
  evt,
50274
50274
  data,
50275
50275
  });
50276
- trace(`${T$7} _onHLSJSError trying to recover from media error`, {
50276
+ trace(`${T$8} _onHLSJSError trying to recover from media error`, {
50277
50277
  details: data.details,
50278
50278
  });
50279
50279
  error.level = PlayerError.Levels.WARN;
@@ -50303,7 +50303,7 @@ class HlsPlayback extends BasePlayback {
50303
50303
  return;
50304
50304
  }
50305
50305
  Log.warn('hlsjs: non-fatal error occurred', { evt, data });
50306
- trace(`${T$7} _onHLSJSError non-fatal error occurred`, {
50306
+ trace(`${T$8} _onHLSJSError non-fatal error occurred`, {
50307
50307
  type: data.type,
50308
50308
  details: data.details,
50309
50309
  });
@@ -50780,7 +50780,7 @@ function registerPlaybacks() {
50780
50780
  Loader.registerPlayback(DashPlayback);
50781
50781
  }
50782
50782
 
50783
- const T$6 = 'gplayer';
50783
+ const T$7 = 'gplayer';
50784
50784
  const DEFAULT_OPTIONS = {
50785
50785
  autoPlay: false,
50786
50786
  debug: 'none',
@@ -51130,7 +51130,7 @@ class Player {
51130
51130
  // TODO test
51131
51131
  events = {
51132
51132
  onReady: () => {
51133
- trace(`${T$6} onReady`, {
51133
+ trace(`${T$7} onReady`, {
51134
51134
  ready: this.ready,
51135
51135
  });
51136
51136
  if (this.ready) {
@@ -51562,7 +51562,7 @@ const INITIAL_SETTINGS = {
51562
51562
  default: [],
51563
51563
  seekEnabled: false,
51564
51564
  };
51565
- const T$5 = 'plugins.media_control';
51565
+ const T$6 = 'plugins.media_control';
51566
51566
  /**
51567
51567
  * Extended events for the {@link MediaControl} plugin
51568
51568
  * @public
@@ -51798,8 +51798,8 @@ class MediaControl extends UICorePlugin {
51798
51798
  this.listenTo(this.core, Events$1.CORE_FULLSCREEN, this.show);
51799
51799
  this.listenTo(this.core, Events$1.CORE_OPTIONS_CHANGE, this.configure);
51800
51800
  this.listenTo(this.core, Events$1.CORE_RESIZE, this.playerResize);
51801
- this.listenTo(this.core, 'core:advertisement:start', this.onStartAd);
51802
- this.listenTo(this.core, 'core:advertisement:finish', this.onFinishAd);
51801
+ // this.listenTo(this.core, 'core:advertisement:start', this.onStartAd)
51802
+ // this.listenTo(this.core, 'core:advertisement:finish', this.onFinishAd)
51803
51803
  // const has360 = this.core?.getPlugin('video_360');
51804
51804
  // if (Browser.isiOS && has360) {
51805
51805
  // this.container?.el.addEventListener('click', e => {
@@ -51825,6 +51825,10 @@ class MediaControl extends UICorePlugin {
51825
51825
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PAUSE, this.changeTogglePlay);
51826
51826
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_STOP, this.changeTogglePlay);
51827
51827
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_DBLCLICK, this.toggleFullscreen);
51828
+ const clk = clickaway(() => {
51829
+ this.resetUserKeepVisible();
51830
+ }, this.core.activeContainer.$el[0]);
51831
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_CLICK, clk);
51828
51832
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
51829
51833
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PROGRESS, this.updateProgressBar);
51830
51834
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_SETTINGSUPDATE, this.updateSettings);
@@ -51849,12 +51853,16 @@ class MediaControl extends UICorePlugin {
51849
51853
  this.userDisabled = true; // TODO distinguish between user and system (e.g., unplayable) disabled?
51850
51854
  this.hide();
51851
51855
  this.unbindKeyEvents();
51852
- this.$el.hide(); // TODO why?
51856
+ this.$el.hide();
51853
51857
  }
51854
51858
  /**
51855
51859
  * Reenables the plugin disabled earlier with the {@link MediaControl.disable} method
51856
51860
  */
51857
51861
  enable() {
51862
+ trace(`${T$6} enable`, {
51863
+ chromeless: this.options.chromeless,
51864
+ userDisabled: this.userDisabled,
51865
+ });
51858
51866
  if (this.options.chromeless) {
51859
51867
  return;
51860
51868
  }
@@ -52008,7 +52016,7 @@ class MediaControl extends UICorePlugin {
52008
52016
  this.$el.removeClass('w370');
52009
52017
  this.$el.removeClass('w270');
52010
52018
  this.verticalVolume = false;
52011
- trace(`${T$5} playerResize`, {
52019
+ trace(`${T$6} playerResize`, {
52012
52020
  width: this.container.$el.width(),
52013
52021
  height: this.container.$el.height(),
52014
52022
  hideVolumeBar: this.options.hideVolumeBar});
@@ -52186,7 +52194,7 @@ class MediaControl extends UICorePlugin {
52186
52194
  else {
52187
52195
  this.hideVolumeId = setTimeout(() => {
52188
52196
  this.hideVolumeId = null;
52189
- trace(`${T$5} hideVolumeBar`, {
52197
+ trace(`${T$6} hideVolumeBar`, {
52190
52198
  volumeBarContainer: !!this.$volumeBarContainer,
52191
52199
  });
52192
52200
  this.$volumeBarContainer?.addClass('volume-bar-hide');
@@ -52258,15 +52266,24 @@ class MediaControl extends UICorePlugin {
52258
52266
  this.setSeekPercentage(pos);
52259
52267
  }
52260
52268
  setUserKeepVisible() {
52269
+ trace(`${T$6} setUserKeepVisible`, {
52270
+ userKeepVisible: this.userKeepVisible,
52271
+ });
52261
52272
  this.userKeepVisible = true;
52262
52273
  }
52263
52274
  resetUserKeepVisible() {
52275
+ trace(`${T$6} resetUserKeepVisible`, {
52276
+ userKeepVisible: this.userKeepVisible,
52277
+ });
52264
52278
  this.userKeepVisible = false;
52265
52279
  }
52266
52280
  isVisible() {
52267
52281
  return !this.$el.hasClass('media-control-hide');
52268
52282
  }
52269
52283
  show(event) {
52284
+ trace(`${T$6} show`, {
52285
+ disabled: this.disabled,
52286
+ disableControlPanel: this.options.disableControlPanel});
52270
52287
  if (this.disabled || this.options.disableControlPanel) {
52271
52288
  return;
52272
52289
  }
@@ -52293,7 +52310,7 @@ class MediaControl extends UICorePlugin {
52293
52310
  this.updateCursorStyle(showing);
52294
52311
  }
52295
52312
  hide(delay = 0) {
52296
- trace(`${T$5} hide`, {
52313
+ trace(`${T$6} hide`, {
52297
52314
  visible: this.isVisible(),
52298
52315
  disabled: this.disabled,
52299
52316
  hideMediaControl: this.options.hideMediaControl,
@@ -52704,23 +52721,6 @@ class MediaControl extends UICorePlugin {
52704
52721
  }
52705
52722
  this.resetUserKeepVisible();
52706
52723
  }
52707
- // TODO manage by the ads plugin
52708
- onStartAd() {
52709
- // this.advertisementPlaying = true
52710
- this.disable();
52711
- }
52712
- // TODO manage by the ads plugin
52713
- onFinishAd() {
52714
- // this.advertisementPlaying = false
52715
- this.enable();
52716
- }
52717
- // TODO remove
52718
- hideControllAds() {
52719
- if (this.container.advertisement &&
52720
- this.container.advertisement.type !== 'idle') {
52721
- this.hide();
52722
- }
52723
- }
52724
52724
  static getPageX(event) {
52725
52725
  return getPageX(event);
52726
52726
  }
@@ -52804,6 +52804,17 @@ function mergeElements(a, b) {
52804
52804
  return acc;
52805
52805
  }, a);
52806
52806
  }
52807
+ function clickaway(callback, element) {
52808
+ const handler = (event) => {
52809
+ if (!element.contains(event.target)) {
52810
+ callback();
52811
+ window.removeEventListener('click', handler);
52812
+ }
52813
+ };
52814
+ return () => {
52815
+ window.addEventListener('click', handler);
52816
+ };
52817
+ }
52807
52818
 
52808
52819
  const VERSION$6 = '2.22.4';
52809
52820
  // const T = 'plugins.audiotracks'
@@ -53002,7 +53013,7 @@ const templateHtml$2 = "<div class=\"big-mute-icon-wrapper\" data-big-mute id=\"
53002
53013
 
53003
53014
  insertStyle(".big-mute-icon-wrapper[data-big-mute] {\n position: absolute;\n z-index: 9998;\n background-color: transparent;\n display: flex;\n justify-content: center;\n width: 100%;\n height: calc(100% - 50px);\n margin: 0 auto;\n opacity: 0.75;\n transition: opacity 0.1s ease;\n pointer-events: auto;\n}\n.big-mute-icon-wrapper[data-big-mute].hide {\n display: none;\n}\n.big-mute-icon-wrapper[data-big-mute]:hover {\n cursor: pointer;\n}\n\n.big-mute-icon[data-big-mute-icon] {\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: center;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n background: rgba(240, 243, 247, 0.9411764706);\n z-index: 10000;\n}\n.big-mute-icon[data-big-mute-icon] svg {\n margin-left: 5px;\n width: 80px;\n height: 80px;\n}\n.big-mute-icon[data-big-mute-icon] svg path {\n fill: #1f1e1e !important;\n}\n.big-mute-icon[data-big-mute-icon]:hover {\n background: rgba(240, 243, 247, 0.8784313725);\n}\n.big-mute-icon[data-big-mute-icon]:hover svg path {\n fill: #151515 !important;\n}");
53004
53015
 
53005
- const T$4 = 'plugins.big_mute_button';
53016
+ const T$5 = 'plugins.big_mute_button';
53006
53017
  // TODO rewrite as a container plugin
53007
53018
  /**
53008
53019
  * `PLUGIN` that displays a big mute button over the video when it's being played muted.
@@ -53065,7 +53076,7 @@ class BigMuteButton extends UICorePlugin {
53065
53076
  if (autoPlay) {
53066
53077
  this.autoPlay = true;
53067
53078
  }
53068
- trace(`${T$4} onPlay`, {
53079
+ trace(`${T$5} onPlay`, {
53069
53080
  autoPlay: this.autoPlay});
53070
53081
  if (this.autoPlay && !wasMuted && volume === 0) {
53071
53082
  this.mount();
@@ -55623,11 +55634,13 @@ const initSpeedTest = (customMetrics) => {
55623
55634
  }
55624
55635
  }
55625
55636
  };
55626
- // getElementById('dlText').textContent = DEFAULT_DOWNLOAD_SPEED;
55627
- await fetch('https://iam.gcdn.co/info/json')
55637
+ const myinfoUrl = 'https://gcore.com/.well-known/cdn-debug/json';
55638
+ // await fetch('https://iam.gcdn.co/info/json')
55639
+ await fetch(myinfoUrl)
55628
55640
  .then(r => r.json())
55629
55641
  .then(data => {
55630
- const country = data['Server Country code'].toLowerCase();
55642
+ // const country = data['Server Country code'].toLowerCase();
55643
+ const country = getCountryCodeFromClientHeaders(data.client_headers);
55631
55644
  const server = serversList.find(s => s.country === country) || serversList[0];
55632
55645
  if (!server) {
55633
55646
  throw new Error('Failed to select a server');
@@ -55673,6 +55686,15 @@ function rankConnectionSpeed(dlSpeed) {
55673
55686
  }
55674
55687
  return 0;
55675
55688
  }
55689
+ function getCountryCodeFromClientHeaders(clientHeaders) {
55690
+ if (clientHeaders && clientHeaders['country']) {
55691
+ const m = clientHeaders['country'].match(/'code':\s*'([A-Za-z]{2})'/);
55692
+ if (m) {
55693
+ return m[1].toLowerCase();
55694
+ }
55695
+ }
55696
+ return 'lu';
55697
+ }
55676
55698
 
55677
55699
  insertStyle(":root {\n --primary-background-color: #000;\n --secondary-background-color: #262626;\n --primary-text-color: #fff;\n --secondary-text-color: #fff4f2;\n --hover-text-color: #f9b090;\n --speedtest-red: #df564d;\n --speedtest-orange: #df934d;\n --speedtest-yellow: #dfd04d;\n --speedtest-light-green: #c2df4d;\n --speedtest-green: #73df4d;\n}\n\n.clappr-nerd-stats {\n cursor: default;\n}\n.clappr-nerd-stats .stats-box {\n position: absolute;\n display: inline-block;\n bottom: 52px;\n right: 0;\n top: 0;\n left: 0;\n bottom: 0;\n padding: 0 10px 12px;\n margin: 0;\n line-height: 20px;\n font-size: 12px;\n font-weight: 500;\n background: var(--primary-background-color);\n color: #fff;\n z-index: 20000;\n overflow: auto;\n max-width: 100%;\n}\n.clappr-nerd-stats .stats-box-top {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n width: 100%;\n height: 32px;\n background: var(--primary-background-color);\n}\n.clappr-nerd-stats .stats-box-top .close-button {\n position: absolute;\n right: 12px;\n top: 10px;\n display: block;\n width: 12px;\n height: 12px;\n}\n.clappr-nerd-stats .stats-box-top .close-button svg path {\n fill: var(--primary-text-color);\n}\n.clappr-nerd-stats .stats-box-top .close-button:hover svg path {\n fill: var(--hover-text-color);\n}\n.clappr-nerd-stats .stats-box-main {\n overflow: hidden;\n margin-top: 44px;\n display: flex;\n flex-wrap: wrap;\n}\n.clappr-nerd-stats .stats-box-main ul {\n flex: 0 1 1fr;\n min-width: 200px;\n}\n.clappr-nerd-stats .stats-box.wide {\n width: 820px;\n}\n.clappr-nerd-stats .stats-box ul, .clappr-nerd-stats .stats-box li {\n list-style-type: none;\n}\n.clappr-nerd-stats .stats-box ul div, .clappr-nerd-stats .stats-box li div {\n padding-left: 2px;\n padding-right: 2px;\n background: var(--primary-background-color);\n gap: 10px;\n}\n.clappr-nerd-stats .stats-box ul {\n padding: 5px;\n width: 200px;\n flex: 0 1 50%;\n}\n.clappr-nerd-stats .stats-box ul li {\n position: relative;\n padding: 0 5px;\n text-align: left;\n}\n.clappr-nerd-stats .stats-box ul li.canvas-wrapper {\n padding: 0;\n}\n.clappr-nerd-stats .stats-box ul li.canvas-wrapper canvas {\n width: 100%;\n}\n.clappr-nerd-stats .stats-box ul li:nth-child(2n) {\n background: var(--secondary-background-color);\n}\n.clappr-nerd-stats .stats-box ul li:nth-child(2n) div {\n background: var(--secondary-background-color);\n}\n.clappr-nerd-stats .stats-box ul li.title {\n text-align: center;\n font-weight: bold;\n padding-bottom: 4px;\n font-size: 14px;\n}\n.clappr-nerd-stats .stats-box ul li div {\n margin: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.desktop .clappr-nerd-stats .stats-box.narrow {\n width: 250px;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow ul {\n width: 100%;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-summary {\n padding: 0 5px;\n height: auto;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-summary-block {\n width: 100%;\n flex-direction: column;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-summary-block .speedtest-summary-subblock {\n width: 100%;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-summary-block .speedtest-summary-subblock-content {\n width: 100%;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-summary-header {\n padding-top: 12px;\n height: 38px;\n text-align: center;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-quality-header {\n text-align: center;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-footer {\n height: 80px;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-footer-about-link {\n bottom: 0;\n left: 0;\n}\n.desktop .clappr-nerd-stats .stats-box.narrow .speedtest-footer .speedtest-footer-refresh {\n inset: 50% auto auto 50%;\n transform: translate(-50%, -50%);\n}\n\n.speed-test-button {\n margin: 10px 0 0;\n color: #000;\n}\n\n.speed-test {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 9999;\n}\n.speed-test .speed-test-header {\n width: 100%;\n height: 32px;\n}\n.speed-test .speed-test-header .close-speed-test {\n float: right;\n margin-right: 5px;\n line-height: 32px;\n cursor: pointer;\n color: var(--primary-text-color);\n}\n.speed-test .speed-test-header .close-speed-test:hover {\n color: var(--hover-text-color);\n}\n\n.settings-button {\n float: right;\n margin: 0 12px 0 0;\n height: 40px;\n width: 24px;\n border: none;\n padding: 0;\n}\n\n.speedtest-summary {\n width: 100%;\n border-top: 1px solid var(--secondary-background-color) !important;\n border-bottom: 1px solid var(--secondary-background-color) !important;\n display: flex !important;\n flex-direction: column;\n align-items: stretch;\n justify-content: space-between;\n}\n.speedtest-summary .speedtest-summary-header {\n width: 100%;\n padding-top: 4px;\n text-align: left;\n height: 32px;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n.speedtest-summary .speedtest-summary-block {\n position: relative;\n display: flex;\n flex-direction: row;\n width: 100%;\n}\n.speedtest-summary .speedtest-summary-block .speedtest-summary-subblock {\n width: 50%;\n margin-top: 4px;\n margin-bottom: 12px;\n}\n.speedtest-summary .speedtest-summary-block .speedtest-summary-subblock-content {\n padding: 2px;\n width: 248px;\n max-width: 100%;\n}\n\n.speedtest-quality {\n width: 100%;\n height: 36px;\n display: flex !important;\n flex-direction: column !important;\n justify-content: space-between !important;\n}\n.speedtest-quality .speedtest-quality-header {\n font-size: 12px;\n height: 20px;\n border-left: 2px solid var(--secondary-background-color) !important;\n background-color: var(--secondary-background-color);\n text-align: left;\n}\n.speedtest-quality-content {\n width: 100%;\n margin-top: 8px;\n height: 8px;\n display: flex !important;\n flex-direction: row !important;\n align-items: stretch !important;\n justify-content: space-between;\n}\n.speedtest-quality-content-item {\n width: 18.8%;\n background-color: #fff;\n}\n.speedtest-quality-content-item.speedtest-quality-value-1 {\n background-color: var(--speedtest-red);\n}\n.speedtest-quality-content-item.speedtest-quality-value-2 {\n background-color: var(--speedtest-orange);\n}\n.speedtest-quality-content-item.speedtest-quality-value-3 {\n background-color: var(--speedtest-yellow);\n}\n.speedtest-quality-content-item.speedtest-quality-value-4 {\n background-color: var(--speedtest-light-green);\n}\n.speedtest-quality-content-item.speedtest-quality-value-5 {\n background-color: var(--speedtest-green);\n}\n\n.speedtest-footer {\n position: relative;\n float: left;\n width: 100%;\n height: 30px;\n line-height: 16px;\n}\n.speedtest-footer-about-link {\n position: absolute;\n bottom: 0;\n left: 0;\n color: var(--secondary-text-color);\n text-decoration: underline !important;\n}\n.speedtest-footer-about-link:hover {\n color: var(--hover-text-color);\n}\n.speedtest-footer .speedtest-footer-refresh {\n position: absolute;\n bottom: 0;\n right: 0;\n color: var(--secondary-text-color);\n font-size: 14px;\n font-weight: 400;\n line-height: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.speedtest-footer .speedtest-footer-refresh svg path {\n fill: var(--secondary-text-color);\n}\n.speedtest-footer .speedtest-footer-refresh:hover {\n color: var(--hover-text-color);\n}\n.speedtest-footer .speedtest-footer-refresh:hover svg path {\n fill: var(--hover-text-color);\n}\n\n.mobile .clappr-nerd-stats .stats-box {\n position: fixed;\n height: auto;\n width: auto;\n inset: 0;\n min-width: 100vw;\n padding-bottom: 4px;\n padding-left: 4px;\n padding-right: 4px;\n}\n.mobile .clappr-nerd-stats .stats-box-top {\n position: fixed;\n}\n.mobile .clappr-nerd-stats .stats-box-main ul {\n flex: 0 1 50%;\n}\n\n@media only screen and (orientation: portrait) {\n .mobile .speedtest-summary {\n padding: 0 5px;\n height: auto;\n }\n .mobile .speedtest-summary-block {\n width: 100%;\n flex-direction: column;\n }\n .mobile .speedtest-summary-block .speedtest-summary-subblock {\n width: 100%;\n }\n .mobile .speedtest-summary-block .speedtest-summary-subblock-content {\n width: 100%;\n }\n .mobile .speedtest-summary-header {\n padding-top: 12px;\n height: 38px;\n text-align: center;\n }\n .mobile .speedtest-quality-header {\n text-align: center;\n }\n .mobile .speedtest-footer .speedtest-footer-refresh {\n inset: 50% auto auto 50%;\n transform: translate(-50%, -50%);\n }\n}\n@media only screen and (orientation: landscape) {\n .mobile .clappr-nerd-stats .stats-box-main ul {\n flex-basis: 1fr;\n }\n}\n@media only screen and (min-width: 1100px) {\n .fullscreen .clappr-nerd-stats .stats-box {\n top: unset;\n }\n}");
55678
55700
 
@@ -55754,7 +55776,7 @@ const PLAYBACK_NAMES = {
55754
55776
  hls: 'HLS.js',
55755
55777
  html5_video: 'Native',
55756
55778
  };
55757
- // const T = 'plugins.nerd_stats'
55779
+ const T$4 = 'plugins.nerd_stats';
55758
55780
  /**
55759
55781
  * `PLUGIN` that displays useful statistics regarding the playback as well as the network quality estimation.
55760
55782
  * @public
@@ -55891,6 +55913,9 @@ class NerdStats extends UICorePlugin {
55891
55913
  return super.destroy();
55892
55914
  }
55893
55915
  toggle = () => {
55916
+ trace(`${T$4} toggle`, {
55917
+ open: this.open,
55918
+ });
55894
55919
  if (this.open) {
55895
55920
  this.hide();
55896
55921
  }
@@ -55900,7 +55925,7 @@ class NerdStats extends UICorePlugin {
55900
55925
  };
55901
55926
  show() {
55902
55927
  this.$el.show();
55903
- this.statsBoxElem.scrollTop(this.statsBoxElem.scrollTop());
55928
+ this.statsBoxElem.scrollTop(this.statsBoxElem?.scrollTop());
55904
55929
  this.open = true;
55905
55930
  initSpeedTest(this.speedtestMetrics)
55906
55931
  .then(() => {