diff options
Diffstat (limited to 'server/src/ui/player.rs')
-rw-r--r-- | server/src/ui/player.rs | 102 |
1 files changed, 39 insertions, 63 deletions
diff --git a/server/src/ui/player.rs b/server/src/ui/player.rs index db2f665..573530b 100644 --- a/server/src/ui/player.rs +++ b/server/src/ui/player.rs @@ -3,38 +3,27 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin <metamuffin.org> */ -use super::sort::NodeFilterSort; -use crate::{ - database::Database, - locale::AcceptLanguage, - logic::session::{self, Session}, -}; +use super::error::MyResult; +use crate::{database::Database, locale::AcceptLanguage}; use jellybase::CONF; use jellycommon::{ + api::NodeFilterSort, stream::{StreamContainer, StreamSpec}, user::{PermissionSet, PlayerKind}, - NodeID, TrackID, Visibility, + NodeID, +}; +use jellyimport::is_importing; +use jellylogic::{node::get_node, session::Session}; +use jellyui::{ + node_page::NodePage, + render_page, + scaffold::{RenderInfo, SessionInfo}, +}; +use rocket::{ + get, + response::{content::RawHtml, Redirect}, + Either, State, }; -use rocket::{get, response::Redirect, Either, FromForm, State, UriDisplayQuery}; -use std::sync::Arc; - -#[derive(FromForm, Default, Clone, Debug, UriDisplayQuery)] -pub struct PlayerConfig { - pub a: Option<TrackID>, - pub v: Option<TrackID>, - pub s: Option<TrackID>, - pub t: Option<f64>, - pub kind: Option<PlayerKind>, -} - -impl PlayerConfig { - pub fn seek(t: f64) -> Self { - Self { - t: Some(t), - ..Default::default() - } - } -} fn jellynative_url(action: &str, seek: f64, secret: &str, node: &str, session: &str) -> String { let protocol = if CONF.tls { "https" } else { "http" }; @@ -50,35 +39,25 @@ fn jellynative_url(action: &str, seek: f64, secret: &str, node: &str, session: & format!("jellynative://{action}/{secret}/{session}/{seek}/{protocol}://{host}{stream_url}",) } -#[get("/n/<id>/player?<conf..>", rank = 4)] +#[get("/n/<id>/player?<t>", rank = 4)] pub fn r_player( session: Session, lang: AcceptLanguage, db: &State<Database>, + t: Option<f64>, id: NodeID, - conf: PlayerConfig, -) -> MyResult<Either<DynLayoutPage<'_>, Redirect>> { +) -> MyResult<Either<RawHtml<String>, Redirect>> { let AcceptLanguage(lang) = lang; - let (node, udata) = db.get_node_with_userdata(id, &session)?; - let mut parents = node - .parents - .iter() - .map(|pid| db.get_node_with_userdata(*pid, &session)) - .collect::<anyhow::Result<Vec<_>>>()?; - - let mut similar = get_similar_media(&node, db, &session)?; - - similar.retain(|(n, _)| n.visibility >= Visibility::Reduced); - parents.retain(|(n, _)| n.visibility >= Visibility::Reduced); + let r = get_node(&db, id, &session, false, true, NodeFilterSort::default())?; let native_session = |action: &str| { Ok(Either::Right(Redirect::temporary(jellynative_url( action, - conf.t.unwrap_or(0.), + t.unwrap_or(0.), &session.user.native_secret, &id.to_string(), - &session::create( + &jellylogic::session::create( session.user.name, PermissionSet::default(), // TODO chrono::Duration::hours(24), @@ -86,7 +65,7 @@ pub fn r_player( )))) }; - match conf.kind.unwrap_or(session.user.player_preference) { + match session.user.player_preference { PlayerKind::Browser => (), PlayerKind::Native => { return native_session("player-v2"); @@ -111,26 +90,23 @@ pub fn r_player( // let playing = false; // !spec.track.is_empty(); // let conf = player_conf(node.clone(), playing)?; - Ok(Either::Left(LayoutPage { - title: node.title.to_owned().unwrap_or_default(), - class: Some("player"), - content: markup::new! { - // @if playing { - // // video[src=uri!(r_stream(&node.slug, &spec)), controls, preload="auto"]{} - // } - // @conf - @NodePage { - children: &[], - parents: &parents, - filter: &NodeFilterSort::default(), - node: &node, - udata: &udata, - player: true, - similar: &similar, - lang: &lang - } + Ok(Either::Left(RawHtml(render_page( + &NodePage { + node: &r.node, + udata: &r.userdata, + children: &r.children, + parents: &r.parents, + similar: &[], + filter: &NodeFilterSort::default(), + lang: &lang, + player: true, + }, + RenderInfo { + importing: is_importing(), + session: Some(SessionInfo { user: session.user }), }, - })) + lang, + )))) } // pub fn player_conf<'a>(item: Arc<Node>, playing: bool) -> anyhow::Result<DynRender<'a>> { |