@gcorevideo/player 2.24.11 → 2.24.13

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 (47) hide show
  1. package/README.md +1 -0
  2. package/assets/dvr-controls/dvr_controls.scss +43 -80
  3. package/assets/dvr-controls/index.ejs +8 -2
  4. package/assets/media-control/width370.scss +1 -1
  5. package/dist/core.js +18 -17
  6. package/dist/index.css +516 -542
  7. package/dist/index.embed.js +91 -65
  8. package/dist/index.js +156 -128
  9. package/dist/player.d.ts +3264 -0
  10. package/lib/playback/dash-playback/DashPlayback.d.ts +2 -0
  11. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  12. package/lib/playback/dash-playback/DashPlayback.js +17 -11
  13. package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
  14. package/lib/playback/hls-playback/HlsPlayback.js +0 -5
  15. package/lib/plugins/audio-selector/AudioTracks.js +1 -1
  16. package/lib/plugins/bottom-gear/BottomGear.js +1 -1
  17. package/lib/plugins/clips/Clips.js +1 -1
  18. package/lib/plugins/dvr-controls/DvrControls.d.ts +3 -3
  19. package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
  20. package/lib/plugins/dvr-controls/DvrControls.js +14 -12
  21. package/lib/plugins/media-control/MediaControl.d.ts +14 -5
  22. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  23. package/lib/plugins/media-control/MediaControl.js +55 -29
  24. package/lib/plugins/picture-in-picture/PictureInPicture.js +1 -1
  25. package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
  26. package/lib/testUtils.d.ts.map +1 -1
  27. package/lib/testUtils.js +2 -0
  28. package/package.json +1 -1
  29. package/src/playback/dash-playback/DashPlayback.ts +20 -13
  30. package/src/playback/hls-playback/HlsPlayback.ts +3 -8
  31. package/src/plugins/audio-selector/AudioTracks.ts +1 -1
  32. package/src/plugins/audio-selector/__tests__/AudioTracks.test.ts +2 -2
  33. package/src/plugins/bottom-gear/BottomGear.ts +1 -1
  34. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +2 -2
  35. package/src/plugins/clips/Clips.ts +1 -1
  36. package/src/plugins/clips/__tests__/Clips.test.ts +1 -1
  37. package/src/plugins/dvr-controls/DvrControls.ts +14 -14
  38. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +20 -17
  39. package/src/plugins/dvr-controls/__tests__/__snapshots__/DvrControls.test.ts.snap +4 -2
  40. package/src/plugins/media-control/MediaControl.ts +69 -35
  41. package/src/plugins/media-control/__tests__/MediaControl.test.ts +128 -112
  42. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +227 -24
  43. package/src/plugins/picture-in-picture/PictureInPicture.ts +1 -1
  44. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  45. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
  46. package/src/testUtils.ts +2 -0
  47. package/tsconfig.tsbuildinfo +1 -1
package/dist/index.js CHANGED
@@ -12680,7 +12680,7 @@ var PlaybackEvents;
12680
12680
  // https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
12681
12681
  const AUTO$1 = -1;
12682
12682
  const { now: now$2 } = Utils;
