@gcorevideo/player 2.24.0 → 2.24.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 (40) hide show
  1. package/assets/bottom-gear/gear-sub-menu.scss +1 -0
  2. package/dist/core.js +1 -1
  3. package/dist/index.css +761 -760
  4. package/dist/index.js +70 -76
  5. package/dist/player.d.ts +46 -1
  6. package/docs/api/player.cmcdconfig._constructor_.md +50 -0
  7. package/docs/api/player.cmcdconfig.bindevents.md +19 -0
  8. package/docs/api/player.cmcdconfig.exportids.md +21 -0
  9. package/docs/api/player.cmcdconfig.md +191 -0
  10. package/docs/api/player.cmcdconfig.name.md +15 -0
  11. package/docs/api/player.cmcdconfig.supportedversion.md +14 -0
  12. package/docs/api/player.cmcdconfig.version.md +14 -0
  13. package/docs/api/player.cmcdconfigpluginsettings.md +18 -0
  14. package/docs/api/player.md +22 -0
  15. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -0
  16. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  17. package/lib/plugins/bottom-gear/BottomGear.js +17 -17
  18. package/lib/plugins/cmcd-config/CmcdConfig.d.ts +8 -8
  19. package/lib/plugins/cmcd-config/CmcdConfig.d.ts.map +1 -1
  20. package/lib/plugins/cmcd-config/CmcdConfig.js +43 -47
  21. package/lib/plugins/cmcd-config/utils.d.ts +0 -1
  22. package/lib/plugins/cmcd-config/utils.d.ts.map +1 -1
  23. package/lib/plugins/cmcd-config/utils.js +0 -9
  24. package/lib/plugins/media-control/MediaControl.d.ts +7 -0
  25. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  26. package/lib/plugins/media-control/MediaControl.js +14 -5
  27. package/lib/testUtils.d.ts +1 -0
  28. package/lib/testUtils.d.ts.map +1 -1
  29. package/lib/testUtils.js +3 -0
  30. package/package.json +1 -1
  31. package/src/plugins/bottom-gear/BottomGear.ts +40 -28
  32. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +34 -7
  33. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +5 -2
  34. package/src/plugins/cmcd-config/CmcdConfig.ts +57 -57
  35. package/src/plugins/cmcd-config/__tests__/CmcdConfig.test.ts +96 -84
  36. package/src/plugins/cmcd-config/utils.ts +0 -10
  37. package/src/plugins/media-control/MediaControl.ts +18 -6
  38. package/src/testUtils.ts +3 -0
  39. package/temp/player.api.json +243 -0
  40. package/tsconfig.tsbuildinfo +1 -1
@@ -119,6 +119,17 @@ Description
119
119
  **_(BETA)_** `PLUGIN` that provides a UI to select the subtitles when available.
120
120
 
121
121
 
122
+ </td></tr>
123
+ <tr><td>
124
+
125
+ [CmcdConfig](./player.cmcdconfig.md)
126
+
127
+
128
+ </td><td>
129
+
130
+ **_(BETA)_** A `PLUGIN` that configures CMCD for playback
131
+
132
+
122
133
  </td></tr>
123
134
  <tr><td>
124
135
 
@@ -736,6 +747,17 @@ Description
736
747
  **_(BETA)_** Configuration options for the [ClosedCaptions](./player.closedcaptions.md) plugin.
737
748
 
738
749
 
750
+ </td></tr>
751
+ <tr><td>
752
+
753
+ [CmcdConfigPluginSettings](./player.cmcdconfigpluginsettings.md)
754
+
755
+
756
+ </td><td>
757
+
758
+ **_(BETA)_**
759
+
760
+
739
761
  </td></tr>
740
762
  <tr><td>
741
763
 
@@ -156,5 +156,6 @@ export declare class BottomGear extends UICorePlugin {
156
156
  private onCoreReady;
157
157
  private onMediaControlRendered;
158
158
  private mount;
159
+ private alignSubmenu;
159
160
  }
