diff options
author | metamuffin <metamuffin@disroot.org> | 2023-07-31 19:53:01 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-07-31 19:53:01 +0200 |
commit | aeafba7847e189313df3025e6d6f291999b57350 (patch) | |
tree | bf7affdca28208695648bc9b18856cbb7049d1e8 /server/src/routes/stream.rs | |
parent | 0c651f11920350a4aa96aa24f8fe15b28390aed2 (diff) | |
download | jellything-aeafba7847e189313df3025e6d6f291999b57350.tar jellything-aeafba7847e189313df3025e6d6f291999b57350.tar.bz2 jellything-aeafba7847e189313df3025e6d6f291999b57350.tar.zst |
update server to new schema
Diffstat (limited to 'server/src/routes/stream.rs')
-rw-r--r-- | server/src/routes/stream.rs | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs index b2b708b..2583cb1 100644 --- a/server/src/routes/stream.rs +++ b/server/src/routes/stream.rs @@ -4,8 +4,9 @@ Copyright (C) 2023 metamuffin <metamuffin.org> */ use super::ui::{account::session::Session, error::MyError}; -use crate::library::Library; -use anyhow::{anyhow, Context, Result}; +use crate::{database::Database, CONF}; +use anyhow::{anyhow, Result}; +use jellycommon::MediaSource; use jellyremuxer::RemuxerContext; use log::{debug, info, warn}; use rocket::{ @@ -15,17 +16,14 @@ use rocket::{ response::{self, Responder}, Request, Response, State, }; -use std::{ - ops::{Deref, Range}, - path::{Path, PathBuf}, -}; +use std::ops::{Deref, Range}; use tokio::io::{duplex, DuplexStream}; use tokio_util::io::SyncIoBridge; -pub fn stream_uri(path: &Path, tracks: &[u64], webm: bool) -> String { +pub fn stream_uri(id: &str, tracks: &[u64], webm: bool) -> String { format!( "/stream/{}?tracks={}&webm={}", - path.to_str().unwrap(), + id, tracks .iter() .map(|v| format!("{v}")) @@ -35,16 +33,27 @@ pub fn stream_uri(path: &Path, tracks: &[u64], webm: bool) -> String { ) } -#[get("/stream/<path..>?<tracks>&<webm>")] +#[get("/stream/<id>?<tracks>&<webm>")] pub fn r_stream( _sess: Session, - path: PathBuf, + id: String, webm: Option<bool>, tracks: String, remuxer: &State<RemuxerContext>, - library: &State<Library>, + db: &State<Database>, range: Option<RequestRange>, ) -> Result<StreamResponse, MyError> { + let node = db.node.get(&id)?.ok_or(anyhow!("node does not exist"))?; + let source = node + .private + .source + .ok_or(anyhow!("item does not contain media"))?; + + let source_tracks = match source { + MediaSource::Local { tracks } => tracks, + _ => Err(anyhow!("todo"))?, + }; + info!( "stream request (range={})", range @@ -52,12 +61,9 @@ pub fn r_stream( .map(|r| r.to_cr_hv()) .unwrap_or(format!("none")) ); + let (a, b) = duplex(4096); - let path = path.to_str().unwrap().to_string(); - let item = library - .nested(&path) - .context("retrieving library node")? - .get_item()?; + let remuxer = remuxer.deref().clone(); let tracks = tracks .split(',') @@ -74,13 +80,13 @@ pub fn r_stream( None => 0..(isize::MAX as usize), }; - let path_base = library.root_path.clone(); tokio::task::spawn_blocking(move || { if let Err(e) = remuxer.generate_into( b, urange, - path_base, - item.info.clone(), + CONF.library_path.clone(), + node.public, + source_tracks, tracks, webm.unwrap_or(false), ) { |