aboutsummaryrefslogtreecommitdiff
path: root/stream/src/hls.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stream/src/hls.rs')
-rw-r--r--stream/src/hls.rs86
1 files changed, 20 insertions, 66 deletions
diff --git a/stream/src/hls.rs b/stream/src/hls.rs
index 949ddb4..2c91365 100644
--- a/stream/src/hls.rs
+++ b/stream/src/hls.rs
@@ -4,60 +4,30 @@
Copyright (C) 2025 metamuffin <metamuffin.org>
*/
-use crate::{stream_info, SMediaInfo};
-use anyhow::{anyhow, Result};
-use jellystream_types::{FormatNum, SegmentNum, StreamContainer, StreamSpec, TrackKind, TrackNum};
-use std::{fmt::Write, ops::Range, sync::Arc};
-use tokio::{
- io::{AsyncWriteExt, DuplexStream},
- task::spawn_blocking,
+use crate::{fragment_index::fragment_index, stream_info, SMediaInfo};
+use anyhow::Result;
+use jellystream_types::{FormatNum, StreamContainer, StreamSpec, TrackKind, TrackNum};
+use std::{
+ fmt::Write,
+ io::{Cursor, Read},
+ ops::Range,
+ sync::Arc,
};
-pub async fn hls_supermultivariant_stream(
- mut b: DuplexStream,
+pub fn hls_multivariant_stream(
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,
- container: StreamContainer,
-) -> Result<()> {
- let (_iinfo, info) = stream_info(info).await?;
- let seg = info
- .segments
- .get(segment)
- .ok_or(anyhow!("segment not found"))?;
+) -> Result<Box<dyn Read + Send + Sync>> {
+ let (_iinfo, info) = stream_info(info)?;
let mut out = String::new();
writeln!(out, "#EXTM3U")?;
writeln!(out, "#EXT-X-VERSION:4")?;
// writeln!(out, "#EXT-X-INDEPENDENT-SEGMENTS")?;
- for (i, t) in seg.tracks.iter().enumerate() {
+ for (i, t) in info.tracks.iter().enumerate() {
let uri = format!(
"stream{}",
StreamSpec::HlsVariant {
- segment,
track: i,
container,
format: 0
@@ -73,37 +43,23 @@ pub async fn hls_multivariant_stream(
writeln!(out, "#EXT-X-STREAM-INF:BANDWIDTH=5000000,TYPE={type}")?;
writeln!(out, "{uri}")?;
}
- tokio::spawn(async move { b.write_all(out.as_bytes()).await });
- Ok(())
+
+ Ok(Box::new(Cursor::new(out)))
}
-pub async fn hls_variant_stream(
- mut b: DuplexStream,
+pub fn hls_variant_stream(
info: Arc<SMediaInfo>,
- segment: SegmentNum,
track: TrackNum,
format: FormatNum,
container: StreamContainer,
-) -> Result<()> {
- let (iinfo, info) = stream_info(info).await?;
- let (file_index, track_num) = *iinfo
- .track_to_file
- .get(track)
- .ok_or(anyhow!("track not found"))?;
- let seg = info
- .segments
- .get(segment)
- .ok_or(anyhow!("segment not found"))?;
-
- let frags = spawn_blocking(move || {
- jellyremuxer::fragment::fragment_index(&iinfo.paths[file_index], track_num)
- })
- .await??;
+) -> Result<Box<dyn Read + Send + Sync>> {
+ let frags = fragment_index(info.clone(), track)?;
+ let (_, info) = stream_info(info)?;
let mut out = String::new();
writeln!(out, "#EXTM3U")?;
writeln!(out, "#EXT-X-PLAYLIST-TYPE:VOD")?;
- writeln!(out, "#EXT-X-TARGETDURATION:{}", seg.duration)?;
+ writeln!(out, "#EXT-X-TARGETDURATION:{}", info.duration)?;
writeln!(out, "#EXT-X-VERSION:4")?;
writeln!(out, "#EXT-X-MEDIA-SEQUENCE:0")?;
@@ -113,7 +69,6 @@ pub async fn hls_variant_stream(
out,
"stream{}",
StreamSpec::Fragment {
- segment,
track,
index,
container,
@@ -125,6 +80,5 @@ pub async fn hls_variant_stream(
writeln!(out, "#EXT-X-ENDLIST")?;
- tokio::spawn(async move { b.write_all(out.as_bytes()).await });
- Ok(())
+ Ok(Box::new(Cursor::new(out)))
}