160
161
  //# sourceMappingURL=BottomGear.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkD,MAAM,cAAc,CAAA;AAO3F,OAAO,uCAAuC,CAAA;AAC9C,OAAO,gDAAgD,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAO5C;;;GAGG;AACH,oBAAY,UAAU;IACpB;;OAEG;IACH,QAAQ,aAAa;CACtB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,EAAE,CAAQ;IAElB,OAAO,CAAC,QAAQ,CAAK;IAErB,OAAO,CAAC,SAAS,CAAQ;IAEzB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED;;OAEG;IACM,UAAU;IAInB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW;IA6B1D,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACM,MAAM;IAsBf;;;;OAIG;IACH,OAAO;IAIP,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,KAAK;CAOd"}
1
+ {"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAKb,MAAM,cAAc,CAAA;AAOrB,OAAO,uCAAuC,CAAA;AAC9C,OAAO,gDAAgD,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAU5C;;;GAGG;AACH,oBAAY,UAAU;IACpB;;OAEG;IACH,QAAQ,aAAa;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,EAAE,CAAQ;IAElB,OAAO,CAAC,QAAQ,CAAI;IAEpB,OAAO,CAAC,SAAS,CAAO;IAExB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED;;OAEG;IACM,UAAU;IAInB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW;IA2B1D,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACM,MAAM;IAqBf;;;;OAIG;IACH,OAAO;IAIP,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,YAAY;CASrB"}
@@ -1,4 +1,4 @@
1
- import { UICorePlugin, template, Events as ClapprEvents, $ } from '@clappr/core';
1
+ import { UICorePlugin, template, Events as ClapprEvents, $, } from '@clappr/core';
2
2
  import { trace } from '@gcorevideo/utils';
3
3
  import assert from 'assert';
4
4
  import { CLAPPR_VERSION } from '../../build.js';
@@ -10,6 +10,8 @@ import gearHdIcon from '../../../assets/icons/new/gear-hd.svg';
10
10
  import { ExtendedEvents } from '../media-control/MediaControl.js';
11
11
  const VERSION = '2.19.12';
12
12
  const T = 'plugins.bottom_gear';
13
+ const MENU_VMARGIN = 12;
14
+ const MENU_BACKLINK_HEIGHT = 44;
13
15
  /**
14
16
  * Events triggered by the plugin
15
17
  * @beta
@@ -21,7 +23,6 @@ export var GearEvents;
21
23
  */
22
24
  GearEvents["RENDERED"] = "rendered";
23
25
  })(GearEvents || (GearEvents = {}));
24
- // TODO disabled if no items added
25
26
  /**
26
27
  * `PLUGIN` that adds a button to extend the media controls UI with extra options.
27
28
  * @beta
@@ -158,7 +159,7 @@ export class BottomGear extends UICorePlugin {
158
159
  * ```
159
160
  */
