use std::path::Path; use rocket::{http::Method, routes}; use tokio::sync::OnceCell; mod library; mod pages; mod yt_meta; pub static PG: OnceCell = OnceCell::const_new(); #[macro_export] macro_rules! get_pg { () => { if let Some(client) = $crate::PG.get() { client } else { let client = sqlx::postgres::PgPoolOptions::new() .max_connections(5) .connect(&std::env::var("DATABASE_URL").unwrap()) .await .unwrap(); $crate::PG.set(client).unwrap(); $crate::PG.get().unwrap() } }; } #[rocket::launch] async fn launch() -> _ { std::env::set_var("RUST_LOG", "info"); std::env::set_var("RUST_BACKTRACE", "1"); env_logger::init(); let args: Vec = std::env::args().collect(); if args.len() != 2 { eprintln!("Usage: {} ", args[0]); std::process::exit(1); } let dir_path = args[1].clone(); let pg = get_pg!(); sqlx::migrate!("./migrations").run(pg).await.unwrap(); let lib = library::Library::new().await; let library = lib.clone(); library .scan_dir(&Path::new(&dir_path.clone()).to_path_buf()) .await; let cors = rocket_cors::CorsOptions { allowed_origins: rocket_cors::AllowedOrigins::all(), allowed_methods: vec![Method::Get, Method::Post, Method::Options] .into_iter() .map(From::from) .collect(), allowed_headers: rocket_cors::AllowedHeaders::all(), allow_credentials: true, ..Default::default() } .to_cors() .expect("error creating CORS options"); rocket::build() .mount( "/", routes![ pages::assets::video_file, pages::assets::video_thumbnail, pages::index::search, pages::index::channel_page, pages::yt::yt_tags, pages::yt::yt_tag_page, pages::yt::yt_channel_page ], ) .attach(cors) .manage(lib) }