bumblebee/src/configuration/mod.rs

131 lines
3.5 KiB
Rust
Raw Normal View History

use serde::{Deserialize, Serialize};
mod ffmpeg;
2023-05-06 19:38:34 +00:00
#[allow(non_camel_case_types)] // this is allowed cuz we want to use snake case in the config file
#[derive(Serialize, Deserialize, Debug)]
pub enum ConfigFilesCleanupOriginalBehavior {
delete,
archive,
keep,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFilesCleanupArchive {
pub path: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFilesCleanupDelete {
pub remove_empty_directories: bool,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFilesCleanup {
pub enabled: bool,
pub original_cleanup_behavior: ConfigFilesCleanupOriginalBehavior,
pub archive: ConfigFilesCleanupArchive,
pub delete: ConfigFilesCleanupDelete,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFiles {
pub input_path: String,
pub output_path: String,
pub include: Vec<String>,
2023-05-08 08:27:06 +00:00
pub cleanup: Option<ConfigFilesCleanup>,
2023-05-06 19:38:34 +00:00
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFFmpegProcess {
pub threads: Option<u8>,
pub niceness: Option<u8>,
2023-05-06 19:38:34 +00:00
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFFmpegOutputVideo {
pub codec: String,
pub bitrate: u32,
pub crf: u8,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFFmpegOutputAudio {
pub codec: String,
pub bitrate: u32,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFFmpegOutput {
pub format: String,
pub video: ConfigFFmpegOutputVideo,
pub audio: ConfigFFmpegOutputAudio,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConfigFFmpeg {
pub path: String,
2023-05-08 08:27:06 +00:00
pub extra_args: Option<Vec<String>>,
pub overwrite: Option<bool>,
2023-05-06 19:38:34 +00:00
pub process: ConfigFFmpegProcess,
pub output: ConfigFFmpegOutput,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Config {
pub debug: Option<bool>,
2023-05-06 19:38:34 +00:00
pub files: ConfigFiles,
pub ffmpeg: ConfigFFmpeg,
}
impl Config {
pub fn new() -> Config {
Config {
debug: None,
2023-05-06 19:38:34 +00:00
files: ConfigFiles {
input_path: String::from("/data/input"),
output_path: String::from("/data/output"),
include: Vec::new(),
2023-05-08 08:27:06 +00:00
cleanup: None
2023-05-06 19:38:34 +00:00
},
ffmpeg: ConfigFFmpeg {
path: String::from("/usr/bin/ffmpeg"),
2023-05-08 08:27:06 +00:00
extra_args: None,
overwrite: None,
2023-05-06 19:38:34 +00:00
process: ConfigFFmpegProcess {
threads: Some(0),
niceness: Some(0),
2023-05-06 19:38:34 +00:00
},
output: ConfigFFmpegOutput {
format: String::from("webm"),
video: ConfigFFmpegOutputVideo {
codec: String::from("libsvtav1"),
bitrate: 0,
crf: 0,
},
audio: ConfigFFmpegOutputAudio {
codec: String::from("libopus"),
bitrate: 0,
},
},
},
}
}
pub fn from_file(path: &str) -> Config {
let config_file = std::fs::read_to_string(path).expect("Failed to read config file");
match toml::from_str(&config_file) {
Ok(config) => config,
Err(e) => {
panic!("Failed to parse config file: {}", e.message());
2023-05-06 19:38:34 +00:00
}
}
}
pub fn is_debug(&self) -> bool {
match self.debug {
Some(debug) => debug,
None => false,
}
}
2023-05-06 19:38:34 +00:00
}