@gcorevideo/player 2.28.30 → 2.28.35

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,9 @@ export type ClosedCaptionsPluginSettings = {
11
11
  language?: string;
12
12
  /**
13
13
  * Whether to use builtin subtitles.
14
+ *
15
+ * native: video player element renders the subtitles
16
+ * custom: plugin manages the subtitles rendition
14
17
  */
15
18
  mode?: 'native' | 'custom';
16
19
  };
@@ -50,9 +53,10 @@ export type ClosedCaptionsPluginSettings = {
50
53
  * ```
51
54
  */
52
55
  export declare class ClosedCaptions extends UICorePlugin {
53
- private isPreselectedApplied;
56
+ private isSelectedApplied;
54
57
  private active;
55
58
  private open;
59
+ private userSelectedItemId;
56
60
  private track;
57
61
  private tracks;
58
62
  private $line;
@@ -116,7 +120,7 @@ export declare class ClosedCaptions extends UICorePlugin {
116
120
  private findById;
117
121
  private selectItem;
118
122
  private onItemSelect;
119
- private applyPreselectedSubtitles;
123
+ private applySelectedSubtitles;
120
124
  private hideMenu;
121
125
  private toggleMenu;
122
126
  private setKeepVisible;
@@ -1 +1 @@
1
- {"version":3,"file":"ClosedCaptions.d.ts","sourceRoot":"","sources":["../../../src/plugins/subtitles/ClosedCaptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAwB,MAAM,cAAc,CAAA;AAOzE,OAAO,sCAAsC,CAAA;AAkB7C;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC3B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,oBAAoB,CAAQ;IAEpC,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,KAAK,CAA6B;IAE1C,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,KAAK,CAA2B;IAExC;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEhE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAE3D;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED,OAAO,KAAK,mBAAmB,GAI9B;IAED,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACM,UAAU;IAWnB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,IAAI;IAYJ;;OAEG;IACH,IAAI;IAiBJ,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IA+Bf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK;IAOb,OAAO,KAAK,kBAAkB,GAO7B;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,YAAY,QAEvB;IAED,OAAO,KAAK,aAAa,QAMxB;IAED,OAAO,CAAC,SAAS,CAA+C;CACjE"}
1
+ {"version":3,"file":"ClosedCaptions.d.ts","sourceRoot":"","sources":["../../../src/plugins/subtitles/ClosedCaptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAwB,MAAM,cAAc,CAAA;AAOzE,OAAO,sCAAsC,CAAA;AAmB7C;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC3B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,kBAAkB,CAAa;IAEvC,OAAO,CAAC,KAAK,CAA6B;IAE1C,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,KAAK,CAA2B;IAExC;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEhE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAE3D;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED,OAAO,KAAK,mBAAmB,GAI9B;IAED,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACM,UAAU;IAWnB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,IAAI;IAYJ;;OAEG;IACH,IAAI;IAiBJ,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IA+Bf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,sBAAsB;IAuB9B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK;IAOb,OAAO,KAAK,kBAAkB,GAO7B;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,YAAY,QAEvB;IAED,OAAO,KAAK,aAAa,QAMxB;IAED,OAAO,CAAC,SAAS,CAA+C;CACjE"}
@@ -1,5 +1,5 @@
1
1
  import { Events, UICorePlugin, Browser, template, $ } from '@clappr/core';
2
- import { reportError, trace } from '@gcorevideo/utils';
2
+ import { reportError } from '@gcorevideo/utils';
3
3
  import assert from 'assert';
4
4
  import { CLAPPR_VERSION } from '../../build.js';
5
5
  import '../../../assets/subtitles/style.scss';
@@ -11,7 +11,8 @@ import { isFullscreen } from '../utils/fullscreen.js';
11
11
  import { ExtendedEvents } from '../media-control/MediaControl.js';
12
12
  import { mediaControlClickaway } from '../../utils/clickaway.js';
13
13
  const VERSION = '2.19.14';
14
- const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
14
+ // TODO review
15
+ // const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected'
15
16
  const T = 'plugins.cc';
16
17
  /**
17
18
  * `PLUGIN` that provides a UI to select the subtitles when available.
@@ -49,9 +50,10 @@ const T = 'plugins.cc';
49
50
  * ```
50
51
  */
51
52
  export class ClosedCaptions extends UICorePlugin {
52
- isPreselectedApplied = false;
53
+ isSelectedApplied = false;
53
54
  active = false;
54
55
  open = false;
56
+ userSelectedItemId = -1;
55
57
  track = null;
56
58
  tracks = [];
57
59
  $line = null;
@@ -149,10 +151,9 @@ export class ClosedCaptions extends UICorePlugin {
149
151
  video.classList.remove('ios-fullscreen');
150
152
  }
151
153
  });
