use super::HtmlTemplate; use crate::routes::stream::stream_uri; use crate::{library::Item, routes::ui::error::MyResult, AppState}; use jellycommon::SourceTrackKind; use log::warn; use rocket::{get, FromForm, State}; use std::{path::PathBuf, sync::Arc}; pub fn player_uri(path: &PathBuf) -> String { format!("/player/{}", path.to_str().unwrap()) } #[derive(FromForm, Default, Clone, Debug)] pub struct PlayerConfig { pub a: Option, pub v: Option, pub s: Option, pub webm: bool, } #[get("/player/?", rank = 4)] pub fn r_player( state: &State, path: PathBuf, conf: PlayerConfig, ) -> MyResult>> { warn!("{conf:?}"); let item = state.library.nested_path(&path)?.get_item()?; if conf.a.is_none() && conf.v.is_none() && conf.s.is_none() { return player_conf(item.clone()); } let tracks = conf .a .into_iter() .chain(conf.v.into_iter()) .chain(conf.s.into_iter()) .collect::>(); Ok(HtmlTemplate( "Configure Player".to_string(), markup::new! { video[src=stream_uri(&item.lib_path, &tracks), controls]; }, )) } pub fn player_conf<'a>(item: Arc) -> MyResult>> { let mut audio_tracks = vec![]; let mut video_tracks = vec![]; let mut sub_tracks = vec![]; for (tid, track) in item.info.tracks.clone() { match &track.kind { SourceTrackKind::Audio { .. } => audio_tracks.push((tid, track)), SourceTrackKind::Video { .. } => video_tracks.push((tid, track)), SourceTrackKind::Subtitles { .. } => sub_tracks.push((tid, track)), } } Ok(HtmlTemplate( "Configure Player".to_string(), markup::new! { form.playerconf[method = "GET", action = ""] { h2 { "Select tracks for " @item.info.title } fieldset.video { legend { "Video" } @for (tid, track) in &video_tracks { input[type="radio", id=tid, name="v", value=tid]; label[for=tid] { @format!("{track}") } br; } input[type="radio", id="v-none", name="v", value=""]; label[for="v-none"] { "No video" } } fieldset.audio { legend { "Audio" } @for (tid, track) in &audio_tracks { input[type="radio", id=tid, name="a", value=tid]; label[for=tid] { @format!("{track}") } br; } input[type="radio", id="a-none", name="a", value=""]; label[for="a-none"] { "No audio" } } fieldset.subtitles { legend { "Subtitles" } @for (tid, track) in &sub_tracks { input[type="radio", id=tid, name="s", value=tid]; label[for=tid] { @format!("{track}") } br; } input[type="radio", id="s-none", name="s", value=""]; label[for="s-none"] { "No subtitles" } } input[type="submit", value="Start playback"]; } }, )) }