Files
tuliprox/src/api/main_api.rs
T

105 lines
3.7 KiB
Rust
Raw Normal View History

2023-11-08 11:46:03 +01:00
use std::collections::VecDeque;
use std::io::ErrorKind;
2021-10-07 20:11:54 +02:00
use std::path::PathBuf;
2023-11-06 21:33:48 +01:00
use std::sync::{Arc, Mutex, RwLock};
2021-10-07 20:11:54 +02:00
use actix_cors::Cors;
2024-05-02 15:22:23 +02:00
use actix_web::{App, HttpServer, web};
2024-05-03 01:47:41 +02:00
use actix_web::middleware::{Logger};
2024-05-02 15:22:23 +02:00
use log::info;
2021-10-07 20:11:54 +02:00
2023-11-24 22:53:33 +01:00
use crate::api::api_model::{AppState, DownloadQueue, SharedLocks};
2024-05-02 15:22:23 +02:00
use crate::api::m3u_api::m3u_api_register;
2023-11-02 20:03:22 +01:00
use crate::api::scheduler::start_scheduler;
2024-05-02 15:22:23 +02:00
use crate::api::v1_api::v1_api_register;
use crate::api::web_index::index_register;
use crate::api::xmltv_api::xmltv_api_register;
use crate::api::xtream_api::xtream_api_register;
2024-03-27 09:25:22 +01:00
use crate::model::config::{Config, ProcessTargets};
use crate::processing::playlist_processor;
2021-10-07 20:11:54 +02:00
2024-05-02 15:22:23 +02:00
fn get_web_dir_path(web_ui_enabled: bool, web_root: &str) -> Result<PathBuf, std::io::Error> {
let web_dir = web_root.to_string();
let web_dir_path = PathBuf::from(&web_dir);
if web_ui_enabled {
if !&web_dir_path.exists() || !&web_dir_path.is_dir() {
return Err(std::io::Error::new(ErrorKind::NotFound,
format!("web_root does not exists or is not an directory: {:?}", &web_dir_path)));
}
};
Ok(web_dir_path)
2021-10-07 20:11:54 +02:00
}
#[actix_web::main]
2023-10-19 18:56:08 +02:00
pub(crate) async fn start_server(cfg: Arc<Config>, targets: Arc<ProcessTargets>) -> futures::io::Result<()> {
2023-10-17 09:31:57 +02:00
let host = cfg.api.host.to_string();
2021-10-07 20:11:54 +02:00
let port = cfg.api.port;
2024-05-02 15:22:23 +02:00
let web_ui_enabled = cfg.web_ui_enabled;
let web_dir_path = match get_web_dir_path(web_ui_enabled, cfg.api.web_root.as_str()) {
Ok(result) => result,
Err(err) => return Err(err)
};
2021-10-07 20:11:54 +02:00
let schedule = cfg.schedule.clone();
2023-09-26 19:41:02 +02:00
2023-09-26 19:53:45 +02:00
let shared_data = web::Data::new(AppState {
2024-03-27 09:25:22 +01:00
config: Arc::clone(&cfg),
targets: Arc::clone(&targets),
2023-11-06 21:33:48 +01:00
downloads: Arc::from(DownloadQueue {
2023-11-08 11:46:03 +01:00
queue: Arc::from(Mutex::new(VecDeque::new())),
2023-11-06 21:33:48 +01:00
active: Arc::from(RwLock::new(None)),
finished: Arc::from(RwLock::new(Vec::new())),
2023-11-24 22:53:33 +01:00
}),
shared_locks: Arc::new(SharedLocks::new()),
2023-09-26 19:53:45 +02:00
});
2023-09-26 19:41:02 +02:00
// Scheduler
if let Some(expression) = schedule {
2023-09-26 19:53:45 +02:00
let cloned_data = shared_data.clone();
2023-09-26 19:41:02 +02:00
actix_rt::spawn(async move {
2023-09-26 19:53:45 +02:00
start_scheduler(&expression, cloned_data).await
2023-09-26 19:41:02 +02:00
});
}
2024-03-27 09:25:22 +01:00
if cfg.update_on_boot {
let cfg_clone = Arc::clone(&cfg);
let targets_clone = Arc::clone(&targets);
actix_rt::spawn(
async move { playlist_processor::exec_processing(cfg_clone, targets_clone).await }
);
}
2024-05-02 15:22:23 +02:00
if web_ui_enabled {
info!("Web root: {:?}", &web_dir_path);
}
2023-09-26 19:41:02 +02:00
// Web Server
2024-05-02 15:22:23 +02:00
HttpServer::new(move || {
App::new()
.wrap(Logger::default())
.wrap(Cors::default()
.supports_credentials()
.allow_any_origin()
.allowed_methods(vec!["GET", "POST", "OPTIONS", "HEAD"])
.allow_any_header()
.max_age(3600))
.app_data(shared_data.clone())
2024-05-03 01:47:41 +02:00
// .wrap(Condition::new(web_auth_enabled, ErrorHandlers::new().handler(StatusCode::UNAUTHORIZED, handle_unauthorized)))
.configure(|srvcfg| {
2024-05-02 15:22:23 +02:00
if web_ui_enabled {
2024-05-03 01:47:41 +02:00
srvcfg.service(actix_files::Files::new("/static", web_dir_path.join("static")));
srvcfg.configure(v1_api_register(cfg.web_auth.as_ref().unwrap().clone()));
2024-05-02 15:22:23 +02:00
}
})
.configure(xtream_api_register)
.configure(m3u_api_register)
.configure(xmltv_api_register)
2024-05-03 01:47:41 +02:00
.configure(|srvcfg| {
2024-05-02 15:22:23 +02:00
if web_ui_enabled {
2024-05-03 01:47:41 +02:00
srvcfg.configure(index_register(&web_dir_path, cfg.web_auth.as_ref().unwrap().clone()));
2024-05-02 15:22:23 +02:00
}
})
}).bind(format!("{}:{}", host, port))?.run().await
2023-09-26 19:41:02 +02:00
}