@gcorevideo/player 2.22.18 → 2.22.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/assets/audio-selector/track-selector.ejs +3 -3
  2. package/assets/bottom-gear/bottomgear.ejs +3 -3
  3. package/assets/dvr-controls/dvr_controls.scss +0 -12
  4. package/dist/core.js +1 -1
  5. package/dist/index.css +803 -810
  6. package/dist/index.js +195 -176
  7. package/dist/player.d.ts +121 -108
  8. package/dist/plugins/index.css +904 -911
  9. package/dist/plugins/index.js +132 -112
  10. package/docs/api/player.bitratetrackrecord.md +20 -0
  11. package/docs/api/player.clapprstats.exportmetrics.md +2 -2
  12. package/docs/api/player.clapprstats.md +0 -4
  13. package/docs/api/player.clapprstatschronograph.md +115 -0
  14. package/docs/api/player.clapprstatscounter.md +211 -0
  15. package/docs/api/player.clapprstatsevents.md +51 -0
  16. package/docs/api/player.clapprstatsmetrics.md +52 -0
  17. package/docs/api/player.clipspluginsettings.md +1 -1
  18. package/docs/api/player.md +57 -2
  19. package/docs/api/player.nerdstats.md +3 -3
  20. package/docs/api/player.playerconfig.md +1 -1
  21. package/docs/api/player.playerconfig.playbacktype.md +6 -1
  22. package/docs/api/player.timeupdate.md +6 -3
  23. package/lib/plugins/audio-selector/AudioSelector.d.ts +1 -1
  24. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  25. package/lib/plugins/audio-selector/AudioSelector.js +15 -8
  26. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
  27. package/lib/plugins/bottom-gear/BottomGear.js +2 -2
  28. package/lib/plugins/clappr-nerd-stats/NerdStats.d.ts +4 -4
  29. package/lib/plugins/clappr-nerd-stats/NerdStats.js +4 -4
  30. package/lib/plugins/clappr-stats/ClapprStats.d.ts +5 -2
  31. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
  32. package/lib/plugins/clappr-stats/ClapprStats.js +31 -33
  33. package/lib/plugins/clappr-stats/types.d.ts +21 -21
  34. package/lib/plugins/clappr-stats/types.d.ts.map +1 -1
  35. package/lib/plugins/clappr-stats/types.js +22 -22
  36. package/lib/plugins/clappr-stats/utils.d.ts +2 -2
  37. package/lib/plugins/clappr-stats/utils.d.ts.map +1 -1
  38. package/lib/plugins/click-to-pause/ClickToPause.js +1 -1
  39. package/lib/plugins/clips/Clips.d.ts +1 -1
  40. package/lib/plugins/dvr-controls/DvrControls.d.ts +6 -2
  41. package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
  42. package/lib/plugins/dvr-controls/DvrControls.js +39 -27
  43. package/lib/plugins/media-control/MediaControl.d.ts +6 -2
  44. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  45. package/lib/plugins/media-control/MediaControl.js +20 -9
  46. package/lib/plugins/picture-in-picture/PictureInPicture.js +1 -1
  47. package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
  48. package/lib/plugins/vast-ads/VastAds.js +1 -1
  49. package/lib/plugins/vast-ads/rollmanager.js +1 -1
  50. package/lib/testUtils.d.ts.map +1 -1
  51. package/lib/testUtils.js +7 -4
  52. package/lib/types.d.ts +1 -1
  53. package/package.json +3 -3
  54. package/src/playback/__tests__/HTML5Video.test.ts +2 -2
  55. package/src/plugins/audio-selector/AudioSelector.ts +14 -7
  56. package/src/plugins/audio-selector/__tests__/AudioSelector.test.ts +8 -8
  57. package/src/plugins/audio-selector/__tests__/__snapshots__/AudioSelector.test.ts.snap +15 -15
  58. package/src/plugins/bottom-gear/BottomGear.ts +2 -2
  59. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +8 -5
  60. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +3 -3
  61. package/src/plugins/clappr-nerd-stats/NerdStats.ts +5 -5
  62. package/src/plugins/clappr-stats/ClapprStats.ts +41 -40
  63. package/src/plugins/clappr-stats/__tests__/ClapprStats.test.ts +12 -12
  64. package/src/plugins/clappr-stats/types.ts +21 -21
  65. package/src/plugins/clappr-stats/utils.ts +2 -2
  66. package/src/plugins/click-to-pause/ClickToPause.ts +1 -1
  67. package/src/plugins/clips/Clips.ts +1 -1
  68. package/src/plugins/clips/__tests__/Clips.test.ts +1 -1
  69. package/src/plugins/clips/__tests__/__snapshots__/Clips.test.ts.snap +1 -1
  70. package/src/plugins/dvr-controls/DvrControls.ts +51 -37
  71. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +84 -26
  72. package/src/plugins/dvr-controls/__tests__/__snapshots__/DvrControls.test.ts.snap +0 -12
  73. package/src/plugins/media-control/MediaControl.ts +21 -9
  74. package/src/plugins/media-control/__tests__/MediaControl.test.ts +8 -5
  75. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +20 -20
  76. package/src/plugins/picture-in-picture/PictureInPicture.ts +1 -1
  77. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  78. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
  79. package/src/plugins/vast-ads/VastAds.ts +1 -1
  80. package/src/plugins/vast-ads/rollmanager.ts +1 -1
  81. package/src/testUtils.ts +11 -5
  82. package/src/types.ts +1 -1
  83. package/temp/player.api.json +630 -12
  84. package/tsconfig.tsbuildinfo +1 -1
