aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/player.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/ui/player.rs')
-rw-r--r--server/src/ui/player.rs102
1 files changed, 39 insertions, 63 deletions
diff --git a/server/src/ui/player.rs b/server/src/ui/player.rs
index db2f665..573530b 100644
--- a/server/src/ui/player.rs
+++ b/server/src/ui/player.rs
@@ -3,38 +3,27 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2025 metamuffin <metamuffin.org>
*/
-use super::sort::NodeFilterSort;
-use crate::{
- database::Database,
- locale::AcceptLanguage,
- logic::session::{self, Session},
-};
+use super::error::MyResult;
+use crate::{database::Database, locale::AcceptLanguage};
use jellybase::CONF;
use jellycommon::{
+ api::NodeFilterSort,
stream::{StreamContainer, StreamSpec},
user::{PermissionSet, PlayerKind},
- NodeID, TrackID, Visibility,
+ NodeID,
+};
+use jellyimport::is_importing;
+use jellylogic::{node::get_node, session::Session};
+use jellyui::{
+ node_page::NodePage,
+ render_page,
+ scaffold::{RenderInfo, SessionInfo},
+};
+use rocket::{
+ get,
+ response::{content::RawHtml, Redirect},
+ Either, State,
};
-use rocket::{get, response::Redirect, Either, FromForm, State, UriDisplayQuery};
-use std::sync::Arc;
-
-#[derive(FromForm, Default, Clone, Debug, UriDisplayQuery)]
-pub struct PlayerConfig {
- pub a: Option<TrackID>,
- pub v: Option<TrackID>,
- pub s: Option<TrackID>,
- pub t: Option<f64>,
- pub kind: Option<PlayerKind>,
-}
-
-impl PlayerConfig {
- pub fn seek(t: f64) -> Self {
- Self {
- t: Some(t),
- ..Default::default()
- }
- }
-}
fn jellynative_url(action: &str, seek: f64, secret: &str, node: &str, session: &str) -> String {
let protocol = if CONF.tls { "https" } else { "http" };
@@ -50,35 +39,25 @@ fn jellynative_url(action: &str, seek: f64, secret: &str, node: &str, session: &
format!("jellynative://{action}/{secret}/{session}/{seek}/{protocol}://{host}{stream_url}",)
}
-#[get("/n/<id>/player?<conf..>", rank = 4)]
+#[get("/n/<id>/player?<t>", rank = 4)]
pub fn r_player(
session: Session,
lang: AcceptLanguage,
db: &State<Database>,
+ t: Option<f64>,
id: NodeID,
- conf: PlayerConfig,
-) -> MyResult<Either<DynLayoutPage<'_>, Redirect>> {
+) -> MyResult<Either<RawHtml<String>, Redirect>> {
let AcceptLanguage(lang) = lang;
- let (node, udata) = db.get_node_with_userdata(id, &session)?;
- let mut parents = node
- .parents
- .iter()
- .map(|pid| db.get_node_with_userdata(*pid, &session))
- .collect::<anyhow::Result<Vec<_>>>()?;
-
- let mut similar = get_similar_media(&node, db, &session)?;
-
- similar.retain(|(n, _)| n.visibility >= Visibility::Reduced);
- parents.retain(|(n, _)| n.visibility >= Visibility::Reduced);
+ let r = get_node(&db, id, &session, false, true, NodeFilterSort::default())?;
let native_session = |action: &str| {
Ok(Either::Right(Redirect::temporary(jellynative_url(
action,
- conf.t.unwrap_or(0.),
+ t.unwrap_or(0.),
&session.user.native_secret,
&id.to_string(),
- &session::create(
+ &jellylogic::session::create(
session.user.name,
PermissionSet::default(), // TODO
chrono::Duration::hours(24),
@@ -86,7 +65,7 @@ pub fn r_player(
))))
};
- match conf.kind.unwrap_or(session.user.player_preference) {
+ match session.user.player_preference {
PlayerKind::Browser => (),
PlayerKind::Native => {
return native_session("player-v2");
@@ -111,26 +90,23 @@ pub fn r_player(
// let playing = false; // !spec.track.is_empty();
// let conf = player_conf(node.clone(), playing)?;
- Ok(Either::Left(LayoutPage {
- title: node.title.to_owned().unwrap_or_default(),
- class: Some("player"),
- content: markup::new! {
- // @if playing {
- // // video[src=uri!(r_stream(&node.slug, &spec)), controls, preload="auto"]{}
- // }
- // @conf
- @NodePage {
- children: &[],
- parents: &parents,
- filter: &NodeFilterSort::default(),
- node: &node,
- udata: &udata,
- player: true,
- similar: &similar,
- lang: &lang
- }
+ Ok(Either::Left(RawHtml(render_page(
+ &NodePage {
+ node: &r.node,
+ udata: &r.userdata,
+ children: &r.children,
+ parents: &r.parents,
+ similar: &[],
+ filter: &NodeFilterSort::default(),
+ lang: &lang,
+ player: true,
+ },
+ RenderInfo {
+ importing: is_importing(),
+ session: Some(SessionInfo { user: session.user }),
},
- }))
+ lang,
+ ))))
}
// pub fn player_conf<'a>(item: Arc<Node>, playing: bool) -> anyhow::Result<DynRender<'a>> {