aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--remuxer/src/lib.rs32
-rw-r--r--server/src/main.rs8
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}")
}