@gcorevideo/player 2.30.0 → 2.30.1

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 (34) hide show
  1. package/dist/core.js +65 -21
  2. package/dist/index.css +314 -314
  3. package/dist/index.embed.js +64 -22
  4. package/dist/index.js +65 -23
  5. package/docs/api/player.md +37 -0
  6. package/docs/api/player.player.getplugin.md +59 -0
  7. package/docs/api/player.player.md +14 -0
  8. package/docs/api/player.tokenrefreshoptions.gettoken.md +13 -0
  9. package/docs/api/player.tokenrefreshoptions.ipbound.md +13 -0
  10. package/docs/api/player.tokenrefreshoptions.md +115 -0
  11. package/docs/api/player.tokenrefreshoptions.ontokenrefreshed.md +13 -0
  12. package/docs/api/player.tokenrefreshoptions.refreshleadseconds.md +13 -0
  13. package/docs/api/player.tokenrefreshplugin.md +50 -0
  14. package/docs/api/player.tokenresponse.client_ip.md +13 -0
  15. package/docs/api/player.tokenresponse.expires.md +13 -0
  16. package/docs/api/player.tokenresponse.md +153 -0
  17. package/docs/api/player.tokenresponse.token.md +13 -0
  18. package/docs/api/player.tokenresponse.token_ip.md +13 -0
  19. package/docs/api/player.tokenresponse.url.md +13 -0
  20. package/docs/api/player.tokenresponse.url_ip.md +13 -0
  21. package/lib/playback/hls-playback/HlsPlayback.d.ts +1 -1
  22. package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
  23. package/lib/playback/hls-playback/HlsPlayback.js +23 -20
  24. package/lib/playback/hls-playback/RangesList.d.ts +7 -0
  25. package/lib/playback/hls-playback/RangesList.d.ts.map +1 -0
  26. package/lib/playback/hls-playback/RangesList.js +41 -0
  27. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  28. package/lib/plugins/subtitles/ClosedCaptions.js +0 -2
  29. package/package.json +1 -1
  30. package/src/playback/hls-playback/HlsPlayback.ts +40 -37
  31. package/src/playback/hls-playback/RangesList.ts +45 -0
  32. package/src/playback/hls-playback/__tests__/RangesList.test.ts +60 -0
  33. package/src/plugins/subtitles/ClosedCaptions.ts +0 -5
  34. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,50 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenRefreshPlugin](./player.tokenrefreshplugin.md)
