@gcorevideo/player 2.22.0 → 2.22.2

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 (125) 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/media-control/container.scss +1 -1
  10. package/assets/playback-rate/list.ejs +5 -5
  11. package/assets/spinner-three-bounce/spinner.scss +1 -1
  12. package/dist/core.js +1 -2
  13. package/dist/index.css +885 -884
  14. package/dist/index.js +3938 -3779
  15. package/dist/player.d.ts +246 -108
  16. package/dist/plugins/index.css +1230 -1229
  17. package/dist/plugins/index.js +4036 -3878
  18. package/docs/api/player.bottomgear.additem.md +95 -0
  19. package/docs/api/player.bottomgear.md +63 -19
  20. package/docs/api/player.bottomgear.refresh.md +5 -1
  21. package/docs/api/player.clapprnerdstats.md +0 -2
  22. package/docs/api/player.clicktopause.md +1 -1
  23. package/docs/api/player.closedcaptions.md +2 -2
  24. package/docs/api/player.closedcaptionspluginsettings.md +5 -0
  25. package/docs/api/player.errorscreen.md +18 -4
  26. package/docs/api/player.errorscreenpluginsettings.md +1 -4
  27. package/docs/api/player.errorscreensettings.md +15 -0
  28. package/docs/api/{player.mediacontrolevents.md → player.gearevents.md} +7 -7
  29. package/docs/api/player.levelselector.events.md +0 -1
  30. package/docs/api/player.levelselector.md +1 -1
  31. package/docs/api/player.md +33 -36
  32. package/docs/api/{player.bottomgear.setcontent.md → player.mediacontrol.handlecustomarea.md} +5 -9
  33. package/docs/api/player.mediacontrol.md +10 -24
  34. package/docs/api/player.mediacontrol.putelement.md +2 -2
  35. package/docs/api/{player.bottomgear.getelement.md → player.mediacontrol.toggleelement.md} +23 -9
  36. package/docs/api/player.mediacontrolelement.md +1 -1
  37. package/docs/api/player.playbackrate.md +22 -3
  38. package/docs/api/{player.gearoptionsitem.md → player.playbackrateoption.md} +6 -4
  39. package/docs/api/{player.mediacontrol.getcenterpanel.md → player.playbackratesettings.md} +8 -6
  40. package/docs/api/player.sourcecontroller._constructor_.md +49 -0
  41. package/docs/api/player.sourcecontroller.md +70 -7
  42. package/docs/api/player.spinnerevents.md +1 -4
  43. package/docs/api/player.spinnerthreebounce._constructor_.md +0 -3
  44. package/docs/api/player.spinnerthreebounce.hide.md +0 -3
  45. package/docs/api/player.spinnerthreebounce.md +5 -8
  46. package/docs/api/player.spinnerthreebounce.show.md +2 -5
  47. package/lib/internal.types.d.ts +5 -0
  48. package/lib/internal.types.d.ts.map +1 -1
  49. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  50. package/lib/playback/dash-playback/DashPlayback.js +0 -1
  51. package/lib/playback.types.d.ts +0 -5
  52. package/lib/playback.types.d.ts.map +1 -1
  53. package/lib/plugins/bottom-gear/BottomGear.d.ts +93 -20
  54. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  55. package/lib/plugins/bottom-gear/BottomGear.js +145 -37
  56. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +2 -3
  57. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -1
  58. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +18 -15
  59. package/lib/plugins/click-to-pause/ClickToPause.d.ts +1 -1
  60. package/lib/plugins/click-to-pause/ClickToPause.d.ts.map +1 -1
  61. package/lib/plugins/click-to-pause/ClickToPause.js +3 -2
  62. package/lib/plugins/dvr-controls/DvrControls.js +1 -1
  63. package/lib/plugins/error-screen/ErrorScreen.d.ts +29 -4
  64. package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -1
  65. package/lib/plugins/error-screen/ErrorScreen.js +17 -2
  66. package/lib/plugins/level-selector/LevelSelector.d.ts +8 -11
  67. package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
  68. package/lib/plugins/level-selector/LevelSelector.js +66 -102
  69. package/lib/plugins/media-control/MediaControl.d.ts +6 -15
  70. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  71. package/lib/plugins/media-control/MediaControl.js +36 -30
  72. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
  73. package/lib/plugins/picture-in-picture/PictureInPicture.js +7 -2
  74. package/lib/plugins/playback-rate/PlaybackRate.d.ts +42 -14
  75. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  76. package/lib/plugins/playback-rate/PlaybackRate.js +101 -83
  77. package/lib/plugins/source-controller/SourceController.d.ts +40 -4
  78. package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
  79. package/lib/plugins/source-controller/SourceController.js +41 -4
  80. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +8 -6
  81. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
  82. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +10 -6
  83. package/lib/plugins/subtitles/ClosedCaptions.d.ts +7 -7
  84. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  85. package/lib/plugins/subtitles/ClosedCaptions.js +3 -3
  86. package/lib/testUtils.d.ts +1 -0
  87. package/lib/testUtils.d.ts.map +1 -1
  88. package/lib/testUtils.js +13 -0
  89. package/package.json +1 -1
  90. package/src/internal.types.ts +6 -0
  91. package/src/playback/dash-playback/DashPlayback.ts +0 -1
  92. package/src/playback.types.ts +0 -5
  93. package/src/plugins/bottom-gear/BottomGear.ts +186 -77
  94. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +21 -5
  95. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +5 -12
  96. package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +27 -25
  97. package/src/plugins/click-to-pause/ClickToPause.ts +3 -2
  98. package/src/plugins/dvr-controls/DvrControls.ts +1 -1
  99. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +1 -1
  100. package/src/plugins/error-screen/ErrorScreen.ts +30 -4
  101. package/src/plugins/level-selector/LevelSelector.ts +80 -120
  102. package/src/plugins/level-selector/__tests__/LevelSelector.test.ts +69 -79
  103. package/src/plugins/level-selector/__tests__/__snapshots__/LevelSelector.test.ts.snap +38 -71
  104. package/src/plugins/media-control/MediaControl.ts +50 -36
  105. package/src/plugins/media-control/__tests__/MediaControl.test.ts +4 -4
  106. package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -2
  107. package/src/plugins/playback-rate/PlaybackRate.ts +136 -108
  108. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +84 -37
  109. package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +55 -6
  110. package/src/plugins/source-controller/SourceController.ts +41 -4
  111. package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +10 -6
  112. package/src/plugins/subtitles/ClosedCaptions.ts +9 -10
  113. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
  114. package/src/testUtils.ts +14 -0
  115. package/src/typings/vitest.d.ts +1 -0
  116. package/temp/player.api.json +303 -370
  117. package/tsconfig.tsbuildinfo +1 -1
  118. package/docs/api/player.gearitemelement.md +0 -18
  119. package/docs/api/player.mediacontrol.getleftpanel.md +0 -22
  120. package/docs/api/player.mediacontrol.getrightpanel.md +0 -22
  121. package/docs/api/player.subtitlespluginsettings.md +0 -18
  122. package/docs/api/player.texttrackitem.id.md +0 -11
  123. package/docs/api/player.texttrackitem.md +0 -87
  124. package/docs/api/player.texttrackitem.name.md +0 -11
  125. package/docs/api/player.texttrackitem.track.md +0 -11
