aboutsummaryrefslogtreecommitdiff
path: root/stream/src/fragment_index.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stream/src/fragment_index.rs')
-rw-r--r--stream/src/fragment_index.rs53
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)?,
+ )?)))
}