@gcorevideo/player 2.21.1 → 2.21.4
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.
- package/assets/audio-selector/style.scss +1 -1
- package/assets/audio-selector/track-selector.ejs +3 -3
- package/assets/bottom-gear/bottomgear.ejs +2 -2
- package/assets/media-control/container.scss +1 -1
- package/assets/media-control/media-control.ejs +1 -11
- package/assets/media-control/media-control.scss +49 -57
- package/assets/media-control/width270.scss +1 -1
- package/assets/media-control/width370.scss +7 -9
- package/assets/playback-rate/button.ejs +2 -2
- package/assets/playback-rate/list.ejs +4 -4
- package/assets/subtitles/combobox.ejs +10 -12
- package/assets/subtitles/string.ejs +1 -1
- package/assets/subtitles/style.scss +9 -16
- package/dist/core.js +5 -1
- package/dist/index.css +782 -794
- package/dist/index.js +240 -244
- package/dist/player.d.ts +141 -119
- package/dist/plugins/index.css +862 -874
- package/dist/plugins/index.js +222 -238
- package/docs/api/player.bottomgear.getelement.md +2 -2
- package/docs/api/player.bottomgear.md +1 -1
- package/docs/api/{player.subtitles.hide.md → player.closedcaptions.hide.md} +2 -2
- package/docs/api/{player.subtitles.md → player.closedcaptions.md} +11 -11
- package/docs/api/{player.subtitles.show.md → player.closedcaptions.show.md} +2 -2
- package/docs/api/player.closedcaptionspluginsettings.md +13 -0
- package/docs/api/player.gearitemelement.md +6 -4
- package/docs/api/player.gearoptionsitem.md +16 -0
- package/docs/api/player.md +48 -12
- package/docs/api/player.mediacontrol.putelement.md +2 -2
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/docs/api/player.playbackrate.md +1 -1
- package/docs/api/player.subtitlespluginsettings.md +18 -0
- package/docs/api/player.texttrackitem.id.md +11 -0
- package/docs/api/player.texttrackitem.md +87 -0
- package/docs/api/player.texttrackitem.name.md +11 -0
- package/docs/api/player.texttrackitem.track.md +11 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.plugins.d.ts +2 -1
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +2 -1
- package/lib/playback/BasePlayback.d.ts +1 -0
- package/lib/playback/BasePlayback.d.ts.map +1 -1
- package/lib/playback/BasePlayback.js +3 -0
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +1 -0
- package/lib/playback.types.d.ts +5 -0
- package/lib/playback.types.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.d.ts +2 -3
- package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.js +6 -7
- package/lib/plugins/bottom-gear/BottomGear.d.ts +7 -3
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +4 -2
- package/lib/plugins/media-control/MediaControl.d.ts +5 -6
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +48 -39
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +1 -0
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
- package/lib/plugins/picture-in-picture/PictureInPicture.js +4 -4
- package/lib/plugins/playback-rate/PlaybackRate.d.ts +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +24 -14
- package/lib/plugins/subtitles/ClosedCaptions.d.ts +118 -0
- package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -0
- package/lib/plugins/subtitles/ClosedCaptions.js +348 -0
- package/lib/plugins/subtitles/Subtitles.d.ts +31 -26
- package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -1
- package/lib/plugins/subtitles/Subtitles.js +138 -169
- package/lib/testUtils.d.ts +22 -18
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +22 -36
- package/package.json +1 -1
- package/src/index.plugins.ts +2 -1
- package/src/index.ts +1 -1
- package/src/playback/BasePlayback.ts +4 -0
- package/src/playback/dash-playback/DashPlayback.ts +1 -0
- package/src/playback.types.ts +6 -0
- package/src/plugins/audio-selector/AudioSelector.ts +9 -8
- package/src/plugins/bottom-gear/BottomGear.ts +14 -5
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -1
- package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +2 -2
- package/src/plugins/media-control/MediaControl.ts +84 -60
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +43 -0
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +175 -0
- package/src/plugins/picture-in-picture/PictureInPicture.ts +5 -5
- package/src/plugins/playback-rate/PlaybackRate.ts +143 -100
- package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +65 -0
- package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +11 -0
- package/src/plugins/subtitles/ClosedCaptions.ts +469 -0
- package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +58 -0
- package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +25 -0
- package/src/testUtils.ts +22 -36
- package/temp/player.api.json +269 -89
- package/tsconfig.tsbuildinfo +1 -1
- package/src/plugins/index.ts +0 -39
- package/src/plugins/subtitles/Subtitles.ts +0 -496
|
@@ -6,7 +6,11 @@ import { ZeptoResult } from '../../types.js';
|
|
|
6
6
|
* An element inside the gear menu
|
|
7
7
|
* @beta
|
|
8
8
|
*/
|
|
9
|
-
export type
|
|
9
|
+
export type GearOptionsItem = 'quality' | 'rate' | 'nerd';
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated Use {@link GearOptionsItem} instead
|
|
12
|
+
*/
|
|
13
|
+
export type GearItemElement = GearOptionsItem;
|
|
10
14
|
/**
|
|
11
15
|
* `PLUGIN` that adds the gear button with an extra options menu on the right side of the {@link MediaControl | media control} UI
|
|
12
16
|
* @beta
|
|
@@ -15,7 +19,7 @@ export type GearItemElement = 'quality' | 'rate' | 'nerd';
|
|
|
15
19
|
*
|
|
16
20
|
* Depends on:
|
|
17
21
|
*
|
|
18
|
-
* - {@link MediaControl
|
|
22
|
+
* - {@link MediaControl}
|
|
19
23
|
*/
|
|
20
24
|
export declare class BottomGear extends UICorePlugin {
|
|
21
25
|
private isHd;
|
|
@@ -54,7 +58,7 @@ export declare class BottomGear extends UICorePlugin {
|
|
|
54
58
|
* @param name - Name of a gear menu placeholder item to attach custom UI
|
|
55
59
|
* @returns Zepto result of the element
|
|
56
60
|
*/
|
|
57
|
-
getElement(name:
|
|
61
|
+
getElement(name: GearOptionsItem): ZeptoResult | null;
|
|
58
62
|
/**
|
|
59
63
|
* Replaces the content of the gear menu
|
|
60
64
|
* @param content - Zepto result of the element
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,cAAc,CAAC;AAO9E,OAAO,uCAAuC,CAAC;AAC/C,OAAO,gDAAgD,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAO7C;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D;;;;;;;;;GASG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,IAAI,CAAS;IAErB;;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;IAKnB;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,cAAc,CAAC;AAO9E,OAAO,uCAAuC,CAAC;AAC/C,OAAO,gDAAgD,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAO7C;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC;AAI9C;;;;;;;;;GASG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,IAAI,CAAS;IAErB;;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;IAKnB;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI;IAMrD;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW;IAI/B,OAAO,CAAC,wBAAwB;IAKhC,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACM,MAAM;IAiBf;;;;OAIG;IACH,OAAO;IAKP,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,WAAW;CAMpB"}
|
|
@@ -10,6 +10,7 @@ import gearHdIcon from '../../../assets/icons/new/gear-hd.svg';
|
|
|
10
10
|
import { MediaControlEvents } from '../media-control/MediaControl';
|
|
11
11
|
const VERSION = '2.19.12';
|
|
12
12
|
const T = 'plugins.bottom_gear';
|
|
13
|
+
// TODO disabled if no items added
|
|
13
14
|
/**
|
|
14
15
|
* `PLUGIN` that adds the gear button with an extra options menu on the right side of the {@link MediaControl | media control} UI
|
|
15
16
|
* @beta
|
|
@@ -18,7 +19,7 @@ const T = 'plugins.bottom_gear';
|
|
|
18
19
|
*
|
|
19
20
|
* Depends on:
|
|
20
21
|
*
|
|
21
|
-
* - {@link MediaControl
|
|
22
|
+
* - {@link MediaControl}
|
|
22
23
|
*/
|
|
23
24
|
export class BottomGear extends UICorePlugin {
|
|
24
25
|
isHd = false;
|
|
@@ -71,6 +72,7 @@ export class BottomGear extends UICorePlugin {
|
|
|
71
72
|
getElement(name) {
|
|
72
73
|
return this.$el.find(`.gear-options-list [data-${name}]`);
|
|
73
74
|
}
|
|
75
|
+
// TODO implement putElement/addElement method
|
|
74
76
|
/**
|
|
75
77
|
* Replaces the content of the gear menu
|
|
76
78
|
* @param content - Zepto result of the element
|
|
@@ -104,7 +106,7 @@ export class BottomGear extends UICorePlugin {
|
|
|
104
106
|
];
|
|
105
107
|
const icon = this.isHd ? gearHdIcon : gearIcon;
|
|
106
108
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
107
|
-
mediaControl.putElement('gear', this
|
|
109
|
+
mediaControl.putElement('gear', this.el);
|
|
108
110
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
109
111
|
return this;
|
|
110
112
|
}
|
|
@@ -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 = '
|
|
8
|
+
export type MediaControlElement = 'audiotracks' | 'clipText' | 'gear' | 'pip' | 'playbackRate' | 'seekBarContainer' | 'cc';
|
|
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;
|
|
@@ -65,7 +64,6 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
65
64
|
private $seekBarLoaded;
|
|
66
65
|
private $seekBarPosition;
|
|
67
66
|
private $seekBarScrubber;
|
|
68
|
-
private $subtitlesSelector;
|
|
69
67
|
private $volumeBarContainer;
|
|
70
68
|
private $volumeBarBackground;
|
|
71
69
|
private $volumeBarFill;
|
|
@@ -166,7 +164,7 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
166
164
|
*/
|
|
167
165
|
setInitialVolume(): void;
|
|
168
166
|
private onVolumeChanged;
|
|
169
|
-
private
|
|
167
|
+
private onLoadedMetadata;
|
|
170
168
|
private updateVolumeUI;
|
|
171
169
|
private changeTogglePlay;
|
|
172
170
|
private mousemoveOnSeekBar;
|
|
@@ -208,7 +206,7 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
208
206
|
private show;
|
|
209
207
|
private hide;
|
|
210
208
|
private updateCursorStyle;
|
|
211
|
-
private
|
|
209
|
+
private updateSettings;
|
|
212
210
|
private highDefinitionUpdate;
|
|
213
211
|
private createCachedElements;
|
|
214
212
|
/**
|
|
@@ -231,7 +229,7 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
231
229
|
* ```
|
|
232
230
|
*/
|
|
233
231
|
getElement(name: MediaControlElement): ZeptoResult | null;
|
|
234
|
-
putElement(name: MediaControlElement, element:
|
|
232
|
+
putElement(name: MediaControlElement, element: HTMLElement): void;
|
|
235
233
|
/**
|
|
236
234
|
* Get the right panel area to append custom elements to
|
|
237
235
|
* @returns ZeptoSelector of the right panel element
|
|
@@ -276,5 +274,6 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
276
274
|
*/
|
|
277
275
|
disabledControlButton(): void;
|
|
278
276
|
private isSeekEnabledForHtml5Playback;
|
|
277
|
+
private getElementLocation;
|
|
279
278
|
}
|
|
280
279
|
//# sourceMappingURL=MediaControl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,YAAY,EAMZ,IAAI,EACL,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,7 +53,7 @@ function orderByOrderPattern(arr, order) {
|
|
|
53
53
|
* The methods exposed are to be used by the other plugins that extend the media control UI.
|
|
54
54
|
*/
|
|
55
55
|
export class MediaControl extends UICorePlugin {
|
|
56
|
-
advertisementPlaying = false
|
|
56
|
+
// private advertisementPlaying = false
|
|
57
57
|
buttonsColor = null;
|
|
58
58
|
currentDurationValue = 0;
|
|
59
59
|
currentPositionValue = 0;
|
|
@@ -75,7 +75,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
75
75
|
lastMouseY = 0;
|
|
76
76
|
persistConfig;
|
|
77
77
|
rendered = false;
|
|
78
|
-
settings = {};
|
|
78
|
+
settings = {}; // TODO & seekEnabled: boolean, ...
|
|
79
79
|
userDisabled = false;
|
|
80
80
|
userKeepVisible = false;
|
|
81
81
|
verticalVolume = false;
|
|
@@ -95,7 +95,6 @@ export class MediaControl extends UICorePlugin {
|
|
|
95
95
|
$seekBarLoaded = null;
|
|
96
96
|
$seekBarPosition = null;
|
|
97
97
|
$seekBarScrubber = null;
|
|
98
|
-
$subtitlesSelector = null;
|
|
99
98
|
$volumeBarContainer = null;
|
|
100
99
|
$volumeBarBackground = null;
|
|
101
100
|
$volumeBarFill = null;
|
|
@@ -116,7 +115,8 @@ export class MediaControl extends UICorePlugin {
|
|
|
116
115
|
return { min: CLAPPR_VERSION };
|
|
117
116
|
}
|
|
118
117
|
get disabled() {
|
|
119
|
-
const playbackIsNOOP = this.core.activeContainer &&
|
|
118
|
+
const playbackIsNOOP = this.core.activeContainer &&
|
|
119
|
+
this.core.activeContainer.getPlaybackType() === Playback.NO_OP;
|
|
120
120
|
return this.userDisabled || playbackIsNOOP;
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
@@ -256,18 +256,16 @@ export class MediaControl extends UICorePlugin {
|
|
|
256
256
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_DBLCLICK, this.toggleFullscreen);
|
|
257
257
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
|
|
258
258
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_PROGRESS, this.updateProgressBar);
|
|
259
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.
|
|
260
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.
|
|
259
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.updateSettings);
|
|
260
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.updateSettings);
|
|
261
261
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
|
|
262
262
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_DISABLE, this.disable);
|
|
263
263
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_ENABLE, this.enable);
|
|
264
264
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_ENDED, this.ended);
|
|
265
265
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_VOLUME, this.onVolumeChanged);
|
|
266
266
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
|
|
267
|
-
if
|
|
268
|
-
|
|
269
|
-
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadataOnVideoTag);
|
|
270
|
-
}
|
|
267
|
+
// wait until the metadata has loaded and then check if fullscreen on video tag is supported
|
|
268
|
+
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
|
|
271
269
|
}
|
|
272
270
|
/**
|
|
273
271
|
* Hides the media control UI
|
|
@@ -302,13 +300,13 @@ export class MediaControl extends UICorePlugin {
|
|
|
302
300
|
onVolumeChanged() {
|
|
303
301
|
this.updateVolumeUI();
|
|
304
302
|
}
|
|
305
|
-
|
|
303
|
+
onLoadedMetadata() {
|
|
306
304
|
const video = this.core.activePlayback?.el;
|
|
307
305
|
// video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
|
|
308
306
|
// see https://github.com/clappr/clappr/issues/1127
|
|
309
307
|
if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
|
|
310
308
|
this.fullScreenOnVideoTagSupported = true;
|
|
311
|
-
this.
|
|
309
|
+
this.updateSettings();
|
|
312
310
|
}
|
|
313
311
|
}
|
|
314
312
|
updateVolumeUI() {
|
|
@@ -538,7 +536,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
538
536
|
this.setInitialVolume();
|
|
539
537
|
this.changeTogglePlay();
|
|
540
538
|
this.bindContainerEvents();
|
|
541
|
-
this.
|
|
539
|
+
this.updateSettings();
|
|
542
540
|
this.core.activeContainer.trigger(Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
|
|
543
541
|
// TODO test
|
|
544
542
|
if (this.core.activeContainer.mediaControlDisabled) {
|
|
@@ -719,18 +717,19 @@ export class MediaControl extends UICorePlugin {
|
|
|
719
717
|
this.core.$el.addClass('nocursor');
|
|
720
718
|
}
|
|
721
719
|
}
|
|
722
|
-
|
|
720
|
+
updateSettings() {
|
|
723
721
|
const newSettings = $.extend(true, {
|
|
724
722
|
left: [],
|
|
725
723
|
default: [],
|
|
726
724
|
right: [],
|
|
727
|
-
}, this.core.activeContainer
|
|
725
|
+
}, this.core.activeContainer.settings);
|
|
728
726
|
newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
|
|
727
|
+
// actual order of the items appear rendered is controlled by CSS
|
|
729
728
|
newSettings.right = [
|
|
730
729
|
'fullscreen',
|
|
731
730
|
'pip',
|
|
732
|
-
'
|
|
733
|
-
'
|
|
731
|
+
'gear',
|
|
732
|
+
'cc',
|
|
734
733
|
'multicamera',
|
|
735
734
|
'playbackrate',
|
|
736
735
|
'vr',
|
|
@@ -739,7 +738,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
739
738
|
if ((!this.fullScreenOnVideoTagSupported &&
|
|
740
739
|
!Fullscreen.fullscreenEnabled()) ||
|
|
741
740
|
this.options.fullscreenDisable) {
|
|
742
|
-
// remove fullscreen from settings if it is
|
|
741
|
+
// remove fullscreen from settings if it is not available
|
|
743
742
|
removeArrayItem(newSettings.default, 'fullscreen');
|
|
744
743
|
removeArrayItem(newSettings.left, 'fullscreen');
|
|
745
744
|
removeArrayItem(newSettings.right, 'fullscreen');
|
|
@@ -776,10 +775,9 @@ export class MediaControl extends UICorePlugin {
|
|
|
776
775
|
this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
|
|
777
776
|
this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
|
|
778
777
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
779
|
-
this.$subtitlesSelector = this.$el.find('.media-control-subtitles[data-subtitles]');
|
|
780
778
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
781
779
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
782
|
-
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
|
|
780
|
+
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
|
|
783
781
|
this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
|
|
784
782
|
this.resetIndicators();
|
|
785
783
|
this.initializeIcons();
|
|
@@ -805,33 +803,32 @@ export class MediaControl extends UICorePlugin {
|
|
|
805
803
|
*/
|
|
806
804
|
getElement(name) {
|
|
807
805
|
switch (name) {
|
|
808
|
-
case '
|
|
806
|
+
case 'audiotracks':
|
|
809
807
|
return null;
|
|
810
808
|
case 'clipText':
|
|
811
809
|
return this.$clipText;
|
|
812
|
-
case 'gear':
|
|
813
|
-
return null;
|
|
814
|
-
case 'pip':
|
|
815
|
-
return null;
|
|
816
810
|
case 'playbackRate':
|
|
817
811
|
return this.$playbackRate;
|
|
818
812
|
case 'seekBarContainer':
|
|
819
813
|
return this.$seekBarContainer;
|
|
820
|
-
case 'subtitlesSelector':
|
|
821
|
-
return this.$subtitlesSelector;
|
|
822
814
|
}
|
|
823
815
|
}
|
|
824
816
|
putElement(name, element) {
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
817
|
+
const panel = this.getElementLocation(name);
|
|
818
|
+
trace(`${T} putElement`, { name, panel: !!panel });
|
|
819
|
+
if (panel) {
|
|
820
|
+
const current = panel.find(`[data-${name}]`);
|
|
821
|
+
element.setAttribute(`data-${name}`, "");
|
|
822
|
+
// TODO test
|
|
823
|
+
if (current.length) {
|
|
824
|
+
if (current[0] === element) {
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
current.replaceWith(element);
|
|
828
|
+
}
|
|
829
|
+
else {
|
|
830
|
+
panel.append(element);
|
|
831
|
+
}
|
|
835
832
|
}
|
|
836
833
|
}
|
|
837
834
|
/**
|
|
@@ -1069,12 +1066,12 @@ export class MediaControl extends UICorePlugin {
|
|
|
1069
1066
|
}
|
|
1070
1067
|
// TODO manage by the ads plugin
|
|
1071
1068
|
onStartAd() {
|
|
1072
|
-
this.advertisementPlaying = true
|
|
1069
|
+
// this.advertisementPlaying = true
|
|
1073
1070
|
this.disable();
|
|
1074
1071
|
}
|
|
1075
1072
|
// TODO manage by the ads plugin
|
|
1076
1073
|
onFinishAd() {
|
|
1077
|
-
this.advertisementPlaying = false
|
|
1074
|
+
// this.advertisementPlaying = false
|
|
1078
1075
|
this.enable();
|
|
1079
1076
|
}
|
|
1080
1077
|
// TODO remove
|
|
@@ -1118,6 +1115,18 @@ export class MediaControl extends UICorePlugin {
|
|
|
1118
1115
|
}
|
|
1119
1116
|
return isFinite(this.core.activePlayback.getDuration());
|
|
1120
1117
|
}
|
|
1118
|
+
getElementLocation(name) {
|
|
1119
|
+
if (this.settings.right?.includes(name)) {
|
|
1120
|
+
return this.getRightPanel();
|
|
1121
|
+
}
|
|
1122
|
+
if (this.settings.left?.includes(name)) {
|
|
1123
|
+
return this.getLeftPanel();
|
|
1124
|
+
}
|
|
1125
|
+
if (this.settings.default?.includes(name)) {
|
|
1126
|
+
return this.getCenterPanel();
|
|
1127
|
+
}
|
|
1128
|
+
return null;
|
|
1129
|
+
}
|
|
1121
1130
|
}
|
|
1122
1131
|
MediaControl.extend = function (properties) {
|
|
1123
1132
|
return extend(MediaControl, properties);
|
|
@@ -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;
|
|
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
|
-
|
|
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);
|
|
@@ -11,6 +11,7 @@ import { UICorePlugin, Core } from '@clappr/core';
|
|
|
11
11
|
* - {@link BottomGear | bottom_gear}
|
|
12
12
|
*
|
|
13
13
|
* It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
|
|
14
|
+
* Note that the playback rate change is supported only for VOD or DVR enabled live streams.
|
|
14
15
|
*/
|
|
15
16
|
export declare class PlaybackRate extends UICorePlugin {
|
|
16
17
|
private playbackRates;
|
|
@@ -35,7 +36,6 @@ export declare class PlaybackRate extends UICorePlugin {
|
|
|
35
36
|
*/
|
|
36
37
|
get attributes(): {
|
|
37
38
|
class: string;
|
|
38
|
-
'data-playback-rate-select': string;
|
|
39
39
|
};
|
|
40
40
|
/**
|
|
41
41
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaybackRate.d.ts","sourceRoot":"","sources":["../../../src/plugins/playback-rate/PlaybackRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAsB,IAAI,EAAE,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"PlaybackRate.d.ts","sourceRoot":"","sources":["../../../src/plugins/playback-rate/PlaybackRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAsB,IAAI,EAAE,MAAM,cAAc,CAAA;AAuC7E;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,aAAa,CAA+C;IAGpE,OAAO,CAAC,gBAAgB,CAAoB;IAE5C,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,YAAY,CAAgC;IAEpD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAuB;IAE7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAE7C,IAAI,EAAE,IAAI;IAQtB;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;;MAMlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,YAAY;IAepB;;OAEG;IACM,MAAM;IAgCf,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,oBAAoB;CAS7B"}
|
|
@@ -9,7 +9,7 @@ import arrowRightIcon from '../../../assets/icons/new/arrow-right.svg';
|
|
|
9
9
|
import arrowLeftIcon from '../../../assets/icons/new/arrow-left.svg';
|
|
10
10
|
import checkIcon from '../../../assets/icons/new/check.svg';
|
|
11
11
|
import { PlaybackEvents } from '../../playback/types.js';
|
|
12
|
-
import { MediaControlEvents } from '../media-control/MediaControl.js';
|
|
12
|
+
import { MediaControlEvents, } from '../media-control/MediaControl.js';
|
|
13
13
|
const DEFAULT_PLAYBACK_RATES = [
|
|
14
14
|
{ value: '0.5', label: '0.5x' },
|
|
15
15
|
{ value: '0.75', label: '0.75x' },
|
|
@@ -17,7 +17,7 @@ const DEFAULT_PLAYBACK_RATES = [
|
|
|
17
17
|
{ value: '1.25', label: '1.25x' },
|
|
18
18
|
{ value: '1.5', label: '1.5x' },
|
|
19
19
|
{ value: '1.75', label: '1.75x' },
|
|
20
|
-
{ value: '2.0', label: '2x' }
|
|
20
|
+
{ value: '2.0', label: '2x' },
|
|
21
21
|
];
|
|
22
22
|
const DEFAULT_PLAYBACK_RATE = '1.0';
|
|
23
23
|
const T = 'plugins.playback_rate';
|
|
@@ -33,6 +33,7 @@ const T = 'plugins.playback_rate';
|
|
|
33
33
|
* - {@link BottomGear | bottom_gear}
|
|
34
34
|
*
|
|
35
35
|
* It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
|
|
36
|
+
* Note that the playback rate change is supported only for VOD or DVR enabled live streams.
|
|
36
37
|
*/
|
|
37
38
|
export class PlaybackRate extends UICorePlugin {
|
|
38
39
|
playbackRates = DEFAULT_PLAYBACK_RATES;
|
|
@@ -56,16 +57,17 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
56
57
|
static listTemplate = template(listHtml);
|
|
57
58
|
constructor(core) {
|
|
58
59
|
super(core);
|
|
59
|
-
this.playbackRates =
|
|
60
|
-
|
|
60
|
+
this.playbackRates =
|
|
61
|
+
core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
|
|
62
|
+
this.selectedRate =
|
|
63
|
+
core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
|
|
61
64
|
}
|
|
62
65
|
/**
|
|
63
66
|
* @internal
|
|
64
67
|
*/
|
|
65
68
|
get attributes() {
|
|
66
69
|
return {
|
|
67
|
-
|
|
68
|
-
'data-playback-rate-select': ''
|
|
70
|
+
class: 'media-control-playbackrate',
|
|
69
71
|
};
|
|
70
72
|
}
|
|
71
73
|
/**
|
|
@@ -86,6 +88,7 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
86
88
|
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
|
|
87
89
|
}
|
|
88
90
|
onCoreReady() {
|
|
91
|
+
trace(`${T} onCoreReady`);
|
|
89
92
|
const mediaControl = this.core.getPlugin('media_control');
|
|
90
93
|
assert(mediaControl, 'media_control plugin is required');
|
|
91
94
|
const gear = this.core.getPlugin('bottom_gear');
|
|
@@ -93,6 +96,7 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
93
96
|
this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
|
|
94
97
|
}
|
|
95
98
|
onActiveContainerChange() {
|
|
99
|
+
trace(`${T} onActiveContainerChange`);
|
|
96
100
|
this.listenTo(this.core.activePlayback, Events.PLAYBACK_STOP, this.onStop);
|
|
97
101
|
this.listenTo(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onPlay);
|
|
98
102
|
this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
|
|
@@ -116,7 +120,7 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
116
120
|
allRateElements() {
|
|
117
121
|
return this.$('ul.gear-sub-menu li');
|
|
118
122
|
}
|
|
119
|
-
rateElement(rate =
|
|
123
|
+
rateElement(rate = '1') {
|
|
120
124
|
return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
|
|
121
125
|
}
|
|
122
126
|
onPlaybackRateChange(playbackRate) {
|
|
@@ -131,10 +135,11 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
131
135
|
}
|
|
132
136
|
}
|
|
133
137
|
shouldRender() {
|
|
134
|
-
if (!this.core.
|
|
138
|
+
if (!this.core.activePlayback) {
|
|
135
139
|
return false;
|
|
136
140
|
}
|
|
137
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
141
|
+
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
142
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
138
143
|
return false;
|
|
139
144
|
}
|
|
140
145
|
return 'setPlaybackRate' in this.core.activePlayback;
|
|
@@ -157,9 +162,12 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
157
162
|
title: this.getTitle(),
|
|
158
163
|
speedIcon,
|
|
159
164
|
arrowRightIcon,
|
|
165
|
+
i18n: this.core.i18n,
|
|
160
166
|
});
|
|
161
167
|
this.$el.html(button);
|
|
162
|
-
this.core.getPlugin('bottom_gear')
|
|
168
|
+
this.core.getPlugin('bottom_gear')
|
|
169
|
+
?.getElement('rate')
|
|
170
|
+
?.html(this.el);
|
|
163
171
|
this.rendered = true;
|
|
164
172
|
return this;
|
|
165
173
|
}
|
|
@@ -174,7 +182,8 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
174
182
|
}
|
|
175
183
|
}
|
|
176
184
|
onPlay() {
|
|
177
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
185
|
+
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
186
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
178
187
|
this.resetPlaybackRate();
|
|
179
188
|
}
|
|
180
189
|
else {
|
|
@@ -184,8 +193,7 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
184
193
|
resetPlaybackRate() {
|
|
185
194
|
this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
|
|
186
195
|
}
|
|
187
|
-
onStop() {
|
|
188
|
-
}
|
|
196
|
+
onStop() { }
|
|
189
197
|
onRateSelect(event) {
|
|
190
198
|
event.stopPropagation();
|
|
191
199
|
const rate = event.currentTarget.dataset.rate;
|
|
@@ -200,6 +208,7 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
200
208
|
playbackRates: this.playbackRates,
|
|
201
209
|
arrowLeftIcon,
|
|
202
210
|
checkIcon,
|
|
211
|
+
i18n: this.core.i18n,
|
|
203
212
|
}));
|
|
204
213
|
this.core.getPlugin('bottom_gear')?.setContent(this.el);
|
|
205
214
|
this.highlightCurrentRate();
|
|
@@ -215,7 +224,8 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
215
224
|
this.selectedRate = rate;
|
|
216
225
|
}
|
|
217
226
|
getTitle() {
|
|
218
|
-
return this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
227
|
+
return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
228
|
+
this.selectedRate);
|
|
219
229
|
}
|
|
220
230
|
highlightCurrentRate() {
|
|
221
231
|
this.allRateElements().removeClass('current');
|