@gcorevideo/player 2.21.3 → 2.21.4

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 (89) hide show
  1. package/assets/audio-selector/style.scss +1 -1
  2. package/assets/audio-selector/track-selector.ejs +3 -3
  3. package/assets/bottom-gear/bottomgear.ejs +2 -2
  4. package/assets/media-control/container.scss +1 -1
  5. package/assets/media-control/media-control.ejs +1 -6
  6. package/assets/media-control/media-control.scss +6 -4
  7. package/assets/media-control/width270.scss +1 -1
  8. package/assets/media-control/width370.scss +4 -4
  9. package/assets/playback-rate/button.ejs +2 -2
  10. package/assets/playback-rate/list.ejs +4 -4
  11. package/assets/subtitles/combobox.ejs +5 -5
  12. package/assets/subtitles/string.ejs +1 -1
  13. package/assets/subtitles/style.scss +2 -2
  14. package/dist/core.js +2 -1
  15. package/dist/index.css +972 -967
  16. package/dist/index.js +126 -106
  17. package/dist/player.d.ts +141 -119
  18. package/dist/plugins/index.css +801 -796
  19. package/dist/plugins/index.js +119 -104
  20. package/docs/api/player.bottomgear.getelement.md +2 -2
  21. package/docs/api/player.bottomgear.md +1 -1
  22. package/docs/api/{player.subtitles.hide.md → player.closedcaptions.hide.md} +2 -2
  23. package/docs/api/{player.subtitles.md → player.closedcaptions.md} +11 -11
  24. package/docs/api/{player.subtitles.show.md → player.closedcaptions.show.md} +2 -2
  25. package/docs/api/player.closedcaptionspluginsettings.md +13 -0
  26. package/docs/api/player.gearitemelement.md +6 -4
  27. package/docs/api/player.gearoptionsitem.md +16 -0
  28. package/docs/api/player.md +48 -12
  29. package/docs/api/player.mediacontrol.putelement.md +2 -2
  30. package/docs/api/player.mediacontrolelement.md +1 -1
  31. package/docs/api/player.playbackrate.md +1 -1
  32. package/docs/api/player.subtitlespluginsettings.md +18 -0
  33. package/docs/api/player.texttrackitem.id.md +11 -0
  34. package/docs/api/player.texttrackitem.md +87 -0
  35. package/docs/api/player.texttrackitem.name.md +11 -0
  36. package/docs/api/player.texttrackitem.track.md +11 -0
  37. package/lib/index.d.ts +1 -1
  38. package/lib/index.js +1 -1
  39. package/lib/index.plugins.d.ts +2 -1
  40. package/lib/index.plugins.d.ts.map +1 -1
  41. package/lib/index.plugins.js +2 -1
  42. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  43. package/lib/playback/dash-playback/DashPlayback.js +1 -0
  44. package/lib/plugins/audio-selector/AudioSelector.d.ts +2 -3
  45. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  46. package/lib/plugins/audio-selector/AudioSelector.js +6 -7
  47. package/lib/plugins/bottom-gear/BottomGear.d.ts +6 -2
  48. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  49. package/lib/plugins/bottom-gear/BottomGear.js +2 -1
  50. package/lib/plugins/media-control/MediaControl.d.ts +5 -5
  51. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  52. package/lib/plugins/media-control/MediaControl.js +46 -39
  53. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +1 -0
  54. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
  55. package/lib/plugins/picture-in-picture/PictureInPicture.js +4 -4
  56. package/lib/plugins/playback-rate/PlaybackRate.d.ts +0 -1
  57. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  58. package/lib/plugins/playback-rate/PlaybackRate.js +23 -14
  59. package/lib/plugins/subtitles/ClosedCaptions.d.ts +118 -0
  60. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -0
  61. package/lib/plugins/subtitles/ClosedCaptions.js +348 -0
  62. package/lib/plugins/subtitles/Subtitles.d.ts +12 -9
  63. package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -1
  64. package/lib/plugins/subtitles/Subtitles.js +31 -32
  65. package/lib/testUtils.d.ts +22 -18
  66. package/lib/testUtils.d.ts.map +1 -1
  67. package/lib/testUtils.js +22 -36
  68. package/package.json +1 -1
  69. package/src/index.plugins.ts +2 -1
  70. package/src/index.ts +1 -1
  71. package/src/playback/dash-playback/DashPlayback.ts +1 -0
  72. package/src/plugins/audio-selector/AudioSelector.ts +9 -8
  73. package/src/plugins/bottom-gear/BottomGear.ts +11 -4
  74. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -1
  75. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +2 -2
  76. package/src/plugins/media-control/MediaControl.ts +53 -46
  77. package/src/plugins/media-control/__tests__/MediaControl.test.ts +43 -0
  78. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +175 -0
  79. package/src/plugins/picture-in-picture/PictureInPicture.ts +5 -5
  80. package/src/plugins/playback-rate/PlaybackRate.ts +142 -100
  81. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +65 -0
  82. package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +11 -0
  83. package/src/plugins/subtitles/{Subtitles.ts → ClosedCaptions.ts} +42 -34
  84. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +58 -0
  85. package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +25 -0
  86. package/src/testUtils.ts +22 -36
  87. package/temp/player.api.json +269 -89
  88. package/tsconfig.tsbuildinfo +1 -1
  89. package/src/plugins/index.ts +0 -39
