@gcorevideo/player 2.22.14 → 2.22.16
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/clips/clips.ejs +1 -0
- package/assets/clips/clips.scss +23 -3
- package/assets/context-menu/context_menu.ejs +14 -6
- package/assets/context-menu/context_menu.scss +18 -4
- package/assets/level-selector/list.ejs +9 -3
- package/assets/media-control/media-control.ejs +1 -9
- package/assets/media-control/media-control.scss +0 -25
- package/assets/media-control/width370.scss +4 -4
- package/dist/core.js +5 -23
- package/dist/index.css +424 -412
- package/dist/index.js +294 -286
- package/dist/player.d.ts +211 -144
- package/dist/plugins/index.css +1513 -1501
- package/dist/plugins/index.js +224 -227
- package/docs/api/{player.audioselector.md → player.audiotracks.md} +3 -3
- package/docs/api/player.contextmenu.md +2 -0
- package/docs/api/player.contextmenupluginsettings.md +2 -40
- package/docs/api/{player.contextmenupluginsettings.label.md → player.contextmenupluginsettings.options.md} +3 -3
- package/docs/api/player.md +78 -23
- package/docs/api/player.mediacontrol.md +8 -14
- package/docs/api/player.mediacontrolelement.md +4 -2
- package/docs/api/{player.contextmenupluginsettings.preventshowcontextmenu.md → player.mediacontrollayerelement.md} +5 -3
- package/docs/api/player.mediacontrolleftelement.md +16 -0
- package/docs/api/player.mediacontrolrightelement.md +16 -0
- package/docs/api/player.mediacontrolsettings.md +23 -0
- package/docs/api/{player.contextmenupluginsettings.url.md → player.menuoption.md} +10 -3
- package/docs/api/player.playbackrate.md +1 -1
- package/docs/api/player.playerconfig.md +1 -1
- package/docs/api/player.playerconfig.playbacktype.md +1 -1
- package/docs/api/{player.levelselector.events.md → player.qualitylevels.events.md} +2 -2
- package/docs/api/{player.levelselector.md → player.qualitylevels.md} +6 -6
- package/docs/api/{player.levelselectorpluginsettings.labels.md → player.qualitylevelspluginsettings.labels.md} +2 -2
- package/docs/api/{player.levelselectorpluginsettings.md → player.qualitylevelspluginsettings.md} +6 -6
- package/docs/api/{player.levelselectorpluginsettings.restrictresolution.md → player.qualitylevelspluginsettings.restrictresolution.md} +2 -2
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +4 -1
- package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/playback/hls-playback/HlsPlayback.js +0 -21
- package/lib/plugins/click-to-pause/ClickToPause.js +1 -1
- package/lib/plugins/clips/Clips.d.ts +21 -16
- package/lib/plugins/clips/Clips.d.ts.map +1 -1
- package/lib/plugins/clips/Clips.js +96 -98
- package/lib/plugins/clips/types.d.ts +19 -0
- package/lib/plugins/clips/types.d.ts.map +1 -0
- package/lib/plugins/clips/types.js +1 -0
- package/lib/plugins/clips/utils.d.ts +4 -0
- package/lib/plugins/clips/utils.d.ts.map +1 -0
- package/lib/plugins/clips/utils.js +36 -0
- package/lib/plugins/context-menu/ContextMenu.d.ts +33 -12
- package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -1
- package/lib/plugins/context-menu/ContextMenu.js +40 -37
- package/lib/plugins/media-control/MediaControl.d.ts +4 -7
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +19 -31
- package/lib/plugins/utils.d.ts +9 -1
- package/lib/plugins/utils.d.ts.map +1 -1
- package/lib/plugins/utils.js +9 -10
- package/lib/plugins/vast-ads/loaderxml.js +2 -2
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +2 -5
- package/package.json +1 -1
- package/src/Player.ts +4 -3
- package/src/playback/hls-playback/HlsPlayback.ts +0 -22
- package/src/plugins/click-to-pause/ClickToPause.ts +1 -1
- package/src/plugins/clips/Clips.ts +116 -135
- package/src/plugins/clips/__tests__/Clips.test.ts +72 -0
- package/src/plugins/clips/__tests__/__snapshots__/Clips.test.ts.snap +14 -0
- package/src/plugins/clips/types.ts +22 -0
- package/src/plugins/clips/utils.ts +54 -0
- package/src/plugins/context-menu/ContextMenu.ts +72 -56
- package/src/plugins/level-selector/__tests__/__snapshots__/QualityLevels.test.ts.snap +18 -18
- package/src/plugins/media-control/MediaControl.ts +31 -58
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +66 -30
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +7 -35
- package/src/plugins/utils.ts +9 -7
- package/src/plugins/vast-ads/loaderxml.ts +2 -2
- package/src/testUtils.ts +2 -5
- package/temp/player.api.json +332 -262
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.mediacontrol.handlecustomarea.md +0 -52
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { Events, template, $, UIContainerPlugin
|
|
1
|
+
import { Events, template, $, UIContainerPlugin } from '@clappr/core';
|
|
2
2
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
3
3
|
import '../../../assets/context-menu/context_menu.scss';
|
|
4
4
|
import templateHtml from '../../../assets/context-menu/context_menu.ejs';
|
|
5
|
-
|
|
5
|
+
const T = 'plugins.context_menu';
|
|
6
6
|
/**
|
|
7
7
|
* `PLUGIN` that displays a small context menu when clicked on the player container.
|
|
8
8
|
* @beta
|
|
9
9
|
* @remarks
|
|
10
10
|
* Configuration options - {@link ContextMenuPluginSettings}
|
|
11
|
+
*
|
|
12
|
+
* Should not be used together with {@link ClickToPause} plugin
|
|
11
13
|
*/
|
|
12
14
|
export class ContextMenu extends UIContainerPlugin {
|
|
13
|
-
|
|
14
|
-
_url = '';
|
|
15
|
-
menuOptions = [];
|
|
15
|
+
open = false;
|
|
16
16
|
/**
|
|
17
17
|
* @internal
|
|
18
18
|
*/
|
|
@@ -32,34 +32,16 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
32
32
|
return { class: 'context-menu' };
|
|
33
33
|
}
|
|
34
34
|
static template = template(templateHtml);
|
|
35
|
-
get label() {
|
|
36
|
-
return this._label || 'Gcore player ver. ' + version().gplayer;
|
|
37
|
-
}
|
|
38
|
-
get url() {
|
|
39
|
-
return this._url || 'https://gcore.com/';
|
|
40
|
-
}
|
|
41
|
-
get exposeVersion() {
|
|
42
|
-
return {
|
|
43
|
-
label: this.label,
|
|
44
|
-
name: 'version',
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
35
|
/**
|
|
48
36
|
* @internal
|
|
49
37
|
*/
|
|
50
38
|
get events() {
|
|
51
39
|
return {
|
|
52
|
-
'click [
|
|
40
|
+
'click [role="menuitem"]': 'runAction',
|
|
53
41
|
};
|
|
54
42
|
}
|
|
55
43
|
constructor(container) {
|
|
56
44
|
super(container);
|
|
57
|
-
if (this.options.contextMenu && this.options.contextMenu.label) {
|
|
58
|
-
this._label = this.options.contextMenu.label;
|
|
59
|
-
}
|
|
60
|
-
if (this.options.contextMenu && this.options.contextMenu.url) {
|
|
61
|
-
this._url = this.options.contextMenu.url;
|
|
62
|
-
}
|
|
63
45
|
this.render();
|
|
64
46
|
$('body').on('click', this.hideOnBodyClick);
|
|
65
47
|
}
|
|
@@ -67,8 +49,8 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
67
49
|
* @internal
|
|
68
50
|
*/
|
|
69
51
|
bindEvents() {
|
|
70
|
-
this.listenTo(this.container, Events.CONTAINER_CONTEXTMENU, this.
|
|
71
|
-
this.listenTo(this.container, Events.CONTAINER_CLICK, this.
|
|
52
|
+
this.listenTo(this.container, Events.CONTAINER_CONTEXTMENU, this.onContextMenu);
|
|
53
|
+
this.listenTo(this.container, Events.CONTAINER_CLICK, this.onContainerClick);
|
|
72
54
|
}
|
|
73
55
|
/**
|
|
74
56
|
* @internal
|
|
@@ -77,34 +59,55 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
77
59
|
$('body').off('click', this.hideOnBodyClick);
|
|
78
60
|
return super.destroy();
|
|
79
61
|
}
|
|
80
|
-
|
|
62
|
+
onContainerClick() {
|
|
63
|
+
this.hide();
|
|
64
|
+
}
|
|
65
|
+
onContextMenu(event) {
|
|
66
|
+
if (!this.options.contextMenu?.options?.length) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
81
69
|
event.preventDefault();
|
|
70
|
+
event.stopPropagation();
|
|
82
71
|
const offset = this.container?.$el.offset();
|
|
83
72
|
this.show(event.pageY - offset.top, event.pageX - offset.left);
|
|
84
73
|
}
|
|
85
74
|
show(top, left) {
|
|
86
|
-
this.
|
|
87
|
-
if (this.options.contextMenu &&
|
|
88
|
-
this.options.contextMenu.preventShowContextMenu) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
75
|
+
this.open = true;
|
|
91
76
|
this.$el.css({ top, left });
|
|
92
77
|
this.$el.show();
|
|
93
78
|
}
|
|
94
79
|
hide() {
|
|
80
|
+
this.open = false;
|
|
95
81
|
this.$el.hide();
|
|
96
82
|
}
|
|
97
|
-
|
|
98
|
-
|
|
83
|
+
runAction(event) {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
event.stopPropagation();
|
|
86
|
+
const itemName = event.currentTarget.dataset.name;
|
|
87
|
+
if (!itemName) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const item = this.options.contextMenu?.options.find((option) => option.name === itemName);
|
|
91
|
+
if (item?.handler) {
|
|
92
|
+
item.handler();
|
|
93
|
+
}
|
|
94
|
+
this.hide();
|
|
99
95
|
}
|
|
100
96
|
/**
|
|
101
97
|
* @internal
|
|
102
98
|
*/
|
|
103
99
|
render() {
|
|
104
|
-
this.
|
|
105
|
-
|
|
100
|
+
if (!this.options.contextMenu?.options?.length) {
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
const options = this.options.contextMenu.options;
|
|
104
|
+
this.$el.html(ContextMenu.template({
|
|
105
|
+
options,
|
|
106
|
+
i18n: this.container.i18n,
|
|
107
|
+
iconic: options.some((option) => option.icon),
|
|
108
|
+
}));
|
|
106
109
|
this.container.$el.append(this.$el); // TODO append to the container, turn into a container plugin
|
|
107
|
-
this.hide();
|
|
110
|
+
this.$el.hide();
|
|
108
111
|
return this;
|
|
109
112
|
}
|
|
110
113
|
hideOnBodyClick = () => {
|
|
@@ -5,7 +5,7 @@ import '../../../assets/media-control/media-control.scss';
|
|
|
5
5
|
* Media control elements that appear in the left area.
|
|
6
6
|
* @beta
|
|
7
7
|
*/
|
|
8
|
-
export type MediaControlLeftElement = 'clipText' | 'duration' | 'dvr' | 'playpause' | 'playstop' | 'position' | 'volume';
|
|
8
|
+
export type MediaControlLeftElement = 'clipText' | 'duration' | 'dvr' | 'playpause' | 'playstop' | 'position' | 'volume' | 'clips';
|
|
9
9
|
/**
|
|
10
10
|
* Media control elements that appear in main layer, spanning the entire width of the player.
|
|
11
11
|
* @beta
|
|
@@ -74,8 +74,6 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
74
74
|
private userDisabled;
|
|
75
75
|
private userKeepVisible;
|
|
76
76
|
private verticalVolume;
|
|
77
|
-
private $clipText;
|
|
78
|
-
private $clipTextContainer;
|
|
79
77
|
private $duration;
|
|
80
78
|
private $fullscreenToggle;
|
|
81
79
|
private $multiCameraSelector;
|
|
@@ -241,15 +239,14 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
241
239
|
* ```ts
|
|
242
240
|
* class MyPlugin extends UICorePlugin {
|
|
243
241
|
* override render() {
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
* clipText?.el.text('Here we go')
|
|
242
|
+
* this.$el.html('<div data-clips>Here we go</div>')
|
|
243
|
+
* this.core.getPlugin('media_control').mount('clips', this.$el)
|
|
247
244
|
* return this
|
|
248
245
|
* }
|
|
249
246
|
* }
|
|
250
247
|
* ```
|
|
251
248
|
*/
|
|
252
|
-
|
|
249
|
+
mount(name: MediaControlElement, element: ZeptoResult): void;
|
|
253
250
|
putElement(name: MediaControlElement, element: ZeptoResult): void;
|
|
254
251
|
/**
|
|
255
252
|
* Toggle the visibility of a media control element
|
|
@@ -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;AAI5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,UAAU,GACV,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,9 +22,7 @@ import fullscreenOffIcon from '../../../assets/icons/new/fullscreen-off.svg';
|
|
|
22
22
|
import fullscreenOnIcon from '../../../assets/icons/new/fullscreen-on.svg';
|
|
23
23
|
const DEFAULT_SETTINGS = {
|
|
24
24
|
default: [],
|
|
25
|
-
left: [
|
|
26
|
-
'dvr'
|
|
27
|
-
],
|
|
25
|
+
left: ['dvr'],
|
|
28
26
|
right: [
|
|
29
27
|
'audiotracks',
|
|
30
28
|
'cc',
|
|
@@ -103,8 +101,6 @@ export class MediaControl extends UICorePlugin {
|
|
|
103
101
|
userDisabled = false;
|
|
104
102
|
userKeepVisible = false;
|
|
105
103
|
verticalVolume = false;
|
|
106
|
-
$clipText = null;
|
|
107
|
-
$clipTextContainer = null;
|
|
108
104
|
$duration = null;
|
|
109
105
|
$fullscreenToggle = null;
|
|
110
106
|
$multiCameraSelector = null;
|
|
@@ -296,7 +292,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
296
292
|
this.userDisabled = true; // TODO distinguish between user and system (e.g., unplayable) disabled?
|
|
297
293
|
this.hide();
|
|
298
294
|
this.unbindKeyEvents();
|
|
299
|
-
this.$el.hide();
|
|
295
|
+
this.$el.hide(); // TODO why?
|
|
300
296
|
}
|
|
301
297
|
/**
|
|
302
298
|
* Reenables the plugin disabled earlier with the {@link MediaControl.disable} method
|
|
@@ -755,16 +751,16 @@ export class MediaControl extends UICorePlugin {
|
|
|
755
751
|
right: [],
|
|
756
752
|
}, this.core.activeContainer.settings);
|
|
757
753
|
trace(`${T} updateSettings`, { newSettings });
|
|
754
|
+
newSettings.left.push('clips'); // TODO
|
|
758
755
|
// TODO make order controlled via CSS
|
|
759
|
-
newSettings.left = orderByOrderPattern([...newSettings.left, '
|
|
756
|
+
newSettings.left = orderByOrderPattern([...newSettings.left, 'volume', 'clips'], LEFT_ORDER);
|
|
760
757
|
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
761
758
|
this.core.activePlayback.dvrEnabled) {
|
|
762
759
|
newSettings.left.push('dvr');
|
|
763
760
|
}
|
|
764
761
|
// actual order of the items appear rendered is controlled by CSS
|
|
765
762
|
newSettings.right = DEFAULT_SETTINGS.right; // TODO get from the options
|
|
766
|
-
if ((!this.fullScreenOnVideoTagSupported &&
|
|
767
|
-
!fullscreenEnabled()) ||
|
|
763
|
+
if ((!this.fullScreenOnVideoTagSupported && !fullscreenEnabled()) ||
|
|
768
764
|
this.options.fullscreenDisable) {
|
|
769
765
|
trace(`${T} updateSettings removing fullscreen`, {
|
|
770
766
|
supported: this.fullScreenOnVideoTagSupported,
|
|
@@ -811,8 +807,6 @@ export class MediaControl extends UICorePlugin {
|
|
|
811
807
|
this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
|
|
812
808
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
813
809
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
814
|
-
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
|
|
815
|
-
this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
|
|
816
810
|
this.resetIndicators();
|
|
817
811
|
this.initializeIcons();
|
|
818
812
|
}
|
|
@@ -827,25 +821,14 @@ export class MediaControl extends UICorePlugin {
|
|
|
827
821
|
* ```ts
|
|
828
822
|
* class MyPlugin extends UICorePlugin {
|
|
829
823
|
* override render() {
|
|
830
|
-
*
|
|
831
|
-
*
|
|
832
|
-
* clipText?.el.text('Here we go')
|
|
824
|
+
* this.$el.html('<div data-clips>Here we go</div>')
|
|
825
|
+
* this.core.getPlugin('media_control').mount('clips', this.$el)
|
|
833
826
|
* return this
|
|
834
827
|
* }
|
|
835
828
|
* }
|
|
836
829
|
* ```
|
|
837
830
|
*/
|
|
838
|
-
|
|
839
|
-
switch (name) {
|
|
840
|
-
case 'audiotracks':
|
|
841
|
-
return null;
|
|
842
|
-
case 'clipText':
|
|
843
|
-
return this.$clipText;
|
|
844
|
-
case 'seekBarContainer':
|
|
845
|
-
return this.$seekBarContainer;
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
putElement(name, element) {
|
|
831
|
+
mount(name, element) {
|
|
849
832
|
const panel = this.getElementLocation(name);
|
|
850
833
|
trace(`${T} putElement`, { name, panel: !!panel });
|
|
851
834
|
if (panel) {
|
|
@@ -864,6 +847,9 @@ export class MediaControl extends UICorePlugin {
|
|
|
864
847
|
return;
|
|
865
848
|
}
|
|
866
849
|
}
|
|
850
|
+
putElement(name, element) {
|
|
851
|
+
this.mount(name, element);
|
|
852
|
+
}
|
|
867
853
|
/**
|
|
868
854
|
* Toggle the visibility of a media control element
|
|
869
855
|
* @param name - The name of the media control element
|
|
@@ -913,11 +899,11 @@ export class MediaControl extends UICorePlugin {
|
|
|
913
899
|
if (!this.settings.seekEnabled) {
|
|
914
900
|
return;
|
|
915
901
|
}
|
|
916
|
-
const currentTime = this.
|
|
917
|
-
const duration = this.
|
|
902
|
+
const currentTime = this.core.activeContainer.getCurrentTime();
|
|
903
|
+
const duration = this.core.activeContainer.getDuration();
|
|
918
904
|
let position = Math.min(Math.max(currentTime + delta, 0), duration);
|
|
919
905
|
position = Math.min((position * 100) / duration, 100);
|
|
920
|
-
this.
|
|
906
|
+
this.core.activeContainer.seekPercentage(position);
|
|
921
907
|
}
|
|
922
908
|
bindKeyAndShow(key, callback) {
|
|
923
909
|
// TODO or boolean return type
|
|
@@ -1035,7 +1021,10 @@ export class MediaControl extends UICorePlugin {
|
|
|
1035
1021
|
* @internal
|
|
1036
1022
|
*/
|
|
1037
1023
|
render() {
|
|
1038
|
-
trace(`${T} render`, {
|
|
1024
|
+
trace(`${T} render`, {
|
|
1025
|
+
needsUpdate: this.hasUpdate,
|
|
1026
|
+
metadataLoaded: this.metadataLoaded,
|
|
1027
|
+
});
|
|
1039
1028
|
if (!this.hasUpdate || !this.metadataLoaded) {
|
|
1040
1029
|
return this;
|
|
1041
1030
|
}
|
|
@@ -1191,8 +1180,7 @@ MediaControl.extend = function (properties) {
|
|
|
1191
1180
|
return extend(MediaControl, properties);
|
|
1192
1181
|
};
|
|
1193
1182
|
function serializeSettings(s) {
|
|
1194
|
-
return s.left
|
|
1195
|
-
.slice()
|
|
1183
|
+
return s.left.slice()
|
|
1196
1184
|
.sort()
|
|
1197
1185
|
.concat(s.right.slice().sort())
|
|
1198
1186
|
.concat(s.default.slice().sort())
|
package/lib/plugins/utils.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
export declare function getLocation(href: string): HTMLAnchorElement;
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Parse a time string in the format "hh:mm:ss" or "mm:ss" or "ss" to seconds.
|
|
4
|
+
* @param str - The time string to parse.
|
|
5
|
+
* @returns The time in seconds.
|
|
6
|
+
* @example "01:01:00" -> 3660
|
|
7
|
+
* @example "01:00" -> 60
|
|
8
|
+
* @example "33" -> 33
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseClipTime(str: string): number;
|
|
3
11
|
export declare function getPageX(event: MouseEvent | TouchEvent): number;
|
|
4
12
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/plugins/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,qBAMvC;AAED,wBAAgB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/plugins/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,qBAMvC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBjD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAU/D"}
|
package/lib/plugins/utils.js
CHANGED
|
@@ -3,7 +3,15 @@ export function getLocation(href) {
|
|
|
3
3
|
l.href = href;
|
|
4
4
|
return l;
|
|
5
5
|
}
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Parse a time string in the format "hh:mm:ss" or "mm:ss" or "ss" to seconds.
|
|
8
|
+
* @param str - The time string to parse.
|
|
9
|
+
* @returns The time in seconds.
|
|
10
|
+
* @example "01:01:00" -> 3660
|
|
11
|
+
* @example "01:00" -> 60
|
|
12
|
+
* @example "33" -> 33
|
|
13
|
+
*/
|
|
14
|
+
export function parseClipTime(str) {
|
|
7
15
|
if (!str) {
|
|
8
16
|
return 0;
|
|
9
17
|
}
|
|
@@ -12,21 +20,12 @@ export function strtimeToMiliseconds(str) {
|
|
|
12
20
|
if (arr.length >= 3) {
|
|
13
21
|
h = parseInt(arr[arr.length - 3]) * 60 * 60;
|
|
14
22
|
}
|
|
15
|
-
else {
|
|
16
|
-
h = 0;
|
|
17
|
-
}
|
|
18
23
|
if (arr.length >= 2) {
|
|
19
24
|
m = parseInt(arr[arr.length - 2]) * 60;
|
|
20
25
|
}
|
|
21
|
-
else {
|
|
22
|
-
m = 0;
|
|
23
|
-
}
|
|
24
26
|
if (arr.length >= 1) {
|
|
25
27
|
s = parseInt(arr[arr.length - 1]);
|
|
26
28
|
}
|
|
27
|
-
else {
|
|
28
|
-
s = 0;
|
|
29
|
-
}
|
|
30
29
|
return (h + m + s);
|
|
31
30
|
}
|
|
32
31
|
export function getPageX(event) {
|
|
@@ -2,7 +2,7 @@ import { reportError } from '@gcorevideo/utils';
|
|
|
2
2
|
import assert from 'assert';
|
|
3
3
|
import URLHandler from './urlhandler.js';
|
|
4
4
|
import MergeVast from './xmlmerge.js';
|
|
5
|
-
import {
|
|
5
|
+
import { parseClipTime } from '../utils.js';
|
|
6
6
|
export default class LoaderXML {
|
|
7
7
|
url;
|
|
8
8
|
config = '';
|
|
@@ -91,7 +91,7 @@ export default class LoaderXML {
|
|
|
91
91
|
this.removeTag('Tracking', 'event="progress"');
|
|
92
92
|
}
|
|
93
93
|
if (linearSkipOffset && linearSkipOffset.length > 1) {
|
|
94
|
-
timeOffset =
|
|
94
|
+
timeOffset = parseClipTime(linearSkipOffset[1]);
|
|
95
95
|
this.config = this.config.replace(/<Linear skipoffset="(\d+:\d+:\d+)".*?>/g, '<Linear>');
|
|
96
96
|
}
|
|
97
97
|
return { skipEvents, progressEvents, timeOffset };
|
package/lib/testUtils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,MAAM,MAAM,eAAe,CAAA;AAElC;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,MAAM;IAErC,SAAS,CAAC,OAAO,EAAE,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,GAAG;IAClB,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG;gBAFjB,OAAO,EAAE,GAAG,EACb,IAAI,EAAE,GAAG,EACR,WAAW,CAAC,EAAE,GAAG,YAAA;IAK7B,IAAI,IAAI,WAEP;IAED,OAAO;IAEP,IAAI;IAEJ,KAAK;IAEL,IAAI;IAEJ,OAAO;IAEP,IAAI;IAEJ,cAAc;IAEd,WAAW;IAIX,QAAQ;IAER,OAAO;IAEP,eAAe;IAIf,kBAAkB;IAIlB,cAAc;IAId,qBAAqB;IAIrB,IAAI;IAEJ,MAAM;IAEN,MAAM;IAEN,SAAS;IAET,eAAe;IAIf,WAAW;IAIX,QAAQ;IAIR,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGtC;AAED,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAA2B;;;;;;;;;;;;;;;;EAqBvC;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC/C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,GAA0B;;;;;;;;;;;;;;EAkBvE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,MAAM,MAAM,eAAe,CAAA;AAElC;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,MAAM;IAErC,SAAS,CAAC,OAAO,EAAE,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,GAAG;IAClB,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG;gBAFjB,OAAO,EAAE,GAAG,EACb,IAAI,EAAE,GAAG,EACR,WAAW,CAAC,EAAE,GAAG,YAAA;IAK7B,IAAI,IAAI,WAEP;IAED,OAAO;IAEP,IAAI;IAEJ,KAAK;IAEL,IAAI;IAEJ,OAAO;IAEP,IAAI;IAEJ,cAAc;IAEd,WAAW;IAIX,QAAQ;IAER,OAAO;IAEP,eAAe;IAIf,kBAAkB;IAIlB,cAAc;IAId,qBAAqB;IAIrB,IAAI;IAEJ,MAAM;IAEN,MAAM;IAEN,SAAS;IAET,eAAe;IAIf,WAAW;IAIX,QAAQ;IAIR,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGtC;AAED,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAA2B;;;;;;;;;;;;;;;;EAqBvC;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC/C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,GAA0B;;;;;;;;;;;;;;EAkBvE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAc/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAY7C"}
|
package/lib/testUtils.js
CHANGED
|
@@ -152,14 +152,11 @@ export function createMockMediaControl(core) {
|
|
|
152
152
|
mediaControl.$el.html(`<div class="media-control-left-panel" data-media-control></div>
|
|
153
153
|
<div class="media-control-right-panel" data-media-control></div>
|
|
154
154
|
<div class="media-control-center-panel" data-media-control></div>`);
|
|
155
|
-
const elements = {
|
|
156
|
-
gear: $(document.createElement('div')),
|
|
157
|
-
};
|
|
158
|
-
// @ts-ignore
|
|
159
|
-
mediaControl.getElement = vi.fn().mockImplementation((name) => elements[name]);
|
|
160
155
|
// @ts-ignore
|
|
161
156
|
mediaControl.putElement = vi.fn();
|
|
162
157
|
// @ts-ignore
|
|
158
|
+
mediaControl.mount = vi.fn();
|
|
159
|
+
// @ts-ignore
|
|
163
160
|
mediaControl.toggleElement = vi.fn();
|
|
164
161
|
return mediaControl;
|
|
165
162
|
}
|
package/package.json
CHANGED
package/src/Player.ts
CHANGED
|
@@ -159,6 +159,9 @@ export class Player {
|
|
|
159
159
|
* ```
|
|
160
160
|
*/
|
|
161
161
|
attachTo(playerElement: HTMLElement): void {
|
|
162
|
+
trace(`${T} attachTo`, {
|
|
163
|
+
player: !!this.player,
|
|
164
|
+
})
|
|
162
165
|
assert.ok(!this.player, 'Player already initialized')
|
|
163
166
|
assert.ok(playerElement, 'Player container element is required')
|
|
164
167
|
if (this.config.debug === 'all' || this.config.debug === 'clappr') {
|
|
@@ -398,11 +401,9 @@ export class Player {
|
|
|
398
401
|
trace(`${T} initPlayer`, {
|
|
399
402
|
autoPlay: coreOptions.autoPlay,
|
|
400
403
|
sources: coreOptions.sources,
|
|
404
|
+
player: !!this.player,
|
|
401
405
|
// TODO selected options
|
|
402
406
|
})
|
|
403
|
-
|
|
404
|
-
assert.ok(!this.player, 'Player already initialized')
|
|
405
|
-
|
|
406
407
|
const player = new PlayerClappr(coreOptions)
|
|
407
408
|
this.player = player
|
|
408
409
|
this.bindCoreListeners()
|
|
@@ -586,17 +586,6 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
586
586
|
}
|
|
587
587
|
|
|
588
588
|
seek(time: number) {
|
|
589
|
-
// trace(`${T} seek`, {
|
|
590
|
-
// time,
|
|
591
|
-
// duration: this._duration,
|
|
592
|
-
// startTime: this._startTime,
|
|
593
|
-
// currentTimestamp: this.currentTimestamp,
|
|
594
|
-
// playbackType: this.getPlaybackType(),
|
|
595
|
-
// dvrEnabled: this.dvrEnabled,
|
|
596
|
-
// durationExcludesAfterLiveSyncPoint: this._durationExcludesAfterLiveSyncPoint,
|
|
597
|
-
// minDvrSize: this._minDvrSize,
|
|
598
|
-
|
|
599
|
-
// })
|
|
600
589
|
if (time < 0) {
|
|
601
590
|
Log.warn(
|
|
602
591
|
'Attempt to seek to a negative time. Resetting to live point. Use seekToLivePoint() to seek to the live point.',
|
|
@@ -768,11 +757,6 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
768
757
|
return
|
|
769
758
|
}
|
|
770
759
|
this._lastTimeUpdate = update
|
|
771
|
-
// trace(`${T} _onTimeUpdate`, {
|
|
772
|
-
// current: update.current,
|
|
773
|
-
// total: update.total,
|
|
774
|
-
// firstFragDateTime: update.firstFragDateTime,
|
|
775
|
-
// })
|
|
776
760
|
this.trigger(Events.PLAYBACK_TIMEUPDATE, update, this.name)
|
|
777
761
|
}
|
|
778
762
|
|
|
@@ -1097,12 +1081,6 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
1097
1081
|
}
|
|
1098
1082
|
|
|
1099
1083
|
get dvrEnabled() {
|
|
1100
|
-
// trace(`${T} dvrEnabled`, {
|
|
1101
|
-
// durationExcludesAfterLiveSyncPoint: this._durationExcludesAfterLiveSyncPoint,
|
|
1102
|
-
// duration: this._duration,
|
|
1103
|
-
// minDvrSize: this._minDvrSize,
|
|
1104
|
-
// playbackType: this.getPlaybackType(),
|
|
1105
|
-
// })
|
|
1106
1084
|
// enabled when:
|
|
1107
1085
|
// - the duration does not include content after hlsjs's live sync point
|
|
1108
1086
|
// - the playable region duration is longer than the configured duration to enable dvr after
|
|
@@ -10,7 +10,7 @@ import { CLAPPR_VERSION } from '../../build.js'
|
|
|
10
10
|
|
|
11
11
|
type Timer = ReturnType<typeof setTimeout>
|
|
12
12
|
|
|
13
|
-
const T = 'plugins.
|
|
13
|
+
const T = 'plugins.click_to_pause'
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* A small `PLUGIN` that toggles the playback state on click over the video container
|