12683
- const T$n = 'playback.dash';
12683
+ const T$o = 'playback.dash';
12684
12684
  class DashPlayback extends BasePlayback {
12685
12685
  _levels = null;
12686
12686
  _currentLevel = null;
@@ -12871,10 +12871,9 @@ class DashPlayback extends BasePlayback {
12871
12871
  return super.render();
12872
12872
  }
12873
12873
  _ready() {
12874
- this._isReadyState = true;
12875
- this.trigger(Events$1.PLAYBACK_READY, this.name);
12874
+ !this._dash && this._setup();
12875
+ super._ready();
12876
12876
  }
12877
- // override
12878
12877
  _setupSrc() {
12879
12878
  // this playback manages the src on the video element itself
12880
12879
  }
@@ -12955,10 +12954,10 @@ class DashPlayback extends BasePlayback {
12955
12954
  }
12956
12955
  _onPlaybackError = (event) => {
12957
12956
  // TODO
12958
- trace(`${T$n} _onPlaybackError`, { event });
12957
+ trace(`${T$o} _onPlaybackError`, { event });
12959
12958
  };
12960
12959
  _onDASHJSSError = (event) => {
12961
- trace(`${T$n} _onDASHJSSError`, { event });
12960
+ trace(`${T$o} _onDASHJSSError`, { event });
12962
12961
  this._stopTimeUpdateTimer();
12963
12962
  // Note that the other error types are deprecated
12964
12963
  const e = event.error;
@@ -12993,7 +12992,7 @@ class DashPlayback extends BasePlayback {
12993
12992
  }
12994
12993
  };
12995
12994
  triggerError(error) {
12996
- trace(`${T$n} triggerError`, { error });
12995
+ trace(`${T$o} triggerError`, { error });
12997
12996
  // this triggers Events.ERROR to be handled by the UI
12998
12997
  this.trigger(Events$1.PLAYBACK_ERROR, this.createError(error, {
12999
12998
  useCodePrefix: false,
@@ -13032,10 +13031,10 @@ class DashPlayback extends BasePlayback {
13032
13031
  }
13033
13032
  get dvrEnabled() {
13034
13033
  if (!this._dash) {
13035
- trace(`${T$n} dvrEnable no dash player instance`);
13034
+ trace(`${T$o} dvrEnable no dash player instance`);
13036
13035
  return false;
13037
13036
  }
13038
- trace(`${T$n} get.dvrEnabled`, {
13037
+ trace(`${T$o} get.dvrEnabled`, {
13039
13038
  dvrWindowSize: this._dash?.getDVRWindowSize(),
13040
13039
  minDvrSize: this._minDvrSize,
13041
13040
  playbackType: this.getPlaybackType(),
@@ -13057,10 +13056,8 @@ class DashPlayback extends BasePlayback {
13057
13056
  this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
13058
13057
  }
13059
13058
  play() {
13060
- trace(`${T$n} play`, { dash: !!this._dash });
13061
- if (!this._dash) {
13062
- this._setup();
13063
- }
13059
+ trace(`${T$o} play`, { dash: !!this._dash });
13060
+ !this._dash && this._setup();
13064
13061
  super.play();
13065
13062
  this._startTimeUpdateTimer();
13066
13063
  }
@@ -13076,20 +13073,22 @@ class DashPlayback extends BasePlayback {
13076
13073
  stop() {
13077
13074
  if (this._dash) {
13078
13075
  this._stopTimeUpdateTimer();
13079
- this._dash.reset();
13076
+ this.destroyInstance();
13080
13077
  super.stop();
13081
- this._dash = null;
13082
13078
  }
13083
13079
  }
13084
- destroy() {
13085
- this._stopTimeUpdateTimer();
13080
+ destroyInstance() {
13086
13081
  if (this._dash) {
13087
13082
  this._dash.off(DASHJS.MediaPlayer.events.ERROR, this._onDASHJSSError);
13088
13083
  this._dash.off(DASHJS.MediaPlayer.events.PLAYBACK_ERROR, this._onPlaybackError);
13089
13084
  this._dash.off(DASHJS.MediaPlayer.events.MANIFEST_LOADED, this.getDuration);
13090
13085
  this._dash.reset();
13086
+ this._dash = null;
13091
13087
  }
13092
- this._dash = null;
13088
+ }
13089
+ destroy() {
13090
+ this._stopTimeUpdateTimer();
13091
+ this.destroyInstance();
13093
13092
  return super.destroy();
13094
13093
  }
13095
13094
  _updatePlaybackType() {
@@ -13143,7 +13142,7 @@ class DashPlayback extends BasePlayback {
13143
13142
  }
13144
13143
  // @ts-expect-error
13145
13144
  get currentAudioTrack() {
13146
- trace(`${T$n} get currentAudioTrack`);
13145
+ trace(`${T$o} get currentAudioTrack`);
13147
13146
  assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
13148
13147
  const t = this._dash.getCurrentTrackFor('audio');
13149
13148
  if (!t) {
@@ -13158,6 +13157,13 @@ class DashPlayback extends BasePlayback {
13158
13157
  assert.ok(track, 'Invalid audio track ID');
13159
13158
  this._dash.setCurrentTrack(track);
13160
13159
  }
13160
+ load(srcUrl) {
13161
+ this._stopTimeUpdateTimer();
13162
+ this.options.src = srcUrl;
13163
+ // TODO destroy the instance first?
13164
+ this.destroyInstance();
13165
+ this._setup();
13166
+ }
13161
13167
  checkAudioTracks() {
13162
13168
  // @ts-ignore
13163
13169
  const tracks = this._dash.getTracksFor('audio');
@@ -41844,7 +41850,7 @@ const AUTO = -1;
41844
41850
  const DEFAULT_RECOVER_ATTEMPTS = 16;
41845
41851
  Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
41846
41852
  Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
41847
- const T$m = 'playback.hls';
41853
+ const T$n = 'playback.hls';
41848
41854
  class HlsPlayback extends BasePlayback {
41849
41855
  _ccIsSetup = false;
41850
41856
  _ccTracksUpdated = false;
@@ -42076,7 +42082,7 @@ class HlsPlayback extends BasePlayback {
42076
42082
  maxMaxBufferLength: 4,
42077
42083
  autoStartLoad: false,
42078
42084
  }, this.options.playback.hlsjsConfig);
42079
- trace(`${T$m} _createHLSInstance`, { config });
42085
+ trace(`${T$n} _createHLSInstance`, { config });
42080
42086
  this._hls = new Hls(config);
42081
42087
  }
42082
42088
  _attachHLSMedia() {
@@ -42153,12 +42159,7 @@ class HlsPlayback extends BasePlayback {
42153
42159
  return super.render();
42154
42160
  }
42155
42161
  _ready() {
42156
- trace(`${T$m} _ready`, {
42157
- isReadyState: this._isReadyState, // is defined in HTML5Video
42158
- });
42159
42162
  !this._hls && this._setup();
42160
- // this._isReadyState = true
42161
- // this.trigger(Events.PLAYBACK_READY, this.name)
42162
42163
  super._ready();
42163
42164
  }
42164
42165
  _recover(evt, data, error) {
@@ -42174,7 +42175,7 @@ class HlsPlayback extends BasePlayback {
42174
42175
  }
42175
42176
  else {
42176
42177
  Log.error('hlsjs: failed to recover', { evt, data });
42177
- trace(`${T$m} _recover failed to recover`, {
42178
+ trace(`${T$n} _recover failed to recover`, {
42178
42179
  type: data.type,
42179
42180
  details: data.details,
42180
42181
  });
@@ -42260,7 +42261,7 @@ class HlsPlayback extends BasePlayback {
42260
42261
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
42261
42262
  }
42262
42263
  _onHLSJSError(evt, data) {
42263
- trace(`${T$m} _onHLSJSError`, {
42264
+ trace(`${T$n} _onHLSJSError`, {
42264
42265
  fatal: data.fatal,
42265
42266
  type: data.type,
42266
42267
  details: data.details,
@@ -42308,7 +42309,7 @@ class HlsPlayback extends BasePlayback {
42308
42309
  evt,
42309
42310
  data,
42310
42311
  });
42311
- trace(`${T$m} _onHLSJSError trying to recover from network error`, {
42312
+ trace(`${T$n} _onHLSJSError trying to recover from network error`, {
42312
42313
  details: data.details,
42313
42314
  });
42314
42315
  error.level = PlayerError.Levels.WARN;
@@ -42321,7 +42322,7 @@ class HlsPlayback extends BasePlayback {
42321
42322
  evt,
42322
42323
  data,
42323
42324
  });
42324
- trace(`${T$m} _onHLSJSError trying to recover from media error`, {
42325
+ trace(`${T$n} _onHLSJSError trying to recover from media error`, {
42325
42326
  details: data.details,
42326
42327
  });
42327
42328
  error.level = PlayerError.Levels.WARN;
@@ -42351,7 +42352,7 @@ class HlsPlayback extends BasePlayback {
42351
42352
  return;
42352
42353
  }
42353
42354
  Log.warn('hlsjs: non-fatal error occurred', { evt, data });
42354
- trace(`${T$m} _onHLSJSError non-fatal error occurred`, {
42355
+ trace(`${T$n} _onHLSJSError non-fatal error occurred`, {
42355
42356
  type: data.type,
42356
42357
  details: data.details,
42357
42358
  });
@@ -42685,11 +42686,11 @@ class HlsPlayback extends BasePlayback {
42685
42686
  this._hls.audioTrack = Number(id); // TODO or find index by .id == id?
42686
42687
  }
42687
42688
  _onAudioTracksUpdated(_, data) {
42688
- trace(`${T$m} onAudioTracksUpdated`);
42689
+ trace(`${T$n} onAudioTracksUpdated`);
42689
42690
  this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, data.audioTracks.map(toClapprTrack));
42690
42691
  }
42691
42692
  _onAudioTrackSwitched(_, data) {
42692
- trace(`${T$m} onAudioTrackSwitched`);
42693
+ trace(`${T$n} onAudioTrackSwitched`);
42693
42694
  // @ts-ignore
42694
42695
  const track = this._hls.audioTracks[data.id];
42695
42696
  this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack(track));
@@ -42710,7 +42711,7 @@ function toClapprTrack(t) {
42710
42711
  };
42711
42712
  }
42712
42713
 
42713
- const T$l = 'playback.html5_video';
42714
+ const T$m = 'playback.html5_video';
42714
42715
  const STALL_TIMEOUT = 15000;
42715
42716
  class HTML5Video extends BasePlayback {
42716
42717
  stallTimerId = null;
@@ -42718,7 +42719,7 @@ class HTML5Video extends BasePlayback {
42718
42719
  * @internal
42719
42720
  */
42720
42721
  createError(errorData, options) {
42721
- trace(`${T$l} createError`, {
42722
+ trace(`${T$m} createError`, {
42722
42723
  errorData: { ...errorData },
42723
42724
  });
42724
42725
  const i18n = this.i18n ||
@@ -42734,11 +42735,11 @@ class HTML5Video extends BasePlayback {
42734
42735
  return super.createError(errorData, { ...options, useCodePrefix: false });
42735
42736
  }
42736
42737
  _onWaiting() {
42737
- trace(`${T$l} _onWaiting`);
42738
+ trace(`${T$m} _onWaiting`);
42738
42739
  super._onWaiting();
42739
42740
  }
42740
42741
  _onEnded() {
42741
- trace(`${T$l} _onEnded`);
42742
+ trace(`${T$m} _onEnded`);
42742
42743
  if (this.stallTimerId) {
42743
42744
  clearTimeout(this.stallTimerId);
42744
42745
  this.stallTimerId = null;
@@ -42746,12 +42747,12 @@ class HTML5Video extends BasePlayback {
42746
42747
  super._onEnded();
42747
42748
  }
42748
42749
  _handleBufferingEvents() {
42749
- trace(`${T$l} _handleBufferingEvents`, {
42750
+ trace(`${T$m} _handleBufferingEvents`, {
42750
42751
  networkState: this.el.networkState,
42751
42752
  });
42752
42753
  if (!this.stallTimerId) {
42753
42754
  this.stallTimerId = setTimeout(() => {
42754
- trace(`${T$l} _handleBufferingEvents stall timeout`, {
42755
+ trace(`${T$m} _handleBufferingEvents stall timeout`, {
42755
42756
  buffering: this.buffering,
42756
42757
  ended: this.ended,
42757
42758
  });
@@ -42769,7 +42770,7 @@ class HTML5Video extends BasePlayback {
42769
42770
  super._handleBufferingEvents();
42770
42771
  }
42771
42772
  _onPlaying() {
42772
- trace(`${T$l} _onPlaying`);
42773
+ trace(`${T$m} _onPlaying`);
42773
42774
  if (this.stallTimerId) {
42774
42775
  clearTimeout(this.stallTimerId);
42775
42776
  this.stallTimerId = null;
@@ -42777,7 +42778,7 @@ class HTML5Video extends BasePlayback {
42777
42778
  super._onPlaying();
42778
42779
  }
42779
42780
  _onPause() {
42780
- trace(`${T$l} _onPause`);
42781
+ trace(`${T$m} _onPause`);
42781
42782
  super._onPause();
42782
42783
  if (this.stallTimerId) {
42783
42784
  clearTimeout(this.stallTimerId);
@@ -42787,7 +42788,7 @@ class HTML5Video extends BasePlayback {
42787
42788
  get audioTracks() {
42788
42789
  const tracks = this.el.audioTracks;
42789
42790
  const supported = !!tracks;
42790
- trace(`${T$l} get audioTracks`, { supported });
42791
+ trace(`${T$m} get audioTracks`, { supported });
42791
42792
  const retval = [];
42792
42793
  if (supported) {
42793
42794
  for (let i = 0; i < tracks.length; i++) {
@@ -42806,7 +42807,7 @@ class HTML5Video extends BasePlayback {
42806
42807
  get currentAudioTrack() {
42807
42808
  const tracks = this.el.audioTracks;
42808
42809
  const supported = !!tracks;
42809
- trace(`${T$l} get currentAudioTrack`, {
42810
+ trace(`${T$m} get currentAudioTrack`, {
42810
42811
  supported,
42811
42812
  });
42812
42813
  if (supported) {
@@ -42827,7 +42828,7 @@ class HTML5Video extends BasePlayback {
42827
42828
  switchAudioTrack(id) {
42828
42829
  const tracks = this.el.audioTracks;
42829
42830
  const supported = !!tracks;
42830
- trace(`${T$l} switchAudioTrack`, {
42831
+ trace(`${T$m} switchAudioTrack`, {
42831
42832
  supported,
42832
42833
  });
42833
42834
  if (supported) {
@@ -42846,7 +42847,7 @@ function registerPlaybacks() {
42846
42847
  Loader.registerPlayback(DashPlayback);
42847
42848
  }
42848
42849
 
42849
- const T$k = 'gplayer';
42850
+ const T$l = 'gplayer';
42850
42851
  const DEFAULT_OPTIONS = {
42851
42852
  autoPlay: false,
42852
42853
  debug: 'none',
@@ -42934,7 +42935,7 @@ class Player {
42934
42935
  * ```
42935
42936
  */
42936
42937
  attachTo(playerElement) {
42937
- trace(`${T$k} attachTo`, {
42938
+ trace(`${T$l} attachTo`, {
42938
42939
  player: !!this.player,
42939
42940
  });
42940
42941
  assert.ok(!this.player, 'Player already initialized');
@@ -42944,7 +42945,7 @@ class Player {
42944
42945
  }
42945
42946
  const coreOpts = this.buildCoreOptions(playerElement);
42946
42947
  const { core, container } = Player.getRegisteredPlugins();
42947
- trace(`${T$k} init`, {
42948
+ trace(`${T$l} init`, {
42948
42949
  registeredPlaybacks: Loader.registeredPlaybacks.map((p) => p.prototype.name),
42949
42950
  });
42950
42951
  coreOpts.plugins = {
@@ -42958,7 +42959,7 @@ class Player {
42958
42959
  * Destroys the player, releasing all resources and unmounting its UI from the DOM.
42959
42960
  */
42960
42961
  destroy() {
42961
- trace(`${T$k} destroy`, {
42962
+ trace(`${T$l} destroy`, {
42962
42963
  player: !!this.player,
42963
42964
  });
42964
42965
  if (this.player) {
@@ -43145,7 +43146,7 @@ class Player {
43145
43146
  this.config = $.extend(true, this.config, config);
43146
43147
  }
43147
43148
  initPlayer(coreOptions) {
43148
- trace(`${T$k} initPlayer`, {
43149
+ trace(`${T$l} initPlayer`, {
43149
43150
  autoPlay: coreOptions.autoPlay,
43150
43151
  sources: coreOptions.sources,
43151
43152
  player: !!this.player,
@@ -43170,7 +43171,7 @@ class Player {
43170
43171
  }
43171
43172
  }
43172
43173
  triggerAutoPlay() {
43173
- trace(`${T$k} triggerAutoPlay`);
43174
+ trace(`${T$l} triggerAutoPlay`);
43174
43175
  setTimeout(() => {
43175
43176
  this.player?.play({
43176
43177
  autoPlay: true,
@@ -43188,7 +43189,7 @@ class Player {
43188
43189
  // TODO test
43189
43190
  events = {
43190
43191
  onReady: () => {
43191
- trace(`${T$k} onReady`, {
43192
+ trace(`${T$l} onReady`, {
43192
43193
  ready: this.ready,
43193
43194
  });
43194
43195
  if (this.ready) {
@@ -43222,7 +43223,7 @@ class Player {
43222
43223
  buildCoreOptions(rootNode) {
43223
43224
  const sources = this.buildMediaSourcesList();
43224
43225
  const source = sources[0];
43225
- trace(`${T$k} buildCoreOptions`, {
43226
+ trace(`${T$l} buildCoreOptions`, {
43226
43227
  source,
43227
43228
  sources,
43228
43229
  });
@@ -43283,7 +43284,7 @@ class Player {
43283
43284
  assert.ok(this.player, 'Player is not initialized');
43284
43285
  const core = this.player.core;
43285
43286
  core.on(Events$1.CORE_SCREEN_ORIENTATION_CHANGED, ({ orientation }) => {
43286
- trace(`${T$k} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43287
+ trace(`${T$l} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43287
43288
  orientation,
43288
43289
  rootNode: {
43289
43290
  width: this.rootNode?.clientWidth,
@@ -43298,14 +43299,14 @@ class Player {
43298
43299
  }
43299
43300
  }, null);
43300
43301
  core.on(Events$1.CORE_RESIZE, ({ width, height }) => {
43301
- trace(`${T$k} on CORE_RESIZE`, {
43302
+ trace(`${T$l} on CORE_RESIZE`, {
43302
43303
  width,
43303
43304
  height,
43304
43305
  });
43305
43306
  this.safeTriggerEvent(PlayerEvent.Resize, { width, height });
43306
43307
  }, null);
43307
43308
  core.on(Events$1.CORE_FULLSCREEN, (isFullscreen) => {
43308
- trace(`${T$k} CORE_FULLSCREEN`, {
43309
+ trace(`${T$l} CORE_FULLSCREEN`, {
43309
43310
  isFullscreen,
43310
43311
  });
43311
43312
  this.safeTriggerEvent(PlayerEvent.Fullscreen, isFullscreen);
@@ -43313,7 +43314,7 @@ class Player {
43313
43314
  }
43314
43315
  }
43315
43316
 
43316
- var version$1 = "2.24.11";
43317
+ var version$1 = "2.24.13";
43317
43318
 
43318
43319
  var packages = {
43319
43320
  "node_modules/@clappr/core": {
@@ -43637,7 +43638,7 @@ const INITIAL_SETTINGS = {
43637
43638
  default: [],
43638
43639
  seekEnabled: false,
43639
43640
  };
43640
- const T$j = 'plugins.media_control';
43641
+ const T$k = 'plugins.media_control';
43641
43642
  const LEFT_ORDER = [
43642
43643
  'playpause',
43643
43644
  'playstop',
@@ -43892,7 +43893,7 @@ class MediaControl extends UICorePlugin {
43892
43893
  * Hides the media control UI
43893
43894
  */
43894
43895
  disable() {
43895
- trace(`${T$j} disable`);
43896
+ trace(`${T$k} disable`);
43896
43897
  this.userDisabled = true; // TODO distinguish between user and system (e.g., unplayable) disabled?
43897
43898
  this.hide();
43898
43899
  this.unbindKeyEvents();
@@ -43902,7 +43903,7 @@ class MediaControl extends UICorePlugin {
43902
43903
  * Reenables the plugin disabled earlier with the {@link MediaControl.disable} method
43903
43904
  */
43904
43905
  enable() {
43905
- trace(`${T$j} enable`);
43906
+ trace(`${T$k} enable`);
43906
43907
  if (this.options.chromeless) {
43907
43908
  return;
43908
43909
  }
@@ -44071,7 +44072,9 @@ class MediaControl extends UICorePlugin {
44071
44072
  return false;
44072
44073
  }
44073
44074
  togglePlayStop() {
44074
- this.container.isPlaying() ? this.container.stop({ ui: true }) : this.container.play();
44075
+ this.container.isPlaying()
44076
+ ? this.container.stop({ ui: true })
44077
+ : this.container.play();
44075
44078
  }
44076
44079
  startSeekDrag(event) {
44077
44080
  if (!this.settings.seekEnabled) {
@@ -44213,17 +44216,20 @@ class MediaControl extends UICorePlugin {
44213
44216
  this.$volumeBarContainer?.removeClass('volume-bar-hide');
44214
44217
  }
44215
44218
  hideVolumeBar(timeout = 400) {
44216
- if (!this.$volumeBarContainer) {
44217
- return;
44218
- }
44219
44219
  if (this.hideVolumeId) {
44220
44220
  clearTimeout(this.hideVolumeId);
44221
44221
  }
44222
44222
  if (this.draggingVolumeBar) {
44223
- this.hideVolumeId = setTimeout(() => this.hideVolumeBar(), timeout);
44223
+ this.hideVolumeId = setTimeout(() => {
44224
+ this.hideVolumeId = null;
44225
+ this.hideVolumeBar();
44226
+ }, timeout);
44224
44227
  }
44225
44228
  else {
44226
- this.hideVolumeId = setTimeout(() => this.$volumeBarContainer?.addClass('volume-bar-hide'), timeout);
44229
+ this.hideVolumeId = setTimeout(() => {
44230
+ this.hideVolumeId = null;
44231
+ this.$volumeBarContainer.addClass('volume-bar-hide');
44232
+ }, timeout);
44227
44233
  }
44228
44234
  }
44229
44235
  ended() {
@@ -44388,7 +44394,7 @@ class MediaControl extends UICorePlugin {
44388
44394
  if (this.core.activePlayback.name === 'html5_video') {
44389
44395
  newSettings.seekEnabled = this.isSeekEnabledForHtml5Playback();
44390
44396
  }
44391
- const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
44397
+ const settingsChanged = !isEqualSettings(this.settings, newSettings);
44392
44398
  if (settingsChanged) {
44393
44399
  this.settings = newSettings;
44394
44400
  this.hasUpdate = true;
@@ -44423,35 +44429,50 @@ class MediaControl extends UICorePlugin {
44423
44429
  /**
44424
44430
  * Get a media control element DOM node
44425
44431
  * @param name - The name of the media control element
44426
- * @returns The DOM node to render to or extend
44432
+ * @param element - The DOM node/fragment to mount
44433
+ * @deprecated Use {@link MediaControl.mount} instead
44434
+ */
44435
+ slot(name, element) {
44436
+ const panel = this.getElementLocation(name);
44437
+ if (panel) {
44438
+ element.attr(`data-${name}`, '');
44439
+ mountTo(panel, element);
44440
+ }
44441
+ }
44442
+ /**
44443
+ * Mounts a media control element at a specific location
44444
+ * @param name - The location to mount the element
44445
+ * @param element - The element to mount
44427
44446
  * @remarks
44428
44447
  * Use this method to render custom media control UI in a plugin
44429
44448
  * @example
44430
44449
  * ```ts
44431
44450
  * class MyPlugin extends UICorePlugin {
44432
44451
  * override render() {
44433
- * this.$el.html('<div data-clips>Here we go</div>')
44434
- * this.core.getPlugin('media_control').mount('clips', this.$el)
44452
+ * this.$el.html('<div id="my-element" class="my-class">Here we go</div>')
44453
+ * this.core.getPlugin('media_control').mount('left', this.$el)
44435
44454
  * return this
44436
44455
  * }
44437
44456
  * }
44438
44457
  * ```
44439
44458
  */
44440
44459
  mount(name, element) {
44441
- const panel = this.getElementLocation(name);
44442
- if (panel) {
44443
- const current = panel.find(`[data-${name}]`);
44444
- element.attr(`data-${name}`, '');
44445
- // TODO test
44446
- if (current.length) {
44447
- if (current[0] === element[0]) {
44448
- return;
44449
- }
44450
- current.replaceWith(element);
44451
- }
44452
- else {
44453
- panel.append(element);
44454
- }
44460
+ mountTo(this.getMountParent(name), element);
44461
+ }
44462
+ getMountParent(name) {
44463
+ switch (name) {
44464
+ case 'root':
44465
+ return this.$el;
44466
+ case 'base':
44467
+ return this.$el.find('.media-control-layer');
44468
+ case 'center':
44469
+ return this.getCenterPanel();
44470
+ case 'left':
44471
+ return this.getLeftPanel();
44472
+ case 'right':
44473
+ return this.getRightPanel();
44474
+ default:
44475
+ assert.fail(`Invalid mount parent name: ${name}`);
44455
44476
  }
44456
44477
  }
44457
44478
  /**
@@ -44629,7 +44650,7 @@ class MediaControl extends UICorePlugin {
44629
44650
  return this;
44630
44651
  }
44631
44652
  const timeout = this.options.hideMediaControlDelay || 2000;
44632
- trace(`${T$j} render`, { settings: this.settings });
44653
+ trace(`${T$k} render`, { settings: this.settings });
44633
44654
  this.$el.html(MediaControl.template({ settings: this.settings }));
44634
44655
  // const style = Styler.getStyleFor(mediaControlStyle, { baseUrl: this.options.baseUrl });
44635
44656
  // this.$el.append(style[0]);
@@ -44652,14 +44673,12 @@ class MediaControl extends UICorePlugin {
44652
44673
  this.$volumeBarContainer?.css({ display: 'none' });
44653
44674
  }
44654
44675
  }
44676
+ // TODO check if needed
44655
44677
  this.$seekBarPosition?.addClass('media-control-notransition');
44656
44678
  this.$seekBarScrubber?.addClass('media-control-notransition');
44657
- let previousSeekPercentage = 0;
44658
- if (this.displayedSeekBarPercentage) {
44659
- previousSeekPercentage = this.displayedSeekBarPercentage;
44660
- }
44679
+ const prevSeekPercentage = this.displayedSeekBarPercentage || 0;
44661
44680
  this.displayedSeekBarPercentage = null;
44662
- this.setSeekPercentage(previousSeekPercentage);
44681
+ this.setSeekPercentage(prevSeekPercentage);
44663
44682
  setTimeout(() => {
44664
44683
  !this.settings.seekEnabled &&
44665
44684
  this.$seekBarContainer?.addClass('seek-disabled');
@@ -44783,9 +44802,17 @@ function serializeSettings(s) {
44783
44802
  .concat([s.seekEnabled])
44784
44803
  .join(',');
44785
44804
  }
44805
+ function isEqualSettings(a, b) {
44806
+ return serializeSettings(a) === serializeSettings(b);
44807
+ }
44808
+ function mountTo(parent, element) {
44809
+ if (!parent.find(element).length) {
44810
+ parent.append(element);
44811
+ }
44812
+ }
44786
44813
 
44787
44814
  const VERSION$7 = '2.22.4';
44788
- const T$i = 'plugins.audiotracks';
44815
+ const T$j = 'plugins.audiotracks';
44789
44816
  /**
44790
44817
  * `PLUGIN` that makes possible to switch audio tracks via the media control UI.
44791
44818
  * @beta
@@ -44846,7 +44873,7 @@ class AudioTracks extends UICorePlugin {
44846
44873
  const mediaControl = this.core.getPlugin('media_control');
44847
44874
  assert(mediaControl, 'media_control plugin is required');
44848
44875
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, () => {
44849
- mediaControl.mount('audiotracks', this.$el);
44876
+ mediaControl.slot('audiotracks', this.$el);
44850
44877
  });
44851
44878
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideMenu);
44852
44879
  this.listenTo(mediaControl, ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, (from) => {
@@ -44907,7 +44934,7 @@ class AudioTracks extends UICorePlugin {
44907
44934
  this.updateText();
44908
44935
  }
44909
44936
  hideMenu() {
44910
- trace(`${T$i} hideMenu`);
44937
+ trace(`${T$j} hideMenu`);
44911
44938
  this.$el.find('#audiotracks-select').addClass('hidden');
44912
44939
  this.$el.find('#audiotracks-button').attr('aria-expanded', 'false');
44913
44940
  }
@@ -44960,7 +44987,7 @@ class AudioTracks extends UICorePlugin {
44960
44987
 
44961
44988
  const templateHtml$2 = "<div class=\"big-mute-icon-wrapper\" data-big-mute id=\"gplayer-big-mute-button\">\n <div class=\"big-mute-icon gcore-skin-border-color\" data-big-mute-icon id=\"gplayer-big-mute-icon\"></div>\n</div>\n";
44962
44989
 
44963
- const T$h = 'plugins.big_mute_button';
44990
+ const T$i = 'plugins.big_mute_button';
44964
44991
  // TODO rewrite as a container plugin
44965
44992
  /**
44966
44993
  * `PLUGIN` that displays a big mute button over the video when it's being played muted.
@@ -45023,7 +45050,7 @@ class BigMuteButton extends UICorePlugin {
45023
45050
  if (autoPlay) {
45024
45051
  this.autoPlay = true;
45025
45052
  }
45026
- trace(`${T$h} onPlay`, {
45053
+ trace(`${T$i} onPlay`, {
45027
45054
  autoPlay: this.autoPlay,
45028
45055
  wasMuted,
45029
45056
  volume,
@@ -45036,7 +45063,7 @@ class BigMuteButton extends UICorePlugin {
45036
45063
  }
45037
45064
  }
45038
45065
  onStop(_, { ui }) {
45039
- trace(`${T$h} onStop`, { ui });
45066
+ trace(`${T$i} onStop`, { ui });
45040
45067
  if (ui) {
45041
45068
  this.destroy();
45042
45069
  }
@@ -45064,7 +45091,7 @@ class BigMuteButton extends UICorePlugin {
45064
45091
  * @internal
45065
45092
  */
45066
45093
  render() {
45067
- trace(`${T$h} render`);
45094
+ trace(`${T$i} render`);
45068
45095
  this.$el.html(BigMuteButton.template());
45069
45096
  this.$el.find('#gplayer-big-mute-icon').append(volumeMuteIcon);
45070
45097
  // TODO
@@ -45084,7 +45111,7 @@ class BigMuteButton extends UICorePlugin {
45084
45111
  this.$el.find('#gplayer-big-mute-button')?.removeClass('hide');
45085
45112
  }
45086
45113
  clicked(e) {
45087
- trace(`${T$h} clicked`);
45114
+ trace(`${T$i} clicked`);
45088
45115
  const mediaControl = this.core.getPlugin('media_control');
45089
45116
  // TODO delegate to media_control plugin
45090
45117
  const localVolume = Utils.Config.restore('volume');
@@ -45108,7 +45135,7 @@ const gearIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"n
45108
45135
  const gearHdIcon = "<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_1567)\">\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 <rect x=\"13\" width=\"11\" height=\"7\" rx=\"1\" fill=\"#F6413B\"/>\n <path\n d=\"M14.6962 6V1.63636H15.3546V3.53267H17.53V1.63636H18.1905V6H17.53V4.0973H15.3546V6H14.6962ZM20.562 6H19.1493V1.63636H20.6067C21.0343 1.63636 21.4015 1.72372 21.7083 1.89844C22.0151 2.07173 22.2502 2.32102 22.4135 2.64631C22.5783 2.97017 22.6607 3.35866 22.6607 3.81179C22.6607 4.26634 22.5776 4.65696 22.4114 4.98366C22.2466 5.31037 22.008 5.56179 21.6955 5.73793C21.383 5.91264 21.0051 6 20.562 6ZM19.8077 5.42472H20.5257C20.8581 5.42472 21.1344 5.36222 21.3546 5.23722C21.5748 5.1108 21.7395 4.92827 21.8489 4.68963C21.9583 4.44957 22.013 4.15696 22.013 3.81179C22.013 3.46946 21.9583 3.17898 21.8489 2.94034C21.7409 2.7017 21.5797 2.5206 21.3652 2.39702C21.1507 2.27344 20.8844 2.21165 20.5662 2.21165H19.8077V5.42472Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1567\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
45109
45136
 
45110
45137
  const VERSION$6 = '2.19.12';
45111
- const T$g = 'plugins.bottom_gear';
45138
+ const T$h = 'plugins.bottom_gear';
45112
45139
  const MENU_VMARGIN = 12;
45113
45140
  const MENU_BACKLINK_HEIGHT = 44;
45114
45141
  /**
@@ -45260,14 +45287,14 @@ class BottomGear extends UICorePlugin {
45260
45287
  addItem(name, $subMenu) {
45261
45288
  const $existingItem = this.$el.find(`#gear-options li[data-${name}]`);
45262
45289
  if ($existingItem.length) {
45263
- trace(`${T$g} addItem already exists`, { name });
45290
+ trace(`${T$h} addItem already exists`, { name });
45264
45291
  return $existingItem;
45265
45292
  }
45266
45293
  const $item = $('<li></li>')
45267
45294
  .attr(`data-${name}`, '')
45268
45295
  .appendTo(this.$el.find('#gear-options'));
45269
45296
  if ($subMenu) {
45270
- trace(`${T$g} addItem adding submenu`, { name });
45297
+ trace(`${T$h} addItem adding submenu`, { name });
45271
45298
  $subMenu
45272
45299
  .addClass('gear-sub-menu-wrapper')
45273
45300
  .hide()
@@ -45290,7 +45317,7 @@ class BottomGear extends UICorePlugin {
45290
45317
  });
45291
45318
  }
45292
45319
  highDefinitionUpdate(isHd) {
45293
- trace(`${T$g} highDefinitionUpdate`, { isHd });
45320
+ trace(`${T$h} highDefinitionUpdate`, { isHd });
45294
45321
  this.hd = isHd;
45295
45322
  this.$el.find('#gear-button').html(isHd ? gearHdIcon : gearIcon);
45296
45323
  }
@@ -45369,7 +45396,7 @@ class BottomGear extends UICorePlugin {
45369
45396
  }
45370
45397
  mount() {
45371
45398
  const mediaControl = this.core.getPlugin('media_control');
45372
- mediaControl.mount('gear', this.$el);
45399
+ mediaControl.slot('gear', this.$el);
45373
45400
  }
45374
45401
  alignSubmenu($subMenu) {
45375
45402
  const availableHeight = this.core.getPlugin('media_control').getAvailableHeight() -
@@ -47968,7 +47995,7 @@ const PLAYBACK_NAMES = {
47968
47995
  hls: 'HLS.js',
47969
47996
  html5_video: 'Native',
47970
47997
  };
47971
- const T$f = 'plugins.nerd_stats';
47998
+ const T$g = 'plugins.nerd_stats';
47972
47999
  /**
47973
48000
  * `PLUGIN` that displays useful statistics regarding the playback as well as the network quality estimation.
47974
48001
  * @beta
@@ -48287,7 +48314,7 @@ class NerdStats extends UICorePlugin {
48287
48314
  return this;
48288
48315
  }
48289
48316
  attach() {
48290
- trace(`${T$f} attach`);
48317
+ trace(`${T$g} attach`);
48291
48318
  const gear = this.core.getPlugin('bottom_gear');
48292
48319
  gear
48293
48320
  .addItem('nerd_stats')
@@ -48301,7 +48328,7 @@ class NerdStats extends UICorePlugin {
48301
48328
  });
48302
48329
  }
48303
48330
  clearSpeedtestMetrics() {
48304
- trace(`${T$f} clearSpeedtestMetrics`);
48331
+ trace(`${T$g} clearSpeedtestMetrics`);
48305
48332
  const clapprStats = this.container?.getPlugin('clappr_stats');
48306
48333
  this.speedtestMetrics.connectionSpeed = 0;
48307
48334
  this.speedtestMetrics.ping = 0;
@@ -48356,7 +48383,7 @@ function newMetrics() {
48356
48383
  // Copyright 2014 Globo.com Player authors. All rights reserved.
48357
48384
  // Use of this source code is governed by a BSD-style
48358
48385
  // license that can be found at https://github.com/clappr/clappr-plugins/blob/master/LICENSE.
48359
- const T$e = 'plugins.click_to_pause';
48386
+ const T$f = 'plugins.click_to_pause';
48360
48387
  /**
48361
48388
  * A small `PLUGIN` that toggles the playback state on click over the video container
48362
48389
  * @beta
@@ -48386,7 +48413,7 @@ class ClickToPause extends ContainerPlugin {
48386
48413
  click() {
48387
48414
  const isLivePlayback = this.container.getPlaybackType() === Playback.LIVE;
48388
48415
  const isDvrEnabled = this.container.isDvrEnabled();
48389
- trace(`${T$e} click`, {
48416
+ trace(`${T$f} click`, {
48390
48417
  isLivePlayback,
48391
48418
  isDvrEnabled,
48392
48419
  });
@@ -48465,7 +48492,7 @@ function buildSvg(clips, duration, barWidth) {
48465
48492
 
48466
48493
  const clipsHTML = "<div class=\"media-clip-text\" id=\"clips-text\"></div>";
48467
48494
 
48468
- const T$d = 'plugins.clips';
48495
+ const T$e = 'plugins.clips';
48469
48496
  const VERSION$5 = '2.22.16';
48470
48497
  const CLAPPR_VERSION = '0.11.4';
48471
48498
  /**
@@ -48515,7 +48542,7 @@ class Clips extends UICorePlugin {
48515
48542
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
48516
48543
  }
48517
48544
  render() {
48518
- trace(`${T$d} render`);
48545
+ trace(`${T$e} render`);
48519
48546
  if (!this.options.clips) {
48520
48547
  return this;
48521
48548
  }
@@ -48551,19 +48578,19 @@ class Clips extends UICorePlugin {
48551
48578
  ?.text;
48552
48579
  }
48553
48580
  onCoreReady() {
48554
- trace(`${T$d} onCoreReady`);
48581
+ trace(`${T$e} onCoreReady`);
48555
48582
  const mediaControl = this.core.getPlugin('media_control');
48556
48583
  assert(mediaControl, 'media_control plugin is required');
48557
48584
  this.parseClips(this.options.clips.text);
48558
48585
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.onMcRender);
48559
48586
  }
48560
48587
  onMcRender() {
48561
- trace(`${T$d} onMcRender`);
48588
+ trace(`${T$e} onMcRender`);
48562
48589
  const mediaControl = this.core.getPlugin('media_control');
48563
- mediaControl.mount('clips', this.$el);
48590
+ mediaControl.slot('clips', this.$el);
48564
48591
  }
48565
48592
  onContainerChanged() {
48566
- trace(`${T$d} onContainerChanged`);
48593
+ trace(`${T$e} onContainerChanged`);
48567
48594
  // TODO figure out the conditions of changing the container (without destroying the previous one)
48568
48595
  if (this.oldContainer) {
48569
48596
  this.stopListening(this.oldContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
@@ -48739,9 +48766,9 @@ class ContextMenu extends UIContainerPlugin {
48739
48766
  };
48740
48767
  }
48741
48768
 
48742
- const dvrHTML = "<div class=\"live-info\" id=\"media-control-live\"><%= i18n.t('live') %></div>\n<button type=\"button\" class=\"live-button\" aria-label=\"<%= i18n.t('back_to_live') %>\" id=\"media-control-back-to-live\"><%= i18n.t('back_to_live') %></button>\n";
48769
+ const dvrHTML = "<div class=\"live-info\" id=\"gplayer-mc-live\"><%= i18n.t('live') %></div>\n<button type=\"button\"\n class=\"live-button\"\n aria-label=\"<%= i18n.t('back_to_live') %>\"\n id=\"gplayer-mc-back-to-live\"\n>\n <%= i18n.t('back_to_live') %>\n</button>\n";
48743
48770
 
48744
- // const T = 'plugins.dvr_controls'
48771
+ const T$d = 'plugins.dvr_controls';
48745
48772
  /**
48746
48773
  * `PLUGIN` that adds the DVR controls to the media control UI
48747
48774
  *
@@ -48775,7 +48802,7 @@ class DvrControls extends UICorePlugin {
48775
48802
  */
48776
48803
  get events() {
48777
48804
  return {
48778
- 'click .live-button': 'click',
48805
+ 'click #gplayer-mc-back-to-live': 'clicked',
48779
48806
  };
48780
48807
  }
48781
48808
  /**
@@ -48784,6 +48811,7 @@ class DvrControls extends UICorePlugin {
48784
48811
  get attributes() {
48785
48812
  return {
48786
48813
  class: 'dvr-controls',
48814
+ 'data-dvr': '',
48787
48815
  };
48788
48816
  }
48789
48817
  /**
@@ -48802,7 +48830,7 @@ class DvrControls extends UICorePlugin {
48802
48830
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_LOADEDMETADATA, this.onMetadataLoaded);
48803
48831
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
48804
48832
  }
48805
- click() {
48833
+ clicked() {
48806
48834
  const container = this.core.activeContainer;
48807
48835
  if (!container.isPlaying()) {
48808
48836
  container.play();
@@ -48813,14 +48841,14 @@ class DvrControls extends UICorePlugin {
48813
48841
  * @internal
48814
48842
  */
48815
48843
  render() {
48844
+ trace(`${T$d} render`);
48816
48845
  this.$el.html(DvrControls.template({
48817
48846
  i18n: this.core.i18n,
48818
48847
  }));
48848
+ this.$el.find('#gplayer-mc-back-to-live').hide();
48849
+ this.$el.find('#gplayer-mc-live').hide();
48819
48850
  return this;
48820
48851
  }
48821
- onMediacontrolRendered() {
48822
- this.render();
48823
- }
48824
48852
  onMetadataLoaded() {
48825
48853
  this.mount();
48826
48854
  this.toggleState(this.core.activeContainer.isDvrInUse());
@@ -48832,22 +48860,22 @@ class DvrControls extends UICorePlugin {
48832
48860
  }
48833
48861
  const mediaControl = this.core.getPlugin('media_control');
48834
48862
  assert(mediaControl, 'media_control plugin is required');
48835
- // TODO -> to MediaControl
48863
+ // TODO -> to MediaControl (auto hide)
48836
48864
  mediaControl.toggleElement('duration', false);
48837
48865
  mediaControl.toggleElement('position', false);
48838
- mediaControl.mount('dvr', this.$el);
48866
+ mediaControl.mount('left', this.$el); // TODO use independent mount point
48839
48867
  }
48840
48868
  onDvrStateChanged(dvrInUse) {
48841
48869
  this.toggleState(dvrInUse);
48842
48870
  }
48843
48871
  toggleState(dvrInUse) {
48844
48872
  if (dvrInUse) {
48845
- this.$el.find('#media-control-back-to-live').show();
48846
- this.$el.find('#media-control-live').hide();
48873
+ this.$el.find('#gplayer-mc-back-to-live').show();
48874
+ this.$el.find('#gplayer-mc-live').hide();
48847
48875
  }
48848
48876
  else {
48849
- this.$el.find('#media-control-back-to-live').hide();
48850
- this.$el.find('#media-control-live').show();
48877
+ this.$el.find('#gplayer-mc-back-to-live').hide();
48878
+ this.$el.find('#gplayer-mc-live').show();
48851
48879
  }
48852
48880
  }
48853
48881
  }
@@ -49848,7 +49876,7 @@ class PictureInPicture extends UICorePlugin {
49848
49876
  this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
49849
49877
  const mediaControl = this.core.getPlugin('media_control');
49850
49878
  if (mediaControl) {
49851
- mediaControl.mount('pip', this.$el);
49879
+ mediaControl.slot('pip', this.$el);
49852
49880
  }
49853
49881
  return this;
49854
49882
  }
@@ -51759,7 +51787,7 @@ class ClosedCaptions extends UICorePlugin {
51759
51787
  this.$line = $(ClosedCaptions.templateString());
51760
51788
  this.resizeFont();
51761
51789
  this.core.activeContainer.$el.append(this.$line);
51762
- mediaControl.mount('cc', this.$el);
51790
+ mediaControl.slot('cc', this.$el);
51763
51791
  this.updateSelection();
51764
51792
  this.renderIcon();
51765
51793
  return this;