@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.
- package/dist/core.js +1 -1
- package/dist/index.css +208 -208
- package/dist/index.embed.js +34 -21
- package/dist/index.js +93 -82
- package/docs/api/player.closedcaptionspluginsettings.md +1 -0
- package/docs/api/player.md +9 -0
- package/docs/api/player.mediacontrol.md +16 -0
- package/docs/api/player.thumbnails.md +1 -1
- package/lib/Player.d.ts.map +1 -1
- package/lib/plugins/subtitles/ClosedCaptions.d.ts +6 -2
- package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
- package/lib/plugins/subtitles/ClosedCaptions.js +37 -23
- package/package.json +4 -1
- package/src/Player.ts +12 -12
- package/src/plugins/subtitles/ClosedCaptions.ts +42 -28
- package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +293 -6
- package/tsconfig.tsbuildinfo +1 -1
package/lib/Player.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAEjB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGjE;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,IACjD,CAAC,SAAS,WAAW,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAEjB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGjE;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,IACjD,CAAC,SAAS,WAAW,CAAC,IAAI,GACxB,CAAC,MAAM,CAAC,GACR,CAAC,SAAS,WAAW,CAAC,YAAY,GAClC,CAAC,MAAM,CAAC,GACR,CAAC,SAAS,WAAW,CAAC,UAAU,GAChC,CAAC,YAAY,CAAC,GACd,CAAC,SAAS,WAAW,CAAC,MAAM,GAC5B,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GACnC,CAAC,SAAS,WAAW,CAAC,UAAU,GAChC,CAAC,OAAO,CAAC,GACT,CAAC,SAAS,WAAW,CAAC,KAAK,GAC3B,CAAC,aAAa,CAAC,GACf,EAAE,CAAA;AAEN;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,CACtD,GAAG,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAC1B,IAAI,CAAA;AAeT;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,CAAA;AAI3D;;;;;;;GAOG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO,CAAC,OAAO,CAAqB;IAEpC,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,QAAQ,CAA2B;gBAE/B,MAAM,EAAE,YAAY;IAOhC;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIlE;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAInE;;;;;;;;;OASG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;IAIvC;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,QAAQ,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI;IAgB1C;;OAEG;IACH,OAAO;IAQP;;;;;;OAMG;IACH,cAAc,IAAI,MAAM;IAOxB;;;;;;OAMG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAIrB;;;;;OAKG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;OAIG;IACH,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE;IAyBtC;;OAEG;IACH,IAAI;IAIJ;;OAEG;IACH,MAAM;IAIN;;OAEG;IACH,KAAK;IAIL;;OAEG;IACH,IAAI;IAIJ;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa;IAI7B;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM;IAIjB;;;OAGG;IACH,SAAS,IAAI,MAAM;IAMnB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM;IAMxB;;OAEG;IACH,IAAI;IAIJ;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,uBAAuB;IAgBrD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAOpC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAUnC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAgC;IAE1D,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;YAMJ,MAAM;IAkBpB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,MAAM,CAgCb;IAED,OAAO,CAAC,gBAAgB;IAyCxB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,iBAAiB;CA+B1B"}
|
|
@@ -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
|
|
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
|
|
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;
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
324
|
-
|
|
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
|
-
|
|
329
|
-
if (
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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.
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
426
|
-
|
|
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
|
|
432
|
-
if (
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
|
|
483
|
-
|
|
484
|
-
|
|
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) {
|