@gcorevideo/player 2.21.3 → 2.21.6

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 (98) hide show
  1. package/assets/audio-selector/style.scss +1 -1
  2. package/assets/audio-selector/track-selector.ejs +3 -3
  3. package/assets/bottom-gear/bottomgear.ejs +2 -2
  4. package/assets/dvr-controls/dvr_controls.scss +7 -25
  5. package/assets/dvr-controls/index.ejs +2 -2
  6. package/assets/media-control/container.scss +1 -1
  7. package/assets/media-control/media-control.ejs +1 -6
  8. package/assets/media-control/media-control.scss +14 -7
  9. package/assets/media-control/width270.scss +1 -1
  10. package/assets/media-control/width370.scss +5 -5
  11. package/assets/playback-rate/button.ejs +2 -2
  12. package/assets/playback-rate/list.ejs +4 -4
  13. package/assets/style/theme.scss +1 -1
  14. package/assets/subtitles/combobox.ejs +5 -5
  15. package/assets/subtitles/string.ejs +1 -1
  16. package/assets/subtitles/style.scss +2 -2
  17. package/dist/core.js +2 -1
  18. package/dist/index.css +993 -993
  19. package/dist/index.js +199 -178
  20. package/dist/player.d.ts +141 -119
  21. package/dist/plugins/index.css +1118 -1118
  22. package/dist/plugins/index.js +191 -173
  23. package/docs/api/player.bottomgear.getelement.md +2 -2
  24. package/docs/api/player.bottomgear.md +1 -1
  25. package/docs/api/{player.subtitles.hide.md → player.closedcaptions.hide.md} +2 -2
  26. package/docs/api/{player.subtitles.md → player.closedcaptions.md} +11 -11
  27. package/docs/api/{player.subtitles.show.md → player.closedcaptions.show.md} +2 -2
  28. package/docs/api/player.closedcaptionspluginsettings.md +13 -0
  29. package/docs/api/player.gearitemelement.md +6 -4
  30. package/docs/api/player.gearoptionsitem.md +16 -0
  31. package/docs/api/player.md +48 -12
  32. package/docs/api/player.mediacontrol.putelement.md +2 -2
  33. package/docs/api/player.mediacontrolelement.md +1 -1
  34. package/docs/api/player.playbackrate.md +1 -1
  35. package/docs/api/player.subtitlespluginsettings.md +18 -0
  36. package/docs/api/player.texttrackitem.id.md +11 -0
  37. package/docs/api/player.texttrackitem.md +87 -0
  38. package/docs/api/player.texttrackitem.name.md +11 -0
  39. package/docs/api/player.texttrackitem.track.md +11 -0
  40. package/lib/index.d.ts +1 -1
  41. package/lib/index.js +1 -1
  42. package/lib/index.plugins.d.ts +2 -1
  43. package/lib/index.plugins.d.ts.map +1 -1
  44. package/lib/index.plugins.js +2 -1
  45. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  46. package/lib/playback/dash-playback/DashPlayback.js +1 -0
  47. package/lib/plugins/audio-selector/AudioSelector.d.ts +2 -3
  48. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  49. package/lib/plugins/audio-selector/AudioSelector.js +6 -7
  50. package/lib/plugins/bottom-gear/BottomGear.d.ts +6 -2
  51. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  52. package/lib/plugins/bottom-gear/BottomGear.js +2 -1
  53. package/lib/plugins/dvr-controls/DvrControls.d.ts +0 -3
  54. package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
  55. package/lib/plugins/dvr-controls/DvrControls.js +13 -38
  56. package/lib/plugins/media-control/MediaControl.d.ts +14 -18
  57. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  58. package/lib/plugins/media-control/MediaControl.js +105 -72
  59. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +1 -0
  60. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
  61. package/lib/plugins/picture-in-picture/PictureInPicture.js +4 -4
  62. package/lib/plugins/playback-rate/PlaybackRate.d.ts +0 -1
  63. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  64. package/lib/plugins/playback-rate/PlaybackRate.js +23 -14
  65. package/lib/plugins/subtitles/ClosedCaptions.d.ts +118 -0
  66. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -0
  67. package/lib/plugins/subtitles/ClosedCaptions.js +348 -0
  68. package/lib/plugins/subtitles/Subtitles.d.ts +12 -9
  69. package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -1
  70. package/lib/plugins/subtitles/Subtitles.js +31 -32
  71. package/lib/testUtils.d.ts +26 -19
  72. package/lib/testUtils.d.ts.map +1 -1
  73. package/lib/testUtils.js +30 -45
  74. package/package.json +1 -1
  75. package/src/index.plugins.ts +2 -1
  76. package/src/index.ts +1 -1
  77. package/src/playback/dash-playback/DashPlayback.ts +1 -0
  78. package/src/plugins/audio-selector/AudioSelector.ts +9 -8
  79. package/src/plugins/bottom-gear/BottomGear.ts +11 -4
  80. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -1
  81. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +2 -2
  82. package/src/plugins/dvr-controls/DvrControls.ts +16 -44
  83. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +18 -22
  84. package/src/plugins/dvr-controls/__tests__/__snapshots__/DvrControls.test.ts.snap +6 -30
  85. package/src/plugins/media-control/MediaControl.ts +130 -85
  86. package/src/plugins/media-control/__tests__/MediaControl.test.ts +132 -0
  87. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +299 -0
  88. package/src/plugins/picture-in-picture/PictureInPicture.ts +5 -5
  89. package/src/plugins/playback-rate/PlaybackRate.ts +142 -100
  90. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +65 -0
  91. package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +11 -0
  92. package/src/plugins/subtitles/{Subtitles.ts → ClosedCaptions.ts} +42 -34
  93. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +58 -0
  94. package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +25 -0
  95. package/src/testUtils.ts +30 -45
  96. package/temp/player.api.json +269 -89
  97. package/tsconfig.tsbuildinfo +1 -1
  98. package/src/plugins/index.ts +0 -39