4
+
5
+ ## TokenRefreshPlugin class
6
+
7
+ `PLUGIN` — automatic token refresh for Gcore protected-content streams.
8
+
9
+ Supports all three playback engines:
10
+
11
+ \| Engine \| Mechanism \| Interruption \| \|\-\-\-\-\-\---\|\-\-\-\-\-\-\-\-\---\|\-\-\-\-\-\-\-\-\-\-\-\---\| \| \*\*hls.js\*\* \| Custom loader rewrites every request URL \| None \| \| \*\*dash.js\*\* \| `addRequestInterceptor` rewrites every request URL \| None \| \| \*\*Native `<video>`<!-- -->\*\* (Safari ≤ iOS 14.4) \| Source reload + seek restore \| Brief \|
12
+
13
+ **Signature:**
14
+
15
+ ```typescript
16
+ export declare class TokenRefreshPlugin extends CorePlugin
17
+ ```
18
+ **Extends:** CorePlugin
19
+
20
+ ## Remarks
21
+
22
+ Register the plugin once before creating any player instance:
23
+
24
+ ```ts
25
+ import { Player, TokenRefreshPlugin } from '@gcorevideo/player'
26
+ Player.registerPlugin(TokenRefreshPlugin)
27
+ ```
28
+ Then pass `tokenRefresh` in `PlayerConfig`<!-- -->:
29
+
30
+ ```ts
31
+ const player = new Player({
32
+ sources: [{ source: initialUrl, mimeType: 'application/x-mpegURL' }],
33
+ tokenRefresh: {
34
+ getToken: () => fetch('https://…/token').then(r => r.json()),
35
+ ipBound: false,
36
+ refreshLeadSeconds: 5,
37
+ onTokenRefreshed: (data) => console.log('new token expires', data.expires),
38
+ },
39
+ })
40
+ ```
41
+
42
+ ## Example
43
+
44
+ Safari native — opt-in Service Worker for fully seamless refresh:
45
+
46
+ ```js
47
+ // Register token-refresh-sw.js (see example/ directory)
48
+ // and omit tokenRefresh config — the SW handles rewriting.
49
+ ```
50
+
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenResponse](./player.tokenresponse.md) &gt; [client\_ip](./player.tokenresponse.client_ip.md)
4
+
5
+ ## TokenResponse.client\_ip property
6
+
7
+ Client IP address (informational)
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ client_ip: string;
13
+ ```
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenResponse](./player.tokenresponse.md) &gt; [expires](./player.tokenresponse.expires.md)
4
+
5
+ ## TokenResponse.expires property
6
+
7
+ Unix timestamp (seconds) when both tokens expire
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ expires: number;
13
+ ```
@@ -0,0 +1,153 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenResponse](./player.tokenresponse.md)
4
+
5
+ ## TokenResponse interface
6
+
7
+ Response shape expected from your token-refresh API endpoint.
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ export interface TokenResponse
13
+ ```
14
+
15
+ ## Properties
16
+
17
+ <table><thead><tr><th>
18
+
19
+ Property
20
+
21
+
22
+ </th><th>
23
+
24
+ Modifiers
25
+
26
+
27
+ </th><th>
28
+
29
+ Type
30
+
31
+
32
+ </th><th>
33
+
34
+ Description
35
+
36
+
37
+ </th></tr></thead>
38
+ <tbody><tr><td>
39
+
40
+ [client\_ip](./player.tokenresponse.client_ip.md)
41
+
42
+
43
+ </td><td>
44
+
45
+
46
+ </td><td>
47
+
48
+ string
49
+
50
+
51
+ </td><td>
52
+
53
+ Client IP address (informational)
54
+
55
+
56
+ </td></tr>
57
+ <tr><td>
58
+
59
+ [expires](./player.tokenresponse.expires.md)
60
+
61
+
62
+ </td><td>
63
+
64
+
65
+ </td><td>
66
+
67
+ number
68
+
69
+
70
+ </td><td>
71
+
72
+ Unix timestamp (seconds) when both tokens expire
73
+
74
+
75
+ </td></tr>
76
+ <tr><td>
77
+
78
+ [token\_ip](./player.tokenresponse.token_ip.md)
79
+
80
+
81
+ </td><td>
82
+
83
+
84
+ </td><td>
85
+
86
+ string
87
+
88
+
89
+ </td><td>
90
+
91
+ IP-bound secure token
92
+
93
+
94
+ </td></tr>
95
+ <tr><td>
96
+
97
+ [token](./player.tokenresponse.token.md)
98
+
99
+
100
+ </td><td>
101
+
102
+
103
+ </td><td>
104
+
105
+ string
106
+
107
+
108
+ </td><td>
109
+
110
+ Plain (non-IP-bound) secure token
111
+
112
+
113
+ </td></tr>
114
+ <tr><td>
115
+
116
+ [url\_ip](./player.tokenresponse.url_ip.md)
117
+
118
+
119
+ </td><td>
120
+
121
+
122
+ </td><td>
123
+
124
+ string
125
+
126
+
127
+ </td><td>
128
+
129
+ Ready-to-use HLS master playlist URL with IP-bound token embedded
130
+
131
+
132
+ </td></tr>
133
+ <tr><td>
134
+
135
+ [url](./player.tokenresponse.url.md)
136
+
137
+
138
+ </td><td>
139
+
140
+
141
+ </td><td>
142
+
143
+ string
144
+
145
+
146
+ </td><td>
147
+
148
+ Ready-to-use HLS master playlist URL with plain token embedded
149
+
150
+
151
+ </td></tr>
152
+ </tbody></table>
153
+
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenResponse](./player.tokenresponse.md) &gt; [token](./player.tokenresponse.token.md)
4
+
5
+ ## TokenResponse.token property
6
+
7
+ Plain (non-IP-bound) secure token
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ token: string;
13
+ ```
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenResponse](./player.tokenresponse.md) &gt; [token\_ip](./player.tokenresponse.token_ip.md)
4
+
5
+ ## TokenResponse.token\_ip property
6
+
7
+ IP-bound secure token
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ token_ip: string;
13
+ ```
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenResponse](./player.tokenresponse.md) &gt; [url](./player.tokenresponse.url.md)
4
+
5
+ ## TokenResponse.url property
6
+
7
+ Ready-to-use HLS master playlist URL with plain token embedded
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ url: string;
13
+ ```
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [TokenResponse](./player.tokenresponse.md) &gt; [url\_ip](./player.tokenresponse.url_ip.md)
4
+
5
+ ## TokenResponse.url\_ip property
6
+
7
+ Ready-to-use HLS master playlist URL with IP-bound token embedded
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ url_ip: string;
13
+ ```
@@ -5,7 +5,6 @@ import { BasePlayback } from '../BasePlayback.js';
5
5
  import { AudioTrack } from '@clappr/core/types/base/playback/playback.js';
6
6
  import { VTTCueInfo } from '../types.js';
7
7
  export default class HlsPlayback extends BasePlayback {
8
- private _ccTracksUpdated;
9
8
  private _currentFragment;
10
9
  private _currentLevel;
11
10
  private _durationExcludesAfterLiveSyncPoint;
@@ -33,6 +32,7 @@ export default class HlsPlayback extends BasePlayback {
33
32
  id: string;
34
33
  }) => void) | null;
35
34
  private cues;
35
+ private cuesByTrack;
36
36
  private currentCueId;
37
37
  /**
38
38
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"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"}
@@ -9,13 +9,13 @@ import { PlaybackErrorCode, } from '../../playback.types.js';
9
9
  import { isHlsSource } from '../../utils/mediaSources.js';
10
10
  import { BasePlayback } from '../BasePlayback.js';
11
11
  import { CLAPPR_VERSION } from '../../build.js';
12
+ import { RangesList } from './RangesList.js';
12
13
  const { now } = Utils;
13
14
  const AUTO = -1;
14
15
  const DEFAULT_RECOVER_ATTEMPTS = 16;
15
16
  Events.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
16
17
  const T = 'playback.hls';
17
18
  export default class HlsPlayback extends BasePlayback {
18
- _ccTracksUpdated = false;
19
19
  _currentFragment = null;
20
20
  _currentLevel = null;
21
21
  _durationExcludesAfterLiveSyncPoint = false;
@@ -40,7 +40,8 @@ export default class HlsPlayback extends BasePlayback {
40
40
  _timeUpdateTimer = null;
41
41
  oncueenter = null;
42
42
  oncueexit = null;
43
- cues = []; // TODO check the list size and use BST if needed
43
+ cues = null;
44
+ cuesByTrack = {};
44
45
  currentCueId = null;
45
46
  /**
46
47
  * @internal
@@ -237,7 +238,6 @@ export default class HlsPlayback extends BasePlayback {
237
238
  }
238
239
  this._manifestParsed = false;
239
240
  // this._ccIsSetup = false
240
- this._ccTracksUpdated = false;
241
241
  this._setInitialState();
242
242
  this._hls.destroy();
243
243
  this._hls = null;
@@ -291,12 +291,20 @@ export default class HlsPlayback extends BasePlayback {
291
291
  this._hls.on(HlsEvents.AUDIO_TRACK_SWITCHED, (evt, data) => this._onAudioTrackSwitched(evt, data));
292
292
  this._hls.on(HlsEvents.CUES_PARSED, (evt, data) => {
293
293
  data.cues?.forEach((cue) => {
294
- this.cues.push({
294
+ if (!this.cues) {
295
+ const trackId = this._hls.subtitleTrack;
296
+ if (!this.cuesByTrack[trackId]) {
297
+ this.cuesByTrack[trackId] = new RangesList();
298
+ }
299
+ this.cues = this.cuesByTrack[trackId];
300
+ }
301
+ const cueInfo = {
295
302
  id: cue.id,
296
303
  start: cue.startTime,
297
304
  end: cue.endTime,
298
305
  text: cue.text,
299
- });
306
+ };
307
+ this.cues.insert(cue.startTime, cue.endTime, cueInfo);
300
308
  });
301
309
  });
302
310
  this.bindCustomListeners();
@@ -523,7 +531,7 @@ export default class HlsPlayback extends BasePlayback {
523
531
  }
524
532
  }
525
533
  reload() {
526
- this.cues = [];
534
+ this.cues = null;
527
535
  this.currentCueId = null;
528
536
  this._hls?.startLoad(-1);
529
537
  }
@@ -588,9 +596,7 @@ export default class HlsPlayback extends BasePlayback {
588
596
  }
589
597
  triggerCues() {
590
598
  const currentTime = this.getCurrentTime();
591
- // const cues = Object.values(this.cues)
592
- // TODO build a search tree
593
- const cue = this.cues.find((cue) => currentTime >= cue.start && currentTime <= cue.end);
599
+ const cue = this.cues?.find(currentTime);
594
600
  if (cue) {
595
601
  this.currentCueId = cue.id;
596
602
  this.oncueenter?.(cue);
@@ -634,20 +640,14 @@ export default class HlsPlayback extends BasePlayback {
634
640
  destroy() {
635
641
  this._stopTimeUpdateTimer();
636
642
  this._destroyHLSInstance();
643
+ this.cues = null;
644
+ this.cuesByTrack = {};
637
645
  return super.destroy();
638
646
  }
639
647
  _updatePlaybackType(evt, data) {
640
648
  const prevPlaybackType = this._playbackType;
641
649
  this._playbackType = (data.details.live ? Playback.LIVE : Playback.VOD);
642
650
  this._onLevelUpdated(evt, data);
643
- // Live stream subtitle tracks detection hack (may not immediately available)
644
- // if (
645
- // this._ccTracksUpdated &&
646
- // this._playbackType === Playback.LIVE &&
647
- // this.hasClosedCaptionsTracks
648
- // ) {
649
- // this._onSubtitleLoaded()
650
- // }
651
651
  if (prevPlaybackType !== this._playbackType) {
652
652
  this._updateSettings();
653
653
  }
@@ -868,7 +868,10 @@ export default class HlsPlayback extends BasePlayback {
868
868
  return;
869
869
  }
870
870
  this._hls.subtitleTrack = id;
871
- this.cues = [];
871
+ if (!this.cuesByTrack[id]) {
872
+ this.cuesByTrack[id] = new RangesList();
873
+ }
874
+ this.cues = this.cuesByTrack[id];
872
875
  }
873
876
  /**
874
877
  * @override
@@ -877,7 +880,7 @@ export default class HlsPlayback extends BasePlayback {
877
880
  return this.getTextTracks();
878
881
  }
879
882
  getTextTracks() {
880
- return this._hls?.subtitleTracks.map((t) => ({
883
+ return (this._hls?.subtitleTracks.map((t) => ({
881
884
  id: t.id,
882
885
  name: t.name,
883
886
  track: {
@@ -885,7 +888,7 @@ export default class HlsPlayback extends BasePlayback {
885
888
  label: t.name,
886
889
  language: t.lang,
887
890
  },
888
- })) || [];
891
+ })) || []);
889
892
  }
890
893
  }
891
894
  HlsPlayback.canPlay = function (resource, mimeType) {
@@ -0,0 +1,7 @@
1
+ export declare class RangesList<T> {
2
+ private items;
3
+ insert(start: number, end: number, value: T): void;
4
+ find(position: number): T | null;
5
+ private findIndex;
6
+ }
7
+ //# sourceMappingURL=RangesList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RangesList.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/RangesList.ts"],"names":[],"mappings":"AACA,qBAAa,UAAU,CAAC,CAAC;IAEvB,OAAO,CAAC,KAAK,CAAkC;IAE/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAK3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAShC,OAAO,CAAC,SAAS;CAyBlB"}
@@ -0,0 +1,41 @@
1
+ export class RangesList {
2
+ // TODO write an efficient implementation
3
+ items = [];
4
+ insert(start, end, value) {
5
+ const index = this.findIndex((start + end) / 2);
6
+ this.items.splice(index, 0, [start, end, value]);
7
+ }
8
+ find(position) {
9
+ const index = this.findIndex(position);
10
+ const item = this.items[index];
11
+ if (!item || item[0] > position || item[1] < position) {
12
+ return null;
13
+ }
14
+ return item[2];
15
+ }
16
+ findIndex(position) {
17
+ let low = 0;
18
+ let high = this.items.length;
19
+ let index = 0;
20
+ while (low < high) {
21
+ index = low + Math.floor((high - low) / 2);
22
+ const item = this.items[index];
23
+ if (item[0] > position) {
24
+ if (index === low) {
25
+ return index;
26
+ }
27
+ high = index;
28
+ continue;
29
+ }
30
+ if (item[1] <= position) {
31
+ if (index === high - 1) {
32
+ return index + 1;
33
+ }
34
+ low = index + 1;
35
+ continue;
36
+ }
37
+ break;
38
+ }
39
+ return index;
40
+ }
41
+ }
@@ -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,+BAA+B,CAAA;AAmBtC;;;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;IAuBnB,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,IAAI;IAcJ;;OAEG;IACH,IAAI;IAgBJ,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IAmCf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,sBAAsB;IAwB9B,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
+ {"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,+BAA+B,CAAA;AAgBtC;;;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;IAuBnB,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,IAAI;IAcJ;;OAEG;IACH,IAAI;IAgBJ,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IAmCf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,sBAAsB;IAwB9B,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"}
@@ -331,8 +331,6 @@ export class ClosedCaptions extends UICorePlugin {
331
331
  // event.target does not exist for some reason in tests
332
332
  const id = Number((event.target ?? event.currentTarget).dataset?.item ??
333
333
  '-1');
334
- // TODO review, make configurable, and emit event in addition
335
- // localStorage.setItem(LOCAL_STORAGE_CC_ID, id) // TODO store language instead?
336
334
  this.userSelectedItemId = id;
337
335
  this.selectItem(this.findById(id));
338
336
  this.hideMenu();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.30.0",
3
+ "version": "2.30.1",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",