@gcorevideo/player 2.22.20 → 2.22.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/assets/clappr-nerd-stats/clappr-nerd-stats.ejs +30 -30
  2. package/assets/clappr-nerd-stats/clappr-nerd-stats.scss +21 -14
  3. package/assets/level-selector/button.ejs +1 -1
  4. package/dist/core.js +1 -1
  5. package/dist/index.css +696 -688
  6. package/dist/index.js +271 -247
  7. package/dist/player.d.ts +57 -27
  8. package/dist/plugins/index.css +335 -327
  9. package/dist/plugins/index.js +109 -89
  10. package/docs/api/{player.bitratetrackrecord.md → player.clapprstatsbitratetrack.md} +3 -3
  11. package/docs/api/player.clapprstatsmetrics.md +2 -2
  12. package/docs/api/player.extendedevents.md +45 -0
  13. package/docs/api/player.gearevents.md +1 -1
  14. package/docs/api/player.md +22 -2
  15. package/docs/api/player.mediacontrol.mount.md +0 -5
  16. package/docs/api/player.mediacontrol.putelement.md +5 -0
  17. package/docs/api/player.mediacontrol.toggleelement.md +1 -1
  18. package/docs/api/player.volumefade._constructor_.md +50 -0
  19. package/docs/api/player.volumefade.md +40 -1
  20. package/docs/api/player.volumefadesettings.md +18 -0
  21. package/lib/plugins/clappr-nerd-stats/NerdStats.d.ts +1 -0
  22. package/lib/plugins/clappr-nerd-stats/NerdStats.d.ts.map +1 -1
  23. package/lib/plugins/clappr-nerd-stats/NerdStats.js +13 -3
  24. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.d.ts.map +1 -1
  25. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.js +1 -0
  26. package/lib/plugins/clappr-nerd-stats/speedtest/index.js +1 -1
  27. package/lib/plugins/clappr-nerd-stats/utils.d.ts.map +1 -1
  28. package/lib/plugins/clappr-nerd-stats/utils.js +17 -15
  29. package/lib/plugins/clappr-stats/ClapprStats.d.ts +1 -0
  30. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
  31. package/lib/plugins/clappr-stats/ClapprStats.js +3 -0
  32. package/lib/plugins/click-to-pause/ClickToPause.js +6 -7
  33. package/lib/plugins/media-control/MediaControl.d.ts +3 -0
  34. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  35. package/lib/plugins/media-control/MediaControl.js +6 -1
  36. package/lib/plugins/volume-fade/VolumeFade.d.ts +28 -11
  37. package/lib/plugins/volume-fade/VolumeFade.d.ts.map +1 -1
  38. package/lib/plugins/volume-fade/VolumeFade.js +66 -61
  39. package/package.json +1 -1
  40. package/src/plugins/clappr-nerd-stats/NerdStats.ts +21 -8
  41. package/src/plugins/clappr-nerd-stats/speedtest/Speedtest.ts +1 -0
  42. package/src/plugins/clappr-nerd-stats/speedtest/index.ts +1 -1
  43. package/src/plugins/clappr-nerd-stats/utils.ts +23 -13
  44. package/src/plugins/clappr-stats/ClapprStats.ts +4 -0
  45. package/src/plugins/click-to-pause/ClickToPause.ts +6 -6
  46. package/src/plugins/level-selector/__tests__/__snapshots__/QualityLevels.test.ts.snap +1 -1
  47. package/src/plugins/media-control/MediaControl.ts +6 -1
  48. package/src/plugins/volume-fade/VolumeFade.ts +96 -76
  49. package/temp/player.api.json +132 -34
  50. package/tsconfig.tsbuildinfo +1 -1
