aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/mod.rs')
-rw-r--r--server/src/routes/mod.rs163
1 files changed, 163 insertions, 0 deletions
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs
new file mode 100644
index 0000000..959971a
--- /dev/null
+++ b/server/src/routes/mod.rs
@@ -0,0 +1,163 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2026 metamuffin <metamuffin.org>
+*/
+
+pub mod account;
+pub mod admin;
+pub mod api;
+pub mod assets;
+pub mod compat;
+pub mod error;
+pub mod home;
+pub mod index;
+pub mod items;
+pub mod node;
+pub mod player;
+pub mod playersync;
+pub mod stream;
+pub mod style;
+pub mod userdata;
+
+use self::{
+ account::{
+ r_account_login, r_account_login_post, r_account_logout, r_account_logout_post,
+ settings::{r_account_settings, r_account_settings_post},
+ },
+ admin::{
+ import::{r_admin_import, r_admin_import_post, r_admin_import_stream},
+ log::{r_admin_log, r_admin_log_stream},
+ r_admin_dashboard,
+ users::{r_admin_new_user, r_admin_user, r_admin_user_remove, r_admin_users},
+ },
+ api::{r_api_root, r_version},
+ assets::{r_image, r_image_fallback_person},
+ compat::youtube::{r_youtube_channel, r_youtube_embed, r_youtube_watch},
+ error::{r_api_catch, r_catch},
+ home::r_home,
+ index::{r_favicon, r_index},
+ items::r_items,
+ node::r_node,
+ player::r_player,
+ playersync::{PlayersyncChannels, r_playersync},
+ stream::r_stream,
+ style::{r_assets_css, r_assets_font, r_assets_js, r_assets_js_map},
+};
+use crate::State;
+use rocket::{
+ Build, Config, Rocket, catchers, fairing::AdHoc, fs::FileServer, http::Header, routes,
+ shield::Shield,
+};
+use std::sync::Arc;
+
+#[macro_export]
+macro_rules! uri {
+ ($kk:stmt) => {
+ &rocket::uri!($kk).to_string()
+ };
+}
+
+pub(super) fn build_rocket(state: Arc<State>) -> Rocket<Build> {
+ rocket::build()
+ .configure(Config {
+ address: std::env::var("BIND_ADDR")
+ .map(|e| e.parse().unwrap())
+ .unwrap_or("127.0.0.1".parse().unwrap()),
+ port: std::env::var("PORT")
+ .map(|e| e.parse().unwrap())
+ .unwrap_or(8000),
+ ip_header: Some("x-real-ip".into()),
+ ..Default::default()
+ })
+ .manage(PlayersyncChannels::default())
+ .manage(state.clone())
+ .attach(AdHoc::on_response("set server header", |_req, res| {
+ res.set_header(Header::new("server", "jellything"));
+ Box::pin(async {})
+ }))
+ .attach(AdHoc::on_response("frame options", |req, resp| {
+ if !req.uri().path().as_str().starts_with("/embed") {
+ resp.set_raw_header("X-Frame-Options", "SAMEORIGIN");
+ }
+ Box::pin(async {})
+ }))
+ .attach(Shield::new())
+ .register("/", catchers![r_catch])
+ .register("/api", catchers![r_api_catch])
+ .mount("/assets", FileServer::from(&state.config.asset_path))
+ .mount(
+ "/",
+ routes![
+ r_account_login_post,
+ r_account_login,
+ r_account_logout_post,
+ r_account_logout,
+ r_account_settings_post,
+ r_account_settings,
+ r_admin_dashboard,
+ r_admin_import_post,
+ r_admin_import_stream,
+ r_admin_import,
+ r_admin_log_stream,
+ r_admin_log,
+ r_admin_new_user,
+ r_admin_users,
+ r_admin_user,
+ r_admin_user_remove,
+ r_api_root,
+ r_assets_css,
+ r_assets_font,
+ r_assets_js_map,
+ r_assets_js,
+ r_favicon,
+ r_home,
+ r_image_fallback_person,
+ r_image,
+ r_index,
+ r_items,
+ r_node,
+ r_player,
+ r_playersync,
+ r_stream,
+ r_version,
+ // Compat
+ // r_jellyfin_artists,
+ // r_jellyfin_branding_configuration,
+ // r_jellyfin_branding_css,
+ // r_jellyfin_displaypreferences_usersettings_post,
+ // r_jellyfin_displaypreferences_usersettings,
+ // r_jellyfin_items_image_primary,
+ // r_jellyfin_items_images_backdrop,
+ // r_jellyfin_items_intros,
+ // r_jellyfin_items_item,
+ // r_jellyfin_items_playbackinfo,
+ // r_jellyfin_items_similar,
+ // r_jellyfin_items,
+ // r_jellyfin_livetv_programs_recommended,
+ // r_jellyfin_persons,
+ // r_jellyfin_playback_bitratetest,
+ // r_jellyfin_quickconnect_enabled,
+ // r_jellyfin_sessions_capabilities_full,
+ // r_jellyfin_sessions_playing_progress,
+ // r_jellyfin_sessions_playing,
+ // r_jellyfin_shows_nextup,
+ // r_jellyfin_socket,
+ // r_jellyfin_system_endpoint,
+ // r_jellyfin_system_info_public_case,
+ // r_jellyfin_system_info_public,
+ // r_jellyfin_system_info,
+ // r_jellyfin_users_authenticatebyname,
+ // r_jellyfin_users_authenticatebyname_case,
+ // r_jellyfin_users_id,
+ // r_jellyfin_users_items_item,
+ // r_jellyfin_users_items,
+ // r_jellyfin_users_public,
+ // r_jellyfin_users_views,
+ // r_jellyfin_video_stream,
+ r_youtube_channel,
+ r_youtube_embed,
+ r_youtube_watch,
+ ],
+ )
+}