152
- this.isPreselectedApplied = false;
154
+ this.isSelectedApplied = false;
153
155
  }
154
156
  onPlaybackReady() {
155
- trace(`${T} onPlaybackReady`);
156
157
  this.core.activePlayback.oncueenter = (e) => {
157
158
  this.setSubtitleText(e.text);
158
159
  };
@@ -173,7 +174,7 @@ export class ClosedCaptions extends UICorePlugin {
173
174
  this.activateTrack(id);
174
175
  }
175
176
  activateTrack(id) {
176
- if (['dash', 'hls'].includes(this.core.activePlayback?.name)) {
177
+ if (this.core.activePlayback && ['dash', 'hls'].includes(this.core.activePlayback.name)) {
177
178
  this.core.activePlayback.setTextTrack(id);
178
179
  return;
179
180
  }
@@ -211,7 +212,7 @@ export class ClosedCaptions extends UICorePlugin {
211
212
  try {
212
213
  // TODO ensure to apply only once
213
214
  this.currentTracks = this.core.activePlayback.closedCaptionsTracks;
214
- this.applyPreselectedSubtitles();
215
+ this.applySelectedSubtitles();
215
216
  this.render();
216
217
  }
217
218
  catch (error) {
@@ -318,22 +319,36 @@ export class ClosedCaptions extends UICorePlugin {
318
319
  }
319
320
  onItemSelect(event) {
320
321
  // event.target does not exist for some reason in tests
321
- const id = (event.target ?? event.currentTarget).dataset?.item ??
322
- '-1';
323
- localStorage.setItem(LOCAL_STORAGE_CC_ID, id); // TODO store language instead?
324
- this.selectItem(this.findById(Number(id)));
322
+ const id = Number((event.target ?? event.currentTarget).dataset?.item ??
323
+ '-1');
324
+ // TODO review, make configurable, and emit event in addition
325
+ // localStorage.setItem(LOCAL_STORAGE_CC_ID, id) // TODO store language instead?
326
+ this.userSelectedItemId = id;
327
+ this.selectItem(this.findById(id));
325
328
  this.hideMenu();
326
329
  return false;
327
330
  }
328
- applyPreselectedSubtitles() {
329
- if (!this.isPreselectedApplied) {
330
- this.isPreselectedApplied = true;
331
- // if the language is undefined, then let the engine decide
332
- // to hide the subtitles forcefully, set the language to 'none'
333
- setTimeout(() => {
334
- this.selectItem(this.tracks.find((t) => this.isPreselectedLanguage(t.track.language)) ?? null);
335
- }, 0);
331
+ applySelectedSubtitles() {
332
+ if (this.isSelectedApplied) {
333
+ return;
334
+ }
335
+ this.isSelectedApplied = true;
336
+ // If user selected a language, activate that
337
+ // Otherwise, if there is no configured language, then let the engine decide
338
+ // To hide the subtitles initially forcefully, set the language to 'none'
339
+ let matcher;
340
+ if (this.userSelectedItemId !== -1) {
341
+ matcher = (track) => track.id === this.userSelectedItemId;
342
+ }
343
+ else if (this.preselectedLanguage) {
344
+ matcher = (track) => this.isPreselectedLanguage(track.track.language);
345
+ }
346
+ else {
347
+ return;
336
348
  }
349
+ setTimeout(() => {
350
+ this.selectItem(this.tracks.find(matcher) ?? null);
351
+ }, 0);
337
352
  }
338
353
  hideMenu() {
339
354
  this.open = false;
@@ -367,10 +382,9 @@ export class ClosedCaptions extends UICorePlugin {
367
382
  return this.$el.find('#gplayer-cc-menu li'); // TODO fix semantically
368
383
  }
369
384
  selectSubtitles() {
370
- const trackId = this.currentTrack?.id ?? -1;
371
- // TODO find out if this is needed
372
- this.core.activePlayback.closedCaptionsTrackId = trackId;
373
- // this.core.activePlayback.closedCaptionsTrackId = -1
385
+ if (this.currentTrack) {
386
+ this.core.activePlayback.closedCaptionsTrackId = this.currentTrack.id;
387
+ }
374
388
  }
375
389
  getSubtitleText(track) {
376
390
  const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.28.30",
3
+ "version": "2.28.35",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -66,5 +66,8 @@
66
66
  "human-format": "^1.2.1",
67
67
  "mousetrap": "^1.6.5",
68
68
  "videojs-vtt.js": "^0.15.5"
69
+ },
70
+ "overrides": {
71
+ "ua-parser-js": "^1.0.0"
69
72
  }
70
73
  }
package/src/Player.ts CHANGED
@@ -32,18 +32,18 @@ import { SourceController } from './plugins/source-controller/SourceController.j
32
32
  */
33
33
  export type PlayerEventParams<E extends PlayerEvent> =
34
34
  E extends PlayerEvent.Seek
35
- ? [number]
36
- : E extends PlayerEvent.VolumeUpdate
37
- ? [number]
38
- : E extends PlayerEvent.TimeUpdate
39
- ? [TimePosition]
40
- : E extends PlayerEvent.Resize
41
- ? [{ width: number; height: number }]
42
- : E extends PlayerEvent.Fullscreen
43
- ? [boolean]
44
- : E extends PlayerEvent.Error
45
- ? [PlaybackError]
46
- : []
35
+ ? [number]
36
+ : E extends PlayerEvent.VolumeUpdate
37
+ ? [number]
38
+ : E extends PlayerEvent.TimeUpdate
39
+ ? [TimePosition]
40
+ : E extends PlayerEvent.Resize
41
+ ? [{ width: number; height: number }]
42
+ : E extends PlayerEvent.Fullscreen
43
+ ? [boolean]
44
+ : E extends PlayerEvent.Error
45
+ ? [PlaybackError]
46
+ : []
47
47
 
48
48
  /**
49
49
  * Type of a listener callback function for a player event.
@@ -1,5 +1,5 @@
1
1
  import { Events, UICorePlugin, Browser, template, $ } from '@clappr/core'
2
- import { reportError, trace } from '@gcorevideo/utils'
2
+ import { reportError } from '@gcorevideo/utils'
3
3
  import assert from 'assert'
4
4
 
5
5
  import { CLAPPR_VERSION } from '../../build.js'
@@ -19,7 +19,8 @@ import { VTTCueInfo } from '../../playback.types.js'
19
19
 
20
20
  const VERSION: string = '2.19.14'
21
21
 
22
- const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected'
22
+ // TODO review
23
+ // const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected'
23
24
 
24
25
  const T = 'plugins.cc'
25
26
 
@@ -35,6 +36,9 @@ export type ClosedCaptionsPluginSettings = {
35
36
 
36
37
  /**
37
38
  * Whether to use builtin subtitles.
39
+ *
40
+ * native: video player element renders the subtitles
41
+ * custom: plugin manages the subtitles rendition
38
42
  */
39
43
  mode?: 'native' | 'custom'
40
44
  }
@@ -75,12 +79,14 @@ export type ClosedCaptionsPluginSettings = {
75
79
  * ```
76
80
  */
77
81
  export class ClosedCaptions extends UICorePlugin {
78
- private isPreselectedApplied = false
82
+ private isSelectedApplied = false
79
83
 
80
84
  private active = false
81
85
 
82
86
  private open = false
83
87
 
88
+ private userSelectedItemId: number = -1
89
+
84
90
  private track: TextTrackItem | null = null
85
91
 
86
92
  private tracks: TextTrackItem[] = []
@@ -223,11 +229,10 @@ export class ClosedCaptions extends UICorePlugin {
223
229
  }
224
230
  })
225
231
 
226
- this.isPreselectedApplied = false
232
+ this.isSelectedApplied = false
227
233
  }
228
234
 
229
235
  private onPlaybackReady() {
230
- trace(`${T} onPlaybackReady`)
231
236
  this.core.activePlayback.oncueenter = (e: VTTCueInfo) => {
232
237
  this.setSubtitleText(e.text)
233
238
  }
@@ -251,7 +256,7 @@ export class ClosedCaptions extends UICorePlugin {
251
256
  }
252
257
 
253
258
  private activateTrack(id: number) {
254
- if (['dash', 'hls'].includes(this.core.activePlayback?.name)) {
259
+ if (this.core.activePlayback && ['dash', 'hls'].includes(this.core.activePlayback.name)) {
255
260
  this.core.activePlayback.setTextTrack(id)
256
261
  return
257
262
  }
@@ -289,7 +294,7 @@ export class ClosedCaptions extends UICorePlugin {
289
294
  try {
290
295
  // TODO ensure to apply only once
291
296
  this.currentTracks = this.core.activePlayback.closedCaptionsTracks
292
- this.applyPreselectedSubtitles()
297
+ this.applySelectedSubtitles()
293
298
  this.render()
294
299
  } catch (error) {
295
300
  reportError(error)
@@ -418,29 +423,40 @@ export class ClosedCaptions extends UICorePlugin {
418
423
 
419
424
  private onItemSelect(event: MouseEvent) {
420
425
  // event.target does not exist for some reason in tests
421
- const id =
426
+ const id = Number(
422
427
  ((event.target ?? event.currentTarget) as HTMLElement).dataset?.item ??
423
- '-1'
428
+ '-1',
429
+ )
424
430
 
425
- localStorage.setItem(LOCAL_STORAGE_CC_ID, id) // TODO store language instead?
426
- this.selectItem(this.findById(Number(id)))
431
+ // TODO review, make configurable, and emit event in addition
432
+ // localStorage.setItem(LOCAL_STORAGE_CC_ID, id) // TODO store language instead?
433
+ this.userSelectedItemId = id
434
+ this.selectItem(this.findById(id))
427
435
  this.hideMenu()
428
436
  return false
429
437
  }
430
438
 
431
- private applyPreselectedSubtitles() {
432
- if (!this.isPreselectedApplied) {
433
- this.isPreselectedApplied = true
434
- // if the language is undefined, then let the engine decide
435
- // to hide the subtitles forcefully, set the language to 'none'
436
- setTimeout(() => {
437
- this.selectItem(
438
- this.tracks.find((t) =>
439
- this.isPreselectedLanguage(t.track.language),
440
- ) ?? null,
441
- )
442
- }, 0)
439
+ private applySelectedSubtitles() {
440
+ if (this.isSelectedApplied) {
441
+ return;
442
+ }
443
+ this.isSelectedApplied = true
444
+ // If user selected a language, activate that
445
+ // Otherwise, if there is no configured language, then let the engine decide
446
+ // To hide the subtitles initially forcefully, set the language to 'none'
447
+ let matcher: (track: TextTrackItem) => boolean;
448
+ if (this.userSelectedItemId !== -1) {
449
+ matcher = (track: TextTrackItem) => track.id === this.userSelectedItemId;
450
+ } else if (this.preselectedLanguage) {
451
+ matcher = (track: TextTrackItem) => this.isPreselectedLanguage(track.track.language);
452
+ } else {
453
+ return;
443
454
  }
455
+ setTimeout(() => {
456
+ this.selectItem(
457
+ this.tracks.find(matcher) ?? null,
458
+ )
459
+ }, 0)
444
460
  }
445
461
 
446
462
  private hideMenu() {
@@ -479,11 +495,9 @@ export class ClosedCaptions extends UICorePlugin {
479
495
  }
480
496
 
481
497
  private selectSubtitles() {
482
- const trackId = this.currentTrack?.id ?? -1
483
-
484
- // TODO find out if this is needed
485
- this.core.activePlayback.closedCaptionsTrackId = trackId
486
- // this.core.activePlayback.closedCaptionsTrackId = -1
498
+ if (this.currentTrack) {
499
+ this.core.activePlayback.closedCaptionsTrackId = this.currentTrack.id
500
+ }
487
501
  }
488
502
 
489
503
  private getSubtitleText(track: TextTrack) {