aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/stream.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-08-01 20:32:35 +0200
committermetamuffin <metamuffin@disroot.org>2023-08-01 20:32:35 +0200
commitff9060ea0987e29e4d468ff7c9fed7cc7109bf2b (patch)
treefc8c7ad11ca2dfc7ebccb65ea9ea3c27827405dd /server/src/routes/stream.rs
parentf7992589cf45c699599a7ee5fc4634c9db16ff87 (diff)
downloadjellything-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.rs30
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 {