aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/stream.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-07-31 19:53:01 +0200
committermetamuffin <metamuffin@disroot.org>2023-07-31 19:53:01 +0200
commitaeafba7847e189313df3025e6d6f291999b57350 (patch)
treebf7affdca28208695648bc9b18856cbb7049d1e8 /server/src/routes/stream.rs
parent0c651f11920350a4aa96aa24f8fe15b28390aed2 (diff)
downloadjellything-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.rs44
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),
) {