diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/main.rs | 12 | ||||
-rw-r--r-- | server/src/routes/ui/account/mod.rs | 6 | ||||
-rw-r--r-- | server/src/routes/ui/account/settings.rs | 22 | ||||
-rw-r--r-- | server/src/routes/ui/player.rs | 44 |
4 files changed, 63 insertions, 21 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index a94fe32..919ba50 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -10,9 +10,11 @@ use crate::routes::ui::{account::hash_password, admin::log::enable_logging}; use database::DataAcid; use jellybase::{ - database::{ReadableTable, Ser, T_USER}, federation::Federation, CONF, SECRETS + database::{ReadableTable, Ser, T_USER}, + federation::Federation, + CONF, SECRETS, }; -use jellycommon::user::{PermissionSet, Theme, User}; +use jellycommon::user::User; use log::{error, info, warn}; use routes::build_rocket; use tokio::fs::create_dir_all; @@ -45,12 +47,8 @@ async fn main() { name: username.clone(), password: hash_password(&username, &password), ..admin.unwrap_or_else(|| User { - name: Default::default(), display_name: "Admin".to_string(), - password: Default::default(), - admin: Default::default(), - theme: Theme::Dark, - permissions: PermissionSet::default(), + ..Default::default() }) }), ) diff --git a/server/src/routes/ui/account/mod.rs b/server/src/routes/ui/account/mod.rs index 5298f7c..144b1e0 100644 --- a/server/src/routes/ui/account/mod.rs +++ b/server/src/routes/ui/account/mod.rs @@ -22,7 +22,7 @@ use jellybase::{ database::{Ser, TableExt, T_INVITE, T_USER}, CONF, }; -use jellycommon::user::{PermissionSet, Theme, User, UserPermission}; +use jellycommon::user::{User, UserPermission}; use rocket::{ form::{Contextual, Form}, get, @@ -148,9 +148,7 @@ pub fn r_account_register_post<'a>( display_name: form.username.clone(), name: form.username.clone(), password: hash_password(&form.username, &form.password), - admin: false, - theme: Theme::Dark, - permissions: PermissionSet::default(), + ..Default::default() }), )? .map(|x| x.value().0); diff --git a/server/src/routes/ui/account/settings.rs b/server/src/routes/ui/account/settings.rs index 48e0e9f..e91bec0 100644 --- a/server/src/routes/ui/account/settings.rs +++ b/server/src/routes/ui/account/settings.rs @@ -18,7 +18,7 @@ use jellybase::{ database::{ReadableTable, Ser, T_USER}, permission::PermissionSetExt, }; -use jellycommon::user::{Theme, UserPermission}; +use jellycommon::user::{PlayerKind, Theme, UserPermission}; use markup::{Render, RenderAttributeValue}; use rocket::{ form::{self, validate::len, Contextual, Form}, @@ -35,6 +35,7 @@ pub struct SettingsForm { #[field(validate = option_len(4..32))] display_name: Option<String>, theme: Option<Theme>, + player_preference: Option<PlayerKind>, } fn option_len<'v>(value: &Option<String>, range: Range<usize>) -> form::Result<'v, ()> { @@ -80,14 +81,23 @@ fn settings_page(session: Session, flash: Option<MyResult<String>>) -> DynLayout } input[type="submit", value="Apply"]; } + form[method="POST", action=uri!(r_account_settings_post())] { + fieldset { + legend { "Preferred Media Player" } + @for (t, tlabel) in PlayerKind::LIST { + label { input[type="radio", name="player_preference", value=A(*t), checked=session.user.player_preference==*t]; @tlabel } br; + } + } + input[type="submit", value="Apply"]; + } }, ..Default::default() } } -struct A(pub Theme); -impl RenderAttributeValue for A {} -impl Render for A { +struct A<T>(pub T); +impl<T: UriDisplay<Query>> RenderAttributeValue for A<T> {} +impl<T: UriDisplay<Query>> Render for A<T> { fn render(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { writer.write_fmt(format_args!("{}", &self.0 as &dyn UriDisplay<Query>)) } @@ -137,6 +147,10 @@ pub fn r_account_settings_post( user.theme = theme; out += "Theme updated\n"; } + if let Some(player_preference) = form.player_preference { + user.player_preference = player_preference; + out += "Player preference changed.\n"; + } users.insert(&*session.user.name, Ser(user))?; drop(users); 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>> { |