aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-19 00:34:03 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-19 00:34:03 +0100
commit38c3903265d3f47206e13232606d864b05ad00cc (patch)
treefe64d4bec58e31d6b34b7158075ca312bf2008e1 /server
parent848d4adc1a6095e92b67d2fe7211c303924e5c04 (diff)
downloadjellything-38c3903265d3f47206e13232606d864b05ad00cc.tar
jellything-38c3903265d3f47206e13232606d864b05ad00cc.tar.bz2
jellything-38c3903265d3f47206e13232606d864b05ad00cc.tar.zst
readd player page; ident naming
Diffstat (limited to 'server')
-rw-r--r--server/src/routes.rs3
-rw-r--r--server/src/ui/mod.rs1
-rw-r--r--server/src/ui/player.rs111
3 files changed, 40 insertions, 75 deletions
diff --git a/server/src/routes.rs b/server/src/routes.rs
index c9601d3..acf6ffd 100644
--- a/server/src/routes.rs
+++ b/server/src/routes.rs
@@ -21,6 +21,7 @@ use crate::{
error::{r_api_catch, r_catch},
home::r_home,
node::r_node,
+ player::r_player,
r_favicon, r_index,
style::{r_assets_css, r_assets_font, r_assets_js, r_assets_js_map},
},
@@ -107,7 +108,7 @@ pub(super) fn build_rocket(state: Arc<State>) -> Rocket<Build> {
// r_node_userdata_rating,
// r_node_userdata_watched,
// r_node_userdata,
- // r_player,
+ r_player,
r_playersync,
// r_search,
// r_stats,
diff --git a/server/src/ui/mod.rs b/server/src/ui/mod.rs
index 855b25f..116ed3c 100644
--- a/server/src/ui/mod.rs
+++ b/server/src/ui/mod.rs
@@ -17,6 +17,7 @@ pub mod error;
pub mod home;
pub mod node;
pub mod style;
+pub mod player;
#[get("/")]
pub async fn r_index(ri: RequestInfo<'_>) -> MyResult<Redirect> {
diff --git a/server/src/ui/player.rs b/server/src/ui/player.rs
index b9d7d2e..6af1012 100644
--- a/server/src/ui/player.rs
+++ b/server/src/ui/player.rs
@@ -4,87 +4,50 @@
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
use super::error::MyResult;
-use crate::request_info::RequestInfo;
-use jellycommon::stream::{StreamContainer, StreamSpec};
-use rocket::{
- Either, get,
- response::{Redirect, content::RawHtml},
+use crate::{request_info::RequestInfo, ui_responder::UiResponse};
+use jellycommon::{
+ NKU_NODE, NO_SLUG, VIEW_PLAYER,
+ jellyobject::{Object, ObjectBuffer, ObjectBufferBuilder, Path},
};
-use std::time::Duration;
+use jellydb::{Filter, Query, Sort};
+use rocket::get;
-fn jellynative_url(action: &str, seek: f64, secret: &str, node: &str, session: &str) -> String {
- let protocol = if CONF.tls { "https" } else { "http" };
- let host = &CONF.hostname;
- let stream_url = format!(
- "/n/{node}/stream{}",
- StreamSpec::HlsMultiVariant {
- container: StreamContainer::Matroska
- }
- .to_query()
- );
- format!("jellynative://{action}/{secret}/{session}/{seek}/{protocol}://{host}{stream_url}",)
-}
+// fn jellynative_url(action: &str, seek: f64, secret: &str, node: &str, session: &str) -> String {
+// let protocol = if CONF.tls { "https" } else { "http" };
+// let host = &CONF.hostname;
+// let stream_url = format!(
+// "/n/{node}/stream{}",
+// StreamSpec::HlsMultiVariant {
+// container: StreamContainer::Matroska
+// }
+// .to_query()
+// );
+// format!("jellynative://{action}/{secret}/{session}/{seek}/{protocol}://{host}{stream_url}",)
+// }
-#[get("/n/<id>/player?<t>", rank = 4)]
-pub fn r_player(
- ri: RequestInfo,
- t: Option<f64>,
- id: A<NodeID>,
-) -> MyResult<Either<RawHtml<String>, Redirect>> {
- let r = get_node(&ri.session, id.0, false, true, NodeFilterSort::default())?;
+#[get("/n/<slug>/player?<t>", rank = 4)]
+pub fn r_player(ri: RequestInfo<'_>, t: Option<f64>, slug: &str) -> MyResult<UiResponse> {
+ ri.require_user()?;
+ let _ = t;
- let native_session = |action: &str| {
- Ok(Either::Right(Redirect::temporary(jellynative_url(
- action,
- t.unwrap_or(0.),
- &ri.session.user.native_secret,
- &id.0.to_string(),
- &jellylogic::session::create(
- ri.session.user.name.clone(),
- PermissionSet::default(), // TODO
- Duration::from_hours(24),
- ),
- ))))
- };
+ let mut page_out = ObjectBuffer::empty();
+ ri.state.database.transaction(&mut |txn| {
+ if let Some(row) = txn.query_single(Query {
+ filter: Filter::Match(Path(vec![NO_SLUG.0]), slug.into()),
+ sort: Sort::None,
+ })? {
+ let n = txn.get(row)?.unwrap();
+ let nku = Object::EMPTY.insert(NKU_NODE, n.as_object());
- match ri.session.user.player_preference {
- PlayerKind::Browser => (),
- PlayerKind::Native => {
- return native_session("player-v2");
- }
- PlayerKind::NativeFullscreen => {
- return native_session("player-fullscreen-v2");
- }
- }
+ let mut page = ObjectBufferBuilder::default();
+ page.push(VIEW_PLAYER, nku.as_object());
- // TODO
- // let spec = StreamSpec {
- // track: None
- // .into_iter()
- // .chain(conf.v)
- // .chain(conf.a)
- // .chain(conf.s)
- // .collect::<Vec<_>>(),
- // format: StreamFormat::Matroska,
- // webm: Some(true),
- // ..Default::default()
- // };
- // let playing = false; // !spec.track.is_empty();
- // let conf = player_conf(node.clone(), playing)?;
+ page_out = page.finish();
+ }
+ Ok(())
+ })?;
- Ok(Either::Left(RawHtml(render_page(
- &NodePage {
- node: &r.node,
- udata: &r.userdata,
- children: &r.children,
- parents: &r.parents,
- similar: &[],
- filter: &NodeFilterSort::default(),
- lang: &ri.lang,
- player: true,
- },
- ri.render_info(),
- ))))
+ Ok(ri.respond_ui(page_out))
}
// pub fn player_conf<'a>(item: Arc<Node>, playing: bool) -> anyhow::Result<DynRender<'a>> {