aboutsummaryrefslogtreecommitdiff
path: root/server/src/logic/stream.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/logic/stream.rs')
-rw-r--r--server/src/logic/stream.rs133
1 files changed, 66 insertions, 67 deletions
diff --git a/server/src/logic/stream.rs b/server/src/logic/stream.rs
index 55d6850..430c10c 100644
--- a/server/src/logic/stream.rs
+++ b/server/src/logic/stream.rs
@@ -3,18 +3,16 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-use crate::{request_info::A, ui::error::MyError};
-use anyhow::{anyhow, Result};
-use jellycommon::{api::NodeFilterSort, stream::StreamSpec, NodeID, TrackSource};
-use jellylogic::{node::get_node, session::Session};
+use crate::{request_info::RequestInfo, ui::error::MyError};
+use anyhow::{Result, anyhow};
+use jellycommon::stream::StreamSpec;
use jellystream::SMediaInfo;
use log::{info, warn};
use rocket::{
- get, head,
+ Either, Request, Response, get, head,
http::{Header, Status},
request::{self, FromRequest},
response::{self, Redirect, Responder},
- Either, Request, Response,
};
use std::{
collections::{BTreeMap, BTreeSet},
@@ -22,14 +20,14 @@ use std::{
sync::Arc,
};
use tokio::{
- io::{duplex, DuplexStream},
+ io::{DuplexStream, duplex},
task::spawn_blocking,
};
use tokio_util::io::SyncIoBridge;
#[head("/n/<_id>/stream?<spec..>")]
pub async fn r_stream_head(
- _sess: A<Session>,
+ _sess: RequestInfo<'_>,
_id: &str,
spec: BTreeMap<String, String>,
) -> Result<Either<StreamResponse, Redirect>, MyError> {
@@ -45,27 +43,27 @@ pub async fn r_stream_head(
#[get("/n/<id>/stream?<spec..>")]
pub async fn r_stream(
- session: A<Session>,
+ session: RequestInfo<'_>,
id: &str,
range: Option<RequestRange>,
spec: BTreeMap<String, String>,
) -> Result<Either<StreamResponse, RedirectResponse>, MyError> {
let spec = StreamSpec::from_query_kv(&spec).map_err(|x| anyhow!("spec invalid: {x}"))?;
- // TODO perm
- let node = get_node(
- &session.0,
- NodeID::from_slug(id),
- false,
- false,
- NodeFilterSort::default(),
- )?
- .node;
+ // // TODO perm
+ // let node = get_node(
+ // &session.0,
+ // NodeID::from_slug(id),
+ // false,
+ // false,
+ // NodeFilterSort::default(),
+ // )?
+ // .node;
- let media = Arc::new(
- node.media
- .clone()
- .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 {
@@ -115,55 +113,56 @@ pub async fn r_stream(
// }
// }
- info!(
- "stream request (range={})",
- range
- .as_ref()
- .map(|r| r.to_cr_hv())
- .unwrap_or("none".to_string())
- );
+ // info!(
+ // "stream request (range={})",
+ // range
+ // .as_ref()
+ // .map(|r| r.to_cr_hv())
+ // .unwrap_or("none".to_string())
+ // );
- let urange = match &range {
- Some(r) => {
- let r = r.0.first().unwrap_or(&(None..None));
- r.start.unwrap_or(0)..r.end.unwrap_or(u64::MAX)
- }
- None => 0..u64::MAX,
- };
+ // let urange = match &range {
+ // Some(r) => {
+ // let r = r.0.first().unwrap_or(&(None..None));
+ // r.start.unwrap_or(0)..r.end.unwrap_or(u64::MAX)
+ // }
+ // None => 0..u64::MAX,
+ // };
- let head = jellystream::stream_head(&spec);
+ // let head = jellystream::stream_head(&spec);
- let mut sources = BTreeSet::new();
- for t in &media.tracks {
- if let TrackSource::Local(path, _) = &t.source {
- sources.insert(path.to_owned());
- }
- }
- let media = Arc::new(SMediaInfo {
- files: sources,
- title: node.title.clone(),
- });
+ // let mut sources = BTreeSet::new();
+ // for t in &media.tracks {
+ // if let TrackSource::Local(path, _) = &t.source {
+ // sources.insert(path.to_owned());
+ // }
+ // }
+ // let media = Arc::new(SMediaInfo {
+ // files: sources,
+ // title: node.title.clone(),
+ // });
- // TODO cleaner solution needed
- let mut reader = match spawn_blocking(move || jellystream::stream(media, spec, urange))
- .await
- .unwrap()
- {
- Ok(o) => o,
- Err(e) => {
- warn!("stream error: {e:?}");
- Err(e)?
- }
- };
- let (stream_write, stream_read) = duplex(4096);
- spawn_blocking(move || std::io::copy(&mut reader, &mut SyncIoBridge::new(stream_write)));
+ // // TODO cleaner solution needed
+ // let mut reader = match spawn_blocking(move || jellystream::stream(media, spec, urange))
+ // .await
+ // .unwrap()
+ // {
+ // Ok(o) => o,
+ // Err(e) => {
+ // warn!("stream error: {e:?}");
+ // Err(e)?
+ // }
+ // };
+ // let (stream_write, stream_read) = duplex(4096);
+ // spawn_blocking(move || std::io::copy(&mut reader, &mut SyncIoBridge::new(stream_write)));
- Ok(Either::Left(StreamResponse {
- stream: stream_read,
- range,
- advertise_range: head.range_supported,
- content_type: head.content_type,
- }))
+ // Ok(Either::Left(StreamResponse {
+ // stream: stream_read,
+ // range,
+ // advertise_range: head.range_supported,
+ // content_type: head.content_type,
+ // }))
+ todo!()
}
pub struct RedirectResponse(String);