@@ -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,17 +5,7 @@ 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';
9
- /**
10
- * Custom events emitted by the plugins to communicate with one another
11
- * @beta
12
- */
13
- export declare enum MediaControlEvents {
14
- /**
15
- * Emitted when the gear menu is rendered
16
- */
17
- MEDIACONTROL_GEAR_RENDERED = "mediacontrol:gear:rendered"
18
- }
8
+ export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'fullscreen' | 'gear' | 'multicamera' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer' | 'vr' | 'volume';
19
9
  /**
20
10
  * `PLUGIN` that provides basic playback controls UI and a foundation for developing custom UI.
21
11
  * @beta
@@ -23,6 +13,8 @@ export declare enum MediaControlEvents {
23
13
  * The methods exposed are to be used by the other plugins that extend the media control UI.
24
14
  */
25
15
  export declare class MediaControl extends UICorePlugin {
16
+ private customAreaElements;
17
+ private customAreaHandler?;
26
18
  private buttonsColor;
27
19
  private currentDurationValue;
28
20
  private currentPositionValue;
@@ -47,13 +39,11 @@ export declare class MediaControl extends UICorePlugin {
47
39
  private userDisabled;
48
40
  private userKeepVisible;
49
41
  private verticalVolume;
50
- private $audioTracksSelector;
51
42
  private $clipText;
52
43
  private $clipTextContainer;
53
44
  private $duration;
54
45
  private $fullscreenToggle;
55
46
  private $multiCameraSelector;
56
- private $pip;
57
47
  private $playPauseToggle;
58
48
  private $playStopToggle;
59
49
  private $playbackRate;
@@ -226,13 +216,14 @@ export declare class MediaControl extends UICorePlugin {
226
216
  * ```
227
217
  */
228
218
  getElement(name: MediaControlElement): ZeptoResult | null;
229
- putElement(name: MediaControlElement, element: HTMLElement): void;
219
+ putElement(name: MediaControlElement, element: ZeptoResult): void;
220
+ handleCustomArea(handler: (name: string, content: HTMLElement) => void): void;
230
221
  /**
231
222
  * Toggle the visibility of a media control element
232
223
  * @param name - The name of the media control element
233
224
  * @param show - Whether to show or hide the element
234
225
  */
235
- toggleElement(name: MediaControlElement, show: boolean): void;
226
+ toggleElement(area: MediaControlElement, show: boolean): void;
236
227
  private getRightPanel;
237
228
  private getLeftPanel;
238
229
  private getCenterPanel;
@@ -1 +1 @@
1
- {"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
@@ -21,26 +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
- /**
29
- * Custom events emitted by the plugins to communicate with one another
30
- * @beta
31
- */
32
- export var MediaControlEvents;
33
- (function (MediaControlEvents) {
34
- /**
35
- * Emitted when the gear menu is rendered
36
- */
37
- MediaControlEvents["MEDIACONTROL_GEAR_RENDERED"] = "mediacontrol:gear:rendered";
38
- })(MediaControlEvents || (MediaControlEvents = {}));
39
37
  const T = 'plugins.media_control';
40
38
  const LEFT_ORDER = [
41
39
  'playpause',
42
40
  'playstop',
43
- // 'live',
44
41
  'dvr',
45
42
  'volume',
46
43
  'position',
@@ -61,6 +58,8 @@ function orderByOrderPattern(arr, order) {
61
58
  */
62
59
  export class MediaControl extends UICorePlugin {
63
60
  // private advertisementPlaying = false
61
+ customAreaElements = {};
62
+ customAreaHandler;
64
63
  buttonsColor = null;
65
64
  currentDurationValue = 0;
66
65
  currentPositionValue = 0;
@@ -85,13 +84,11 @@ export class MediaControl extends UICorePlugin {
85
84
  userDisabled = false;
86
85
  userKeepVisible = false;
87
86
  verticalVolume = false;
88
- $audioTracksSelector = null;
89
87
  $clipText = null;
90
88
  $clipTextContainer = null;
91
89
  $duration = null;
92
90
  $fullscreenToggle = null;
93
91
  $multiCameraSelector = null;
94
- $pip = null;
95
92
  $playPauseToggle = null;
96
93
  $playStopToggle = null;
97
94
  $playbackRate = null;
@@ -580,11 +577,13 @@ export class MediaControl extends UICorePlugin {
580
577
  if (!this.$volumeBarContainer) {
581
578
  return;
582
579
  }
580
+ if (this.hideVolumeId) {
581
+ clearTimeout(this.hideVolumeId);
582
+ }
583
583
  if (this.draggingVolumeBar) {
584
584
  this.hideVolumeId = setTimeout(() => this.hideVolumeBar(), timeout);
585
585
  }
586
586
  else {
587
- this.hideVolumeId && clearTimeout(this.hideVolumeId);
588
587
  this.hideVolumeId = setTimeout(() => this.$volumeBarContainer?.addClass('volume-bar-hide'), timeout);
589
588
  }
590
589
  }
@@ -736,16 +735,7 @@ export class MediaControl extends UICorePlugin {
736
735
  newSettings.left.push('dvr');
737
736
  }
738
737
  // 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
- ];
738
+ newSettings.right = DEFAULT_SETTINGS.right;
749
739
  if ((!this.fullScreenOnVideoTagSupported &&
750
740
  !Fullscreen.fullscreenEnabled()) ||
751
741
  this.options.fullscreenDisable) {
@@ -830,10 +820,10 @@ export class MediaControl extends UICorePlugin {
830
820
  trace(`${T} putElement`, { name, panel: !!panel });
831
821
  if (panel) {
832
822
  const current = panel.find(`[data-${name}]`);
833
- element.setAttribute(`data-${name}`, '');
823
+ element.attr(`data-${name}`, '');
834
824
  // TODO test
835
825
  if (current.length) {
836
- if (current[0] === element) {
826
+ if (current[0] === element[0]) {
837
827
  return;
838
828
  }
839
829
  current.replaceWith(element);
@@ -841,15 +831,23 @@ export class MediaControl extends UICorePlugin {
841
831
  else {
842
832
  panel.append(element);
843
833
  }
834
+ return;
844
835
  }
845
836
  }
837
+ handleCustomArea(handler) {
838
+ this.customAreaHandler = handler;
839
+ Object.entries(this.customAreaElements).forEach(([name, element]) => {
840
+ handler(name, element);
841
+ });
842
+ this.customAreaElements = {};
843
+ }
846
844
  /**
847
845
  * Toggle the visibility of a media control element
848
846
  * @param name - The name of the media control element
849
847
  * @param show - Whether to show or hide the element
850
848
  */
851
- toggleElement(name, show) {
852
- this.$el.find(`[data-${name}]`).toggle(show);
849
+ toggleElement(area, show) {
850
+ this.$el.find(`[data-${area}]`).toggle(show);
853
851
  }
854
852
  getRightPanel() {
855
853
  return this.$el.find('.media-control-right-panel');
@@ -1007,6 +1005,7 @@ export class MediaControl extends UICorePlugin {
1007
1005
  * @internal
1008
1006
  */
1009
1007
  render() {
1008
+ trace(`${T} render`);
1010
1009
  const timeout = this.options.hideMediaControlDelay || 2000;
1011
1010
  const html = MediaControl.template({ settings: this.settings ?? {} });
1012
1011
  this.$el.html(html);
@@ -1055,6 +1054,7 @@ export class MediaControl extends UICorePlugin {
1055
1054
  this.core.$el.append(this.el);
1056
1055
  this.rendered = true;
1057
1056
  this.updateVolumeUI();
1057
+ // TODO setTimeout
1058
1058
  this.trigger(Events.MEDIACONTROL_RENDERED);
1059
1059
  return this;
1060
1060
  }
@@ -1127,6 +1127,12 @@ export class MediaControl extends UICorePlugin {
1127
1127
  return isFinite(this.core.activePlayback.getDuration());
1128
1128
  }
1129
1129
  getElementLocation(name) {
1130
+ trace(`${T} getElementLocation`, {
1131
+ name,
1132
+ right: this.settings.right,
1133
+ left: this.settings.left,
1134
+ default: this.settings.default,
1135
+ });
1130
1136
  if (this.settings.right?.includes(name)) {
1131
1137
  return this.getRightPanel();
1132
1138
  }
@@ -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
  }