aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-12-15 23:47:26 +0100
committermetamuffin <metamuffin@disroot.org>2023-12-15 23:47:26 +0100
commit21b58037c69798e922c5512ea5380943781558ff (patch)
tree884b82ff80f37183c9775b7c468e6f6fb6da7614
parent69041b4a9de26719254ea4eff5555a079d5e7d55 (diff)
downloadjellything-21b58037c69798e922c5512ea5380943781558ff.tar
jellything-21b58037c69798e922c5512ea5380943781558ff.tar.bz2
jellything-21b58037c69798e922c5512ea5380943781558ff.tar.zst
continue watching draft
-rw-r--r--base/src/database.rs4
-rw-r--r--server/src/routes/mod.rs3
-rw-r--r--server/src/routes/progress.rs28
-rw-r--r--server/src/routes/ui/home.rs23
-rw-r--r--web/script/player/mod.ts13
5 files changed, 69 insertions, 2 deletions
diff --git a/base/src/database.rs b/base/src/database.rs
index 739d292..ba10527 100644
--- a/base/src/database.rs
+++ b/base/src/database.rs
@@ -6,7 +6,7 @@
use anyhow::Context;
use jellycommon::{user::User, Node};
use log::info;
-use std::path::Path;
+use std::{collections::HashMap, path::Path};
use typed_sled::Tree;
pub use sled;
@@ -16,6 +16,7 @@ pub struct Database {
pub db: sled::Db,
pub user: Tree<String, User>,
+ pub user_progess: Tree<String, HashMap<String, f64>>,
pub invite: Tree<String, ()>,
pub node: Tree<String, Node>,
}
@@ -29,6 +30,7 @@ impl Database {
user: Tree::open(&db, "user"),
invite: Tree::open(&db, "invite"),
node: Tree::open(&db, "node"),
+ user_progess: Tree::open(&db, "user_progesss"),
db,
});
info!("ready");
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs
index 48fdf96..9211a1e 100644
--- a/server/src/routes/mod.rs
+++ b/server/src/routes/mod.rs
@@ -8,6 +8,7 @@ use api::{r_api_account_login, r_api_node_raw, r_api_root, r_api_version};
use base64::Engine;
use jellybase::CONF;
use log::warn;
+use progress::r_player_progress;
use rand::random;
use rocket::{
catchers, config::SecretKey, fairing::AdHoc, fs::FileServer, get, http::Header, routes, Build,
@@ -37,6 +38,7 @@ use ui::{
};
pub mod api;
+pub mod progress;
pub mod stream;
pub mod ui;
@@ -92,6 +94,7 @@ pub fn build_rocket(database: Database, federation: Federation) -> Rocket<Build>
r_assets_js_map,
r_stream,
r_player,
+ r_player_progress,
r_account_login,
r_account_login_post,
r_account_register,
diff --git a/server/src/routes/progress.rs b/server/src/routes/progress.rs
new file mode 100644
index 0000000..170ed97
--- /dev/null
+++ b/server/src/routes/progress.rs
@@ -0,0 +1,28 @@
+use std::collections::HashMap;
+
+use super::ui::{account::session::Session, error::MyResult};
+use jellybase::database::Database;
+use rocket::{post, State};
+
+#[post("/n/<id>/progress?<t>")]
+pub async fn r_player_progress(
+ session: Session,
+ db: &State<Database>,
+ id: &str,
+ t: Option<f64>,
+) -> MyResult<()> {
+ db.user_progess.fetch_and_update(&session.user.name, |p| {
+ let mut m = p.unwrap_or_else(|| HashMap::new());
+ if let Some(t) = t {
+ m.insert(id.to_string(), t);
+ } else {
+ m.remove(&id.to_string());
+ }
+ if m.is_empty() {
+ None
+ } else {
+ Some(m)
+ }
+ })?;
+ Ok(())
+}
diff --git a/server/src/routes/ui/home.rs b/server/src/routes/ui/home.rs
index 4ba3fc3..3f1f0d0 100644
--- a/server/src/routes/ui/home.rs
+++ b/server/src/routes/ui/home.rs
@@ -59,6 +59,22 @@ pub fn r_home(sess: Session, db: &State<Database>) -> MyResult<DynLayoutPage> {
.map(|k| k.to_owned())
.collect::<Vec<_>>();
+ let continue_watching = db
+ .user_progess
+ .get(&sess.user.name)?
+ .unwrap_or_default()
+ .into_iter()
+ .map(|(n, p)| {
+ Ok((
+ n.clone(),
+ db.node.get(&n)?.context("child does not exist")?.public,
+ p,
+ ))
+ })
+ .collect::<anyhow::Result<Vec<_>>>()?
+ .into_iter()
+ .collect::<Vec<_>>();
+
Ok(LayoutPage {
title: "Home".to_string(),
content: markup::new! {
@@ -67,6 +83,12 @@ pub fn r_home(sess: Session, db: &State<Database>) -> MyResult<DynLayoutPage> {
.homelist { ul {@for (id, node) in &toplevel {
li { @NodeCard { id, node } }
}}}
+ @if !continue_watching.is_empty() {
+ h2 { "Continue Watching" }
+ .homelist { ul {@for (id, node, _p) in &continue_watching {
+ li { @NodeCard { id, node } }
+ }}}
+ }
h2 { "Latest Releases" }
.homelist { ul {@for (id, node) in &latest {
li { @NodeCard { id, node } }
@@ -75,7 +97,6 @@ pub fn r_home(sess: Session, db: &State<Database>) -> MyResult<DynLayoutPage> {
.homelist { ul {@for (id, node) in &random {
li { @NodeCard { id, node } }
}}}
- p.error { "TODO: continue watching" }
p.error { "TODO: recently added" }
p.error { "TODO: best rating" }
},
diff --git a/web/script/player/mod.ts b/web/script/player/mod.ts
index ed6677b..0d4dc32 100644
--- a/web/script/player/mod.ts
+++ b/web/script/player/mod.ts
@@ -144,6 +144,19 @@ function initialize_player(el: HTMLElement, node_id: string) {
else return;
k.preventDefault()
})
+ send_player_progress(node_id, player)
+}
+
+function send_player_progress(node_id: string, player: Player) {
+ let t = 0;
+ setInterval(() => {
+ const nt = player.video.currentTime
+ if (t != nt) {
+ t = nt
+ fetch(`/n/${encodeURIComponent(node_id)}/progress?t=${nt}`, { method: "POST" })
+ }
+ }, 10000)
+
}
function mouse_idle(e: HTMLElement, timeout: number, cb: (b: boolean) => unknown) {