@gcorevideo/player 2.22.0 → 2.22.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 (68) hide show
  1. package/assets/bottom-gear/bottomgear copy.ejs +10 -0
  2. package/assets/bottom-gear/bottomgear.ejs +4 -8
  3. package/assets/bottom-gear/gear-sub-menu.scss +0 -1
  4. package/assets/bottom-gear/gear.scss +0 -1
  5. package/assets/clappr-nerd-stats/button.ejs +3 -3
  6. package/assets/level-selector/button.ejs +2 -4
  7. package/assets/level-selector/list.ejs +14 -10
  8. package/assets/level-selector/style.scss +9 -4
  9. package/assets/playback-rate/list.ejs +5 -5
  10. package/dist/core.js +1 -2
  11. package/dist/index.css +1104 -1103
  12. package/dist/index.js +3849 -3767
  13. package/dist/player.d.ts +10 -17
  14. package/dist/plugins/index.css +1541 -1540
  15. package/dist/plugins/index.js +3949 -3868
  16. package/docs/api/player.mediacontrol.md +8 -36
  17. package/docs/api/player.mediacontrol.toggleelement.md +72 -0
  18. package/docs/api/player.mediacontrolelement.md +1 -1
  19. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  20. package/lib/playback/dash-playback/DashPlayback.js +0 -1
  21. package/lib/plugins/bottom-gear/BottomGear.d.ts +65 -14
  22. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  23. package/lib/plugins/bottom-gear/BottomGear.js +113 -37
  24. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +2 -3
  25. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -1
  26. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +18 -15
  27. package/lib/plugins/dvr-controls/DvrControls.js +1 -1
  28. package/lib/plugins/level-selector/LevelSelector.d.ts +8 -11
  29. package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
  30. package/lib/plugins/level-selector/LevelSelector.js +66 -102
  31. package/lib/plugins/media-control/MediaControl.d.ts +7 -5
  32. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  33. package/lib/plugins/media-control/MediaControl.js +37 -19
  34. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
  35. package/lib/plugins/picture-in-picture/PictureInPicture.js +7 -2
  36. package/lib/plugins/playback-rate/PlaybackRate.d.ts +42 -14
  37. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  38. package/lib/plugins/playback-rate/PlaybackRate.js +101 -83
  39. package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
  40. package/lib/testUtils.d.ts +1 -0
  41. package/lib/testUtils.d.ts.map +1 -1
  42. package/lib/testUtils.js +13 -0
  43. package/package.json +1 -1
  44. package/src/playback/dash-playback/DashPlayback.ts +0 -1
  45. package/src/plugins/bottom-gear/BottomGear.ts +162 -72
  46. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +21 -5
  47. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +5 -12
  48. package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +27 -25
  49. package/src/plugins/dvr-controls/DvrControls.ts +1 -1
  50. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +1 -1
  51. package/src/plugins/level-selector/LevelSelector.ts +80 -120
  52. package/src/plugins/level-selector/__tests__/LevelSelector.test.ts +69 -79
  53. package/src/plugins/level-selector/__tests__/__snapshots__/LevelSelector.test.ts.snap +38 -71
  54. package/src/plugins/media-control/MediaControl.ts +51 -25
  55. package/src/plugins/media-control/__tests__/MediaControl.test.ts +4 -4
  56. package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -2
  57. package/src/plugins/playback-rate/PlaybackRate.ts +136 -108
  58. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +84 -37
  59. package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +55 -6
  60. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  61. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
  62. package/src/testUtils.ts +14 -0
  63. package/src/typings/vitest.d.ts +1 -0
  64. package/temp/player.api.json +66 -94
  65. package/tsconfig.tsbuildinfo +1 -1
  66. package/docs/api/player.mediacontrol.getcenterpanel.md +0 -18
  67. package/docs/api/player.mediacontrol.getleftpanel.md +0 -22
  68. package/docs/api/player.mediacontrol.getrightpanel.md +0 -22
