@gcorevideo/player 2.8.2 → 2.10.0

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 (103) hide show
  1. package/README.md +39 -0
  2. package/api-extractor.json +454 -0
  3. package/dist/index.js +1032 -182
  4. package/dist/player.d.ts +407 -0
  5. package/docs/api/index.md +31 -0
  6. package/docs/api/player.dashsettings.md +16 -0
  7. package/docs/api/player.langtag.md +15 -0
  8. package/docs/api/player.md +295 -0
  9. package/docs/api/player.mediatransport.md +15 -0
  10. package/docs/api/player.playbackmodule.md +15 -0
  11. package/docs/api/player.playbacktype.md +16 -0
  12. package/docs/api/player.player._constructor_.md +50 -0
  13. package/docs/api/player.player.attachto.md +56 -0
  14. package/docs/api/player.player.configure.md +58 -0
  15. package/docs/api/player.player.destroy.md +20 -0
  16. package/docs/api/player.player.getcurrenttime.md +22 -0
  17. package/docs/api/player.player.getduration.md +22 -0
  18. package/docs/api/player.player.md +304 -0
  19. package/docs/api/player.player.mute.md +20 -0
  20. package/docs/api/player.player.off.md +72 -0
  21. package/docs/api/player.player.on.md +72 -0
  22. package/docs/api/player.player.pause.md +20 -0
  23. package/docs/api/player.player.play.md +20 -0
  24. package/docs/api/player.player.registerplugin.md +56 -0
  25. package/docs/api/player.player.resize.md +59 -0
  26. package/docs/api/player.player.seek.md +56 -0
  27. package/docs/api/player.player.stop.md +20 -0
  28. package/docs/api/player.player.unmute.md +20 -0
  29. package/docs/api/player.player.unregisterplugin.md +56 -0
  30. package/docs/api/player.playerconfig.autoplay.md +16 -0
  31. package/docs/api/player.playerconfig.dash.md +16 -0
  32. package/docs/api/player.playerconfig.debug.md +16 -0
  33. package/docs/api/player.playerconfig.language.md +16 -0
  34. package/docs/api/player.playerconfig.loop.md +16 -0
  35. package/docs/api/player.playerconfig.md +266 -0
  36. package/docs/api/player.playerconfig.mute.md +16 -0
  37. package/docs/api/player.playerconfig.playbacktype.md +16 -0
  38. package/docs/api/player.playerconfig.prioritytransport.md +16 -0
  39. package/docs/api/player.playerconfig.sources.md +16 -0
  40. package/docs/api/player.playerconfig.strings.md +16 -0
  41. package/docs/api/player.playerdebugsettings.md +20 -0
  42. package/docs/api/player.playerdebugtag.md +15 -0
  43. package/docs/api/player.playerevent.md +116 -0
  44. package/docs/api/player.playereventhandler.md +17 -0
  45. package/docs/api/player.playermediasource.md +18 -0
  46. package/docs/api/player.playermediasourcedesc.md +83 -0
  47. package/docs/api/player.playermediasourcedesc.mimetype.md +16 -0
  48. package/docs/api/player.playermediasourcedesc.source.md +16 -0
  49. package/docs/api/player.playerplugin.md +17 -0
  50. package/docs/api/player.qualitylevel.md +20 -0
  51. package/docs/api/player.translationkey.md +15 -0
  52. package/docs/api/player.translationsettings.md +35 -0
  53. package/docs/api/player.transportpreference.md +17 -0
  54. package/docs/api/player.version.md +27 -0
  55. package/lib/Player.d.ts +83 -5
  56. package/lib/Player.d.ts.map +1 -1
  57. package/lib/Player.js +99 -25
  58. package/lib/constants.d.ts +0 -18
  59. package/lib/constants.d.ts.map +1 -1
  60. package/lib/constants.js +1 -18
  61. package/lib/gcore.types.d.ts +84 -0
  62. package/lib/gcore.types.d.ts.map +1 -0
  63. package/lib/gcore.types.js +9 -0
  64. package/lib/index.d.ts +10 -5
  65. package/lib/index.d.ts.map +1 -1
  66. package/lib/index.js +10 -5
  67. package/lib/internal.types.d.ts +28 -11
  68. package/lib/internal.types.d.ts.map +1 -1
  69. package/lib/playback.types.d.ts +19 -5
  70. package/lib/playback.types.d.ts.map +1 -1
  71. package/lib/plugins/dash-playback/DashPlayback.js +1 -1
  72. package/lib/plugins/hls-playback/HlsPlayback.js +1 -1
  73. package/lib/tsdoc-metadata.json +11 -0
  74. package/lib/types.d.ts +179 -62
  75. package/lib/types.d.ts.map +1 -1
  76. package/lib/types.js +19 -0
  77. package/lib/utils/mediaSources.d.ts +1 -3
  78. package/lib/utils/mediaSources.d.ts.map +1 -1
  79. package/lib/utils/mediaSources.js +0 -9
  80. package/lib/version.d.ts +5 -0
  81. package/lib/version.d.ts.map +1 -1
  82. package/lib/version.js +5 -0
  83. package/package.json +6 -1
  84. package/src/Player.ts +113 -32
  85. package/src/index.ts +11 -5
  86. package/src/internal.types.ts +28 -15
  87. package/src/playback.types.ts +20 -6
  88. package/src/plugins/dash-playback/DashPlayback.ts +1 -1
  89. package/src/plugins/hls-playback/HlsPlayback.ts +1 -1
  90. package/src/types.ts +196 -74
  91. package/src/utils/mediaSources.ts +1 -15
  92. package/src/version.ts +5 -0
  93. package/temp/player.api.json +1950 -0
  94. package/tsconfig.tsbuildinfo +1 -1
  95. package/src/constants.ts +0 -17
  96. package/src/plugins/dash-playback/_DashPlayback.js +0 -688
  97. package/src/trace/LogTracer.ts +0 -23
  98. package/src/trace/SentryTracer.ts +0 -21
  99. package/src/trace/Tracer.ts +0 -27
  100. package/src/trace/index.ts +0 -32
  101. package/src/trace/types.ts +0 -7
  102. package/src/typings/@clappr/plugins.d.ts +0 -23
  103. package/src/utils/Logger.ts +0 -107
