write playout config

This commit is contained in:
jb-alvarado 2022-06-15 17:32:39 +02:00
parent b97f30c2b4
commit c6f81fa8a3
5 changed files with 64 additions and 58 deletions

2
Cargo.lock generated
View File

@ -667,7 +667,7 @@ dependencies = [
[[package]] [[package]]
name = "ffplayout-engine" name = "ffplayout-engine"
version = "0.9.8" version = "0.9.9"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"actix-web-grants", "actix-web-grants",

View File

@ -4,7 +4,7 @@ description = "24/7 playout based on rust and ffmpeg"
license = "GPL-3.0" license = "GPL-3.0"
authors = ["Jonathan Baecker jonbae77@gmail.com"] authors = ["Jonathan Baecker jonbae77@gmail.com"]
readme = "README.md" readme = "README.md"
version = "0.9.8" version = "0.9.9"
edition = "2021" edition = "2021"
default-run = "ffplayout" default-run = "ffplayout"

View File

@ -17,7 +17,7 @@ use crate::api::{
utils::{read_playout_config, Role}, utils::{read_playout_config, Role},
}; };
use crate::utils::playout_config; use crate::utils::PlayoutConfig;
#[derive(Serialize)] #[derive(Serialize)]
struct ResponseObj<T> { struct ResponseObj<T> {
@ -26,37 +26,6 @@ struct ResponseObj<T> {
data: Option<T>, data: Option<T>,
} }
#[derive(Debug, Serialize, Clone)]
struct ResponsePlayoutConfig {
general: Option<playout_config::General>,
rpc_server: Option<playout_config::RpcServer>,
mail: Option<playout_config::Mail>,
logging: Option<playout_config::Logging>,
processing: Option<playout_config::Processing>,
ingest: Option<playout_config::Ingest>,
playlist: Option<playout_config::Playlist>,
storage: Option<playout_config::Storage>,
text: Option<playout_config::Text>,
out: Option<playout_config::Out>,
}
impl ResponsePlayoutConfig {
fn new() -> Self {
Self {
general: None,
rpc_server: None,
mail: None,
logging: None,
processing: None,
ingest: None,
playlist: None,
storage: None,
text: None,
out: None,
}
}
}
/// curl -X GET http://127.0.0.1:8080/api/settings/1 -H "Authorization: Bearer <TOKEN>" /// curl -X GET http://127.0.0.1:8080/api/settings/1 -H "Authorization: Bearer <TOKEN>"
#[get("/settings/{id}")] #[get("/settings/{id}")]
#[has_any_role("Role::Admin", "Role::User", type = "Role")] #[has_any_role("Role::Admin", "Role::User", type = "Role")]
@ -94,35 +63,42 @@ async fn patch_settings(
#[has_any_role("Role::Admin", "Role::User", type = "Role")] #[has_any_role("Role::Admin", "Role::User", type = "Role")]
async fn get_playout_config( async fn get_playout_config(
id: web::Path<i64>, id: web::Path<i64>,
details: AuthDetails<Role>, _details: AuthDetails<Role>,
) -> Result<impl Responder, ServiceError> { ) -> Result<impl Responder, ServiceError> {
if let Ok(settings) = db_get_settings(&id).await { if let Ok(settings) = db_get_settings(&id).await {
if let Ok(config) = read_playout_config(&settings.config_path) { if let Ok(config) = read_playout_config(&settings.config_path) {
let mut playout_cfg = ResponsePlayoutConfig::new(); return Ok(web::Json(config));
playout_cfg.playlist = Some(config.playlist);
playout_cfg.storage = Some(config.storage);
playout_cfg.text = Some(config.text);
if details.has_role(&Role::Admin) {
playout_cfg.general = Some(config.general);
playout_cfg.rpc_server = Some(config.rpc_server);
playout_cfg.mail = Some(config.mail);
playout_cfg.logging = Some(config.logging);
playout_cfg.processing = Some(config.processing);
playout_cfg.ingest = Some(config.ingest);
playout_cfg.out = Some(config.out);
return Ok(web::Json(playout_cfg));
}
return Ok(web::Json(playout_cfg));
} }
}; };
Err(ServiceError::InternalServerError) Err(ServiceError::InternalServerError)
} }
/// curl -X PUT http://localhost:8080/api/playout/config/1 -H "Content-Type: application/json" \
/// --data { <CONFIG DATA> } --header 'Authorization: <TOKEN>'
#[put("/playout/config/{id}")]
#[has_any_role("Role::Admin", type = "Role")]
async fn update_playout_config(
id: web::Path<i64>,
data: web::Json<PlayoutConfig>,
) -> Result<impl Responder, ServiceError> {
if let Ok(settings) = db_get_settings(&id).await {
if let Ok(f) = std::fs::OpenOptions::new()
.write(true)
.truncate(true)
.open(&settings.config_path)
{
serde_yaml::to_writer(f, &data).unwrap();
return Ok("Update playout config success.");
} else {
return Err(ServiceError::InternalServerError);
};
};
Err(ServiceError::InternalServerError)
}
/// curl -X PUT http://localhost:8080/api/user/1 --header 'Content-Type: application/json' \ /// curl -X PUT http://localhost:8080/api/user/1 --header 'Content-Type: application/json' \
/// --data '{"email": "<EMAIL>", "password": "<PASS>"}' --header 'Authorization: <TOKEN>' /// --data '{"email": "<EMAIL>", "password": "<PASS>"}' --header 'Authorization: <TOKEN>'
#[put("/user/{id}")] #[put("/user/{id}")]

View File

@ -13,7 +13,10 @@ use ffplayout_engine::{
args_parse::Args, args_parse::Args,
auth, auth,
models::LoginUser, models::LoginUser,
routes::{add_user, get_playout_config, get_settings, login, patch_settings, update_user}, routes::{
add_user, get_playout_config, get_settings, login, patch_settings,
update_playout_config, update_user,
},
utils::{db_path, init_config, run_args, Role}, utils::{db_path, init_config, run_args, Role},
}, },
utils::{init_logging, PlayoutConfig}, utils::{init_logging, PlayoutConfig},
@ -27,7 +30,6 @@ async fn validator(req: ServiceRequest, credentials: BearerAuth) -> Result<Servi
req.extensions_mut() req.extensions_mut()
.insert(LoginUser::new(claims.id, claims.username)); .insert(LoginUser::new(claims.id, claims.username));
println!("{:#?}", req);
Ok(req) Ok(req)
} }
@ -72,6 +74,7 @@ async fn main() -> std::io::Result<()> {
.wrap(auth) .wrap(auth)
.service(add_user) .service(add_user)
.service(get_playout_config) .service(get_playout_config)
.service(update_playout_config)
.service(get_settings) .service(get_settings)
.service(patch_settings) .service(patch_settings)
.service(update_user), .service(update_user),

View File

@ -30,7 +30,10 @@ pub struct PlayoutConfig {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct General { pub struct General {
pub help_text: String,
pub stop_threshold: f64, pub stop_threshold: f64,
#[serde(skip_serializing, skip_deserializing)]
pub generate: Option<Vec<String>>, pub generate: Option<Vec<String>>,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
@ -39,6 +42,7 @@ pub struct General {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RpcServer { pub struct RpcServer {
pub help_text: String,
pub enable: bool, pub enable: bool,
pub address: String, pub address: String,
pub authorization: String, pub authorization: String,
@ -46,6 +50,7 @@ pub struct RpcServer {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Mail { pub struct Mail {
pub help_text: String,
pub subject: String, pub subject: String,
pub smtp_server: String, pub smtp_server: String,
pub starttls: bool, pub starttls: bool,
@ -58,6 +63,7 @@ pub struct Mail {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Logging { pub struct Logging {
pub help_text: String,
pub log_to_file: bool, pub log_to_file: bool,
pub backup_count: usize, pub backup_count: usize,
pub local_time: bool, pub local_time: bool,
@ -69,6 +75,7 @@ pub struct Logging {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Processing { pub struct Processing {
pub help_text: String,
pub mode: String, pub mode: String,
pub width: i64, pub width: i64,
pub height: i64, pub height: i64,
@ -85,28 +92,41 @@ pub struct Processing {
pub loud_tp: f32, pub loud_tp: f32,
pub loud_lra: f32, pub loud_lra: f32,
pub volume: f64, pub volume: f64,
#[serde(skip_serializing, skip_deserializing)]
pub settings: Option<Vec<String>>, pub settings: Option<Vec<String>>,
} }
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Ingest { pub struct Ingest {
pub help_text: String,
pub enable: bool, pub enable: bool,
input_param: String, input_param: String,
#[serde(skip_serializing, skip_deserializing)]
pub input_cmd: Option<Vec<String>>, pub input_cmd: Option<Vec<String>>,
} }
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Playlist { pub struct Playlist {
pub help_text: String,
pub path: String, pub path: String,
pub day_start: String, pub day_start: String,
#[serde(skip_serializing, skip_deserializing)]
pub start_sec: Option<f64>, pub start_sec: Option<f64>,
pub length: String, pub length: String,
#[serde(skip_serializing, skip_deserializing)]
pub length_sec: Option<f64>, pub length_sec: Option<f64>,
pub infinit: bool, pub infinit: bool,
} }
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Storage { pub struct Storage {
pub help_text: String,
pub path: String, pub path: String,
pub filler_clip: String, pub filler_clip: String,
pub extensions: Vec<String>, pub extensions: Vec<String>,
@ -115,6 +135,7 @@ pub struct Storage {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Text { pub struct Text {
pub help_text: String,
pub add_text: bool, pub add_text: bool,
pub over_pre: bool, pub over_pre: bool,
pub bind_address: String, pub bind_address: String,
@ -126,11 +147,17 @@ pub struct Text {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Out { pub struct Out {
pub help_text: String,
pub mode: String, pub mode: String,
pub preview: bool, pub preview: bool,
preview_param: String, pub preview_param: String,
#[serde(skip_serializing, skip_deserializing)]
pub preview_cmd: Option<Vec<String>>, pub preview_cmd: Option<Vec<String>>,
output_param: String,
pub output_param: String,
#[serde(skip_serializing, skip_deserializing)]
pub output_cmd: Option<Vec<String>>, pub output_cmd: Option<Vec<String>>,
} }