aboutsummaryrefslogtreecommitdiff
path: root/stream/src
diff options
context:
space:
mode:
Diffstat (limited to 'stream/src')
-rw-r--r--stream/src/lib.rs7
-rw-r--r--stream/src/segment.rs32
2 files changed, 32 insertions, 7 deletions
diff --git a/stream/src/lib.rs b/stream/src/lib.rs
index 5f9edb9..726f1e8 100644
--- a/stream/src/lib.rs
+++ b/stream/src/lib.rs
@@ -12,6 +12,7 @@ use jellycommon::{
stream::{StreamFormat, StreamSpec},
LocalTrack, MediaSource, Node,
};
+use segment::stream_segment;
use std::{io::SeekFrom, ops::Range};
use tokio::{
fs::File,
@@ -52,9 +53,9 @@ pub async fn stream(node: Node, spec: StreamSpec, range: Range<usize>) -> Result
match spec.format {
StreamFormat::Original => original_stream(track_sources, spec, range, b).await?,
StreamFormat::Matroska => remux_stream(node, track_sources, spec, range, b).await?,
- StreamFormat::Hls => todo!(),
- StreamFormat::Jhls => todo!(),
- StreamFormat::Segment => todo!(),
+ StreamFormat::Hls => bail!("unsupported"),
+ StreamFormat::Jhls => bail!("unsupported"),
+ StreamFormat::Segment => stream_segment(node, track_sources, spec, b).await?,
}
Ok(a)
diff --git a/stream/src/segment.rs b/stream/src/segment.rs
index ed4f5ef..d09d357 100644
--- a/stream/src/segment.rs
+++ b/stream/src/segment.rs
@@ -3,16 +3,40 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
+use anyhow::{anyhow, bail, Result};
+use jellybase::CONF;
use jellycommon::{stream::StreamSpec, LocalTrack, Node};
-use std::ops::Range;
+use log::warn;
use tokio::io::DuplexStream;
+use tokio_util::io::SyncIoBridge;
pub async fn stream_segment(
node: Node,
track_sources: Vec<LocalTrack>,
spec: StreamSpec,
- range: Range<usize>,
b: DuplexStream,
-) {
-
+) -> Result<()> {
+ let b = SyncIoBridge::new(b);
+
+ if spec.tracks.len() != 1 {
+ bail!("unsupported number of tracks for segment, must be exactly one");
+ }
+ let track = spec.tracks[0];
+ let n = spec.index.ok_or(anyhow!("segment index missing"))?;
+
+ tokio::task::spawn_blocking(move || {
+ if let Err(err) = jellyremuxer::write_snippet_into(
+ b,
+ CONF.library_path.clone(),
+ node.public.clone(),
+ track_sources,
+ track,
+ spec.webm.unwrap_or(false),
+ n,
+ ) {
+ warn!("segment stream error: {err}");
+ }
+ });
+
+ Ok(())
}