aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/stream.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-02 21:01:28 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-02 21:01:28 +0100
commit8ee25c9ddd5ba5b6f74f7ec3b212020886e366c1 (patch)
tree6f6dfbd67c693ab0fe59d746ac61d7b8caa79b49 /server/src/routes/stream.rs
parentb9539ee3afbf1440b8628bf0609dc0e24aed116c (diff)
downloadjellything-8ee25c9ddd5ba5b6f74f7ec3b212020886e366c1.tar
jellything-8ee25c9ddd5ba5b6f74f7ec3b212020886e366c1.tar.bz2
jellything-8ee25c9ddd5ba5b6f74f7ec3b212020886e366c1.tar.zst
a
Diffstat (limited to 'server/src/routes/stream.rs')
-rw-r--r--server/src/routes/stream.rs103
1 files changed, 54 insertions, 49 deletions
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs
index 1fb136c..d65b346 100644
--- a/server/src/routes/stream.rs
+++ b/server/src/routes/stream.rs
@@ -21,7 +21,11 @@ use rocket::{
response::{self, Redirect, Responder},
Either, Request, Response, State,
};
-use std::{collections::HashSet, ops::Range};
+use std::{
+ collections::{BTreeMap, HashSet},
+ ops::Range,
+ sync::Arc,
+};
use tokio::io::{duplex, DuplexStream};
#[head("/n/<_id>/stream?<spec>")]
@@ -46,65 +50,66 @@ pub async fn r_stream(
db: &State<Database>,
id: &str,
range: Option<RequestRange>,
- spec: StreamSpec,
+ spec: BTreeMap<String, String>,
) -> Result<Either<StreamResponse, RedirectResponse>, MyError> {
// TODO perm
let node = db
.get_node_slug(id)?
.ok_or(anyhow!("node does not exist"))?;
- let media = node
- .media
- .as_ref()
- .ok_or(anyhow!("item does not contain media"))?;
+ let media = Arc::new(
+ node.media
+ .clone()
+ .ok_or(anyhow!("item does not contain media"))?,
+ );
// TODO its unclear how requests with multiple tracks should be handled.
- if spec.track.len() == 1 {
- let ti = spec.track[0];
- if let TrackSource::Remote(remote_index) = media.tracks[ti].source {
- session
- .user
- .permissions
- .assert(&UserPermission::FederatedContent)?;
+ // if spec.track.len() == 1 {
+ // let ti = spec.track[0];
+ // if let TrackSource::Remote(remote_index) = media.tracks[ti].source {
+ // session
+ // .user
+ // .permissions
+ // .assert(&UserPermission::FederatedContent)?;
- let track = &node.media.as_ref().ok_or(anyhow!("no media"))?.tracks[ti];
- let host = track
- .federated
- .last()
- .ok_or(anyhow!("federation inconsistent"))?;
+ // let track = &node.media.as_ref().ok_or(anyhow!("no media"))?.tracks[ti];
+ // let host = track
+ // .federated
+ // .last()
+ // .ok_or(anyhow!("federation inconsistent"))?;
- let FederationAccount {
- password, username, ..
- } = SECRETS
- .federation
- .get(host)
- .ok_or(anyhow!("no credentials on the server-side"))?;
+ // let FederationAccount {
+ // password, username, ..
+ // } = SECRETS
+ // .federation
+ // .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(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?;
+ // 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_url(
- node.slug.clone().into(),
- &StreamSpec {
- track: vec![remote_index],
- ..spec
- },
- );
- info!("federation redirect");
- return Ok(Either::Right(RedirectResponse(uri)));
- }
- }
+ // let uri = session.stream_url(
+ // node.slug.clone().into(),
+ // &StreamSpec {
+ // track: vec![remote_index],
+ // ..spec
+ // },
+ // );
+ // info!("federation redirect");
+ // return Ok(Either::Right(RedirectResponse(uri)));
+ // }
+ // }
info!(
"stream request (range={})",
@@ -124,7 +129,7 @@ pub async fn r_stream(
let head = jellystream::stream_head(&spec);
- match jellystream::stream(node, spec, urange, &session.user.permissions).await {
+ match jellystream::stream(media, spec, urange, &session.user.permissions).await {
Ok(stream) => Ok(Either::Left(StreamResponse {
stream,
range,