diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-19 00:34:03 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-19 00:34:03 +0100 |
| commit | 38c3903265d3f47206e13232606d864b05ad00cc (patch) | |
| tree | fe64d4bec58e31d6b34b7158075ca312bf2008e1 /server | |
| parent | 848d4adc1a6095e92b67d2fe7211c303924e5c04 (diff) | |
| download | jellything-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.rs | 3 | ||||
| -rw-r--r-- | server/src/ui/mod.rs | 1 | ||||
| -rw-r--r-- | server/src/ui/player.rs | 111 |
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>> { |