From 0fa9a389d894e6cbf6a0b30a126d7e57686d0e38 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 16 Jan 2024 15:55:15 +0100 Subject: resume player correctly when progress --- server/src/routes/mod.rs | 7 ++-- server/src/routes/progress.rs | 69 ----------------------------------- server/src/routes/ui/node.rs | 2 +- server/src/routes/userdata.rs | 84 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 73 deletions(-) delete mode 100644 server/src/routes/progress.rs create mode 100644 server/src/routes/userdata.rs (limited to 'server/src') 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 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/progress.rs b/server/src/routes/progress.rs deleted file mode 100644 index fa6f844..0000000 --- a/server/src/routes/progress.rs +++ /dev/null @@ -1,69 +0,0 @@ -/* - 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 -*/ -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}; - -#[derive(Debug, FromFormField, UriDisplayQuery)] -pub enum UrlWatchedState { - None, - Watched, - Pending, -} - -#[post("/n//watched?")] -pub async fn r_player_watched( - session: Session, - db: &State, - id: &str, - state: UrlWatchedState, -) -> MyResult { - db.node - .get(&id.to_string())? - .ok_or(anyhow!("node does not exist"))?; - - let key = (session.user.name.clone(), id.to_owned()); - - db.user_node.fetch_and_update(&key, |t| { - let mut t = t.unwrap_or_default(); - t.watched = match state { - UrlWatchedState::None => WatchedState::None, - UrlWatchedState::Watched => WatchedState::Watched, - UrlWatchedState::Pending => WatchedState::Pending, - }; - Some(t) - })?; - - Ok(Redirect::found(rocket::uri!(r_library_node(id)))) -} - -#[post("/n//progress?")] -pub async fn r_player_progress( - session: Session, - db: &State, - id: &str, - t: f64, -) -> MyResult<()> { - db.node - .get(&id.to_string())? - .ok_or(anyhow!("node does not exist"))?; - - let key = (session.user.name.clone(), id.to_owned()); - db.user_node.fetch_and_update(&key, |d| { - let mut d = d.unwrap_or_default(); - d.watched = match d.watched { - WatchedState::None | WatchedState::Pending | WatchedState::Progress(_) => { - WatchedState::Progress(t) - } - WatchedState::Watched => WatchedState::Watched, - }; - Some(d) - })?; - Ok(()) -} 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/userdata.rs b/server/src/routes/userdata.rs new file mode 100644 index 0000000..2ded24a --- /dev/null +++ b/server/src/routes/userdata.rs @@ -0,0 +1,84 @@ +/* + 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 +*/ +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::{NodeUserData, WatchedState}; +use rocket::{ + get, post, response::Redirect, serde::json::Json, FromFormField, State, UriDisplayQuery, +}; + +#[derive(Debug, FromFormField, UriDisplayQuery)] +pub enum UrlWatchedState { + None, + Watched, + Pending, +} + +#[get("/n//userdata")] +pub fn r_node_userdata( + session: Session, + db: &State, + id: &str, +) -> MyResult> { + 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//watched?")] +pub async fn r_player_watched( + session: Session, + db: &State, + id: &str, + state: UrlWatchedState, +) -> MyResult { + db.node + .get(&id.to_string())? + .ok_or(anyhow!("node does not exist"))?; + + let key = (session.user.name.clone(), id.to_owned()); + + db.user_node.fetch_and_update(&key, |t| { + let mut t = t.unwrap_or_default(); + t.watched = match state { + UrlWatchedState::None => WatchedState::None, + UrlWatchedState::Watched => WatchedState::Watched, + UrlWatchedState::Pending => WatchedState::Pending, + }; + Some(t) + })?; + + Ok(Redirect::found(rocket::uri!(r_library_node(id)))) +} + +#[post("/n//progress?")] +pub async fn r_player_progress( + session: Session, + db: &State, + id: &str, + t: f64, +) -> MyResult<()> { + db.node + .get(&id.to_string())? + .ok_or(anyhow!("node does not exist"))?; + + let key = (session.user.name.clone(), id.to_owned()); + db.user_node.fetch_and_update(&key, |d| { + let mut d = d.unwrap_or_default(); + d.watched = match d.watched { + WatchedState::None | WatchedState::Pending | WatchedState::Progress(_) => { + WatchedState::Progress(t) + } + WatchedState::Watched => WatchedState::Watched, + }; + Some(d) + })?; + Ok(()) +} -- cgit v1.2.3-70-g09d2