aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-30 13:58:52 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-30 13:58:52 +0100
commit0010717b6e86bb662fa04dab94968eee6fe8de64 (patch)
tree77c806b7eccdf5dd461f5b074d1693d9f9bd915d /server/src
parent88734e0f3ffdbce436fd0ceeabea70b96c60f1f8 (diff)
downloadjellything-0010717b6e86bb662fa04dab94968eee6fe8de64.tar
jellything-0010717b6e86bb662fa04dab94968eee6fe8de64.tar.bz2
jellything-0010717b6e86bb662fa04dab94968eee6fe8de64.tar.zst
support native player in settings and jst
Diffstat (limited to 'server/src')
-rw-r--r--server/src/main.rs12
-rw-r--r--server/src/routes/ui/account/mod.rs6
-rw-r--r--server/src/routes/ui/account/settings.rs22
-rw-r--r--server/src/routes/ui/player.rs44
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>> {