@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.
Files changed (262) hide show
  1. package/dist/core.js +1 -1
  2. package/dist/index.css +1328 -1328
  3. package/dist/index.js +305 -217
  4. package/dist/player.d.ts +270 -52
  5. package/dist/plugins/index.css +612 -612
  6. package/dist/plugins/index.js +1459 -1347
  7. package/docs/api/player.audioselector.md +1 -251
  8. package/docs/api/player.bigmutebutton.md +1 -156
  9. package/docs/api/player.clapprstats.exportmetrics.md +4 -0
  10. package/docs/api/player.clapprstats.md +7 -223
  11. package/docs/api/player.clapprstats.setupdatemetrics.md +2 -0
  12. package/docs/api/player.clicktopause.md +5 -113
  13. package/docs/api/player.clipsplugin.gettext.md +9 -0
  14. package/docs/api/player.clipsplugin.md +10 -94
  15. package/docs/api/player.clipspluginsettings.md +57 -0
  16. package/docs/api/player.clipspluginsettings.text.md +13 -0
  17. package/docs/api/player.contextmenu._constructor_.md +6 -3
  18. package/docs/api/player.contextmenu.md +13 -256
  19. package/docs/api/player.contextmenupluginsettings.label.md +11 -0
  20. package/docs/api/player.contextmenupluginsettings.md +93 -0
  21. package/docs/api/player.contextmenupluginsettings.preventshowcontextmenu.md +11 -0
  22. package/docs/api/player.contextmenupluginsettings.url.md +11 -0
  23. package/docs/api/player.dvrcontrols.md +1 -1
  24. package/docs/api/player.errorscreen.md +0 -2
  25. package/docs/api/player.favicon._constructor_.md +3 -0
  26. package/docs/api/player.favicon.bindevents.md +3 -0
  27. package/docs/api/player.favicon.configure.md +3 -0
  28. package/docs/api/player.favicon.destroy.md +3 -0
  29. package/docs/api/player.favicon.disable.md +3 -0
  30. package/docs/api/player.favicon.md +18 -1
  31. package/docs/api/player.favicon.name.md +3 -0
  32. package/docs/api/player.favicon.supportedversion.md +3 -0
  33. package/docs/api/player.gearevents.md +4 -1
  34. package/docs/api/player.googleanalytics._constructor_.md +3 -0
  35. package/docs/api/player.googleanalytics.addeventlisteners.md +3 -0
  36. package/docs/api/player.googleanalytics.embedscript.md +3 -0
  37. package/docs/api/player.googleanalytics.md +42 -1
  38. package/docs/api/player.googleanalytics.name.md +3 -0
  39. package/docs/api/player.googleanalytics.onbufferfull.md +3 -0
  40. package/docs/api/player.googleanalytics.onbuffering.md +3 -0
  41. package/docs/api/player.googleanalytics.ondvr.md +3 -0
  42. package/docs/api/player.googleanalytics.onended.md +3 -0
  43. package/docs/api/player.googleanalytics.onerror.md +3 -0
  44. package/docs/api/player.googleanalytics.onfullscreen.md +3 -0
  45. package/docs/api/player.googleanalytics.onhd.md +3 -0
  46. package/docs/api/player.googleanalytics.onpause.md +3 -0
  47. package/docs/api/player.googleanalytics.onplay.md +3 -0
  48. package/docs/api/player.googleanalytics.onready.md +3 -0
  49. package/docs/api/player.googleanalytics.onseek.md +3 -0
  50. package/docs/api/player.googleanalytics.onstop.md +3 -0
  51. package/docs/api/player.googleanalytics.onvolumechanged.md +3 -0
  52. package/docs/api/player.googleanalytics.push.md +3 -0
  53. package/docs/api/player.googleanalytics.supportedversion.md +3 -0
  54. package/docs/api/player.initeventdata.event.md +3 -0
  55. package/docs/api/player.initeventdata.md +7 -0
  56. package/docs/api/player.logo._constructor_.md +3 -0
  57. package/docs/api/player.logo.attributes.md +3 -0
  58. package/docs/api/player.logo.bindevents.md +3 -0
  59. package/docs/api/player.logo.md +20 -1
  60. package/docs/api/player.logo.name.md +3 -0
  61. package/docs/api/player.logo.render.md +3 -0
  62. package/docs/api/player.logo.stoplistening.md +3 -0
  63. package/docs/api/player.logo.supportedversion.md +3 -0
  64. package/docs/api/player.logo.template.md +3 -0
  65. package/docs/api/player.md +68 -20
  66. package/docs/api/player.mediacontrolelement.md +1 -1
  67. package/docs/api/player.multicamera.md +2 -0
  68. package/docs/api/player.seektime.attributes.md +3 -0
  69. package/docs/api/player.seektime.bindevents.md +3 -0
  70. package/docs/api/player.seektime.durationshown.md +3 -0
  71. package/docs/api/player.seektime.getseektime.md +3 -0
  72. package/docs/api/player.seektime.islivestreamwithdvr.md +3 -0
  73. package/docs/api/player.seektime.md +31 -0
  74. package/docs/api/player.seektime.mediacontrol.md +3 -0
  75. package/docs/api/player.seektime.mediacontrolcontainer.md +3 -0
  76. package/docs/api/player.seektime.name.md +3 -0
  77. package/docs/api/player.seektime.render.md +3 -0
  78. package/docs/api/player.seektime.shouldbevisible.md +3 -0
  79. package/docs/api/player.seektime.supportedversion.md +3 -0
  80. package/docs/api/player.seektime.template.md +3 -0
  81. package/docs/api/player.seektime.update.md +3 -0
  82. package/docs/api/player.share.md +2 -0
  83. package/docs/api/player.skiptime.md +2 -0
  84. package/docs/api/player.stalleventdata.count.md +3 -0
  85. package/docs/api/player.stalleventdata.event.md +3 -0
  86. package/docs/api/player.stalleventdata.md +8 -3
  87. package/docs/api/player.stalleventdata.time.md +3 -0
  88. package/docs/api/player.stalleventdata.total_ms.md +3 -0
  89. package/docs/api/player.starteventdata.event.md +3 -0
  90. package/docs/api/player.starteventdata.md +7 -0
  91. package/docs/api/player.telemetryevent.md +11 -0
  92. package/docs/api/player.telemetryeventdata.md +3 -0
  93. package/docs/api/player.telemetrypluginsettings.md +4 -1
  94. package/docs/api/player.telemetrypluginsettings.send.md +3 -0
  95. package/docs/api/player.telemetryrecord.md +3 -0
  96. package/docs/api/player.thumbnails.md +21 -139
  97. package/docs/api/player.thumbnailspluginsettings.md +23 -0
  98. package/docs/api/player.volumefade.md +1 -0
  99. package/docs/api/player.watcheventdata.event.md +3 -0
  100. package/docs/api/player.watcheventdata.md +7 -0
  101. package/lib/index.plugins.d.ts +0 -1
  102. package/lib/index.plugins.d.ts.map +1 -1
  103. package/lib/index.plugins.js +0 -1
  104. package/lib/plugins/audio-selector/AudioSelector.d.ts +28 -6
  105. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  106. package/lib/plugins/audio-selector/AudioSelector.js +52 -22
  107. package/lib/plugins/big-mute-button/BigMuteButton.d.ts +18 -2
  108. package/lib/plugins/big-mute-button/BigMuteButton.d.ts.map +1 -1
  109. package/lib/plugins/big-mute-button/BigMuteButton.js +21 -16
  110. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -0
  111. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  112. package/lib/plugins/bottom-gear/BottomGear.js +1 -0
  113. package/lib/plugins/clappr-stats/ClapprStats.d.ts +31 -8
  114. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
  115. package/lib/plugins/clappr-stats/ClapprStats.js +24 -0
  116. package/lib/plugins/clappr-stats/types.d.ts +12 -0
  117. package/lib/plugins/clappr-stats/types.d.ts.map +1 -1
  118. package/lib/plugins/clappr-stats/types.js +3 -0
  119. package/lib/plugins/click-to-pause/ClickToPause.d.ts +13 -1
  120. package/lib/plugins/click-to-pause/ClickToPause.d.ts.map +1 -1
  121. package/lib/plugins/click-to-pause/ClickToPause.js +14 -4
  122. package/lib/plugins/clips/Clips.d.ts +34 -2
  123. package/lib/plugins/clips/Clips.d.ts.map +1 -1
  124. package/lib/plugins/clips/Clips.js +51 -22
  125. package/lib/plugins/context-menu/ContextMenu.d.ts +40 -13
  126. package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -1
  127. package/lib/plugins/context-menu/ContextMenu.js +48 -36
  128. package/lib/plugins/dvr-controls/DvrControls.d.ts +1 -3
  129. package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
  130. package/lib/plugins/dvr-controls/DvrControls.js +11 -28
  131. package/lib/plugins/error-screen/ErrorScreen.d.ts +0 -1
  132. package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -1
  133. package/lib/plugins/error-screen/ErrorScreen.js +0 -1
  134. package/lib/plugins/favicon/Favicon.d.ts +4 -0
  135. package/lib/plugins/favicon/Favicon.d.ts.map +1 -1
  136. package/lib/plugins/favicon/Favicon.js +4 -0
  137. package/lib/plugins/google-analytics/GoogleAnalytics.d.ts +4 -0
  138. package/lib/plugins/google-analytics/GoogleAnalytics.d.ts.map +1 -1
  139. package/lib/plugins/google-analytics/GoogleAnalytics.js +5 -1
  140. package/lib/plugins/index.d.ts +0 -1
  141. package/lib/plugins/index.d.ts.map +1 -1
  142. package/lib/plugins/index.js +0 -1
  143. package/lib/plugins/logo/Logo.d.ts +4 -0
  144. package/lib/plugins/logo/Logo.d.ts.map +1 -1
  145. package/lib/plugins/logo/Logo.js +4 -0
  146. package/lib/plugins/media-control/MediaControl.d.ts +1 -1
  147. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  148. package/lib/plugins/media-control/MediaControl.js +3 -1
  149. package/lib/plugins/multi-camera/MultiCamera.d.ts +3 -0
  150. package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -1
  151. package/lib/plugins/multi-camera/MultiCamera.js +3 -0
  152. package/lib/plugins/seek-time/SeekTime.d.ts +4 -0
  153. package/lib/plugins/seek-time/SeekTime.d.ts.map +1 -1
  154. package/lib/plugins/seek-time/SeekTime.js +5 -1
  155. package/lib/plugins/share/Share.d.ts +3 -0
  156. package/lib/plugins/share/Share.d.ts.map +1 -1
  157. package/lib/plugins/share/Share.js +3 -0
  158. package/lib/plugins/skip-time/SkipTime.d.ts +3 -0
  159. package/lib/plugins/skip-time/SkipTime.d.ts.map +1 -1
  160. package/lib/plugins/skip-time/SkipTime.js +3 -0
  161. package/lib/plugins/telemetry/Telemetry.d.ts +18 -0
  162. package/lib/plugins/telemetry/Telemetry.d.ts.map +1 -1
  163. package/lib/plugins/telemetry/Telemetry.js +1 -0
  164. package/lib/plugins/thumbnails/Thumbnails.d.ts +48 -3
  165. package/lib/plugins/thumbnails/Thumbnails.d.ts.map +1 -1
  166. package/lib/plugins/thumbnails/Thumbnails.js +52 -18
  167. package/lib/plugins/volume-fade/VolumeFade.d.ts +1 -0
  168. package/lib/plugins/volume-fade/VolumeFade.d.ts.map +1 -1
  169. package/lib/plugins/volume-fade/VolumeFade.js +1 -0
  170. package/package.json +1 -1
  171. package/src/index.plugins.ts +0 -1
  172. package/src/plugins/audio-selector/AudioSelector.ts +227 -154
  173. package/src/plugins/big-mute-button/BigMuteButton.ts +100 -79
  174. package/src/plugins/bottom-gear/BottomGear.ts +1 -0
  175. package/src/plugins/clappr-stats/ClapprStats.ts +32 -8
  176. package/src/plugins/clappr-stats/types.ts +13 -0
  177. package/src/plugins/click-to-pause/ClickToPause.ts +47 -36
  178. package/src/plugins/clips/Clips.ts +127 -71
  179. package/src/plugins/context-menu/ContextMenu.ts +105 -76
  180. package/src/plugins/dvr-controls/DvrControls.ts +11 -30
  181. package/src/plugins/error-screen/ErrorScreen.ts +0 -1
  182. package/src/plugins/favicon/Favicon.ts +4 -0
  183. package/src/plugins/google-analytics/GoogleAnalytics.ts +5 -1
  184. package/src/plugins/index.ts +0 -1
  185. package/src/plugins/logo/Logo.ts +4 -0
  186. package/src/plugins/media-control/MediaControl.ts +4 -1
  187. package/src/plugins/multi-camera/MultiCamera.ts +3 -0
  188. package/src/plugins/seek-time/SeekTime.ts +5 -1
  189. package/src/plugins/share/Share.ts +3 -0
  190. package/src/plugins/skip-time/SkipTime.ts +3 -0
  191. package/src/plugins/telemetry/Telemetry.ts +18 -0
  192. package/src/plugins/thumbnails/Thumbnails.ts +268 -194
  193. package/src/plugins/volume-fade/VolumeFade.ts +1 -0
  194. package/temp/player.api.json +622 -2463
  195. package/tsconfig.tsbuildinfo +1 -1
  196. package/docs/api/player.audioselector.attributes.md +0 -17
  197. package/docs/api/player.audioselector.bindevents.md +0 -18
  198. package/docs/api/player.audioselector.events.md +0 -17
  199. package/docs/api/player.audioselector.hideselecttrackmenu.md +0 -18
  200. package/docs/api/player.audioselector.name.md +0 -14
  201. package/docs/api/player.audioselector.onshowlevelselectmenu.md +0 -18
  202. package/docs/api/player.audioselector.reload.md +0 -18
  203. package/docs/api/player.audioselector.render.md +0 -18
  204. package/docs/api/player.audioselector.supportedversion.md +0 -16
  205. package/docs/api/player.audioselector.template.md +0 -14
  206. package/docs/api/player.audioselector.togglecontextmenu.md +0 -18
  207. package/docs/api/player.audioselector.unbindevents.md +0 -18
  208. package/docs/api/player.audioselector.version.md +0 -14
  209. package/docs/api/player.bigmutebutton.bindevents.md +0 -18
  210. package/docs/api/player.bigmutebutton.events.md +0 -17
  211. package/docs/api/player.bigmutebutton.name.md +0 -14
  212. package/docs/api/player.bigmutebutton.render.md +0 -18
  213. package/docs/api/player.bigmutebutton.supportedversion.md +0 -16
  214. package/docs/api/player.bigmutebutton.template.md +0 -14
  215. package/docs/api/player.clapprstats._buildreport.md +0 -18
  216. package/docs/api/player.clapprstats._defaultreport.md +0 -52
  217. package/docs/api/player.clapprstats._playbackname.md +0 -14
  218. package/docs/api/player.clapprstats._playbacktype.md +0 -14
  219. package/docs/api/player.clapprstats.bindevents.md +0 -18
  220. package/docs/api/player.clapprstats.destroy.md +0 -18
  221. package/docs/api/player.clapprstats.name.md +0 -14
  222. package/docs/api/player.clapprstats.onfirstplaying.md +0 -18
  223. package/docs/api/player.clapprstats.playafterpause.md +0 -18
  224. package/docs/api/player.clapprstats.starttimers.md +0 -18
  225. package/docs/api/player.clapprstats.stopreporting.md +0 -18
  226. package/docs/api/player.clapprstats.supportedversion.md +0 -16
  227. package/docs/api/player.clicktopause.bindevents.md +0 -15
  228. package/docs/api/player.clicktopause.config.md +0 -11
  229. package/docs/api/player.clicktopause.name.md +0 -11
  230. package/docs/api/player.clicktopause.supportedversion.md +0 -13
  231. package/docs/api/player.clipsplugin.attributes.md +0 -13
  232. package/docs/api/player.clipsplugin.bindevents.md +0 -15
  233. package/docs/api/player.clipsplugin.makesvg.md +0 -49
  234. package/docs/api/player.clipsplugin.name.md +0 -11
  235. package/docs/api/player.clipsplugin.unbindevents.md +0 -15
  236. package/docs/api/player.contextmenu.attributes.md +0 -13
  237. package/docs/api/player.contextmenu.bindevents.md +0 -15
  238. package/docs/api/player.contextmenu.destroy.md +0 -15
  239. package/docs/api/player.contextmenu.events.md +0 -13
  240. package/docs/api/player.contextmenu.exposeversion.md +0 -14
  241. package/docs/api/player.contextmenu.label.md +0 -11
  242. package/docs/api/player.contextmenu.mediacontrol.md +0 -11
  243. package/docs/api/player.contextmenu.name.md +0 -11
  244. package/docs/api/player.contextmenu.render.md +0 -15
  245. package/docs/api/player.contextmenu.supportedversion.md +0 -13
  246. package/docs/api/player.contextmenu.template.md +0 -11
  247. package/docs/api/player.contextmenu.url.md +0 -11
  248. package/docs/api/player.disablecontrols.bindevents.md +0 -15
  249. package/docs/api/player.disablecontrols.container.md +0 -11
  250. package/docs/api/player.disablecontrols.md +0 -138
  251. package/docs/api/player.disablecontrols.name.md +0 -11
  252. package/docs/api/player.disablecontrols.supportedversion.md +0 -13
  253. package/docs/api/player.disablecontrols.unbindevents.md +0 -15
  254. package/docs/api/player.thumbnails.attributes.md +0 -13
  255. package/docs/api/player.thumbnails.bindevents.md +0 -15
  256. package/docs/api/player.thumbnails.name.md +0 -11
  257. package/docs/api/player.thumbnails.settext.md +0 -49
  258. package/docs/api/player.thumbnails.supportedversion.md +0 -13
  259. package/docs/api/player.thumbnails.template.md +0 -11
  260. package/src/plugins/disable-controls/DisableControls.ts +0 -81
  261. package/src/plugins/ga-events/GaEvents.js +0 -395
  262. 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 'media_control_clips';
