Files
furumi-ng/furumi-server/src/web/mod.rs
2026-03-17 13:49:03 +00:00

50 lines
1.2 KiB
Rust

pub mod auth;
pub mod browse;
pub mod meta;
pub mod stream;
pub mod transcoder;
use std::path::PathBuf;
use std::sync::Arc;
use axum::{
Router,
middleware,
routing::get,
};
/// Shared state passed to all web handlers.
#[derive(Clone)]
pub struct WebState {
pub root: Arc<PathBuf>,
pub token: Arc<String>,
}
/// Build the axum Router for the web player.
pub fn build_router(root: PathBuf, token: String) -> Router {
let state = WebState {
root: Arc::new(root),
token: Arc::new(token),
};
let api = Router::new()
.route("/browse", get(browse::handler))
.route("/stream/*path", get(stream::handler))
.route("/meta/*path", get(meta::handler));
let authed_routes = Router::new()
.route("/", get(player_html))
.nest("/api", api)
.route_layer(middleware::from_fn_with_state(state.clone(), auth::require_auth));
Router::new()
.route("/login", get(auth::login_page).post(auth::login_submit))
.route("/logout", get(auth::logout))
.merge(authed_routes)
.with_state(state)
}
async fn player_html() -> axum::response::Html<&'static str> {
axum::response::Html(include_str!("player.html"))
}