diff options
author | metamuffin <metamuffin@disroot.org> | 2025-09-25 04:00:51 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-09-25 04:00:51 +0200 |
commit | f8d4c438d10450ead56c0082b037e466ef5f9f24 (patch) | |
tree | 703612747f06b91f063dcd9e8a778675e6aa1303 /stream/src/hls.rs | |
parent | 0fe48987c336b9b50cba09355aa3c1cf11740edc (diff) | |
download | jellything-f8d4c438d10450ead56c0082b037e466ef5f9f24.tar jellything-f8d4c438d10450ead56c0082b037e466ef5f9f24.tar.bz2 jellything-f8d4c438d10450ead56c0082b037e466ef5f9f24.tar.zst |
start media processing refactor
Diffstat (limited to 'stream/src/hls.rs')
-rw-r--r-- | stream/src/hls.rs | 86 |
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))) } |