aboutsummaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-16 15:55:15 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-16 15:55:15 +0100
commit0fa9a389d894e6cbf6a0b30a126d7e57686d0e38 (patch)
tree649a5524effe2795104f89c5ec61871d5944e03e /web
parent80ce9014a8893952c1534c0aeb1ebb4d9d76e4fb (diff)
downloadjellything-0fa9a389d894e6cbf6a0b30a126d7e57686d0e38.tar
jellything-0fa9a389d894e6cbf6a0b30a126d7e57686d0e38.tar.bz2
jellything-0fa9a389d894e6cbf6a0b30a126d7e57686d0e38.tar.zst
resume player correctly when progress
Diffstat (limited to 'web')
-rw-r--r--web/script/player/jhls.d.ts5
-rw-r--r--web/script/player/player.ts22
2 files changed, 25 insertions, 2 deletions
diff --git a/web/script/player/jhls.d.ts b/web/script/player/jhls.d.ts
index 9938365..2be6999 100644
--- a/web/script/player/jhls.d.ts
+++ b/web/script/player/jhls.d.ts
@@ -90,3 +90,8 @@ export interface EncodingProfile {
codec: string,
},
}
+
+export interface NodeUserData {
+ watched: WatchedState
+}
+export type WatchedState = "none" | "watched" | "pending" | { progress: number }
diff --git a/web/script/player/player.ts b/web/script/player/player.ts
index f31a43b..a92ab4b 100644
--- a/web/script/player/player.ts
+++ b/web/script/player/player.ts
@@ -5,10 +5,11 @@
*/
/// <reference lib="dom" />
import { OVar, e } from "../jshelper/mod.ts";
-import { NodePublic, SourceTrack, TimeRange } from "./jhls.d.ts";
+import { NodePublic, NodeUserData, SourceTrack, TimeRange } from "./jhls.d.ts";
import { SegmentDownloader } from "./download.ts";
import { PlayerTrack } from "./track.ts";
import { Logger } from "../jshelper/src/log.ts";
+import { WatchedState } from "./jhls.d.ts";
export interface BufferRange extends TimeRange { status: "buffered" | "loading" | "queued" }
export class Player {
@@ -88,6 +89,15 @@ export class Player {
try { metadata = await res.json() }
catch (_) { this.set_pers("Error: Failed to fetch node") }
if (metadata.error) return this.set_pers("server error: " + metadata.error)
+
+ this.set_pers("Loading node user data...")
+ const udres = await fetch(`/n/${encodeURIComponent(this.node_id)}/userdata`, { headers: { "Accept": "application/json" } })
+ if (!udres.ok) return this.error.value = "Cannot download node."
+ let userdata!: NodeUserData & { error: string }
+ try { userdata = await udres.json() }
+ catch (_) { this.set_pers("Error: Failed to fetch node") }
+ if (userdata.error) return this.set_pers("server error: " + metadata.error)
+
this.set_pers()
this.tracks = metadata.media!.tracks
@@ -97,8 +107,12 @@ export class Player {
this.set_pers("Downloading track indecies...")
await this.set_track_enabled(0, true, false)
await this.set_track_enabled(1, true, false)
+
this.set_pers("Downloading initial segments...")
- this.update()
+ const start_time = get_continue_time(userdata.watched);
+ this.update(start_time)
+ this.video.currentTime = start_time
+
await this.canplay.wait_for(true)
this.set_pers()
})
@@ -137,3 +151,7 @@ export class Player {
}
}
+function get_continue_time(w: WatchedState): number {
+ if (typeof w == "string") return 0
+ else return w.progress
+}