@@ -48,7 +48,8 @@ export declare class LevelSelector extends UICorePlugin {
48
48
  private levelLabels;
49
49
  private removeAuto;
50
50
  private isHd;
51
- private isOpen;
51
+ private currentText;
52
+ private selectedLevelId;
52
53
  private static readonly buttonTemplate;
53
54
  private static readonly listTemplate;
54
55
  /**
@@ -72,11 +73,8 @@ export declare class LevelSelector extends UICorePlugin {
72
73
  class: string;
73
74
  'data-level-selector': string;
74
75
  };
75
- private currentText;
76
- private selectedLevelId;
77
76
  get events(): {
78
77
  'click .gear-sub-menu_btn': string;
79
- 'click .gear-option': string;
80
78
  'click .go-back': string;
81
79
  };
82
80
  /**
@@ -85,30 +83,29 @@ export declare class LevelSelector extends UICorePlugin {
85
83
  bindEvents(): void;
86
84
  private onCoreReady;
87
85
  private onGearRendered;
88
- private bindPlaybackEvents;
86
+ private onActiveContainerChange;
87
+ private updateHd;
89
88
  private onStop;
90
89
  private shouldRender;
91
90
  /**
92
91
  * @internal
93
92
  */
94
93
  render(): this;
95
- private renderButton;
96
94
  private renderDropdown;
95
+ private updateButton;
97
96
  private get maxLevel();
98
- private fillLevels;
97
+ private onLevelsAvailable;
99
98
  private makeLevelsLabels;
100
- private onLevelSelect;
99
+ private onSelect;
101
100
  private goBack;
102
101
  private setLevel;
103
- private onShowLevelSelectMenu;
104
102
  private allLevelElements;
105
103
  private levelElement;
106
104
  private onLevelSwitchStart;
107
105
  private onLevelSwitchEnd;
108
106
  private updateText;
109
107
  private getLevelLabel;
110
- private updateCurrentLevel;
108
+ private onBitrate;
111
109
  private highlightCurrentLevel;
112
- private deferRender;
113
110
  }
114
111
  //# sourceMappingURL=LevelSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LevelSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/level-selector/LevelSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAA;AAgB7D,OAAO,2CAA2C,CAAA;AAMlD;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,UAAU,CAAQ;IAE1B,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAChB;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAE3E;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,eAAe,CAAK;IAE5B,IAAa,MAAM;;;;MAMlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,kBAAkB;IAwC1B,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACM,MAAM;IAUf,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,cAAc;IAetB,OAAO,KAAK,QAAQ,GASnB;IAED,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,WAAW,CAAmC;CACvD"}
1
+ {"version":3,"file":"LevelSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/level-selector/LevelSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAA;AAgB7D,OAAO,2CAA2C,CAAA;AAMlD;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,UAAU,CAAQ;IAE1B,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,eAAe,CAAK;IAE5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAChB;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAE3E;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACM,MAAM;IAUf,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,YAAY;IAcpB,OAAO,KAAK,QAAQ,GASnB;IAED,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,qBAAqB;CAkB9B"}
@@ -1,7 +1,8 @@
1
1
  import { Events, template, UICorePlugin } from '@clappr/core';
2
- import { reportError, trace } from '@gcorevideo/utils';
2
+ import { trace } from '@gcorevideo/utils';
3
3
  import assert from 'assert';
4
4
  import { CLAPPR_VERSION } from '../../build.js';
5
+ import { GearEvents } from '../bottom-gear/BottomGear.js';
5
6
  import buttonHtml from '../../../assets/level-selector/button.ejs';
6
7
  import listHtml from '../../../assets/level-selector/list.ejs';
7
8
  import hdIcon from '../../../assets/icons/new/hd.svg';
@@ -9,7 +10,6 @@ import arrowRightIcon from '../../../assets/icons/new/arrow-right.svg';
9
10
  import arrowLeftIcon from '../../../assets/icons/new/arrow-left.svg';
10
11
  import checkIcon from '../../../assets/icons/new/check.svg';
11
12
  import '../../../assets/level-selector/style.scss';
12
- import { MediaControlEvents } from '../media-control/MediaControl.js';
13
13
  const T = 'plugins.level_selector';
14
14
  const VERSION = '2.19.4';
