aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/player.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/player.rs')
-rw-r--r--server/src/routes/ui/player.rs44
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>> {