160
161
  addItem(name, $subMenu) {
161
- const $existingItem = this.$el.find(`#gear-options li[data-${name}`);
162
+ const $existingItem = this.$el.find(`#gear-options li[data-${name}]`);
162
163
  if ($existingItem.length) {
163
164
  trace(`${T} addItem already exists`, { name });
164
165
  return $existingItem;
@@ -173,20 +174,17 @@ export class BottomGear extends UICorePlugin {
173
174
  .hide()
174
175
  .appendTo(this.$el.find('#gear-options-wrapper'));
175
176
  $item.on('click', (e) => {
176
- trace(`${T} addItem submenu clicked`, { name });
177
177
  e.stopPropagation();
178
+ this.alignSubmenu($subMenu);
178
179
  $subMenu.show();
179
180
  this.$el.find('#gear-options').hide();
180
181
  });
181
182
  }
182
183
  this.numItems++;
183
- if (this.numItems > 0) {
184
- this.$el.show();
185
- }
184
+ this.$el.show();
186
185
  return $item;
187
186
  }
188
187
  bindContainerEvents(container) {
189
- trace(`${T} bindContainerEvents`);
190
188
  this.listenTo(container, ClapprEvents.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
191
189
  this.listenTo(container, ClapprEvents.CONTAINER_CLICK, () => {
192
190
  this.collapse();
@@ -201,7 +199,6 @@ export class BottomGear extends UICorePlugin {
201
199
  * @internal
202
200
  */
203
201
  render() {
204
- trace(`${T} render`);
205
202
  const mediaControl = this.core.getPlugin('media_control');
206
203
  if (!mediaControl) {
207
204
  return this; // TODO test
@@ -242,11 +239,11 @@ export class BottomGear extends UICorePlugin {
242
239
  else {
243
240
  this.$el.find('#gear-options-wrapper').show();
244
241
  }
245
- this.$el.find('#gear-button').attr('aria-expanded', (!this.collapsed).toString());
246
- trace(`${T} toggleMenu`, { hidden: this.collapsed });
242
+ this.$el
243
+ .find('#gear-button')
244
+ .attr('aria-expanded', (!this.collapsed).toString());
247
245
  }
248
246
  collapse() {
249
- trace(`${T} collapse`);
250
247
  this.collapsed = true;
251
248
  this.$el.find('#gear-options-wrapper').hide();
252
249
  this.$el.find('#gear-button').attr('aria-expanded', 'false');
@@ -254,7 +251,6 @@ export class BottomGear extends UICorePlugin {
254
251
  this.collapseSubmenus();
255
252
  }
256
253
  onCoreReady() {
257
- trace(`${T} onCoreReady`);
258
254
  const mediaControl = this.core.getPlugin('media_control');
259
255
  assert(mediaControl, 'media_control plugin is required');
260
256
  this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_RENDERED, this.onMediaControlRendered);
@@ -270,14 +266,18 @@ export class BottomGear extends UICorePlugin {
270
266
  this.bindContainerEvents(mediaControl.container);
271
267
  }
272
268
  onMediaControlRendered() {
273
- trace(`${T} onMediaControlRendered`);
274
269
  this.mount();
275
270
  }
276
271
  mount() {
277
- trace(`${T} mount`, {
278
- numItems: this.numItems,
279
- });
280
272
  const mediaControl = this.core.getPlugin('media_control');
281
273
  mediaControl.mount('gear', this.$el);
282
274
  }
275
+ alignSubmenu($subMenu) {
276
+ const availableHeight = this.core.getPlugin('media_control').getAvailableHeight() -
277
+ MENU_VMARGIN * 2;
278
+ $subMenu.css('max-height', `${availableHeight}px`);
279
+ $subMenu
280
+ .find('.gear-sub-menu')
281
+ .css('max-height', `${availableHeight - MENU_BACKLINK_HEIGHT}px`);
282
+ }
283
283
  }
@@ -8,10 +8,10 @@ export type CmcdConfigPluginSettings = {
8
8
  */
9
9
  sessionId: string;
10
10
  /**
11
- * Content ID, either constant or derived from current source.
12
- * If ommitted, a SHA-1 hash of current source URL will be used
11
+ * Content ID,
12
+ * If ommitted, the pathname part of the first source URL will be used
13
13
  */
14
- contentId?: string | ((sourceUrl: string, mimeType?: string) => (string | Promise<string>));
14
+ contentId?: string;
15
15
  };
16
16
  /**
17
17
  * A `PLUGIN` that configures CMCD for playback
@@ -27,19 +27,19 @@ export declare class CmcdConfig extends CorePlugin {
27
27
  * @inheritdocs
28
28
  */
29
29
  get name(): string;
30
+ get version(): string;
31
+ get supportedVersion(): string;
30
32
  constructor(core: Core);
31
33
  /**
32
34
  * @inheritdocs
33
35
  */
34
36
  bindEvents(): void;
35
- getIds(): Promise<{
37
+ exportIds(): {
36
38
  sid: string;
37
39
  cid: string;
38
- }>;
40
+ };
39
41
  private updateSettings;
40
- private updateDashjsSettings;
41
42
  private updateHlsjsSettings;
42
- private ensureContentId;
43
- private evalContentId;
43
+ private generateContentId;
44
44
  }
45
45
  //# sourceMappingURL=CmcdConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CmcdConfig.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/CmcdConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,UAAU,EAEX,MAAM,cAAc,CAAA;AAyBrB;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;CAC5F,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAO,CAAC,GAAG,CAAQ;IAEnB,OAAO,CAAC,GAAG,CAAK;IAEhB;;OAEG;IACH,IAAI,IAAI,WAEP;gBAEW,IAAI,EAAE,IAAI;IAKtB;;OAEG;IACM,UAAU;IAMb,MAAM,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAOrD,OAAO,CAAC,cAAc;YAWR,oBAAoB;YAiBpB,mBAAmB;YAkBnB,eAAe;YAOf,aAAa;CAU5B"}
1
+ {"version":3,"file":"CmcdConfig.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/CmcdConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,UAAU,EAAU,MAAM,cAAc,CAAA;AA6BrE;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAID;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAO,CAAC,GAAG,CAAQ;IAEnB,OAAO,CAAC,GAAG,CAAK;IAEhB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED,IAAI,OAAO,WAEV;IAED,IAAI,gBAAgB,WAEnB;gBAEW,IAAI,EAAE,IAAI;IAMtB;;OAEG;IACM,UAAU;IAMnB,SAAS,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;YAO3B,cAAc;IA8B5B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,iBAAiB;CAK1B"}
@@ -1,5 +1,7 @@
1
- import { CorePlugin, Events, } from '@clappr/core';
2
- import { generateContentId, generateSessionId } from './utils';
1
+ import { $, CorePlugin, Events } from '@clappr/core';
2
+ // import { trace } from '@gcorevideo/utils'
3
+ import { generateSessionId } from './utils';
4
+ import { CLAPPR_VERSION } from '../../build.js';
3
5
  const CMCD_KEYS = [
4
6
  'br',
5
7
  'd',
@@ -20,6 +22,7 @@ const CMCD_KEYS = [
20
22
  'st',
21
23
  'v',
22
24
  ];
25
+ // const T = 'plugins.cmcd'
23
26
  /**
24
27
  * A `PLUGIN` that configures CMCD for playback
25
28
  * @beta
@@ -36,56 +39,62 @@ export class CmcdConfig extends CorePlugin {
36
39
  get name() {
37
40
  return 'cmcd';
38
41
  }
42
+ get version() {
43
+ return '0.1.0';
44
+ }
45
+ get supportedVersion() {
46
+ return CLAPPR_VERSION;
47
+ }
39
48
  constructor(core) {
40
49
  super(core);
41
50
  this.sid = this.options.cmcd?.sessionId ?? generateSessionId();
51
+ this.cid = this.options.cmcd?.contentId ?? this.generateContentId();
42
52
  }
43
53
  /**
44
54
  * @inheritdocs
45
55
  */
46
56
  bindEvents() {
47
- this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, () => this.updateSettings());
57
+ this.listenTo(this.core, Events.CORE_CONTAINERS_CREATED, () => this.updateSettings(this.core.containers[0]));
48
58
  }
49
- async getIds() {
59
+ exportIds() {
50
60
  return {
51
61
  sid: this.sid,
52
- cid: await this.ensureContentId(),
62
+ cid: this.cid,
53
63
  };
54
64
  }
55
- updateSettings() {
56
- switch (this.core.activeContainer.playback.name) {
65
+ async updateSettings(container) {
66
+ switch (container.playback.name) {
57
67
  case 'dash':
58
- this.updateDashjsSettings();
68
+ $.extend(true, container.playback.options, {
69
+ dash: {
70
+ cmcd: {
71
+ enabled: true,
72
+ enabledKeys: CMCD_KEYS,
73
+ sid: this.sid,
74
+ cid: this.cid,
75
+ },
76
+ },
77
+ });
59
78
  break;
60
79
  case 'hls':
61
- this.updateHlsjsSettings();
80
+ $.extend(true, container.playback.options, {
81
+ playback: {
82
+ hlsjsConfig: {
83
+ cmcd: {
84
+ includeKeys: CMCD_KEYS,
85
+ sessionId: this.sid,
86
+ contentId: this.cid,
87
+ },
88
+ },
89
+ },
90
+ });
62
91
  break;
63
92
  }
64
93
  }
65
- async updateDashjsSettings() {
66
- const { cid, sid } = await this.getIds();
67
- const options = this.core.activePlayback.options;
68
- this.core.activePlayback.options = {
69
- ...options,
70
- dash: {
71
- ...(options.dash ?? {}),
72
- cmcd: {
73
- enabled: true,
74
- enabledKeys: CMCD_KEYS,
75
- sid,
76
- cid,
77
- },
78
- },
79
- };
80
- }
81
- async updateHlsjsSettings() {
82
- const { cid, sid } = await this.getIds();
83
- const options = this.core.activePlayback.options;
84
- this.core.activePlayback.options = {
85
- ...options,
94
+ updateHlsjsSettings(options, { cid, sid }) {
95
+ $.extend(true, options, {
86
96
  playback: {
87
97
  hlsjsConfig: {
88
- ...(options.playback?.hlsjsConfig ?? {}),
89
98
  cmcd: {
90
99
  includeKeys: CMCD_KEYS,
91
100
  sessionId: sid,
@@ -93,22 +102,9 @@ export class CmcdConfig extends CorePlugin {
93
102
  },
94
103
  },
95
104
  },
96
- };
97
- }
98
- async ensureContentId() {
99
- if (!this.cid) {
100
- this.cid = await this.evalContentId();
101
- }
102
- return this.cid;
105
+ });
103
106
  }
104
- async evalContentId() {
105
- if (!this.core.activeContainer.options.cmcd?.contentId) {
106
- return generateContentId(this.core.activePlayback.options.src);
107
- }
108
- const contentId = this.core.activeContainer.options.cmcd.contentId;
109
- if (typeof contentId === 'string') {
110
- return contentId;
111
- }
112
- return Promise.resolve(contentId(this.core.activePlayback.options.src));
107
+ generateContentId() {
108
+ return new URL(this.core.options.source ?? this.core.options.sources[0].source).pathname.slice(0, 64);
113
109
  }
114
110
  }
@@ -1,3 +1,2 @@
1
1
  export declare function generateSessionId(): string;
2
- export declare function generateContentId(sourceUrl: string): Promise<string>;
3
2
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQpE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -1,12 +1,3 @@
1
1
  export function generateSessionId() {
2
2
  return window.crypto.randomUUID();
3
3
  }
4
- export function generateContentId(sourceUrl) {
5
- return window.crypto.subtle.digest('SHA-1', new TextEncoder().encode(sourceUrl))
6
- .then(buffer => {
7
- const hex = Array.from(new Uint8Array(buffer))
8
- .map(b => b.toString(16).padStart(2, '0'))
9
- .join('');
10
- return hex;
11
- });
12
- }
@@ -183,6 +183,13 @@ export declare class MediaControl extends UICorePlugin {
183
183
  * Reenables the plugin disabled earlier with the {@link MediaControl.disable} method
184
184
  */
185
185
  enable(): void;
186
+ /**
187
+ *
188
+ * @returns Vertical space available to render something on top of the container.
189
+ * @remarks
190
+ * This takes into account the container height and excludes the height of the controls bar
191
+ */
192
+ getAvailableHeight(): number;
186
193
  /**
187
194
  * Set the initial volume, which is preserved when playback is interrupted by an advertisement
188
195
  */
@@ -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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"}
@@ -318,6 +318,15 @@ export class MediaControl extends UICorePlugin {
318
318
  this.bindKeyEvents();
319
319
  this.show();
320
320
  }
321
+ /**
322
+ *
323
+ * @returns Vertical space available to render something on top of the container.
324
+ * @remarks
325
+ * This takes into account the container height and excludes the height of the controls bar
326
+ */
327
+ getAvailableHeight() {
328
+ return (this.core.$el.height() - this.$el.find('.media-control-layer').height());
329
+ }
321
330
  /**
322
331
  * Set the initial volume, which is preserved when playback is interrupted by an advertisement
323
332
  */
@@ -417,11 +426,11 @@ export class MediaControl extends UICorePlugin {
417
426
  this.applyButtonStyle(this.$playStopToggle);
418
427
  }
419
428
  mousemoveOnSeekBar(event) {
420
- const offset = MediaControl.getPageX(event) -
421
- (this.$seekBarContainer.offset().left ?? 0); // TODO check if the result can be negative
422
- const hoverOffset = offset -
423
- (this.$seekBarHover.width() ?? 0) / 2;
424
- const pos = offset ? Math.min(1, Math.max(offset / this.$seekBarContainer.width(), 0)) : 0;
429
+ const offset = MediaControl.getPageX(event) - (this.$seekBarContainer.offset().left ?? 0); // TODO check if the result can be negative
430
+ const hoverOffset = offset - (this.$seekBarHover.width() ?? 0) / 2;
431
+ const pos = offset
432
+ ? Math.min(1, Math.max(offset / this.$seekBarContainer.width(), 0))
433
+ : 0;
425
434
  if (this.settings.seekEnabled) {
426
435
  // TODO test that it works when the element does not exist
427
436
  this.$seekBarHover.css({ left: hoverOffset });
@@ -5,6 +5,7 @@ export declare function createMockCore(options?: Record<string, unknown>, contai
5
5
  $el: any;
6
6
  activePlayback: any;
7
7
  activeContainer: any;
8
+ containers: any[];
8
9
  i18n: {
9
10
  t: import("vitest").Mock<(...args: any[]) => any>;
10
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC;;;;;;;;;;;;;;;;EAqB9C;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCtF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,QAAQ,GAAE,GAAgD;;;;;;;;;;;;;;;;;;;;;;;;EA6B3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAiB/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAe7C"}
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC;;;;;;;;;;;;;;;;;EAsB9C;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCtF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,QAAQ,GAAE,GAAgD;;;;;;;;;;;;;;;;;;;;;;;;EA6B3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAmB/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAe7C"}
package/lib/testUtils.js CHANGED
@@ -9,6 +9,7 @@ export function createMockCore(options = {}, container = createMockContainer(opt
9
9
  $el: $(el),
10
10
  activePlayback: container.playback,
11
11
  activeContainer: container,
12
+ containers: [container],
12
13
  i18n: {
13
14
  t: vi.fn().mockImplementation((key) => key),
14
15
  },
@@ -111,6 +112,8 @@ export function createMockMediaControl(core) {
111
112
  // @ts-ignore
112
113
  mediaControl.container = core.activeContainer;
113
114
  // @ts-ignore
115
+ mediaControl.getAvailableHeight = vi.fn().mockReturnValue(300);
116
+ // @ts-ignore
114
117
  mediaControl.toggleElement = vi.fn();
115
118
  vi.spyOn(mediaControl, 'trigger');
116
119
  core.$el.append(mediaControl.$el);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.24.0",
3
+ "version": "2.24.2",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -1,4 +1,10 @@
1
- import { UICorePlugin, template, Events as ClapprEvents, $, Container } from '@clappr/core'
1
+ import {
2
+ UICorePlugin,
3
+ template,
4
+ Events as ClapprEvents,
5
+ $,
6
+ Container,
7
+ } from '@clappr/core'
2
8
  import { trace } from '@gcorevideo/utils'
3
9
  import assert from 'assert'
4
10
 
@@ -16,6 +22,9 @@ const VERSION = '2.19.12'
16
22
 
17
23
  const T = 'plugins.bottom_gear'
18
24
 
25
+ const MENU_VMARGIN = 12
26
+ const MENU_BACKLINK_HEIGHT = 44
27
+
19
28
  /**
20
29
  * Events triggered by the plugin
21
30
  * @beta
@@ -27,8 +36,6 @@ export enum GearEvents {
27
36
  RENDERED = 'rendered',
28
37
  }
29
38
 
30
- // TODO disabled if no items added
31
-
32
39
  /**
33
40
  * `PLUGIN` that adds a button to extend the media controls UI with extra options.
34
41
  * @beta
@@ -100,9 +107,9 @@ export enum GearEvents {
100
107
  export class BottomGear extends UICorePlugin {
101
108
  private hd = false
102
109
 
103
- private numItems = 0;
110
+ private numItems = 0
104
111
 
105
- private collapsed = true;
112
+ private collapsed = true
106
113
 
107
114
  /**
108
115
  * @internal
@@ -175,7 +182,7 @@ export class BottomGear extends UICorePlugin {
175
182
  * ```
176
183
  */
177
184
  addItem(name: string, $subMenu?: ZeptoResult): ZeptoResult {
178
- const $existingItem = this.$el.find(`#gear-options li[data-${name}`)
185
+ const $existingItem = this.$el.find(`#gear-options li[data-${name}]`)
179
186
  if ($existingItem.length) {
180
187
  trace(`${T} addItem already exists`, { name })
181
188
  return $existingItem
@@ -190,21 +197,18 @@ export class BottomGear extends UICorePlugin {
190
197
  .hide()
191
198
  .appendTo(this.$el.find('#gear-options-wrapper'))
192
199
  $item.on('click', (e: MouseEvent) => {
193
- trace(`${T} addItem submenu clicked`, { name })
194
200
  e.stopPropagation()
201
+ this.alignSubmenu($subMenu)
195
202
  $subMenu.show()
196
203
  this.$el.find('#gear-options').hide()
197
204
  })
198
205
  }
199
- this.numItems++;
200
- if (this.numItems > 0) {
201
- this.$el.show()
202
- }
206
+ this.numItems++
207
+ this.$el.show()
203
208
  return $item
204
209
  }
205
210
 
206
211
  private bindContainerEvents(container: Container) {
207
- trace(`${T} bindContainerEvents`)
208
212
  this.listenTo(
209
213
  container,
210
214
  ClapprEvents.CONTAINER_HIGHDEFINITIONUPDATE,
@@ -225,14 +229,13 @@ export class BottomGear extends UICorePlugin {
225
229
  * @internal
226
230
  */
227
231
  override render() {
228
- trace(`${T} render`)
229
232
  const mediaControl = this.core.getPlugin('media_control')
230
233
  if (!mediaControl) {
231
234
  return this // TODO test
232
235
  }
233
236
  const icon = this.hd ? gearHdIcon : gearIcon
234
- this.collapsed = true;
235
- this.numItems = 0;
237
+ this.collapsed = true
238
+ this.numItems = 0
236
239
  this.$el
237
240
  .html(BottomGear.template({ icon }))
238
241
  .hide() // until numItems > 0
@@ -264,19 +267,19 @@ export class BottomGear extends UICorePlugin {
264
267
  this.core
265
268
  .getPlugin('media_control')
266
269
  .trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name)
267
- this.collapsed = !this.collapsed;
270
+ this.collapsed = !this.collapsed
268
271
  if (this.collapsed) {
269
272
  this.$el.find('#gear-options-wrapper').hide()
270
273
  } else {
271
274
  this.$el.find('#gear-options-wrapper').show()
272
275
  }
273
- this.$el.find('#gear-button').attr('aria-expanded', (!this.collapsed).toString())
274
- trace(`${T} toggleMenu`, { hidden: this.collapsed })
276
+ this.$el
277
+ .find('#gear-button')
278
+ .attr('aria-expanded', (!this.collapsed).toString())
275
279
  }
276
280
 
277
281
  private collapse() {
278
- trace(`${T} collapse`)
279
- this.collapsed = true;
282
+ this.collapsed = true
280
283
  this.$el.find('#gear-options-wrapper').hide()
281
284
  this.$el.find('#gear-button').attr('aria-expanded', 'false')
282
285
  // TODO hide submenus
@@ -284,7 +287,6 @@ export class BottomGear extends UICorePlugin {
284
287
  }
285
288
 
286
289
  private onCoreReady() {
287
- trace(`${T} onCoreReady`)
288
290
  const mediaControl = this.core.getPlugin('media_control')
289
291
  assert(mediaControl, 'media_control plugin is required')
290
292
  this.listenTo(
@@ -293,9 +295,13 @@ export class BottomGear extends UICorePlugin {
293
295
  this.onMediaControlRendered,
294
296
  )
295
297
  this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_HIDE, this.collapse)
296
- this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_CONTAINERCHANGED, () => {
297
- this.bindContainerEvents(mediaControl.container)
298
- })
298
+ this.listenTo(
299
+ mediaControl,
300
+ ClapprEvents.MEDIACONTROL_CONTAINERCHANGED,
301
+ () => {
302
+ this.bindContainerEvents(mediaControl.container)
303
+ },
304
+ )
299
305
  this.listenTo(
300
306
  mediaControl,
301
307
  ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE,
@@ -309,15 +315,21 @@ export class BottomGear extends UICorePlugin {
309
315
  }
310
316
 
311
317
  private onMediaControlRendered() {
312
- trace(`${T} onMediaControlRendered`)
313
318
  this.mount()
314
319
  }
315
320
 
316
321
  private mount() {
317
- trace(`${T} mount`, {
318
- numItems: this.numItems,
319
- })
320
322
  const mediaControl = this.core.getPlugin('media_control')
321
323
  mediaControl.mount('gear', this.$el)
322
324
  }
325
+
326
+ private alignSubmenu($subMenu: ZeptoResult) {
327
+ const availableHeight =
328
+ this.core.getPlugin('media_control').getAvailableHeight() -
329
+ MENU_VMARGIN * 2
330
+ $subMenu.css('max-height', `${availableHeight}px`)
331
+ $subMenu
332
+ .find('.gear-sub-menu')
333
+ .css('max-height', `${availableHeight - MENU_BACKLINK_HEIGHT}px`)
334
+ }
323
335
  }