From f8d4c438d10450ead56c0082b037e466ef5f9f24 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 25 Sep 2025 04:00:51 +0200 Subject: start media processing refactor --- stream/src/fragment_index.rs | 53 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 19 deletions(-) (limited to 'stream/src/fragment_index.rs') diff --git a/stream/src/fragment_index.rs b/stream/src/fragment_index.rs index cb54948..9d82cd7 100644 --- a/stream/src/fragment_index.rs +++ b/stream/src/fragment_index.rs @@ -3,30 +3,45 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin */ -use crate::{stream_info, SMediaInfo}; +use crate::{cues::generate_cues, stream_info, SMediaInfo}; use anyhow::{anyhow, Result}; -use jellystream_types::{SegmentNum, TrackNum}; -use std::sync::Arc; -use tokio::io::{AsyncWriteExt, DuplexStream}; +use jellystream_types::TrackNum; +use std::{ + io::{Cursor, Read}, + ops::Range, + sync::Arc, +}; -pub async fn fragment_index_stream( - mut b: DuplexStream, - info: Arc, - _segment: SegmentNum, - track: TrackNum, -) -> Result<()> { - let (iinfo, _info) = stream_info(info).await?; - let (file_index, track_num) = *iinfo +pub fn fragment_index(info: Arc, track: TrackNum) -> Result>> { + let (iinfo, info) = stream_info(info)?; + let (file_index, _) = *iinfo .track_to_file .get(track) .ok_or(anyhow!("track not found"))?; - let fragments = tokio::task::spawn_blocking(move || { - jellyremuxer::fragment::fragment_index(&iinfo.paths[file_index], track_num) - }) - .await??; + let cue_stat = generate_cues(&iinfo.paths[file_index])?; + + Ok(cue_stat + .cues + .iter() + .map(|c| c.time as f64 / 1_000_000_000.) + .zip( + cue_stat + .cues + .iter() + .skip(1) + .map(|c| c.time as f64 / 1_000_000_000.) + .chain([info.duration]), + ) + .map(|(start, end)| start..end) + .collect()) +} - let out = serde_json::to_string(&fragments)?; - tokio::spawn(async move { b.write_all(out.as_bytes()).await }); - Ok(()) +pub fn fragment_index_stream( + info: Arc, + track: TrackNum, +) -> Result> { + Ok(Box::new(Cursor::new(serde_json::to_string( + &fragment_index(info, track)?, + )?))) } -- cgit v1.2.3-70-g09d2