@gcorevideo/player 2.22.5 → 2.22.8

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 +7 -2
  3. package/dist/index.css +881 -881
  4. package/dist/index.js +132 -91
  5. package/dist/plugins/index.css +418 -418
  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 +6 -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 +6 -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
@@ -13036,6 +13036,11 @@ class DashPlayback extends BasePlayback {
13036
13036
  trace(`${T$k} dvrEnable no dash player instance`);
13037
13037
  return false;
13038
13038
  }
13039
+ trace(`${T$k} get.dvrEnabled`, {
13040
+ dvrWindowSize: this._dash?.getDVRWindowSize(),
13041
+ minDvrSize: this._minDvrSize,
13042
+ playbackType: this.getPlaybackType(),
13043
+ });
13039
13044
  return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
13040
13045
  this.getPlaybackType() === Playback.LIVE);
13041
13046
  }
@@ -13091,8 +13096,8 @@ class DashPlayback extends BasePlayback {
13091
13096
  return super.destroy();
13092
13097
  }
13093
13098
  _updatePlaybackType() {
13094
- assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to update the playback type');
13095
13099
  const prevPlaybackType = this._playbackType;
13100
+ // @ts-ignore
13096
13101
  this._playbackType = this._dash.isDynamic() ? Playback.LIVE : Playback.VOD;
13097
13102
  if (prevPlaybackType !== this._playbackType) {
13098
13103
  this._updateSettings();
@@ -43299,7 +43304,7 @@ class Player {
43299
43304
  }
43300
43305
  }
43301
43306
 
43302
- var version$1 = "2.22.5";
43307
+ var version$1 = "2.22.8";
43303
43308
 
43304
43309
  var packages = {
43305
43310
  "node_modules/@clappr/core": {
@@ -43843,7 +43848,6 @@ class BottomGear extends UICorePlugin {
43843
43848
  .find('#gear-sub-menu-wrapper')
43844
43849
  .hide();
43845
43850
  // TODO make non-clickable when there are no items
43846
- mediaControl.putElement('gear', this.$el);
43847
43851
  setTimeout(() => {
43848
43852
  this.trigger(GearEvents.RENDERED);
43849
43853
  }, 0);
@@ -43873,7 +43877,8 @@ class BottomGear extends UICorePlugin {
43873
43877
  }
43874
43878
  onMediaControlRendered() {
43875
43879
  trace(`${T$f} onMediaControlRendered`);
43876
- this.render();
43880
+ const mediaControl = this.core.getPlugin('media_control');
43881
+ mediaControl.putElement('gear', this.$el);
43877
43882
  }
43878
43883
  }
43879
43884
 
@@ -46738,32 +46743,6 @@ function strtimeToMiliseconds(str) {
46738
46743
  }
46739
46744
  return (h + m + s);
46740
46745
  }
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
46746
  function getPageX(event) {
46768
46747
  if (event.pageX) {
46769
46748
  return event.pageX;
@@ -47901,7 +47880,36 @@ function keyName(keyCode) {
47901
47880
  return KEY_NAMES_BY_CODE[keyCode] || '';
47902
47881
  }
47903
47882
 
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";
47883
+ const fullscreenEnabled = Utils.Fullscreen.fullscreenEnabled;
47884
+ function isFullscreen(el) {
47885
+ const video = el.nodeName === 'video'
47886
+ ? el
47887
+ : el.querySelector('video');
47888
+ if (!video) {
47889
+ return false;
47890
+ }
47891
+ if (Browser.isiOS) {
47892
+ return FullscreenIOS.isFullscreen(video);
47893
+ }
47894
+ return !!document.fullscreenElement;
47895
+ }
47896
+ const FullscreenIOS = {
47897
+ isFullscreen: function (el) {
47898
+ try {
47899
+ // @ts-ignore
47900
+ if (el.webkitDisplayingFullscreen !== undefined) {
47901
+ // @ts-ignore
47902
+ return !!el.webkitDisplayingFullscreen;
47903
+ }
47904
+ }
47905
+ catch (e) {
47906
+ reportError(e);
47907
+ }
47908
+ return false;
47909
+ },
47910
+ };
47911
+
47912
+ 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
47913
 
47906
47914
  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
47915
 
@@ -47915,19 +47923,22 @@ const fullscreenOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
47915
47923
  // Use of this source code is governed by a BSD-style
47916
47924
  // license that can be found in the {@link https://github.com/clappr/clappr-plugins/blob/master/LICENSE | LICENSE}.
47917
47925
  const DEFAULT_SETTINGS = {
47918
- left: [],
47919
47926
  right: [
47927
+ 'audiotracks',
47928
+ 'cc',
47929
+ // 'dvr',
47930
+ // 'duration',
47920
47931
  'fullscreen',
47921
- 'pip',
47922
47932
  'gear',
47923
- 'cc',
47924
47933
  'multicamera',
47925
- // 'playbackrate',
47934
+ 'pip',
47926
47935
  'vr',
47927
- 'audiotracks',
47928
- ],
47936
+ ]};
47937
+ const INITIAL_SETTINGS = {
47938
+ left: [],
47939
+ right: [],
47929
47940
  default: [],
47930
- seekEnabled: true,
47941
+ seekEnabled: false,
47931
47942
  };
47932
47943
  const T$a = 'plugins.media_control';
47933
47944
  const LEFT_ORDER = [
@@ -47950,11 +47961,17 @@ function orderByOrderPattern(arr, order) {
47950
47961
  * @beta
47951
47962
  * @remarks
47952
47963
  * The methods exposed are to be used by the other plugins that extend the media control UI.
47964
+ *
47965
+ * Configuration options:
47966
+ *
47967
+ * - `mediaControl`: {@link MediaControlSettings} - specifies the allowed media control elements in each area
47968
+ *
47969
+ * - `persistConfig`: boolean - `common` option, makes the plugin persist the media control settings
47970
+ *
47971
+ * - `chromeless`: boolean
47953
47972
  */
47954
47973
  class MediaControl extends UICorePlugin {
47955
47974
  // private advertisementPlaying = false
47956
- customAreaElements = {};
47957
- customAreaHandler;
47958
47975
  buttonsColor = null;
47959
47976
  currentDurationValue = 0;
47960
47977
  currentPositionValue = 0;
@@ -47965,7 +47982,7 @@ class MediaControl extends UICorePlugin {
47965
47982
  displayedSeekBarPercentage = null;
47966
47983
  draggingSeekBar = false;
47967
47984
  draggingVolumeBar = false;
47968
- fullScreenOnVideoTagSupported = null;
47985
+ fullScreenOnVideoTagSupported = false;
47969
47986
  hideId = null;
47970
47987
  hideVolumeId = null;
47971
47988
  intendedVolume = 100;
@@ -47973,9 +47990,10 @@ class MediaControl extends UICorePlugin {
47973
47990
  kibo;
47974
47991
  lastMouseX = 0;
47975
47992
  lastMouseY = 0;
47993
+ needsUpdate = false;
47976
47994
  persistConfig;
47977
47995
  rendered = false;
47978
- settings = DEFAULT_SETTINGS;
47996
+ settings = INITIAL_SETTINGS;
47979
47997
  userDisabled = false;
47980
47998
  userKeepVisible = false;
47981
47999
  verticalVolume = false;
@@ -47986,7 +48004,6 @@ class MediaControl extends UICorePlugin {
47986
48004
  $multiCameraSelector = null;
47987
48005
  $playPauseToggle = null;
47988
48006
  $playStopToggle = null;
47989
- $playbackRate = null;
47990
48007
  $position = null;
47991
48008
  $seekBarContainer = null;
47992
48009
  $seekBarHover = null;
@@ -48200,7 +48217,8 @@ class MediaControl extends UICorePlugin {
48200
48217
  const video = this.core.activePlayback?.el;
48201
48218
  // video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
48202
48219
  // see https://github.com/clappr/clappr/issues/1127
48203
- if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
48220
+ if (!fullscreenEnabled() && video.webkitSupportsFullscreen) {
48221
+ // TODO sort out, use single utility function
48204
48222
  this.fullScreenOnVideoTagSupported = true;
48205
48223
  }
48206
48224
  this.updateSettings();
@@ -48432,22 +48450,21 @@ class MediaControl extends UICorePlugin {
48432
48450
  }
48433
48451
  }
48434
48452
  onActiveContainerChanged() {
48435
- this.fullScreenOnVideoTagSupported = null;
48453
+ this.fullScreenOnVideoTagSupported = false;
48436
48454
  // set the new container to match the volume of the last one
48437
48455
  this.setInitialVolume();
48438
48456
  this.changeTogglePlay();
48439
48457
  this.bindContainerEvents();
48458
+ // TODO remove?
48440
48459
  this.updateSettings();
48441
- // TODO remove
48442
- this.core.activeContainer.trigger(Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
48443
- // TODO test
48460
+ // TODO test, figure out if this is needed
48444
48461
  if (this.core.activeContainer.mediaControlDisabled) {
48445
48462
  this.disable();
48446
48463
  }
48447
48464
  else {
48448
48465
  this.enable();
48449
48466
  }
48450
- this.trigger(Events$1.MEDIACONTROL_CONTAINERCHANGED); // TODO check
48467
+ this.trigger(Events$1.MEDIACONTROL_CONTAINERCHANGED); // TODO figure out
48451
48468
  if (this.core.activeContainer.$el) {
48452
48469
  this.core.activeContainer.$el.addClass('container-skin-1');
48453
48470
  }
@@ -48618,11 +48635,13 @@ class MediaControl extends UICorePlugin {
48618
48635
  }
48619
48636
  }
48620
48637
  updateSettings() {
48638
+ trace(`${T$a} updateSettings`, { settings: this.settings });
48621
48639
  const newSettings = $.extend(true, {
48622
48640
  left: [],
48623
48641
  default: [],
48624
48642
  right: [],
48625
48643
  }, this.core.activeContainer.settings);
48644
+ trace(`${T$a} updateSettings`, { newSettings });
48626
48645
  // TODO make order controlled via CSS
48627
48646
  newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
48628
48647
  if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
@@ -48630,10 +48649,15 @@ class MediaControl extends UICorePlugin {
48630
48649
  newSettings.left.push('dvr');
48631
48650
  }
48632
48651
  // actual order of the items appear rendered is controlled by CSS
48633
- newSettings.right = DEFAULT_SETTINGS.right;
48652
+ newSettings.right = DEFAULT_SETTINGS.right; // TODO get from the options
48634
48653
  if ((!this.fullScreenOnVideoTagSupported &&
48635
- !Fullscreen.fullscreenEnabled()) ||
48654
+ !fullscreenEnabled()) ||
48636
48655
  this.options.fullscreenDisable) {
48656
+ trace(`${T$a} updateSettings removing fullscreen`, {
48657
+ supported: this.fullScreenOnVideoTagSupported,
48658
+ enabled: Fullscreen.fullscreenEnabled(),
48659
+ optionsDisable: this.options.fullscreenDisable,
48660
+ });
48637
48661
  // remove fullscreen from settings if it is not available
48638
48662
  removeArrayItem(newSettings.default, 'fullscreen');
48639
48663
  removeArrayItem(newSettings.left, 'fullscreen');
@@ -48648,6 +48672,7 @@ class MediaControl extends UICorePlugin {
48648
48672
  const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
48649
48673
  if (settingsChanged) {
48650
48674
  this.settings = newSettings;
48675
+ this.needsUpdate = true;
48651
48676
  this.render();
48652
48677
  }
48653
48678
  }
@@ -48672,7 +48697,6 @@ class MediaControl extends UICorePlugin {
48672
48697
  this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
48673
48698
  this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
48674
48699
  this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
48675
- this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
48676
48700
  this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
48677
48701
  this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
48678
48702
  this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
@@ -48704,8 +48728,6 @@ class MediaControl extends UICorePlugin {
48704
48728
  return null;
48705
48729
  case 'clipText':
48706
48730
  return this.$clipText;
48707
- case 'playbackRate':
48708
- return this.$playbackRate;
48709
48731
  case 'seekBarContainer':
48710
48732
  return this.$seekBarContainer;
48711
48733
  }
@@ -48729,13 +48751,6 @@ class MediaControl extends UICorePlugin {
48729
48751
  return;
48730
48752
  }
48731
48753
  }
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
48754
  /**
48740
48755
  * Toggle the visibility of a media control element
48741
48756
  * @param name - The name of the media control element
@@ -48833,8 +48848,8 @@ class MediaControl extends UICorePlugin {
48833
48848
  keys.forEach((i) => {
48834
48849
  this.bindKeyAndShow(i, () => {
48835
48850
  this.settings.seekEnabled &&
48836
- this.container &&
48837
- this.container.seekPercentage(Number(i) * 10);
48851
+ this.core.activeContainer &&
48852
+ this.core.activeContainer.seekPercentage(Number(i) * 10);
48838
48853
  return false;
48839
48854
  });
48840
48855
  });
@@ -48900,10 +48915,12 @@ class MediaControl extends UICorePlugin {
48900
48915
  * @internal
48901
48916
  */
48902
48917
  render() {
48903
- trace(`${T$a} render`);
48918
+ trace(`${T$a} render`, { needsUpdate: this.needsUpdate });
48919
+ if (!this.needsUpdate) {
48920
+ return this;
48921
+ }
48904
48922
  const timeout = this.options.hideMediaControlDelay || 2000;
48905
- const html = MediaControl.template({ settings: this.settings ?? {} });
48906
- this.$el.html(html);
48923
+ this.$el.html(MediaControl.template({ settings: this.settings }));
48907
48924
  // const style = Styler.getStyleFor(mediaControlStyle, { baseUrl: this.options.baseUrl });
48908
48925
  // this.$el.append(style[0]);
48909
48926
  this.createCachedElements();
@@ -48949,7 +48966,8 @@ class MediaControl extends UICorePlugin {
48949
48966
  this.core.$el.append(this.el);
48950
48967
  this.rendered = true;
48951
48968
  this.updateVolumeUI();
48952
- // TODO setTimeout
48969
+ this.needsUpdate = false;
48970
+ // TODO setTimeout?
48953
48971
  this.trigger(Events$1.MEDIACONTROL_RENDERED);
48954
48972
  return this;
48955
48973
  }
@@ -49015,6 +49033,7 @@ class MediaControl extends UICorePlugin {
49015
49033
  element.el.css({ 'pointer-events': 'none' });
49016
49034
  });
49017
49035
  }
49036
+ // TODO drop
49018
49037
  isSeekEnabledForHtml5Playback() {
49019
49038
  if (this.core.getPlaybackType() === Playback.LIVE) {
49020
49039
  return this.options.dvrEnabled;
@@ -49572,12 +49591,11 @@ const T$7 = 'plugins.playback_rate';
49572
49591
  * { value: 1, label: '1x' },
49573
49592
  * ],
49574
49593
  * defaultValue: 1,
49575
- * } as PlaybackRateSettings,
49594
+ * },
49576
49595
  * })
49577
49596
  * ```
49578
49597
  */
49579
49598
  class PlaybackRate extends UICorePlugin {
49580
- playbackRates = DEFAULT_PLAYBACK_RATES;
49581
49599
  // Saved when an ad starts to restore after it finishes
49582
49600
  // private prevSelectedRate: string | undefined
49583
49601
  selectedRate = DEFAULT_PLAYBACK_RATE;
@@ -49597,10 +49615,12 @@ class PlaybackRate extends UICorePlugin {
49597
49615
  static listTemplate = tmpl(listHtml$1);
49598
49616
  constructor(core) {
49599
49617
  super(core);
49600
- this.playbackRates =
49601
- core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
49602
- this.selectedRate =
49603
- core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
49618
+ if (this.core.options.playbackRate?.defaultValue) {
49619
+ this.setSelectedRate(this.core.options.playbackRate.defaultValue);
49620
+ }
49621
+ }
49622
+ get playbackRates() {
49623
+ return this.core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
49604
49624
  }
49605
49625
  /**
49606
49626
  * @internal
@@ -49648,10 +49668,15 @@ class PlaybackRate extends UICorePlugin {
49648
49668
  }
49649
49669
  onGearRendered() {
49650
49670
  trace(`${T$7} onGearRendered`);
49651
- this.addGearItem();
49671
+ this.mount();
49652
49672
  }
49653
- addGearItem() {
49654
- trace(`${T$7} addGearItem`);
49673
+ mount() {
49674
+ trace(`${T$7} mount`, {
49675
+ shouldMount: this.shouldMount(),
49676
+ });
49677
+ if (!this.shouldMount()) {
49678
+ return;
49679
+ }
49655
49680
  this.core
49656
49681
  .getPlugin('bottom_gear')
49657
49682
  ?.addItem('rate', this.$el)
@@ -49684,7 +49709,7 @@ class PlaybackRate extends UICorePlugin {
49684
49709
  });
49685
49710
  }
49686
49711
  }
49687
- shouldRender() {
49712
+ shouldMount() {
49688
49713
  if (!this.core.activePlayback) {
49689
49714
  return false;
49690
49715
  }
@@ -49699,11 +49724,8 @@ class PlaybackRate extends UICorePlugin {
49699
49724
  */
49700
49725
  render() {
49701
49726
  trace(`${T$7} render`, {
49702
- shouldRender: this.shouldRender(),
49727
+ shouldMount: this.shouldMount(),
49703
49728
  });
49704
- if (!this.shouldRender()) {
49705
- return this;
49706
- }
49707
49729
  this.$el.html(PlaybackRate.listTemplate({
49708
49730
  arrowLeftIcon,
49709
49731
  checkIcon,
@@ -49711,7 +49733,7 @@ class PlaybackRate extends UICorePlugin {
49711
49733
  i18n: this.core.i18n,
49712
49734
  playbackRates: this.playbackRates,
49713
49735
  }));
49714
- this.addGearItem();
49736
+ this.mount();
49715
49737
  return this;
49716
49738
  }
49717
49739
  // private onStartAd() {
@@ -49734,11 +49756,21 @@ class PlaybackRate extends UICorePlugin {
49734
49756
  this.resetPlaybackRate();
49735
49757
  }
49736
49758
  else {
49737
- this.setSelectedRate(this.selectedRate);
49759
+ this.syncRate();
49738
49760
  }
49739
49761
  }
49762
+ syncRate() {
49763
+ trace(`${T$7} syncRate`, {
49764
+ selectedRate: this.selectedRate,
49765
+ });
49766
+ this.core.activePlayback?.setPlaybackRate(this.selectedRate);
49767
+ }
49740
49768
  resetPlaybackRate() {
49741
- this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
49769
+ trace(`${T$7} resetPlaybackRate`, {
49770
+ selectedRate: this.selectedRate,
49771
+ });
49772
+ this.core.activePlayback?.setPlaybackRate(DEFAULT_PLAYBACK_RATE);
49773
+ this.selectedRate = DEFAULT_PLAYBACK_RATE;
49742
49774
  }
49743
49775
  onStop() { }
49744
49776
  onSelect(event) {
@@ -49746,8 +49778,6 @@ class PlaybackRate extends UICorePlugin {
49746
49778
  const rate = parseFloat(event.currentTarget.dataset.rate || '');
49747
49779
  if (rate) {
49748
49780
  this.setSelectedRate(rate);
49749
- this.highlightCurrentRate();
49750
- this.updateGearOptionLabel();
49751
49781
  }
49752
49782
  return false;
49753
49783
  }
@@ -49757,14 +49787,23 @@ class PlaybackRate extends UICorePlugin {
49757
49787
  }, 0);
49758
49788
  }
49759
49789
  setSelectedRate(rate) {
49760
- this.core.activePlayback?.setPlaybackRate(rate);
49790
+ if (rate === this.selectedRate) {
49791
+ return;
49792
+ }
49761
49793
  this.selectedRate = rate;
49794
+ this.syncRate();
49795
+ this.highlightCurrentRate();
49796
+ this.updateGearOptionLabel();
49762
49797
  }
49763
49798
  getTitle() {
49764
- return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
49765
- `x${this.selectedRate}`);
49799
+ const rate = this.selectedRate;
49800
+ return (this.playbackRates.find((r) => r.value === rate)?.label ||
49801
+ `x${rate}`);
49766
49802
  }
49767
49803
  highlightCurrentRate() {
49804
+ trace(`${T$7} highlightCurrentRate`, {
49805
+ selectedRate: this.selectedRate,
49806
+ });
49768
49807
  this.allRateElements().removeClass('current');
49769
49808
  this.allRateElements().find('a').removeClass('gcore-skin-active');
49770
49809
  this.rateElement(this.selectedRate)
@@ -49773,8 +49812,10 @@ class PlaybackRate extends UICorePlugin {
49773
49812
  .addClass('gcore-skin-active');
49774
49813
  }
49775
49814
  updateGearOptionLabel() {
49776
- trace(`${T$7} updateGearOptionLabel`);
49777
- this.addGearItem();
49815
+ trace(`${T$7} updateGearOptionLabel`, {
49816
+ selectedRate: this.selectedRate,
49817
+ });
49818
+ this.mount();
49778
49819
  }
49779
49820
  }
49780
49821