diff options
Diffstat (limited to 'server/src/routes/ui/player.rs')
-rw-r--r-- | server/src/routes/ui/player.rs | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/server/src/routes/ui/player.rs b/server/src/routes/ui/player.rs index 233547e..be40d4c 100644 --- a/server/src/routes/ui/player.rs +++ b/server/src/routes/ui/player.rs @@ -17,13 +17,17 @@ use crate::{ uri, }; use anyhow::anyhow; -use jellybase::database::{TableExt, T_NODE}; +use jellybase::{ + database::{TableExt, T_NODE}, + CONF, +}; use jellycommon::{ stream::{StreamFormat, StreamSpec}, + user::PlayerKind, Node, SourceTrackKind, TrackID, }; use markup::DynRender; -use rocket::{get, FromForm, State, UriDisplayQuery}; +use rocket::{get, response::Redirect, Either, FromForm, State, UriDisplayQuery}; #[derive(FromForm, Default, Clone, Debug, UriDisplayQuery)] pub struct PlayerConfig { @@ -42,15 +46,43 @@ impl PlayerConfig { } } +fn jellynative_url(action: &str, node: &str) -> String { + format!( + "jellynative://{action}/http://{}{}", + CONF.hostname, + uri!(r_stream( + node, + StreamSpec { + format: StreamFormat::HlsMaster, + ..Default::default() + } + )) + ) +} #[get("/n/<id>/player?<conf..>", rank = 4)] pub fn r_player<'a>( - _sess: Session, + sess: Session, db: &'a State<DataAcid>, id: &'a str, conf: PlayerConfig, -) -> MyResult<DynLayoutPage<'a>> { +) -> MyResult<Either<DynLayoutPage<'a>, Redirect>> { let item = T_NODE.get(db, id)?.ok_or(anyhow!("node does not exist"))?; + match sess.user.player_preference { + PlayerKind::Browser => (), + PlayerKind::Native => { + return Ok(Either::Right(Redirect::temporary(jellynative_url( + "player", id, + )))) + } + PlayerKind::NativeFullscreen => { + return Ok(Either::Right(Redirect::temporary(jellynative_url( + "player-fullscreen", + id, + )))) + } + } + let spec = StreamSpec { track: None .into_iter() @@ -66,7 +98,7 @@ pub fn r_player<'a>( let playing = !spec.track.is_empty(); let conf = player_conf(item.clone(), playing)?; - Ok(LayoutPage { + Ok(Either::Left(LayoutPage { title: item.public.title.to_owned().unwrap_or_default(), class: Some("player"), content: markup::new! { @@ -78,7 +110,7 @@ pub fn r_player<'a>( @conf }, ..Default::default() - }) + })) } pub fn player_conf<'a>(item: Node, playing: bool) -> anyhow::Result<DynRender<'a>> { |