diff options
author | metamuffin <metamuffin@disroot.org> | 2023-08-01 20:32:35 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-08-01 20:32:35 +0200 |
commit | ff9060ea0987e29e4d468ff7c9fed7cc7109bf2b (patch) | |
tree | fc8c7ad11ca2dfc7ebccb65ea9ea3c27827405dd /server/src/routes/stream.rs | |
parent | f7992589cf45c699599a7ee5fc4634c9db16ff87 (diff) | |
download | jellything-ff9060ea0987e29e4d468ff7c9fed7cc7109bf2b.tar jellything-ff9060ea0987e29e4d468ff7c9fed7cc7109bf2b.tar.bz2 jellything-ff9060ea0987e29e4d468ff7c9fed7cc7109bf2b.tar.zst |
federation possible but inconvinient
Diffstat (limited to 'server/src/routes/stream.rs')
-rw-r--r-- | server/src/routes/stream.rs | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs index 6e60cc9..19a3f09 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, routes::api::c_api_account_login, uri, CONF}; use anyhow::{anyhow, Result}; use jellycommon::MediaSource; use jellyremuxer::RemuxerContext; @@ -13,8 +13,8 @@ use rocket::{ get, http::{ContentType, Header, Status}, request::{self, FromRequest}, - response::{self, Responder}, - Request, Response, State, + response::{self, Redirect, Responder}, + Either, Request, Response, State, }; use std::ops::{Deref, Range}; use tokio::io::{duplex, DuplexStream}; @@ -34,7 +34,7 @@ pub fn stream_uri(id: &str, tracks: &[u64], webm: bool) -> String { } #[get("/n/<id>/stream?<tracks>&<webm>")] -pub fn r_stream( +pub async fn r_stream( _sess: Session, id: String, webm: Option<bool>, @@ -42,7 +42,7 @@ pub fn r_stream( remuxer: &State<RemuxerContext>, db: &State<Database>, range: Option<RequestRange>, -) -> Result<StreamResponse, MyError> { +) -> Result<Either<StreamResponse, Redirect>, MyError> { let node = db.node.get(&id)?.ok_or(anyhow!("node does not exist"))?; let source = node .private @@ -51,7 +51,23 @@ pub fn r_stream( let source_tracks = match source { MediaSource::Local { tracks } => tracks, - _ => Err(anyhow!("todo"))?, + MediaSource::Remote { host, remote_id } => { + let (username, password, tls) = CONF + .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 + ); + return Ok(Either::Right(Redirect::found(uri))); + } }; info!( @@ -94,7 +110,7 @@ pub fn r_stream( } }); debug!("starting stream"); - Ok(StreamResponse { stream: a, range }) + Ok(Either::Left(StreamResponse { stream: a, range })) } pub struct StreamResponse { |