diff options
Diffstat (limited to 'server/src/routes')
-rw-r--r-- | server/src/routes/api/mod.rs | 24 | ||||
-rw-r--r-- | server/src/routes/stream.rs | 54 | ||||
-rw-r--r-- | server/src/routes/ui/error.rs | 7 | ||||
-rw-r--r-- | server/src/routes/ui/player.rs | 9 |
4 files changed, 31 insertions, 63 deletions
diff --git a/server/src/routes/api/mod.rs b/server/src/routes/api/mod.rs index 84dd6a8..b39950c 100644 --- a/server/src/routes/api/mod.rs +++ b/server/src/routes/api/mod.rs @@ -9,7 +9,6 @@ use super::ui::{ error::MyResult, }; use crate::database::Database; -use reqwest::Client; use rocket::{get, post, response::Redirect, serde::json::Json, State}; use serde_json::{json, Value}; @@ -28,26 +27,3 @@ pub fn r_api_account_login(database: &State<Database>, data: Json<LoginForm>) -> let token = login_logic(database, &data.username, &data.password)?; Ok(json!(token)) } -pub async fn c_api_account_login( - host: &str, - tls: bool, - username: String, - password: String, - expire: u64, -) -> MyResult<String> { - Ok(Client::builder() - .build()? - .post(format!( - "{}://{host}/api/account/login", - if tls { "https" } else { "http" } - )) - .body(serde_json::to_string(&LoginForm { - expire, - password, - username, - })?) - .send() - .await? - .json() - .await?) -} diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs index 19a3f09..1277646 100644 --- a/server/src/routes/stream.rs +++ b/server/src/routes/stream.rs @@ -4,7 +4,7 @@ Copyright (C) 2023 metamuffin <metamuffin.org> */ use super::ui::{account::session::Session, error::MyError}; -use crate::{database::Database, routes::api::c_api_account_login, uri, CONF}; +use crate::{database::Database, CONF}; use anyhow::{anyhow, Result}; use jellycommon::MediaSource; use jellyremuxer::RemuxerContext; @@ -16,23 +16,13 @@ use rocket::{ response::{self, Redirect, Responder}, Either, Request, Response, State, }; -use std::ops::{Deref, Range}; +use std::{ + ops::{Deref, Range}, + time::Duration, +}; use tokio::io::{duplex, DuplexStream}; use tokio_util::io::SyncIoBridge; -pub fn stream_uri(id: &str, tracks: &[u64], webm: bool) -> String { - format!( - "/n/{}/stream?tracks={}&webm={}", - id, - tracks - .iter() - .map(|v| format!("{v}")) - .collect::<Vec<_>>() - .join(","), - if webm { "1" } else { "0" } - ) -} - #[get("/n/<id>/stream?<tracks>&<webm>")] pub async fn r_stream( _sess: Session, @@ -49,6 +39,11 @@ pub async fn r_stream( .source .ok_or(anyhow!("item does not contain media"))?; + let tracks = tracks + .split(',') + .map(|e| e.parse().map_err(|_| anyhow!("invalid number"))) + .collect::<Result<Vec<_>, _>>()?; + let source_tracks = match source { MediaSource::Local { tracks } => tracks, MediaSource::Remote { host, remote_id } => { @@ -56,15 +51,22 @@ pub async fn r_stream( .remote_credentials .get(&host) .ok_or(anyhow!("no credentials on the server-side"))?; - let token = - c_api_account_login(&host, false, username.to_owned(), password.to_owned(), 60) - .await?; - let uri = format!( - "{}://{host}{}&session={}", - if *tls { "https" } else { "http" }, - uri!(r_stream(remote_id, tracks, webm)), - token + let instance = jellyclient::Instance { host, tls: *tls }; + let session = jellyclient::login( + &instance, + username.to_owned(), + password.to_owned(), + Duration::from_secs(60), + ) + .await?; + + let uri = jellyclient::stream( + &instance, + &session, + &remote_id, + &tracks, + webm.unwrap_or(false), ); return Ok(Either::Right(Redirect::found(uri))); } @@ -79,13 +81,7 @@ pub async fn r_stream( ); let (a, b) = duplex(4096); - let remuxer = remuxer.deref().clone(); - let tracks = tracks - .split(',') - .map(|e| e.parse().map_err(|_| anyhow!("invalid number"))) - .collect::<Result<Vec<_>, _>>()?; - let b = SyncIoBridge::new(b); let urange = match &range { diff --git a/server/src/routes/ui/error.rs b/server/src/routes/ui/error.rs index d911a41..01aebd3 100644 --- a/server/src/routes/ui/error.rs +++ b/server/src/routes/ui/error.rs @@ -90,9 +90,4 @@ impl From<serde_json::Error> for MyError { fn from(err: serde_json::Error) -> Self { MyError(anyhow::anyhow!("{err}")) } -} -impl From<reqwest::Error> for MyError { - fn from(err: reqwest::Error) -> Self { - MyError(anyhow::anyhow!("{err}")) - } -} +}
\ No newline at end of file diff --git a/server/src/routes/ui/player.rs b/server/src/routes/ui/player.rs index 2af9d9e..e295b02 100644 --- a/server/src/routes/ui/player.rs +++ b/server/src/routes/ui/player.rs @@ -7,7 +7,7 @@ use super::{account::session::Session, layout::LayoutPage}; use crate::{ database::Database, routes::{ - stream::stream_uri, + stream::rocket_uri_macro_r_stream, ui::{ assets::{rocket_uri_macro_r_item_assets, AssetRole}, error::MyResult, @@ -21,7 +21,6 @@ use jellycommon::{Node, SourceTrackKind}; use markup::DynRender; use rocket::{get, FromForm, State}; - #[derive(FromForm, Default, Clone, Debug)] pub struct PlayerConfig { pub a: Option<u64>, @@ -47,7 +46,9 @@ pub fn r_player( .chain(conf.v.into_iter()) .chain(conf.a.into_iter()) .chain(conf.s.into_iter()) - .collect::<Vec<_>>(); + .map(|e| format!("{e}")) + .collect::<Vec<_>>() + .join(","); let conf = player_conf(item.clone(), !tracks.is_empty())?; Ok(LayoutPage { @@ -57,7 +58,7 @@ pub fn r_player( @if tracks.is_empty() { img.backdrop[src=uri!(r_item_assets(&id, AssetRole::Backdrop)).to_string()]; } else { - video[src=stream_uri(&id, &tracks, true), controls]{} + video[src=uri!(r_stream(&id, &tracks, Some(true))), controls]{} } @conf }, |