diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-18 19:13:36 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-18 19:13:36 +0100 |
commit | e24a026c58c07a2800662b9f5f4fd3f61d53c1d1 (patch) | |
tree | 91c158ff294508f903f2489f204e313700d42828 /server/src/routes/ui/player.rs | |
parent | 46ef75431e1d34c63a690726a8ef584d175ddd30 (diff) | |
download | jellything-e24a026c58c07a2800662b9f5f4fd3f61d53c1d1.tar jellything-e24a026c58c07a2800662b9f5f4fd3f61d53c1d1.tar.bz2 jellything-e24a026c58c07a2800662b9f5f4fd3f61d53c1d1.tar.zst |
player config works
Diffstat (limited to 'server/src/routes/ui/player.rs')
-rw-r--r-- | server/src/routes/ui/player.rs | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/server/src/routes/ui/player.rs b/server/src/routes/ui/player.rs new file mode 100644 index 0000000..69f6e7f --- /dev/null +++ b/server/src/routes/ui/player.rs @@ -0,0 +1,95 @@ +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<u64>, + pub v: Option<u64>, + pub s: Option<u64>, + pub webm: bool, +} + +#[get("/player/<path..>?<conf..>", rank = 4)] +pub fn r_player( + state: &State<AppState>, + path: PathBuf, + conf: PlayerConfig, +) -> MyResult<HtmlTemplate<markup::DynRender<'_>>> { + 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::<Vec<_>>(); + + Ok(HtmlTemplate( + "Configure Player".to_string(), + markup::new! { + video[src=stream_uri(&item.lib_path, &tracks), controls]; + }, + )) +} + +pub fn player_conf<'a>(item: Arc<Item>) -> MyResult<HtmlTemplate<markup::DynRender<'a>>> { + 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}") } + } + } + br; + + label[for="select-a"] { "Audio: " } + select[name="a", id="select-a"] { + @for (tid, track) in &audio_tracks { + option[value=tid] { @format!("{track}") } + } + } + br; + + label[for="select-s"] { "Subtitles: " } + select[name="s", id="select-s"] { + @for (tid, track) in &sub_tracks { + option[value=tid] { @format!("{track}") } + } + } + br; + + input[type="submit", value="Start playback"]; + } + }, + )) +} |