1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
use super::error::MyError;
use super::player::player_uri;
use crate::{
library::{Directory, Item, Node},
routes::ui::HtmlTemplate,
AppState,
};
use anyhow::Context;
use rocket::{get, uri, State};
use std::{ops::Deref, path::PathBuf, sync::Arc};
#[get("/library/<path..>")]
pub async fn r_library_node(
path: PathBuf,
state: &State<AppState>,
) -> Result<HtmlTemplate<markup::DynRender>, MyError> {
let node = state
.library
.nested_path(&path)
.context("retrieving library node")?
.clone();
Ok(HtmlTemplate(
format!("{}", node.title()),
markup::new! {
@NodePage { node: node.clone() }
},
))
}
markup::define! {
NodePage(node: Arc<Node>) {
@match node.deref() {
Node::Directory(dir) => { @DirectoryPage { dir: dir.clone() } }
Node::Item(item) => { @ItemPage { item: item.clone() } }
}
}
DirectoryCard(dir: Arc<Directory>) {
span { 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() {
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 } }
}
ItemPage(item: Arc<Item>) {
h1 { @item.info.title }
a[href=&player_uri(&item.lib_path)] { "Watch now" }
}
}
|