@@ -37,7 +37,6 @@ export declare class DvrControls extends UICorePlugin {
37
37
  */
38
38
  get attributes(): {
39
39
  class: string;
40
- 'data-dvr-controls': string;
41
40
  };
42
41
  /**
43
42
  * @internal
@@ -45,9 +44,7 @@ export declare class DvrControls extends UICorePlugin {
45
44
  bindEvents(): void;
46
45
  private onCoreReady;
47
46
  private bindContainerEvents;
48
- private onDvrChanged;
49
47
  private click;
50
- private settingsUpdate;
51
48
  private shouldRender;
52
49
  /**
53
50
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"DvrControls.d.ts","sourceRoot":"","sources":["../../../src/plugins/dvr-controls/DvrControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAY,MAAM,cAAc,CAAA;AAM7E,OAAO,gDAAgD,CAAA;AAMvD;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAEpD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED;;OAEG;IACM,UAAU;IAUnB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACM,MAAM;CAoBhB"}
1
+ {"version":3,"file":"DvrControls.d.ts","sourceRoot":"","sources":["../../../src/plugins/dvr-controls/DvrControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAY,MAAM,cAAc,CAAA;AAM7E,OAAO,gDAAgD,CAAA;AAMvD;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAEpD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACM,MAAM;CAyBhB"}
@@ -47,7 +47,6 @@ export class DvrControls extends UICorePlugin {
47
47
  get attributes() {
48
48
  return {
49
49
  class: 'dvr-controls',
50
- 'data-dvr-controls': '',
51
50
  };
52
51
  }
53
52
  /**
@@ -55,40 +54,18 @@ export class DvrControls extends UICorePlugin {
55
54
  */
56
55
  bindEvents() {
57
56
  this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
58
- this.listenTo(this.core, Events.CORE_OPTIONS_CHANGE, this.render);
59
57
  this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.bindContainerEvents);
60
58
  }
61
59
  onCoreReady() {
62
60
  const mediaControl = this.core.getPlugin('media_control');
63
61
  assert(mediaControl, 'media_control plugin is required');
64
- this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.settingsUpdate);
65
- this.settingsUpdate();
62
+ this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
63
+ // MediaControl has been rendered
64
+ this.render();
66
65
  }
