/* 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 anyhow::{anyhow, Result}; use jellybase::{ common::{ stream::StreamSpec, user::{PermissionSet, UserPermission}, LocalTrack, Node, }, permission::PermissionSetExt, CONF, }; use jellytranscoder::fragment::transcode; use log::warn; use std::sync::Arc; use tokio::{fs::File, io::DuplexStream}; use tokio_util::io::SyncIoBridge; pub async fn fragment_stream( node: Arc, local_tracks: Vec, spec: StreamSpec, mut b: DuplexStream, perms: &PermissionSet, webm: bool, track: u64, segment: u64, index: usize, ) -> Result<()> { let local_track = local_tracks .first() .ok_or(anyhow!("track missing"))? .to_owned(); // 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, &CONF.media_path, &node, &local_track, track as usize, webm, index, ) { warn!("segment stream error: {err}"); } }); // } Ok(()) }