@@ -9775,7 +9775,7 @@ function ifError(err) {
9775
9775
  // export const CLAPPR_VERSION: string = process.env.CLAPPR_VERSION || '0.11.3';
9776
9776
  const CLAPPR_VERSION = '0.11.3';
9777
9777
 
9778
- const pluginHtml$7 = "<button data-track-selector-button class='gcore-skin-button-color'>\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color'>\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-track-selector-select=\"<%= track.id %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
9778
+ 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\"></span>\n</button>\n<ul class='gcore-skin-bg-color' 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";
9779
9779
 
9780
9780
  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";
9781
9781
 
@@ -9817,8 +9817,7 @@ class AudioSelector extends UICorePlugin {
9817
9817
  */
9818
9818
  get attributes() {
9819
9819
  return {
9820
- class: 'media-control-audio-tracks',
9821
- 'data-track-selector': '',
9820
+ class: 'media-control-audiotracks',
9822
9821
  };
9823
9822
  }
9824
9823
  /**
@@ -9826,8 +9825,8 @@ class AudioSelector extends UICorePlugin {
9826
9825
  */
9827
9826
  get events() {
9828
9827
  return {
9829
- 'click [data-track-selector-select]': 'onTrackSelect',
9830
- 'click [data-track-selector-button]': 'onShowLevelSelectMenu',
9828
+ 'click [data-audiotracks-select]': 'onTrackSelect',
9829
+ 'click [data-audiotracks-button]': 'onShowLevelSelectMenu',
9831
9830
  };
9832
9831
  }
9833
9832
  /**
@@ -9884,7 +9883,7 @@ class AudioSelector extends UICorePlugin {
9884
9883
  const mediaControl = this.core.getPlugin('media_control');
9885
9884
  this.$el.html(AudioSelector.template({ tracks: this.tracks, title: this.getTitle() }));
9886
9885
  this.$('.audio-arrow').append(audioArrow);
9887
- mediaControl.putElement('audioTracksSelector', this.$el);
9886
+ mediaControl.putElement('audiotracks', this.el);
9888
9887
  this.updateText();
9889
9888
  this.highlightCurrentTrack();
9890
9889
  return this;
@@ -9897,7 +9896,7 @@ class AudioSelector extends UICorePlugin {
9897
9896
  return this.tracks.find((track) => track.id === id);
9898
9897
  }
9899
9898
  onTrackSelect(event) {
9900
- const id = event.target?.dataset?.trackSelectorSelect;
9899
+ const id = event.target?.dataset?.audiotracksSelect;
9901
9900
  if (id) {
9902
9901
  this.selectAudioTrack(id);
9903
9902
  }
@@ -9927,7 +9926,7 @@ class AudioSelector extends UICorePlugin {
9927
9926
  }
9928
9927
  trackElement(id) {
9929
9928
  return this.$('ul a' +
9930
- (id !== undefined ? '[data-track-selector-select="' + id + '"]' : '')).parent();
9929
+ (id !== undefined ? '[data-audiotracks-select="' + id + '"]' : '')).parent();
9931
9930
  }
9932
9931
  getTitle() {
9933
9932
  return this.currentTrack?.label || '';
@@ -10094,7 +10093,7 @@ class BigMuteButton extends UICorePlugin {
10094
10093
  }
10095
10094
  }
10096
10095
 
10097
- const pluginHtml$5 = "<button type=\"button\" class=\"button-gear media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" data-gear-button=\"-1\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\">\n <% for (const item of items) { %>\n <li data-<%= item %>></li>\n <% } %>\n </ul>\n</div>";
10096
+ const pluginHtml$5 = "<button type=\"button\" class=\"button-gear media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" data-gear-button=\"-1\" id=\"gear-button\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\" id=\"gear-options\">\n <% for (const item of items) { %>\n <li data-<%= item %>></li>\n <% } %>\n </ul>\n</div>";
10098
10097
 
10099
10098
  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";
10100
10099
 
@@ -10356,7 +10355,7 @@ function getPageX(event) {
10356
10355
  return 0;
10357
10356
  }
10358
10357
 
10359
- const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderClipsText = function(name) { %>\n\n <div class=\"media-clip-container gcore-skin-text-color\" data-<%= name %>>\n <div class=\"media-clip-point gcore-skin-text-color\" data-<%= name %>>•</div>\n <div class=\"media-clip-text gcore-skin-text-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderPlaybackRate = function(name) { %>\n <div class=\"media-control-playbackrate\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"playbackrate\") {\n renderPlaybackRate(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if (setting === \"clipsText\") {\n renderClipsText(setting)\n } else {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
10358
+ const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderClipsText = function(name) { %>\n\n <div class=\"media-clip-container gcore-skin-text-color\" data-<%= name %>>\n <div class=\"media-clip-point gcore-skin-text-color\" data-<%= name %>>•</div>\n <div class=\"media-clip-text gcore-skin-text-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if (setting === \"clipsText\") {\n renderClipsText(setting)\n } else if (setting === \"fullscreen\") {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
10360
10359
 
10361
10360
  const playIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1564)\">\n <path d=\"M6 3V20L19.3571 11.5L6 3Z\" fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1564\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
10362
10361
 
@@ -10408,7 +10407,7 @@ function orderByOrderPattern(arr, order) {
10408
10407
  * The methods exposed are to be used by the other plugins that extend the media control UI.
10409
10408
  */
10410
10409
  class MediaControl extends UICorePlugin {
10411
- advertisementPlaying = false;
10410
+ // private advertisementPlaying = false
10412
10411
  buttonsColor = null;
10413
10412
  currentDurationValue = 0;
10414
10413
  currentPositionValue = 0;
@@ -10430,7 +10429,7 @@ class MediaControl extends UICorePlugin {
10430
10429
  lastMouseY = 0;
10431
10430
  persistConfig;
10432
10431
  rendered = false;
10433
- settings = {};
10432
+ settings = {}; // TODO & seekEnabled: boolean, ...
10434
10433
  userDisabled = false;
10435
10434
  userKeepVisible = false;
10436
10435
  verticalVolume = false;
@@ -10611,18 +10610,16 @@ class MediaControl extends UICorePlugin {
10611
10610
  this.listenTo(this.core.activeContainer, Events.CONTAINER_DBLCLICK, this.toggleFullscreen);
10612
10611
  this.listenTo(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
10613
10612
  this.listenTo(this.core.activeContainer, Events.CONTAINER_PROGRESS, this.updateProgressBar);
10614
- this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.settingsUpdate);
10615
- this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.settingsUpdate);
10613
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.updateSettings);
10614
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.updateSettings);
10616
10615
  this.listenTo(this.core.activeContainer, Events.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
10617
10616
  this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_DISABLE, this.disable);
10618
10617
  this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_ENABLE, this.enable);
10619
10618
  this.listenTo(this.core.activeContainer, Events.CONTAINER_ENDED, this.ended);
10620
10619
  this.listenTo(this.core.activeContainer, Events.CONTAINER_VOLUME, this.onVolumeChanged);
10621
10620
  this.listenTo(this.core.activeContainer, Events.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
10622
- if (this.core.activePlayback.el.nodeName.toLowerCase() === 'video') {
10623
- // wait until the metadata has loaded and then check if fullscreen on video tag is supported
10624
- this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadataOnVideoTag);
10625
- }
10621
+ // wait until the metadata has loaded and then check if fullscreen on video tag is supported
10622
+ this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
10626
10623
  }
