aboutsummaryrefslogtreecommitdiff
path: root/stream
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-04-14 18:42:16 +0200
committermetamuffin <metamuffin@disroot.org>2025-04-14 18:42:16 +0200
commit3b147cb1dfcbd5c7218e0accd5784d992d5ae21c (patch)
tree028e5ba21bd9c7da583b2ead0001c1481ccbae86 /stream
parent42e08750a5a9a112d458a5db1d6b169278e953c5 (diff)
downloadjellything-3b147cb1dfcbd5c7218e0accd5784d992d5ae21c.tar
jellything-3b147cb1dfcbd5c7218e0accd5784d992d5ae21c.tar.bz2
jellything-3b147cb1dfcbd5c7218e0accd5784d992d5ae21c.tar.zst
things
Diffstat (limited to 'stream')
-rw-r--r--stream/src/fragment.rs1
-rw-r--r--stream/src/hls.rs26
-rw-r--r--stream/src/lib.rs38
-rw-r--r--stream/src/stream_info.rs6
4 files changed, 36 insertions, 35 deletions
diff --git a/stream/src/fragment.rs b/stream/src/fragment.rs
index e0644aa..26746fc 100644
--- a/stream/src/fragment.rs
+++ b/stream/src/fragment.rs
@@ -53,6 +53,7 @@ pub async fn fragment_stream(
} else {
let location = transcode(
&format!("{path:?} {track_num} {index} {format_num} {container}"), // TODO maybe not use the entire source
+ track.kind,
format,
container,
move |b| {
diff --git a/stream/src/hls.rs b/stream/src/hls.rs
index f06ac72..3dfbf01 100644
--- a/stream/src/hls.rs
+++ b/stream/src/hls.rs
@@ -15,7 +15,31 @@ use tokio::{
task::spawn_blocking,
};
-pub async fn hls_master_stream(
+pub async fn hls_supermultivariant_stream(
+ mut b: DuplexStream,
+ info: Arc<SMediaInfo>,
+ container: StreamContainer,
+) -> Result<()> {
+ let (_iinfo, info) = stream_info(info).await?;
+ let mut out = String::new();
+ writeln!(out, "#EXTM3U")?;
+ writeln!(out, "#EXT-X-VERSION:4")?;
+ for (i, _seg) in info.segments.iter().enumerate() {
+ let uri = format!(
+ "stream{}",
+ StreamSpec::HlsMultiVariant {
+ segment: i,
+ container,
+ }
+ .to_query()
+ );
+ writeln!(out, "{uri}")?;
+ }
+ tokio::spawn(async move { b.write_all(out.as_bytes()).await });
+ Ok(())
+}
+
+pub async fn hls_multivariant_stream(
mut b: DuplexStream,
info: Arc<SMediaInfo>,
segment: SegmentNum,
diff --git a/stream/src/lib.rs b/stream/src/lib.rs
index 18ad2a7..4df87ae 100644
--- a/stream/src/lib.rs
+++ b/stream/src/lib.rs
@@ -10,10 +10,10 @@ pub mod hls;
pub mod stream_info;
pub mod webvtt;
-use anyhow::{anyhow, Context, Result};
+use anyhow::{anyhow, bail, Context, Result};
use fragment::fragment_stream;
use fragment_index::fragment_index_stream;
-use hls::{hls_master_stream, hls_variant_stream};
+use hls::{hls_multivariant_stream, hls_supermultivariant_stream, hls_variant_stream};
use jellybase::common::{
stream::{StreamContainer, StreamSpec},
Node,
@@ -24,7 +24,6 @@ use tokio::{
fs::File,
io::{duplex, AsyncReadExt, AsyncSeekExt, AsyncWriteExt, DuplexStream},
};
-use tokio_util::io::SyncIoBridge;
#[derive(Debug)]
pub struct SMediaInfo {
@@ -71,13 +70,12 @@ pub async fn stream(
let (a, b) = duplex(4096);
match spec {
- StreamSpec::Whep { track, seek } => todo!(),
- StreamSpec::WhepControl { token } => todo!(),
- StreamSpec::Remux { tracks, container } => todo!(),
StreamSpec::Original { track } => original_stream(info, track, range, b).await?,
- StreamSpec::HlsSuperMultiVariant { container } => todo!(),
+ StreamSpec::HlsSuperMultiVariant { container } => {
+ hls_supermultivariant_stream(b, info, container).await?;
+ }
StreamSpec::HlsMultiVariant { segment, container } => {
- hls_master_stream(b, info, segment, container).await?
+ hls_multivariant_stream(b, info, segment, container).await?
}
StreamSpec::HlsVariant {
segment,
@@ -96,34 +94,12 @@ pub async fn stream(
container,
format,
} => fragment_stream(b, info, track, segment, index, format, container).await?,
+ _ => bail!("todo"),
}
Ok(a)
}
-async fn remux_stream(
- node: Arc<Node>,
- spec: StreamSpec,
- range: Range<usize>,
- b: DuplexStream,
-) -> Result<()> {
- let b = SyncIoBridge::new(b);
-
- // tokio::task::spawn_blocking(move || {
- // jellyremuxer::remux_stream_into(
- // b,
- // range,
- // CONF.media_path.to_owned(),
- // &node,
- // local_tracks,
- // spec.track,
- // spec.webm.unwrap_or(false),
- // )
- // });
-
- Ok(())
-}
-
async fn original_stream(
info: Arc<SMediaInfo>,
track: usize,
diff --git a/stream/src/stream_info.rs b/stream/src/stream_info.rs
index 9d3d741..a8b6989 100644
--- a/stream/src/stream_info.rs
+++ b/stream/src/stream_info.rs
@@ -23,7 +23,7 @@ async fn async_matroska_metadata(path: PathBuf) -> Result<Arc<MatroskaMetadata>>
pub(crate) struct InternalStreamInfo {
pub paths: Vec<PathBuf>,
- pub metadata: Vec<Arc<MatroskaMetadata>>,
+ pub _metadata: Vec<Arc<MatroskaMetadata>>,
pub track_to_file: Vec<(usize, u64)>,
}
@@ -67,7 +67,7 @@ pub(crate) async fn stream_info(info: Arc<SMediaInfo>) -> Result<(InternalStream
};
Ok((
InternalStreamInfo {
- metadata,
+ _metadata: metadata,
paths,
track_to_file,
},
@@ -83,7 +83,7 @@ fn stream_formats(t: &TrackEntry) -> Vec<StreamFormatInfo> {
formats.push(StreamFormatInfo {
codec: t.codec_id.to_string(),
remux: true,
- bitrate: 2_000_000., // TODO
+ bitrate: 10_000_000., // TODO
containers: containers_by_codec(&t.codec_id),
bit_depth: t.audio.as_ref().and_then(|a| a.bit_depth.map(|e| e as u8)),
samplerate: t.audio.as_ref().map(|a| a.sampling_frequency),