aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/stream.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/stream.rs')
-rw-r--r--server/src/routes/stream.rs28
1 files changed, 21 insertions, 7 deletions
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs
index 6ff6982..c49f51d 100644
--- a/server/src/routes/stream.rs
+++ b/server/src/routes/stream.rs
@@ -1,7 +1,6 @@
use super::ui::error::MyError;
use crate::AppState;
-use anyhow::anyhow;
-use anyhow::Context;
+use anyhow::{anyhow, Context};
use log::debug;
use log::warn;
use rocket::{get, http::ContentType, response::stream::ReaderStream, State};
@@ -9,10 +8,23 @@ use std::path::PathBuf;
use tokio::io::{duplex, DuplexStream};
use tokio_util::io::SyncIoBridge;
-#[get("/stream/<path..>?<selection>")]
+pub fn stream_uri(path: &PathBuf, tracks: &Vec<u64>) -> String {
+ format!(
+ "/stream/{}?tracks={}",
+ path.to_str().unwrap().to_string(),
+ tracks
+ .iter()
+ .map(|v| format!("{v}"))
+ .collect::<Vec<_>>()
+ .join(",")
+ )
+}
+
+#[get("/stream/<path..>?<tracks>&<webm>")]
pub fn r_stream(
path: PathBuf,
- selection: String,
+ webm: Option<bool>,
+ tracks: String,
state: &State<AppState>,
) -> Result<(ContentType, ReaderStream![DuplexStream]), MyError> {
let (a, b) = duplex(1024);
@@ -23,20 +35,22 @@ pub fn r_stream(
.context("retrieving library node")?
.get_item()?;
let remuxer = state.remuxer.clone();
- let selection = selection
+ let tracks = tracks
.split(",")
.map(|e| e.parse().map_err(|_| anyhow!("invalid number")))
.into_iter()
.collect::<Result<Vec<_>, _>>()?;
let b = SyncIoBridge::new(b);
+
tokio::task::spawn_blocking(move || {
if let Err(e) = remuxer.generate_into(
b,
0,
item.fs_path.parent().unwrap().to_path_buf(),
- item.data.clone(),
- selection,
+ item.info.clone(),
+ tracks,
+ webm.unwrap_or(false),
) {
warn!("stream stopped: {e}")
}