diff options
Diffstat (limited to 'server/src/routes')
-rw-r--r-- | server/src/routes/api/mod.rs | 5 | ||||
-rw-r--r-- | server/src/routes/mod.rs | 9 | ||||
-rw-r--r-- | server/src/routes/stream.rs | 29 | ||||
-rw-r--r-- | server/src/routes/ui/account/admin.rs | 4 | ||||
-rw-r--r-- | server/src/routes/ui/error.rs | 7 |
5 files changed, 30 insertions, 24 deletions
diff --git a/server/src/routes/api/mod.rs b/server/src/routes/api/mod.rs index e74b134..cc87525 100644 --- a/server/src/routes/api/mod.rs +++ b/server/src/routes/api/mod.rs @@ -4,8 +4,6 @@ Copyright (C) 2023 metamuffin <metamuffin.org> */ -use std::ops::Deref; - use super::ui::{ account::{login_logic, LoginForm}, error::MyResult, @@ -22,6 +20,7 @@ use rocket::{ Request, State, }; use serde_json::{json, Value}; +use std::ops::Deref; #[get("/api")] pub fn r_api_root() -> Redirect { @@ -33,7 +32,7 @@ pub fn r_api_version() -> &'static str { "2" } -#[post("/api/account/login", data = "<data>")] +#[post("/api/create_session", data = "<data>")] pub fn r_api_account_login(database: &State<Database>, data: Json<LoginForm>) -> MyResult<Value> { let token = login_logic(database, &data.username, &data.password)?; Ok(json!(token)) diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs index be4d2cb..42eae1b 100644 --- a/server/src/routes/mod.rs +++ b/server/src/routes/mod.rs @@ -3,7 +3,7 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin <metamuffin.org> */ -use crate::{database::Database, routes::ui::error::MyResult, CONF}; +use crate::{database::Database, federation::Federation, routes::ui::error::MyResult, CONF}; use api::{r_api_account_login, r_api_root, r_api_version}; use base64::Engine; use jellyremuxer::RemuxerContext; @@ -45,7 +45,11 @@ macro_rules! uri { }; } -pub fn build_rocket(remuxer: RemuxerContext, database: Database) -> Rocket<Build> { +pub fn build_rocket( + remuxer: RemuxerContext, + database: Database, + federation: Federation, +) -> Rocket<Build> { rocket::build() .configure(Config { secret_key: SecretKey::derive_from( @@ -61,6 +65,7 @@ pub fn build_rocket(remuxer: RemuxerContext, database: Database) -> Rocket<Build }) .manage(remuxer) .manage(database) + .manage(federation) .attach(AdHoc::on_response("set server header", |_req, res| { res.set_header(Header::new("server", "jellything")); Box::pin(async {}) diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs index 1277646..ee7880c 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, CONF}; +use crate::{database::Database, federation::Federation, CONF}; use anyhow::{anyhow, Result}; use jellycommon::MediaSource; use jellyremuxer::RemuxerContext; @@ -30,6 +30,7 @@ pub async fn r_stream( webm: Option<bool>, tracks: String, remuxer: &State<RemuxerContext>, + federation: &State<Federation>, db: &State<Database>, range: Option<RequestRange>, ) -> Result<Either<StreamResponse, Redirect>, MyError> { @@ -47,27 +48,21 @@ pub async fn r_stream( let source_tracks = match source { MediaSource::Local { tracks } => tracks, MediaSource::Remote { host, remote_id } => { - let (username, password, tls) = CONF + let (username, password, _) = CONF .remote_credentials .get(&host) .ok_or(anyhow!("no credentials on the server-side"))?; - let instance = jellyclient::Instance { host, tls: *tls }; - let session = jellyclient::login( - &instance, - username.to_owned(), - password.to_owned(), - Duration::from_secs(60), - ) - .await?; + let instance = federation.get_instance(&host)?.to_owned(); + let session = instance + .login( + username.to_owned(), + password.to_owned(), + Duration::from_secs(60), + ) + .await?; - let uri = jellyclient::stream( - &instance, - &session, - &remote_id, - &tracks, - webm.unwrap_or(false), - ); + let uri = session.stream(&remote_id, &tracks, webm.unwrap_or(false)); return Ok(Either::Right(Redirect::found(uri))); } }; diff --git a/server/src/routes/ui/account/admin.rs b/server/src/routes/ui/account/admin.rs index 7124f4a..d0ad433 100644 --- a/server/src/routes/ui/account/admin.rs +++ b/server/src/routes/ui/account/admin.rs @@ -5,6 +5,7 @@ */ use crate::{ database::Database, + federation::Federation, import::import, routes::ui::{ account::session::Session, @@ -135,11 +136,12 @@ pub fn r_account_admin_remove_invite( pub async fn r_account_admin_import( session: Session, database: &State<Database>, + federation: &State<Federation>, ) -> MyResult<DynLayoutPage<'static>> { if !session.user.admin { Err(anyhow!("you not admin"))? } - let r = import(&database).await; + let r = import(&database, &federation).await; admin_dashboard( &database, Some(r.map_err(|e| e.into()).map(|_| "Import successful".into())), diff --git a/server/src/routes/ui/error.rs b/server/src/routes/ui/error.rs index 190650f..b538a06 100644 --- a/server/src/routes/ui/error.rs +++ b/server/src/routes/ui/error.rs @@ -36,7 +36,6 @@ pub fn r_api_catch<'a>(status: Status, _request: &Request) -> Value { pub type MyResult<T> = Result<T, MyError>; -#[derive(Debug)] pub struct MyError(pub anyhow::Error); impl<'r> Responder<'r, 'static> for MyError { @@ -61,6 +60,12 @@ impl<'r> Responder<'r, 'static> for MyError { } } +impl std::fmt::Debug for MyError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!("{:?}", self.0)) + } +} + impl Display for MyError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.0.fmt(f) |