aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/node.rs')
-rw-r--r--server/src/routes/ui/node.rs65
1 files changed, 53 insertions, 12 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index 64f5e84..9162982 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -5,9 +5,11 @@ use crate::{
routes::ui::HtmlTemplate,
AppState,
};
-use anyhow::Context;
+use anyhow::{anyhow, Context};
+use log::info;
use rocket::{get, uri, State};
use std::{ops::Deref, path::PathBuf, sync::Arc};
+use tokio::fs::File;
#[get("/library/<path..>")]
pub async fn r_library_node(
@@ -35,27 +37,66 @@ markup::define! {
}
}
DirectoryCard(dir: Arc<Directory>) {
- span { a[href=&uri!(r_library_node(&dir.lib_path)).to_string()] { @dir.data.name } }
+ div.card.dir { a[href=&uri!(r_library_node(&dir.lib_path)).to_string()] { @dir.data.name } }
}
DirectoryPage(dir: Arc<Directory>) {
- h1 { @dir.data.name }
- ul.directorylisting {
- @for el in &dir.children {
- li {
- span.title { @match el.deref().to_owned() {
+ div.page.dir {
+ h1 { @dir.data.name }
+ ul.directorylisting {
+ @for el in &dir.children {
+ li { @match el.deref().to_owned() {
Node::Directory(dir) => { @DirectoryCard { dir } }
Node::Item(item) => { @ItemCard { item } }
- }}
+ } }
}
}
}
}
ItemCard(item: Arc<Item>) {
- span { a[href=&uri!(r_library_node(&item.lib_path)).to_string()] { @item.info.title } }
+ div.card.item {
+ a[href=&uri!(r_library_node(&item.lib_path)).to_string()] {
+ img[src=uri!(r_item_assets(&item.lib_path)).to_string()];
+ }
+ a[href=&uri!(r_library_node(&item.lib_path)).to_string()] {
+ p.title { @item.info.title }
+ }
+ }
}
ItemPage(item: Arc<Item>) {
- h1 { @item.info.title }
- a[href=&player_uri(&item.lib_path)] { "Watch now" }
- p { "Lorem ipsum dolor sit amed...." }
+ div.page.item {
+ div.backdrop {
+ // TODO different image here
+ img[src=uri!(r_item_assets(&item.lib_path)).to_string()];
+ }
+ div.banner {
+ img[src=uri!(r_item_assets(&item.lib_path)).to_string()];
+ }
+ div.title {
+ h1 { @item.info.title }
+ a[href=&player_uri(&item.lib_path)] { "Watch now" }
+ }
+ div.details {
+ h3 { "Lorem Ipsum!" }
+ p { "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." }
+ }
+ }
}
}
+
+#[get("/item_assets/<path..>")]
+pub async fn r_item_assets(path: PathBuf, state: &State<AppState>) -> Result<File, MyError> {
+ let node = state
+ .library
+ .nested_path(&path)
+ .context("retrieving library node")?
+ .get_item()?
+ .clone();
+ let path = node.fs_path.parent().unwrap().join(
+ node.info
+ .banner
+ .clone()
+ .ok_or(anyhow!("no banner available"))?,
+ );
+ info!("loading asset from {path:?}");
+ Ok(File::open(path).await?)
+}