@@ -9767,10 +9767,11 @@ function ifError(err) {
9767
9767
  // export const CLAPPR_VERSION: string = process.env.CLAPPR_VERSION || '0.11.3';
9768
9768
  const CLAPPR_VERSION$1 = '0.11.3';
9769
9769
 
9770
- const pluginHtml$7 = "<button data-audiotracks-button class='gcore-skin-button-color' id=\"audiotracks-button\">\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"><%= icon %></span>\n</button>\n<ul class='gcore-skin-bg-color menu hidden' id=\"audiotracks-select\">\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-audiotracks-select=\"<%= track.id %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
9770
+ const pluginHtml$7 = "<button data-audiotracks-button class='gcore-skin-button-color' id=\"audiotracks-button\" aria-haspopup=\"menu\" aria-expanded=\"false\">\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"><%= icon %></span>\n</button>\n<ul class='gcore-skin-bg-color menu hidden' id=\"audiotracks-select\" role=\"menu\">\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-audiotracks-select=\"<%= track.id %>\" role=\"menuitemradio\" aria-checked=\"<%= track.id === current %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
9771
9771
 
9772
9772
  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";
9773
9773
 
9774
+ // import { trace } from '@gcorevideo/utils'
9774
9775
  const VERSION$7 = '2.22.4';
9775
9776
  // const T = 'plugins.audiotracks'
9776
9777
  /**
@@ -9833,7 +9834,7 @@ class AudioTracks extends UICorePlugin {
9833
9834
  const mediaControl = this.core.getPlugin('media_control');
9834
9835
  assert(mediaControl, 'media_control plugin is required');
9835
9836
  this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, () => {
9836
- mediaControl.putElement('audiotracks', this.$el);
9837
+ mediaControl.mount('audiotracks', this.$el);
9837
9838
  });
9838
9839
  this.listenTo(mediaControl, Events.MEDIACONTROL_HIDE, this.hideMenu);
9839
9840
  }
@@ -9864,18 +9865,18 @@ class AudioTracks extends UICorePlugin {
9864
9865
  if (!this.shouldRender()) {
9865
9866
  return this;
9866
9867
  }
9867
- this.core.getPlugin('media_control');
9868
9868
  this.$el.html(AudioTracks.template({
9869
9869
  tracks: this.tracks,
9870
9870
  title: this.getTitle(),
9871
9871
  icon: audioArrow,
9872
+ current: this.currentTrack?.id,
9872
9873
  }));
9873
9874
  this.updateText();
9874
9875
  this.highlightCurrentTrack();
9875
9876
  return this;
9876
9877
  }
9877
9878
  onTrackSelect(event) {
9878
- const id = event.target?.dataset?.audiotracksSelect;
9879
+ const id = event.currentTarget?.dataset?.audiotracksSelect;
9879
9880
  if (id) {
9880
9881
  this.selectAudioTrack(id);
9881
9882
  }
@@ -9884,7 +9885,7 @@ class AudioTracks extends UICorePlugin {
9884
9885
  return false;
9885
9886
  }
9886
9887
  selectAudioTrack(id) {
9887
- this.startTrackSwitch();
9888
+ this.startTrackSwitching();
9888
9889
  this.core.activeContainer.switchAudioTrack(id);
9889
9890
  this.updateText();
9890
9891
  }
@@ -9892,7 +9893,9 @@ class AudioTracks extends UICorePlugin {
9892
9893
  this.$el.find('#audiotracks-select').addClass('hidden');
9893
9894
  }
9894
9895
  toggleContextMenu() {
9895
- this.$el.find('#audiotracks-select').toggleClass('hidden');
9896
+ this.$el.find('#audiotracks-select').toggleClass('hidden'); // TODO use plain CSS display: none
9897
+ const open = !this.$el.find('#audiotracks-select').hasClass('hidden'); // TODO hold state
9898
+ this.$el.find('#audiotracks-button').attr('aria-expanded', open);
9896
9899
  }
9897
9900
  buttonElement() {
9898
9901
  return this.$('button');
@@ -9910,7 +9913,7 @@ class AudioTracks extends UICorePlugin {
9910
9913
  }
9911
9914
  return this.currentTrack.label || this.currentTrack.language;
9912
9915
  }
9913
- startTrackSwitch() {
9916
+ startTrackSwitching() {
9914
9917
  this.buttonElement().addClass('changing');
9915
9918
  }
9916
9919
  updateText() {
@@ -9921,12 +9924,16 @@ class AudioTracks extends UICorePlugin {
9921
9924
  }
9922
9925
  highlightCurrentTrack() {
9923
9926
  this.trackElement().removeClass('current');
9924
- this.trackElement().find('a').removeClass('gcore-skin-active');
9927
+ this.trackElement()
9928
+ .find('a')
9929
+ .removeClass('gcore-skin-active')
9930
+ .attr('aria-checked', 'false');
9925
9931
  if (this.currentTrack) {
9926
9932
  this.trackElement(this.currentTrack.id)
9927
9933
  .addClass('current')
9928
9934
  .find('a')
9929
- .addClass('gcore-skin-active');
9935
+ .addClass('gcore-skin-active')
9936
+ .attr('aria-checked', 'true');
9930
9937
  }
9931
9938
  }
9932
9939
  }
@@ -9943,7 +9950,7 @@ const volumeOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fil
9943
9950
 
9944
9951
  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";
9945
9952
 
9946
- const T$e = 'plugins.big_mute_button';
9953
+ const T$d = 'plugins.big_mute_button';
9947
9954
  // TODO rewrite as a container plugin
9948
9955
  /**
9949
9956
  * `PLUGIN` that displays a big mute button over the video when it's muted.
@@ -9984,7 +9991,7 @@ class BigMuteButton extends UICorePlugin {
9984
9991
  this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
9985
9992
  this.listenTo(this.core, 'core:advertisement:start', this.onStartAd);
9986
9993
  this.listenTo(this.core, 'core:advertisement:finish', this.onFinishAd);
9987
- trace(`${T$e} bindEvents`, {
9994
+ trace(`${T$d} bindEvents`, {
9988
9995
  mediacontrol: !!this.core.mediaControl,
9989
9996
  });
9990
9997
  this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_RENDERED, this.mediaControlRendered);
@@ -10041,7 +10048,7 @@ class BigMuteButton extends UICorePlugin {
10041
10048
  */
10042
10049
  render() {
10043
10050
  if (this.shouldRender()) {
10044
- trace(`${T$e} render`, {
10051
+ trace(`${T$d} render`, {
10045
10052
  el: !!this.$el,
10046
10053
  });
10047
10054
  this.$el.html(BigMuteButton.template());
@@ -10080,7 +10087,7 @@ class BigMuteButton extends UICorePlugin {
10080
10087
  }
10081
10088
  }
10082
10089
 
10083
- const pluginHtml$5 = "<button type=\"button\" class=\"media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" id=\"gear-button\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\" id=\"gear-options-wrapper\" style=\"display: none;\">\n <ul class=\"gear-options-list\" id=\"gear-options\"></ul>\n</div>\n";
10090
+ const pluginHtml$5 = "<button class=\"media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" id=\"gear-button\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\" id=\"gear-options-wrapper\" style=\"display:none\">\n <ul class=\"gear-options-list\" id=\"gear-options\" role=\"menu\"></ul>\n</div>\n";
10084
10091
 
10085
10092
  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";
10086
10093
 
@@ -10094,7 +10101,7 @@ const VERSION$6 = '2.19.12';
10094
10101
  var GearEvents;
10095
10102
  (function (GearEvents) {
10096
10103
  /**
10097
- * Use this event to accurately attach an item to the gear menu
10104
+ * Subscribe to this event to accurately attach an item to the gear menu
10098
10105
  */
10099
10106
  GearEvents["RENDERED"] = "rendered";
10100
10107
  })(GearEvents || (GearEvents = {}));
@@ -10306,39 +10313,39 @@ class BottomGear extends UICorePlugin {
10306
10313
  }
10307
10314
  onMediaControlRendered() {
10308
10315
  const mediaControl = this.core.getPlugin('media_control');
10309
- mediaControl.putElement('gear', this.$el);
10316
+ mediaControl.mount('gear', this.$el);
10310
10317
  }
10311
10318
  }
10312
10319
 
10313
10320
  /**
10314
10321
  * @beta
10315
10322
  */
10316
- var Chronograph;
10317
- (function (Chronograph) {
10318
- Chronograph["Startup"] = "startup";
10319
- Chronograph["Watch"] = "watch";
10320
- Chronograph["Pause"] = "pause";
10321
- Chronograph["Buffering"] = "buffering";
10322
- Chronograph["Session"] = "session";
10323
+ var ClapprStatsChronograph;
10324
+ (function (ClapprStatsChronograph) {
10325
+ ClapprStatsChronograph["Startup"] = "startup";
10326
+ ClapprStatsChronograph["Watch"] = "watch";
10327
+ ClapprStatsChronograph["Pause"] = "pause";
10328
+ ClapprStatsChronograph["Buffering"] = "buffering";
10329
+ ClapprStatsChronograph["Session"] = "session";
10323
10330
  // Latency = 'latency',
10324
- })(Chronograph || (Chronograph = {}));
10331
+ })(ClapprStatsChronograph || (ClapprStatsChronograph = {}));
10325
10332
  /**
10326
10333
  * @beta
10327
10334
  */
10328
- var Counter;
10329
- (function (Counter) {
10330
- Counter["Play"] = "play";
10331
- Counter["Pause"] = "pause";
10332
- Counter["Error"] = "error";
10333
- Counter["Buffering"] = "buffering";
10334
- Counter["DecodedFrames"] = "decodedFrames";
10335
- Counter["DroppedFrames"] = "droppedFrames";
10336
- Counter["Fps"] = "fps";
10337
- Counter["ChangeLevel"] = "changeLevel";
10338
- Counter["Seek"] = "seek";
10339
- Counter["Fullscreen"] = "fullscreen";
10340
- Counter["DvrUsage"] = "dvrUsage";
10341
- })(Counter || (Counter = {}));
10335
+ var ClapprStatsCounter;
10336
+ (function (ClapprStatsCounter) {
10337
+ ClapprStatsCounter["Play"] = "play";
10338
+ ClapprStatsCounter["Pause"] = "pause";
10339
+ ClapprStatsCounter["Error"] = "error";
10340
+ ClapprStatsCounter["Buffering"] = "buffering";
10341
+ ClapprStatsCounter["DecodedFrames"] = "decodedFrames";
10342
+ ClapprStatsCounter["DroppedFrames"] = "droppedFrames";
10343
+ ClapprStatsCounter["Fps"] = "fps";
10344
+ ClapprStatsCounter["ChangeLevel"] = "changeLevel";
10345
+ ClapprStatsCounter["Seek"] = "seek";
10346
+ ClapprStatsCounter["Fullscreen"] = "fullscreen";
10347
+ ClapprStatsCounter["DvrUsage"] = "dvrUsage";
10348
+ })(ClapprStatsCounter || (ClapprStatsCounter = {}));
10342
10349
  /**
10343
10350
  * @beta
10344
10351
  */
@@ -10399,6 +10406,8 @@ function newMetrics$1() {
10399
10406
  * @remarks
10400
10407
  * This plugin does not render anything and is supposed to be extended or used together with other plugins that actually render something.
10401
10408
  *
10409
+ * @see {@link NerdStats} - a plugin that visualises the playback metrics
10410
+ *
10402
10411
  * Configuration options - {@link ClapprStatsSettings}
10403
10412
  *
10404
10413
  * Events - {@link ClapprStatsEvents}
@@ -10408,11 +10417,11 @@ class ClapprStats extends ContainerPlugin {
10408
10417
  lastDecodedFramesCount = 0;
10409
10418
  metrics = newMetrics$1();
10410
10419
  timers = {
10411
- [Chronograph.Startup]: 0,
10412
- [Chronograph.Watch]: 0,
10413
- [Chronograph.Pause]: 0,
10414
- [Chronograph.Buffering]: 0,
10415
- [Chronograph.Session]: 0,
10420
+ [ClapprStatsChronograph.Startup]: 0,
10421
+ [ClapprStatsChronograph.Watch]: 0,
10422
+ [ClapprStatsChronograph.Pause]: 0,
10423
+ [ClapprStatsChronograph.Buffering]: 0,
10424
+ [ClapprStatsChronograph.Session]: 0,
10416
10425
  };
10417
10426
  runEach;
10418
10427
  /**
@@ -10442,15 +10451,10 @@ class ClapprStats extends ContainerPlugin {
10442
10451
  inc(counter) {
10443
10452
  this.metrics.counters[counter] += 1;
10444
10453
  }
10445
- // _timerHasStarted(timer) {
10446
- // return this[`_start${timer}`] !== undefined;
10447
- // }
10448
10454
  start(timer) {
10449
- // this[`_start${timer}`] = this._now();
10450
10455
  this.timers[timer] = this.now();
10451
10456
  }
10452
10457
  stop(timer) {
10453
- // this._metrics.timers[timer] += this._now() - this[`_start${timer}`];
10454
10458
  this.metrics.chrono[timer] += this.now() - this.timers[timer];
10455
10459
  }
10456
10460
  constructor(container) {
@@ -10470,10 +10474,10 @@ class ClapprStats extends ContainerPlugin {
10470
10474
  this.listenTo(this.container, Events.CONTAINER_PAUSE, this.onPause);
10471
10475
  this.listenToOnce(this.container, Events.CONTAINER_STATE_BUFFERING, this.onBuffering);
10472
10476
  this.listenTo(this.container, Events.CONTAINER_SEEK, this.onSeek);
10473
- this.listenTo(this.container, Events.CONTAINER_ERROR, () => this.inc(Counter.Error));
10474
- this.listenTo(this.container, Events.CONTAINER_FULLSCREEN, () => this.inc(Counter.Fullscreen));
10477
+ this.listenTo(this.container, Events.CONTAINER_ERROR, () => this.inc(ClapprStatsCounter.Error));
10478
+ this.listenTo(this.container, Events.CONTAINER_FULLSCREEN, () => this.inc(ClapprStatsCounter.Fullscreen));
10475
10479
  this.listenTo(this.container, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, (dvrInUse) => {
10476
- dvrInUse && this.inc(Counter.DvrUsage);
10480
+ dvrInUse && this.inc(ClapprStatsCounter.DvrUsage);
10477
10481
  });
10478
10482
  this.listenTo(this.container.playback, Events.PLAYBACK_PROGRESS, this.onProgress);
10479
10483
  this.listenTo(this.container.playback, Events.PLAYBACK_TIMEUPDATE, this.onTimeUpdate);
@@ -10501,7 +10505,7 @@ class ClapprStats extends ContainerPlugin {
10501
10505
  last.time = now - last.start;
10502
10506
  }
10503
10507
  this.metrics.extra.bitratesHistory.push({ start: this.now(), bitrate });
10504
- this.inc(Counter.ChangeLevel);
10508
+ this.inc(ClapprStatsCounter.ChangeLevel);
10505
10509
  }
10506
10510
  stopReporting() {
10507
10511
  this.buildReport();
@@ -10512,31 +10516,31 @@ class ClapprStats extends ContainerPlugin {
10512
10516
  }
10513
10517
  startTimers() {
10514
10518
  this.timerId = setInterval(this.buildReport.bind(this), this.runEach);
10515
- this.start(Chronograph.Session);
10516
- this.start(Chronograph.Startup);
10519
+ this.start(ClapprStatsChronograph.Session);
10520
+ this.start(ClapprStatsChronograph.Startup);
10517
10521
  }
10518
10522
  onFirstPlaying() {
10519
10523
  this.listenTo(this.container, Events.CONTAINER_TIMEUPDATE, this.onContainerUpdateWhilePlaying);
10520
- this.start(Chronograph.Watch);
10521
- this.stop(Chronograph.Startup);
10524
+ this.start(ClapprStatsChronograph.Watch);
10525
+ this.stop(ClapprStatsChronograph.Startup);
10522
10526
  }
10523
10527
  playAfterPause() {
10524
10528
  this.listenTo(this.container, Events.CONTAINER_TIMEUPDATE, this.onContainerUpdateWhilePlaying);
10525
- this.stop(Chronograph.Pause);
10526
- this.start(Chronograph.Watch);
10529
+ this.stop(ClapprStatsChronograph.Pause);
10530
+ this.start(ClapprStatsChronograph.Watch);
10527
10531
  }
10528
10532
  onPlay() {
10529
- this.inc(Counter.Play);
10533
+ this.inc(ClapprStatsCounter.Play);
10530
10534
  }
10531
10535
  onPause() {
10532
- this.stop(Chronograph.Watch);
10533
- this.start(Chronograph.Pause);
10534
- this.inc(Counter.Pause);
10536
+ this.stop(ClapprStatsChronograph.Watch);
10537
+ this.start(ClapprStatsChronograph.Pause);
10538
+ this.inc(ClapprStatsCounter.Pause);
10535
10539
  this.listenToOnce(this.container, Events.CONTAINER_PLAY, this.playAfterPause);
10536
10540
  this.stopListening(this.container, Events.CONTAINER_TIMEUPDATE, this.onContainerUpdateWhilePlaying);
10537
10541
  }
10538
10542
  onSeek(e) {
10539
- this.inc(Counter.Seek);
10543
+ this.inc(ClapprStatsCounter.Seek);
10540
10544
  this.metrics.extra.watchHistory.push([e * 1000, e * 1000]);
10541
10545
  }
10542
10546
  onTimeUpdate(e) {
@@ -10561,17 +10565,17 @@ class ClapprStats extends ContainerPlugin {
10561
10565
  }
10562
10566
  onContainerUpdateWhilePlaying() {
10563
10567
  if (this.container.playback.isPlaying()) {
10564
- this.stop(Chronograph.Watch);
10565
- this.start(Chronograph.Watch);
10568
+ this.stop(ClapprStatsChronograph.Watch);
10569
+ this.start(ClapprStatsChronograph.Watch);
10566
10570
  }
10567
10571
  }
10568
10572
  onBuffering() {
10569
- this.inc(Counter.Buffering);
10570
- this.start(Chronograph.Buffering);
10573
+ this.inc(ClapprStatsCounter.Buffering);
10574
+ this.start(ClapprStatsChronograph.Buffering);
10571
10575
  this.listenToOnce(this.container, Events.CONTAINER_STATE_BUFFERFULL, this.onBufferfull);
10572
10576
  }
10573
10577
  onBufferfull() {
10574
- this.stop(Chronograph.Buffering);
10578
+ this.stop(ClapprStatsChronograph.Buffering);
10575
10579
  this.listenToOnce(this.container, Events.CONTAINER_STATE_BUFFERING, this.onBuffering);
10576
10580
  }
10577
10581
  onProgress(progress) {
@@ -10583,8 +10587,8 @@ class ClapprStats extends ContainerPlugin {
10583
10587
  // this.trigger(ClapprStatsEvents.PERCENTAGE, currentPercentage);
10584
10588
  }
10585
10589
  buildReport() {
10586
- this.stop(Chronograph.Session);
10587
- this.start(Chronograph.Session);
10590
+ this.stop(ClapprStatsChronograph.Session);
10591
+ this.start(ClapprStatsChronograph.Session);
10588
10592
  this.metrics.extra.playbackName = this.playbackName;
10589
10593
  this.metrics.extra.playbackType = this.playbackType;
10590
10594
  this.calcBitrates();
@@ -12765,18 +12769,18 @@ const PLAYBACK_NAMES = {
12765
12769
  hls: 'HLS.js',
12766
12770
  html5_video: 'Native',
12767
12771
  };
12768
- const T$d = 'plugins.nerd_stats';
12772
+ const T$c = 'plugins.nerd_stats';
12769
12773
  /**
12770
- * `PLUGIN` that displays useful network-related statistics.
12774
+ * `PLUGIN` that displays useful statistics regarding the playback as well as the network quality estimation.
12771
12775
  * @beta
12772
12776
  *
12773
12777
  * @remarks
12774
12778
  * Depends on:
12775
12779
  *
12776
- * - {@link BottomGear}
12777
- *
12778
- * - {@link ClapprStats}
12780
+ * - {@link BottomGear} - where the button is attached
12779
12781
  *
12782
+ * - {@link ClapprStats} - to get the metrics from
12783
+ *
12780
12784
  * The plugin is rendered as an item in the gear menu.
12781
12785
  *
12782
12786
  * When clicked, it shows an overlay window with the information about the network speed, latency, etc,
@@ -12968,7 +12972,7 @@ class NerdStats extends UICorePlugin {
12968
12972
  prefix + videoQualityNames[liveQuality - 1];
12969
12973
  }
12970
12974
  updateMetrics(metrics) {
12971
- trace(`${T$d} updateMetrics`, { custom: this.speedtestMetrics });
12975
+ trace(`${T$c} updateMetrics`, { custom: this.speedtestMetrics });
12972
12976
  Object.assign(this.metrics, metrics);
12973
12977
  this.updateEstimatedQuality();
12974
12978
  this.$el
@@ -13147,7 +13151,7 @@ class ClickToPause extends ContainerPlugin {
13147
13151
  * @internal
13148
13152
  */
13149
13153
  get name() {
13150
- return 'click_to_pause_custom';
13154
+ return 'click_to_pause';
13151
13155
  }
13152
13156
  /**
13153
13157
  * @internal
@@ -13538,7 +13542,7 @@ class ContextMenu extends UIContainerPlugin {
13538
13542
 
13539
13543
  const dvrHTML = "<div class=\"live-info\" id=\"media-control-live\"><%= i18n.t('live') %></div>\n<button type=\"button\" class=\"live-button\" aria-label=\"<%= i18n.t('back_to_live') %>\" id=\"media-control-back-to-live\"><%= i18n.t('back_to_live') %></button>\n";
13540
13544
 
13541
- const T$c = 'plugins.dvr_controls';
13545
+ // const T = 'plugins.dvr_controls'
13542
13546
  /**
13543
13547
  * `PLUGIN` that adds the DVR controls to the media control UI
13544
13548
  *
@@ -13587,18 +13591,17 @@ class DvrControls extends UICorePlugin {
13587
13591
  * @internal
13588
13592
  */
13589
13593
  bindEvents() {
13590
- this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
13591
- this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.bindContainerEvents);
13594
+ this.listenToOnce(this.core, Events.CORE_READY, this.onCoreReady);
13595
+ this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
13592
13596
  }
13593
13597
  onCoreReady() {
13594
13598
  const mediaControl = this.core.getPlugin('media_control');
13595
13599
  assert(mediaControl, 'media_control plugin is required');
13596
- this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
13597
- // MediaControl has been rendered
13598
- this.render();
13600
+ this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.mount);
13599
13601
  }
13600
- bindContainerEvents() {
13601
- this.listenToOnce(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.render);
13602
+ onActiveContainerChanged() {
13603
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onMetadataLoaded);
13604
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
13602
13605
  }
13603
13606
  click() {
13604
13607
  const container = this.core.activeContainer;
@@ -13607,32 +13610,47 @@ class DvrControls extends UICorePlugin {
13607
13610
  }
13608
13611
  container.seek(container.getDuration());
13609
13612
  }
13610
- shouldRender() {
13611
- return this.core.getPlaybackType() === Playback.LIVE;
13612
- }
13613
13613
  /**
13614
13614
  * @internal
13615
13615
  */
13616
13616
  render() {
13617
- trace(`${T$c} render`, {
13618
- dvrEnabled: this.core.activePlayback?.dvrEnabled,
13619
- playbackType: this.core.getPlaybackType(),
13620
- });
13621
- const mediaControl = this.core.getPlugin('media_control');
13622
- if (!mediaControl) {
13623
- return this;
13624
- }
13625
- if (!this.shouldRender()) {
13626
- return this;
13627
- }
13628
- mediaControl.toggleElement('duration', false);
13629
- mediaControl.toggleElement('position', false);
13630
13617
  this.$el.html(DvrControls.template({
13631
13618
  i18n: this.core.i18n,
13632
13619
  }));
13633
- mediaControl.putElement('dvr', this.$el);
13634
13620
  return this;
13635
13621
  }
13622
+ onMediacontrolRendered() {
13623
+ this.render();
13624
+ }
13625
+ onMetadataLoaded() {
13626
+ this.mount();
13627
+ this.toggleState(this.core.activeContainer.isDvrInUse());
13628
+ }
13629
+ mount() {
13630
+ // TODO move mount point management logic to MediaControl
13631
+ if (this.core.getPlaybackType() !== Playback.LIVE) {
13632
+ return;
13633
+ }
13634
+ const mediaControl = this.core.getPlugin('media_control');
13635
+ assert(mediaControl, 'media_control plugin is required');
13636
+ // TODO -> to MediaControl
13637
+ mediaControl.toggleElement('duration', false);
13638
+ mediaControl.toggleElement('position', false);
13639
+ mediaControl.mount('dvr', this.$el);
13640
+ }
13641
+ onDvrStateChanged(dvrInUse) {
13642
+ this.toggleState(dvrInUse);
13643
+ }
13644
+ toggleState(dvrInUse) {
13645
+ if (dvrInUse) {
13646
+ this.$el.find('#media-control-back-to-live').show();
13647
+ this.$el.find('#media-control-live').hide();
13648
+ }
13649
+ else {
13650
+ this.$el.find('#media-control-back-to-live').hide();
13651
+ this.$el.find('#media-control-live').show();
13652
+ }
13653
+ }
13636
13654
  }
13637
13655
 
13638
13656
  const reloadIcon = "<svg fill=\"#FFFFFF\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"/>\n <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\n</svg>";
@@ -14437,8 +14455,6 @@ const DEFAULT_SETTINGS = {
14437
14455
  right: [
14438
14456
  'audiotracks',
14439
14457
  'cc',
14440
- // 'dvr',
14441
- // 'duration',
14442
14458
  'fullscreen',
14443
14459
  'gear',
14444
14460
  'multicamera',
@@ -14455,10 +14471,10 @@ const T$a = 'plugins.media_control';
14455
14471
  const LEFT_ORDER = [
14456
14472
  'playpause',
14457
14473
  'playstop',
14458
- 'dvr',
14459
14474
  'volume',
14460
14475
  'position',
14461
14476
  'duration',
14477
+ 'dvr',
14462
14478
  ];
14463
14479
  const { Config, Fullscreen, formatTime: formatTime$1, extend, removeArrayItem } = Utils;
14464
14480
  function orderByOrderPattern(arr, order) {
@@ -15102,8 +15118,7 @@ class MediaControl extends UICorePlugin {
15102
15118
  }
15103
15119
  this.$el.show();
15104
15120
  this.trigger(Events.MEDIACONTROL_SHOW, this.name);
15105
- this.container &&
15106
- this.container.trigger(Events.CONTAINER_MEDIACONTROL_SHOW, this.name);
15121
+ this.core.activeContainer?.trigger(Events.CONTAINER_MEDIACONTROL_SHOW, this.name);
15107
15122
  this.$el.removeClass('media-control-hide');
15108
15123
  this.hideId = setTimeout(() => this.hide(), timeout);
15109
15124
  if (event) {
@@ -15156,7 +15171,7 @@ class MediaControl extends UICorePlugin {
15156
15171
  default: [],
15157
15172
  right: [],
15158
15173
  }, this.core.activeContainer.settings);
15159
- newSettings.left.push('clips'); // TODO
15174
+ newSettings.left.push('clips'); // TODO settings
15160
15175
  // TODO make order controlled via CSS
15161
15176
  newSettings.left = orderByOrderPattern([...newSettings.left, 'volume', 'clips'], LEFT_ORDER);
15162
15177
  if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
@@ -15218,7 +15233,6 @@ class MediaControl extends UICorePlugin {
15218
15233
  * Get a media control element DOM node
15219
15234
  * @param name - The name of the media control element
15220
15235
  * @returns The DOM node to render to or extend
15221
- * @deprecated Use {@link MediaControl.putElement} instead
15222
15236
  * @remarks
15223
15237
  * Use this method to render custom media control UI in a plugin
15224
15238
  * @example
@@ -15250,13 +15264,18 @@ class MediaControl extends UICorePlugin {
15250
15264
  return;
15251
15265
  }
15252
15266
  }
15267
+ /**
15268
+ * @deprecated Use {@link MediaControl.mount} instead
15269
+ * @param name
15270
+ * @param element
15271
+ */
15253
15272
  putElement(name, element) {
15254
15273
  this.mount(name, element);
15255
15274
  }
15256
15275
  /**
15257
15276
  * Toggle the visibility of a media control element
15258
15277
  * @param name - The name of the media control element
15259
- * @param show - Whether to show or hide the element
15278
+ * @param show - Visibility state
15260
15279
  */
15261
15280
  toggleElement(area, show) {
15262
15281
  this.$el.find(`[data-${area}]`).toggle(show);
@@ -15472,6 +15491,7 @@ class MediaControl extends UICorePlugin {
15472
15491
  width: this.options.width,
15473
15492
  height: this.options.height,
15474
15493
  });
15494
+ // TODO check out
15475
15495
  this.hideVolumeBar(0);
15476
15496
  }, 0);
15477
15497
  this.parseColors();
@@ -16015,7 +16035,7 @@ class PictureInPicture extends UICorePlugin {
16015
16035
  this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
16016
16036
  const mediaControl = this.core.getPlugin('media_control');
16017
16037
  if (mediaControl) {
16018
- mediaControl.putElement('pip', this.$el);
16038
+ mediaControl.mount('pip', this.$el);
16019
16039
  }
16020
16040
  return this;
16021
16041
  }
@@ -17912,7 +17932,7 @@ class ClosedCaptions extends UICorePlugin {
17912
17932
  this.$line = $(ClosedCaptions.templateString());
17913
17933
  this.resizeFont();
17914
17934
  this.core.activeContainer.$el.append(this.$line);
17915
- mediaControl.putElement('cc', this.$el);
17935
+ mediaControl.mount('cc', this.$el);
17916
17936
  this.updateSelection();
17917
17937
  this.renderIcon();
17918
17938
  return this;
@@ -18843,4 +18863,4 @@ class VolumeFade extends UICorePlugin {
18843
18863
  }
18844
18864
  }
18845
18865
 
18846
- export { AudioTracks as AudioSelector, AudioTracks, BigMuteButton, BottomGear, NerdStats as ClapprNerdStats, ClapprStats, 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 };
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 };
@@ -0,0 +1,20 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [BitrateTrackRecord](./player.bitratetrackrecord.md)
4
+
5
+ ## BitrateTrackRecord type
6
+
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
+ >
9
+
10
+
11
+ **Signature:**
12
+
13
+ ```typescript
14
+ export type BitrateTrackRecord = {
15
+ start: number;
16
+ end?: number;
17
+ time?: number;
18
+ bitrate: number;
19
+ };
20
+ ```
@@ -12,11 +12,11 @@ Returns the collected metrics.
12
12
  **Signature:**
13
13
 
14
14
  ```typescript
15
- exportMetrics(): Metrics;
15
+ exportMetrics(): ClapprStatsMetrics;
16
16
  ```
17
17
  **Returns:**
18
18
 
19
- Metrics
19
+ [ClapprStatsMetrics](./player.clapprstatsmetrics.md)
20
20
 
21
21
  Measurements collected so far
22
22
 
@@ -20,10 +20,6 @@ export declare class ClapprStats extends ContainerPlugin
20
20
 
21
21
  This plugin does not render anything and is supposed to be extended or used together with other plugins that actually render something.
22
22
 
23
- Configuration options - [ClapprStatsSettings](./player.clapprstatssettings.md)
24
-
25
- Events -
26
-
27
23
  ## Constructors
28
24
 
29
25
  <table><thead><tr><th>