aboutsummaryrefslogtreecommitdiff
path: root/stream/src/fragment_index.rs
blob: 6fbddc6bb36541291a05030229132aceca2f9bf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
    This file is part of jellything (https://codeberg.org/metamuffin/jellything)
    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 anyhow::{anyhow, Result};
use jellybase::common::stream::{SegmentNum, TrackNum};
use std::sync::Arc;
use tokio::io::{AsyncWriteExt, DuplexStream};

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
        .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 out = serde_json::to_string(&fragments)?;
    tokio::spawn(async move { b.write_all(out.as_bytes()).await });
    Ok(())
}