diff options
Diffstat (limited to 'web')
-rw-r--r-- | web/script/main.ts | 6 | ||||
-rw-r--r-- | web/script/player/mod.ts | 41 |
2 files changed, 32 insertions, 15 deletions
diff --git a/web/script/main.ts b/web/script/main.ts index bd66342..b59f7af 100644 --- a/web/script/main.ts +++ b/web/script/main.ts @@ -1,2 +1,6 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2023 metamuffin <metamuffin.org> +*/ import "./player/mod.ts" - diff --git a/web/script/player/mod.ts b/web/script/player/mod.ts index 0ac1b90..aed504a 100644 --- a/web/script/player/mod.ts +++ b/web/script/player/mod.ts @@ -1,3 +1,8 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2023 metamuffin <metamuffin.org> +*/ import { OVar, e } from "../jshelper/mod.ts"; export interface Range { start: number, end: number } @@ -214,32 +219,35 @@ class Player { console.log("pause"); this.video.pause() } - seek(_p: number) { } + seek(p: number) { + this.video.currentTime = p + this.update() + } } class PlayerTrack { private source_buffer: SourceBuffer - private loaded_or_loading = new Set<number>() - private append_queue: (Range & { buf: ArrayBuffer })[] = [] + private loaded = new Set<number>() + private loading = new Set<number>() + private append_queue: (Range & { buf: ArrayBuffer, cb: () => void })[] = [] constructor(media_source: MediaSource, private node_id: string, private track_index: number, private metadata: JhlsTrack) { this.source_buffer = media_source.addSourceBuffer("video/webm") this.source_buffer.mode = "segments" this.source_buffer.addEventListener("updateend", () => { - console.log("updateend"); - this.tick_append() }) + this.source_buffer.addEventListener("error", e => { + console.error("sourcebuffer error", e); + }) } - update(target: number) { - console.log("update", target, this.loaded_or_loading); - + async update(target: number) { + console.log(`update track ${this.track_index}`, target, this.loaded, this.loading); for (let i = 0; i < this.metadata.segments.length; i++) { const segment = this.metadata.segments[i]; if (segment.start >= target - 1 && segment.end < target + TARGET_BUFFER_DURATION) { - if (!this.loaded_or_loading.has(i)) { - console.log(segment); - this.loaded_or_loading.add(i) + if (!this.loaded.has(i) && !this.loading.has(i)) { + this.loading.add(i) this.load(i) } } @@ -249,15 +257,20 @@ class PlayerTrack { const res = await fetch(`/n/${encodeURIComponent(this.node_id)}/stream?format=hlsseg&tracks=${this.track_index}&index=${index}`) if (!res.ok) throw new Error(`segment fail i=${index} t=${this.track_index}`); const buf = await res.arrayBuffer() - console.log("push"); - this.append_queue.push({ buf, ...this.metadata.segments[index] }) - this.tick_append() + + this.loading.delete(index) + this.loaded.add(index) + await new Promise<void>(cb => { + this.append_queue.push({ buf, ...this.metadata.segments[index], cb }) + this.tick_append() + }) } tick_append() { console.log("tick", this.append_queue); if (this.source_buffer.updating) return if (this.append_queue.length) { const seg = this.append_queue[0]; + console.log("append", this.track_index, seg); this.source_buffer.timestampOffset = seg.start this.source_buffer.appendBuffer(seg.buf); this.append_queue.splice(0, 1) |