diff options
Diffstat (limited to 'server/src/logic/stream.rs')
| -rw-r--r-- | server/src/logic/stream.rs | 133 |
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); |