aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/frontend/mod.rs2
-rw-r--r--server/src/frontend/style/mod.rs25
-rw-r--r--server/src/main.rs74
-rw-r--r--server/src/routes/mod.rs26
-rw-r--r--server/src/routes/stream.rs46
-rw-r--r--server/src/routes/ui/error.rs (renamed from server/src/frontend/pages/mod.rs)34
-rw-r--r--server/src/routes/ui/home.rs (renamed from server/src/frontend/pages/home.rs)6
-rw-r--r--server/src/routes/ui/layout.rs (renamed from server/src/frontend/pages/layout.rs)0
-rw-r--r--server/src/routes/ui/mod.rs32
-rw-r--r--server/src/routes/ui/node.rs (renamed from server/src/frontend/pages/node.rs)14
-rw-r--r--server/src/routes/ui/style/cantarell.woff2 (renamed from server/src/frontend/style/cantarell.woff2)bin93888 -> 93888 bytes
-rw-r--r--server/src/routes/ui/style/layout.css (renamed from server/src/frontend/style/layout.css)0
-rw-r--r--server/src/routes/ui/style/mod.rs51
13 files changed, 182 insertions, 128 deletions
diff --git a/server/src/frontend/mod.rs b/server/src/frontend/mod.rs
deleted file mode 100644
index 043be24..0000000
--- a/server/src/frontend/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub mod pages;
-pub mod style;
diff --git a/server/src/frontend/style/mod.rs b/server/src/frontend/style/mod.rs
deleted file mode 100644
index ca54aa7..0000000
--- a/server/src/frontend/style/mod.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use std::{
- fs::{read_to_string, File},
- io::Read,
-};
-
-pub fn css_bundle() -> String {
- if cfg!(debug_assertions) {
- read_to_string("server/src/frontend/style/layout.css").unwrap()
- } else {
- include_str!("layout.css").to_string()
- }
-}
-
-pub fn font_bundle() -> Vec<u8> {
- if cfg!(debug_assertions) {
- let mut woff = Vec::new();
- File::open("server/src/frontend/style/cantarell.woff2")
- .unwrap()
- .read_to_end(&mut woff)
- .unwrap();
- woff
- } else {
- include_bytes!("cantarell.woff2").to_vec()
- }
-}
diff --git a/server/src/main.rs b/server/src/main.rs
index a76d80b..438051f 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -1,69 +1,15 @@
#![feature(box_syntax)]
-use crate::frontend::pages::MyError;
-use anyhow::{anyhow, Context};
use database::Database;
-use frontend::{
- pages::{home::page_home, node::page_library_node},
- style::{css_bundle, font_bundle},
-};
use jellyremuxer::RemuxerContext;
use library::Library;
-use log::{debug, warn};
-use rocket::{get, http::ContentType, launch, response::stream::ReaderStream, routes, State};
-use std::{path::PathBuf, sync::Arc};
-use tokio::io::{duplex, DuplexStream};
-use tokio_util::io::SyncIoBridge;
+use rocket::launch;
+use routes::build_rocket;
+use std::sync::Arc;
pub mod database;
-pub mod frontend;
pub mod library;
-
-#[get("/assets/style.css")]
-async fn assets_style() -> (ContentType, String) {
- (ContentType::CSS, css_bundle())
-}
-
-#[get("/assets/cantarell.woff2")]
-async fn assets_font() -> (ContentType, Vec<u8>) {
- (ContentType::WOFF2, font_bundle())
-}
-
-#[get("/stream/<path..>?<selection>")]
-fn stream(
- path: PathBuf,
- selection: String,
- state: &State<AppState>,
-) -> Result<(ContentType, ReaderStream![DuplexStream]), MyError> {
- let (a, b) = duplex(1024);
- let path = path.to_str().unwrap().to_string();
- let item = state
- .library
- .nested(&path)
- .context("retrieving library node")?
- .get_item()?;
- let remuxer = state.remuxer.clone();
- let selection = selection
- .split(",")
- .map(|e| e.parse().map_err(|_| anyhow!("invalid number")))
- .into_iter()
- .collect::<Result<Vec<_>, _>>()?;
-
- let b = SyncIoBridge::new(b);
- tokio::task::spawn_blocking(move || {
- if let Err(e) = remuxer.generate_into(
- b,
- 0,
- item.fs_path.parent().unwrap().to_path_buf(),
- item.data.clone(),
- selection,
- ) {
- warn!("stream stopped: {e}")
- }
- });
- debug!("starting stream");
- Ok((ContentType::WEBM, ReaderStream::one(a)))
-}
+pub mod routes;
pub struct AppState {
pub database: Database,
@@ -81,15 +27,5 @@ fn rocket() -> _ {
library: Library::open(&lib_path).unwrap(),
database: Database::open(&db_path).unwrap(),
};
-
- rocket::build().manage(state).mount(
- "/",
- routes![
- page_home,
- page_library_node,
- assets_style,
- assets_font,
- stream
- ],
- )
+ build_rocket(state)
}
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs
new file mode 100644
index 0000000..4491e81
--- /dev/null
+++ b/server/src/routes/mod.rs
@@ -0,0 +1,26 @@
+use crate::AppState;
+use rocket::{catchers, routes, Build, Rocket};
+use stream::r_stream;
+use ui::error::r_not_found;
+use ui::home::r_home;
+use ui::node::r_library_node;
+use ui::style::{r_assets_font, r_assets_style};
+
+pub mod stream;
+pub mod ui;
+
+pub fn build_rocket(state: AppState) -> Rocket<Build> {
+ rocket::build()
+ .manage(state)
+ .register("/", catchers![r_not_found])
+ .mount(
+ "/",
+ routes![
+ r_home,
+ r_library_node,
+ r_assets_style,
+ r_assets_font,
+ r_stream
+ ],
+ )
+}
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs
new file mode 100644
index 0000000..6ff6982
--- /dev/null
+++ b/server/src/routes/stream.rs
@@ -0,0 +1,46 @@
+use super::ui::error::MyError;
+use crate::AppState;
+use anyhow::anyhow;
+use anyhow::Context;
+use log::debug;
+use log::warn;
+use rocket::{get, http::ContentType, response::stream::ReaderStream, State};
+use std::path::PathBuf;
+use tokio::io::{duplex, DuplexStream};
+use tokio_util::io::SyncIoBridge;
+
+#[get("/stream/<path..>?<selection>")]
+pub fn r_stream(
+ path: PathBuf,
+ selection: String,
+ state: &State<AppState>,
+) -> Result<(ContentType, ReaderStream![DuplexStream]), MyError> {
+ let (a, b) = duplex(1024);
+ let path = path.to_str().unwrap().to_string();
+ let item = state
+ .library
+ .nested(&path)
+ .context("retrieving library node")?
+ .get_item()?;
+ let remuxer = state.remuxer.clone();
+ let selection = selection
+ .split(",")
+ .map(|e| e.parse().map_err(|_| anyhow!("invalid number")))
+ .into_iter()
+ .collect::<Result<Vec<_>, _>>()?;
+
+ let b = SyncIoBridge::new(b);
+ tokio::task::spawn_blocking(move || {
+ if let Err(e) = remuxer.generate_into(
+ b,
+ 0,
+ item.fs_path.parent().unwrap().to_path_buf(),
+ item.data.clone(),
+ selection,
+ ) {
+ warn!("stream stopped: {e}")
+ }
+ });
+ debug!("starting stream");
+ Ok((ContentType::WEBM, ReaderStream::one(a)))
+}
diff --git a/server/src/frontend/pages/mod.rs b/server/src/routes/ui/error.rs
index a20fa0e..2a1f8e6 100644
--- a/server/src/frontend/pages/mod.rs
+++ b/server/src/routes/ui/error.rs
@@ -1,33 +1,23 @@
+use super::{layout::Layout, HtmlTemplate};
use markup::Render;
+use rocket::http::Status;
use rocket::{
+ catch,
http::ContentType,
response::{self, Responder},
Request, Response,
};
use std::{fmt::Display, io::Cursor};
-use self::layout::Layout;
-
-pub mod home;
-pub mod layout;
-pub mod node;
-
-pub struct HtmlTemplate<T>(pub String, pub T);
-
-impl<'r, T: Render> Responder<'r, 'static> for HtmlTemplate<T> {
- fn respond_to(self, _: &'r Request<'_>) -> response::Result<'static> {
- let mut out = String::new();
- Layout {
- title: self.0,
- main: self.1,
- }
- .render(&mut out)
- .unwrap();
- Response::build()
- .header(ContentType::HTML)
- .streamed_body(Cursor::new(out))
- .ok()
- }
+#[catch(default)]
+pub fn r_not_found<'a>(status: Status, _request: &Request) -> HtmlTemplate<markup::DynRender<'a>> {
+ HtmlTemplate(
+ "Not found".to_string(),
+ markup::new! {
+ h2 { "Error" }
+ p { @format!("{status:?}") }
+ },
+ )
}
#[derive(Debug)]
diff --git a/server/src/frontend/pages/home.rs b/server/src/routes/ui/home.rs
index 5076177..df95665 100644
--- a/server/src/frontend/pages/home.rs
+++ b/server/src/routes/ui/home.rs
@@ -1,9 +1,9 @@
-use crate::frontend::pages::node::NodePage;
-use crate::{frontend::pages::HtmlTemplate, AppState};
+use crate::routes::ui::node::NodePage;
+use crate::{routes::ui::HtmlTemplate, AppState};
use rocket::{get, State};
#[get("/")]
-pub async fn page_home(state: &State<AppState>) -> HtmlTemplate<markup::DynRender> {
+pub async fn r_home(state: &State<AppState>) -> HtmlTemplate<markup::DynRender> {
HtmlTemplate(
"Home".to_string(),
markup::new! {
diff --git a/server/src/frontend/pages/layout.rs b/server/src/routes/ui/layout.rs
index 1085f84..1085f84 100644
--- a/server/src/frontend/pages/layout.rs
+++ b/server/src/routes/ui/layout.rs
diff --git a/server/src/routes/ui/mod.rs b/server/src/routes/ui/mod.rs
new file mode 100644
index 0000000..aa0259d
--- /dev/null
+++ b/server/src/routes/ui/mod.rs
@@ -0,0 +1,32 @@
+use self::layout::Layout;
+use markup::Render;
+use rocket::{
+ http::ContentType,
+ response::{self, Responder},
+ Request, Response,
+};
+use std::io::Cursor;
+
+pub mod error;
+pub mod home;
+pub mod layout;
+pub mod node;
+pub mod style;
+
+pub struct HtmlTemplate<T>(pub String, pub T);
+
+impl<'r, T: Render> Responder<'r, 'static> for HtmlTemplate<T> {
+ fn respond_to(self, _: &'r Request<'_>) -> response::Result<'static> {
+ let mut out = String::new();
+ Layout {
+ title: self.0,
+ main: self.1,
+ }
+ .render(&mut out)
+ .unwrap();
+ Response::build()
+ .header(ContentType::HTML)
+ .streamed_body(Cursor::new(out))
+ .ok()
+ }
+}
diff --git a/server/src/frontend/pages/node.rs b/server/src/routes/ui/node.rs
index 6819bc9..b6d0d30 100644
--- a/server/src/frontend/pages/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -1,8 +1,8 @@
-use super::MyError;
-use crate::rocket_uri_macro_stream;
+use super::super::stream::rocket_uri_macro_r_stream;
+use super::error::MyError;
use crate::{
- frontend::pages::HtmlTemplate,
library::{Directory, Item, Node},
+ routes::ui::HtmlTemplate,
AppState,
};
use anyhow::Context;
@@ -10,7 +10,7 @@ use rocket::{get, uri, State};
use std::{ops::Deref, path::PathBuf, sync::Arc};
#[get("/library/<path..>")]
-pub async fn page_library_node(
+pub async fn r_library_node(
path: PathBuf,
state: &State<AppState>,
) -> Result<HtmlTemplate<markup::DynRender>, MyError> {
@@ -36,7 +36,7 @@ markup::define! {
}
}
DirectoryCard(dir: Arc<Directory>) {
- span { a[href=&uri!(page_library_node(&dir.lib_path)).to_string()] { @dir.data.name } }
+ span { a[href=&uri!(r_library_node(&dir.lib_path)).to_string()] { @dir.data.name } }
}
DirectoryPage(dir: Arc<Directory>) {
h1 { @dir.data.name }
@@ -52,10 +52,10 @@ markup::define! {
}
}
ItemCard(item: Arc<Item>) {
- span { a[href=&uri!(page_library_node(&item.lib_path)).to_string()] { @item.data.title } }
+ span { a[href=&uri!(r_library_node(&item.lib_path)).to_string()] { @item.data.title } }
}
ItemPage(item: Arc<Item>) {
h1 { @item.data.title }
- video[src=&uri!(stream(&item.lib_path, "1,2")).to_string(), controls] {}
+ video[src=&uri!(r_stream(&item.lib_path, "1,2")).to_string(), controls] {}
}
}
diff --git a/server/src/frontend/style/cantarell.woff2 b/server/src/routes/ui/style/cantarell.woff2
index 76fd894..76fd894 100644
--- a/server/src/frontend/style/cantarell.woff2
+++ b/server/src/routes/ui/style/cantarell.woff2
Binary files differ
diff --git a/server/src/frontend/style/layout.css b/server/src/routes/ui/style/layout.css
index 0612a7e..0612a7e 100644
--- a/server/src/frontend/style/layout.css
+++ b/server/src/routes/ui/style/layout.css
diff --git a/server/src/routes/ui/style/mod.rs b/server/src/routes/ui/style/mod.rs
new file mode 100644
index 0000000..f3d751b
--- /dev/null
+++ b/server/src/routes/ui/style/mod.rs
@@ -0,0 +1,51 @@
+use rocket::{get, http::ContentType};
+use std::{
+ fs::{read_to_string, File},
+ io::Read,
+ path::PathBuf,
+ str::FromStr,
+};
+
+fn css_bundle() -> String {
+ if cfg!(debug_assertions) {
+ read_to_string(
+ PathBuf::from_str(file!())
+ .unwrap()
+ .parent()
+ .unwrap()
+ .join("layout.css"),
+ )
+ .unwrap()
+ } else {
+ include_str!("layout.css").to_string()
+ }
+}
+fn font_bundle() -> Vec<u8> {
+ if cfg!(debug_assertions) {
+ let mut woff = Vec::new();
+
+ File::open(
+ PathBuf::from_str(file!())
+ .unwrap()
+ .parent()
+ .unwrap()
+ .join("cantarell.woff2"),
+ )
+ .unwrap()
+ .read_to_end(&mut woff)
+ .unwrap();
+ woff
+ } else {
+ include_bytes!("cantarell.woff2").to_vec()
+ }
+}
+
+#[get("/assets/style.css")]
+pub fn r_assets_style() -> (ContentType, String) {
+ (ContentType::CSS, css_bundle())
+}
+
+#[get("/assets/cantarell.woff2")]
+pub fn r_assets_font() -> (ContentType, Vec<u8>) {
+ (ContentType::WOFF2, font_bundle())
+}