Skip to content

Commit d20eba6

Browse files
committed
fix(player): render captions when using embeds
closes #1047
1 parent a0201d5 commit d20eba6

3 files changed

Lines changed: 14 additions & 15 deletions

File tree

packages/vidstack/src/core/tracks/text/render/libass-text-renderer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { DOMEvent, EventsTarget, isString, listenEvent } from 'maverick.js/std';
2+
23
import { TextTrackSymbol } from '../symbols';
34
import type { TextTrack } from '../text-track';
45
import type { TextRenderer } from './text-renderer';
@@ -15,14 +16,17 @@ export class LibASSTextRenderer implements TextRenderer {
1516
public config?: LibASSConfig,
1617
) {}
1718

18-
canRender(track: TextTrack): boolean {
19+
canRender(track: TextTrack, video: HTMLVideoElement | null): boolean {
1920
return (
21+
!!video &&
2022
!!track.src &&
2123
((isString(track.type) && this._typeRE.test(track.type)) || this._typeRE.test(track.src))
2224
);
2325
}
2426

25-
attach(video: HTMLVideoElement) {
27+
attach(video: HTMLVideoElement | null) {
28+
if (!video) return;
29+
2630
this.loader().then(async (mod) => {
2731
this._instance = new mod.default({
2832
...this.config,

packages/vidstack/src/core/tracks/text/render/native-text-renderer.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ export class NativeTextRenderer implements TextRenderer {
1010
private _track: VdsTextTrack | null = null;
1111
private _tracks = new Set<VdsTextTrack>();
1212

13-
canRender() {
14-
return true;
13+
canRender(_, video: HTMLVideoElement | null) {
14+
return !!video;
1515
}
1616

17-
attach(video: HTMLVideoElement) {
17+
attach(video: HTMLVideoElement | null) {
1818
this._video = video;
19-
video.textTracks.onchange = this._onChange.bind(this);
19+
if (video) video.textTracks.onchange = this._onChange.bind(this);
2020
}
2121

2222
addTrack(track: VdsTextTrack): void {

packages/vidstack/src/core/tracks/text/render/text-renderer.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,12 @@ export class TextRenderers {
7777
}
7878

7979
private _update() {
80-
if (!this._video) {
81-
this._detach();
82-
return;
83-
}
84-
8580
const currentTrack = this._textTracks.selected;
8681

8782
// We identify text tracks that were embedded in HLS playlists and loaded natively (e.g., iOS
8883
// Safari) because we can't toggle mode to hidden and still get cue updates for some reason.
8984
// See `native-hls-text-tracks.ts` for discovery.
90-
if (this._nativeDisplay || currentTrack?.[TextTrackSymbol._nativeHLS]) {
85+
if (this._video && (this._nativeDisplay || currentTrack?.[TextTrackSymbol._nativeHLS])) {
9186
this._customRenderer?.changeTrack(null);
9287
this._nativeRenderer?.setDisplay(true);
9388
this._nativeRenderer?.changeTrack(currentTrack);
@@ -104,7 +99,7 @@ export class TextRenderers {
10499

105100
const customRenderer = this._renderers
106101
.sort((a, b) => a.priority - b.priority)
107-
.find((loader) => loader.canRender(currentTrack));
102+
.find((renderer) => renderer.canRender(currentTrack, this._video));
108103

109104
if (this._customRenderer !== customRenderer) {
110105
this._customRenderer?.detach();
@@ -125,8 +120,8 @@ export class TextRenderers {
125120

126121
export interface TextRenderer {
127122
readonly priority: number;
128-
canRender(track: TextTrack): boolean;
129-
attach(video: HTMLVideoElement);
123+
canRender(track: TextTrack, video: HTMLVideoElement | null): boolean;
124+
attach(video: HTMLVideoElement | null);
130125
detach(): void;
131126
changeTrack(track: TextTrack | null): void;
132127
}

0 commit comments

Comments
 (0)