67
66
  bindContainerEvents() {
67
+ trace(`${T} bindContainerEvents`);
68
68
  this.listenToOnce(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.render);
69
- this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrChanged);
70
- }
71
- onDvrChanged(dvrInUse) {
72
- trace(`${T} onDvrChanged`, {
73
- dvrInUse,
74
- });
75
- if (this.core.getPlaybackType() !== Playback.LIVE) {
76
- return;
77
- }
78
- this.render();
79
- const mediaControl = this.core.getPlugin('media_control');
80
- mediaControl.$el.addClass('live');
81
- if (dvrInUse) {
82
- mediaControl.$el
83
- .addClass('dvr')
84
- .find(
85
- // TODO add API, test
86
- '.media-control-indicator[data-position], .media-control-indicator[data-duration]')
87
- .hide();
88
- }
89
- else {
90
- mediaControl.$el.removeClass('dvr');
91
- }
92
69
  }
93
70
  click() {
94
71
  const container = this.core.activeContainer;
@@ -97,13 +74,8 @@ export class DvrControls extends UICorePlugin {
97
74
  }
98
75
  container.seek(container.getDuration());
99
76
  }
100
- settingsUpdate() {
101
- this.core.getPlugin('media_control').$el.removeClass('live');
102
- this.render();
103
- }
104
77
  shouldRender() {
105
- const useDvrControls = this.core.options.useDvrControls !== false;
106
- return useDvrControls && this.core.getPlaybackType() === Playback.LIVE;
78
+ return this.core.getPlaybackType() === Playback.LIVE;
107
79
  }
108
80
  /**
109
81
  * @internal
@@ -113,16 +85,19 @@ export class DvrControls extends UICorePlugin {
113
85
  dvrEnabled: this.core.activePlayback?.dvrEnabled,
114
86
  playbackType: this.core.getPlaybackType(),
115
87
  });
88
+ const mediaControl = this.core.getPlugin('media_control');
89
+ if (!mediaControl) {
90
+ return this;
91
+ }
116
92
  if (!this.shouldRender()) {
117
93
  return this;
118
94
  }
95
+ mediaControl.toggleElement('duration', false);
96
+ mediaControl.toggleElement('position', false);
119
97
  this.$el.html(DvrControls.template({
120
- live: this.core.i18n.t('live'),
121
- backToLive: this.core.i18n.t('back_to_live'),
98
+ i18n: this.core.i18n,
122
99
  }));
123
- const mediaControl = this.core.getPlugin('media_control');
124
- mediaControl.$el.addClass('live');
125
- mediaControl.getLeftPanel().append(this.$el);
100
+ mediaControl.putElement('dvr', this.el);
126
101
  return this;
127
102
  }
128
103
  }
@@ -5,7 +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 = 'audioTracksSelector' | 'clipText' | 'gear' | 'pip' | 'playbackRate' | 'seekBarContainer' | 'subtitlesSelector';
8
+ export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'gear' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer';
9
9
  /**
10
10
  * Custom events emitted by the plugins to communicate with one another
11
11
  * @beta
@@ -23,7 +23,6 @@ export declare enum MediaControlEvents {
23
23
  * The methods exposed are to be used by the other plugins that extend the media control UI.
24
24
  */
