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! { h2 { "Watch: " @item.info.title } form[method = "GET", action = ""] { h3 { "Select tracks" } label[for="select-v"] { "Video: " } select[name="v", id="select-v"] { @for (tid, track) in &video_tracks { option[value=tid] { @format!("{track}") } } option[value=""] { "Disable" } } br; label[for="select-a"] { "Audio: " } select[name="a", id="select-a"] { @for (tid, track) in &audio_tracks { option[value=tid] { @format!("{track}") } } option[value=""] { "Disable" } } br; label[for="select-s"] { "Subtitles: " } select[name="s", id="select-s"] { option[value="", selected] { "None" } @for (tid, track) in &sub_tracks { option[value=tid] { @format!("{track}") } } } br; input[type="submit", value="Start playback"]; } }, )) }