56
+ return 'clips'
33
57
  }
34
58
 
59
+ /**
60
+ * @internal
61
+ */
35
62
  override get attributes() {
36
63
  return {
37
- 'class': this.name
38
- };
64
+ class: this.name,
65
+ }
39
66
  }
40
67
 
68
+ /**
69
+ * @internal
70
+ */
41
71
  override bindEvents() {
42
- this.listenToOnce(this.core, Events.CORE_READY, this._onCoreReady);
43
- this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED, this._onMediaControlContainerChanged);
44
- this.listenTo(this.core, Events.CORE_RESIZE, this.playerResize);
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(this._oldContainer, Events.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
107
+ this.stopListening(
108
+ this._oldContainer,
109
+ Events.CONTAINER_TIMEUPDATE,
110
+ this.onTimeUpdate,
111
+ )
78
112
  }
79
113
 
80
- this._oldContainer = this.core.mediaControl.container;
81
- this.durationGetting = false;
82
- this.listenTo(this.core.mediaControl.container, Events.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
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.map((val: string) => {
104
- const matchRes = val.match(/(\d+:\d+|:\d+) (.+)/i);
142
+ const clipsArr = textArr
143
+ .map((val: string) => {
144
+ const matchRes = val.match(/(\d+:\d+|:\d+) (.+)/i)
105
145
 
106
- return matchRes ? {
107
- start: strtimeToMiliseconds(matchRes[1]),
108
- text: matchRes[2],
109
- } : null;
110
- }).filter((clip: ClipItem | null) => clip !== null);
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 = '<svg width="0" height="0">\n' + '<defs>\n' + '<clipPath id="myClip">\n';
135
- const widthOfSeek = this.core.mediaControl.container.$el.width();
136
- let finishValue = 0;
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="${widthChunk - 2}" height="30"/>\n`;
148
- finishValue += widthChunk;
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="${widthOfSeek - finishValue}" height="30"/>\n`;
152
- svg += '</clipPath>' + '</defs>' + '</svg>';
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 $seekBarContainer = this.core.mediaControl.getElement('seekBarContainer')
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 $clipText = this.core.mediaControl.getElement('clipText')
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 { UICorePlugin, Events, template, $, Core, Container } from '@clappr/core';
2
-
3
- import { CLAPPR_VERSION } from '../../build.js';
4
-
5
- import '../../../assets/context-menu/context_menu.scss';
6
- import templateHtml from '../../../assets/context-menu/context_menu.ejs';
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 class ContextMenu extends UICorePlugin {
14
- private _label: string = '';
22
+ export interface ContextMenuPluginSettings {
23
+ label?: string
24
+ url?: string
25
+ preventShowContextMenu?: boolean
26
+ }
15
27
 
16
- private _url: string = '';
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 container: Container | null = null;
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 { 'class': 'context-menu' };
32
- }
33
-
34
- get mediaControl() {
35
- return this.core.mediaControl;
59
+ return { class: 'context-menu' }
36
60
  }
37
61
 
38
- get template() {
39
- return template(templateHtml);
40
- }
62
+ private static readonly template = template(templateHtml)
41
63
 
42
- get label() {
43
- return this._label || 'Gcore player ver. ' + process.env.VERSION;
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(core: Core) {
64
- super(core);
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
- if (this.mediaControl) {
77
- this.listenTo(this.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED, this.containerChanged);
78
-
79
- if (this.container) {
80
- this.listenTo(this.container, Events.CONTAINER_CONTEXTMENU, this.toggleContextMenu);
81
- this.listenTo(this.container, Events.CONTAINER_CLICK, this.hide);
82
- }
83
- }
84
- $('body').on('click', this.hide.bind(this));
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.hide.bind(this));
89
- // @ts-ignore
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 (this.options.contextMenu && this.options.contextMenu.preventShowContextMenu) {
111
- return;
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(this.template({ options: this.menuOptions }));
128
- this.core.$el.append(this.$el);
129
- this.hide();
130
- this.disable();
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
- return this;
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 | media_control}
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 'media_control_dvr';
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.bindCoreEvents();
66
- this.bindContainerEvents();
67
-
68
- if (this.core.activeContainer) {
69
- this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.dvrChanged);
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
- if (this.core.activeContainer) {
85
- this.listenToOnce(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.render);
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.mediaControl.$el.removeClass('live');
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.mediaControl;
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');
@@ -32,7 +32,6 @@ const T = 'plugins.error_screen'
32
32
  /**
33
33
  * Displays a descriptive error in the overlay on top of the player.
34
34
  * @beta
35
- * TODO
36
35
  */
37
36
  export class ErrorScreen extends UICorePlugin {
38
37
  private _retry = 0;
@@ -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 in the LICENSE file.
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
 
@@ -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";
@@ -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