diff options
-rw-r--r-- | remuxer/src/lib.rs | 32 | ||||
-rw-r--r-- | server/src/main.rs | 8 |
2 files changed, 37 insertions, 3 deletions
diff --git a/remuxer/src/lib.rs b/remuxer/src/lib.rs index 8b4e2ed..95bd1ff 100644 --- a/remuxer/src/lib.rs +++ b/remuxer/src/lib.rs @@ -3,7 +3,7 @@ use log::{debug, info}; use std::{fs::File, io::Write, path::PathBuf, sync::Arc}; use tokio::sync::mpsc::Sender; use webm_iterable::{ - matroska_spec::{Master, MatroskaSpec}, + matroska_spec::{Master, MatroskaSpec, Block}, WebmIterator, WebmWriter, }; @@ -29,7 +29,35 @@ impl RemuxerContext { let mut output = WebmWriter::new(writer); for tag in tags { - match tag.unwrap() { + let tag = tag.unwrap(); + match tag { + MatroskaSpec::TrackEntry(master) => { + let children = master.get_children(); + let mut number = None; + for c in &children { + if let MatroskaSpec::TrackNumber(n) = c { + number = Some(*n) + } + } + let number = number.unwrap(); + if selection.contains(&number) { + output.write(&MatroskaSpec::TrackEntry(Master::Full(children)))?; + } + } + MatroskaSpec::Block(ref data) => { + let data: &[u8] = &data; + let block: Block = data.try_into()?; + if selection.contains(&block.track) { + output.write(&tag)?; + } + }, + MatroskaSpec::SimpleBlock(ref data) => { + let data: &[u8] = &data; + let block: Block = data.try_into()?; + if selection.contains(&block.track) { + output.write(&tag)?; + } + }, x => { // debug!("tag"); output.write(&x)?; diff --git a/server/src/main.rs b/server/src/main.rs index 5a9c6cf..2fc6406 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,6 +1,7 @@ #![feature(box_syntax)] use crate::frontend::{pages::MyError, style::CSS_BUNDLE}; +use anyhow::anyhow; use database::Database; use frontend::pages::{home::page_home, node::page_library_node}; use jellyremuxer::{RemuxerContext, SendWriter}; @@ -44,6 +45,11 @@ fn stream( let (a, b) = duplex(8196); let item = state.library.nested("mili-bento-box-bivouac")?.get_item()?; let remuxer = state.remuxer.clone(); + let selection = selection + .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 || { @@ -51,7 +57,7 @@ fn stream( b, item.fs_path.parent().unwrap().to_path_buf(), item.data.clone(), - selection.split(",").map(|e| e.parse().unwrap()).collect(), + selection, ) { warn!("stream stopped: {e}") } |