@gcorevideo/player 2.20.1 → 2.20.3
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/dist/core.js +1 -1
- package/dist/index.css +1328 -1328
- package/dist/index.js +305 -217
- package/dist/player.d.ts +270 -52
- package/dist/plugins/index.css +612 -612
- package/dist/plugins/index.js +1459 -1347
- package/docs/api/player.audioselector.md +1 -251
- package/docs/api/player.bigmutebutton.md +1 -156
- package/docs/api/player.clapprstats.exportmetrics.md +4 -0
- package/docs/api/player.clapprstats.md +7 -223
- package/docs/api/player.clapprstats.setupdatemetrics.md +2 -0
- package/docs/api/player.clicktopause.md +5 -113
- package/docs/api/player.clipsplugin.gettext.md +9 -0
- package/docs/api/player.clipsplugin.md +10 -94
- package/docs/api/player.clipspluginsettings.md +57 -0
- package/docs/api/player.clipspluginsettings.text.md +13 -0
- package/docs/api/player.contextmenu._constructor_.md +6 -3
- package/docs/api/player.contextmenu.md +13 -256
- package/docs/api/player.contextmenupluginsettings.label.md +11 -0
- package/docs/api/player.contextmenupluginsettings.md +93 -0
- package/docs/api/player.contextmenupluginsettings.preventshowcontextmenu.md +11 -0
- package/docs/api/player.contextmenupluginsettings.url.md +11 -0
- package/docs/api/player.dvrcontrols.md +1 -1
- package/docs/api/player.errorscreen.md +0 -2
- package/docs/api/player.favicon._constructor_.md +3 -0
- package/docs/api/player.favicon.bindevents.md +3 -0
- package/docs/api/player.favicon.configure.md +3 -0
- package/docs/api/player.favicon.destroy.md +3 -0
- package/docs/api/player.favicon.disable.md +3 -0
- package/docs/api/player.favicon.md +18 -1
- package/docs/api/player.favicon.name.md +3 -0
- package/docs/api/player.favicon.supportedversion.md +3 -0
- package/docs/api/player.gearevents.md +4 -1
- package/docs/api/player.googleanalytics._constructor_.md +3 -0
- package/docs/api/player.googleanalytics.addeventlisteners.md +3 -0
- package/docs/api/player.googleanalytics.embedscript.md +3 -0
- package/docs/api/player.googleanalytics.md +42 -1
- package/docs/api/player.googleanalytics.name.md +3 -0
- package/docs/api/player.googleanalytics.onbufferfull.md +3 -0
- package/docs/api/player.googleanalytics.onbuffering.md +3 -0
- package/docs/api/player.googleanalytics.ondvr.md +3 -0
- package/docs/api/player.googleanalytics.onended.md +3 -0
- package/docs/api/player.googleanalytics.onerror.md +3 -0
- package/docs/api/player.googleanalytics.onfullscreen.md +3 -0
- package/docs/api/player.googleanalytics.onhd.md +3 -0
- package/docs/api/player.googleanalytics.onpause.md +3 -0
- package/docs/api/player.googleanalytics.onplay.md +3 -0
- package/docs/api/player.googleanalytics.onready.md +3 -0
- package/docs/api/player.googleanalytics.onseek.md +3 -0
- package/docs/api/player.googleanalytics.onstop.md +3 -0
- package/docs/api/player.googleanalytics.onvolumechanged.md +3 -0
- package/docs/api/player.googleanalytics.push.md +3 -0
- package/docs/api/player.googleanalytics.supportedversion.md +3 -0
- package/docs/api/player.initeventdata.event.md +3 -0
- package/docs/api/player.initeventdata.md +7 -0
- package/docs/api/player.logo._constructor_.md +3 -0
- package/docs/api/player.logo.attributes.md +3 -0
- package/docs/api/player.logo.bindevents.md +3 -0
- package/docs/api/player.logo.md +20 -1
- package/docs/api/player.logo.name.md +3 -0
- package/docs/api/player.logo.render.md +3 -0
- package/docs/api/player.logo.stoplistening.md +3 -0
- package/docs/api/player.logo.supportedversion.md +3 -0
- package/docs/api/player.logo.template.md +3 -0
- package/docs/api/player.md +68 -20
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/docs/api/player.multicamera.md +2 -0
- package/docs/api/player.seektime.attributes.md +3 -0
- package/docs/api/player.seektime.bindevents.md +3 -0
- package/docs/api/player.seektime.durationshown.md +3 -0
- package/docs/api/player.seektime.getseektime.md +3 -0
- package/docs/api/player.seektime.islivestreamwithdvr.md +3 -0
- package/docs/api/player.seektime.md +31 -0
- package/docs/api/player.seektime.mediacontrol.md +3 -0
- package/docs/api/player.seektime.mediacontrolcontainer.md +3 -0
- package/docs/api/player.seektime.name.md +3 -0
- package/docs/api/player.seektime.render.md +3 -0
- package/docs/api/player.seektime.shouldbevisible.md +3 -0
- package/docs/api/player.seektime.supportedversion.md +3 -0
- package/docs/api/player.seektime.template.md +3 -0
- package/docs/api/player.seektime.update.md +3 -0
- package/docs/api/player.share.md +2 -0
- package/docs/api/player.skiptime.md +2 -0
- package/docs/api/player.stalleventdata.count.md +3 -0
- package/docs/api/player.stalleventdata.event.md +3 -0
- package/docs/api/player.stalleventdata.md +8 -3
- package/docs/api/player.stalleventdata.time.md +3 -0
- package/docs/api/player.stalleventdata.total_ms.md +3 -0
- package/docs/api/player.starteventdata.event.md +3 -0
- package/docs/api/player.starteventdata.md +7 -0
- package/docs/api/player.telemetryevent.md +11 -0
- package/docs/api/player.telemetryeventdata.md +3 -0
- package/docs/api/player.telemetrypluginsettings.md +4 -1
- package/docs/api/player.telemetrypluginsettings.send.md +3 -0
- package/docs/api/player.telemetryrecord.md +3 -0
- package/docs/api/player.thumbnails.md +21 -139
- package/docs/api/player.thumbnailspluginsettings.md +23 -0
- package/docs/api/player.volumefade.md +1 -0
- package/docs/api/player.watcheventdata.event.md +3 -0
- package/docs/api/player.watcheventdata.md +7 -0
- package/lib/index.plugins.d.ts +0 -1
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +0 -1
- package/lib/plugins/audio-selector/AudioSelector.d.ts +28 -6
- package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.js +52 -22
- package/lib/plugins/big-mute-button/BigMuteButton.d.ts +18 -2
- package/lib/plugins/big-mute-button/BigMuteButton.d.ts.map +1 -1
- package/lib/plugins/big-mute-button/BigMuteButton.js +21 -16
- package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -0
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +1 -0
- package/lib/plugins/clappr-stats/ClapprStats.d.ts +31 -8
- package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
- package/lib/plugins/clappr-stats/ClapprStats.js +24 -0
- package/lib/plugins/clappr-stats/types.d.ts +12 -0
- package/lib/plugins/clappr-stats/types.d.ts.map +1 -1
- package/lib/plugins/clappr-stats/types.js +3 -0
- package/lib/plugins/click-to-pause/ClickToPause.d.ts +13 -1
- package/lib/plugins/click-to-pause/ClickToPause.d.ts.map +1 -1
- package/lib/plugins/click-to-pause/ClickToPause.js +14 -4
- package/lib/plugins/clips/Clips.d.ts +34 -2
- package/lib/plugins/clips/Clips.d.ts.map +1 -1
- package/lib/plugins/clips/Clips.js +51 -22
- package/lib/plugins/context-menu/ContextMenu.d.ts +40 -13
- package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -1
- package/lib/plugins/context-menu/ContextMenu.js +48 -36
- package/lib/plugins/dvr-controls/DvrControls.d.ts +1 -3
- package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
- package/lib/plugins/dvr-controls/DvrControls.js +11 -28
- package/lib/plugins/error-screen/ErrorScreen.d.ts +0 -1
- package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -1
- package/lib/plugins/error-screen/ErrorScreen.js +0 -1
- package/lib/plugins/favicon/Favicon.d.ts +4 -0
- package/lib/plugins/favicon/Favicon.d.ts.map +1 -1
- package/lib/plugins/favicon/Favicon.js +4 -0
- package/lib/plugins/google-analytics/GoogleAnalytics.d.ts +4 -0
- package/lib/plugins/google-analytics/GoogleAnalytics.d.ts.map +1 -1
- package/lib/plugins/google-analytics/GoogleAnalytics.js +5 -1
- package/lib/plugins/index.d.ts +0 -1
- package/lib/plugins/index.d.ts.map +1 -1
- package/lib/plugins/index.js +0 -1
- package/lib/plugins/logo/Logo.d.ts +4 -0
- package/lib/plugins/logo/Logo.d.ts.map +1 -1
- package/lib/plugins/logo/Logo.js +4 -0
- package/lib/plugins/media-control/MediaControl.d.ts +1 -1
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +3 -1
- package/lib/plugins/multi-camera/MultiCamera.d.ts +3 -0
- package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -1
- package/lib/plugins/multi-camera/MultiCamera.js +3 -0
- package/lib/plugins/seek-time/SeekTime.d.ts +4 -0
- package/lib/plugins/seek-time/SeekTime.d.ts.map +1 -1
- package/lib/plugins/seek-time/SeekTime.js +5 -1
- package/lib/plugins/share/Share.d.ts +3 -0
- package/lib/plugins/share/Share.d.ts.map +1 -1
- package/lib/plugins/share/Share.js +3 -0
- package/lib/plugins/skip-time/SkipTime.d.ts +3 -0
- package/lib/plugins/skip-time/SkipTime.d.ts.map +1 -1
- package/lib/plugins/skip-time/SkipTime.js +3 -0
- package/lib/plugins/telemetry/Telemetry.d.ts +18 -0
- package/lib/plugins/telemetry/Telemetry.d.ts.map +1 -1
- package/lib/plugins/telemetry/Telemetry.js +1 -0
- package/lib/plugins/thumbnails/Thumbnails.d.ts +48 -3
- package/lib/plugins/thumbnails/Thumbnails.d.ts.map +1 -1
- package/lib/plugins/thumbnails/Thumbnails.js +52 -18
- package/lib/plugins/volume-fade/VolumeFade.d.ts +1 -0
- package/lib/plugins/volume-fade/VolumeFade.d.ts.map +1 -1
- package/lib/plugins/volume-fade/VolumeFade.js +1 -0
- package/package.json +1 -1
- package/src/index.plugins.ts +0 -1
- package/src/plugins/audio-selector/AudioSelector.ts +227 -154
- package/src/plugins/big-mute-button/BigMuteButton.ts +100 -79
- package/src/plugins/bottom-gear/BottomGear.ts +1 -0
- package/src/plugins/clappr-stats/ClapprStats.ts +32 -8
- package/src/plugins/clappr-stats/types.ts +13 -0
- package/src/plugins/click-to-pause/ClickToPause.ts +47 -36
- package/src/plugins/clips/Clips.ts +127 -71
- package/src/plugins/context-menu/ContextMenu.ts +105 -76
- package/src/plugins/dvr-controls/DvrControls.ts +11 -30
- package/src/plugins/error-screen/ErrorScreen.ts +0 -1
- package/src/plugins/favicon/Favicon.ts +4 -0
- package/src/plugins/google-analytics/GoogleAnalytics.ts +5 -1
- package/src/plugins/index.ts +0 -1
- package/src/plugins/logo/Logo.ts +4 -0
- package/src/plugins/media-control/MediaControl.ts +4 -1
- package/src/plugins/multi-camera/MultiCamera.ts +3 -0
- package/src/plugins/seek-time/SeekTime.ts +5 -1
- package/src/plugins/share/Share.ts +3 -0
- package/src/plugins/skip-time/SkipTime.ts +3 -0
- package/src/plugins/telemetry/Telemetry.ts +18 -0
- package/src/plugins/thumbnails/Thumbnails.ts +268 -194
- package/src/plugins/volume-fade/VolumeFade.ts +1 -0
- package/temp/player.api.json +622 -2463
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.audioselector.attributes.md +0 -17
- package/docs/api/player.audioselector.bindevents.md +0 -18
- package/docs/api/player.audioselector.events.md +0 -17
- package/docs/api/player.audioselector.hideselecttrackmenu.md +0 -18
- package/docs/api/player.audioselector.name.md +0 -14
- package/docs/api/player.audioselector.onshowlevelselectmenu.md +0 -18
- package/docs/api/player.audioselector.reload.md +0 -18
- package/docs/api/player.audioselector.render.md +0 -18
- package/docs/api/player.audioselector.supportedversion.md +0 -16
- package/docs/api/player.audioselector.template.md +0 -14
- package/docs/api/player.audioselector.togglecontextmenu.md +0 -18
- package/docs/api/player.audioselector.unbindevents.md +0 -18
- package/docs/api/player.audioselector.version.md +0 -14
- package/docs/api/player.bigmutebutton.bindevents.md +0 -18
- package/docs/api/player.bigmutebutton.events.md +0 -17
- package/docs/api/player.bigmutebutton.name.md +0 -14
- package/docs/api/player.bigmutebutton.render.md +0 -18
- package/docs/api/player.bigmutebutton.supportedversion.md +0 -16
- package/docs/api/player.bigmutebutton.template.md +0 -14
- package/docs/api/player.clapprstats._buildreport.md +0 -18
- package/docs/api/player.clapprstats._defaultreport.md +0 -52
- package/docs/api/player.clapprstats._playbackname.md +0 -14
- package/docs/api/player.clapprstats._playbacktype.md +0 -14
- package/docs/api/player.clapprstats.bindevents.md +0 -18
- package/docs/api/player.clapprstats.destroy.md +0 -18
- package/docs/api/player.clapprstats.name.md +0 -14
- package/docs/api/player.clapprstats.onfirstplaying.md +0 -18
- package/docs/api/player.clapprstats.playafterpause.md +0 -18
- package/docs/api/player.clapprstats.starttimers.md +0 -18
- package/docs/api/player.clapprstats.stopreporting.md +0 -18
- package/docs/api/player.clapprstats.supportedversion.md +0 -16
- package/docs/api/player.clicktopause.bindevents.md +0 -15
- package/docs/api/player.clicktopause.config.md +0 -11
- package/docs/api/player.clicktopause.name.md +0 -11
- package/docs/api/player.clicktopause.supportedversion.md +0 -13
- package/docs/api/player.clipsplugin.attributes.md +0 -13
- package/docs/api/player.clipsplugin.bindevents.md +0 -15
- package/docs/api/player.clipsplugin.makesvg.md +0 -49
- package/docs/api/player.clipsplugin.name.md +0 -11
- package/docs/api/player.clipsplugin.unbindevents.md +0 -15
- package/docs/api/player.contextmenu.attributes.md +0 -13
- package/docs/api/player.contextmenu.bindevents.md +0 -15
- package/docs/api/player.contextmenu.destroy.md +0 -15
- package/docs/api/player.contextmenu.events.md +0 -13
- package/docs/api/player.contextmenu.exposeversion.md +0 -14
- package/docs/api/player.contextmenu.label.md +0 -11
- package/docs/api/player.contextmenu.mediacontrol.md +0 -11
- package/docs/api/player.contextmenu.name.md +0 -11
- package/docs/api/player.contextmenu.render.md +0 -15
- package/docs/api/player.contextmenu.supportedversion.md +0 -13
- package/docs/api/player.contextmenu.template.md +0 -11
- package/docs/api/player.contextmenu.url.md +0 -11
- package/docs/api/player.disablecontrols.bindevents.md +0 -15
- package/docs/api/player.disablecontrols.container.md +0 -11
- package/docs/api/player.disablecontrols.md +0 -138
- package/docs/api/player.disablecontrols.name.md +0 -11
- package/docs/api/player.disablecontrols.supportedversion.md +0 -13
- package/docs/api/player.disablecontrols.unbindevents.md +0 -15
- package/docs/api/player.thumbnails.attributes.md +0 -13
- package/docs/api/player.thumbnails.bindevents.md +0 -15
- package/docs/api/player.thumbnails.name.md +0 -11
- package/docs/api/player.thumbnails.settext.md +0 -49
- package/docs/api/player.thumbnails.supportedversion.md +0 -13
- package/docs/api/player.thumbnails.template.md +0 -11
- package/src/plugins/disable-controls/DisableControls.ts +0 -81
- package/src/plugins/ga-events/GaEvents.js +0 -395
- package/src/plugins/ga-events/ga-tracking.js +0 -46
|
@@ -1,115 +1,158 @@
|
|
|
1
|
-
import { Container, Events, UICorePlugin, $ } from '@clappr/core'
|
|
1
|
+
import { Container, Events, UICorePlugin, $ } from '@clappr/core'
|
|
2
2
|
|
|
3
|
-
import { TimeProgress } from '../../playback.types.js'
|
|
4
|
-
import type { ZeptoResult } from '../../utils/types.js'
|
|
5
|
-
import { strtimeToMiliseconds } from '../utils.js'
|
|
6
|
-
import '../../../assets/clips/clips.scss'
|
|
3
|
+
import { TimeProgress } from '../../playback.types.js'
|
|
4
|
+
import type { ZeptoResult } from '../../utils/types.js'
|
|
5
|
+
import { strtimeToMiliseconds } from '../utils.js'
|
|
6
|
+
import '../../../assets/clips/clips.scss'
|
|
7
|
+
import assert from 'assert'
|
|
7
8
|
|
|
8
9
|
type ClipDesc = {
|
|
9
|
-
start: number
|
|
10
|
-
text: string
|
|
11
|
-
end: number
|
|
12
|
-
index: number
|
|
10
|
+
start: number
|
|
11
|
+
text: string
|
|
12
|
+
end: number
|
|
13
|
+
index: number
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
type ClipItem = {
|
|
16
|
-
start: number
|
|
17
|
-
text: string
|
|
17
|
+
start: number
|
|
18
|
+
text: string
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Configuration options
|
|
23
|
+
*/
|
|
24
|
+
export interface ClipsPluginSettings {
|
|
25
|
+
/**
|
|
26
|
+
* The text to display over the seekbar.
|
|
27
|
+
*/
|
|
28
|
+
text: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Adds a behavior of showing a text over the seekbar to indicate the current clip.
|
|
33
|
+
* @beta
|
|
34
|
+
* @remarks
|
|
35
|
+
* Depends on:
|
|
36
|
+
*
|
|
37
|
+
* - {@link MediaControl}
|
|
38
|
+
*
|
|
39
|
+
* Configuration options - {@link ClipsPluginSettings}
|
|
40
|
+
*/
|
|
20
41
|
export class ClipsPlugin extends UICorePlugin {
|
|
21
42
|
private clips: Map<number, ClipDesc> = new Map()
|
|
22
43
|
|
|
23
|
-
private duration: number = 0
|
|
44
|
+
private duration: number = 0
|
|
24
45
|
|
|
25
|
-
private durationGetting = false
|
|
46
|
+
private durationGetting = false
|
|
26
47
|
|
|
27
|
-
private _oldContainer: Container | undefined
|
|
48
|
+
private _oldContainer: Container | undefined
|
|
28
49
|
|
|
29
|
-
private svgMask: ZeptoResult | null = null
|
|
50
|
+
private svgMask: ZeptoResult | null = null
|
|
30
51
|
|
|
52
|
+
/**
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
31
55
|
get name() {
|
|
32
|
-
return '
|
|
56
|
+
return 'clips'
|
|
33
57
|
}
|
|
34
58
|
|
|
59
|
+
/**
|
|
60
|
+
* @internal
|
|
61
|
+
*/
|
|
35
62
|
override get attributes() {
|
|
36
63
|
return {
|
|
37
|
-
|
|
38
|
-
}
|
|
64
|
+
class: this.name,
|
|
65
|
+
}
|
|
39
66
|
}
|
|
40
67
|
|
|
68
|
+
/**
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
41
71
|
override bindEvents() {
|
|
42
|
-
this.
|
|
43
|
-
|
|
44
|
-
this.
|
|
72
|
+
const mediaControl = this.core.getPlugin('media_control')
|
|
73
|
+
assert(mediaControl, 'media_control plugin is required')
|
|
74
|
+
this.listenToOnce(this.core, Events.CORE_READY, this._onCoreReady)
|
|
75
|
+
// TODO listen to CORE_ACTIVE_CONTAINER_CHANGED
|
|
76
|
+
this.listenTo(
|
|
77
|
+
mediaControl,
|
|
78
|
+
Events.MEDIACONTROL_CONTAINERCHANGED,
|
|
79
|
+
this._onMediaControlContainerChanged,
|
|
80
|
+
)
|
|
81
|
+
this.listenTo(this.core, Events.CORE_RESIZE, this.playerResize)
|
|
45
82
|
}
|
|
46
83
|
|
|
47
84
|
private _onCoreReady() {
|
|
48
85
|
if (!this.options.clips) {
|
|
49
|
-
this.destroy()
|
|
86
|
+
this.destroy()
|
|
50
87
|
|
|
51
|
-
return
|
|
88
|
+
return
|
|
52
89
|
}
|
|
53
90
|
|
|
54
|
-
this.parseClips()
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
unbindEvents() {
|
|
58
|
-
// @ts-ignore
|
|
59
|
-
this.stopListening(this.core, Events.CORE_READY);
|
|
60
|
-
// @ts-ignore
|
|
61
|
-
this.stopListening(this.core.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED);
|
|
91
|
+
this.parseClips()
|
|
62
92
|
}
|
|
63
93
|
|
|
64
94
|
private _onMediaControlContainerChanged() {
|
|
65
|
-
this._bindContainerEvents()
|
|
95
|
+
this._bindContainerEvents()
|
|
66
96
|
}
|
|
67
97
|
|
|
68
98
|
private playerResize() {
|
|
69
|
-
this.durationGetting = false
|
|
99
|
+
this.durationGetting = false
|
|
70
100
|
if (this.durationGetting) {
|
|
71
|
-
this.makeSvg(this.duration)
|
|
101
|
+
this.makeSvg(this.duration)
|
|
72
102
|
}
|
|
73
103
|
}
|
|
74
104
|
|
|
75
105
|
private _bindContainerEvents() {
|
|
76
106
|
if (this._oldContainer) {
|
|
77
|
-
this.stopListening(
|
|
107
|
+
this.stopListening(
|
|
108
|
+
this._oldContainer,
|
|
109
|
+
Events.CONTAINER_TIMEUPDATE,
|
|
110
|
+
this.onTimeUpdate,
|
|
111
|
+
)
|
|
78
112
|
}
|
|
79
113
|
|
|
80
|
-
|
|
81
|
-
this.
|
|
82
|
-
this.
|
|
114
|
+
const mediaControl = this.core.getPlugin('media_control')
|
|
115
|
+
this._oldContainer = mediaControl.container
|
|
116
|
+
this.durationGetting = false
|
|
117
|
+
this.listenTo(
|
|
118
|
+
mediaControl.container,
|
|
119
|
+
Events.CONTAINER_TIMEUPDATE,
|
|
120
|
+
this.onTimeUpdate,
|
|
121
|
+
)
|
|
83
122
|
}
|
|
84
123
|
|
|
85
124
|
private onTimeUpdate(event: TimeProgress) {
|
|
86
125
|
if (!this.durationGetting) {
|
|
87
|
-
this.duration = event.total
|
|
88
|
-
this.makeSvg(event.total)
|
|
89
|
-
this.durationGetting = true
|
|
126
|
+
this.duration = event.total
|
|
127
|
+
this.makeSvg(event.total)
|
|
128
|
+
this.durationGetting = true
|
|
90
129
|
}
|
|
91
130
|
|
|
92
131
|
for (const value of this.clips.values()) {
|
|
93
132
|
if (event.current >= value.start && event.current < value.end) {
|
|
94
|
-
this.setClipText(value.text)
|
|
95
|
-
break
|
|
133
|
+
this.setClipText(value.text)
|
|
134
|
+
break
|
|
96
135
|
}
|
|
97
136
|
}
|
|
98
137
|
}
|
|
99
138
|
|
|
100
139
|
private parseClips() {
|
|
101
|
-
const textArr = this.options.clips.text.split('\n')
|
|
140
|
+
const textArr = this.options.clips.text.split('\n')
|
|
102
141
|
|
|
103
|
-
const clipsArr = textArr
|
|
104
|
-
|
|
142
|
+
const clipsArr = textArr
|
|
143
|
+
.map((val: string) => {
|
|
144
|
+
const matchRes = val.match(/(\d+:\d+|:\d+) (.+)/i)
|
|
105
145
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
146
|
+
return matchRes
|
|
147
|
+
? {
|
|
148
|
+
start: strtimeToMiliseconds(matchRes[1]),
|
|
149
|
+
text: matchRes[2],
|
|
150
|
+
}
|
|
151
|
+
: null
|
|
152
|
+
})
|
|
153
|
+
.filter((clip: ClipItem | null) => clip !== null)
|
|
111
154
|
|
|
112
|
-
clipsArr.sort((a: ClipDesc, b: ClipDesc) => a.start - b.start)
|
|
155
|
+
clipsArr.sort((a: ClipDesc, b: ClipDesc) => a.start - b.start)
|
|
113
156
|
|
|
114
157
|
clipsArr.forEach((clip: ClipDesc, index: number) => {
|
|
115
158
|
this.clips.set(clip.start, {
|
|
@@ -117,39 +160,49 @@ export class ClipsPlugin extends UICorePlugin {
|
|
|
117
160
|
start: clip.start,
|
|
118
161
|
text: clip.text,
|
|
119
162
|
end: clipsArr[index + 1] ? clipsArr[index + 1].start : null,
|
|
120
|
-
})
|
|
121
|
-
})
|
|
163
|
+
})
|
|
164
|
+
})
|
|
122
165
|
}
|
|
123
166
|
|
|
167
|
+
/**
|
|
168
|
+
* Returns the text of the current clip.
|
|
169
|
+
* @param time - The current time of the player.
|
|
170
|
+
* @returns The text of the current clip.
|
|
171
|
+
*/
|
|
124
172
|
getText(time: number) {
|
|
125
173
|
for (const [key, value] of this.clips.entries()) {
|
|
126
174
|
if (time >= value.start && time < value.end) {
|
|
127
|
-
return value.text
|
|
175
|
+
return value.text
|
|
128
176
|
}
|
|
129
177
|
}
|
|
130
|
-
return ''
|
|
178
|
+
return ''
|
|
131
179
|
}
|
|
132
180
|
|
|
133
|
-
makeSvg(duration: number) {
|
|
134
|
-
let svg =
|
|
135
|
-
|
|
136
|
-
|
|
181
|
+
private makeSvg(duration: number) {
|
|
182
|
+
let svg =
|
|
183
|
+
'<svg width="0" height="0">\n' + '<defs>\n' + '<clipPath id="myClip">\n'
|
|
184
|
+
const widthOfSeek = this.core.activeContainer.$el.width()
|
|
185
|
+
let finishValue = 0
|
|
137
186
|
|
|
138
|
-
this.clips.forEach(val => {
|
|
139
|
-
let end = val.end
|
|
187
|
+
this.clips.forEach((val) => {
|
|
188
|
+
let end = val.end
|
|
140
189
|
|
|
141
190
|
if (!end) {
|
|
142
|
-
end = val.end = duration
|
|
191
|
+
end = val.end = duration
|
|
143
192
|
}
|
|
144
193
|
|
|
145
|
-
const widthChunk = (end - val.start) * widthOfSeek / duration
|
|
194
|
+
const widthChunk = ((end - val.start) * widthOfSeek) / duration
|
|
146
195
|
|
|
147
|
-
svg += `<rect x="${finishValue}" y="0" width="${
|
|
148
|
-
|
|
149
|
-
|
|
196
|
+
svg += `<rect x="${finishValue}" y="0" width="${
|
|
197
|
+
widthChunk - 2
|
|
198
|
+
}" height="30"/>\n`
|
|
199
|
+
finishValue += widthChunk
|
|
200
|
+
})
|
|
150
201
|
|
|
151
|
-
svg += `<rect x="${finishValue}" y="0" width="${
|
|
152
|
-
|
|
202
|
+
svg += `<rect x="${finishValue}" y="0" width="${
|
|
203
|
+
widthOfSeek - finishValue
|
|
204
|
+
}" height="30"/>\n`
|
|
205
|
+
svg += '</clipPath>' + '</defs>' + '</svg>'
|
|
153
206
|
this.setSVGMask(svg)
|
|
154
207
|
}
|
|
155
208
|
|
|
@@ -159,7 +212,9 @@ export class ClipsPlugin extends UICorePlugin {
|
|
|
159
212
|
this.svgMask.remove()
|
|
160
213
|
}
|
|
161
214
|
|
|
162
|
-
const
|
|
215
|
+
const mediaControl = this.core.getPlugin('media_control')
|
|
216
|
+
const $seekBarContainer =
|
|
217
|
+
mediaControl.getElement('seekBarContainer')
|
|
163
218
|
if ($seekBarContainer?.get(0)) {
|
|
164
219
|
$seekBarContainer.addClass('clips')
|
|
165
220
|
}
|
|
@@ -169,7 +224,8 @@ export class ClipsPlugin extends UICorePlugin {
|
|
|
169
224
|
}
|
|
170
225
|
|
|
171
226
|
private setClipText(text: string) {
|
|
172
|
-
const
|
|
227
|
+
const mediaControl = this.core.getPlugin('media_control')
|
|
228
|
+
const $clipText = mediaControl.getElement('clipText')
|
|
173
229
|
if ($clipText && text) {
|
|
174
230
|
$clipText.show()
|
|
175
231
|
$clipText.text(`${text}`)
|
|
@@ -1,134 +1,163 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import {
|
|
2
|
+
UICorePlugin,
|
|
3
|
+
Events,
|
|
4
|
+
template,
|
|
5
|
+
$,
|
|
6
|
+
Core,
|
|
7
|
+
Container,
|
|
8
|
+
UIContainerPlugin,
|
|
9
|
+
} from '@clappr/core'
|
|
10
|
+
|
|
11
|
+
import { CLAPPR_VERSION } from '../../build.js'
|
|
12
|
+
|
|
13
|
+
import '../../../assets/context-menu/context_menu.scss'
|
|
14
|
+
import templateHtml from '../../../assets/context-menu/context_menu.ejs'
|
|
15
|
+
import { version } from '../../version.js'
|
|
7
16
|
|
|
8
17
|
type MenuOption = {
|
|
9
|
-
label: string
|
|
10
|
-
name: string
|
|
18
|
+
label: string
|
|
19
|
+
name: string
|
|
11
20
|
}
|
|
12
21
|
|
|
13
|
-
export
|
|
14
|
-
|
|
22
|
+
export interface ContextMenuPluginSettings {
|
|
23
|
+
label?: string
|
|
24
|
+
url?: string
|
|
25
|
+
preventShowContextMenu?: boolean
|
|
26
|
+
}
|
|
15
27
|
|
|
16
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Displays a small context menu when clicked on the player container.
|
|
30
|
+
* @beta
|
|
31
|
+
* @remarks
|
|
32
|
+
* Configuration options - {@link ContextMenuPluginSettings}
|
|
33
|
+
*/
|
|
34
|
+
export class ContextMenu extends UIContainerPlugin {
|
|
35
|
+
private _label: string = ''
|
|
17
36
|
|
|
18
|
-
private
|
|
37
|
+
private _url: string = ''
|
|
19
38
|
|
|
20
|
-
private menuOptions: MenuOption[] = []
|
|
39
|
+
private menuOptions: MenuOption[] = []
|
|
21
40
|
|
|
41
|
+
/**
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
22
44
|
get name() {
|
|
23
|
-
return 'context_menu'
|
|
45
|
+
return 'context_menu'
|
|
24
46
|
}
|
|
25
47
|
|
|
48
|
+
/**
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
26
51
|
get supportedVersion() {
|
|
27
|
-
return { min: CLAPPR_VERSION }
|
|
52
|
+
return { min: CLAPPR_VERSION }
|
|
28
53
|
}
|
|
29
54
|
|
|
55
|
+
/**
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
30
58
|
override get attributes() {
|
|
31
|
-
return {
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get mediaControl() {
|
|
35
|
-
return this.core.mediaControl;
|
|
59
|
+
return { class: 'context-menu' }
|
|
36
60
|
}
|
|
37
61
|
|
|
38
|
-
|
|
39
|
-
return template(templateHtml);
|
|
40
|
-
}
|
|
62
|
+
private static readonly template = template(templateHtml)
|
|
41
63
|
|
|
42
|
-
get label() {
|
|
43
|
-
return this._label || 'Gcore player ver. ' +
|
|
64
|
+
private get label() {
|
|
65
|
+
return this._label || 'Gcore player ver. ' + version().gplayer
|
|
44
66
|
}
|
|
45
67
|
|
|
46
|
-
get url() {
|
|
47
|
-
return this._url || 'https://gcore.com/'
|
|
68
|
+
private get url() {
|
|
69
|
+
return this._url || 'https://gcore.com/'
|
|
48
70
|
}
|
|
49
71
|
|
|
50
|
-
get exposeVersion() {
|
|
72
|
+
private get exposeVersion() {
|
|
51
73
|
return {
|
|
52
74
|
label: this.label,
|
|
53
|
-
name: 'version'
|
|
54
|
-
}
|
|
75
|
+
name: 'version',
|
|
76
|
+
}
|
|
55
77
|
}
|
|
56
78
|
|
|
79
|
+
/**
|
|
80
|
+
* @internal
|
|
81
|
+
*/
|
|
57
82
|
override get events() {
|
|
58
83
|
return {
|
|
59
|
-
'click [data-version]': 'onOpenMainPage'
|
|
60
|
-
}
|
|
84
|
+
'click [data-version]': 'onOpenMainPage',
|
|
85
|
+
}
|
|
61
86
|
}
|
|
62
87
|
|
|
63
|
-
constructor(
|
|
64
|
-
super(
|
|
88
|
+
constructor(container: Container) {
|
|
89
|
+
super(container)
|
|
65
90
|
if (this.options.contextMenu && this.options.contextMenu.label) {
|
|
66
|
-
this._label = this.options.contextMenu.label
|
|
91
|
+
this._label = this.options.contextMenu.label
|
|
67
92
|
}
|
|
68
93
|
if (this.options.contextMenu && this.options.contextMenu.url) {
|
|
69
|
-
this._url = this.options.contextMenu.url
|
|
94
|
+
this._url = this.options.contextMenu.url
|
|
70
95
|
}
|
|
71
|
-
this.render()
|
|
72
|
-
this.bindEvents()
|
|
96
|
+
this.render()
|
|
97
|
+
this.bindEvents()
|
|
73
98
|
}
|
|
74
99
|
|
|
100
|
+
/**
|
|
101
|
+
* @internal
|
|
102
|
+
*/
|
|
75
103
|
override bindEvents() {
|
|
76
|
-
|
|
77
|
-
this.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
104
|
+
this.listenTo(
|
|
105
|
+
this.container,
|
|
106
|
+
Events.CONTAINER_CONTEXTMENU,
|
|
107
|
+
this.toggleContextMenu,
|
|
108
|
+
)
|
|
109
|
+
this.listenTo(this.container, Events.CONTAINER_CLICK, this.hide)
|
|
110
|
+
$('body').on('click', this.hideOnBodyClick)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* @internal
|
|
115
|
+
*/
|
|
87
116
|
override destroy() {
|
|
88
|
-
$('body').off('click', this.
|
|
89
|
-
|
|
90
|
-
this.stopListening();
|
|
91
|
-
return super.destroy();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
private containerChanged() {
|
|
95
|
-
this.container = this.core.activeContainer;
|
|
96
|
-
// @ts-ignore
|
|
97
|
-
this.stopListening();
|
|
98
|
-
this.bindEvents();
|
|
117
|
+
$('body').off('click', this.hideOnBodyClick)
|
|
118
|
+
return super.destroy()
|
|
99
119
|
}
|
|
100
120
|
|
|
101
121
|
private toggleContextMenu(event: MouseEvent) {
|
|
102
|
-
event.preventDefault()
|
|
103
|
-
const offset = this.container?.$el.offset()
|
|
122
|
+
event.preventDefault()
|
|
123
|
+
const offset = this.container?.$el.offset()
|
|
104
124
|
|
|
105
|
-
this.show(event.pageY - offset.top, event.pageX - offset.left)
|
|
125
|
+
this.show(event.pageY - offset.top, event.pageX - offset.left)
|
|
106
126
|
}
|
|
107
127
|
|
|
108
128
|
private show(top: number, left: number) {
|
|
109
|
-
this.hide()
|
|
110
|
-
if (
|
|
111
|
-
|
|
129
|
+
this.hide()
|
|
130
|
+
if (
|
|
131
|
+
this.options.contextMenu &&
|
|
132
|
+
this.options.contextMenu.preventShowContextMenu
|
|
133
|
+
) {
|
|
134
|
+
return
|
|
112
135
|
}
|
|
113
|
-
this.$el.css({ top, left })
|
|
114
|
-
this.$el.show()
|
|
136
|
+
this.$el.css({ top, left })
|
|
137
|
+
this.$el.show()
|
|
115
138
|
}
|
|
116
139
|
|
|
117
140
|
private hide() {
|
|
118
|
-
this.$el.hide()
|
|
141
|
+
this.$el.hide()
|
|
119
142
|
}
|
|
120
143
|
|
|
121
144
|
private onOpenMainPage() {
|
|
122
|
-
window.open(this.url, '_blank')
|
|
145
|
+
window.open(this.url, '_blank')
|
|
123
146
|
}
|
|
124
147
|
|
|
148
|
+
/**
|
|
149
|
+
* @internal
|
|
150
|
+
*/
|
|
125
151
|
override render() {
|
|
126
|
-
this.menuOptions = [this.exposeVersion]
|
|
127
|
-
this.$el.html(
|
|
128
|
-
this.
|
|
129
|
-
this.hide()
|
|
130
|
-
|
|
152
|
+
this.menuOptions = [this.exposeVersion]
|
|
153
|
+
this.$el.html(ContextMenu.template({ options: this.menuOptions }))
|
|
154
|
+
this.container.$el.append(this.$el) // TODO append to the container, turn into a container plugin
|
|
155
|
+
this.hide()
|
|
156
|
+
|
|
157
|
+
return this
|
|
158
|
+
}
|
|
131
159
|
|
|
132
|
-
|
|
160
|
+
private hideOnBodyClick = () => {
|
|
161
|
+
this.hide()
|
|
133
162
|
}
|
|
134
163
|
}
|
|
@@ -13,7 +13,7 @@ import '../../../assets/dvr-controls/dvr_controls.scss';
|
|
|
13
13
|
* @remarks
|
|
14
14
|
* Depends on:
|
|
15
15
|
*
|
|
16
|
-
* - {@link MediaControl
|
|
16
|
+
* - {@link MediaControl}
|
|
17
17
|
*
|
|
18
18
|
* The plugin renders the live stream indicator and the DVR seek bar, if DVR is enabled, in the media control UI.
|
|
19
19
|
*/
|
|
@@ -24,7 +24,7 @@ export class DvrControls extends UICorePlugin {
|
|
|
24
24
|
* @internal
|
|
25
25
|
*/
|
|
26
26
|
get name() {
|
|
27
|
-
return '
|
|
27
|
+
return 'dvr_controls';
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
@@ -62,35 +62,16 @@ export class DvrControls extends UICorePlugin {
|
|
|
62
62
|
* @internal
|
|
63
63
|
*/
|
|
64
64
|
override bindEvents() {
|
|
65
|
-
this.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
private bindCoreEvents() {
|
|
74
|
-
if (this.core.mediaControl.settings) {
|
|
75
|
-
this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED, this.containerChanged);
|
|
76
|
-
this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_RENDERED, this.settingsUpdate);
|
|
77
|
-
this.listenTo(this.core, Events.CORE_OPTIONS_CHANGE, this.render);
|
|
78
|
-
} else {
|
|
79
|
-
setTimeout(() => this.bindCoreEvents(), 100);
|
|
80
|
-
}
|
|
65
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
66
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
67
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.settingsUpdate);
|
|
68
|
+
this.listenTo(this.core, Events.CORE_OPTIONS_CHANGE, this.render);
|
|
69
|
+
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.bindContainerEvents);
|
|
81
70
|
}
|
|
82
71
|
|
|
83
72
|
private bindContainerEvents() {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.dvrChanged);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
private containerChanged() {
|
|
91
|
-
// @ts-ignore
|
|
92
|
-
this.stopListening();
|
|
93
|
-
this.bindEvents();
|
|
73
|
+
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.render);
|
|
74
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.dvrChanged);
|
|
94
75
|
}
|
|
95
76
|
|
|
96
77
|
private dvrChanged(dvrEnabled: boolean) {
|
|
@@ -127,7 +108,7 @@ export class DvrControls extends UICorePlugin {
|
|
|
127
108
|
private settingsUpdate() {
|
|
128
109
|
// @ts-ignore
|
|
129
110
|
this.stopListening(); // TODO sort out
|
|
130
|
-
this.core.
|
|
111
|
+
this.core.getPlugin('media_control').$el.removeClass('live'); // TODO don't access directly
|
|
131
112
|
if (this.shouldRender()) {
|
|
132
113
|
this.render();
|
|
133
114
|
this.$el.click(() => this.click());
|
|
@@ -150,7 +131,7 @@ export class DvrControls extends UICorePlugin {
|
|
|
150
131
|
backToLive: this.core.i18n.t('back_to_live')
|
|
151
132
|
}));
|
|
152
133
|
if (this.shouldRender()) {
|
|
153
|
-
const mediaControl = this.core.
|
|
134
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
154
135
|
assert(mediaControl, 'media_control plugin is required');
|
|
155
136
|
// TODO don't tap into the $el directly
|
|
156
137
|
mediaControl.$el.addClass('live');
|
|
@@ -12,6 +12,10 @@ const FAVICON_SELECTOR = 'link[rel="shortcut icon"]';
|
|
|
12
12
|
|
|
13
13
|
// const oldIcon = $(FAVICON_SELECTOR);
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* The plugin adds custom favicon to the player's tab.
|
|
17
|
+
* @beta
|
|
18
|
+
*/
|
|
15
19
|
export class Favicon extends CorePlugin {
|
|
16
20
|
private _container: Container | null = null;
|
|
17
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright 2014 Globo.com Player authors. All rights reserved.
|
|
2
2
|
// Use of this source code is governed by a BSD-style
|
|
3
|
-
// license that can be found
|
|
3
|
+
// license that can be found at https://github.com/clappr/clappr-plugins/blob/master/LICENSE
|
|
4
4
|
|
|
5
5
|
import { Container, ContainerPlugin, Events } from '@clappr/core';
|
|
6
6
|
|
|
@@ -10,6 +10,10 @@ declare const _gaq: {
|
|
|
10
10
|
push(args: string[]): void;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* An example Google Analytics integration plugin
|
|
15
|
+
* @beta
|
|
16
|
+
*/
|
|
13
17
|
export class GoogleAnalytics extends ContainerPlugin {
|
|
14
18
|
private account: string = '';
|
|
15
19
|
|
package/src/plugins/index.ts
CHANGED
|
@@ -14,7 +14,6 @@ export * from "./clappr-stats/ClapprStats.js";
|
|
|
14
14
|
export * from "./click-to-pause/ClickToPause.js";
|
|
15
15
|
export * from "./clips/Clips.js";
|
|
16
16
|
export * from "./context-menu/ContextMenu.js";
|
|
17
|
-
export * from "./disable-controls/DisableControls.js";
|
|
18
17
|
export * from "./dvr-controls/DvrControls.js";
|
|
19
18
|
export * from "./error-screen/ErrorScreen.js";
|
|
20
19
|
export * from "./favicon/Favicon.js";
|
package/src/plugins/logo/Logo.ts
CHANGED
|
@@ -20,6 +20,10 @@ type LogoOptions = {
|
|
|
20
20
|
objectFit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* The plugin adds custom logo to the player.
|
|
25
|
+
* @beta
|
|
26
|
+
*/
|
|
23
27
|
export class Logo extends UIContainerPlugin {
|
|
24
28
|
private hasStartedPlaying = false;
|
|
25
29
|
|