diff options
Diffstat (limited to 'server/src/routes/ui/player.rs')
-rw-r--r-- | server/src/routes/ui/player.rs | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/server/src/routes/ui/player.rs b/server/src/routes/ui/player.rs index 2cc2dd4..d2a8236 100644 --- a/server/src/routes/ui/player.rs +++ b/server/src/routes/ui/player.rs @@ -6,6 +6,7 @@ use super::{ account::session::{token, Session}, layout::LayoutPage, + node::{get_similar_media, DatabaseNodeUserDataExt}, }; use crate::{ database::Database, @@ -19,7 +20,7 @@ use jellybase::CONF; use jellycommon::{ stream::{StreamContainer, StreamSpec}, user::{PermissionSet, PlayerKind}, - Node, NodeID, SourceTrackKind, TrackID, + Node, NodeID, SourceTrackKind, TrackID, Visibility, }; use markup::DynRender; use rocket::{get, response::Redirect, Either, FromForm, State, UriDisplayQuery}; @@ -59,28 +60,39 @@ 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| { 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::default(), // TODO 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"); |