aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/routes/mod.rs7
-rw-r--r--server/src/routes/ui/node.rs2
-rw-r--r--server/src/routes/userdata.rs (renamed from server/src/routes/progress.rs)19
-rw-r--r--web/script/player/jhls.d.ts5
-rw-r--r--web/script/player/player.ts22
5 files changed, 47 insertions, 8 deletions
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs
index 4c7838d..c3299d3 100644
--- a/server/src/routes/mod.rs
+++ b/server/src/routes/mod.rs
@@ -6,9 +6,8 @@
use crate::{database::Database, routes::ui::error::MyResult};
use api::{r_api_account_login, r_api_node_raw, r_api_root, r_api_version};
use base64::Engine;
-use jellybase::{CONF, federation::Federation};
+use jellybase::{federation::Federation, CONF};
use log::warn;
-use progress::{r_player_progress, r_player_watched};
use rand::random;
use rocket::{
catchers, config::SecretKey, fairing::AdHoc, fs::FileServer, get, http::Header, routes, Build,
@@ -36,11 +35,12 @@ use ui::{
player::r_player,
style::{r_assets_font, r_assets_js, r_assets_js_map, r_assets_style},
};
+use userdata::{r_node_userdata, r_player_progress, r_player_watched};
pub mod api;
-pub mod progress;
pub mod stream;
pub mod ui;
+pub mod userdata;
#[macro_export]
macro_rules! uri {
@@ -93,6 +93,7 @@ pub fn build_rocket(database: Database, federation: Federation) -> Rocket<Build>
r_assets_js,
r_assets_js_map,
r_stream,
+ r_node_userdata,
r_player,
r_player_progress,
r_player_watched,
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index 795effa..adbe5b1 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -12,7 +12,7 @@ use crate::{
database::Database,
routes::{
api::AcceptJson,
- progress::{rocket_uri_macro_r_player_watched, UrlWatchedState},
+ userdata::{rocket_uri_macro_r_player_watched, UrlWatchedState},
ui::{
account::session::Session,
assets::AssetRole,
diff --git a/server/src/routes/progress.rs b/server/src/routes/userdata.rs
index fa6f844..2ded24a 100644
--- a/server/src/routes/progress.rs
+++ b/server/src/routes/userdata.rs
@@ -7,8 +7,10 @@ use super::ui::{account::session::Session, error::MyResult};
use crate::routes::ui::node::rocket_uri_macro_r_library_node;
use anyhow::anyhow;
use jellybase::database::Database;
-use jellycommon::user::WatchedState;
-use rocket::{post, response::Redirect, FromFormField, State, UriDisplayQuery};
+use jellycommon::user::{NodeUserData, WatchedState};
+use rocket::{
+ get, post, response::Redirect, serde::json::Json, FromFormField, State, UriDisplayQuery,
+};
#[derive(Debug, FromFormField, UriDisplayQuery)]
pub enum UrlWatchedState {
@@ -17,6 +19,19 @@ pub enum UrlWatchedState {
Pending,
}
+#[get("/n/<id>/userdata")]
+pub fn r_node_userdata(
+ session: Session,
+ db: &State<Database>,
+ id: &str,
+) -> MyResult<Json<NodeUserData>> {
+ db.node
+ .get(&id.to_string())?
+ .ok_or(anyhow!("node does not exist"))?;
+ let key = (session.user.name.clone(), id.to_owned());
+ Ok(Json(db.user_node.get(&key)?.unwrap_or_default()))
+}
+
#[post("/n/<id>/watched?<state>")]
pub async fn r_player_watched(
session: Session,
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
+}