diff --git a/packages/react-native-video/src/core/web/WebEventEmiter.ts b/packages/react-native-video/src/core/web/WebEventEmiter.ts index 1093950a..8e8c804f 100644 --- a/packages/react-native-video/src/core/web/WebEventEmiter.ts +++ b/packages/react-native-video/src/core/web/WebEventEmiter.ts @@ -80,6 +80,9 @@ export class WebEventEmiter implements PlayerEvents { this._onError = this._onError.bind(this); this.player.on("error", this._onError); + this._onTextTrackChange = this._onTextTrackChange.bind(this); + this.player.textTracks().on("change", this._onTextTrackChange); + this._onAudioTrackChange = this._onAudioTrackChange.bind(this); this.player.audioTracks().on("change", this._onAudioTrackChange); @@ -114,6 +117,8 @@ export class WebEventEmiter implements PlayerEvents { this.player.off("error", this._onError); + this.player.textTracks().off("change", this._onTextTrackChange); + this.player.audioTracks().off("change", this._onAudioTrackChange); this.player.videoTracks().off("change", this._onVideoTrackChange); @@ -238,6 +243,21 @@ export class WebEventEmiter implements PlayerEvents { this.onError(new VideoError(codeMap[err.code]!, err.message)); } + _onTextTrackChange() { + // @ts-expect-error they define length & index properties via prototype + const tracks: VideoJsTextTracks = this.player.textTracks(); + const selected = [...Array(tracks.length)] + .map((_, i) => ({ + id: tracks[i]!.id, + label: tracks[i]!.label, + language: tracks[i]!.language, + selected: tracks[i]!.mode === "showing", + })) + .find((x) => x.selected); + + this.onTrackChange(selected ?? null); + } + _onAudioTrackChange() { // @ts-expect-error they define length & index properties via prototype const tracks: VideoJsTracks = this.player.audioTracks();