diff options
author | metamuffin <metamuffin@disroot.org> | 2023-12-22 23:57:03 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-12-22 23:57:03 +0100 |
commit | 75949cebdd61dd8f0d06f2e47081c460e2a442f0 (patch) | |
tree | ea0fc2ff003b7694ee06555d731bce1f08199136 /server | |
parent | c4682c231cbfa2bd4b44e14548800a64cc9cdbb8 (diff) | |
download | jellything-75949cebdd61dd8f0d06f2e47081c460e2a442f0.tar jellything-75949cebdd61dd8f0d06f2e47081c460e2a442f0.tar.bz2 jellything-75949cebdd61dd8f0d06f2e47081c460e2a442f0.tar.zst |
rework import system pt. 8: federated streams & change jhls
Diffstat (limited to 'server')
-rw-r--r-- | server/src/routes/api/mod.rs | 13 | ||||
-rw-r--r-- | server/src/routes/stream.rs | 75 |
2 files changed, 49 insertions, 39 deletions
diff --git a/server/src/routes/api/mod.rs b/server/src/routes/api/mod.rs index 87ed0e9..214c5de 100644 --- a/server/src/routes/api/mod.rs +++ b/server/src/routes/api/mod.rs @@ -9,7 +9,7 @@ use super::ui::{ }; use crate::database::Database; use anyhow::{anyhow, Context}; -use jellycommon::{user::UserPermission, Node}; +use jellycommon::{user::CreateSessionParams, Node}; use rocket::{ get, http::MediaType, @@ -20,9 +20,8 @@ use rocket::{ serde::json::Json, Request, State, }; -use serde::Deserialize; use serde_json::{json, Value}; -use std::{collections::HashSet, ops::Deref}; +use std::ops::Deref; #[get("/api")] pub fn r_api_root() -> Redirect { @@ -34,14 +33,6 @@ pub fn r_api_version() -> &'static str { "2" } -#[derive(Deserialize)] -pub struct CreateSessionParams { - username: String, - password: String, - expire: Option<i64>, - drop_permissions: Option<HashSet<UserPermission>>, -} - #[post("/api/create_session", data = "<data>")] pub fn r_api_account_login( database: &State<Database>, diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs index 14db462..8d16ded 100644 --- a/server/src/routes/stream.rs +++ b/server/src/routes/stream.rs @@ -11,7 +11,11 @@ use jellybase::{ permission::{NodePermissionExt, PermissionSetExt}, CONF, }; -use jellycommon::{stream::StreamSpec, user::UserPermission, TrackSource}; +use jellycommon::{ + stream::StreamSpec, + user::{CreateSessionParams, UserPermission}, + TrackSource, +}; use log::{info, warn}; use rocket::{ get, head, @@ -58,36 +62,51 @@ pub async fn r_stream( .as_ref() .ok_or(anyhow!("item does not contain media"))?; - // TODO federated streams - // if let MediaSource::Remote { host, remote_id } = source { - // session - // .user - // .permissions - // .assert(&UserPermission::FederatedContent)?; + // TODO its unclear how requests with multiple tracks should be handled. + if spec.tracks.len() == 1 { + let ti = spec.tracks[0]; + if let TrackSource::Remote(remote_index) = source[ti] { + session + .user + .permissions + .assert(&UserPermission::FederatedContent)?; + + let track = &node.public.media.ok_or(anyhow!("no media"))?.tracks[ti]; + let host = track + .federated + .last() + .ok_or(anyhow!("federation inconsistent"))?; - // let (username, password, _) = CONF - // .remote_credentials - // .get(host) - // .ok_or(anyhow!("no credentials on the server-side"))?; + let (username, password, _) = CONF + .remote_credentials + .get(host) + .ok_or(anyhow!("no credentials on the server-side"))?; - // info!("creating session on {host}"); - // let instance = federation.get_instance(&host)?.to_owned(); - // let session = instance - // .login(LoginDetails { - // username: username.to_owned(), - // password: password.to_owned(), - // expire: Some(60), - // drop_permissions: Some(HashSet::from_iter([ - // UserPermission::ManageSelf, - // UserPermission::Admin, // in case somebody federated the admin :))) - // ])), - // }) - // .await?; + info!("creating session on {host}"); + let instance = federation.get_instance(&host)?.to_owned(); + let session = instance + .login(CreateSessionParams { + username: username.to_owned(), + password: password.to_owned(), + expire: Some(60), + drop_permissions: Some(HashSet::from_iter([ + UserPermission::ManageSelf, + UserPermission::Admin, // in case somebody federated the admin :))) + ])), + }) + .await?; - // let uri = session.stream(&remote_id, &spec); - // info!("federation redirect"); - // return Ok(Either::Right(RedirectResponse(uri))); - // } + let uri = session.stream( + node.public.id.as_ref().unwrap(), + &StreamSpec { + tracks: vec![remote_index], + ..spec + }, + ); + info!("federation redirect"); + return Ok(Either::Right(RedirectResponse(uri))); + } + } info!( "stream request (range={})", |