@@ -71,12 +71,3 @@ export function buildSourcesPriorityList(sources, priorityTransport = 'auto') {
71
71
  export function unwrapSource(s) {
72
72
  return typeof s === 'string' ? s : s.source;
73
73
  }
74
- export function buildGcoreStreamSourcesList(ms, priorityTransport) {
75
- const sources = {
76
- dash: ms.sourceDash,
77
- master: ms.source,
78
- hls: ms.hlsCmafUrl,
79
- mpegts: ms.hlsMpegtsUrl,
80
- };
81
- return buildSourcesPriorityList(sources, priorityTransport);
82
- }
package/lib/version.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Version information about the gplayer and its main dependencies
3
+ * @returns Version information about the gplayer and its main dependencies
4
+ * @beta
5
+ */
1
6
  export declare function version(): {
2
7
  gplayer: string;
3
8
  clappr: string;
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAGA,wBAAgB,OAAO;;;;;EAOtB"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,OAAO;;;;;EAOtB"}
package/lib/version.js CHANGED
@@ -1,5 +1,10 @@
1
1
  import * as pkg from '../package.json' with { "type": "json" };
2
2
  import * as lock from '../package-lock.json' with { "type": "json" };
3
+ /**
4
+ * Version information about the gplayer and its main dependencies
5
+ * @returns Version information about the gplayer and its main dependencies
6
+ * @beta
7
+ */
3
8
  export function version() {
4
9
  return {
5
10
  gplayer: pkg.version,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.8.2",
3
+ "version": "2.10.0",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -10,6 +10,7 @@
10
10
  "build:1": "npm run build:ts && npm run build:bundle && date",
11
11
  "build:ts": "tsc",
12
12
  "build:bundle": "rollup -c",
13
+ "dev": "nodemon --watch src -e ts --exec \"npm run build:ts && npm run docs\"",
13
14
  "docs": "npm run docs:extract && npm run docs:build",
14
15
  "docs:extract": "api-extractor run --local --verbose",
15
16
  "docs:build": "api-documenter markdown --input-folder=temp --output-folder=docs/api",
@@ -30,17 +31,21 @@
30
31
  },
31
32
  "homepage": "https://github.com/G-Core/gcore-videoplayer-js#readme",
32
33
  "devDependencies": {
34
+ "@microsoft/api-documenter": "^7.26.5",
35
+ "@microsoft/api-extractor": "^7.49.1",
33
36
  "@rollup/plugin-commonjs": "^28.0.1",
34
37
  "@rollup/plugin-json": "^6.1.0",
35
38
  "@rollup/plugin-node-resolve": "^15.3.0",
36
39
  "@types/node": "^22.10.1",
37
40
  "assert": "^2.1.0",
41
+ "nodemon": "^3.1.9",
38
42
  "rollup": "^4.27.4",
39
43
  "rollup-plugin-polyfill-node": "^0.13.0",
40
44
  "typescript": "^5.7.2"
41
45
  },
42
46
  "dependencies": {
43
47
  "@clappr/core": "^0.11.3",
48
+ "@gcorevideo/utils": "^0.0.1",
44
49
  "@sentry/types": "^8.47.0",
45
50
  "dashjs": "^4.7.4",
46
51
  "event-lite": "^1.0.0",
package/src/Player.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  $,
7
7
  Loader,
8
8
  } from '@clappr/core'
9
+ import { reportError, trace } from '@gcorevideo/utils'
9
10
  import assert from 'assert'
10
11
  import EventLite from 'event-lite'
11
12
 
@@ -13,12 +14,8 @@ import type {
13
14
  CorePlayerEvents,
14
15
  CoreOptions,
15
16
  CorePluginOptions,
16
- PlayerMediaSource,
17
17
  } from './internal.types.js'
18
- import type {
19
- PlayerPlugin,
20
- } from './types.js'
21
- import { reportError, trace } from './trace/index.js'
18
+ import type { PlayerMediaSource, PlayerPlugin } from './types.js'
22
19
  import { PlayerConfig, PlayerEvent } from './types.js'
23
20
  import DashPlayback from './plugins/dash-playback/DashPlayback.js'
24
21
  import HlsPlayback from './plugins/hls-playback/HlsPlayback.js'
@@ -30,7 +27,10 @@ import {
30
27
 
31
28
  // TODO implement transport retry/failover and fallback logic
32
29
 
33
- type PlayerEventHandler<T extends PlayerEvent> = () => void
30
+ /**
31
+ * @beta
32
+ */
33
+ export type PlayerEventHandler<T extends PlayerEvent> = () => void
34
34
 
35
35
  const T = 'GPlayer'
36
36
 
@@ -40,18 +40,24 @@ const DEFAULT_OPTIONS: PlayerConfig = {
40
40
  loop: false,
41
41
  mute: false,
42
42
  playbackType: 'vod',
43
- pluginSettings: {},
44
- poster: '',
45
43
  priorityTransport: 'dash',
46
44
  sources: [],
47
45
  strings: {},
48
46
  }
49
47
 
48
+ /**
49
+ * @beta
50
+ */
50
51
  export type PlaybackModule = 'dash' | 'hls' | 'native'
51
52
 
52
53
  type PluginOptions = Record<string, unknown>
53
54
 
54
55
  /**
56
+ * The main component to use in the application code.
57
+ * @remarks
58
+ * The Player object provides very basic API to control playback.
59
+ * To build a sophisticated UI, use the plugins framework to tap into the Clappr core.
60
+ * {@link https://github.com/clappr/clappr/wiki/Architecture}
55
61
  * @beta
56
62
  */
57
63
  export class Player {
@@ -73,23 +79,41 @@ export class Player {
73
79
  this.setConfig(config)
74
80
  }
75
81
 
82
+ /**
83
+ * Adds a listener to a player event
84
+ * @param event - See {@link PlayerEvent}
85
+ * @param handler - See {@link PlayerEventHandler}
86
+ */
76
87
  on<T extends PlayerEvent>(event: T, handler: PlayerEventHandler<T>) {
77
88
  this.emitter.on(event, handler)
78
89
  }
79
90
 
91
+ /**
92
+ * Removes a listener from a player event
93
+ * @param event - See {@link PlayerEvent}
94
+ * @param handler - See {@link PlayerEventHandler}
95
+ */
80
96
  off<T extends PlayerEvent>(event: T, handler: PlayerEventHandler<T>) {
81
97
  this.emitter.off(event, handler)
82
98
  }
83
99
 
100
+ /**
101
+ * Configures the player.
102
+ *
103
+ * Can be called multiple times. Each consequent call extends the previous configuration.
104
+ * After a reconfiguration, if something significant has changed, the must be reinitialized (i.e, a `.destroy()` followed by an `.init()` call).
105
+ *
106
+ * @param config - complete or partial configuration
107
+ */
84
108
  configure(config: Partial<PlayerConfig>) {
85
109
  this.setConfig(config)
86
110
  }
87
111
 
88
- private setConfig(config: Partial<PlayerConfig>) {
89
- this.config = $.extend(true, this.config, config)
90
- }
91
-
92
- async init(playerElement: HTMLElement) {
112
+ /**
113
+ * Initializes the player at the given container element.
114
+ * @param playerElement - DOM element to host the player
115
+ */
116
+ attachTo(playerElement: HTMLElement): void {
93
117
  assert.ok(!this.player, 'Player already initialized')
94
118
  assert.ok(playerElement, 'Player container element is required')
95
119
  if (this.config.debug === 'all' || this.config.debug === 'clappr') {
@@ -114,6 +138,9 @@ export class Player {
114
138
  return this.initPlayer(coreOpts)
115
139
  }
116
140
 
141
+ /**
142
+ * Destroys the player, releasing all resources and removing any DOM elements added.
143
+ */
117
144
  destroy() {
118
145
  trace(`${T} destroy`, {
119
146
  player: !!this.player,
@@ -130,46 +157,100 @@ export class Player {
130
157
  }
131
158
  }
132
159
 
160
+ /**
161
+ * Current playback time in seconds, if appropriate.
162
+ * @returns For live streams, it returns the current time of the current segment.
163
+ */
164
+ getCurrentTime(): number {
165
+ if (!this.player) {
166
+ return 0
167
+ }
168
+ return this.player.getCurrentTime()
169
+ }
170
+
171
+ /**
172
+ * Duration of the current media in seconds, if appropriate.
173
+ * @returns For live streams, it returns the duration of the current segment.
174
+ */
175
+ getDuration(): number {
176
+ if (!this.player) {
177
+ return 0
178
+ }
179
+ return this.player.getDuration()
180
+ }
181
+
182
+ /**
183
+ * Mutes the player.
184
+ */
185
+ mute() {
186
+ this.player?.mute()
187
+ }
188
+
189
+ /**
190
+ * Unmutes the player.
191
+ */
192
+ unmute() {
193
+ this.player?.unmute()
194
+ }
195
+
196
+ /**
197
+ * Pauses playback.
198
+ */
133
199
  pause() {
134
- assert.ok(this.player, 'Player not initialized')
135
- this.player.pause()
200
+ this.player?.pause()
136
201
  }
137
202
 
203
+ /**
204
+ * Starts playback.
205
+ */
138
206
  play() {
139
- assert.ok(this.player, 'Player not initialized')
140
- this.player.play()
207
+ this.player?.play()
141
208
  }
142
209
 
210
+ /**
211
+ * Resizes the player container element and everything within it.
212
+ * @param newSize - new size of the player
213
+ */
143
214
  resize(newSize: { width: number; height: number }) {
144
- if (!this.player) {
145
- trace(`${T} resize not initialized`, { newSize })
146
- return
147
- }
148
- trace(`${T} resize`, {
149
- newSize,
150
- })
151
- this.player.resize(newSize)
215
+ this.player?.resize(newSize)
152
216
  }
153
217
 
154
- seekTo(time: number) {
155
- assert.ok(this.player, 'Player not initialized')
156
- this.player.seek(time)
218
+ /**
219
+ * Seeks to the given time.
220
+ * @param time - time to seek to in seconds
221
+ */
222
+ seek(time: number) {
223
+ this.player?.seek(time)
157
224
  }
158
225
 
226
+ /**
227
+ * Stops playback.
228
+ */
159
229
  stop() {
160
- assert.ok(this.player, 'Player not initialized')
161
- this.player.stop()
230
+ this.player?.stop()
162
231
  }
163
232
 
233
+ /**
234
+ * Registers a plugin.
235
+ * @param plugin - plugin to register
236
+ */
164
237
  static registerPlugin(plugin: PlayerPlugin) {
165
238
  Loader.registerPlugin(plugin)
166
239
  }
167
240
 
241
+ /**
242
+ * Unregisters a plugin.
243
+ * @param plugin - plugin to unregister
244
+ */
168
245
  static unregisterPlugin(plugin: PlayerPlugin) {
169
246
  Loader.unregisterPlugin(plugin)
170
247
  }
171
248
 
172
- private initPlayer(coreOptions: CoreOptions) {
249
+ private setConfig(config: Partial<PlayerConfig>) {
250
+ this.config = $.extend(true, this.config, config)
251
+ }
252
+
253
+ private initPlayer(coreOptions: CoreOptions): void {
173
254
  trace(`${T} initPlayer`, {
174
255
  // TODO selected options
175
256
  })
@@ -321,7 +402,7 @@ export class Player {
321
402
  this.rootNode = rootNode
322
403
 
323
404
  const coreOptions: CoreOptions & PluginOptions = {
324
- ...this.config.pluginSettings,
405
+ ...this.config, // plugin settings
325
406
  allowUserInteraction: true,
326
407
  autoPlay: false,
327
408
  dash: this.config.dash,
package/src/index.ts CHANGED
@@ -1,9 +1,15 @@
1
+ /**
2
+ * Video player for the GCore streaming platform
3
+ *
4
+ * @remarks
5
+ * This package provides a video player for the GCore streaming platform.
6
+ * It is built on top of the Clappr library and provides a framework for building custom integrations.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+
11
+ export { setTracer } from "@gcorevideo/utils";
1
12
  export * from "./Player.js"
2
13
  export * from "./playback.types.js";
3
- export * from "./trace/LogTracer.js";
4
- export * from "./trace/SentryTracer.js";
5
- export * from "./trace/index.js";
6
- export * from "./trace/types.js";
7
14
  export * from "./types.js";
8
- export * from "./utils/Logger.js";
9
15
  export * from "./version.js";
@@ -3,7 +3,8 @@ import type {
3
3
  ContainerPlugin,
4
4
  Playback as ClapprPlayback,
5
5
  } from "@clappr/core";
6
- import { PlaybackType, PlayerDebugTag, StreamMediaSource } from "./types";
6
+
7
+ import { PlaybackType, PlayerDebugTag, PlayerMediaSource } from "./types";
7
8
 
8
9
  type ExternalTrack = {
9
10
  kind?: "subtitles" | "captions";
@@ -18,13 +19,10 @@ type MediacontrolStyles = {
18
19
  buttons?: string;
19
20
  }
20
21
 
21
- export type PlayerMediaSourceDesc = {
22
- mimeType?: string;
23
- source: string;
24
- }
25
-
26
- export type PlayerMediaSource = string | PlayerMediaSourceDesc;
27
-
22
+ /**
23
+ * HLS.js configuration options to use with the HlsPlayback plugin.
24
+ * @beta
25
+ */
28
26
  type HlsjsConfig = {
29
27
  debug?: boolean;
30
28
  startLevel?: number;
@@ -32,7 +30,11 @@ type HlsjsConfig = {
32
30
 
33
31
  type ShakaConfig = Record<string, unknown>;
34
32
 
35
- type CorePlaybackConfig = {
33
+ /**
34
+ * @see {@link https://github.com/clappr/clappr-core?tab=readme-ov-file#playback-configuration | the Clappr playback settings}
35
+ * @beta
36
+ */
37
+ export interface CorePlaybackConfig {
36
38
  // audioOnly: boolean;
37
39
  disableContextMenu?: boolean;
38
40
  controls?: boolean;
@@ -56,6 +58,9 @@ type CorePlaybackConfig = {
56
58
 
57
59
  type ErrorLevel = "FATAL" | "WARN" | "INFO";
58
60
 
61
+ /**
62
+ * @internal
63
+ */
59
64
  export type PlaybackError = {
60
65
  code?: number | string;
61
66
  description: string;
@@ -63,6 +68,9 @@ export type PlaybackError = {
63
68
  level?: ErrorLevel;
64
69
  }
65
70
 
71
+ /**
72
+ * @internal
73
+ */
66
74
  export type CorePlayerEvents = {
67
75
  // TODO event arguments types
68
76
  onReady?: () => void;
@@ -78,13 +86,15 @@ export type CorePlayerEvents = {
78
86
  onSubtitleAvailable?: () => void;
79
87
  }
80
88
 
81
- export type ClapprVersionSpec = {
82
- min: string;
83
- // TODO
84
- }
85
-
89
+ /**
90
+ * @internal
91
+ */
86
92
  export type PlaybackPluginFactory = typeof ClapprPlayback;
87
93
 
94
+ /**
95
+ * For the plugin development
96
+ * @internal
97
+ */
88
98
  export type CorePluginOptions = {
89
99
  core?: CorePlugin[];
90
100
  container?: ContainerPlugin[];
@@ -93,6 +103,10 @@ export type CorePluginOptions = {
93
103
  loadExternalPlaybacksFirst?: boolean;
94
104
  }
95
105
 
106
+ /**
107
+ * For the plugin development
108
+ * @internal
109
+ */
96
110
  export type CoreOptions = {
97
111
  actualLiveTime?: boolean;
98
112
  actualLiveServerTime?: string;
@@ -116,7 +130,6 @@ export type CoreOptions = {
116
130
  maxBufferLength?: number;
117
131
  mediacontrol?: MediacontrolStyles;
118
132
  mimeType?: string;
119
- // multisources: StreamMediaSource[];
120
133
  mute?: boolean;
121
134
  persistConfig?: boolean;
122
135
  preload?: "auto" | "metadata" | "none";
@@ -1,22 +1,36 @@
1
+
2
+ /**
3
+ * For the plugin development
4
+ * @internal
5
+ */
1
6
  export type TimeValue = number;
2
7
 
8
+ /**
9
+ * For the plugin development
10
+ * @internal
11
+ */
3
12
  export type TimePosition = {
4
13
  current: TimeValue;
5
14
  total: TimeValue;
6
15
  }
7
16
 
17
+ /**
18
+ * For the plugin development
19
+ * @internal
20
+ */
8
21
  export type TimeProgress = TimePosition & { start: number; };
9
22
 
23
+ /**
24
+ * For the plugin development
25
+ * @internal
26
+ */
10
27
  export type TimeUpdate = TimePosition & {
11
28
  firstFragDateTime: number;
12
29
  };
13
30
 
14
- export type BitrateInfo = {
15
- bitrate: number;
16
- width: number;
17
- height: number;
18
- }
19
-
31
+ /**
32
+ * @beta
33
+ */
20
34
  export type QualityLevel = {
21
35
  level: number // index
22
36
  width: number
@@ -11,7 +11,7 @@ import DASHJS, {
11
11
  MetricEvent as DashMetricEvent,
12
12
  IManifestInfo,
13
13
  } from 'dashjs'
14
- import { trace } from '../../trace/index.js'
14
+ import { trace } from '@gcorevideo/utils'
15
15
 
16
16
  import { QualityLevel, TimePosition, TimeValue } from '../../playback.types.js'
17
17
 
@@ -18,7 +18,7 @@ import HLSJS, {
18
18
  } from 'hls.js';
19
19
 
20
20
  import { QualityLevel, TimePosition } from '../../playback.types.js';
21
- import { trace } from '../../trace/index.js';
21
+ import { trace } from '@gcorevideo/utils';
22
22
  import { PlaybackType } from '../../types';
23
23
  import { TimerId } from '../../utils/types';
24
24