@@ -10496,6 +10496,9 @@ class ClapprStats extends ContainerPlugin {
10496
10496
  exportMetrics() {
10497
10497
  return structuredClone(this.metrics);
10498
10498
  }
10499
+ clearMetrics() {
10500
+ this.metrics = newMetrics$1();
10501
+ }
10499
10502
  onBitrate(newBitrate) {
10500
10503
  const bitrate = newBitrate.bitrate;
10501
10504
  const now = this.now();
@@ -12271,6 +12274,7 @@ class Speedtest {
12271
12274
  }
12272
12275
  addTestPoint(server) {
12273
12276
  this._checkServerDefinition(server);
12277
+ console.log('Speedtest addTestPoint %o', server);
12274
12278
  if (this._state === 0) {
12275
12279
  this._state = 1;
12276
12280
  }
@@ -12567,7 +12571,7 @@ const getColor = (speedValue) => {
12567
12571
  }
12568
12572
  };
12569
12573
  function drawSpeedTestResults() {
12570
- const canvas = document.getElementById('speedTestCanvas');
12574
+ const canvas = document.getElementById('nerd-stats-speed-test-canvas');
12571
12575
  if (!canvas) {
12572
12576
  return;
12573
12577
  }
@@ -12690,7 +12694,7 @@ function rankConnectionSpeed(dlSpeed) {
12690
12694
  return 0;
12691
12695
  }
12692
12696
 
12693
- const pluginHtml$4 = "<% general = metrics.general %>\n<% counters = metrics.counters %>\n<% timers = metrics.chrono %>\n<% extra = metrics.extra %>\n<% custom = metrics.custom %>\n\n<div class=\"stats-box\" id=\"nerd-stats-box\">\n <div class=\"stats-box-top\">\n <a class=\"close-button gplayer-lite-btn\" id=\"nerd-stats-close\">\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><%= i18n.t('stats.general') %></span></li>\n <li>\n <%= i18n.t('stats.display_resolution') %>\n <div><span><span id=\"nerd-stats-resolution-width\"><%= general.resolution.width %></span>&times;<span id=\"nerd-stats-resolution-height\"><%= general.resolution.height %></span></span></div>\n </li>\n <li>\n <%= i18n.t('stats.volume') %>\n <div id=\"nerd-stats-volume\"><span><%= general.volume %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.connection_speed') %>\n <div><span id=\"dlText\"><%= custom.connectionSpeed %></span> <%= i18n.t('mbps') %></div>\n </li>\n <li class=\"canvas-wrapper\">\n <canvas id=\"speedTestCanvas\" width=\"190\" height=\"20\"></canvas>\n </li>\n <li>\n <%= i18n.t('stats.ping') %>\n <div><span id=\"pingText\"><%= custom.ping %></span> <%= i18n.t('ms') %></div>\n </li>\n <li>\n <%= i18n.t('stats.jitter') %>\n <div><span id=\"jitterText\"><%= custom.jitter %></span> <%= i18n.t('ms') %></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span><%= i18n.t('stats.counters') %></span></li>\n <li>\n <%= i18n.t('stats.plays') %>\n <div><span id=\"nerd-stats-plays\"><%= counters.play %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.pauses') %>\n <div><span id=\"nerd-stats-pauses\"><%= counters.pause %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.errors') %>\n <div><span id=\"nerd-stats-errors\"><%= counters.error %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bufferings') %>\n <div><span id=\"nerd-stats-bufferings\"><%= counters.buffering %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.decoded_frames') %>\n <div><span id=\"nerd-stats-decoded-frames\"><%= counters.decodedFrames %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.dropped_frames') %>\n <div><span id=\"nerd-stats-dropped-frames\"><%= counters.droppedFrames %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.fps') %>\n <div><span id=\"nerd-stats-fps\"><%= counters.fps %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bitrate_changes') %>\n <div><span id=\"nerd-stats-bitrate-changes\"><%= counters.changeLevel %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.seeks') %>\n <div><span id=\"nerd-stats-seeks\"><%= counters.seek %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.fullscreen') %>\n <div><span id=\"nerd-stats-fullscreen\"><%= counters.fullscreen %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.dvr_seeks') %>\n <div><span id=\"nerd-stats-dvr-usage\"><%= counters.dvrUsage %></span></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span><%= i18n.t('stats.duration') %></span></li>\n <li>\n <%= i18n.t('stats.startup') %>\n <div><span id=\"nerd-stats-startup-time\"><%= timers.startup %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.watching') %>\n <div><span id=\"nerd-stats-watch-time\"><%= timers.watch %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.paused') %>\n <div><span id=\"nerd-stats-pause-time\"><%= timers.pause %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.buffering') %>\n <div><span id=\"nerd-stats-buffering-time\"><%= timers.buffering %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.session') %>\n <div><span id=\"nerd-stats-session-time\"><%= timers.session %></span></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span><%= i18n.t('stats.extra') %></span></li>\n <li>\n <%= i18n.t('stats.playback') %>\n <div><span id=\"nerd-stats-playback-name\"><%= extra.playbackName %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.playback_type') %>\n <div><span id=\"nerd-stats-playback-type\"><%= extra.playbackType %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.buffer_size') %>\n <div><span id=\"nerd-stats-buffer-size\"><%= extra.buffersize %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.video_duration') %>\n <div><span id=\"nerd-stats-video-duration\"><%= extra.duration %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.current_time') %>\n <div><span id=\"nerd-stats-current-time\"><%= extra.currentTime %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bitrate_weighted_mean') %>\n <div><span id=\"nerd-stats-bitrate-weighted-mean\"><%= extra.bitrateWeightedMean %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bitrate_most_used') %>\n <div><span id=\"nerd-stats-bitrate-most-used\"><%= extra.bitrateMostUsed %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.watched_percentage') %>\n <div><span id=\"nerd-stats-watched-percentage\"><%= extra.watchedPercentage %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.buffering_percentage') %>\n <div><span id=\"nerd-stats-buffering-percentage\"><%= extra.bufferingPercentage %></span></div>\n </li>\n </ul>\n </div>\n <div class=\"speedtest-summary\">\n <div class=\"speedtest-summary-header\"><%= i18n.t('stats.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\"><%= i18n.t('vod') %>: \n <span id=\"nerd-stats-quality-vod-text\"><%= custom.vodQuality %></span></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"vod\" id=\"nerd-stats-quality-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\"><%= i18n.t('live') %>: \n <span id=\"nerd-stats-quality-live-text\"><%= custom.liveQuality %></span></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"live\" id=\"nerd-stats-quality-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\" type=\"button\" id=\"nerd-stats-refresh\">\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 <%= i18n.t('stats.refresh') %>\n </button>\n </div>\n</div>\n";
12697
+ const pluginHtml$4 = "<% general = metrics.general %>\n<% counters = metrics.counters %>\n<% timers = metrics.chrono %>\n<% extra = metrics.extra %>\n<% custom = metrics.custom %>\n\n<div class=\"stats-box\" id=\"nerd-stats-box\">\n <div class=\"stats-box-top\">\n <a class=\"close-button gplayer-lite-btn\" id=\"nerd-stats-close\">\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><%= i18n.t('stats.general') %></span></li>\n <li>\n <%= i18n.t('stats.display_resolution') %>\n <div><span><span id=\"nerd-stats-resolution-width\"><%= general.resolution.width %></span>&times;<span id=\"nerd-stats-resolution-height\"><%= general.resolution.height %></span></span></div>\n </li>\n <li>\n <%= i18n.t('stats.volume') %>\n <div id=\"nerd-stats-volume\"><span><%= general.volume %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.connection_speed') %>\n <div><span id=\"nerd-stats-dl-text\"><%= custom.connectionSpeed %></span> <%= i18n.t('mbps') %></div>\n </li>\n <li class=\"canvas-wrapper\">\n <canvas id=\"nerd-stats-speed-test-canvas\" width=\"190\" height=\"20\"></canvas>\n </li>\n <li>\n <%= i18n.t('stats.ping') %>\n <div><span id=\"nerd-stats-ping-text\"><%= custom.ping %></span> <%= i18n.t('ms') %></div>\n </li>\n <li>\n <%= i18n.t('stats.jitter') %>\n <div><span id=\"nerd-stats-jitter-text\"><%= custom.jitter %></span> <%= i18n.t('ms') %></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span><%= i18n.t('stats.duration') %></span></li>\n <li>\n <%= i18n.t('stats.startup') %>\n <div><span id=\"nerd-stats-startup-time\"><%= timers.startup %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.watching') %>\n <div><span id=\"nerd-stats-watch-time\"><%= timers.watch %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.paused') %>\n <div><span id=\"nerd-stats-pause-time\"><%= timers.pause %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.buffering') %>\n <div><span id=\"nerd-stats-buffering-time\"><%= timers.buffering %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.session') %>\n <div><span id=\"nerd-stats-session-time\"><%= timers.session %></span></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span><%= i18n.t('stats.counters') %></span></li>\n <li>\n <%= i18n.t('stats.plays') %>\n <div><span id=\"nerd-stats-plays\"><%= counters.play %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.pauses') %>\n <div><span id=\"nerd-stats-pauses\"><%= counters.pause %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.errors') %>\n <div><span id=\"nerd-stats-errors\"><%= counters.error %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bufferings') %>\n <div><span id=\"nerd-stats-bufferings\"><%= counters.buffering %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.decoded_frames') %>\n <div><span id=\"nerd-stats-decoded-frames\"><%= counters.decodedFrames %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.dropped_frames') %>\n <div><span id=\"nerd-stats-dropped-frames\"><%= counters.droppedFrames %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.fps') %>\n <div><span id=\"nerd-stats-fps\"><%= counters.fps %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bitrate_changes') %>\n <div><span id=\"nerd-stats-bitrate-changes\"><%= counters.changeLevel %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.seeks') %>\n <div><span id=\"nerd-stats-seeks\"><%= counters.seek %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.fullscreen') %>\n <div><span id=\"nerd-stats-fullscreen\"><%= counters.fullscreen %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.dvr_seeks') %>\n <div><span id=\"nerd-stats-dvr-usage\"><%= counters.dvrUsage %></span></div>\n </li>\n </ul>\n\n <ul>\n <li class=\"title\"><span><%= i18n.t('stats.extra') %></span></li>\n <li>\n <%= i18n.t('stats.playback') %>\n <div><span id=\"nerd-stats-playback-name\"><%= extra.playbackName %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.playback_type') %>\n <div><span id=\"nerd-stats-playback-type\"><%= extra.playbackType %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.buffer_size') %>\n <div><span id=\"nerd-stats-buffer-size\"><%= extra.buffersize %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.video_duration') %>\n <div><span id=\"nerd-stats-video-duration\"><%= extra.duration %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.current_time') %>\n <div><span id=\"nerd-stats-current-time\"><%= extra.currentTime %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bitrate_weighted_mean') %>\n <div><span id=\"nerd-stats-bitrate-weighted-mean\"><%= extra.bitrateWeightedMean %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.bitrate_most_used') %>\n <div><span id=\"nerd-stats-bitrate-most-used\"><%= extra.bitrateMostUsed %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.watched_percentage') %>\n <div><span id=\"nerd-stats-watched-percentage\"><%= extra.watchedPercentage %></span></div>\n </li>\n <li>\n <%= i18n.t('stats.buffering_percentage') %>\n <div><span id=\"nerd-stats-buffering-percentage\"><%= extra.bufferingPercentage %></span></div>\n </li>\n </ul>\n </div>\n <div class=\"speedtest-summary\">\n <div class=\"speedtest-summary-header\"><%= i18n.t('stats.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\"><%= i18n.t('vod') %>: \n <span id=\"nerd-stats-quality-vod-text\"><%= custom.vodQuality %></span></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"vod\" id=\"nerd-stats-quality-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\"><%= i18n.t('live') %>: \n <span id=\"nerd-stats-quality-live-text\"><%= custom.liveQuality %></span></div>\n <div class=\"speedtest-quality-content\" data-streaming-type=\"live\" id=\"nerd-stats-quality-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\" type=\"button\" id=\"nerd-stats-refresh\">\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 <%= i18n.t('stats.refresh') %>\n </button>\n </div>\n</div>\n";
12694
12698
 
12695
12699
  const buttonHtml$3 = "<button class='nerd-button gplayer-lite-btn gcore-skin-text-color gear-option' id=\"nerd-stats-button\">\n <span class=\"gear-option_icon\"><%= icon %></span>\n <span class=\"gear-option_label\"><%= i18n.t('statistics') %></span>\n</button>\n";
12696
12700
 
@@ -12704,38 +12708,40 @@ const qualityClasses = [
12704
12708
  'speedtest-quality-value-5',
12705
12709
  ];
12706
12710
  const getDownloadQuality = (speedValue) => {
12711
+ if (!speedValue) {
12712
+ return 0;
12713
+ }
12707
12714
  if (speedValue < 3) {
12708
12715
  return 1;
12709
12716
  }
12710
- else if (speedValue < 7) {
12717
+ if (speedValue < 7) {
12711
12718
  return 2;
12712
12719
  }
12713
- else if (speedValue < 13) {
12720
+ if (speedValue < 13) {
12714
12721
  return 3;
12715
12722
  }
12716
- else if (speedValue < 25) {
12723
+ if (speedValue < 25) {
12717
12724
  return 4;
12718
12725
  }
12719
- else {
12720
- return 5;
12721
- }
12726
+ return 5;
12722
12727
  };
12723
12728
  const getPingQuality = (pingValue) => {
12729
+ if (!pingValue) {
12730
+ return 0;
12731
+ }
12724
12732
  if (pingValue < 20) {
12725
12733
  return 5;
12726
12734
  }
12727
- else if (pingValue < 50) {
12735
+ if (pingValue < 50) {
12728
12736
  return 4;
12729
12737
  }
12730
- else if (pingValue < 100) {
12738
+ if (pingValue < 100) {
12731
12739
  return 3;
12732
12740
  }
12733
- else if (pingValue < 150) {
12741
+ if (pingValue < 150) {
12734
12742
  return 2;
12735
12743
  }
12736
- else {
12737
- return 1;
12738
- }
12744
+ return 1;
12739
12745
  };
12740
12746
  const generateQualityHtml = (quality) => {
12741
12747
  const html = [];
@@ -12752,9 +12758,9 @@ const generateQualityHtml = (quality) => {
12752
12758
  };
12753
12759
  const drawSummary = (customMetrics, vodContainer, liveContainer) => {
12754
12760
  const { connectionSpeed, ping } = customMetrics;
12755
- if (!connectionSpeed || !ping) {
12756
- return;
12757
- }
12761
+ // if (!connectionSpeed || !ping) {
12762
+ // return
12763
+ // }
12758
12764
  const downloadQuality = getDownloadQuality(connectionSpeed);
12759
12765
  const pingQuality = getPingQuality(ping);
12760
12766
  const liveQuality = Math.min(downloadQuality, pingQuality);
@@ -12973,8 +12979,11 @@ class NerdStats extends UICorePlugin {
12973
12979
  }
12974
12980
  updateMetrics(metrics) {
12975
12981
  trace(`${T$c} updateMetrics`, { custom: this.speedtestMetrics });
12976
- Object.assign(this.metrics, metrics);
12977
- this.updateEstimatedQuality();
12982
+ Object.assign(this.metrics, metrics); // TODO no Object.assign
12983
+ this.metrics.custom = {
12984
+ ...this.speedtestMetrics,
12985
+ };
12986
+ this.updateCustomMetrics();
12978
12987
  this.$el
12979
12988
  .find('#nerd-stats-current-time')
12980
12989
  .text(Formatter.formatTime(this.metrics.extra.currentTime));
@@ -13036,11 +13045,16 @@ class NerdStats extends UICorePlugin {
13036
13045
  .text(Formatter.formatFps(this.metrics.counters.fps));
13037
13046
  this.setStatsBoxSize();
13038
13047
  drawSpeedTestResults();
13039
- drawSummary(this.speedtestMetrics, this.$el.find('#nerd-stats-quality-vod'), this.$el.find('#nerd-stats-quality-live'));
13048
+ this.updateEstimatedQuality();
13040
13049
  if (!this.open) {
13041
13050
  this.hide();
13042
13051
  }
13043
13052
  }
13053
+ updateCustomMetrics() {
13054
+ this.$el.find('#nerd-stats-dl-text').text(this.metrics.custom.connectionSpeed.toFixed(2));
13055
+ this.$el.find('#nerd-stats-ping-text').text(this.metrics.custom.ping.toFixed(2));
13056
+ this.$el.find('#nerd-stats-jitter-text').text(this.metrics.custom.jitter.toFixed(2));
13057
+ }
13044
13058
  updateEstimatedQuality() {
13045
13059
  this.estimateQuality();
13046
13060
  this.$el
@@ -13049,6 +13063,7 @@ class NerdStats extends UICorePlugin {
13049
13063
  this.$el
13050
13064
  .find('#nerd-stats-quality-live-text')
13051
13065
  .html(this.metrics.custom.liveQuality);
13066
+ drawSummary(this.speedtestMetrics, this.$el.find('#nerd-stats-quality-vod'), this.$el.find('#nerd-stats-quality-live'));
13052
13067
  }
13053
13068
  setStatsBoxSize() {
13054
13069
  if (this.playerWidth >= this.statsBoxWidthThreshold) {
@@ -13092,6 +13107,7 @@ class NerdStats extends UICorePlugin {
13092
13107
  this.speedtestMetrics.ping = 0;
13093
13108
  this.speedtestMetrics.jitter = 0;
13094
13109
  if (clapprStats) {
13110
+ clapprStats.clearMetrics();
13095
13111
  this.updateMetrics(clapprStats.exportMetrics());
13096
13112
  }
13097
13113
  }
@@ -13171,14 +13187,13 @@ class ClickToPause extends ContainerPlugin {
13171
13187
  const isDvrEnabled = this.container.isDvrEnabled();
13172
13188
  if (isLivePlayback && !isDvrEnabled) {
13173
13189
  this.togglePlay(true);
13190
+ return;
13174
13191
  }
13175
- else if (!isLivePlayback || isDvrEnabled) {
13176
- this.clearTimer();
13177
- this.timer = setTimeout(() => {
13178
- this.timer = null;
13179
- this.togglePlay(false);
13180
- }, 300);
13181
- }
13192
+ this.clearTimer();
13193
+ this.timer = setTimeout(() => {
13194
+ this.timer = null;
13195
+ this.togglePlay(false);
13196
+ }, 300);
13182
13197
  }
13183
13198
  settingsUpdate() {
13184
13199
  const isLivePlayback = this.container.getPlaybackType() === Playback.LIVE;
@@ -14476,6 +14491,10 @@ const LEFT_ORDER = [
14476
14491
  'duration',
14477
14492
  'dvr',
14478
14493
  ];
14494
+ var ExtendedEvents;
14495
+ (function (ExtendedEvents) {
14496
+ ExtendedEvents["MEDIACONTROL_VOLUME"] = "mediacontrol:volume";
14497
+ })(ExtendedEvents || (ExtendedEvents = {}));
14479
14498
  const { Config, Fullscreen, formatTime: formatTime$1, extend, removeArrayItem } = Utils;
14480
14499
  function orderByOrderPattern(arr, order) {
14481
14500
  const arrWithoutDuplicates = [...new Set(arr)];
@@ -14953,14 +14972,15 @@ class MediaControl extends UICorePlugin {
14953
14972
  // if the container is not ready etc
14954
14973
  this.intendedVolume = value;
14955
14974
  this.persistConfig && !isInitialVolume && Config.persist('volume', value);
14956
- // TODO
14957
14975
  const setWhenContainerReady = () => {
14958
14976
  if (this.core.activeContainer && this.core.activeContainer.isReady) {
14959
14977
  this.core.activeContainer.setVolume(value);
14978
+ this.trigger(ExtendedEvents.MEDIACONTROL_VOLUME, value);
14960
14979
  }
14961
14980
  else {
14962
14981
  this.listenToOnce(this.core.activeContainer, Events.CONTAINER_READY, () => {
14963
14982
  this.core.activeContainer.setVolume(value);
14983
+ this.trigger(ExtendedEvents.MEDIACONTROL_VOLUME, value);
14964
14984
  });
14965
14985
  }
14966
14986
  };
@@ -16636,7 +16656,7 @@ class Poster extends UIContainerPlugin {
16636
16656
  }
16637
16657
  }
16638
16658
 
16639
- const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option' aria-haspopup=\"menu\">\n <span class=\"gear-option_icon<%= isHd ? '' : ' hidden' %>\"><%= hdIcon %></span>\n <span class=\"gear-option_label\"><%= i18n.t('quality') %></span>\n <span class='gear-option_value'><%= currentText %></span>\n <span class=\"gear-option_arrow-right-icon\"><%= arrowRightIcon %></span>\n</button>\n";
16659
+ const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option' aria-haspopup=\"menu\" id=\"quality-levels\">\n <span class=\"gear-option_icon<%= isHd ? '' : ' hidden' %>\"><%= hdIcon %></span>\n <span class=\"gear-option_label\"><%= i18n.t('quality') %></span>\n <span class='gear-option_value'><%= currentText %></span>\n <span class=\"gear-option_arrow-right-icon\"><%= arrowRightIcon %></span>\n</button>\n";
16640
16660
 
16641
16661
  const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\" id=\"level-selector-back-button\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n <%= i18n.t('quality') %>\n</button>\n<ul class=\"gear-sub-menu quality-levels\" id=\"level-selector-menu\" role=\"menu\">\n <% if (!removeAuto) { %>\n <li>\n <a href=\"#\"\n class=\"gear-sub-menu_btn gcore-skin-text-color\"\n data-id=\"-1\"\n id=\"level_selector_auto\"\n aria-checked=\"<%= current === -1 %>\"\n role=\"menuitemradio\"\n >\n <span class=\"check-icon\"><%= checkIcon %></span>\n <%= i18n.t('auto') %>\n </a>\n </li>\n <% } %>\n <% for (const item of levels.slice().reverse()) {\n var disabled = maxLevel >= 0 && item.level > maxLevel\n var checked = item.level === current\n %>\n <li class=\"<%= disabled ? ' disabled' : ''%><%=checked ? ' current' : ''%>\">\n <a href=\"#\"\n class=\"gear-sub-menu_btn gcore-skin-text-color<%= checked ? ' gcore-skin-active' : '' %>\"\n data-id=\"<%= item.level %>\"\n aria-disabled=\"<%= disabled %>\"\n aria-checked=\"<%= checked %>\"\n role=\"menuitemradio\"\n id=\"level_selector_<%= item.width > item.height ? item.height : item.width %>\"\n >\n <span class=\"check-icon\"><%= checkIcon %></span>\n <%= labels[item.level] %>\n </a>\n </li>\n <% } %>\n</ul>\n";
16642
16662
 
@@ -18769,98 +18789,98 @@ var VolumeFadeEvents;
18769
18789
  (function (VolumeFadeEvents) {
18770
18790
  VolumeFadeEvents["FADE"] = "core:volume:fade";
18771
18791
  })(VolumeFadeEvents || (VolumeFadeEvents = {}));
18792
+ const DEFAULT_DURATION = 600;
18793
+ const DEFAULT_VOLUME_LEVEL = 80;
18772
18794
  /**
18773
- * `PLUGIN` that applies fade effect to the player's volume change.
18795
+ * `PLUGIN` that mutes the sound and fades it in when the mouse is over the player.
18774
18796
  * @beta
18797
+ *
18798
+ * @remarks
18799
+ * When the user moves the mouse over and away from the player, the sound is unmuted and unmuted with a fade effect.
18800
+ *
18801
+ * Depends on {@link MediaControl} plugin.
18802
+ * Configuration options - {@link VolumeFadeSettings}
18775
18803
  */
18776
18804
  class VolumeFade extends UICorePlugin {
18777
- _aboveBorderVolume = 0;
18778
- container = null;
18779
- delay = 0;
18780
- interval = null;
18805
+ activeVolume = 0;
18806
+ duration = 0;
18807
+ timerId = null;
18781
18808
  /**
18782
18809
  * @internal
18783
18810
  */
18784
18811
  get name() {
18785
18812
  return 'volume_fade';
18786
18813
  }
18814
+ constructor(core) {
18815
+ super(core);
18816
+ if (typeof this.options.volumeFade?.level === 'number') {
18817
+ this.activeVolume = this.options.volumeFade.level;
18818
+ }
18819
+ }
18787
18820
  /**
18788
18821
  * @internal
18789
18822
  */
18790
18823
  bindEvents() {
18791
- // TODO on container changed
18792
18824
  this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
18793
- if (this.core.mediaControl) {
18794
- this.listenTo(this.core.mediaControl, 'mediacontrol:volume:user', this._onUserChangeVolume);
18795
- }
18796
- // this.listenTo(this.core, 'core:volume:config', this._onVolumeConfig);
18797
- }
18798
- unBindEvents() {
18799
- this.core.$el.off('mouseleave.volume');
18800
- this.core.$el.off('mouseenter.volume');
18801
- }
18802
- _onUserChangeVolume(volume) {
18803
- this._aboveBorderVolume = volume;
18804
- }
18805
- _onVolumeConfig(value) {
18806
- this._aboveBorderVolume = value;
18807
- this.container?.setVolume(0);
18808
18825
  }
18809
18826
  onCoreReady() {
18810
- this.unBindEvents();
18811
- this.container = this.core.activeContainer;
18812
- if (this.core && this.core.$el) {
18813
- // TODO find out why options.playerElement instead of this.core.$el or this.container.$el
18814
- $(this.options.playerElement).on('mouseenter.volume', () => {
18815
- this.onEnter();
18816
- });
18817
- $(this.options.playerElement).on('mouseleave.volume', () => {
18818
- this.onLeave();
18819
- });
18820
- }
18821
- if (!this._aboveBorderVolume) {
18822
- this._aboveBorderVolume = this.container?.volume && !isNaN(this.container.volume) ? this.container.volume : 80;
18823
- }
18824
- if (this.options.mute || Browser.isMobile) {
18827
+ const mediaControl = this.core.getPlugin('media_control');
18828
+ if (Browser.isMobile) {
18825
18829
  this.destroy();
18826
18830
  return;
18827
18831
  }
18828
- this.delay = this.options.volumeFade && this.options.volumeFade.delay || 600;
18829
- this.container?.setVolume(0);
18832
+ if (mediaControl) {
18833
+ this.listenTo(mediaControl, ExtendedEvents.MEDIACONTROL_VOLUME, this.onVolumeChange);
18834
+ }
18835
+ $(this.core.$el).on('mouseenter', () => this.onEnter());
18836
+ $(this.core.$el).on('mouseleave', () => this.onLeave());
18837
+ if (!this.activeVolume) {
18838
+ this.activeVolume =
18839
+ this.core.activeContainer?.volume &&
18840
+ !isNaN(this.core.activeContainer.volume)
18841
+ ? this.core.activeContainer.volume
18842
+ : DEFAULT_VOLUME_LEVEL;
18843
+ }
18844
+ this.duration = this.options.volumeFade?.duration || DEFAULT_DURATION;
18845
+ // TODO check if `mute` must be respected
18846
+ this.core.activeContainer?.setVolume(this.activeVolume);
18847
+ this.core.activePlayback.volume(0);
18848
+ }
18849
+ onVolumeChange(volume) {
18850
+ this.activeVolume = volume;
18830
18851
  }
18831
18852
  onEnter() {
18832
- this.numberTo(this.delay);
18853
+ this.fade(this.duration, 1);
18833
18854
  }
18834
- numberTo(duration, contra = 0) {
18835
- this.clearCurrentInterval();
18855
+ onLeave() {
18856
+ this.fade(this.duration, 0);
18857
+ }
18858
+ fade(duration, to) {
18859
+ this.stopFade();
18836
18860
  const start = new Date().getTime();
18837
- this.interval = setInterval(() => {
18838
- let now = (new Date().getTime()) - start;
18839
- if (now > duration) {
18840
- now = duration;
18841
- }
18842
- const progress = Math.abs(contra - now / duration);
18861
+ const from = 1 - to;
18862
+ this.timerId = setInterval(() => {
18863
+ const delta = new Date().getTime() - start;
18864
+ const progress = Math.min(1, delta / duration);
18865
+ const normVol = progress * to + (1 - progress) * from;
18866
+ const volume = normVol * this.activeVolume;
18867
+ this.core.activePlayback.volume(volume);
18843
18868
  try {
18844
- this.container?.setVolume(progress * this._aboveBorderVolume);
18845
- this.core.trigger(VolumeFadeEvents.FADE, progress * this._aboveBorderVolume);
18869
+ this.core.trigger(VolumeFadeEvents.FADE, volume);
18846
18870
  }
18847
18871
  catch (error) {
18848
- this.clearCurrentInterval();
18849
18872
  }
18850
- if (progress >= 1 || progress <= 0) {
18851
- this.clearCurrentInterval();
18873
+ if (progress >= 1) {
18874
+ this.stopFade();
18852
18875
  }
18853
18876
  }, 10);
18854
18877
  }
18855
- clearCurrentInterval() {
18856
- if (this.interval !== null) {
18857
- clearInterval(this.interval);
18858
- this.interval = null;
18878
+ stopFade() {
18879
+ if (this.timerId !== null) {
18880
+ clearInterval(this.timerId);
18881
+ this.timerId = null;
18859
18882
  }
18860
18883
  }
18861
- onLeave() {
18862
- this.numberTo(this.delay, 1);
18863
- }
18864
18884
  }
18865
18885
 
18866
- export { AudioTracks as AudioSelector, AudioTracks, BigMuteButton, BottomGear, NerdStats as ClapprNerdStats, ClapprStats, ClapprStatsChronograph, ClapprStatsCounter, ClapprStatsEvents, ClickToPause, Clips, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, Favicon, GearEvents, GoogleAnalytics, QualityLevels as LevelSelector, Logo, MediaControl, MultiCamera, NerdStats, PictureInPicture, PlaybackRate, Poster, QualityLevels, SeekTime, Share, SkipTime, SourceController, SpinnerThreeBounce as Spinner, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents };
18886
+ export { AudioTracks as AudioSelector, AudioTracks, BigMuteButton, BottomGear, NerdStats as ClapprNerdStats, ClapprStats, ClapprStatsChronograph, ClapprStatsCounter, ClapprStatsEvents, ClickToPause, Clips, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, ExtendedEvents, Favicon, GearEvents, GoogleAnalytics, QualityLevels as LevelSelector, Logo, MediaControl, MultiCamera, NerdStats, PictureInPicture, PlaybackRate, Poster, QualityLevels, SeekTime, Share, SkipTime, SourceController, SpinnerThreeBounce as Spinner, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents };
@@ -1,8 +1,8 @@
1
1
  <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
2
 
3
- [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [BitrateTrackRecord](./player.bitratetrackrecord.md)
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [ClapprStatsBitrateTrack](./player.clapprstatsbitratetrack.md)
4
4
 
5
- ## BitrateTrackRecord type
5
+ ## ClapprStatsBitrateTrack type
6
6
 
7
7
  > This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
8
8
  >
@@ -11,7 +11,7 @@
11
11
  **Signature:**
12
12
 
13
13
  ```typescript
14
- export type BitrateTrackRecord = {
14
+ export type ClapprStatsBitrateTrack = {
15
15
  start: number;
16
16
  end?: number;
17
17
  time?: number;
@@ -35,7 +35,7 @@ export type ClapprStatsMetrics = {
35
35
  extra: {
36
36
  playbackName: string;
37
37
  playbackType: string;
38
- bitratesHistory: BitrateTrackRecord[];
38
+ bitratesHistory: ClapprStatsBitrateTrack[];
39
39
  bitrateWeightedMean: number;
40
40
  bitrateMostUsed: number;
41
41
  buffersize: number;
@@ -48,5 +48,5 @@ export type ClapprStatsMetrics = {
48
48
  };
49
49
  };
50
50
  ```
51
- **References:** [ClapprStatsCounter.Play](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Pause](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Error](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Buffering](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.DecodedFrames](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.DroppedFrames](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Fps](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.ChangeLevel](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Seek](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Fullscreen](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.DvrUsage](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsChronograph.Startup](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Watch](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Pause](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Buffering](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Session](./player.clapprstatschronograph.md)<!-- -->, [BitrateTrackRecord](./player.bitratetrackrecord.md)
51
+ **References:** [ClapprStatsCounter.Play](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Pause](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Error](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Buffering](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.DecodedFrames](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.DroppedFrames](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Fps](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.ChangeLevel](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Seek](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.Fullscreen](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsCounter.DvrUsage](./player.clapprstatscounter.md)<!-- -->, [ClapprStatsChronograph.Startup](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Watch](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Pause](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Buffering](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsChronograph.Session](./player.clapprstatschronograph.md)<!-- -->, [ClapprStatsBitrateTrack](./player.clapprstatsbitratetrack.md)
52
52
 
@@ -0,0 +1,45 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [ExtendedEvents](./player.extendedevents.md)
4
+
5
+ ## ExtendedEvents enum
6
+
7
+ **Signature:**
8
+
9
+ ```typescript
10
+ export declare enum ExtendedEvents
11
+ ```
12
+
13
+ ## Enumeration Members
14
+
15
+ <table><thead><tr><th>
16
+
17
+ Member
18
+
19
+
20
+ </th><th>
21
+
22
+ Value
23
+
24
+
25
+ </th><th>
26
+
27
+ Description
28
+
29
+
30
+ </th></tr></thead>
31
+ <tbody><tr><td>
32
+
33
+ MEDIACONTROL\_VOLUME
34
+
35
+
36
+ </td><td>
37
+
38
+ `"mediacontrol:volume"`
39
+
40
+
41
+ </td><td>
42
+
43
+
44
+ </td></tr>
45
+ </tbody></table>
@@ -45,7 +45,7 @@ RENDERED
45
45
 
46
46
  </td><td>
47
47
 
48
- **_(BETA)_** Use this event to accurately attach an item to the gear menu
48
+ **_(BETA)_** Subscribe to this event to accurately attach an item to the gear menu
49
49
 
50
50
 
51
51
  </td></tr>
@@ -358,7 +358,7 @@ Description
358
358
 
359
359
  </td><td>
360
360
 
361
- **_(BETA)_** `PLUGIN` that applies fade effect to the player's volume change.
361
+ **_(BETA)_** `PLUGIN` that mutes the sound and fades it in when the mouse is over the player.
362
362
 
363
363
 
364
364
  </td></tr>
@@ -409,6 +409,15 @@ Description
409
409
  **_(BETA)_**
410
410
 
411
411
 
412
+ </td></tr>
413
+ <tr><td>
414
+
415
+ [ExtendedEvents](./player.extendedevents.md)
416
+
417
+
418
+ </td><td>
419
+
420
+
412
421
  </td></tr>
413
422
  <tr><td>
414
423
 
@@ -688,7 +697,7 @@ Description
688
697
  </th></tr></thead>
689
698
  <tbody><tr><td>
690
699
 
691
- [BitrateTrackRecord](./player.bitratetrackrecord.md)
700
+ [ClapprStatsBitrateTrack](./player.clapprstatsbitratetrack.md)
692
701
 
693
702
 
694
703
  </td><td>
@@ -1116,6 +1125,17 @@ Localization strings for the player UI.
1116
1125
  Preferred streaming media delivery protocol
1117
1126
 
1118
1127
 
1128
+ </td></tr>
1129
+ <tr><td>
1130
+
1131
+ [VolumeFadeSettings](./player.volumefadesettings.md)
1132
+
1133
+
1134
+ </td><td>
1135
+
1136
+ **_(BETA)_**
1137
+
1138
+
1119
1139
  </td></tr>
1120
1140
  <tr><td>
1121
1141
 
@@ -7,11 +7,6 @@
7
7
  > This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
8
8
  >
9
9
 
10
- > Warning: This API is now obsolete.
11
- >
12
- > Use [MediaControl.putElement()](./player.mediacontrol.putelement.md) instead
13
- >
14
-
15
10
  Get a media control element DOM node
16
11
 
17
12
  **Signature:**
@@ -7,6 +7,11 @@
7
7
  > This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.
8
8
  >
9
9
 
10
+ > Warning: This API is now obsolete.
11
+ >
12
+ > Use [MediaControl.mount()](./player.mediacontrol.mount.md) instead
13
+ >
14
+
10
15
  **Signature:**
11
16
 
12
17
  ```typescript
@@ -59,7 +59,7 @@ boolean
59
59
 
60
60
  </td><td>
61
61
 
62
- Whether to show or hide the element
62
+ Visibility state
63
63
 
64
64
 
65
65
  </td></tr>