aboutsummaryrefslogtreecommitdiff
path: root/server/src/logic
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/logic')
-rw-r--r--server/src/logic/playersync.rs6
-rw-r--r--server/src/logic/stream.rs133
-rw-r--r--server/src/logic/userdata.rs101
3 files changed, 113 insertions, 127 deletions
diff --git a/server/src/logic/playersync.rs b/server/src/logic/playersync.rs
index 6c1f9f4..71e2809 100644
--- a/server/src/logic/playersync.rs
+++ b/server/src/logic/playersync.rs
@@ -2,12 +2,12 @@ use anyhow::bail;
use chashmap::CHashMap;
use futures::{SinkExt, StreamExt};
use log::warn;
-use rocket::{get, State};
-use rocket_ws::{stream::DuplexStream, Channel, Message, WebSocket};
+use rocket::{State, get};
+use rocket_ws::{Channel, Message, WebSocket, stream::DuplexStream};
use serde::{Deserialize, Serialize};
use tokio::sync::broadcast::{self, Sender};
-use crate::request_info::cors::Cors;
+use crate::responders::cors::Cors;
#[derive(Default)]
pub struct PlayersyncChannels {
diff --git a/server/src/logic/stream.rs b/server/src/logic/stream.rs
index 55d6850..430c10c 100644
--- a/server/src/logic/stream.rs
+++ b/server/src/logic/stream.rs
@@ -3,18 +3,16 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-use crate::{request_info::A, ui::error::MyError};
-use anyhow::{anyhow, Result};
-use jellycommon::{api::NodeFilterSort, stream::StreamSpec, NodeID, TrackSource};
-use jellylogic::{node::get_node, session::Session};
+use crate::{request_info::RequestInfo, ui::error::MyError};
+use anyhow::{Result, anyhow};
+use jellycommon::stream::StreamSpec;
use jellystream::SMediaInfo;
use log::{info, warn};
use rocket::{
- get, head,
+ Either, Request, Response, get, head,
http::{Header, Status},
request::{self, FromRequest},
response::{self, Redirect, Responder},
- Either, Request, Response,
};
use std::{
collections::{BTreeMap, BTreeSet},
@@ -22,14 +20,14 @@ use std::{
sync::Arc,
};
use tokio::{
- io::{duplex, DuplexStream},
+ io::{DuplexStream, duplex},
task::spawn_blocking,
};
use tokio_util::io::SyncIoBridge;
#[head("/n/<_id>/stream?<spec..>")]
pub async fn r_stream_head(
- _sess: A<Session>,
+ _sess: RequestInfo<'_>,
_id: &str,
spec: BTreeMap<String, String>,
) -> Result<Either<StreamResponse, Redirect>, MyError> {
@@ -45,27 +43,27 @@ pub async fn r_stream_head(
#[get("/n/<id>/stream?<spec..>")]
pub async fn r_stream(
- session: A<Session>,
+ session: RequestInfo<'_>,
id: &str,
range: Option<RequestRange>,
spec: BTreeMap<String, String>,
) -> Result<Either<StreamResponse, RedirectResponse>, MyError> {
let spec = StreamSpec::from_query_kv(&spec).map_err(|x| anyhow!("spec invalid: {x}"))?;
- // TODO perm
- let node = get_node(
- &session.0,
- NodeID::from_slug(id),
- false,
- false,
- NodeFilterSort::default(),
- )?
- .node;
+ // // TODO perm
+ // let node = get_node(
+ // &session.0,
+ // NodeID::from_slug(id),
+ // false,
+ // false,
+ // NodeFilterSort::default(),
+ // )?
+ // .node;
- let media = Arc::new(
- node.media
- .clone()
- .ok_or(anyhow!("item does not contain media"))?,
- );
+ // let media = Arc::new(
+ // node.media
+ // .clone()
+ // .ok_or(anyhow!("item does not contain media"))?,
+ // );
// TODO its unclear how requests with multiple tracks should be handled.
// if spec.track.len() == 1 {
@@ -115,55 +113,56 @@ pub async fn r_stream(
// }
// }
- info!(
- "stream request (range={})",
- range
- .as_ref()
- .map(|r| r.to_cr_hv())
- .unwrap_or("none".to_string())
- );
+ // info!(
+ // "stream request (range={})",
+ // range
+ // .as_ref()
+ // .map(|r| r.to_cr_hv())
+ // .unwrap_or("none".to_string())
+ // );
- let urange = match &range {
- Some(r) => {
- let r = r.0.first().unwrap_or(&(None..None));
- r.start.unwrap_or(0)..r.end.unwrap_or(u64::MAX)
- }
- None => 0..u64::MAX,
- };
+ // let urange = match &range {
+ // Some(r) => {
+ // let r = r.0.first().unwrap_or(&(None..None));
+ // r.start.unwrap_or(0)..r.end.unwrap_or(u64::MAX)
+ // }
+ // None => 0..u64::MAX,
+ // };
- let head = jellystream::stream_head(&spec);
+ // let head = jellystream::stream_head(&spec);
- let mut sources = BTreeSet::new();
- for t in &media.tracks {
- if let TrackSource::Local(path, _) = &t.source {
- sources.insert(path.to_owned());
- }
- }
- let media = Arc::new(SMediaInfo {
- files: sources,
- title: node.title.clone(),
- });
+ // let mut sources = BTreeSet::new();
+ // for t in &media.tracks {
+ // if let TrackSource::Local(path, _) = &t.source {
+ // sources.insert(path.to_owned());
+ // }
+ // }
+ // let media = Arc::new(SMediaInfo {
+ // files: sources,
+ // title: node.title.clone(),
+ // });
- // TODO cleaner solution needed
- let mut reader = match spawn_blocking(move || jellystream::stream(media, spec, urange))
- .await
- .unwrap()
- {
- Ok(o) => o,
- Err(e) => {
- warn!("stream error: {e:?}");
- Err(e)?
- }
- };
- let (stream_write, stream_read) = duplex(4096);
- spawn_blocking(move || std::io::copy(&mut reader, &mut SyncIoBridge::new(stream_write)));
+ // // TODO cleaner solution needed
+ // let mut reader = match spawn_blocking(move || jellystream::stream(media, spec, urange))
+ // .await
+ // .unwrap()
+ // {
+ // Ok(o) => o,
+ // Err(e) => {
+ // warn!("stream error: {e:?}");
+ // Err(e)?
+ // }
+ // };
+ // let (stream_write, stream_read) = duplex(4096);
+ // spawn_blocking(move || std::io::copy(&mut reader, &mut SyncIoBridge::new(stream_write)));
- Ok(Either::Left(StreamResponse {
- stream: stream_read,
- range,
- advertise_range: head.range_supported,
- content_type: head.content_type,
- }))
+ // Ok(Either::Left(StreamResponse {
+ // stream: stream_read,
+ // range,
+ // advertise_range: head.range_supported,
+ // content_type: head.content_type,
+ // }))
+ todo!()
}
pub struct RedirectResponse(String);
diff --git a/server/src/logic/userdata.rs b/server/src/logic/userdata.rs
index 104de4a..ea96507 100644
--- a/server/src/logic/userdata.rs
+++ b/server/src/logic/userdata.rs
@@ -3,23 +3,10 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-use crate::{request_info::A, ui::error::MyResult};
-use jellycommon::{
- api::NodeFilterSort,
- routes::u_node_id,
- user::{NodeUserData, WatchedState},
- NodeID,
-};
-use jellylogic::{
- node::{
- get_node, update_node_userdata_rating, update_node_userdata_watched,
- update_node_userdata_watched_progress,
- },
- session::Session,
-};
+use crate::ui::error::MyResult;
use rocket::{
- form::Form, get, post, response::Redirect, serde::json::Json, FromForm, FromFormField,
- UriDisplayQuery,
+ FromForm, FromFormField, UriDisplayQuery, form::Form, get, post, response::Redirect,
+ serde::json::Json,
};
#[derive(Debug, FromFormField, UriDisplayQuery)]
@@ -29,48 +16,48 @@ pub enum UrlWatchedState {
Pending,
}
-#[get("/n/<id>/userdata")]
-pub fn r_node_userdata(session: A<Session>, id: A<NodeID>) -> MyResult<Json<NodeUserData>> {
- let u = get_node(&session.0, id.0, false, false, NodeFilterSort::default())?.userdata;
- Ok(Json(u))
-}
+// #[get("/n/<id>/userdata")]
+// pub fn r_node_userdata(session: A<Session>, id: A<NodeID>) -> MyResult<Json<NodeUserData>> {
+// let u = get_node(&session.0, id.0, false, false, NodeFilterSort::default())?.userdata;
+// Ok(Json(u))
+// }
-#[post("/n/<id>/watched?<state>")]
-pub async fn r_node_userdata_watched(
- session: A<Session>,
- id: A<NodeID>,
- state: UrlWatchedState,
-) -> MyResult<Redirect> {
- update_node_userdata_watched(
- &session.0,
- id.0,
- match state {
- UrlWatchedState::None => WatchedState::None,
- UrlWatchedState::Watched => WatchedState::Watched,
- UrlWatchedState::Pending => WatchedState::Pending,
- },
- )?;
- Ok(Redirect::found(u_node_id(id.0)))
-}
+// #[post("/n/<id>/watched?<state>")]
+// pub async fn r_node_userdata_watched(
+// session: A<Session>,
+// id: A<NodeID>,
+// state: UrlWatchedState,
+// ) -> MyResult<Redirect> {
+// update_node_userdata_watched(
+// &session.0,
+// id.0,
+// match state {
+// UrlWatchedState::None => WatchedState::None,
+// UrlWatchedState::Watched => WatchedState::Watched,
+// UrlWatchedState::Pending => WatchedState::Pending,
+// },
+// )?;
+// Ok(Redirect::found(u_node_id(id.0)))
+// }
-#[derive(FromForm)]
-pub struct UpdateRating {
- #[field(validate = range(-10..=10))]
- rating: i32,
-}
+// #[derive(FromForm)]
+// pub struct UpdateRating {
+// #[field(validate = range(-10..=10))]
+// rating: i32,
+// }
-#[post("/n/<id>/update_rating", data = "<form>")]
-pub async fn r_node_userdata_rating(
- session: A<Session>,
- id: A<NodeID>,
- form: Form<UpdateRating>,
-) -> MyResult<Redirect> {
- update_node_userdata_rating(&session.0, id.0, form.rating)?;
- Ok(Redirect::found(u_node_id(id.0)))
-}
+// #[post("/n/<id>/update_rating", data = "<form>")]
+// pub async fn r_node_userdata_rating(
+// session: A<Session>,
+// id: A<NodeID>,
+// form: Form<UpdateRating>,
+// ) -> MyResult<Redirect> {
+// update_node_userdata_rating(&session.0, id.0, form.rating)?;
+// Ok(Redirect::found(u_node_id(id.0)))
+// }
-#[post("/n/<id>/progress?<t>")]
-pub async fn r_node_userdata_progress(session: A<Session>, id: A<NodeID>, t: f64) -> MyResult<()> {
- update_node_userdata_watched_progress(&session.0, id.0, t)?;
- Ok(())
-}
+// #[post("/n/<id>/progress?<t>")]
+// pub async fn r_node_userdata_progress(session: A<Session>, id: A<NodeID>, t: f64) -> MyResult<()> {
+// update_node_userdata_watched_progress(&session.0, id.0, t)?;
+// Ok(())
+// }