@gcorevideo/player 2.22.5 → 2.22.7

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 (40) hide show
  1. package/assets/media-control/media-control.ejs +1 -2
  2. package/dist/core.js +2 -2
  3. package/dist/index.css +1432 -1432
  4. package/dist/index.js +127 -91
  5. package/dist/plugins/index.css +1495 -1495
  6. package/dist/plugins/index.js +123 -86
  7. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  8. package/lib/playback/dash-playback/DashPlayback.js +1 -1
  9. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  10. package/lib/plugins/bottom-gear/BottomGear.js +2 -2
  11. package/lib/plugins/media-control/MediaControl.d.ts +37 -6
  12. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  13. package/lib/plugins/media-control/MediaControl.js +54 -36
  14. package/lib/plugins/playback-rate/PlaybackRate.d.ts +5 -4
  15. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  16. package/lib/plugins/playback-rate/PlaybackRate.js +46 -24
  17. package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
  18. package/lib/plugins/utils/fullscreen.d.ts +4 -0
  19. package/lib/plugins/utils/fullscreen.d.ts.map +1 -0
  20. package/lib/plugins/utils/fullscreen.js +30 -0
  21. package/lib/plugins/utils.d.ts +0 -1
  22. package/lib/plugins/utils.d.ts.map +1 -1
  23. package/lib/plugins/utils.js +0 -28
  24. package/lib/utils/fullscreen.d.ts +3 -0
  25. package/lib/utils/fullscreen.d.ts.map +1 -0
  26. package/lib/utils/fullscreen.js +2 -0
  27. package/package.json +1 -1
  28. package/src/playback/dash-playback/DashPlayback.ts +1 -4
  29. package/src/plugins/bottom-gear/BottomGear.ts +2 -2
  30. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +15 -3
  31. package/src/plugins/media-control/MediaControl.ts +111 -62
  32. package/src/plugins/media-control/__tests__/MediaControl.test.ts +118 -8
  33. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +149 -5
  34. package/src/plugins/playback-rate/PlaybackRate.ts +48 -26
  35. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +125 -55
  36. package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +1 -1
  37. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  38. package/src/plugins/utils/fullscreen.ts +34 -0
  39. package/src/plugins/utils.ts +0 -31
  40. package/tsconfig.tsbuildinfo +1 -1
package/dist/index.js CHANGED
@@ -13091,8 +13091,8 @@ class DashPlayback extends BasePlayback {
13091
13091
  return super.destroy();
13092
13092
  }
