/* 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 */ use crate::{stream_info, SMediaInfo}; use anyhow::{anyhow, Result}; use jellybase::common::stream::StreamContainer; use log::warn; use std::sync::Arc; use tokio::io::DuplexStream; use tokio_util::io::SyncIoBridge; pub async fn fragment_stream( mut b: DuplexStream, info: Arc, track: usize, segment: usize, index: usize, format: usize, container: StreamContainer, ) -> 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 path = iinfo.paths[file_index].clone(); // if let Some(profile) = None { // perms.assert(&UserPermission::Transcode)?; // let location = transcode( // &format!("{track} {index} {:?}", node), // TODO maybe not use the entire source // CONF.transcoding_profiles // .get(profile) // .ok_or(anyhow!("profile out of range"))?, // move |b| { // tokio::task::spawn_blocking(move || { // if let Err(err) = jellyremuxer::write_fragment_into( // SyncIoBridge::new(b), // &CONF.media_path, // &node, // &local_track, // track as usize, // false, // index, // ) { // warn!("segment stream error: {err}"); // } // }); // }, // ) // .await?; // let mut output = File::open(location.abs()).await?; // tokio::task::spawn(async move { // if let Err(err) = tokio::io::copy(&mut output, &mut b).await { // warn!("cannot write stream: {err}") // } // }); // } else { let b = SyncIoBridge::new(b); tokio::task::spawn_blocking(move || { if let Err(err) = jellyremuxer::write_fragment_into( b, &path, track_num, container == StreamContainer::WebM, &info.name.unwrap_or_default(), index, ) { warn!("segment stream error: {err}"); } }); // } Ok(()) }