aboutsummaryrefslogtreecommitdiff
path: root/web/script/player/track/vtt.ts
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-29 08:39:38 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-29 08:39:38 +0100
commitdef9b13d911fa28f7b1fb8bb3766e2873cc6d628 (patch)
tree2f4df844bfe34841c10dd9533dd2496083011395 /web/script/player/track/vtt.ts
parent88fa84cd5a2e17d758a65dc2773fa0a80f096815 (diff)
downloadjellything-def9b13d911fa28f7b1fb8bb3766e2873cc6d628.tar
jellything-def9b13d911fa28f7b1fb8bb3766e2873cc6d628.tar.bz2
jellything-def9b13d911fa28f7b1fb8bb3766e2873cc6d628.tar.zst
make track creation instant
Diffstat (limited to 'web/script/player/track/vtt.ts')
-rw-r--r--web/script/player/track/vtt.ts52
1 files changed, 28 insertions, 24 deletions
diff --git a/web/script/player/track/vtt.ts b/web/script/player/track/vtt.ts
index efdafe0..4dddbc7 100644
--- a/web/script/player/track/vtt.ts
+++ b/web/script/player/track/vtt.ts
@@ -2,40 +2,26 @@ import { SourceTrack, JvttCue } from "../jhls.d.ts";
import { Player } from "../player.ts";
import { PlayerTrack } from "./mod.ts";
-export async function create_vtt_track(player: Player, node_id: string, track_index: number, metadata: SourceTrack): Promise<VttPlayerTrack | undefined> {
- let index: JvttCue[];
- try {
- const res = await fetch(`/n/${encodeURIComponent(player.node_id)}/stream?format=jvtt&tracks=${track_index}`, { headers: { "Accept": "application/json" } });
- if (!res.ok) return player.error.value = "Cannot download index.", undefined;
- let ai!: JvttCue[] & { error: string; };
- try { ai = await res.json(); }
- catch (_) { player.set_pers("Error: Failed to fetch node"); }
- if (ai.error) return player.set_pers("server error: " + ai.error), undefined;
- index = ai;
- } catch (e) {
- if (e instanceof TypeError) {
- player.set_pers("Cannot download subtitles: Network Error");
- return undefined
- } else throw e;
- }
- const t = new VttPlayerTrack(player, node_id, track_index, metadata, index);
- return t;
-}
-
export class VttPlayerTrack extends PlayerTrack {
private track: TextTrack;
+ public cues?: JvttCue[]
constructor(
private player: Player,
private node_id: string,
track_index: number,
private metadata: SourceTrack,
- public cues: JvttCue[]
) {
super(track_index);
- this.buffered.value = [{ start: 0, end: player.duration.value, status: "buffered" }]
- this.track = this.player.video.addTextTrack("subtitles", metadata.name, metadata.language);
- for (const cue of cues) {
+ this.track = this.player.video.addTextTrack("subtitles", this.metadata.name, this.metadata.language);
+ this.buffered.value = [{ start: 0, end: this.player.duration.value, status: "loading" }]
+ this.init()
+ }
+
+ private on_ready() {
+ if (!this.cues) return
+ this.buffered.value = [{ start: 0, end: this.player.duration.value, status: "buffered" }]
+ for (const cue of this.cues) {
this.track.addCue(create_cue(cue));
}
this.track.mode = "showing";
@@ -44,6 +30,24 @@ export class VttPlayerTrack extends PlayerTrack {
this.track.mode = "hidden";
});
}
+
+ async init() {
+ try {
+ const res = await fetch(`/n/${encodeURIComponent(this.node_id)}/stream?format=jvtt&tracks=${this.track_index}`, { headers: { "Accept": "application/json" } });
+ if (!res.ok) return this.player.error.value = "Cannot download index.", undefined;
+ let ai!: JvttCue[] & { error: string; };
+ try { ai = await res.json(); }
+ catch (_) { this.player.set_pers("Error: Failed to fetch node"); }
+ if (ai.error) return this.player.set_pers("server error: " + ai.error), undefined;
+ this.cues = ai;
+ } catch (e) {
+ if (e instanceof TypeError) {
+ this.player.set_pers("Cannot download subtitles: Network Error");
+ return undefined
+ } else throw e;
+ }
+ this.on_ready()
+ }
}
function create_cue(cue: JvttCue): VTTCue {