25
25
  export declare class MediaControl extends UICorePlugin {
26
- private advertisementPlaying;
27
26
  private buttonsColor;
28
27
  private currentDurationValue;
29
28
  private currentPositionValue;
@@ -38,7 +37,6 @@ export declare class MediaControl extends UICorePlugin {
38
37
  private hideId;
39
38
  private hideVolumeId;
40
39
  private intendedVolume;
41
- private isHD;
42
40
  private keepVisible;
43
41
  private kibo;
44
42
  private lastMouseX;
@@ -165,7 +163,7 @@ export declare class MediaControl extends UICorePlugin {
165
163
  */
166
164
  setInitialVolume(): void;
167
165
  private onVolumeChanged;
168
- private onLoadedMetadataOnVideoTag;
166
+ private onLoadedMetadata;
169
167
  private updateVolumeUI;
170
168
  private changeTogglePlay;
171
169
  private mousemoveOnSeekBar;
@@ -199,16 +197,14 @@ export declare class MediaControl extends UICorePlugin {
199
197
  private renderSeekBar;
200
198
  private drawDurationAndPosition;
201
199
  private seek;
202
- private setKeepVisible;
203
- private resetKeepVisible;
204
200
  private setUserKeepVisible;
205
201
  private resetUserKeepVisible;
206
202
  private isVisible;
207
203
  private show;
208
204
  private hide;
209
205
  private updateCursorStyle;
210
- private settingsUpdate;
211
- private highDefinitionUpdate;
206
+ private updateSettings;
207
+ private onHdUpdate;
212
208
  private createCachedElements;
213
209
  /**
214
210
  * Get a media control element DOM node
@@ -230,18 +226,16 @@ export declare class MediaControl extends UICorePlugin {
230
226
  * ```
231
227
  */
232
228
  getElement(name: MediaControlElement): ZeptoResult | null;
233
- putElement(name: MediaControlElement, element: ZeptoResult): void;
229
+ putElement(name: MediaControlElement, element: HTMLElement): void;
234
230
  /**
235
- * Get the right panel area to append custom elements to
236
- * @returns ZeptoSelector of the right panel element
237
- */
238
- getRightPanel(): any;
239
- /**
240
- * Get the left panel area to append custom elements to
241
- * @returns ZeptoSelector of the left panel element
231
+ * Toggle the visibility of a media control element
232
+ * @param name - The name of the media control element
233
+ * @param show - Whether to show or hide the element
242
234
  */
243
- getLeftPanel(): any;
244
- getCenterPanel(): any;
235
+ toggleElement(name: MediaControlElement, show: boolean): void;
236
+ private getRightPanel;
237
+ private getLeftPanel;
238
+ private getCenterPanel;
245
239
  private resetIndicators;
246
240
  private initializeIcons;
247
241
  private setSeekPercentage;
@@ -275,5 +269,7 @@ export declare class MediaControl extends UICorePlugin {
275
269
  */
276
270
  disabledControlButton(): void;
277
271
  private isSeekEnabledForHtml5Playback;
272
+ private getElementLocation;
273
+ private onDvrStateChanged;
278
274
  }
279
275
  //# sourceMappingURL=MediaControl.d.ts.map
@@ -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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"}
@@ -19,6 +19,12 @@ import volumeMaxIcon from '../../../assets/icons/new/volume-max.svg';
19
19
  import volumeOffIcon from '../../../assets/icons/new/volume-off.svg';
20
20
  import fullscreenOffIcon from '../../../assets/icons/new/fullscreen-off.svg';
21
21
  import fullscreenOnIcon from '../../../assets/icons/new/fullscreen-on.svg';
22
+ const DEFAULT_SETTINGS = {
23
+ left: [],
24
+ right: [],
25
+ default: [],
26
+ seekEnabled: true,
27
+ };
22
28
  /**
23
29
  * Custom events emitted by the plugins to communicate with one another
24
30
  * @beta
@@ -34,7 +40,8 @@ const T = 'plugins.media_control';
34
40
  const LEFT_ORDER = [
35
41
  'playpause',
36
42
  'playstop',
37
- 'live',
43
+ // 'live',
44
+ 'dvr',
38
45
  'volume',
39
46
  'position',
40
47
  'duration',
@@ -53,7 +60,7 @@ function orderByOrderPattern(arr, order) {
53
60
  * The methods exposed are to be used by the other plugins that extend the media control UI.
54
61
  */
55
62
  export class MediaControl extends UICorePlugin {
56
- advertisementPlaying = false;
63
+ // private advertisementPlaying = false
57
64
  buttonsColor = null;
58
65
  currentDurationValue = 0;
59
66
  currentPositionValue = 0;
@@ -68,14 +75,13 @@ export class MediaControl extends UICorePlugin {
68
75
  hideId = null;
69
76
  hideVolumeId = null;
70
77
  intendedVolume = 100;
71
- isHD = false;
72
78
  keepVisible = false;
73
79
  kibo;
74
80
  lastMouseX = 0;
75
81
  lastMouseY = 0;
76
82
  persistConfig;
77
83
  rendered = false;
78
- settings = {};
84
+ settings = DEFAULT_SETTINGS;
79
85
  userDisabled = false;
80
86
  userKeepVisible = false;
81
87
  verticalVolume = false;
@@ -219,8 +225,6 @@ export class MediaControl extends UICorePlugin {
219
225
  * @internal
220
226
  */
221
227
  bindEvents() {
222
- // @ts-ignore
223
- this.stopListening();
224
228
  this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
225
229
  this.listenTo(this.core, Events.CORE_MOUSE_MOVE, this.show);
226
230
  this.listenTo(this.core, Events.CORE_MOUSE_LEAVE, () => this.hide(this.options.hideMediaControlDelay));
@@ -256,18 +260,16 @@ export class MediaControl extends UICorePlugin {
256
260
  this.listenTo(this.core.activeContainer, Events.CONTAINER_DBLCLICK, this.toggleFullscreen);
257
261
  this.listenTo(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
258
262
  this.listenTo(this.core.activeContainer, Events.CONTAINER_PROGRESS, this.updateProgressBar);
259
- this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.settingsUpdate);
260
- this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.settingsUpdate);
261
- this.listenTo(this.core.activeContainer, Events.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
263
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.updateSettings);
264
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
265
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_HIGHDEFINITIONUPDATE, this.onHdUpdate);
262
266
  this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_DISABLE, this.disable);
263
267
  this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_ENABLE, this.enable);
264
268
  this.listenTo(this.core.activeContainer, Events.CONTAINER_ENDED, this.ended);
265
269
  this.listenTo(this.core.activeContainer, Events.CONTAINER_VOLUME, this.onVolumeChanged);
266
270
  this.listenTo(this.core.activeContainer, Events.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
267
- if (this.core.activePlayback.el.nodeName.toLowerCase() === 'video') {
268
- // wait until the metadata has loaded and then check if fullscreen on video tag is supported
269
- this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadataOnVideoTag);
270
- }
271
+ // wait until the metadata has loaded and then check if fullscreen on video tag is supported
272
+ this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
271
273
  }
272
274
  /**
273
275
  * Hides the media control UI
@@ -302,13 +304,19 @@ export class MediaControl extends UICorePlugin {
302
304
  onVolumeChanged() {
303
305
  this.updateVolumeUI();
304
306
  }
305
- onLoadedMetadataOnVideoTag(event) {
307
+ onLoadedMetadata() {
306
308
  const video = this.core.activePlayback?.el;
307
309
  // video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
308
310
  // see https://github.com/clappr/clappr/issues/1127
309
311
  if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
310
312
  this.fullScreenOnVideoTagSupported = true;
311
- this.settingsUpdate();
313
+ }
314
+ this.updateSettings();
315
+ if (this.core.activeContainer.getPlaybackType() === Playback.LIVE) {
316
+ this.$el.addClass('live');
317
+ }
318
+ else {
319
+ this.$el.removeClass('live');
312
320
  }
313
321
  }
314
322
  updateVolumeUI() {
@@ -317,8 +325,6 @@ export class MediaControl extends UICorePlugin {
317
325
  return;
318
326
  }
319
327
  assert.ok(this.$volumeBarContainer, 'volume bar container must be present');
320
- // update volume bar scrubber/fill on bar mode
321
- // this.$volumeBarContainer.find('.bar-fill-2').css({});
322
328
  const containerWidth = this.$volumeBarContainer.width();
323
329
  assert.ok(this.$volumeBarBackground, 'volume bar background must be present');
324
330
  const barWidth = this.$volumeBarBackground.width();
@@ -507,17 +513,18 @@ export class MediaControl extends UICorePlugin {
507
513
  // if the container is not ready etc
508
514
  this.intendedVolume = value;
509
515
  this.persistConfig && !isInitialVolume && Config.persist('volume', value);
516
+ // TODO
510
517
  const setWhenContainerReady = () => {
511
- if (this.container && this.container.isReady) {
512
- this.container.setVolume(value);
518
+ if (this.core.activeContainer && this.core.activeContainer.isReady) {
519
+ this.core.activeContainer.setVolume(value);
513
520
  }
514
521
  else {
515
- this.listenToOnce(this.container, Events.CONTAINER_READY, () => {
516
- this.container.setVolume(value);
522
+ this.listenToOnce(this.core.activeContainer, Events.CONTAINER_READY, () => {
523
+ this.core.activeContainer.setVolume(value);
517
524
  });
518
525
  }
519
526
  };
520
- if (!this.container) {
527
+ if (!this.core.activeContainer) {
521
528
  this.listenToOnce(this, Events.MEDIACONTROL_CONTAINERCHANGED, () => setWhenContainerReady());
522
529
  }
523
530
  else {
@@ -527,7 +534,7 @@ export class MediaControl extends UICorePlugin {
527
534
  toggleFullscreen() {
528
535
  if (!Browser.isMobile) {
529
536
  this.trigger(Events.MEDIACONTROL_FULLSCREEN, this.name);
530
- this.container.fullscreen();
537
+ this.core.activeContainer.fullscreen();
531
538
  this.core.toggleFullscreen();
532
539
  this.resetUserKeepVisible();
533
540
  }
@@ -538,7 +545,8 @@ export class MediaControl extends UICorePlugin {
538
545
  this.setInitialVolume();
539
546
  this.changeTogglePlay();
540
547
  this.bindContainerEvents();
541
- this.settingsUpdate();
548
+ this.updateSettings();
549
+ // TODO remove
542
550
  this.core.activeContainer.trigger(Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
543
551
  // TODO test
544
552
  if (this.core.activeContainer.mediaControlDisabled) {
@@ -609,9 +617,9 @@ export class MediaControl extends UICorePlugin {
609
617
  }
610
618
  // default to 100%
611
619
  this.currentSeekBarPercentage = 100;
612
- if (this.container &&
613
- (this.container.getPlaybackType() !== Playback.LIVE ||
614
- this.container.isDvrInUse())) {
620
+ if (this.core.activeContainer &&
621
+ (this.core.activeContainer.getPlaybackType() !== Playback.LIVE ||
622
+ this.core.activeContainer.isDvrInUse())) {
615
623
  this.currentSeekBarPercentage =
616
624
  (this.currentPositionValue / this.currentDurationValue) * 100;
617
625
  }
@@ -638,16 +646,10 @@ export class MediaControl extends UICorePlugin {
638
646
  const offsetX = MediaControl.getPageX(event) - this.$seekBarContainer.offset().left;
639
647
  let pos = (offsetX / this.$seekBarContainer.width()) * 100;
640
648
  pos = Math.min(100, Math.max(pos, 0));
641
- this.container && this.container.seekPercentage(pos);
649
+ this.core.activeContainer && this.core.activeContainer.seekPercentage(pos);
642
650
  this.setSeekPercentage(pos);
643
651
  return false;
644
652
  }
645
- setKeepVisible() {
646
- this.keepVisible = true;
647
- }
648
- resetKeepVisible() {
649
- this.keepVisible = false;
650
- }
651
653
  setUserKeepVisible() {
652
654
  this.userKeepVisible = true;
653
655
  }
@@ -719,18 +721,24 @@ export class MediaControl extends UICorePlugin {
719
721
  this.core.$el.addClass('nocursor');
720
722
  }
721
723
  }
722
- settingsUpdate() {
724
+ updateSettings() {
723
725
  const newSettings = $.extend(true, {
724
726
  left: [],
725
727
  default: [],
726
728
  right: [],
727
- }, this.core.activeContainer?.settings);
729
+ }, this.core.activeContainer.settings);
730
+ // TODO make order controlled via CSS
728
731
  newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
732
+ if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
733
+ this.core.activePlayback.dvrEnabled) {
734
+ newSettings.left.push('dvr');
735
+ }
736
+ // actual order of the items appear rendered is controlled by CSS
729
737
  newSettings.right = [
730
738
  'fullscreen',
731
739
  'pip',
732
- 'bottomgear',
733
- 'subtitles',
740
+ 'gear',
741
+ 'cc',
734
742
  'multicamera',
735
743
  'playbackrate',
736
744
  'vr',
@@ -739,24 +747,25 @@ export class MediaControl extends UICorePlugin {
739
747
  if ((!this.fullScreenOnVideoTagSupported &&
740
748
  !Fullscreen.fullscreenEnabled()) ||
741
749
  this.options.fullscreenDisable) {
742
- // remove fullscreen from settings if it is present
750
+ // remove fullscreen from settings if it is not available
743
751
  removeArrayItem(newSettings.default, 'fullscreen');
744
752
  removeArrayItem(newSettings.left, 'fullscreen');
745
753
  removeArrayItem(newSettings.right, 'fullscreen');
746
754
  }
747
755
  removeArrayItem(newSettings.default, 'hd-indicator');
748
756
  removeArrayItem(newSettings.left, 'hd-indicator');
757
+ // TODO get from container's settings
749
758
  if (this.core.activePlayback.name === 'html5_video') {
750
759
  newSettings.seekEnabled = this.isSeekEnabledForHtml5Playback();
751
760
  }
752
- const settingsChanged = JSON.stringify(this.settings) !== JSON.stringify(newSettings);
761
+ const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
753
762
  if (settingsChanged) {
754
763
  this.settings = newSettings;
755
764
  this.render();
756
765
  }
757
766
  }
758
- highDefinitionUpdate(isHD) {
759
- this.isHD = isHD;
767
+ onHdUpdate(isHD) {
768
+ // TODO render?
760
769
  }
761
770
  createCachedElements() {
762
771
  const $layer = this.$el.find('.media-control-layer');
@@ -778,7 +787,7 @@ export class MediaControl extends UICorePlugin {
778
787
  this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
779
788
  this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
780
789
  this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
781
- this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
790
+ this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
782
791
  this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
783
792
  this.resetIndicators();
784
793
  this.initializeIcons();
@@ -804,49 +813,45 @@ export class MediaControl extends UICorePlugin {
804
813
  */
805
814
  getElement(name) {
806
815
  switch (name) {
807
- case 'audioTracksSelector':
816
+ case 'audiotracks':
808
817
  return null;
809
818
  case 'clipText':
810
819
  return this.$clipText;
811
- case 'gear':
812
- return null;
813
- case 'pip':
814
- return null;
815
820
  case 'playbackRate':
816
821
  return this.$playbackRate;
817
822
  case 'seekBarContainer':
818
823
  return this.$seekBarContainer;
819
- case 'subtitlesSelector':
820
- return null;
821
824
  }
822
825
  }
823
826
  putElement(name, element) {
824
- switch (name) {
825
- case 'audioTracksSelector':
826
- this.getRightPanel().append(element);
827
- break;
828
- case 'gear':
829
- this.getRightPanel().append(element);
830
- break;
831
- case 'pip':
832
- this.getRightPanel().append(element);
833
- break;
834
- case 'subtitlesSelector':
835
- this.getRightPanel().append(element);
836
- break;
827
+ const panel = this.getElementLocation(name);
828
+ trace(`${T} putElement`, { name, panel: !!panel });
829
+ if (panel) {
830
+ const current = panel.find(`[data-${name}]`);
831
+ element.setAttribute(`data-${name}`, '');
832
+ // TODO test
833
+ if (current.length) {
834
+ if (current[0] === element) {
835
+ return;
836
+ }
837
+ current.replaceWith(element);
838
+ }
839
+ else {
840
+ panel.append(element);
841
+ }
837
842
  }
838
843
  }
839
844
  /**
840
- * Get the right panel area to append custom elements to
841
- * @returns ZeptoSelector of the right panel element
845
+ * Toggle the visibility of a media control element
846
+ * @param name - The name of the media control element
847
+ * @param show - Whether to show or hide the element
842
848
  */
849
+ toggleElement(name, show) {
850
+ this.$el.find(`[data-${name}]`).toggle(show);
851
+ }
843
852
  getRightPanel() {
844
853
  return this.$el.find('.media-control-right-panel');
845
854
  }
846
- /**
847
- * Get the left panel area to append custom elements to
848
- * @returns ZeptoSelector of the left panel element
849
- */
850
855
  getLeftPanel() {
851
856
  return this.$el.find('.media-control-left-panel');
852
857
  }
@@ -1045,7 +1050,6 @@ export class MediaControl extends UICorePlugin {
1045
1050
  this.hideVolumeBar(0);
1046
1051
  }, 0);
1047
1052
  this.parseColors();
1048
- this.highDefinitionUpdate(this.isHD);
1049
1053
  this.core.$el.append(this.el);
1050
1054
  this.rendered = true;
1051
1055
  this.updateVolumeUI();
@@ -1071,12 +1075,12 @@ export class MediaControl extends UICorePlugin {
1071
1075
  }
1072
1076
  // TODO manage by the ads plugin
1073
1077
  onStartAd() {
1074
- this.advertisementPlaying = true;
1078
+ // this.advertisementPlaying = true
1075
1079
  this.disable();
1076
1080
  }
1077
1081
  // TODO manage by the ads plugin
1078
1082
  onFinishAd() {
1079
- this.advertisementPlaying = false;
1083
+ // this.advertisementPlaying = false
1080
1084
  this.enable();
1081
1085
  }
1082
1086
  // TODO remove
@@ -1120,7 +1124,36 @@ export class MediaControl extends UICorePlugin {
1120
1124
  }
1121
1125
  return isFinite(this.core.activePlayback.getDuration());
1122
1126
  }
1127
+ getElementLocation(name) {
1128
+ if (this.settings.right?.includes(name)) {
1129
+ return this.getRightPanel();
1130
+ }
1131
+ if (this.settings.left?.includes(name)) {
1132
+ return this.getLeftPanel();
1133
+ }
1134
+ if (this.settings.default?.includes(name)) {
1135
+ return this.getCenterPanel();
1136
+ }
1137
+ return null;
1138
+ }
1139
+ onDvrStateChanged(dvrInUse) {
1140
+ if (dvrInUse) {
1141
+ this.$el.addClass('dvr');
1142
+ }
1143
+ else {
1144
+ this.$el.removeClass('dvr');
1145
+ }
1146
+ }
1123
1147
  }
1124
1148
  MediaControl.extend = function (properties) {
1125
1149
  return extend(MediaControl, properties);
1126
1150
  };
1151
+ function serializeSettings(s) {
1152
+ return s.left
1153
+ .slice()
1154
+ .sort()
1155
+ .concat(s.right.slice().sort())
1156
+ .concat(s.default.slice().sort())
1157
+ .concat([s.seekEnabled])
1158
+ .join(',');
1159
+ }
@@ -25,6 +25,7 @@ export declare class PictureInPicture extends UICorePlugin {
25
25
  * @internal
26
26
  */
27
27
  static get version(): string;
28
+ private static buttonTemplate;
28
29
  /**
29
30
  * @internal
30
31
  */
@@ -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;;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;IAiBf,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;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"}
@@ -35,6 +35,7 @@ export class PictureInPicture extends UICorePlugin {
35
35
  static get version() {
36
36
  return VERSION;
37
37
  }
38
+ static buttonTemplate = template(buttonHtml);
38
39
  /**
39
40
  * @internal
40
41
  */
@@ -59,8 +60,8 @@ export class PictureInPicture extends UICorePlugin {
59
60
  }
60
61
  isPiPSupported() {
61
62
  trace(`${T} isPiPSupported`, {
62
- pictureInPictureEnabled: document.pictureInPictureEnabled,
63
- requestPictureInPicture: HTMLVideoElement.prototype.requestPictureInPicture,
63
+ pictureInPictureEnabled: !!document.pictureInPictureEnabled,
64
+ requestPictureInPicture: !!HTMLVideoElement.prototype.requestPictureInPicture,
64
65
  });
65
66
  return document.pictureInPictureEnabled && !!HTMLVideoElement.prototype.requestPictureInPicture;
66
67
  }
@@ -71,8 +72,7 @@ export class PictureInPicture extends UICorePlugin {
71
72
  if (!this.isPiPSupported()) {
72
73
  return this;
73
74
  }
74
- const t = template(buttonHtml);
75
- this.$el.html(t({ pipIcon }));
75
+ this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
76
76
  const mediaControl = this.core.getPlugin('media_control');
77
77
  if (mediaControl) {
78
78
  mediaControl.putElement('pip', this.el);
@@ -36,7 +36,6 @@ export declare class PlaybackRate extends UICorePlugin {
36
36
  */
37
37
  get attributes(): {
38
38
  class: string;
39
- 'data-playback-rate-select': string;
40
39
  };
41
40
  /**
42
41
  * @internal