13093
13093
  _updatePlaybackType() {
13094
- assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to update the playback type');
13095
13094
  const prevPlaybackType = this._playbackType;
13095
+ // @ts-ignore
13096
13096
  this._playbackType = this._dash.isDynamic() ? Playback.LIVE : Playback.VOD;
13097
13097
  if (prevPlaybackType !== this._playbackType) {
13098
13098
  this._updateSettings();
@@ -43299,7 +43299,7 @@ class Player {
43299
43299
  }
43300
43300
  }
43301
43301
 
43302
- var version$1 = "2.22.5";
43302
+ var version$1 = "2.22.7";
43303
43303
 
43304
43304
  var packages = {
43305
43305
  "node_modules/@clappr/core": {
@@ -43843,7 +43843,6 @@ class BottomGear extends UICorePlugin {
43843
43843
  .find('#gear-sub-menu-wrapper')
43844
43844
  .hide();
43845
43845
  // TODO make non-clickable when there are no items
43846
- mediaControl.putElement('gear', this.$el);
43847
43846
  setTimeout(() => {
43848
43847
  this.trigger(GearEvents.RENDERED);
43849
43848
  }, 0);
@@ -43873,7 +43872,8 @@ class BottomGear extends UICorePlugin {
43873
43872
  }
43874
43873
  onMediaControlRendered() {
43875
43874
  trace(`${T$f} onMediaControlRendered`);
43876
- this.render();
43875
+ const mediaControl = this.core.getPlugin('media_control');
43876
+ mediaControl.putElement('gear', this.$el);
43877
43877
  }
43878
43878
  }
43879
43879
 
@@ -46738,32 +46738,6 @@ function strtimeToMiliseconds(str) {
46738
46738
  }
46739
46739
  return (h + m + s);
46740
46740
  }
46741
- // TODO refactor
46742
- function isFullscreen(el) {
46743
- const video = el.nodeName === "video" ? el : el.querySelector('video');
46744
- if (!video) {
46745
- return false;
46746
- }
46747
- if (Browser.isiOS) {
46748
- return FullscreenIOS.isFullscreen(video);
46749
- }
46750
- return !!(document.fullscreenElement);
46751
- }
46752
- const FullscreenIOS = {
46753
- isFullscreen: function (el) {
46754
- try {
46755
- // @ts-ignore
46756
- if (el.webkitDisplayingFullscreen !== undefined) {
46757
- // @ts-ignore
46758
- return !!(el.webkitDisplayingFullscreen);
46759
- }
46760
- }
46761
- catch (e) {
46762
- reportError(e);
46763
- }
46764
- return false;
46765
- }
46766
- };
46767
46741
  function getPageX(event) {
46768
46742
  if (event.pageX) {
46769
46743
  return event.pageX;
@@ -47901,7 +47875,36 @@ function keyName(keyCode) {
47901
47875
  return KEY_NAMES_BY_CODE[keyCode] || '';
47902
47876
  }
47903
47877
 
47904
- 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 ([\"playpause\", \"playstop\", \"fullscreen\"].includes(setting)) {\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";
47878
+ const fullscreenEnabled = Utils.Fullscreen.fullscreenEnabled;
47879
+ function isFullscreen(el) {
47880
+ const video = el.nodeName === 'video'
47881
+ ? el
47882
+ : el.querySelector('video');
47883
+ if (!video) {
47884
+ return false;
47885
+ }
47886
+ if (Browser.isiOS) {
47887
+ return FullscreenIOS.isFullscreen(video);
47888
+ }
47889
+ return !!document.fullscreenElement;
47890
+ }
47891
+ const FullscreenIOS = {
47892
+ isFullscreen: function (el) {
47893
+ try {
47894
+ // @ts-ignore
47895
+ if (el.webkitDisplayingFullscreen !== undefined) {
47896
+ // @ts-ignore
47897
+ return !!el.webkitDisplayingFullscreen;
47898
+ }
47899
+ }
47900
+ catch (e) {
47901
+ reportError(e);
47902
+ }
47903
+ return false;
47904
+ },
47905
+ };
47906
+
47907
+ 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 <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 ([\"playpause\", \"playstop\", \"fullscreen\"].includes(setting)) {\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";
47905
47908
 
47906
47909
  const volumeMaxIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.187 7.71405C13.759 8.06405 13.697 8.69307 14.046 9.12107C14.662 9.87207 15 10.8941 15 11.9961C15 13.0991 14.662 14.1201 14.046 14.8711C13.697 15.2991 13.759 15.9291 14.187 16.2781C14.373 16.4311 14.597 16.5051 14.82 16.5051C15.109 16.5051 15.396 16.3801 15.594 16.1391C16.501 15.0301 17 13.5601 17 11.9961C17 10.4331 16.501 8.96207 15.594 7.85407C15.245 7.42707 14.614 7.36405 14.187 7.71405ZM19.772 5.14408C19.443 4.70008 18.816 4.60907 18.374 4.94007C17.931 5.27007 17.839 5.89605 18.169 6.33905C19.367 7.94705 20 9.90307 20 11.9961C20 14.0891 19.367 16.0451 18.169 17.6531C17.839 18.0971 17.931 18.7231 18.374 19.0531C18.553 19.1871 18.762 19.2511 18.97 19.2511C19.275 19.2511 19.576 19.1121 19.772 18.8491C21.23 16.8921 22 14.5231 22 11.9961C22 9.47007 21.23 7.10108 19.772 5.14408ZM12 3.85108V20.1421C12 20.4881 11.793 20.7971 11.473 20.9291C11.368 20.9721 11.258 20.9921 11.149 20.9921C10.926 20.9921 10.708 20.9031 10.544 20.7371L6.317 16.4431C6.038 16.1591 5.648 15.9961 5.249 15.9961H3.5C2.673 15.9961 2 15.3231 2 14.4961V9.49607C2 8.66907 2.673 7.99607 3.5 7.99607H5.249C5.648 7.99607 6.038 7.83308 6.317 7.54908L10.544 3.25507C10.787 3.00807 11.151 2.93206 11.473 3.06406C11.793 3.19506 12 3.50408 12 3.85108Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
47907
47910
 
@@ -47915,19 +47918,22 @@ const fullscreenOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
47915
47918
  // Use of this source code is governed by a BSD-style
47916
47919
  // license that can be found in the {@link https://github.com/clappr/clappr-plugins/blob/master/LICENSE | LICENSE}.
47917
47920
  const DEFAULT_SETTINGS = {
47918
- left: [],
47919
47921
  right: [
47922
+ 'audiotracks',
47923
+ 'cc',
47924
+ // 'dvr',
47925
+ // 'duration',
47920
47926
  'fullscreen',
47921
- 'pip',
47922
47927
  'gear',
47923
- 'cc',
47924
47928
  'multicamera',
47925
- // 'playbackrate',
47929
+ 'pip',
47926
47930
  'vr',
47927
- 'audiotracks',
47928
- ],
47931
+ ]};
47932
+ const INITIAL_SETTINGS = {
47933
+ left: [],
47934
+ right: [],
47929
47935
  default: [],
47930
- seekEnabled: true,
47936
+ seekEnabled: false,
47931
47937
  };
47932
47938
  const T$a = 'plugins.media_control';
47933
47939
  const LEFT_ORDER = [
@@ -47950,11 +47956,17 @@ function orderByOrderPattern(arr, order) {
47950
47956
  * @beta
47951
47957
  * @remarks
47952
47958
  * The methods exposed are to be used by the other plugins that extend the media control UI.
47959
+ *
47960
+ * Configuration options:
47961
+ *
47962
+ * - `mediaControl`: {@link MediaControlSettings} - specifies the allowed media control elements in each area
47963
+ *
47964
+ * - `persistConfig`: boolean - `common` option, makes the plugin persist the media control settings
47965
+ *
47966
+ * - `chromeless`: boolean
47953
47967
  */
47954
47968
  class MediaControl extends UICorePlugin {
47955
47969
  // private advertisementPlaying = false
47956
- customAreaElements = {};
47957
- customAreaHandler;
47958
47970
  buttonsColor = null;
47959
47971
  currentDurationValue = 0;
47960
47972
  currentPositionValue = 0;
@@ -47965,7 +47977,7 @@ class MediaControl extends UICorePlugin {
47965
47977
  displayedSeekBarPercentage = null;
47966
47978
  draggingSeekBar = false;
47967
47979
  draggingVolumeBar = false;
47968
- fullScreenOnVideoTagSupported = null;
47980
+ fullScreenOnVideoTagSupported = false;
47969
47981
  hideId = null;
47970
47982
  hideVolumeId = null;
47971
47983
  intendedVolume = 100;
@@ -47973,9 +47985,10 @@ class MediaControl extends UICorePlugin {
47973
47985
  kibo;
47974
47986
  lastMouseX = 0;
47975
47987
  lastMouseY = 0;
47988
+ needsUpdate = false;
47976
47989
  persistConfig;
47977
47990
  rendered = false;
47978
- settings = DEFAULT_SETTINGS;
47991
+ settings = INITIAL_SETTINGS;
47979
47992
  userDisabled = false;
47980
47993
  userKeepVisible = false;
47981
47994
  verticalVolume = false;
@@ -47986,7 +47999,6 @@ class MediaControl extends UICorePlugin {
47986
47999
  $multiCameraSelector = null;
47987
48000
  $playPauseToggle = null;
47988
48001
  $playStopToggle = null;
47989
- $playbackRate = null;
47990
48002
  $position = null;
47991
48003
  $seekBarContainer = null;
47992
48004
  $seekBarHover = null;
@@ -48200,7 +48212,8 @@ class MediaControl extends UICorePlugin {
48200
48212
  const video = this.core.activePlayback?.el;
48201
48213
  // video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
48202
48214
  // see https://github.com/clappr/clappr/issues/1127
48203
- if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
48215
+ if (!fullscreenEnabled() && video.webkitSupportsFullscreen) {
48216
+ // TODO sort out, use single utility function
48204
48217
  this.fullScreenOnVideoTagSupported = true;
48205
48218
  }
48206
48219
  this.updateSettings();
@@ -48432,22 +48445,21 @@ class MediaControl extends UICorePlugin {
48432
48445
  }
48433
48446
  }
48434
48447
  onActiveContainerChanged() {
48435
- this.fullScreenOnVideoTagSupported = null;
48448
+ this.fullScreenOnVideoTagSupported = false;
48436
48449
  // set the new container to match the volume of the last one
48437
48450
  this.setInitialVolume();
48438
48451
  this.changeTogglePlay();
48439
48452
  this.bindContainerEvents();
48453
+ // TODO remove?
48440
48454
  this.updateSettings();
48441
- // TODO remove
48442
- this.core.activeContainer.trigger(Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
48443
- // TODO test
48455
+ // TODO test, figure out if this is needed
48444
48456
  if (this.core.activeContainer.mediaControlDisabled) {
48445
48457
  this.disable();
48446
48458
  }
48447
48459
  else {
48448
48460
  this.enable();
48449
48461
  }
48450
- this.trigger(Events$1.MEDIACONTROL_CONTAINERCHANGED); // TODO check
48462
+ this.trigger(Events$1.MEDIACONTROL_CONTAINERCHANGED); // TODO figure out
48451
48463
  if (this.core.activeContainer.$el) {
48452
48464
  this.core.activeContainer.$el.addClass('container-skin-1');
48453
48465
  }
@@ -48618,11 +48630,13 @@ class MediaControl extends UICorePlugin {
48618
48630
  }
48619
48631
  }
48620
48632
  updateSettings() {
48633
+ trace(`${T$a} updateSettings`, { settings: this.settings });
48621
48634
  const newSettings = $.extend(true, {
48622
48635
  left: [],
48623
48636
  default: [],
48624
48637
  right: [],
48625
48638
  }, this.core.activeContainer.settings);
48639
+ trace(`${T$a} updateSettings`, { newSettings });
48626
48640
  // TODO make order controlled via CSS
48627
48641
  newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
48628
48642
  if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
@@ -48630,10 +48644,15 @@ class MediaControl extends UICorePlugin {
48630
48644
  newSettings.left.push('dvr');
48631
48645
  }
48632
48646
  // actual order of the items appear rendered is controlled by CSS
48633
- newSettings.right = DEFAULT_SETTINGS.right;
48647
+ newSettings.right = DEFAULT_SETTINGS.right; // TODO get from the options
48634
48648
  if ((!this.fullScreenOnVideoTagSupported &&
48635
- !Fullscreen.fullscreenEnabled()) ||
48649
+ !fullscreenEnabled()) ||
48636
48650
  this.options.fullscreenDisable) {
48651
+ trace(`${T$a} updateSettings removing fullscreen`, {
48652
+ supported: this.fullScreenOnVideoTagSupported,
48653
+ enabled: Fullscreen.fullscreenEnabled(),
48654
+ optionsDisable: this.options.fullscreenDisable,
48655
+ });
48637
48656
  // remove fullscreen from settings if it is not available
48638
48657
  removeArrayItem(newSettings.default, 'fullscreen');
48639
48658
  removeArrayItem(newSettings.left, 'fullscreen');
@@ -48648,6 +48667,7 @@ class MediaControl extends UICorePlugin {
48648
48667
  const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
48649
48668
  if (settingsChanged) {
48650
48669
  this.settings = newSettings;
48670
+ this.needsUpdate = true;
48651
48671
  this.render();
48652
48672
  }
48653
48673
  }
@@ -48672,7 +48692,6 @@ class MediaControl extends UICorePlugin {
48672
48692
  this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
48673
48693
  this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
48674
48694
  this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
48675
- this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
48676
48695
  this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
48677
48696
  this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
48678
48697
  this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
@@ -48704,8 +48723,6 @@ class MediaControl extends UICorePlugin {
48704
48723
  return null;
48705
48724
  case 'clipText':
48706
48725
  return this.$clipText;
48707
- case 'playbackRate':
48708
- return this.$playbackRate;
48709
48726
  case 'seekBarContainer':
48710
48727
  return this.$seekBarContainer;
48711
48728
  }
@@ -48729,13 +48746,6 @@ class MediaControl extends UICorePlugin {
48729
48746
  return;
48730
48747
  }
48731
48748
  }
48732
- handleCustomArea(handler) {
48733
- this.customAreaHandler = handler;
48734
- Object.entries(this.customAreaElements).forEach(([name, element]) => {
48735
- handler(name, element);
48736
- });
48737
- this.customAreaElements = {};
48738
- }
48739
48749
  /**
48740
48750
  * Toggle the visibility of a media control element
48741
48751
  * @param name - The name of the media control element
@@ -48833,8 +48843,8 @@ class MediaControl extends UICorePlugin {
48833
48843
  keys.forEach((i) => {
48834
48844
  this.bindKeyAndShow(i, () => {
48835
48845
  this.settings.seekEnabled &&
48836
- this.container &&
48837
- this.container.seekPercentage(Number(i) * 10);
48846
+ this.core.activeContainer &&
48847
+ this.core.activeContainer.seekPercentage(Number(i) * 10);
48838
48848
  return false;
48839
48849
  });
48840
48850
  });
@@ -48900,10 +48910,12 @@ class MediaControl extends UICorePlugin {
48900
48910
  * @internal
48901
48911
  */
48902
48912
  render() {
48903
- trace(`${T$a} render`);
48913
+ trace(`${T$a} render`, { needsUpdate: this.needsUpdate });
48914
+ if (!this.needsUpdate) {
48915
+ return this;
48916
+ }
48904
48917
  const timeout = this.options.hideMediaControlDelay || 2000;
48905
- const html = MediaControl.template({ settings: this.settings ?? {} });
48906
- this.$el.html(html);
48918
+ this.$el.html(MediaControl.template({ settings: this.settings }));
48907
48919
  // const style = Styler.getStyleFor(mediaControlStyle, { baseUrl: this.options.baseUrl });
48908
48920
  // this.$el.append(style[0]);
48909
48921
  this.createCachedElements();
@@ -48949,7 +48961,8 @@ class MediaControl extends UICorePlugin {
48949
48961
  this.core.$el.append(this.el);
48950
48962
  this.rendered = true;
48951
48963
  this.updateVolumeUI();
48952
- // TODO setTimeout
48964
+ this.needsUpdate = false;
48965
+ // TODO setTimeout?
48953
48966
  this.trigger(Events$1.MEDIACONTROL_RENDERED);
48954
48967
  return this;
48955
48968
  }
@@ -49015,6 +49028,7 @@ class MediaControl extends UICorePlugin {
49015
49028
  element.el.css({ 'pointer-events': 'none' });
49016
49029
  });
49017
49030
  }
49031
+ // TODO drop
49018
49032
  isSeekEnabledForHtml5Playback() {
49019
49033
  if (this.core.getPlaybackType() === Playback.LIVE) {
49020
49034
  return this.options.dvrEnabled;
@@ -49572,12 +49586,11 @@ const T$7 = 'plugins.playback_rate';
49572
49586
  * { value: 1, label: '1x' },
49573
49587
  * ],
49574
49588
  * defaultValue: 1,
49575
- * } as PlaybackRateSettings,
49589
+ * },
49576
49590
  * })
49577
49591
  * ```
49578
49592
  */
49579
49593
  class PlaybackRate extends UICorePlugin {
49580
- playbackRates = DEFAULT_PLAYBACK_RATES;
49581
49594
  // Saved when an ad starts to restore after it finishes
49582
49595
  // private prevSelectedRate: string | undefined
49583
49596
  selectedRate = DEFAULT_PLAYBACK_RATE;
@@ -49597,10 +49610,12 @@ class PlaybackRate extends UICorePlugin {
49597
49610
  static listTemplate = tmpl(listHtml$1);
49598
49611
  constructor(core) {
49599
49612
  super(core);
49600
- this.playbackRates =
49601
- core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
49602
- this.selectedRate =
49603
- core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
49613
+ if (this.core.options.playbackRate?.defaultValue) {
49614
+ this.setSelectedRate(this.core.options.playbackRate.defaultValue);
49615
+ }
49616
+ }
49617
+ get playbackRates() {
49618
+ return this.core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
49604
49619
  }
49605
49620
  /**
49606
49621
  * @internal
@@ -49648,10 +49663,15 @@ class PlaybackRate extends UICorePlugin {
49648
49663
  }
49649
49664
  onGearRendered() {
49650
49665
  trace(`${T$7} onGearRendered`);
49651
- this.addGearItem();
49666
+ this.mount();
49652
49667
  }
49653
- addGearItem() {
49654
- trace(`${T$7} addGearItem`);
49668
+ mount() {
49669
+ trace(`${T$7} mount`, {
49670
+ shouldMount: this.shouldMount(),
49671
+ });
49672
+ if (!this.shouldMount()) {
49673
+ return;
49674
+ }
49655
49675
  this.core
49656
49676
  .getPlugin('bottom_gear')
49657
49677
  ?.addItem('rate', this.$el)
@@ -49684,7 +49704,7 @@ class PlaybackRate extends UICorePlugin {
49684
49704
  });
49685
49705
  }
49686
49706
  }
49687
- shouldRender() {
49707
+ shouldMount() {
49688
49708
  if (!this.core.activePlayback) {
49689
49709
  return false;
49690
49710
  }
@@ -49699,11 +49719,8 @@ class PlaybackRate extends UICorePlugin {
49699
49719
  */
49700
49720
  render() {
49701
49721
  trace(`${T$7} render`, {
49702
- shouldRender: this.shouldRender(),
49722
+ shouldMount: this.shouldMount(),
49703
49723
  });
49704
- if (!this.shouldRender()) {
49705
- return this;
49706
- }
49707
49724
  this.$el.html(PlaybackRate.listTemplate({
49708
49725
  arrowLeftIcon,
49709
49726
  checkIcon,
@@ -49711,7 +49728,7 @@ class PlaybackRate extends UICorePlugin {
49711
49728
  i18n: this.core.i18n,
49712
49729
  playbackRates: this.playbackRates,
49713
49730
  }));
49714
- this.addGearItem();
49731
+ this.mount();
49715
49732
  return this;
49716
49733
  }
49717
49734
  // private onStartAd() {
@@ -49734,11 +49751,21 @@ class PlaybackRate extends UICorePlugin {
49734
49751
  this.resetPlaybackRate();
49735
49752
  }
49736
49753
  else {
49737
- this.setSelectedRate(this.selectedRate);
49754
+ this.syncRate();
49738
49755
  }
49739
49756
  }
49757
+ syncRate() {
49758
+ trace(`${T$7} syncRate`, {
49759
+ selectedRate: this.selectedRate,
49760
+ });
49761
+ this.core.activePlayback?.setPlaybackRate(this.selectedRate);
49762
+ }
49740
49763
  resetPlaybackRate() {
49741
- this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
49764
+ trace(`${T$7} resetPlaybackRate`, {
49765
+ selectedRate: this.selectedRate,
49766
+ });
49767
+ this.core.activePlayback?.setPlaybackRate(DEFAULT_PLAYBACK_RATE);
49768
+ this.selectedRate = DEFAULT_PLAYBACK_RATE;
49742
49769
  }
49743
49770
  onStop() { }
49744
49771
  onSelect(event) {
@@ -49746,8 +49773,6 @@ class PlaybackRate extends UICorePlugin {
49746
49773
  const rate = parseFloat(event.currentTarget.dataset.rate || '');
49747
49774
  if (rate) {
49748
49775
  this.setSelectedRate(rate);
49749
- this.highlightCurrentRate();
49750
- this.updateGearOptionLabel();
49751
49776
  }
49752
49777
  return false;
49753
49778
  }
@@ -49757,14 +49782,23 @@ class PlaybackRate extends UICorePlugin {
49757
49782
  }, 0);
49758
49783
  }
49759
49784
  setSelectedRate(rate) {
49760
- this.core.activePlayback?.setPlaybackRate(rate);
49785
+ if (rate === this.selectedRate) {
49786
+ return;
49787
+ }
49761
49788
  this.selectedRate = rate;
49789
+ this.syncRate();
49790
+ this.highlightCurrentRate();
49791
+ this.updateGearOptionLabel();
49762
49792
  }
49763
49793
  getTitle() {
49764
- return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
49765
- `x${this.selectedRate}`);
49794
+ const rate = this.selectedRate;
49795
+ return (this.playbackRates.find((r) => r.value === rate)?.label ||
49796
+ `x${rate}`);
49766
49797
  }
49767
49798
  highlightCurrentRate() {
49799
+ trace(`${T$7} highlightCurrentRate`, {
49800
+ selectedRate: this.selectedRate,
49801
+ });
49768
49802
  this.allRateElements().removeClass('current');
49769
49803
  this.allRateElements().find('a').removeClass('gcore-skin-active');
49770
49804
  this.rateElement(this.selectedRate)
@@ -49773,8 +49807,10 @@ class PlaybackRate extends UICorePlugin {
49773
49807
  .addClass('gcore-skin-active');
49774
49808
  }
49775
49809
  updateGearOptionLabel() {
49776
- trace(`${T$7} updateGearOptionLabel`);
49777
- this.addGearItem();
49810
+ trace(`${T$7} updateGearOptionLabel`, {
49811
+ selectedRate: this.selectedRate,
49812
+ });
49813
+ this.mount();
49778
49814
  }
49779
49815
  }
49780
49816