10627
10624
  /**
10628
10625
  * Hides the media control UI
@@ -10655,13 +10652,13 @@ class MediaControl extends UICorePlugin {
10655
10652
  onVolumeChanged() {
10656
10653
  this.updateVolumeUI();
10657
10654
  }
10658
- onLoadedMetadataOnVideoTag(event) {
10655
+ onLoadedMetadata() {
10659
10656
  const video = this.core.activePlayback?.el;
10660
10657
  // video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
10661
10658
  // see https://github.com/clappr/clappr/issues/1127
10662
10659
  if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
10663
10660
  this.fullScreenOnVideoTagSupported = true;
10664
- this.settingsUpdate();
10661
+ this.updateSettings();
10665
10662
  }
10666
10663
  }
10667
10664
  updateVolumeUI() {
@@ -10890,7 +10887,7 @@ class MediaControl extends UICorePlugin {
10890
10887
  this.setInitialVolume();
10891
10888
  this.changeTogglePlay();
10892
10889
  this.bindContainerEvents();
10893
- this.settingsUpdate();
10890
+ this.updateSettings();
10894
10891
  this.core.activeContainer.trigger(Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
10895
10892
  // TODO test
10896
10893
  if (this.core.activeContainer.mediaControlDisabled) {
@@ -11071,18 +11068,19 @@ class MediaControl extends UICorePlugin {
11071
11068
  this.core.$el.addClass('nocursor');
11072
11069
  }
11073
11070
  }
11074
- settingsUpdate() {
11071
+ updateSettings() {
11075
11072
  const newSettings = $.extend(true, {
11076
11073
  left: [],
11077
11074
  default: [],
11078
11075
  right: [],
11079
- }, this.core.activeContainer?.settings);
11076
+ }, this.core.activeContainer.settings);
11080
11077
  newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
11078
+ // actual order of the items appear rendered is controlled by CSS
11081
11079
  newSettings.right = [
11082
11080
  'fullscreen',
11083
11081
  'pip',
11084
- 'bottomgear',
11085
- 'subtitles',
11082
+ 'gear',
11083
+ 'cc',
11086
11084
  'multicamera',
11087
11085
  'playbackrate',
11088
11086
  'vr',
@@ -11091,7 +11089,7 @@ class MediaControl extends UICorePlugin {
11091
11089
  if ((!this.fullScreenOnVideoTagSupported &&
11092
11090
  !Fullscreen.fullscreenEnabled()) ||
11093
11091
  this.options.fullscreenDisable) {
11094
- // remove fullscreen from settings if it is present
11092
+ // remove fullscreen from settings if it is not available
11095
11093
  removeArrayItem(newSettings.default, 'fullscreen');
11096
11094
  removeArrayItem(newSettings.left, 'fullscreen');
11097
11095
  removeArrayItem(newSettings.right, 'fullscreen');
@@ -11130,7 +11128,7 @@ class MediaControl extends UICorePlugin {
11130
11128
  this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
11131
11129
  this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
11132
11130
  this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
11133
- this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
11131
+ this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
11134
11132
  this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
11135
11133
  this.resetIndicators();
11136
11134
  this.initializeIcons();
@@ -11156,36 +11154,31 @@ class MediaControl extends UICorePlugin {
11156
11154
  */
11157
11155
  getElement(name) {
11158
11156
  switch (name) {
11159
- case 'audioTracksSelector':
11157
+ case 'audiotracks':
11160
11158
  return null;
11161
11159
  case 'clipText':
11162
11160
  return this.$clipText;
11163
- case 'gear':
11164
- return null;
11165
- case 'pip':
11166
- return null;
11167
11161
  case 'playbackRate':
11168
11162
  return this.$playbackRate;
11169
11163
  case 'seekBarContainer':
11170
11164
  return this.$seekBarContainer;
11171
- case 'subtitlesSelector':
11172
- return null;
11173
11165
  }
11174
11166
  }
