aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-10-01 19:34:40 +0200
committermetamuffin <metamuffin@disroot.org>2023-10-01 19:34:40 +0200
commit3cdd43f10268e07f2dcaaa1096240c33fcce15bd (patch)
tree968868bb9d58eaf04efdce1fb84214d3b979aa4e
parent86d21ecd6dd39e3fa73cbed3ce347d6cf51239b5 (diff)
downloadjellything-3cdd43f10268e07f2dcaaa1096240c33fcce15bd.tar
jellything-3cdd43f10268e07f2dcaaa1096240c33fcce15bd.tar.bz2
jellything-3cdd43f10268e07f2dcaaa1096240c33fcce15bd.tar.zst
jhls sometimes works
-rw-r--r--web/script/main.ts6
-rw-r--r--web/script/player/mod.ts41
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)