15
15
  /**
@@ -42,7 +42,8 @@ export class LevelSelector extends UICorePlugin {
42
42
  levelLabels = [];
43
43
  removeAuto = false;
44
44
  isHd = false;
45
- isOpen = false;
45
+ currentText = '';
46
+ selectedLevelId = -1;
46
47
  static buttonTemplate = template(buttonHtml);
47
48
  static listTemplate = template(listHtml);
48
49
  /**
@@ -72,12 +73,9 @@ export class LevelSelector extends UICorePlugin {
72
73
  'data-level-selector': '',
73
74
  };
74
75
  }
75
- currentText = 'Auto';
76
- selectedLevelId = -1;
77
76
  get events() {
78
77
  return {
79
- 'click .gear-sub-menu_btn': 'onLevelSelect',
80
- 'click .gear-option': 'onShowLevelSelectMenu',
78
+ 'click .gear-sub-menu_btn': 'onSelect',
81
79
  'click .go-back': 'goBack',
82
80
  };
83
81
  }
@@ -85,42 +83,48 @@ export class LevelSelector extends UICorePlugin {
85
83
  * @internal
86
84
  */
87
85
  bindEvents() {
88
- this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
89
- this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.bindPlaybackEvents);
86
+ this.listenToOnce(this.core, Events.CORE_READY, this.onCoreReady);
87
+ this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
90
88
  }
91
89
  onCoreReady() {
92
90
  trace(`${T} onCoreReady`);
93
- const mediaControl = this.core.getPlugin('media_control');
94
- assert(mediaControl, 'media_control plugin is required');
95
- this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
91
+ const gear = this.core.getPlugin('bottom_gear');
92
+ assert(gear, 'bottom_gear plugin is required');
93
+ this.currentText = this.core.i18n.t('auto');
94
+ this.listenTo(gear, GearEvents.RENDERED, this.onGearRendered);
96
95
  }
97
96
  onGearRendered() {
98
97
  trace(`${T} onGearRendered`);
99
- this.deferRender();
98
+ this.render();
100
99
  }
