@gcorevideo/player 2.20.22 → 2.21.1

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 (76) hide show
  1. package/assets/audio-selector/style.scss +48 -82
  2. package/assets/audio-selector/track-selector.ejs +3 -3
  3. package/assets/bottom-gear/bottomgear.ejs +10 -12
  4. package/assets/bottom-gear/gear-sub-menu.scss +0 -15
  5. package/assets/bottom-gear/gear.scss +3 -32
  6. package/assets/media-control/media-control.ejs +5 -20
  7. package/assets/media-control/media-control.scss +124 -34
  8. package/assets/media-control/width370.scss +32 -104
  9. package/assets/picture-in-picture/button.ejs +1 -1
  10. package/assets/picture-in-picture/button.scss +5 -4
  11. package/dist/core.js +148 -23
  12. package/dist/index.css +530 -616
  13. package/dist/index.js +284 -282
  14. package/dist/player.d.ts +19 -16
  15. package/dist/plugins/index.css +1009 -1095
  16. package/dist/plugins/index.js +709 -23402
  17. package/docs/api/player.audioselector.md +4 -59
  18. package/docs/api/player.md +1 -1
  19. package/docs/api/player.mediacontrol.getelement.md +5 -0
  20. package/docs/api/player.mediacontrol.md +14 -0
  21. package/docs/api/{player.audioselector.updatecurrenttrack.md → player.mediacontrol.putelement.md} +7 -7
  22. package/docs/api/player.mediacontrolelement.md +1 -1
  23. package/docs/api/{player.audioselector.starttrackswitch.md → player.pictureinpicture.attributes.md} +5 -7
  24. package/docs/api/player.pictureinpicture.md +45 -0
  25. package/lib/playback/BasePlayback.d.ts +0 -1
  26. package/lib/playback/BasePlayback.d.ts.map +1 -1
  27. package/lib/playback/BasePlayback.js +0 -1
  28. package/lib/playback/HTML5Video.d.ts +4 -0
  29. package/lib/playback/HTML5Video.d.ts.map +1 -1
  30. package/lib/playback/HTML5Video.js +53 -4
  31. package/lib/playback/dash-playback/DashPlayback.d.ts +5 -0
  32. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  33. package/lib/playback/dash-playback/DashPlayback.js +48 -4
  34. package/lib/playback/hls-playback/HlsPlayback.d.ts +31 -25
  35. package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
  36. package/lib/playback/hls-playback/HlsPlayback.js +47 -14
  37. package/lib/plugins/audio-selector/AudioSelector.d.ts +12 -11
  38. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  39. package/lib/plugins/audio-selector/AudioSelector.js +65 -185
  40. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
  41. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  42. package/lib/plugins/bottom-gear/BottomGear.js +10 -9
  43. package/lib/plugins/level-selector/LevelSelector.js +1 -1
  44. package/lib/plugins/media-control/MediaControl.d.ts +3 -3
  45. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  46. package/lib/plugins/media-control/MediaControl.js +17 -9
  47. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +3 -0
  48. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
  49. package/lib/plugins/picture-in-picture/PictureInPicture.js +6 -1
  50. package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
  51. package/lib/plugins/source-controller/SourceController.js +0 -1
  52. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +0 -2
  53. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
  54. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +1 -18
  55. package/lib/testUtils.d.ts.map +1 -1
  56. package/lib/testUtils.js +2 -0
  57. package/package.json +1 -1
  58. package/src/playback/BasePlayback.ts +0 -1
  59. package/src/playback/HTML5Video.ts +57 -4
  60. package/src/playback/dash-playback/DashPlayback.ts +64 -6
  61. package/src/playback/hls-playback/HlsPlayback.ts +82 -40
  62. package/src/plugins/audio-selector/AudioSelector.ts +84 -278
  63. package/src/plugins/bottom-gear/BottomGear.ts +11 -10
  64. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -3
  65. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +14 -37
  66. package/src/plugins/level-selector/LevelSelector.ts +1 -1
  67. package/src/plugins/media-control/MediaControl.ts +18 -13
  68. package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -1
  69. package/src/plugins/source-controller/SourceController.ts +0 -1
  70. package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +1 -20
  71. package/src/testUtils.ts +2 -0
  72. package/src/typings/globals.d.ts +19 -0
  73. package/temp/player.api.json +102 -143
  74. package/tsconfig.tsbuildinfo +1 -1
  75. package/assets/media-control/plugins.scss +0 -94
  76. package/docs/api/player.audioselector.highlightcurrenttrack.md +0 -18
package/dist/index.js CHANGED
@@ -12626,7 +12626,6 @@ var PlaybackErrorCode;
12626
12626
  /**
12627
12627
  * This class adds common behaviors to all playback modules.
12628
12628
  * @internal
12629
- * TODO use custom HTML5Video playback with this layer applied
12630
12629
  */
12631
12630
  class BasePlayback extends HTML5Video$1 {
12632
12631
  createError(errorData, options) {
@@ -12672,13 +12671,13 @@ var PlaybackEvents;
12672
12671
  PlaybackEvents["PLAYBACK_RATE_CHANGED"] = "playback:rate-changed";
12673
12672
  })(PlaybackEvents || (PlaybackEvents = {}));
12674
12673
 
12675
- // Copyright 2014 Globo.com Player authors. All rights reserved.
12676
- // Use of this source code is governed by a BSD-style
12677
- // license that can be found in the LICENSE file.
12678
- const AUTO$2 = -1;
12674
+ // This code is derived on works by Globo.com.
12675
+ // This code is distributed under the terms of the Apache License 2.0.
12676
+ // Original code's license can be found on
12677
+ // https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
12678
+ const AUTO$1 = -1;
12679
12679
  const { now: now$2 } = Utils;
12680
- const T$j = 'playback.dash';
12681
- // @ts-expect-error
12680
+ const T$k = 'playback.dash';
12682
12681
  class DashPlayback extends BasePlayback {
12683
12682
  _levels = null;
12684
12683
  _currentLevel = null;
@@ -12724,7 +12723,7 @@ class DashPlayback extends BasePlayback {
12724
12723
  }
12725
12724
  get currentLevel() {
12726
12725
  if (this._currentLevel === null) {
12727
- return AUTO$2;
12726
+ return AUTO$1;
12728
12727
  }
12729
12728
  // 0 is a valid level ID
12730
12729
  return this._currentLevel;
@@ -12838,6 +12837,7 @@ class DashPlayback extends BasePlayback {
12838
12837
  const newLevel = this.getLevel(evt.newQuality);
12839
12838
  this.onLevelSwitch(newLevel);
12840
12839
  });
12840
+ this.checkAudioTracks();
12841
12841
  });
12842
12842
  this._dash.on(DASHJS.MediaPlayer.events.QUALITY_CHANGE_RENDERED, (evt) => {
12843
12843
  const currentLevel = this.getLevel(evt.newQuality);
@@ -12858,6 +12858,11 @@ class DashPlayback extends BasePlayback {
12858
12858
  this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e) => {
12859
12859
  this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate);
12860
12860
  });
12861
+ this._dash.on(DASHJS.MediaPlayer.events.TRACK_CHANGE_RENDERED, (e) => {
12862
+ if (e.mediaType === 'audio') {
12863
+ this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack$1(e.newMediaInfo));
12864
+ }
12865
+ });
12861
12866
  }
