diff options
Diffstat (limited to 'server/src/routes/ui/player.rs')
-rw-r--r-- | server/src/routes/ui/player.rs | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/server/src/routes/ui/player.rs b/server/src/routes/ui/player.rs index 2f28f74..c2188a8 100644 --- a/server/src/routes/ui/player.rs +++ b/server/src/routes/ui/player.rs @@ -6,12 +6,14 @@ use super::{ account::session::{token, Session}, layout::LayoutPage, + node::{get_similar_media, DatabaseNodeUserDataExt, NodePage}, + sort::NodeFilterSort, }; use crate::{ database::Database, routes::{ stream::rocket_uri_macro_r_stream, - ui::{assets::rocket_uri_macro_r_item_backdrop, error::MyResult, layout::DynLayoutPage}, + ui::{error::MyResult, layout::DynLayoutPage}, }, uri, }; @@ -20,7 +22,7 @@ use jellybase::{permission::PermissionSetExt, CONF}; use jellycommon::{ stream::{StreamFormat, StreamSpec}, user::{PermissionSet, PlayerKind, UserPermission}, - Node, NodeID, SourceTrackKind, TrackID, + Node, NodeID, SourceTrackKind, TrackID, Visibility, }; use markup::DynRender; use rocket::{get, response::Redirect, Either, FromForm, State, UriDisplayQuery}; @@ -59,12 +61,23 @@ fn jellynative_url(action: &str, seek: f64, secret: &str, node: &str, session: & #[get("/n/<id>/player?<conf..>", rank = 4)] pub fn r_player( - sess: Session, + session: Session, db: &State<Database>, id: NodeID, conf: PlayerConfig, ) -> MyResult<Either<DynLayoutPage<'_>, Redirect>> { - let node = db.get_node(id)?.ok_or(anyhow!("node does not exist"))?; + 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 native_session = |action: &str| { let perm = [ @@ -73,22 +86,22 @@ pub fn r_player( UserPermission::StreamFormat(StreamFormat::Fragment), ]; for perm in &perm { - sess.user.permissions.assert(perm)?; + session.user.permissions.assert(perm)?; } Ok(Either::Right(Redirect::temporary(jellynative_url( action, conf.t.unwrap_or(0.), - &sess.user.native_secret, + &session.user.native_secret, &id.to_string(), &token::create( - sess.user.name, + session.user.name, PermissionSet(perm.map(|e| (e, true)).into()), chrono::Duration::hours(24), ), )))) }; - match conf.kind.unwrap_or(sess.user.player_preference) { + match conf.kind.unwrap_or(session.user.player_preference) { PlayerKind::Browser => (), PlayerKind::Native => { return native_session("player-v2"); @@ -117,11 +130,8 @@ pub fn r_player( 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"]{} - } else { - img.backdrop[src=uri!(r_item_backdrop(&node.slug, Some(2048))).to_string()]; - } + video[id="player", src=uri!(r_stream(&node.slug, &spec)), controls, preload="auto"]{} + @NodePage { children: &[], parents: &parents, filter: &NodeFilterSort::default(), node: &node, udata: &udata, player: true, similar: &similar } @conf }, })) |