101
- bindPlaybackEvents() {
100
+ onActiveContainerChange() {
102
101
  this.removeAuto = false;
103
102
  this.isHd = false;
104
103
  const activePlayback = this.core.activePlayback;
105
- this.listenTo(activePlayback, Events.PLAYBACK_LEVELS_AVAILABLE, this.fillLevels);
104
+ this.listenTo(activePlayback, Events.PLAYBACK_LEVELS_AVAILABLE, this.onLevelsAvailable);
106
105
  this.listenTo(activePlayback, Events.PLAYBACK_LEVEL_SWITCH_START, this.onLevelSwitchStart);
107
106
  this.listenTo(activePlayback, Events.PLAYBACK_LEVEL_SWITCH_END, this.onLevelSwitchEnd);
108
- this.listenTo(activePlayback, Events.PLAYBACK_BITRATE, this.updateCurrentLevel);
107
+ this.listenTo(activePlayback, Events.PLAYBACK_BITRATE, this.onBitrate);
109
108
  this.listenTo(activePlayback, Events.PLAYBACK_STOP, this.onStop);
110
109
  this.listenTo(activePlayback, Events.PLAYBACK_HIGHDEFINITIONUPDATE, (isHd) => {
111
110
  this.isHd = isHd;
112
- this.deferRender();
111
+ this.updateHd();
113
112
  });
114
113
  if (activePlayback.levels?.length > 0) {
115
- this.fillLevels(activePlayback.levels);
114
+ this.onLevelsAvailable(activePlayback.levels);
115
+ }
116
+ }
117
+ updateHd() {
118
+ if (this.isHd) {
119
+ this.$el.find('.gear-option_hd-icon').removeClass('hidden');
120
+ }
121
+ else {
122
+ this.$el.find('.gear-option_hd-icon').addClass('hidden');
116
123
  }
117
124
  }
118
125
  onStop() {
119
126
  trace(`${T} onStop`);
120
127
  this.listenToOnce(this.core.activePlayback, Events.PLAYBACK_PLAY, () => {
121
- trace(`${T} on PLAYBACK_PLAY after stop`, {
122
- selectedLevelId: this.selectedLevelId,
123
- });
124
128
  if (this.core.activePlayback.getPlaybackType() === 'live') {
125
129
  if (this.selectedLevelId !== -1) {
126
130
  this.core.activePlayback.currentLevel = this.selectedLevelId;
@@ -147,47 +151,42 @@ export class LevelSelector extends UICorePlugin {
147
151
  if (!this.shouldRender()) {
148
152
  return this;
149
153
  }
150
- this.renderButton();
154
+ this.renderDropdown();
155
+ this.updateButton();
151
156
  return this;
152
157
  }
153
- renderButton() {
154
- if (!this.isOpen) {
155
- const html = LevelSelector.buttonTemplate({
156
- arrowRightIcon,
157
- currentText: this.currentText,
158
- isHd: this.isHd,
159
- hdIcon,
160
- });
161
- this.$el.html(html);
162
- const gear = this.core.getPlugin('bottom_gear');
163
- if (!gear) {
164
- trace(`${T} renderButton: bottom_gear plugin not found`);
165
- }
166
- gear?.getElement('quality')?.html(this.el);
167
- }
168
- }
169
158
  renderDropdown() {
170
- const html = LevelSelector.listTemplate({
159
+ this.$el.html(LevelSelector.listTemplate({
171
160
  arrowLeftIcon,
172
161
  checkIcon,
162
+ current: this.selectedLevelId,
173
163
  labels: this.levelLabels,
174
164
  levels: this.levels,
175
165
  maxLevel: this.maxLevel,
176
166
  removeAuto: this.removeAuto,
177
- });
178
- this.$el.html(html);
179
- const gear = this.core.getPlugin('bottom_gear');
180
- trace(`${T} renderDropdown: bottom_gear plugin not found`);
181
- gear?.setContent(this.el);
167
+ i18n: this.core.i18n,
168
+ }));
169
+ }
170
+ updateButton() {
171
+ ;
172
+ this.core.getPlugin('bottom_gear')
173
+ ?.addItem('quality', this.$el)
174
+ .html(LevelSelector.buttonTemplate({
175
+ arrowRightIcon,
176
+ currentText: this.currentText,
177
+ isHd: this.isHd,
178
+ hdIcon,
179
+ i18n: this.core.i18n,
180
+ }));
182
181
  }
183
182
  get maxLevel() {
184
183
  const maxRes = this.core.options.levelSelector?.restrictResolution;
185
184
  return maxRes
186
- ? this.levels.findIndex((level) => (level.height > level.width ? level.width : level.height) ===
187
- maxRes)
185
+ ? this.levels.find((level) => (level.height > level.width ? level.width : level.height) ===
186
+ maxRes)?.level ?? -1
188
187
  : -1;
189
188
  }
190
- fillLevels(levels) {
189
+ onLevelsAvailable(levels) {
191
190
  const maxResolution = this.core.options.levelSelector?.restrictResolution;
192
191
  this.levels = levels;
193
192
  this.makeLevelsLabels();
@@ -199,86 +198,60 @@ export class LevelSelector extends UICorePlugin {
199
198
  .pop();
200
199
  this.setLevel(initialLevel?.level ?? 0);
201
200
  }
202
- this.deferRender();
201
+ this.render();
203
202
  }
204
203
  makeLevelsLabels() {
205
204
  const labels = this.core.options.levelSelector?.labels ?? {};
206
205
  this.levelLabels = [];
207
- for (let i = 0; i < this.levels.length; i++) {
208
- const level = this.levels[i];
206
+ for (const level of this.levels) {
209
207
  const ll = level.width > level.height ? level.height : level.width;
210
208
  const label = labels[ll] || `${ll}p`;
211
209
  this.levelLabels.push(label);
212
210
  }
213
211
  }
214
- onLevelSelect(event) {
212
+ onSelect(event) {
215
213
  const selectedLevel = parseInt(event.currentTarget?.dataset?.id ?? '-1', 10);
216
214
  this.setLevel(selectedLevel);
217
215
  event.stopPropagation();
216
+ event.preventDefault();
218
217
  return false;
219
218
  }
220
219
  goBack() {
221
220
  trace(`${T} goBack`);
222
- this.isOpen = false;
223
- setTimeout(() => {
224
- this.core.getPlugin('bottom_gear').refresh();
225
- }, 0);
221
+ this.core.getPlugin('bottom_gear').refresh();
226
222
  }
227
223
  setLevel(index) {
228
- trace(`${T} setIndexLevel`, { index });
229
224
  this.selectedLevelId = index;
230
- if (!this.core.activePlayback) {
231
- return;
232
- }
233
- if (this.core.activePlayback.currentLevel === this.selectedLevelId) {
234
- return;
235
- }
236
225
  this.core.activePlayback.currentLevel = this.selectedLevelId;
237
- try {
238
- this.highlightCurrentLevel();
239
- }
240
- catch (error) {
241
- reportError(error);
242
- }
243
- this.deferRender();
244
- }
245
- onShowLevelSelectMenu() {
246
- trace(`${T} onShowLevelSelectMenu`);
247
- this.isOpen = true;
248
- this.renderDropdown();
249
226
  this.highlightCurrentLevel();
250
227
  }
251
228
  allLevelElements() {
252
- return this.$('ul.gear-sub-menu li');
229
+ return this.$('#level-selector-menu li');
253
230
  }
254
231
  levelElement(id = -1) {
255
- return this.$(`ul.gear-sub-menu a[data-id="${id}"]`).parent();
232
+ return this.$(`#level-selector-menu a[data-id="${id}"]`).parent();
256
233
  }
257
234
  onLevelSwitchStart() {
258
- this.core.activePlayback.trigger('playback:level:select:start');
259
235
  this.levelElement(this.selectedLevelId).addClass('changing');
260
236
  }
261
237
  onLevelSwitchEnd() {
262
238
  this.levelElement(this.selectedLevelId).removeClass('changing');
263
239
  }
264
240
  updateText(level) {
265
- if (level === undefined || isNaN(level)) {
266
- return;
267
- }
268
241
  this.currentText = this.getLevelLabel(level);
269
- this.deferRender();
242
+ this.updateButton();
270
243
  }
271
244
  getLevelLabel(id) {
272
- if (id === -1) {
273
- return 'Auto';
245
+ if (id < 0) {
246
+ return this.core.i18n.t('auto');
274
247
  }
275
248
  const index = this.levels.findIndex((l) => l.level === id);
276
249
  if (index < 0) {
277
- return 'Auto';
250
+ return this.core.i18n.t('auto');
278
251
  }
279
252
  return this.levelLabels[index] ?? formatLevelLabel(this.levels[index]);
280
253
  }
281
- updateCurrentLevel(info) {
254
+ onBitrate(info) {
282
255
  trace(`${T} updateCurrentLevel`, { info });
283
256
  this.highlightCurrentLevel();
284
257
  }
@@ -286,28 +259,19 @@ export class LevelSelector extends UICorePlugin {
286
259
  trace(`${T} highlightCurrentLevel`, {
287
260
  selectedLevelId: this.selectedLevelId,
288
261
  });
289
- this.allLevelElements().removeClass('current');
290
- this.allLevelElements().find('a').removeClass('gcore-skin-active');
262
+ this.allLevelElements()
263
+ .removeClass('current')
264
+ .find('a')
265
+ .removeClass('gcore-skin-active');
291
266
  const currentLevelElement = this.levelElement(this.selectedLevelId);
292
- currentLevelElement.addClass('current');
293
- currentLevelElement.find('a').addClass('gcore-skin-active');
267
+ currentLevelElement
268
+ .addClass('current')
269
+ .find('a')
270
+ .addClass('gcore-skin-active');
294
271
  this.updateText(this.selectedLevelId);
295
272
  }
296
- deferRender = debounce(() => this.render(), 0);
297
273
  }
298
274
  function formatLevelLabel(level) {
299
275
  const h = level.width > level.height ? level.height : level.width;
300
276
  return `${h}p`;
301
277
  }
302
- function debounce(fn, wait) {
303
- let timerId = null;
304
- return function () {
305
- if (timerId !== null) {
306
- clearTimeout(timerId);
307
- }
308
- timerId = setTimeout(() => {
309
- timerId = null;
310
- fn();
311
- }, wait);
312
- };
313
- }
@@ -5,10 +5,11 @@ import '../../../assets/media-control/media-control.scss';
5
5
  * Media control elements, mount points for additional plugins
6
6
  * @beta
7
7
  */
8
- export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'gear' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer';
8
+ export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'fullscreen' | 'gear' | 'multicamera' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer' | 'vr' | 'volume';
9
9
  /**
10
10
  * Custom events emitted by the plugins to communicate with one another
11
11
  * @beta
12
+ * @deprecated
12
13
  */
13
14
  export declare enum MediaControlEvents {
14
15
  /**
@@ -23,6 +24,8 @@ export declare enum MediaControlEvents {
23
24
  * The methods exposed are to be used by the other plugins that extend the media control UI.
24
25
  */
25
26
  export declare class MediaControl extends UICorePlugin {
27
+ private customAreaElements;
28
+ private customAreaHandler?;
26
29
  private buttonsColor;
27
30
  private currentDurationValue;
28
31
  private currentPositionValue;
@@ -47,13 +50,11 @@ export declare class MediaControl extends UICorePlugin {
47
50
  private userDisabled;
48
51
  private userKeepVisible;
49
52
  private verticalVolume;
50
- private $audioTracksSelector;
51
53
  private $clipText;
52
54
  private $clipTextContainer;
53
55
  private $duration;
54
56
  private $fullscreenToggle;
55
57
  private $multiCameraSelector;
56
- private $pip;
57
58
  private $playPauseToggle;
58
59
  private $playStopToggle;
59
60
  private $playbackRate;
@@ -226,13 +227,14 @@ export declare class MediaControl extends UICorePlugin {
226
227
  * ```
227
228
  */
228
229
  getElement(name: MediaControlElement): ZeptoResult | null;
229
- putElement(name: MediaControlElement, element: HTMLElement): void;
230
+ putElement(name: MediaControlElement, element: ZeptoResult): void;
231
+ handleCustomArea(handler: (name: string, content: HTMLElement) => void): void;
230
232
  /**
231
233
  * Toggle the visibility of a media control element
232
234
  * @param name - The name of the media control element
233
235
  * @param show - Whether to show or hide the element
234
236
  */
235
- toggleElement(name: MediaControlElement, show: boolean): void;
237
+ toggleElement(area: MediaControlElement, show: boolean): void;
236
238
  private getRightPanel;
237
239
  private getLeftPanel;
238
240
  private getCenterPanel;
@@ -1 +1 @@
1
- {"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,YAAY,EAMZ,IAAI,EACL,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,aAAa,GACb,IAAI,GACJ,UAAU,GACV,KAAK,GACL,UAAU,GACV,MAAM,GACN,KAAK,GACL,cAAc,GACd,UAAU,GACV,kBAAkB,CAAA;AAgBtB;;;GAGG;AACH,oBAAY,kBAAkB;IAC5B;;OAEG;IACH,0BAA0B,+BAA+B;CAC1D;AA8BD;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAG5C,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,wBAAwB,CAAI;IAEpC,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,0BAA0B,CAAsB;IAExD,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,OAAO,CAAC,6BAA6B,CAAuB;IAE5D,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,YAAY,CAA6C;IAEjE,OAAO,CAAC,cAAc,CAAM;IAE5B,OAAO,CAAC,WAAW,CAAQ;IAE3B,OAAO,CAAC,IAAI,CAAM;IAElB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,UAAU,CAAI;IAEtB,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,QAAQ,CAAyC;IAEzD,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,eAAe,CAAQ;IAE/B,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,kBAAkB,CAA2B;IAErD,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,IAAI,CAA2B;IAEvC,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,mBAAmB,CAA2B;IAEtD,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,kBAAkB,CAA2B;IAErD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,WAAW,CAA2B;IAE9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAE7D;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,KAAK,QAAQ,GAMnB;IAED;;;OAGG;IACH,IAAI,SAAS,QAEZ;IAED;;;OAGG;IACH,IAAI,QAAQ,QAEX;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED;;OAEG;IACH,IAAa,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;MA4BlB;IAED,IAAI,cAAc,WAEjB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAInB;IAED;;OAEG;IACH,IAAI,KAAK,YAER;gBAEW,IAAI,EAAE,IAAI;IAoBtB;;OAEG;IACM,oBAAoB;2BAmZZ,MAAM;;;IA5YvB;;OAEG;IACM,UAAU;IAuCnB,OAAO,CAAC,mBAAmB;IA2E3B;;OAEG;IACM,OAAO;IAQhB;;OAEG;IACM,MAAM;IAUf;;OAEG;IACH,gBAAgB;IAOhB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,cAAc;IAwDtB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ,CAQf;IAED,OAAO,CAAC,UAAU,CAgBjB;IAED,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,UAAU;IAIlB;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,UAAQ;IA2BhD,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAwChC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,IAAI;IAkBZ,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,IAAI;IAgCZ,OAAO,CAAC,IAAI;IAmCZ,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,cAAc;IAgEtB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,oBAAoB;IAwC5B;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,GAAG,IAAI;IAazD,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW;IAkB1D;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO;IAItD,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IA8CrB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,WAAW;IAiCnB,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACM,OAAO;IAShB,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACM,MAAM;IAmEf,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAcvB;;OAEG;IACH,mBAAmB;IAMnB;;OAEG;IACH,qBAAqB;IAMrB,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,iBAAiB;CAO1B"}
1
+ {"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
@@ -21,13 +21,23 @@ import fullscreenOffIcon from '../../../assets/icons/new/fullscreen-off.svg';
21
21
  import fullscreenOnIcon from '../../../assets/icons/new/fullscreen-on.svg';
22
22
  const DEFAULT_SETTINGS = {
23
23
  left: [],
24
- right: [],
24
+ right: [
25
+ 'fullscreen',
26
+ 'pip',
27
+ 'gear',
28
+ 'cc',
29
+ 'multicamera',
30
+ // 'playbackrate',
31
+ 'vr',
32
+ 'audiotracks',
33
+ ],
25
34
  default: [],
26
35
  seekEnabled: true,
27
36
  };
28
37
  /**
29
38
  * Custom events emitted by the plugins to communicate with one another
30
39
  * @beta
40
+ * @deprecated
31
41
  */
32
42
  export var MediaControlEvents;
33
43
  (function (MediaControlEvents) {
@@ -40,7 +50,6 @@ const T = 'plugins.media_control';
40
50
  const LEFT_ORDER = [
41
51
  'playpause',
42
52
  'playstop',
43
- // 'live',
44
53
  'dvr',
45
54
  'volume',
46
55
  'position',
@@ -61,6 +70,8 @@ function orderByOrderPattern(arr, order) {
61
70
  */
62
71
  export class MediaControl extends UICorePlugin {
63
72
  // private advertisementPlaying = false
73
+ customAreaElements = {};
74
+ customAreaHandler;
64
75
  buttonsColor = null;
65
76
  currentDurationValue = 0;
66
77
  currentPositionValue = 0;
@@ -85,13 +96,11 @@ export class MediaControl extends UICorePlugin {
85
96
  userDisabled = false;
86
97
  userKeepVisible = false;
87
98
  verticalVolume = false;
88
- $audioTracksSelector = null;
89
99
  $clipText = null;
90
100
  $clipTextContainer = null;
91
101
  $duration = null;
92
102
  $fullscreenToggle = null;
93
103
  $multiCameraSelector = null;
94
- $pip = null;
95
104
  $playPauseToggle = null;
96
105
  $playStopToggle = null;
97
106
  $playbackRate = null;
@@ -580,11 +589,13 @@ export class MediaControl extends UICorePlugin {
580
589
  if (!this.$volumeBarContainer) {
581
590
  return;
582
591
  }
592
+ if (this.hideVolumeId) {
593
+ clearTimeout(this.hideVolumeId);
594
+ }
583
595
  if (this.draggingVolumeBar) {
584
596
  this.hideVolumeId = setTimeout(() => this.hideVolumeBar(), timeout);
585
597
  }
586
598
  else {
587
- this.hideVolumeId && clearTimeout(this.hideVolumeId);
588
599
  this.hideVolumeId = setTimeout(() => this.$volumeBarContainer?.addClass('volume-bar-hide'), timeout);
589
600
  }
590
601
  }
@@ -736,16 +747,7 @@ export class MediaControl extends UICorePlugin {
736
747
  newSettings.left.push('dvr');
737
748
  }
738
749
  // actual order of the items appear rendered is controlled by CSS
739
- newSettings.right = [
740
- 'fullscreen',
741
- 'pip',
742
- 'gear',
743
- 'cc',
744
- 'multicamera',
745
- 'playbackrate',
746
- 'vr',
747
- 'audiotracks',
748
- ];
750
+ newSettings.right = DEFAULT_SETTINGS.right;
749
751
  if ((!this.fullScreenOnVideoTagSupported &&
750
752
  !Fullscreen.fullscreenEnabled()) ||
751
753
  this.options.fullscreenDisable) {
@@ -830,10 +832,10 @@ export class MediaControl extends UICorePlugin {
830
832
  trace(`${T} putElement`, { name, panel: !!panel });
831
833
  if (panel) {
832
834
  const current = panel.find(`[data-${name}]`);
833
- element.setAttribute(`data-${name}`, '');
835
+ element.attr(`data-${name}`, '');
834
836
  // TODO test
835
837
  if (current.length) {
836
- if (current[0] === element) {
838
+ if (current[0] === element[0]) {
837
839
  return;
838
840
  }
839
841
  current.replaceWith(element);
@@ -841,15 +843,23 @@ export class MediaControl extends UICorePlugin {
841
843
  else {
842
844
  panel.append(element);
843
845
  }
846
+ return;
844
847
  }
845
848
  }
849
+ handleCustomArea(handler) {
850
+ this.customAreaHandler = handler;
851
+ Object.entries(this.customAreaElements).forEach(([name, element]) => {
852
+ handler(name, element);
853
+ });
854
+ this.customAreaElements = {};
855
+ }
846
856
  /**
847
857
  * Toggle the visibility of a media control element
848
858
  * @param name - The name of the media control element
849
859
  * @param show - Whether to show or hide the element
850
860
  */
851
- toggleElement(name, show) {
852
- this.$el.find(`[data-${name}]`).toggle(show);
861
+ toggleElement(area, show) {
862
+ this.$el.find(`[data-${area}]`).toggle(show);
853
863
  }
854
864
  getRightPanel() {
855
865
  return this.$el.find('.media-control-right-panel');
@@ -1007,6 +1017,7 @@ export class MediaControl extends UICorePlugin {
1007
1017
  * @internal
1008
1018
  */
1009
1019
  render() {
1020
+ trace(`${T} render`);
1010
1021
  const timeout = this.options.hideMediaControlDelay || 2000;
1011
1022
  const html = MediaControl.template({ settings: this.settings ?? {} });
1012
1023
  this.$el.html(html);
@@ -1055,6 +1066,7 @@ export class MediaControl extends UICorePlugin {
1055
1066
  this.core.$el.append(this.el);
1056
1067
  this.rendered = true;
1057
1068
  this.updateVolumeUI();
1069
+ // TODO setTimeout
1058
1070
  this.trigger(Events.MEDIACONTROL_RENDERED);
1059
1071
  return this;
1060
1072
  }
@@ -1127,6 +1139,12 @@ export class MediaControl extends UICorePlugin {
1127
1139
  return isFinite(this.core.activePlayback.getDuration());
1128
1140
  }
1129
1141
  getElementLocation(name) {
1142
+ trace(`${T} getElementLocation`, {
1143
+ name,
1144
+ right: this.settings.right,
1145
+ left: this.settings.left,
1146
+ default: this.settings.default,
1147
+ });
1130
1148
  if (this.settings.right?.includes(name)) {
1131
1149
  return this.getRightPanel();
1132
1150
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;AAMxD;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,cAAc,CAAwB;IAErD;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED,IAAa,UAAU;;MAItB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACM,UAAU;IAInB,OAAO,CAAC,cAAc;IAStB;;OAEG;IACM,MAAM;IAef,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;CAI7B"}
1
+ {"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;AAOxD;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,cAAc,CAAwB;IAErD;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED,IAAa,UAAU;;MAItB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACM,UAAU;IAQnB,OAAO,CAAC,cAAc;IAStB;;OAEG;IACM,MAAM;IAef,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;CAI7B"}
@@ -4,6 +4,7 @@ import { CLAPPR_VERSION } from '../../build.js';
4
4
  import pipIcon from '../../../assets/icons/new/pip.svg';
5
5
  import buttonHtml from '../../../assets/picture-in-picture/button.ejs';
6
6
  import '../../../assets/picture-in-picture/button.scss';
7
+ import assert from 'assert';
7
8
  const VERSION = '0.0.1';
8
9
  const T = `plugins.pip`;
9
10
  /**
@@ -56,7 +57,11 @@ export class PictureInPicture extends UICorePlugin {
56
57
  * @internal
57
58
  */
58
59
  bindEvents() {
59
- this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
60
+ this.listenToOnce(this.core, Events.CORE_READY, () => {
61
+ const mediaControl = this.core.getPlugin('media_control');
62
+ assert(mediaControl, 'media_control plugin is required');
63
+ this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
64
+ });
60
65
  }
61
66
  isPiPSupported() {
62
67
  trace(`${T} isPiPSupported`, {
@@ -75,7 +80,7 @@ export class PictureInPicture extends UICorePlugin {
75
80
  this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
76
81
  const mediaControl = this.core.getPlugin('media_control');
77
82
  if (mediaControl) {
78
- mediaControl.putElement('pip', this.el);
83
+ mediaControl.putElement('pip', this.$el);
79
84
  }
80
85
  return this;
81
86
  }