aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/player.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/player.rs')
-rw-r--r--server/src/routes/ui/player.rs95
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"];
+ }
+ },
+ ))
+}