diff options
Diffstat (limited to 'server/src/main.rs')
-rw-r--r-- | server/src/main.rs | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index 36571f0..3f8d241 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,11 +1,14 @@ #![feature(box_syntax)] -use crate::frontend::style::CSS_BUNDLE; +use crate::frontend::{pages::MyError, style::CSS_BUNDLE}; use database::Database; use frontend::pages::{home::page_home, node::page_library_node}; +use jellyremuxer::{RemuxerContext, SendWriter}; use library::Library; -use rocket::{get, http::ContentType, launch, routes}; -use std::fs::read_to_string; +use log::debug; +use rocket::{get, http::ContentType, launch, response::stream::ByteStream, routes, State}; +use std::{fs::read_to_string, sync::Arc}; +use tokio::sync::mpsc; pub mod database; pub mod frontend; @@ -23,9 +26,42 @@ async fn assets_style() -> (ContentType, String) { ) } +#[get("/stream?<selection>")] +fn stream( + selection: String, + state: &State<AppState>, +) -> Result<(ContentType, ByteStream![Vec<u8>]), MyError> { + let (tx, mut rx) = mpsc::channel(16); + let item = state.library.nested("mili-bento-box-bivouac")?.get_item()?; + debug!("generating matroska"); + let remuxer = state.remuxer.clone(); + tokio::task::spawn_blocking(move || { + remuxer + .generate_into( + SendWriter(tx), + // SyncIoBridge() + item.fs_path.parent().unwrap().to_path_buf(), + item.data.clone(), + selection.split(",").map(|e| e.parse().unwrap()).collect(), + ) + .unwrap(); + }); + debug!("starting stream"); + Ok(( + ContentType::WEBM, + ByteStream! { + while let Some(x) = rx.recv().await { + debug!("yield {x:?}"); + yield x + } + }, + )) +} + pub struct AppState { pub database: Database, pub library: Library, + pub remuxer: Arc<RemuxerContext>, } #[launch] @@ -34,11 +70,13 @@ fn rocket() -> _ { let db_path = std::env::var("DB_PATH").unwrap_or("data/db".to_string()); let lib_path = std::env::var("LIB_PATH").unwrap_or("data/library".to_string()); let state = AppState { + remuxer: RemuxerContext::new(), library: Library::open(&lib_path).unwrap(), database: Database::open(&db_path).unwrap(), }; - rocket::build() - .manage(state) - .mount("/", routes![page_home, page_library_node, assets_style]) + rocket::build().manage(state).mount( + "/", + routes![page_home, page_library_node, assets_style, stream], + ) } |