From 09c7eb30a583ebec6c25b8aa539512e4ae26e5e5 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 30 Sep 2023 18:15:04 +0200 Subject: first snippet draft --- stream/src/lib.rs | 7 ++++--- stream/src/segment.rs | 32 ++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 7 deletions(-) (limited to 'stream/src') 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) -> 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 */ +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, spec: StreamSpec, - range: Range, 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(()) } -- cgit v1.2.3-70-g09d2