@gcorevideo/player 2.28.24 → 2.28.25

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.
@@ -13186,6 +13186,13 @@ class DashPlayback extends BasePlayback {
13186
13186
  this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack$1));
13187
13187
  }
13188
13188
  }
13189
+ /**
13190
+ * @override
13191
+ */
13192
+ _handleTextTrackChange() {
13193
+ super._handleTextTrackChange();
13194
+ this._dash?.setTextTrack(this.closedCaptionsTrackId);
13195
+ }
13189
13196
  }
13190
13197
  DashPlayback.canPlay = function (resource, mimeType) {
13191
13198
  if (!isDashSource(resource, mimeType)) {
@@ -58491,6 +58498,12 @@ class ClosedCaptions extends UICorePlugin {
58491
58498
  return (this.core.options.cc?.language ??
58492
58499
  this.core.options.subtitles?.language);
58493
58500
  }
58501
+ isPreselectedLanguage(language) {
58502
+ if (!this.preselectedLanguage) {
58503
+ return false;
58504
+ }
58505
+ return language.startsWith(this.preselectedLanguage);
58506
+ }
58494
58507
  /**
58495
58508
  * @internal
58496
58509
  */
@@ -58550,12 +58563,15 @@ class ClosedCaptions extends UICorePlugin {
58550
58563
  this.applyTracks();
58551
58564
  this.mount();
58552
58565
  }
58553
- onSubtitleChanged({ id: _ }) {
58566
+ onSubtitleChanged({ id: changedId }) {
58554
58567
  // ignoring the subtitle selected by the playback engine or user agent
58555
58568
  const id = this.track?.id ?? -1;
58556
58569
  if (id === -1) {
58557
58570
  this.clearSubtitleText();
58558
58571
  }
58572
+ this.activateTrack(id);
58573
+ }
58574
+ activateTrack(id) {
58559
58575
  for (const track of this.tracks) {
58560
58576
  if (track.id === id) {
58561
58577
  if (this.useNativeSubtitles) {
@@ -58702,7 +58718,10 @@ class ClosedCaptions extends UICorePlugin {
58702
58718
  selectItem(item) {
58703
58719
  this.clearSubtitleText();
58704
58720
  this.track = item;
58721
+ const trackId = item?.id ?? -1;
58722
+ this.core.activePlayback.closedCaptionsTrackId = trackId;
58705
58723
  this.updateSelection();
58724
+ this.activateTrack(trackId);
58706
58725
  }
58707
58726
  onItemSelect(event) {
58708
58727
  // event.target does not exist for some reason in tests
@@ -58719,7 +58738,7 @@ class ClosedCaptions extends UICorePlugin {
58719
58738
  // if the language is undefined, then let the engine decide
58720
58739
  // to hide the subtitles forcefully, set the language to 'none'
58721
58740
  setTimeout(() => {
58722
- this.selectItem(this.tracks.find((t) => t.track.language === this.preselectedLanguage) ?? null);
58741
+ this.selectItem(this.tracks.find((t) => this.isPreselectedLanguage(t.track.language)) ?? null);
58723
58742
  }, 0);
58724
58743
  }
58725
58744
  }
@@ -58821,6 +58840,9 @@ class ClosedCaptions extends UICorePlugin {
58821
58840
  }
58822
58841
  }
58823
58842
  get useNativeSubtitles() {
58843
+ if (this.core.activePlayback?.name === 'dash') {
58844
+ return true;
58845
+ }
58824
58846
  const mode = this.core.options.cc?.mode ?? this.core.options.subtitles?.mode ?? 'custom';
58825
58847
  // TODO or Safari? or iOS?
58826
58848
  return mode === 'native';
package/dist/index.js CHANGED
@@ -13339,6 +13339,13 @@ class DashPlayback extends BasePlayback {
13339
13339
  this.trigger(Events$1.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack$1));
13340
13340
  }
13341
13341
  }
13342
+ /**
13343
+ * @override
13344
+ */
13345
+ _handleTextTrackChange() {
13346
+ super._handleTextTrackChange();
13347
+ this._dash?.setTextTrack(this.closedCaptionsTrackId);
13348
+ }
13342
13349
  }
13343
13350
  DashPlayback.canPlay = function (resource, mimeType) {
13344
13351
  if (!isDashSource(resource, mimeType)) {
@@ -51411,7 +51418,7 @@ class Player {
51411
51418
  }
51412
51419
  }
51413
51420
 
51414
- var version$1 = "2.28.24";
51421
+ var version$1 = "2.28.25";
51415
51422
 
51416
51423
  var packages = {
51417
51424
  "node_modules/@clappr/core": {
@@ -59852,6 +59859,12 @@ class ClosedCaptions extends UICorePlugin {
59852
59859
  return (this.core.options.cc?.language ??
59853
59860
  this.core.options.subtitles?.language);
59854
59861
  }
59862
+ isPreselectedLanguage(language) {
59863
+ if (!this.preselectedLanguage) {
59864
+ return false;
59865
+ }
59866
+ return language.startsWith(this.preselectedLanguage);
59867
+ }
59855
59868
  /**
59856
59869
  * @internal
59857
59870
  */
@@ -59911,12 +59924,19 @@ class ClosedCaptions extends UICorePlugin {
59911
59924
  this.applyTracks();
59912
59925
  this.mount();
59913
59926
  }
59914
- onSubtitleChanged({ id: _ }) {
59927
+ onSubtitleChanged({ id: changedId }) {
59915
59928
  // ignoring the subtitle selected by the playback engine or user agent
59916
59929
  const id = this.track?.id ?? -1;
59930
+ trace(`${T$3} onSubtitleChanged`, {
59931
+ changedId,
59932
+ id,
59933
+ });
59917
59934
  if (id === -1) {
59918
59935
  this.clearSubtitleText();
59919
59936
  }
59937
+ this.activateTrack(id);
59938
+ }
59939
+ activateTrack(id) {
59920
59940
  for (const track of this.tracks) {
59921
59941
  if (track.id === id) {
59922
59942
  if (this.useNativeSubtitles) {
@@ -60066,7 +60086,10 @@ class ClosedCaptions extends UICorePlugin {
60066
60086
  selectItem(item) {
60067
60087
  this.clearSubtitleText();
60068
60088
  this.track = item;
60089
+ const trackId = item?.id ?? -1;
60090
+ this.core.activePlayback.closedCaptionsTrackId = trackId;
60069
60091
  this.updateSelection();
60092
+ this.activateTrack(trackId);
60070
60093
  }
60071
60094
  onItemSelect(event) {
60072
60095
  // event.target does not exist for some reason in tests
@@ -60083,7 +60106,7 @@ class ClosedCaptions extends UICorePlugin {
60083
60106
  // if the language is undefined, then let the engine decide
60084
60107
  // to hide the subtitles forcefully, set the language to 'none'
60085
60108
  setTimeout(() => {
60086
- this.selectItem(this.tracks.find((t) => t.track.language === this.preselectedLanguage) ?? null);
60109
+ this.selectItem(this.tracks.find((t) => this.isPreselectedLanguage(t.track.language)) ?? null);
60087
60110
  }, 0);
60088
60111
  }
60089
60112
  }
@@ -60185,6 +60208,9 @@ class ClosedCaptions extends UICorePlugin {
60185
60208
  }
60186
60209
  }
60187
60210
  get useNativeSubtitles() {
60211
+ if (this.core.activePlayback?.name === 'dash') {
60212
+ return true;
60213
+ }
60188
60214
  const mode = this.core.options.cc?.mode ?? this.core.options.subtitles?.mode ?? 'custom';
60189
60215
  // TODO or Safari? or iOS?
60190
60216
  return mode === 'native';
@@ -78,6 +78,10 @@ export default class DashPlayback extends BasePlayback {
78
78
  switchAudioTrack(id: string): void;
79
79
  load(srcUrl: string): void;
80
80
  private checkAudioTracks;
81
+ /**
82
+ * @override
83
+ */
84
+ _handleTextTrackChange(): void;
81
85
  }
82
86
  export {};
83
87
  //# sourceMappingURL=DashPlayback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,QAAQ,EAAyB,MAAM,cAAc,CAAA;AAG3E,OAAO,MAAM,EAAE,EAIb,KAAK,WAAW,IAAI,eAAe,EAEnC,aAAa,EACd,MAAM,QAAQ,CAAA;AAEf,OAAO,EAGL,YAAY,EACZ,YAAY,EACZ,SAAS,EACV,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AAMzE,KAAK,YAAY,GACb,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,IAAI,GACpB,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,KAAK,CAAA;AAEzB,KAAK,YAAY,GAAG,MAAM,CAAA;AAE1B,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAID,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,YAAY;IACpD,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAO;IAErC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IAKnC,mCAAmC,EAAE,OAAO,CAAQ;IAEpD,aAAa,EAAE,OAAO,CAAQ;IAI9B,uBAAuB,EAAE,MAAM,CAAI;IASnC,wBAAwB,EAAE,MAAM,CAAI;IAEpC,aAAa,EAAE,YAAY,CAAe;IAG1C,aAAa,EAAE,YAAY,GAAG,IAAI,CAAO;IAEzC,gBAAgB,EAAE,SAAS,CAAI;IAE/B,KAAK,EAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAO;IAE5C,2BAA2B,EAAE,MAAM,CAAI;IAEvC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAO;IAEtC,eAAe,EAAE,YAAY,CAA2B;IAIxD,0BAA0B,EAAE,oBAAoB,GAAG,IAAI,CAAO;IAI9D,wBAAwB,EAAE,oBAAoB,GAAG,IAAI,CAAO;IAE5D,kBAAkB,UAAQ;IAE1B,YAAY,EAAE,aAAa,GAAG,IAAI,CAAO;IAEzC,gBAAgB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAO;IAE9D,IAAI,IAAI,WAEP;IAED,IAAI,MAAM,IAAI,YAAY,EAAE,CAE3B;IAED,IAAI,YAAY,IAAI,MAAM,CAMzB;IAED,IAAI,OAAO,YAEV;IAED,IAAI,YAAY,CAAC,EAAE,EAAE,MAAM,EAoC1B;IAED,IAAI,UAAU,WASb;IAED,IAAI,IAAI,WAEP;IAID,IAAI,sBAAsB,WAczB;IAID,IAAI,oBAAoB,WAgBvB;IAED,IAAI,SAAS,WAKZ;gBAEW,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG;IAOzD,MAAM;IA6FN,MAAM;IAMN,MAAM;YAKW,SAAS;IAI1B,qBAAqB;IAQrB,oBAAoB;IAapB,WAAW,IAAI,SAAS;IAQxB,cAAc,IAAI,SAAS;IAO3B,kBAAkB,IAAI,SAAS;IAItB,cAAc,CAAC,UAAU,EAAE,MAAM;IAejC,IAAI,CAAC,IAAI,EAAE,SAAS;IAgB7B,eAAe;IAIf,UAAU,CAAC,MAAM,EAAE,OAAO;IAMjB,eAAe;IAgBxB,OAAO,CAAC,gBAAgB,CAGvB;IAED,OAAO,CAAC,eAAe,CAkCtB;IAED,OAAO,CAAC,YAAY;IAiBX,aAAa;IAqBb,iBAAiB;IAW1B,IAAI,UAAU,YAQb;IAEQ,WAAW;IAgBX,IAAI;IAMJ,KAAK;IAUL,IAAI;IAQb,OAAO,CAAC,eAAe;IAgBd,OAAO;IAMhB,mBAAmB;IASnB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE;IAarC,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,gBAAgB;IAQxB,eAAe;IAIf,aAAa;IAIb,OAAO,CAAC,QAAQ;IAMhB,eAAe,CAAC,IAAI,EAAE,MAAM;IAI5B,IAAI,WAAW,IAAI,UAAU,EAAE,CAI9B;IAGD,IAAI,iBAAiB,IAAI,UAAU,GAAG,IAAI,CAOzC;IAEQ,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQlC,IAAI,CAAC,MAAM,EAAE,MAAM;IAQ5B,OAAO,CAAC,gBAAgB;CAOzB"}
1
+ {"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}
@@ -493,6 +493,13 @@ export default class DashPlayback extends BasePlayback {
493
493
  this.trigger(Events.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack));
494
494
  }
495
495
  }
496
+ /**
497
+ * @override
498
+ */
499
+ _handleTextTrackChange() {
500
+ super._handleTextTrackChange();
501
+ this._dash?.setTextTrack(this.closedCaptionsTrackId);
502
+ }
496
503
  }
497
504
  DashPlayback.canPlay = function (resource, mimeType) {
498
505
  if (!isDashSource(resource, mimeType)) {
@@ -86,6 +86,7 @@ export declare class ClosedCaptions extends UICorePlugin {
86
86
  'click #gplayer-cc-button': string;
87
87
  };
88
88
  private get preselectedLanguage();
89
+ private isPreselectedLanguage;
89
90
  /**
90
91
  * @internal
91
92
  */
@@ -94,6 +95,7 @@ export declare class ClosedCaptions extends UICorePlugin {
94
95
  private onContainerChanged;
95
96
  private onSubtitleAvailable;
96
97
  private onSubtitleChanged;
98
+ private activateTrack;
97
99
  private applyTracks;
98
100
  private onContainerResize;
99
101
  /**
@@ -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;AAiB7C;;;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,GAK9B;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,kBAAkB;IAqD1B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,IAAI;IAcJ;;OAEG;IACH,IAAI;IAiBJ,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IA4Bf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAOlB,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,GAI7B;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;AAiB7C;;;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,GAK9B;IAED,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,kBAAkB;IAqD1B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,IAAI;IAcJ;;OAEG;IACH,IAAI;IAiBJ,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IA4Bf,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,CAAC,SAAS,CAA+C;CACjE"}
@@ -96,6 +96,12 @@ export class ClosedCaptions extends UICorePlugin {
96
96
  return (this.core.options.cc?.language ??
97
97
  this.core.options.subtitles?.language);
98
98
  }
99
+ isPreselectedLanguage(language) {
100
+ if (!this.preselectedLanguage) {
101
+ return false;
102
+ }
103
+ return language.startsWith(this.preselectedLanguage);
104
+ }
99
105
  /**
100
106
  * @internal
101
107
  */
@@ -155,12 +161,19 @@ export class ClosedCaptions extends UICorePlugin {
155
161
  this.applyTracks();
156
162
  this.mount();
157
163
  }
158
- onSubtitleChanged({ id: _ }) {
164
+ onSubtitleChanged({ id: changedId }) {
159
165
  // ignoring the subtitle selected by the playback engine or user agent
160
166
  const id = this.track?.id ?? -1;
167
+ trace(`${T} onSubtitleChanged`, {
168
+ changedId,
169
+ id,
170
+ });
161
171
  if (id === -1) {
162
172
  this.clearSubtitleText();
163
173
  }
174
+ this.activateTrack(id);
175
+ }
176
+ activateTrack(id) {
164
177
  for (const track of this.tracks) {
165
178
  if (track.id === id) {
166
179
  if (this.useNativeSubtitles) {
@@ -310,7 +323,10 @@ export class ClosedCaptions extends UICorePlugin {
310
323
  selectItem(item) {
311
324
  this.clearSubtitleText();
312
325
  this.track = item;
326
+ const trackId = item?.id ?? -1;
327
+ this.core.activePlayback.closedCaptionsTrackId = trackId;
313
328
  this.updateSelection();
329
+ this.activateTrack(trackId);
314
330
  }
315
331
  onItemSelect(event) {
316
332
  // event.target does not exist for some reason in tests
@@ -327,7 +343,7 @@ export class ClosedCaptions extends UICorePlugin {
327
343
  // if the language is undefined, then let the engine decide
328
344
  // to hide the subtitles forcefully, set the language to 'none'
329
345
  setTimeout(() => {
330
- this.selectItem(this.tracks.find((t) => t.track.language === this.preselectedLanguage) ?? null);
346
+ this.selectItem(this.tracks.find((t) => this.isPreselectedLanguage(t.track.language)) ?? null);
331
347
  }, 0);
332
348
  }
333
349
  }
@@ -429,6 +445,9 @@ export class ClosedCaptions extends UICorePlugin {
429
445
  }
430
446
  }
431
447
  get useNativeSubtitles() {
448
+ if (this.core.activePlayback?.name === 'dash') {
449
+ return true;
450
+ }
432
451
  const mode = this.core.options.cc?.mode ?? this.core.options.subtitles?.mode ?? 'custom';
433
452
  // TODO or Safari? or iOS?
434
453
  return mode === 'native';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.28.24",
3
+ "version": "2.28.25",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -42,7 +42,7 @@ export class BasePlayback extends HTML5Video {
42
42
  * @param rate - The playback rate to set.
43
43
  */
44
44
  setPlaybackRate(rate: number) {
45
- ;(this.el as HTMLMediaElement).playbackRate = rate
45
+ ; (this.el as HTMLMediaElement).playbackRate = rate
46
46
  }
47
47
 
48
48
  override _onPlaying() {
@@ -684,6 +684,14 @@ export default class DashPlayback extends BasePlayback {
684
684
  this.trigger(Events.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack))
685
685
  }
686
686
  }
687
+
688
+ /**
689
+ * @override
690
+ */
691
+ _handleTextTrackChange() {
692
+ super._handleTextTrackChange()
693
+ this._dash?.setTextTrack(this.closedCaptionsTrackId)
694
+ }
687
695
  }
688
696
 
689
697
  DashPlayback.canPlay = function (resource, mimeType) {
@@ -137,6 +137,13 @@ export class ClosedCaptions extends UICorePlugin {
137
137
  )
138
138
  }
139
139
 
140
+ private isPreselectedLanguage(language: string): boolean {
141
+ if (!this.preselectedLanguage) {
142
+ return false
143
+ }
144
+ return language.startsWith(this.preselectedLanguage)
145
+ }
146
+
140
147
  /**
141
148
  * @internal
142
149
  */
@@ -228,12 +235,20 @@ export class ClosedCaptions extends UICorePlugin {
228
235
  this.mount()
229
236
  }
230
237
 
231
- private onSubtitleChanged({ id: _ }: { id: number }) {
238
+ private onSubtitleChanged({ id: changedId }: { id: number }) {
232
239
  // ignoring the subtitle selected by the playback engine or user agent
233
240
  const id = this.track?.id ?? -1
241
+ trace(`${T} onSubtitleChanged`, {
242
+ changedId,
243
+ id,
244
+ })
234
245
  if (id === -1) {
235
246
  this.clearSubtitleText()
236
247
  }
248
+ this.activateTrack(id)
249
+ }
250
+
251
+ private activateTrack(id: number) {
237
252
  for (const track of this.tracks) {
238
253
  if (track.id === id) {
239
254
  if (this.useNativeSubtitles) {
@@ -404,8 +419,12 @@ export class ClosedCaptions extends UICorePlugin {
404
419
  private selectItem(item: TextTrackItem | null) {
405
420
  this.clearSubtitleText()
406
421
  this.track = item
422
+ const trackId = item?.id ?? -1
423
+ this.core.activePlayback.closedCaptionsTrackId = trackId
407
424
 
408
425
  this.updateSelection()
426
+
427
+ this.activateTrack(trackId)
409
428
  }
410
429
 
411
430
  private onItemSelect(event: MouseEvent) {
@@ -428,7 +447,7 @@ export class ClosedCaptions extends UICorePlugin {
428
447
  setTimeout(() => {
429
448
  this.selectItem(
430
449
  this.tracks.find(
431
- (t) => t.track.language === this.preselectedLanguage,
450
+ (t) => this.isPreselectedLanguage(t.track.language),
432
451
  ) ?? null,
433
452
  )
434
453
  }, 0)
@@ -551,6 +570,9 @@ export class ClosedCaptions extends UICorePlugin {
551
570
  }
552
571
 
553
572
  private get useNativeSubtitles() {
573
+ if (this.core.activePlayback?.name === 'dash') {
574
+ return true
575
+ }
554
576
  const mode = this.core.options.cc?.mode ?? this.core.options.subtitles?.mode ?? 'custom'
555
577
  // TODO or Safari? or iOS?
556
578
  return mode === 'native'
@@ -235,10 +235,10 @@ describe('ClosedCaptions', () => {
235
235
  it('should deactivate subtitle track', () => {
236
236
  expect(core.activePlayback.closedCaptionsTrackId).toEqual(-1)
237
237
  expect(core.activePlayback.closedCaptionsTracks[0].track.mode).toBe(
238
- 'hidden',
238
+ 'disabled',
239
239
  )
240
240
  expect(core.activePlayback.closedCaptionsTracks[1].track.mode).toBe(
241
- 'hidden',
241
+ 'disabled',
242
242
  )
243
243
  })
244
244
  it('should select menu item', () => {