12862
12867
  render() {
12863
12868
  this._ready();
@@ -12947,10 +12952,10 @@ class DashPlayback extends BasePlayback {
12947
12952
  }
12948
12953
  _onPlaybackError = (event) => {
12949
12954
  // TODO
12950
- trace(`${T$j} _onPlaybackError`, { event });
12955
+ trace(`${T$k} _onPlaybackError`, { event });
12951
12956
  };
12952
12957
  _onDASHJSSError = (event) => {
12953
- trace(`${T$j} _onDASHJSSError`, { event });
12958
+ trace(`${T$k} _onDASHJSSError`, { event });
12954
12959
  this._stopTimeUpdateTimer();
12955
12960
  // Note that the other error types are deprecated
12956
12961
  const e = event.error;
@@ -12985,7 +12990,7 @@ class DashPlayback extends BasePlayback {
12985
12990
  }
12986
12991
  };
12987
12992
  triggerError(error) {
12988
- trace(`${T$j} triggerError`, { error });
12993
+ trace(`${T$k} triggerError`, { error });
12989
12994
  // this triggers Events.ERROR to be handled by the UI
12990
12995
  this.trigger(Events$1.PLAYBACK_ERROR, this.createError(error, {
12991
12996
  useCodePrefix: false,
@@ -13024,7 +13029,7 @@ class DashPlayback extends BasePlayback {
13024
13029
  }
13025
13030
  get dvrEnabled() {
13026
13031
  if (!this._dash) {
13027
- trace(`${T$j} dvrEnable no dash player instance`);
13032
+ trace(`${T$k} dvrEnable no dash player instance`);
13028
13033
  return false;
13029
13034
  }
13030
13035
  return (this._dash?.getDVRWindowSize() >= this._minDvrSize &&
@@ -13046,7 +13051,7 @@ class DashPlayback extends BasePlayback {
13046
13051
  this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
13047
13052
  }
13048
13053
  play() {
13049
- trace(`${T$j} play`, { dash: !!this._dash });
13054
+ trace(`${T$k} play`, { dash: !!this._dash });
13050
13055
  if (!this._dash) {
13051
13056
  this._setup();
13052
13057
  }
@@ -13125,6 +13130,36 @@ class DashPlayback extends BasePlayback {
13125
13130
  setPlaybackRate(rate) {
13126
13131
  this._dash?.setPlaybackRate(rate);
13127
13132
  }
13133
+ get audioTracks() {
13134
+ assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
13135
+ const tracks = this._dash.getTracksFor('audio');
13136
+ trace(`${T$k} get audioTracks`, { tracks });
13137
+ return tracks.map(toClapprTrack$1);
13138
+ }
13139
+ // @ts-expect-error
13140
+ get currentAudioTrack() {
13141
+ trace(`${T$k} get currentAudioTrack`);
13142
+ assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
13143
+ const t = this._dash.getCurrentTrackFor('audio');
13144
+ if (!t) {
13145
+ return null;
13146
+ }
13147
+ return toClapprTrack$1(t);
13148
+ }
13149
+ switchAudioTrack(id) {
13150
+ assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized');
13151
+ const tracks = this._dash.getTracksFor('audio');
13152
+ const track = tracks.find((t) => t.id === id);
13153
+ assert.ok(track, 'Invalid audio track ID');
13154
+ this._dash.setCurrentTrack(track);
13155
+ }
13156
+ checkAudioTracks() {
13157
+ // @ts-ignore
13158
+ const tracks = this._dash.getTracksFor('audio');
13159
+ if (tracks.length) {
13160
+ this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack$1));
13161
+ }
13162
+ }
13128
13163
  }
13129
13164
  DashPlayback.canPlay = function (resource, mimeType) {
13130
13165
  if (!isDashSource(resource, mimeType)) {
@@ -13136,6 +13171,14 @@ DashPlayback.canPlay = function (resource, mimeType) {
13136
13171
  const ctor = ms || mms || wms;
13137
13172
  return typeof ctor === 'function';
13138
13173
  };
13174
+ function toClapprTrack$1(t) {
13175
+ return {
13176
+ id: t.id,
13177
+ kind: t.roles && t.roles?.length > 0 ? t.roles[0] : 'main', // TODO
13178
+ label: t.labels.map((l) => l.text).join(' '), // TODO
13179
+ language: t.lang,
13180
+ };
13181
+ }
13139
13182
 
13140
13183
  function getDefaultExportFromCjs (x) {
13141
13184
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
@@ -41792,12 +41835,11 @@ const CLAPPR_VERSION = '0.11.3';
41792
41835
  // Use of this source code is governed by a BSD-style
41793
41836
  // license that can be found on https://github.com/clappr/hlsjs-playback/blob/main/LICENSE
41794
41837
  const { now } = Utils;
41795
- const AUTO$1 = -1;
41838
+ const AUTO = -1;
41796
41839
  const DEFAULT_RECOVER_ATTEMPTS = 16;
41797
41840
  Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
41798
41841
  Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
41799
- const T$i = 'playback.hls';
41800
- // @ts-expect-error
41842
+ const T$j = 'playback.hls';
41801
41843
  class HlsPlayback extends BasePlayback {
41802
41844
  _ccIsSetup = false;
41803
41845
  _ccTracksUpdated = false;
@@ -41834,7 +41876,7 @@ class HlsPlayback extends BasePlayback {
41834
41876
  return this._levels || [];
41835
41877
  }
41836
41878
  get currentLevel() {
41837
- return this._currentLevel ?? AUTO$1;
41879
+ return this._currentLevel ?? AUTO;
41838
41880
  }
41839
41881
  get isReady() {
41840
41882
  return this._isReadyState;
@@ -41842,7 +41884,7 @@ class HlsPlayback extends BasePlayback {
41842
41884
  set currentLevel(id) {
41843
41885
  this._currentLevel = id;
41844
41886
  this.trigger(Events$1.PLAYBACK_LEVEL_SWITCH_START);
41845
- assert.ok(this._hls, 'Hls.js instance is not available');
41887
+ assert.ok(this._hls, 'HLS.js is not initialized');
41846
41888
  if (this.options.playback.hlsUseNextLevel) {
41847
41889
  this._hls.nextLevel = this._currentLevel;
41848
41890
  }
@@ -41851,11 +41893,11 @@ class HlsPlayback extends BasePlayback {
41851
41893
  }
41852
41894
  }
41853
41895
  get latency() {
41854
- assert.ok(this._hls, 'Hls.js instance is not available');
41896
+ assert.ok(this._hls, 'HLS.js is not initialized');
41855
41897
  return this._hls.latency;
41856
41898
  }
41857
41899
  get currentProgramDateTime() {
41858
- assert.ok(this._hls, 'Hls.js instance is not available');
41900
+ assert.ok(this._hls, 'HLS.js is not initialized');
41859
41901
  assert.ok(this._hls.playingDate, 'Hls.js playingDate is not defined');
41860
41902
  return this._hls.playingDate;
41861
41903
  }
@@ -42026,7 +42068,7 @@ class HlsPlayback extends BasePlayback {
42026
42068
  maxBufferLength: 2,
42027
42069
  maxMaxBufferLength: 4,
42028
42070
  }, this.options.playback.hlsjsConfig);
42029
- trace(`${T$i} _createHLSInstance`, { config });
42071
+ trace(`${T$j} _createHLSInstance`, { config });
42030
42072
  this._hls = new Hls(config);
42031
42073
  }
42032
42074
  _attachHLSMedia() {
@@ -42040,7 +42082,7 @@ class HlsPlayback extends BasePlayback {
42040
42082
  return;
42041
42083
  }
42042
42084
  this._hls.once(Hls.Events.MEDIA_ATTACHED, () => {
42043
- assert.ok(this._hls, 'Hls.js instance is not available');
42085
+ assert.ok(this._hls, 'HLS.js is not initialized');
42044
42086
  this.options.hlsPlayback.preload && this._hls.loadSource(this.options.src);
42045
42087
  });
42046
42088
  const onPlaying = () => {
@@ -42065,13 +42107,15 @@ class HlsPlayback extends BasePlayback {
42065
42107
  // this._hls.on(HLSJS.Events.SUBTITLE_TRACK_LOADED, (evt, data) => this._onSubtitleLoaded(evt, data));
42066
42108
  this._hls.on(Hls.Events.SUBTITLE_TRACK_LOADED, () => this._onSubtitleLoaded());
42067
42109
  this._hls.on(Hls.Events.SUBTITLE_TRACKS_UPDATED, () => (this._ccTracksUpdated = true));
42110
+ this._hls.on(Events.AUDIO_TRACKS_UPDATED, (evt, data) => this._onAudioTracksUpdated(evt, data));
42111
+ this._hls.on(Events.AUDIO_TRACK_SWITCHED, (evt, data) => this._onAudioTrackSwitched(evt, data));
42068
42112
  this.bindCustomListeners();
42069
42113
  }
42070
42114
  bindCustomListeners() {
42071
42115
  this.customListeners.forEach((item) => {
42072
42116
  const requestedEventName = item.eventName;
42073
42117
  const typeOfListener = item.once ? 'once' : 'on';
42074
- assert.ok(this._hls, 'Hls.js instance is not available');
42118
+ assert.ok(this._hls, 'HLS.js is not initialized');
42075
42119
  requestedEventName &&
42076
42120
  this._hls[`${typeOfListener}`](requestedEventName, item.callback);
42077
42121
  });
@@ -42079,7 +42123,7 @@ class HlsPlayback extends BasePlayback {
42079
42123
  unbindCustomListeners() {
42080
42124
  this.customListeners.forEach((item) => {
42081
42125
  const requestedEventName = item.eventName;
42082
- assert.ok(this._hls, 'Hls.js instance is not available');
42126
+ assert.ok(this._hls, 'HLS.js is not initialized');
42083
42127
  requestedEventName && this._hls.off(requestedEventName, item.callback);
42084
42128
  });
42085
42129
  }
@@ -42103,7 +42147,7 @@ class HlsPlayback extends BasePlayback {
42103
42147
  this.trigger(Events$1.PLAYBACK_READY, this.name);
42104
42148
  }
42105
42149
  _recover(evt, data, error) {
42106
- assert(this._hls, 'Hls.js instance is not available');
42150
+ assert(this._hls, 'HLS.js is not initialized');
42107
42151
  if (!this._recoveredDecodingError) {
42108
42152
  this._recoveredDecodingError = true;
42109
42153
  this._hls.recoverMediaError();
@@ -42115,7 +42159,7 @@ class HlsPlayback extends BasePlayback {
42115
42159
  }
42116
42160
  else {
42117
42161
  Log.error('hlsjs: failed to recover', { evt, data });
42118
- trace(`${T$i} _recover failed to recover`, {
42162
+ trace(`${T$j} _recover failed to recover`, {
42119
42163
  type: data.type,
42120
42164
  details: data.details,
42121
42165
  });
@@ -42201,7 +42245,7 @@ class HlsPlayback extends BasePlayback {
42201
42245
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
42202
42246
  }
42203
42247
  _onHLSJSError(evt, data) {
42204
- trace(`${T$i} _onHLSJSError`, {
42248
+ trace(`${T$j} _onHLSJSError`, {
42205
42249
  fatal: data.fatal,
42206
42250
  type: data.type,
42207
42251
  details: data.details,
@@ -42249,7 +42293,7 @@ class HlsPlayback extends BasePlayback {
42249
42293
  evt,
42250
42294
  data,
42251
42295
  });
42252
- trace(`${T$i} _onHLSJSError trying to recover from network error`, {
42296
+ trace(`${T$j} _onHLSJSError trying to recover from network error`, {
42253
42297
  details: data.details,
42254
42298
  });
42255
42299
  error.level = PlayerError.Levels.WARN;
@@ -42262,14 +42306,10 @@ class HlsPlayback extends BasePlayback {
42262
42306
  evt,
42263
42307
  data,
42264
42308
  });
42265
- trace(`${T$i} _onHLSJSError trying to recover from media error`, {
42309
+ trace(`${T$j} _onHLSJSError trying to recover from media error`, {
42266
42310
  details: data.details,
42267
42311
  });
42268
42312
  error.level = PlayerError.Levels.WARN;
42269
- // TODO check
42270
- // if (data.error instanceof MediaError && data.error.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {
42271
- // error.code = PlaybackErrorCode.MediaSourceUnavailable
42272
- // }
42273
42313
  this._recover(evt, data, error);
42274
42314
  break;
42275
42315
  default:
@@ -42296,7 +42336,7 @@ class HlsPlayback extends BasePlayback {
42296
42336
  return;
42297
42337
  }
42298
42338
  Log.warn('hlsjs: non-fatal error occurred', { evt, data });
42299
- trace(`${T$i} _onHLSJSError non-fatal error occurred`, {
42339
+ trace(`${T$j} _onHLSJSError non-fatal error occurred`, {
42300
42340
  type: data.type,
42301
42341
  details: data.details,
42302
42342
  });
@@ -42411,7 +42451,7 @@ class HlsPlayback extends BasePlayback {
42411
42451
  }
42412
42452
  }
42413
42453
  _fillLevels() {
42414
- assert.ok(this._hls, 'Hls.js instance is not available');
42454
+ assert.ok(this._hls, 'HLS.js is not initialized');
42415
42455
  this._levels = this._hls.levels.map((level, index) => {
42416
42456
  return {
42417
42457
  level: index, // or level.id?
@@ -42612,6 +42652,34 @@ class HlsPlayback extends BasePlayback {
42612
42652
  }));
42613
42653
  this.stop();
42614
42654
  }
42655
+ get audioTracks() {
42656
+ assert.ok(this._hls, 'HLS.js is not initialized');
42657
+ return this._hls.audioTracks.map(toClapprTrack);
42658
+ }
42659
+ // @ts-expect-error
42660
+ get currentAudioTrack() {
42661
+ assert.ok(this._hls, 'HLS.js is not initialized');
42662
+ const idx = this._hls.audioTrack;
42663
+ const track = this._hls.audioTracks[idx]; // TODO or find by .id == idx?
42664
+ if (track) {
42665
+ return toClapprTrack(track);
42666
+ }
42667
+ return null;
42668
+ }
42669
+ switchAudioTrack(id) {
42670
+ assert.ok(this._hls, 'HLS.js is not initialized');
42671
+ this._hls.audioTrack = Number(id); // TODO or find index by .id == id?
42672
+ }
42673
+ _onAudioTracksUpdated(_, data) {
42674
+ trace(`${T$j} onAudioTracksUpdated`);
42675
+ this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, data.audioTracks.map(toClapprTrack));
42676
+ }
42677
+ _onAudioTrackSwitched(_, data) {
42678
+ trace(`${T$j} onAudioTrackSwitched`);
42679
+ // @ts-ignore
42680
+ const track = this._hls.audioTracks[data.id];
42681
+ this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack(track));
42682
+ }
42615
42683
  }
42616
42684
  HlsPlayback.canPlay = function (resource, mimeType) {
42617
42685
  if (!isHlsSource(resource, mimeType)) {
@@ -42619,8 +42687,16 @@ HlsPlayback.canPlay = function (resource, mimeType) {
42619
42687
  }
42620
42688
  return Hls.isSupported();
42621
42689
  };
42690
+ function toClapprTrack(t) {
42691
+ return {
42692
+ id: String(t.id),
42693
+ language: t.lang ?? '',
42694
+ kind: t.type === 'main' ? 'main' : 'description', // TODO check
42695
+ label: t.name,
42696
+ };
42697
+ }
42622
42698
 
42623
- const T$h = 'playback.html5_video';
42699
+ const T$i = 'playback.html5_video';
42624
42700
  const STALL_TIMEOUT = 15000;
42625
42701
  class HTML5Video extends BasePlayback {
42626
42702
  stallTimerId = null;
@@ -42628,7 +42704,7 @@ class HTML5Video extends BasePlayback {
42628
42704
  * @internal
42629
42705
  */
42630
42706
  createError(errorData, options) {
42631
- trace(`${T$h} createError`, {
42707
+ trace(`${T$i} createError`, {
42632
42708
  errorData: { ...errorData },
42633
42709
  });
42634
42710
  const i18n = this.i18n ||
@@ -42639,20 +42715,16 @@ class HTML5Video extends BasePlayback {
42639
42715
  if (i18n &&
42640
42716
  !errorData.UI &&
42641
42717
  errorData.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {
42642
- // errorData.UI = {
42643
- // title: i18n.t('no_broadcast'),
42644
- // message: errorData.message,
42645
- // }
42646
42718
  errorData.code = PlaybackErrorCode.MediaSourceUnavailable;
42647
42719
  }
42648
42720
  return super.createError(errorData, { ...options, useCodePrefix: false });
42649
42721
  }
42650
42722
  _onWaiting() {
42651
- trace(`${T$h} _onWaiting`);
42723
+ trace(`${T$i} _onWaiting`);
42652
42724
  super._onWaiting();
42653
42725
  }
42654
42726
  _onEnded() {
42655
- trace(`${T$h} _onEnded`);
42727
+ trace(`${T$i} _onEnded`);
42656
42728
  if (this.stallTimerId) {
42657
42729
  clearTimeout(this.stallTimerId);
42658
42730
  this.stallTimerId = null;
@@ -42660,12 +42732,12 @@ class HTML5Video extends BasePlayback {
42660
42732
  super._onEnded();
42661
42733
  }
42662
42734
  _handleBufferingEvents() {
42663
- trace(`${T$h} _handleBufferingEvents`, {
42735
+ trace(`${T$i} _handleBufferingEvents`, {
42664
42736
  networkState: this.el.networkState,
42665
42737
  });
42666
42738
  if (!this.stallTimerId) {
42667
42739
  this.stallTimerId = setTimeout(() => {
42668
- trace(`${T$h} _handleBufferingEvents stall timeout`, {
42740
+ trace(`${T$i} _handleBufferingEvents stall timeout`, {
42669
42741
  buffering: this.buffering,
42670
42742
  ended: this.ended,
42671
42743
  });
@@ -42683,7 +42755,7 @@ class HTML5Video extends BasePlayback {
42683
42755
  super._handleBufferingEvents();
42684
42756
  }
42685
42757
  _onPlaying() {
42686
- trace(`${T$h} _onPlaying`);
42758
+ trace(`${T$i} _onPlaying`);
42687
42759
  if (this.stallTimerId) {
42688
42760
  clearTimeout(this.stallTimerId);
42689
42761
  this.stallTimerId = null;
@@ -42691,13 +42763,66 @@ class HTML5Video extends BasePlayback {
42691
42763
  super._onPlaying();
42692
42764
  }
42693
42765
  _onPause() {
42694
- trace(`${T$h} _onPause`);
42766
+ trace(`${T$i} _onPause`);
42695
42767
  super._onPause();
42696
42768
  if (this.stallTimerId) {
42697
42769
  clearTimeout(this.stallTimerId);
42698
42770
  this.stallTimerId = null;
42699
42771
  }
42700
42772
  }
42773
+ get audioTracks() {
42774
+ const tracks = this.el.audioTracks;
42775
+ const supported = !!tracks;
42776
+ trace(`${T$i} get audioTracks`, { supported });
42777
+ const retval = [];
42778
+ if (supported) {
42779
+ for (let i = 0; i < tracks.length; i++) {
42780
+ const track = tracks[i];
42781
+ retval.push({
42782
+ id: track.id,
42783
+ label: track.label,
42784
+ language: track.language,
42785
+ kind: track.kind, // TODO check
42786
+ });
42787
+ }
42788
+ }
42789
+ return retval;
42790
+ }
42791
+ // @ts-expect-error
42792
+ get currentAudioTrack() {
42793
+ const tracks = this.el.audioTracks;
42794
+ const supported = !!tracks;
42795
+ trace(`${T$i} get currentAudioTrack`, {
42796
+ supported,
42797
+ });
42798
+ if (supported) {
42799
+ for (let i = 0; i < tracks.length; i++) {
42800
+ const track = tracks[i];
42801
+ if (track.enabled) {
42802
+ return {
42803
+ id: track.id,
42804
+ label: track.label,
42805
+ language: track.language,
42806
+ kind: track.kind,
42807
+ };
42808
+ }
42809
+ }
42810
+ }
42811
+ return null;
42812
+ }
42813
+ switchAudioTrack(id) {
42814
+ const tracks = this.el.audioTracks;
42815
+ const supported = !!tracks;
42816
+ trace(`${T$i} switchAudioTrack`, {
42817
+ supported,
42818
+ });
42819
+ if (supported) {
42820
+ for (let i = 0; i < tracks.length; i++) {
42821
+ const track = tracks[i];
42822
+ track.enabled = track.id === id;
42823
+ }
42824
+ }
42825
+ }
42701
42826
  }
42702
42827
 
42703
42828
  // TODO consider allowing the variation of the order of playback modules
@@ -42707,7 +42832,7 @@ function registerPlaybacks() {
42707
42832
  Loader.registerPlayback(DashPlayback);
42708
42833
  }
42709
42834
 
42710
- const T$g = 'GPlayer';
42835
+ const T$h = 'GPlayer';
42711
42836
  const DEFAULT_OPTIONS = {
42712
42837
  autoPlay: false,
42713
42838
  debug: 'none',
@@ -42802,7 +42927,7 @@ class Player {
42802
42927
  }
42803
42928
  const coreOpts = this.buildCoreOptions(playerElement);
42804
42929
  const { core, container } = Player.getRegisteredPlugins();
42805
- trace(`${T$g} init`, {
42930
+ trace(`${T$h} init`, {
42806
42931
  registeredPlaybacks: Loader.registeredPlaybacks.map((p) => p.prototype.name),
42807
42932
  });
42808
42933
  coreOpts.plugins = {
@@ -42816,7 +42941,7 @@ class Player {
42816
42941
  * Destroys the player, releasing all resources and unmounting its UI from the DOM.
42817
42942
  */
42818
42943
  destroy() {
42819
- trace(`${T$g} destroy`, {
42944
+ trace(`${T$h} destroy`, {
42820
42945
  player: !!this.player,
42821
42946
  });
42822
42947
  if (this.player) {
@@ -43003,7 +43128,7 @@ class Player {
43003
43128
  this.config = $.extend(true, this.config, config);
43004
43129
  }
43005
43130
  initPlayer(coreOptions) {
43006
- trace(`${T$g} initPlayer`, {
43131
+ trace(`${T$h} initPlayer`, {
43007
43132
  autoPlay: coreOptions.autoPlay,
43008
43133
  sources: coreOptions.sources,
43009
43134
  // TODO selected options
@@ -43028,7 +43153,7 @@ class Player {
43028
43153
  }
43029
43154
  }
43030
43155
  triggerAutoPlay() {
43031
- trace(`${T$g} triggerAutoPlay`);
43156
+ trace(`${T$h} triggerAutoPlay`);
43032
43157
  setTimeout(() => {
43033
43158
  this.player?.play({
43034
43159
  autoPlay: true,
@@ -43046,7 +43171,7 @@ class Player {
43046
43171
  // TODO test
43047
43172
  events = {
43048
43173
  onReady: () => {
43049
- trace(`${T$g} onReady`, {
43174
+ trace(`${T$h} onReady`, {
43050
43175
  ready: this.ready,
43051
43176
  });
43052
43177
  if (this.ready) {
@@ -43080,7 +43205,7 @@ class Player {
43080
43205
  buildCoreOptions(rootNode) {
43081
43206
  const sources = this.buildMediaSourcesList();
43082
43207
  const source = sources[0];
43083
- trace(`${T$g} buildCoreOptions`, {
43208
+ trace(`${T$h} buildCoreOptions`, {
43084
43209
  source,
43085
43210
  sources,
43086
43211
  });
@@ -43141,7 +43266,7 @@ class Player {
43141
43266
  assert.ok(this.player, 'Player is not initialized');
43142
43267
  const core = this.player.core;
43143
43268
  core.on(Events$1.CORE_SCREEN_ORIENTATION_CHANGED, ({ orientation }) => {
43144
- trace(`${T$g} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43269
+ trace(`${T$h} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43145
43270
  orientation,
43146
43271
  rootNode: {
43147
43272
  width: this.rootNode?.clientWidth,
@@ -43156,14 +43281,14 @@ class Player {
43156
43281
  }
43157
43282
  }, null);
43158
43283
  core.on(Events$1.CORE_RESIZE, ({ width, height }) => {
43159
- trace(`${T$g} on CORE_RESIZE`, {
43284
+ trace(`${T$h} on CORE_RESIZE`, {
43160
43285
  width,
43161
43286
  height,
43162
43287
  });
43163
43288
  this.safeTriggerEvent(PlayerEvent.Resize, { width, height });
43164
43289
  }, null);
43165
43290
  core.on(Events$1.CORE_FULLSCREEN, (isFullscreen) => {
43166
- trace(`${T$g} CORE_FULLSCREEN`, {
43291
+ trace(`${T$h} CORE_FULLSCREEN`, {
43167
43292
  isFullscreen,
43168
43293
  });
43169
43294
  this.safeTriggerEvent(PlayerEvent.Fullscreen, isFullscreen);
@@ -43171,7 +43296,7 @@ class Player {
43171
43296
  }
43172
43297
  }
43173
43298
 
43174
- var version$1 = "2.20.22";
43299
+ var version$1 = "2.21.1";
43175
43300
 
43176
43301
  var packages = {
43177
43302
  "node_modules/@clappr/core": {
@@ -43195,20 +43320,23 @@ function version() {
43195
43320
  };
43196
43321
  }
43197
43322
 
43198
- const pluginHtml$7 = "<button data-track-selector-button class='gcore-skin-button-color'>\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color'>\n <% for (var i = 0; i < tracks.length; i++) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-track-selector-select=\"<%= tracks[i].id %>\">\n <%= tracks[i].label || tracks[i].name %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43323
+ const pluginHtml$7 = "<button data-track-selector-button class='gcore-skin-button-color'>\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color'>\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-track-selector-select=\"<%= track.id %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43199
43324
 
43200
43325
  const audioArrow = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg width=\"9px\" height=\"6px\" viewBox=\"0 0 9 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <!-- Generator: Sketch 49 (51002) - http://www.bohemiancoding.com/sketch -->\n <title>quality-arrow</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"quality-arrow\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M5.07079194,5.78553848 C4.91457318,5.94277844 4.70551573,6.00941824 4.50028717,5.99893557 C4.2950586,6.00941824 4.08676693,5.94277844 3.92978239,5.78553848 L0.221118462,1.2997069 C-0.0737061539,1.00469478 -0.0737061539,0.526236029 0.221118462,0.231972666 C0.515177299,-0.0630394586 1.23500883,0.00734414472 1.64852907,0.00734414472 L7.77475484,0.00734414472 C8.21201421,0.00734414472 8.48539703,-0.0630394586 8.77945587,0.231972666 C9.07351471,0.526236029 9.07351471,1.00469478 8.77945587,1.2997069 L5.07079194,5.78553848 Z\"\n fill=\"#FFFFFE\"></path>\n </g>\n</svg>\n";
43201
43326
 
43202
43327
  const VERSION$6 = '0.0.1';
43203
- // const T = 'plugins.audio_selector';
43204
- const AUTO = 0;
43328
+ const T$g = 'plugins.audio_selector';
43205
43329
  /**
43206
- * `PLUGIN` that adds an audio track selector to the media control UI.
43330
+ * `PLUGIN` that makes possible to switch audio tracks via the media control UI.
43207
43331
  * @beta
43332
+ * @remarks
43333
+ * The plugin is activated when there are multiple audio tracks available.
43334
+ * The plugin adds a button showing the current audio track and a dropdown to switch to another audio track.
43335
+ * Depends on:
43336
+ *
43337
+ * - {@link MediaControl}
43208
43338
  */
43209
43339
  class AudioSelector extends UICorePlugin {
43210
- // TODO
43211
- selectedTrackId;
43212
43340
  currentTrack = null;
43213
43341
  tracks = [];
43214
43342
  /**
@@ -43235,7 +43363,7 @@ class AudioSelector extends UICorePlugin {
43235
43363
  */
43236
43364
  get attributes() {
43237
43365
  return {
43238
- class: this.name,
43366
+ class: 'media-control-audio-tracks',
43239
43367
  'data-track-selector': '',
43240
43368
  };
43241
43369
  }
@@ -43252,101 +43380,49 @@ class AudioSelector extends UICorePlugin {
43252
43380
  * @internal
43253
43381
  */
43254
43382
  bindEvents() {
43255
- this.listenTo(this.core, Events$1.CORE_READY, this.bindPlaybackEvents);
43256
- // TODO CORE_ACTIVE_CONTAINER_CHANGED
43257
- this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED, this.reload);
43258
- this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
43259
- this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectTrackMenu);
43383
+ this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
43384
+ this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
43260
43385
  }
43261
- unBindEvents() {
43262
- // @ts-ignore
43263
- this.stopListening(this.core, Events$1.CORE_READY);
43264
- // @ts-ignore
43265
- this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED);
43266
- // @ts-ignore
43267
- this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED);
43268
- // @ts-ignore
43269
- this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE);
43386
+ onCoreReady() {
43387
+ trace(`${T$g} onCoreReady`);
43388
+ const mediaControl = this.core.getPlugin('media_control');
43389
+ assert(mediaControl, 'media_control plugin is required');
43390
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
43391
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectTrackMenu);
43270
43392
  }
43271
43393
  bindPlaybackEvents() {
43272
- // this.currentTrack = {};
43273
- // this.removeAuto = false;
43274
- this.selectedTrackId = undefined;
43275
- const currentPlayback = this.core.activePlayback;
43276
- this.listenTo(currentPlayback, Events$1.PLAYBACK_STOP, this.onStop);
43394
+ trace(`${T$g} bindPlaybackEvents`);
43395
+ this.currentTrack = null;
43396
+ this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_STOP, this.onStop);
43277
43397
  this.setupAudioTrackListeners();
43278
43398
  }
43279
43399
  setupAudioTrackListeners() {
43280
- const currentPlayback = this.core.activePlayback;
43281
- // TODO no-crutch:currentPlayback._hls
43282
- if (currentPlayback._hls) {
43283
- // TODO AUDIO_TRACKS_UPDATED
43284
- // currentPlayback._hls.on('hlsAudioTracksUpdated', (e, data) => {
43285
- currentPlayback._hls.on(Events.AUDIO_TRACKS_UPDATED, (e, data) => {
43286
- // let id = -1;
43287
- // for (const audioTrack of data.audioTracks) {
43288
- // if (audioTrack.default) {
43289
- // id = audioTrack.id;
43290
- // this.currentTrack = audioTrack;
43291
- // }
43292
- // }
43293
- const defaultTrack = data.audioTracks.find((track) => track.default);
43294
- if (defaultTrack) {
43295
- this.currentTrack = {
43296
- id: defaultTrack.id,
43297
- label: defaultTrack.name,
43298
- };
43299
- }
43300
- this.fillTracks(data.audioTracks.map((p) => ({
43301
- id: p.id,
43302
- label: p.name,
43303
- })), defaultTrack?.id);
43304
- });
43305
- currentPlayback._hls.on(Events.AUDIO_TRACK_SWITCHING, this.startTrackSwitch.bind(this));
43306
- currentPlayback._hls.on(Events.AUDIO_TRACK_SWITCHED, this.updateCurrentTrack.bind(this));
43307
- currentPlayback._hls.on(Events.AUDIO_TRACK_LOADED, this.updateCurrentTrack.bind(this));
43308
- }
43309
- else {
43310
- this.listenToOnce(currentPlayback, Events$1.PLAYBACK_PLAY, () => {
43311
- const mediaElement = currentPlayback.$el.get(0);
43312
- // const { audioTracks } = currentPlayback.$el.get(0);
43313
- const audioTracks = mediaElement.audioTracks;
43314
- if (audioTracks && audioTracks.length) {
43315
- let index = 0;
43316
- const trackItems = [];
43317
- for (const audioTrack of audioTracks) {
43318
- if (audioTrack.enabled) {
43319
- const t = {
43320
- id: index,
43321
- label: audioTrack.label,
43322
- };
43323
- this.currentTrack = t;
43324
- trackItems.push(t);
43325
- index++;
43326
- }
43327
- }
43328
- audioTracks.addEventListener('change', () => this.updateCurrentTrackW3C());
43329
- this.fillTracks(trackItems, trackItems[0].id);
43330
- }
43331
- });
43332
- }
43400
+ this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_AUDIO_AVAILABLE, (tracks) => {
43401
+ trace(`${T$g} on PLAYBACK_AUDIO_AVAILABLE`, { audioTracks: tracks });
43402
+ this.currentTrack =
43403
+ tracks.find((track) => track.kind === 'main') ?? null;
43404
+ this.fillTracks(tracks);
43405
+ });
43406
+ this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_AUDIO_CHANGED, (track) => {
43407
+ trace(`${T$g} PLAYBACK_AUDIO_CHANGED`, { audioTrack: track });
43408
+ this.currentTrack = track;
43409
+ this.highlightCurrentTrack();
43410
+ this.buttonElement().removeClass('changing');
43411
+ this.updateText();
43412
+ });
43333
43413
  }
43334
- onStop() { }
43335
- reload() {
43336
- this.unBindEvents();
43337
- this.bindEvents();
43414
+ onStop() {
43415
+ trace(`${T$g} onStop`);
43416
+ }
43417
+ onActiveContainerChanged() {
43418
+ trace(`${T$g} onActiveContainerChanged`);
43338
43419
  this.bindPlaybackEvents();
43339
43420
  }
43340
43421
  shouldRender() {
43341
- if (!this.core.activeContainer) {
43342
- return false;
43343
- }
43344
- const currentPlayback = this.core.activePlayback;
43345
- if (!currentPlayback) {
43422
+ if (!this.core.activePlayback) {
43346
43423
  return false;
43347
43424
  }
43348
- const { audioTracks } = currentPlayback.activePlayback._hls || currentPlayback.$el.get(0);
43349
- this.tracks = audioTracks;
43425
+ this.tracks = this.core.activePlayback.audioTracks;
43350
43426
  // Only care if we have at least 2 to choose from
43351
43427
  return this.tracks && this.tracks.length > 1;
43352
43428
  }
@@ -43358,145 +43434,74 @@ class AudioSelector extends UICorePlugin {
43358
43434
  return this;
43359
43435
  }
43360
43436
  const mediaControl = this.core.getPlugin('media_control');
43361
- assert(mediaControl, 'media_control plugin is required');
43362
43437
  this.$el.html(AudioSelector.template({ tracks: this.tracks, title: this.getTitle() }));
43363
- const ats = mediaControl.getElement('audioTracksSelector');
43364
- if (!(ats && ats.length > 0)) {
43365
- return this;
43366
- }
43367
- ats.append(this.el);
43438
+ this.$('.audio-arrow').append(audioArrow);
43439
+ mediaControl.putElement('audioTracksSelector', this.$el);
43440
+ this.updateText();
43368
43441
  this.highlightCurrentTrack();
43369
- const aa = ats.find('audioArrow');
43370
- if (aa.length > 0) {
43371
- aa.append(audioArrow);
43372
- }
43373
43442
  return this;
43374
43443
  }
43375
- fillTracks(tracks, selected = AUTO) {
43376
- if (this.selectedTrackId === undefined) {
43377
- this.selectedTrackId = selected;
43378
- }
43379
- // this.tracks = levels.audioTracks;
43380
- // for (let i = 0; i < this.tracks.length; i++) {
43381
- // if (this.tracks[i].name && !this.tracks[i].label) {
43382
- // this.tracks[i].label = this.tracks[i].name;
43383
- // }
43384
- // }
43444
+ fillTracks(tracks) {
43385
43445
  this.tracks = tracks;
43386
- // Player.player.trigger('tracks', this.tracks);
43387
- // this.core.trigger('tracks', this.tracks);
43388
43446
  this.render();
43389
43447
  }
43390
43448
  findTrackBy(id) {
43391
43449
  return this.tracks.find((track) => track.id === id);
43392
43450
  }
43393
43451
  onTrackSelect(event) {
43394
- // this.selectedTrackId = parseInt(event.target.dataset.levelSelectorSelect, 10)
43395
43452
  const id = event.target?.dataset?.trackSelectorSelect;
43396
43453
  if (id) {
43397
- this.setIndexTrack(Number(id));
43454
+ this.selectAudioTrack(id);
43398
43455
  }
43399
43456
  this.toggleContextMenu();
43400
43457
  event.stopPropagation();
43401
43458
  return false;
43402
43459
  }
43403
- setIndexTrack(index) {
43404
- this.selectedTrackId = index;
43405
- if (this.core.activePlayback._hls) {
43406
- if (this.core.activePlayback._hls.audioTrack.id === this.selectedTrackId) {
43407
- return;
43408
- }
43409
- this.core.activePlayback._hls.audioTrack = this.selectedTrackId;
43410
- }
43411
- else {
43412
- const { audioTracks } = this.core.activePlayback.$el.get(0);
43413
- for (const track of audioTracks) {
43414
- track.enabled = track.id === this.selectedTrackId;
43415
- }
43416
- }
43417
- this.updateText(this.selectedTrackId);
43460
+ selectAudioTrack(id) {
43461
+ this.startTrackSwitch();
43462
+ this.core.activePlayback.switchAudioTrack(id);
43463
+ this.updateText();
43418
43464
  }
43419
43465
  onShowLevelSelectMenu() {
43420
43466
  this.toggleContextMenu();
43421
43467
  }
43422
43468
  hideSelectTrackMenu() {
43423
- this.$('.audio_selector ul').hide();
43469
+ this.$('ul').hide();
43424
43470
  }
43425
43471
  toggleContextMenu() {
43426
- this.$('.audio_selector ul').toggle();
43472
+ this.$('ul').toggle();
43427
43473
  }
43428
43474
  buttonElement() {
43429
- return this.$('.audio_selector button');
43475
+ return this.$('button');
43430
43476
  }
43431
43477
  buttonElementText() {
43432
- return this.$('.audio_selector button .audio-text');
43478
+ return this.$('button .audio-text');
43433
43479
  }
43434
43480
  trackElement(id) {
43435
- return this.$('.audio_selector ul a' +
43481
+ return this.$('ul a' +
43436
43482
  (id !== undefined ? '[data-track-selector-select="' + id + '"]' : '')).parent();
43437
43483
  }
43438
43484
  getTitle() {
43439
- if (!this.tracks) {
43440
- return '';
43441
- }
43442
- const selectedTrackId = this.selectedTrackId || 0;
43443
- const selectedTrack = this.tracks[selectedTrackId];
43444
- return selectedTrack?.label || '';
43485
+ return this.currentTrack?.label || '';
43445
43486
  }
43446
43487
  startTrackSwitch() {
43447
43488
  this.buttonElement().addClass('changing');
43448
43489
  }
43449
- updateText(trackId) {
43450
- if (trackId === undefined) {
43490
+ updateText() {
43491
+ if (!this.currentTrack) {
43451
43492
  return;
43452
43493
  }
43453
- const track = this.findTrackBy(trackId);
43454
- if (track) {
43455
- this.buttonElementText().text(track.label);
43456
- }
43457
- }
43458
- updateCurrentTrack(e, info) {
43459
- // if (!info) {
43460
- // const { audioTracks } = this.core.activePlayback.$el.get(0);
43461
- // for (const track of audioTracks) {
43462
- // if (track.enabled) {
43463
- // info = track;
43464
- // }
43465
- // }
43466
- // }
43467
- // if (!info) {
43468
- // return;
43469
- // }
43470
- // const track = this.findTrackBy(info.id);
43471
- // this.currentTrack = track ? track : null;
43472
- // this.selectedTrackId = track?.id;
43473
- // this.highlightCurrentTrack();
43474
- // this.buttonElement().removeClass('changing');
43475
- this.setCurrentTrack(info.id);
43476
- }
43477
- updateCurrentTrackW3C() {
43478
- const { audioTracks } = this.core.activePlayback.$el.get(0);
43479
- const index = audioTracks.findIndex((track) => track.enabled);
43480
- if (index >= 0) {
43481
- this.setCurrentTrack(index);
43482
- }
43483
- }
43484
- setCurrentTrack(index) {
43485
- const track = this.findTrackBy(index);
43486
- this.currentTrack = track ?? null;
43487
- this.selectedTrackId = index;
43488
- this.highlightCurrentTrack();
43489
- this.buttonElement().removeClass('changing');
43494
+ this.buttonElementText().text(this.currentTrack.label);
43490
43495
  }
43491
43496
  highlightCurrentTrack() {
43492
43497
  this.trackElement().removeClass('current');
43493
43498
  this.trackElement().find('a').removeClass('gcore-skin-active');
43494
43499
  if (this.currentTrack) {
43495
- const currentTrackElement = this.trackElement(this.currentTrack.id);
43496
- currentTrackElement.addClass('current');
43497
- currentTrackElement.find('a').addClass('gcore-skin-active');
43500
+ this.trackElement(this.currentTrack.id)
43501
+ .addClass('current')
43502
+ .find('a')
43503
+ .addClass('gcore-skin-active');
43498
43504
  }
43499
- this.updateText(this.selectedTrackId);
43500
43505
  }
43501
43506
  }
43502
43507
 
@@ -43650,7 +43655,7 @@ class BigMuteButton extends UICorePlugin {
43650
43655
  }
43651
43656
  }
43652
43657
 
43653
- const pluginHtml$5 = "<div class=\"media-control-gear\" data-<%= name %>>\n <button type=\"button\" class=\"button-gear gplayer-lite-btn gcore-skin-button-color\" data-gear-button=\"-1\">\n <span class=\"gear-icon\"><%= icon %></span>\n </button>\n <div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\">\n <% items.forEach(function (gear) { %>\n <li data-<%= gear %>></li>\n <% }); %>\n </ul>\n </div>\n</div>\n";
43658
+ const pluginHtml$5 = "<button type=\"button\" class=\"button-gear media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" data-gear-button=\"-1\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\">\n <% for (const item of items) { %>\n <li data-<%= item %>></li>\n <% } %>\n </ul>\n</div>";
43654
43659
 
43655
43660
  const gearIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_660_1503)\">\n <path\n d=\"M19.14 12.94C19.18 12.64 19.2 12.33 19.2 12C19.2 11.68 19.18 11.36 19.13 11.06L21.16 9.47999C21.34 9.33999 21.39 9.06999 21.28 8.86999L19.36 5.54999C19.24 5.32999 18.99 5.25999 18.77 5.32999L16.38 6.28999C15.88 5.90999 15.35 5.58999 14.76 5.34999L14.4 2.80999C14.36 2.56999 14.16 2.39999 13.92 2.39999H10.08C9.83999 2.39999 9.64999 2.56999 9.60999 2.80999L9.24999 5.34999C8.65999 5.58999 8.11999 5.91999 7.62999 6.28999L5.23999 5.32999C5.01999 5.24999 4.76999 5.32999 4.64999 5.54999L2.73999 8.86999C2.61999 9.07999 2.65999 9.33999 2.85999 9.47999L4.88999 11.06C4.83999 11.36 4.79999 11.69 4.79999 12C4.79999 12.31 4.81999 12.64 4.86999 12.94L2.83999 14.52C2.65999 14.66 2.60999 14.93 2.71999 15.13L4.63999 18.45C4.75999 18.67 5.00999 18.74 5.22999 18.67L7.61999 17.71C8.11999 18.09 8.64999 18.41 9.23999 18.65L9.59999 21.19C9.64999 21.43 9.83999 21.6 10.08 21.6H13.92C14.16 21.6 14.36 21.43 14.39 21.19L14.75 18.65C15.34 18.41 15.88 18.09 16.37 17.71L18.76 18.67C18.98 18.75 19.23 18.67 19.35 18.45L21.27 15.13C21.39 14.91 21.34 14.66 21.15 14.52L19.14 12.94ZM12 15.6C10.02 15.6 8.39999 13.98 8.39999 12C8.39999 10.02 10.02 8.39999 12 8.39999C13.98 8.39999 15.6 10.02 15.6 12C15.6 13.98 13.98 15.6 12 15.6Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_660_1503\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
43656
43661
 
@@ -43913,7 +43918,7 @@ function getPageX(event) {
43913
43918
  return 0;
43914
43919
  }
43915
43920
 
43916
- 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 renderBottomGear = function(name) { %>\n <div class=\"media-control-bottomgear\" data-<%= name %>></div>\n <% }; %>\n <% var renderPIP = function(name) { %>\n <div class=\"media-control-pip\" 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 renderAudioTracks = function(name) { %>\n <div class=\"media-control-audio-tracks\" data-<%= name %>></div>\n <% }; %>\n <% var renderSubtitles = function(name) { %>\n <div class=\"media-control-subtitles\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderClipsText = function(name) { %>\n\n <div class=\"media-clip-container gcore-skin-text-color\" data-<%= name %>>\n <div class=\"media-clip-point gcore-skin-text-color\" data-<%= name %>>•</div>\n <div class=\"media-clip-text gcore-skin-text-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderPlaybackRate = function(name) { %>\n <div class=\"media-control-playbackrate\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"bottomgear\") {\n renderBottomGear(setting)\n } else if (setting === \"pip\") {\n renderPIP(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"subtitles\") {\n renderSubtitles(setting)\n } else if (setting === \"playbackrate\") {\n renderPlaybackRate(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if (setting === \"clipsText\") {\n renderClipsText(setting)\n } else if (setting === \"audiotracks\") {\n renderAudioTracks(setting)\n } else {\n renderButton(setting);\n }\n });\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.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\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";
43921
+ 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 renderSubtitles = function(name) { %>\n <div class=\"media-control-subtitles\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderClipsText = function(name) { %>\n\n <div class=\"media-clip-container gcore-skin-text-color\" data-<%= name %>>\n <div class=\"media-clip-point gcore-skin-text-color\" data-<%= name %>>•</div>\n <div class=\"media-clip-text gcore-skin-text-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderPlaybackRate = function(name) { %>\n <div class=\"media-control-playbackrate\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"subtitles\") {\n renderSubtitles(setting)\n } else if (setting === \"playbackrate\") {\n renderPlaybackRate(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if (setting === \"clipsText\") {\n renderClipsText(setting)\n } else {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
43917
43922
 
43918
43923
  const playIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1564)\">\n <path d=\"M6 3V20L19.3571 11.5L6 3Z\" fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1564\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
43919
43924
 
@@ -43993,7 +43998,6 @@ class MediaControl extends UICorePlugin {
43993
43998
  userKeepVisible = false;
43994
43999
  verticalVolume = false;
43995
44000
  $audioTracksSelector = null;
43996
- $bottomGear = null;
43997
44001
  $clipText = null;
43998
44002
  $clipTextContainer = null;
43999
44003
  $duration = null;
@@ -44690,9 +44694,6 @@ class MediaControl extends UICorePlugin {
44690
44694
  this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
44691
44695
  this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
44692
44696
  this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
44693
- this.$bottomGear = this.$el.find('.media-control-bottomgear');
44694
- this.$pip = this.$el.find('.media-control-pip');
44695
- this.$audioTracksSelector = this.$el.find('.media-control-audio-tracks[data-audiotracks]');
44696
44697
  this.$subtitlesSelector = this.$el.find('.media-control-subtitles[data-subtitles]');
44697
44698
  this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
44698
44699
  this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
@@ -44705,6 +44706,7 @@ class MediaControl extends UICorePlugin {
44705
44706
  * Get a media control element DOM node
44706
44707
  * @param name - The name of the media control element
44707
44708
  * @returns The DOM node to render to or extend
44709
+ * @deprecated Use {@link MediaControl.putElement} instead
44708
44710
  * @remarks
44709
44711
  * Use this method to render custom media control UI in a plugin
44710
44712
  * @example
@@ -44722,14 +44724,13 @@ class MediaControl extends UICorePlugin {
44722
44724
  getElement(name) {
44723
44725
  switch (name) {
44724
44726
  case 'audioTracksSelector':
44725
- return this.$audioTracksSelector;
44727
+ return null;
44726
44728
  case 'clipText':
44727
44729
  return this.$clipText;
44728
- case 'bottomGear':
44729
44730
  case 'gear':
44730
- return this.$bottomGear;
44731
+ return null;
44731
44732
  case 'pip':
44732
- return this.$pip;
44733
+ return null;
44733
44734
  case 'playbackRate':
44734
44735
  return this.$playbackRate;
44735
44736
  case 'seekBarContainer':
@@ -44738,6 +44739,19 @@ class MediaControl extends UICorePlugin {
44738
44739
  return this.$subtitlesSelector;
44739
44740
  }
44740
44741
  }
44742
+ putElement(name, element) {
44743
+ switch (name) {
44744
+ case 'audioTracksSelector':
44745
+ this.getRightPanel().append(element);
44746
+ break;
44747
+ case 'pip':
44748
+ this.getRightPanel().append(element);
44749
+ break;
44750
+ case 'gear':
44751
+ this.getRightPanel().append(element);
44752
+ break;
44753
+ }
44754
+ }
44741
44755
  /**
44742
44756
  * Get the right panel area to append custom elements to
44743
44757
  * @returns ZeptoSelector of the right panel element
@@ -45065,8 +45079,7 @@ class BottomGear extends UICorePlugin {
45065
45079
  */
45066
45080
  get attributes() {
45067
45081
  return {
45068
- 'class': this.name,
45069
- 'data-track-selector': ''
45082
+ 'class': 'media-control-gear',
45070
45083
  };
45071
45084
  }
45072
45085
  /**
@@ -45081,18 +45094,15 @@ class BottomGear extends UICorePlugin {
45081
45094
  * @internal
45082
45095
  */
45083
45096
  bindEvents() {
45084
- const mediaControl = this.core.getPlugin('media_control');
45085
- assert(mediaControl, 'media_control plugin is required');
45097
+ this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
45086
45098
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
45087
- this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
45088
- this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
45089
45099
  }
45090
45100
  /**
45091
45101
  * @param name - Name of a gear menu placeholder item to attach custom UI
45092
45102
  * @returns Zepto result of the element
45093
45103
  */
45094
45104
  getElement(name) {
45095
- return this.core.getPlugin('media_control')?.getElement('gear')?.find(`.gear-options-list [data-${name}]`);
45105
+ return this.$el.find(`.gear-options-list [data-${name}]`);
45096
45106
  }
45097
45107
  /**
45098
45108
  * Replaces the content of the gear menu
@@ -45119,7 +45129,6 @@ class BottomGear extends UICorePlugin {
45119
45129
  */
45120
45130
  render() {
45121
45131
  const mediaControl = this.core.getPlugin('media_control');
45122
- assert(mediaControl, 'media_control plugin is required');
45123
45132
  // TODO use options.mediaControl.gear.items
45124
45133
  const items = [
45125
45134
  'quality',
@@ -45128,7 +45137,7 @@ class BottomGear extends UICorePlugin {
45128
45137
  ];
45129
45138
  const icon = this.isHd ? gearHdIcon : gearIcon;
45130
45139
  this.$el.html(BottomGear.template({ icon, items }));
45131
- mediaControl.getElement('gear')?.html(this.el);
45140
+ mediaControl.putElement('gear', this.$el);
45132
45141
  mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
45133
45142
  return this;
45134
45143
  }
@@ -45147,6 +45156,12 @@ class BottomGear extends UICorePlugin {
45147
45156
  hide() {
45148
45157
  this.$el.find('.gear-wrapper').hide();
45149
45158
  }
45159
+ onCoreReady() {
45160
+ const mediaControl = this.core.getPlugin('media_control');
45161
+ assert(mediaControl, 'media_control plugin is required');
45162
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
45163
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
45164
+ }
45150
45165
  }
45151
45166
 
45152
45167
  var mousetrap = {exports: {}};
@@ -48774,7 +48789,7 @@ class LevelSelector extends UICorePlugin {
48774
48789
  */
48775
48790
  get attributes() {
48776
48791
  return {
48777
- class: this.name,
48792
+ class: 'level-selector',
48778
48793
  'data-level-selector': '',
48779
48794
  };
48780
48795
  }
@@ -49589,7 +49604,7 @@ class MultiCamera extends UICorePlugin {
49589
49604
 
49590
49605
  const pipIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21.05 3.00001C21.302 3.00001 21.5435 3.10003 21.7217 3.27833C21.9 3.45646 22 3.69802 22 3.95003V10.6H20.1V4.90003H4.90001V18.2H10.6V20.1H3.95001C3.69802 20.1 3.45647 20 3.27832 19.8217C3.10002 19.6436 3 19.402 3 19.15V3.95001C3 3.69802 3.10002 3.45647 3.27832 3.27832C3.45644 3.10002 3.69801 3 3.95001 3L21.05 3.00001ZM21.05 12.5C21.302 12.5 21.5435 12.6 21.7217 12.7783C21.9 12.9565 22 13.198 22 13.45V19.15C22 19.402 21.9 19.6436 21.7217 19.8217C21.5436 20 21.302 20.1 21.05 20.1H13.45C13.198 20.1 12.9564 20 12.7783 19.8217C12.6 19.6436 12.5 19.402 12.5 19.15V13.45C12.5 13.198 12.6 12.9565 12.7783 12.7783C12.9564 12.6 13.198 12.5 13.45 12.5H21.05ZM7.47178 6.12823L9.60928 8.26572L11.5501 6.32492V11.5499H6.32509L8.26589 9.60911L6.12839 7.47161L7.47178 6.12823Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
49591
49606
 
49592
- const buttonHtml$1 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n <span><%= pipIcon %></span>\n</button>\n";
49607
+ const buttonHtml$1 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n <%= pipIcon %>\n</button>\n";
49593
49608
 
49594
49609
  const VERSION$2 = '0.0.1';
49595
49610
  const T$7 = `plugins.pip`;
@@ -49630,6 +49645,11 @@ class PictureInPicture extends UICorePlugin {
49630
49645
  'click button': 'togglePictureInPicture',
49631
49646
  };
49632
49647
  }
49648
+ get attributes() {
49649
+ return {
49650
+ 'class': 'media-control-pip',
49651
+ };
49652
+ }
49633
49653
  get videoElement() {
49634
49654
  return this.core.activePlayback.el;
49635
49655
  }
@@ -49657,7 +49677,7 @@ class PictureInPicture extends UICorePlugin {
49657
49677
  this.$el.html(t({ pipIcon }));
49658
49678
  const mediaControl = this.core.getPlugin('media_control');
49659
49679
  if (mediaControl) {
49660
- mediaControl.getElement('pip')?.html(this.el);
49680
+ mediaControl.putElement('pip', this.el);
49661
49681
  }
49662
49682
  return this;
49663
49683
  }
@@ -50608,7 +50628,6 @@ class SpinnerThreeBounce extends UIContainerPlugin {
50608
50628
  template = tmpl(spinnerHTML);
50609
50629
  hasFatalError = false;
50610
50630
  hasBuffering = false;
50611
- _showOnError = false;
50612
50631
  constructor(container) {
50613
50632
  super(container);
50614
50633
  this.listenTo(this.container, Events$1.CONTAINER_STATE_BUFFERING, this.onBuffering);
@@ -50619,9 +50638,6 @@ class SpinnerThreeBounce extends UIContainerPlugin {
50619
50638
  this.listenTo(this.container, Events$1.CONTAINER_ERROR, this.onError);
50620
50639
  this.listenTo(this.container, Events$1.CONTAINER_READY, this.render);
50621
50640
  }
50622
- showOnError() {
50623
- this._showOnError = true;
50624
- }
50625
50641
  onBuffering() {
50626
50642
  this.hasBuffering = true;
50627
50643
  this._show();
@@ -50638,27 +50654,17 @@ class SpinnerThreeBounce extends UIContainerPlugin {
50638
50654
  }
50639
50655
  onStop() {
50640
50656
  trace(`${T$4} onStop`, {
50641
- showOnError: this._showOnError,
50642
50657
  hasFatalError: this.hasFatalError,
50643
50658
  });
50644
- // if (!(this.hasFatalError && this._showOnError)) {
50645
- // this._hide()
50646
- // }
50647
50659
  this._hide();
50648
50660
  }
50649
50661
  onError(e) {
50650
50662
  this.hasFatalError = e.code === PlaybackErrorCode.MediaSourceUnavailable;
50651
50663
  trace(`${T$4} onError`, {
50652
50664
  e,
50653
- showOnError: this._showOnError,
50654
50665
  hasFatalError: this.hasFatalError,
50655
50666
  error: e.code,
50656
50667
  });
50657
- // if (this._showOnError) {
50658
- // this._show()
50659
- // } else {
50660
- // this._hide()
50661
- // }
50662
50668
  this._hide();
50663
50669
  }
50664
50670
  /**
@@ -50704,18 +50710,15 @@ class SpinnerThreeBounce extends UIContainerPlugin {
50704
50710
  * @internal
50705
50711
  */
50706
50712
  render() {
50707
- // TODO control via sourcecontroller instead
50708
- const showOnStart = this.options.spinner?.showOnStart;
50709
50713
  trace(`${T$4} render`, {
50710
50714
  buffering: this.container.buffering,
50711
- showOnStart,
50712
50715
  });
50713
50716
  this.$el.html(this.template());
50714
50717
  this.el.firstElementChild?.addEventListener('animationiteration', () => {
50715
50718
  this.trigger(SpinnerEvents.SYNC);
50716
50719
  });
50717
50720
  this.container.$el.append(this.$el[0]);
50718
- if (showOnStart || this.container.buffering) {
50721
+ if (this.container.buffering) {
50719
50722
  this._show();
50720
50723
  }
50721
50724
  else {
@@ -50832,7 +50835,6 @@ class SourceController extends CorePlugin {
50832
50835
  onCoreReady() {
50833
50836
  trace(`${T$3} onCoreReady`);
50834
50837
  this.core.getPlugin('error_screen')?.disable(); // TODO test
50835
- // this.core.getPlugin('spinner')?.showOnError()
50836
50838
  }
50837
50839
  onActiveContainerChanged() {
50838
50840
  trace(`${T$3} onActiveContainerChanged`, {