11175
11167
  putElement(name, element) {
11176
- switch (name) {
11177
- case 'audioTracksSelector':
11178
- this.getRightPanel().append(element);
11179
- break;
11180
- case 'gear':
11181
- this.getRightPanel().append(element);
11182
- break;
11183
- case 'pip':
11184
- this.getRightPanel().append(element);
11185
- break;
11186
- case 'subtitlesSelector':
11187
- this.getRightPanel().append(element);
11188
- break;
11168
+ const panel = this.getElementLocation(name);
11169
+ if (panel) {
11170
+ const current = panel.find(`[data-${name}]`);
11171
+ element.setAttribute(`data-${name}`, "");
11172
+ // TODO test
11173
+ if (current.length) {
11174
+ if (current[0] === element) {
11175
+ return;
11176
+ }
11177
+ current.replaceWith(element);
11178
+ }
11179
+ else {
11180
+ panel.append(element);
11181
+ }
11189
11182
  }
11190
11183
  }
11191
11184
  /**
@@ -11423,12 +11416,12 @@ class MediaControl extends UICorePlugin {
11423
11416
  }
11424
11417
  // TODO manage by the ads plugin
11425
11418
  onStartAd() {
11426
- this.advertisementPlaying = true;
11419
+ // this.advertisementPlaying = true
11427
11420
  this.disable();
11428
11421
  }
11429
11422
  // TODO manage by the ads plugin
11430
11423
  onFinishAd() {
11431
- this.advertisementPlaying = false;
11424
+ // this.advertisementPlaying = false
11432
11425
  this.enable();
11433
11426
  }
11434
11427
  // TODO remove
@@ -11472,6 +11465,18 @@ class MediaControl extends UICorePlugin {
11472
11465
  }
11473
11466
  return isFinite(this.core.activePlayback.getDuration());
11474
11467
  }
11468
+ getElementLocation(name) {
11469
+ if (this.settings.right?.includes(name)) {
11470
+ return this.getRightPanel();
11471
+ }
11472
+ if (this.settings.left?.includes(name)) {
11473
+ return this.getLeftPanel();
11474
+ }
11475
+ if (this.settings.default?.includes(name)) {
11476
+ return this.getCenterPanel();
11477
+ }
11478
+ return null;
11479
+ }
11475
11480
  }
11476
11481
  MediaControl.extend = function (properties) {
11477
11482
  return extend(MediaControl, properties);
@@ -11540,6 +11545,7 @@ class BottomGear extends UICorePlugin {
11540
11545
  getElement(name) {
11541
11546
  return this.$el.find(`.gear-options-list [data-${name}]`);
11542
11547
  }
11548
+ // TODO implement putElement/addElement method
11543
11549
  /**
11544
11550
  * Replaces the content of the gear menu
11545
11551
  * @param content - Zepto result of the element
@@ -11570,7 +11576,7 @@ class BottomGear extends UICorePlugin {
11570
11576
  ];
11571
11577
  const icon = this.isHd ? gearHdIcon : gearIcon;
11572
11578
  this.$el.html(BottomGear.template({ icon, items }));
11573
- mediaControl.putElement('gear', this.$el);
11579
+ mediaControl.putElement('gear', this.el);
11574
11580
  mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
11575
11581
  return this;
11576
11582
  }
@@ -14570,7 +14576,7 @@ class ClipsPlugin extends UICorePlugin {
14570
14576
 
14571
14577
  const templateHtml$1 = "<ul class=\"context-menu-list\">\n <% if(options) { %>\n <% for (var i = 0; i < options.length; i++) { %>\n <li class=\"context-menu-list-item <%= options[i].class %>\"\n data-<%= options[i].name %>><%= options[i].label %></li>\n <% } %>\n <% } %>\n</ul>\n";
14572
14578
 
14573
- var version$1 = "2.21.3";
14579
+ var version$1 = "2.21.4";
14574
14580
 
14575
14581
  var packages = {
14576
14582
  "node_modules/@clappr/core": {
@@ -16053,6 +16059,7 @@ class PictureInPicture extends UICorePlugin {
16053
16059
  static get version() {
16054
16060
  return VERSION$2;
16055
16061
  }
16062
+ static buttonTemplate = tmpl(buttonHtml$1);
16056
16063
  /**
16057
16064
  * @internal
16058
16065
  */
@@ -16085,8 +16092,7 @@ class PictureInPicture extends UICorePlugin {
16085
16092
  if (!this.isPiPSupported()) {
16086
16093
  return this;
16087
16094
  }
16088
- const t = tmpl(buttonHtml$1);
16089
- this.$el.html(t({ pipIcon }));
16095
+ this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
16090
16096
  const mediaControl = this.core.getPlugin('media_control');
16091
16097
  if (mediaControl) {
16092
16098
  mediaControl.putElement('pip', this.el);
@@ -16112,9 +16118,9 @@ class PictureInPicture extends UICorePlugin {
16112
16118
  }
16113
16119
  }
16114
16120
 
16115
- const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option'>\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span>Playback speed</span>\n <span class=\"gear-option_arrow-right-icon\"><%= arrowRightIcon %></span>\n <span class='gear-option_value'><%= title %></span>\n</button>\n";
16121
+ const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option' id=\"playback-rate-button\">\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span class=\"gear-option_label\"><%= i18n.t('playback_rate') %></span>\n <span class=\"gear-option_arrow-right-icon\"><%= arrowRightIcon %></span>\n <span class='gear-option_value'><%= title %></span>\n</button>\n";
16116
16122
 
16117
- const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n Playback speed\n</button>\n<ul class=\"gear-sub-menu\">\n <% for (var i = playbackRates.length - 1; i >= 0; i--) { %>\n <li>\n <a href=\"#\" class='gear-sub-menu_btn gcore-skin-text-color' data-rate=\"<%= playbackRates[i].value %>\">\n <span class=\"check-icon\"><%= checkIcon %></span>\n <%= playbackRates[i].label %>\n </a>\n </li>\n <% } %>\n</ul>\n";
16123
+ const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n <%= i18n.t('playback_rate') %>\n</button>\n<ul class=\"gear-sub-menu\">\n <% for (const item of playbackRates) { %>\n <li>\n <a href=\"#\" class='gear-sub-menu_btn gcore-skin-text-color' data-rate=\"<%= item.value %>\">\n <span class=\"check-icon\"><%= checkIcon %></span>\n <%= item.label %>\n </a>\n </li>\n <% } %>\n</ul>\n";
16118
16124
 
16119
16125
  const speedIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.9854 23.9999C11.4272 23.9999 10.9571 23.5293 10.9571 22.9704C10.9571 22.4115 11.4272 21.9409 11.9854 21.9409C17.4492 21.9409 21.9143 17.4704 21.9143 11.9999C21.9143 6.52948 17.4492 2.05899 11.9854 2.05899C11.4272 2.05899 10.9571 1.58836 10.9571 1.02949C10.9571 0.470625 11.4272 0 11.9854 0C18.5949 0 24 5.38224 24 12.0291C24 18.6766 18.5949 24 11.9854 24V23.9999ZM10.2227 17.853L17.4785 13.4413C18.0072 13.1178 18.301 12.5885 18.301 11.9707C18.301 11.353 17.9779 10.8237 17.4785 10.5002L10.2227 6.08852C9.69405 5.76499 9.01826 5.76499 8.4896 6.05919C7.96094 6.35338 7.60828 6.94157 7.60828 7.5591V16.3824C7.60828 17.0002 7.93142 17.5883 8.4896 17.8824C8.75393 18.0294 9.04779 18.1177 9.34139 18.1177C9.63523 18.1177 9.95838 18.0294 10.2227 17.853V17.853ZM15.9216 11.9707L9.66457 15.7647V8.17661L15.9216 11.9707ZM8.22516 22.3529C8.4602 21.8236 8.25447 21.2058 7.7258 20.9705C7.19714 20.7353 6.69755 20.4413 6.2277 20.0882C5.75764 19.7646 5.11137 19.8822 4.78824 20.3235C4.46509 20.7941 4.58251 21.4412 5.02327 21.7647C5.58146 22.1764 6.19819 22.5293 6.81519 22.8235C6.96211 22.8824 7.10903 22.9117 7.25574 22.9117C7.66699 22.941 8.04893 22.7057 8.22513 22.3528L8.22516 22.3529ZM3.58381 19.0882C4.05387 18.7647 4.17127 18.1177 3.84814 17.647C3.52502 17.1764 3.23115 16.6765 2.99635 16.1471C2.76132 15.6178 2.14456 15.4118 1.6157 15.6472C1.08704 15.8825 0.881306 16.5 1.11634 17.0295C1.41018 17.6472 1.7626 18.2648 2.14459 18.8236C2.35032 19.1178 2.67325 19.2646 2.99638 19.2646C3.20191 19.2942 3.40763 19.2353 3.58384 19.0882L3.58381 19.0882ZM1.14563 13.9707C1.70382 13.9118 2.14435 13.4118 2.08576 12.853C2.05645 12.5588 2.05645 12.2648 2.05645 11.9706C2.05645 11.6764 2.05645 11.4117 2.08576 11.1178C2.14456 10.5589 1.70381 10.059 1.14563 10.0001C0.587439 9.94122 0.0881057 10.3825 0.0293019 10.9414C1.96979e-07 11.2942 0 11.6178 0 11.9709C0 12.3237 0.0293018 12.6768 0.0588091 13.0297C0.117618 13.5589 0.558169 13.9709 1.08706 13.9709C1.08686 13.9707 1.11636 13.9707 1.14567 13.9707L1.14563 13.9707ZM2.96687 7.79432C3.2019 7.26502 3.49553 6.76482 3.81866 6.2944C4.1418 5.82377 4.02439 5.17672 3.55432 4.8532C3.08427 4.52967 2.438 4.64722 2.11486 5.11786C1.73292 5.67672 1.38047 6.2942 1.08661 6.91193C0.851579 7.44123 1.08661 8.05897 1.58597 8.29426C1.73289 8.35314 1.87981 8.38247 2.02652 8.38247C2.40888 8.41181 2.7906 8.1767 2.96686 7.7943L2.96687 7.79432ZM6.22757 3.85328C6.69762 3.52974 7.19696 3.23554 7.69635 2.97089C8.22501 2.73558 8.43074 2.11807 8.19571 1.58857C7.96068 1.05927 7.34392 0.85329 6.81505 1.08861C6.19806 1.3828 5.58128 1.73565 5.02314 2.14741C4.55308 2.47094 4.43568 3.11797 4.78811 3.5886C4.99384 3.8828 5.31676 4.02969 5.6399 4.02969C5.84583 4.05902 6.05135 4.00014 6.22757 3.85325V3.85328Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
16120
16126
 
@@ -16135,7 +16141,7 @@ const DEFAULT_PLAYBACK_RATES = [
16135
16141
  { value: '1.25', label: '1.25x' },
16136
16142
  { value: '1.5', label: '1.5x' },
16137
16143
  { value: '1.75', label: '1.75x' },
16138
- { value: '2.0', label: '2x' }
16144
+ { value: '2.0', label: '2x' },
16139
16145
  ];
16140
16146
  const DEFAULT_PLAYBACK_RATE = '1.0';
16141
16147
  const T$6 = 'plugins.playback_rate';
@@ -16175,16 +16181,17 @@ class PlaybackRate extends UICorePlugin {
16175
16181
  static listTemplate = tmpl(listHtml);
16176
16182
  constructor(core) {
16177
16183
  super(core);
16178
- this.playbackRates = core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
16179
- this.selectedRate = core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
16184
+ this.playbackRates =
16185
+ core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
16186
+ this.selectedRate =
16187
+ core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
16180
16188
  }
16181
16189
  /**
16182
16190
  * @internal
16183
16191
  */
16184
16192
  get attributes() {
16185
16193
  return {
16186
- 'class': this.name,
16187
- 'data-playback-rate-select': ''
16194
+ class: 'media-control-playbackrate',
16188
16195
  };
16189
16196
  }
16190
16197
  /**
@@ -16232,7 +16239,7 @@ class PlaybackRate extends UICorePlugin {
16232
16239
  allRateElements() {
16233
16240
  return this.$('ul.gear-sub-menu li');
16234
16241
  }
16235
- rateElement(rate = "1") {
16242
+ rateElement(rate = '1') {
16236
16243
  return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
16237
16244
  }
16238
16245
  onPlaybackRateChange(playbackRate) {
@@ -16243,10 +16250,11 @@ class PlaybackRate extends UICorePlugin {
16243
16250
  }
16244
16251
  }
16245
16252
  shouldRender() {
16246
- if (!this.core.activeContainer) {
16253
+ if (!this.core.activePlayback) {
16247
16254
  return false;
16248
16255
  }
16249
- if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
16256
+ if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
16257
+ !this.core.activePlayback.dvrEnabled) {
16250
16258
  return false;
16251
16259
  }
16252
16260
  return 'setPlaybackRate' in this.core.activePlayback;
@@ -16269,9 +16277,12 @@ class PlaybackRate extends UICorePlugin {
16269
16277
  title: this.getTitle(),
16270
16278
  speedIcon,
16271
16279
  arrowRightIcon,
16280
+ i18n: this.core.i18n,
16272
16281
  });
16273
16282
  this.$el.html(button);
16274
- this.core.getPlugin('bottom_gear')?.getElement('rate')?.html(this.el);
16283
+ this.core.getPlugin('bottom_gear')
16284
+ ?.getElement('rate')
16285
+ ?.html(this.el);
16275
16286
  this.rendered = true;
16276
16287
  return this;
16277
16288
  }
@@ -16286,7 +16297,8 @@ class PlaybackRate extends UICorePlugin {
16286
16297
  }
16287
16298
  }
16288
16299
  onPlay() {
16289
- if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
16300
+ if (this.core.getPlaybackType() === Playback.LIVE &&
16301
+ !this.core.activePlayback.dvrEnabled) {
16290
16302
  this.resetPlaybackRate();
16291
16303
  }
16292
16304
  else {
@@ -16296,8 +16308,7 @@ class PlaybackRate extends UICorePlugin {
16296
16308
  resetPlaybackRate() {
16297
16309
  this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
16298
16310
  }
16299
- onStop() {
16300
- }
16311
+ onStop() { }
16301
16312
  onRateSelect(event) {
16302
16313
  event.stopPropagation();
16303
16314
  const rate = event.currentTarget.dataset.rate;
@@ -16312,6 +16323,7 @@ class PlaybackRate extends UICorePlugin {
16312
16323
  playbackRates: this.playbackRates,
16313
16324
  arrowLeftIcon,
16314
16325
  checkIcon,
16326
+ i18n: this.core.i18n,
16315
16327
  }));
16316
16328
  this.core.getPlugin('bottom_gear')?.setContent(this.el);
16317
16329
  this.highlightCurrentRate();
@@ -16327,7 +16339,8 @@ class PlaybackRate extends UICorePlugin {
16327
16339
  this.selectedRate = rate;
16328
16340
  }
16329
16341
  getTitle() {
16330
- return this.playbackRates.find((r) => r.value === this.selectedRate)?.label || this.selectedRate;
16342
+ return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
16343
+ this.selectedRate);
16331
16344
  }
16332
16345
  highlightCurrentRate() {
16333
16346
  this.allRateElements().removeClass('current');
@@ -17360,48 +17373,51 @@ const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
17360
17373
 
17361
17374
  const subtitlesOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.238 16.1C13.979 16.1 12.578 14.538 12.578 11.997C12.578 9.462 13.973 7.9 16.238 7.9C18.087 7.9 19.5029 9.127 19.6219 10.824H18.032C17.876 9.927 17.168 9.338 16.238 9.338C15.011 9.338 14.249 10.354 14.249 11.997C14.249 13.641 15.011 14.662 16.243 14.662C17.178 14.662 17.881 14.111 18.038 13.251H19.627C19.492 14.938 18.119 16.1 16.238 16.1ZM8.03198 16.1C5.77298 16.1 4.37299 14.538 4.37299 11.997C4.37299 9.462 5.76798 7.9 8.03198 7.9C9.88098 7.9 11.298 9.127 11.416 10.824H9.82697C9.67097 9.927 8.96198 9.338 8.03198 9.338C6.80598 9.338 6.04297 10.354 6.04297 11.997C6.04297 13.641 6.80596 14.662 8.03796 14.662C8.97296 14.662 9.67601 14.111 9.83301 13.251H11.422C11.287 14.938 9.91398 16.1 8.03198 16.1ZM22.5 3H1.5C0.672 3 0 3.671 0 4.5V19.5C0 20.329 0.672 21 1.5 21H22.5C23.329 21 24 20.329 24 19.5V4.5C24 3.671 23.329 3 22.5 3Z\"\n fill=\"#C9C9C9\"/>\n <rect y=\"22\" width=\"24\" height=\"2\" rx=\"1\" fill=\"#F6413B\"/>\n</svg>\n";
17362
17375
 
17363
- const comboboxHTML = "<button data-subtitles-button class='media-control-button media-control-icon gcore-skin-button-color'>\n <span class='subtitle-text'></span>\n</button>\n\n<ul class='gcore-skin-bg-color'>\n <% for (const t of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-subtitles-select=\"<%= t.id %>\">\n <%= t.name %>\n </a>\n </li>\n <% } %>\n <li><a href=\"#\" class='gcore-skin-text-color' data-subtitles-select=\"-1\">Off</a></li>\n</ul>\n";
17376
+ const comboboxHTML = "<button data-cc-button class='media-control-button media-control-icon gcore-skin-button-color' id=\"cc-button\">\n <span class='cc-text'></span>\n</button>\n\n<ul class='gcore-skin-bg-color' id=\"cc-select\">\n <% for (const t of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-cc-select=\"<%= t.id %>\">\n <%= t.name %>\n </a>\n </li>\n <% } %>\n <li><a href=\"#\" class='gcore-skin-text-color' data-cc-select=\"-1\">Off</a></li>\n</ul>\n";
17364
17377
 
17365
- const stringHTML = "<div class=\"subtitle-string\">\n <p></p>\n</div>\n";
17378
+ const stringHTML = "<div class=\"cc-line\" id=\"cc-line\">\n <p></p>\n</div>\n";
17366
17379
 
17367
17380
  const VERSION = '2.19.14';
17368
- const LOCAL_STORAGE_SUBTITLES_ID = 'gplayer.plugins.subtitles.selected';
17369
- const T$2 = 'plugins.subtitles';
17381
+ const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
17382
+ const T$2 = 'plugins.cc';
17370
17383
  /**
17371
17384
  * `PLUGIN` that provides a UI to select the subtitles when available.
17372
17385
  * @beta
17373
17386
  *
17374
17387
  * @remarks
17388
+ * The plugin is activated when closed captions tracks are provided with the media source.
17389
+ * It shows a familiar "CC" button with a dropdown menu to select the subtitles language.
17390
+ *
17375
17391
  * Depends on:
17376
17392
  *
17377
17393
  * - {@link MediaControl}
17378
17394
  *
17379
- * Configuration options - {@link SubtitlesPluginSettings}
17395
+ * Configuration options - {@link ClosedCaptionsPluginSettings}
17380
17396
  * @example
17381
17397
  * ```ts
17382
- * import { Subtitles } from '@gcorevideo/player'
17398
+ * import { ClosedCaptions } from '@gcorevideo/player'
17383
17399
  *
17384
- * Player.registerPlugin(Subtitles)
17400
+ * Player.registerPlugin(ClosedCaptions)
17385
17401
  *
17386
17402
  * new Player({
17387
17403
  * ...
17388
- * subtitles: {
17404
+ * cc: {
17389
17405
  * language: 'en',
17390
17406
  * },
17391
17407
  * })
17392
17408
  * ```
17393
17409
  */
17394
- class Subtitles extends UICorePlugin {
17410
+ class ClosedCaptions extends UICorePlugin {
17395
17411
  isPreselectedApplied = false;
17396
17412
  isShowing = false;
17397
17413
  track = null;
17398
17414
  tracks = [];
17399
- $string = null;
17415
+ $line = null;
17400
17416
  /**
17401
17417
  * @internal
17402
17418
  */
17403
17419
  get name() {
17404
- return 'subtitles';
17420
+ return 'cc';
17405
17421
  }
17406
17422
  /**
17407
17423
  * @internal
@@ -17422,8 +17438,7 @@ class Subtitles extends UICorePlugin {
17422
17438
  */
17423
17439
  get attributes() {
17424
17440
  return {
17425
- class: 'media-control-subtitles',
17426
- 'data-subtitles': '',
17441
+ class: 'media-control-cc',
17427
17442
  };
17428
17443
  }
17429
17444
  /**
@@ -17431,12 +17446,12 @@ class Subtitles extends UICorePlugin {
17431
17446
  */
17432
17447
  get events() {
17433
17448
  return {
17434
- 'click [data-subtitles-select]': 'onItemSelect',
17435
- 'click [data-subtitles-button]': 'toggleMenu',
17449
+ 'click [data-cc-select]': 'onItemSelect',
17450
+ 'click [data-cc-button]': 'toggleMenu',
17436
17451
  };
17437
17452
  }
17438
17453
  get preselectedLanguage() {
17439
- return this.core.options.subtitles?.language ?? '';
17454
+ return this.core.options.cc?.language ?? this.core.options.subtitles?.language ?? '';
17440
17455
  }
17441
17456
  /**
17442
17457
  * @internal
@@ -17543,7 +17558,7 @@ class Subtitles extends UICorePlugin {
17543
17558
  hide() {
17544
17559
  this.isShowing = false;
17545
17560
  this.renderIcon();
17546
- this.$string.hide();
17561
+ this.$line.hide();
17547
17562
  if (this.tracks) {
17548
17563
  for (const t of this.tracks) {
17549
17564
  t.track.mode = 'hidden';
@@ -17561,22 +17576,22 @@ class Subtitles extends UICorePlugin {
17561
17576
  this.track &&
17562
17577
  this.track.track.mode &&
17563
17578
  Browser.isiOS) {
17564
- this.$string.hide();
17579
+ this.$line.hide();
17565
17580
  this.track.track.mode = 'showing';
17566
17581
  }
17567
17582
  else {
17568
- this.$string.show();
17583
+ this.$line.show();
17569
17584
  }
17570
17585
  }
17571
17586
  shouldRender() {
17572
- return this.tracks.length > 0;
17587
+ return this.tracks?.length > 0;
17573
17588
  }
17574
17589
  resizeFont() {
17575
- if (!this.$string) {
17590
+ if (!this.$line) {
17576
17591
  return;
17577
17592
  }
17578
17593
  const skinWidth = this.core.activeContainer.$el.width();
17579
- this.$string.find('p').css('font-size', skinWidth * 0.03);
17594
+ this.$line.find('p').css('font-size', skinWidth * 0.03);
17580
17595
  }
17581
17596
  /**
17582
17597
  * @internal
@@ -17589,12 +17604,12 @@ class Subtitles extends UICorePlugin {
17589
17604
  return this;
17590
17605
  }
17591
17606
  const mediaControl = this.core.getPlugin('media_control');
17592
- this.$el.html(Subtitles.template({ tracks: this.tracks }));
17593
- this.core.activeContainer.$el.find('.subtitle-string').remove();
17594
- this.$string = $(Subtitles.templateString());
17607
+ this.$el.html(ClosedCaptions.template({ tracks: this.tracks }));
17608
+ this.core.activeContainer.$el.find('#cc-line').remove();
17609
+ this.$line = $(ClosedCaptions.templateString());
17595
17610
  this.resizeFont();
17596
- this.core.activeContainer.$el.append(this.$string);
17597
- mediaControl.putElement('subtitlesSelector', this.$el);
17611
+ this.core.activeContainer.$el.append(this.$line);
17612
+ mediaControl.putElement('cc', this.el);
17598
17613
  this.updateSelection();
17599
17614
  this.renderIcon();
17600
17615
  return this;
@@ -17609,8 +17624,8 @@ class Subtitles extends UICorePlugin {
17609
17624
  this.updateSelection();
17610
17625
  }
17611
17626
  onItemSelect(event) {
17612
- const id = event.target.dataset.subtitlesSelect ?? '-1';
17613
- localStorage.setItem(LOCAL_STORAGE_SUBTITLES_ID, id);
17627
+ const id = event.target.dataset.ccSelect ?? '-1';
17628
+ localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
17614
17629
  this.selectItem(this.findById(Number(id)));
17615
17630
  return false;
17616
17631
  }
@@ -17626,16 +17641,16 @@ class Subtitles extends UICorePlugin {
17626
17641
  }
17627
17642
  }
17628
17643
  hideMenu() {
17629
- this.$('[data-subtitles] ul').hide();
17644
+ this.$('[data-cc] ul').hide();
17630
17645
  }
17631
17646
  toggleMenu() {
17632
- this.$('[data-subtitles] ul').toggle();
17647
+ this.$('[data-cc] ul').toggle();
17633
17648
  }
17634
17649
  itemElement(id) {
17635
- return this.$(`ul li a[data-subtitles-select="${id}"]`).parent();
17650
+ return this.$(`ul li a[data-cc-select="${id}"]`).parent();
17636
17651
  }
17637
17652
  allItemElements() {
17638
- return this.$('[data-subtitles] li');
17653
+ return this.$('[data-cc] li');
17639
17654
  }
17640
17655
  selectSubtitles() {
17641
17656
  const trackId = this.track ? this.track.id : -1;
@@ -17655,7 +17670,7 @@ class Subtitles extends UICorePlugin {
17655
17670
  return lines.join('\n');
17656
17671
  }
17657
17672
  setSubtitleText(text) {
17658
- this.$string.find('p').html(text);
17673
+ this.$line.find('p').html(text);
17659
17674
  }
17660
17675
  clearSubtitleText() {
17661
17676
  this.setSubtitleText('');
@@ -17686,7 +17701,7 @@ class Subtitles extends UICorePlugin {
17686
17701
  }
17687
17702
  renderIcon() {
17688
17703
  const icon = this.isShowing ? subtitlesOnIcon : subtitlesOffIcon;
17689
- this.$el.find('span.subtitle-text').html(icon);
17704
+ this.$el.find('span.cc-text').html(icon);
17690
17705
  }
17691
17706
  }
17692
17707
 
@@ -18525,4 +18540,4 @@ class VolumeFade extends UICorePlugin {
18525
18540
  }
18526
18541
  }
18527
18542
 
18528
- export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ContextMenu, DvrControls, ErrorScreen, Favicon, GoogleAnalytics, LevelSelector, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackRate, Poster, SeekTime, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents };
18543
+ export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, Favicon, GoogleAnalytics, LevelSelector, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackRate, Poster, SeekTime, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents };