diff options
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)?, + )?))) } |