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/fragment_index.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/fragment_index.rs')
-rw-r--r-- | stream/src/fragment_index.rs | 53 |
1 files changed, 34 insertions, 19 deletions
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 <metamuffin.org> */ -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<SMediaInfo>, - _segment: SegmentNum, - track: TrackNum, -) -> Result<()> { - let (iinfo, _info) = stream_info(info).await?; - let (file_index, track_num) = *iinfo +pub fn fragment_index(info: Arc<SMediaInfo>, track: TrackNum) -> Result<Vec<Range<f64>>> { + 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<SMediaInfo>, + track: TrackNum, +) -> Result<Box<dyn Read + Send + Sync>> { + Ok(Box::new(Cursor::new(serde_json::to_string( + &fragment_index(info, track)?, + )?))) } |