diff --git a/src/main.rs b/src/main.rs index a0b32e4fed09c523bf482b5d699f99ddb04f1143..7f0611d1d201c6306e8d91947b856076a2a671f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,7 +22,7 @@ struct Args { /// The preset of the lecture. Can be a toml file or a known course slug. #[clap(short, long)] - preset: String, + preset: Option<String>, #[cfg(feature = "mem_limit")] /// The memory limit for external tools like ffmpeg. @@ -55,14 +55,16 @@ fn main() { // process arguments let directory = args.directory.canonicalize_utf8().unwrap(); - let preset = Preset::find(&args.preset).unwrap(); - let course = preset.course; // let's see if we need to initialise the project let project_path = directory.join("project.toml"); let mut project = if project_path.exists() { toml::from_slice(&fs::read(&project_path).unwrap()).unwrap() } else { + assert!(args.preset.is_some()); + let preset = Preset::find(&args.preset.unwrap()).unwrap(); + let course = preset.course; + let dirname = directory.file_name().unwrap(); let date = parse_date(dirname).expect("Directory name is not in the expected format"); @@ -112,6 +114,8 @@ fn main() { stereo: args.stereo, start: None, end: None, + transcode_lowest: args.transcode.or(preset.transcode), + transcode_highest: args.transcode_start.unwrap_or(preset.transcode_start), fast: Vec::new(), questions: Vec::new(), metadata: None @@ -214,10 +218,10 @@ fn main() { }); // rescale the video - if let Some(lowest_res) = args.transcode.or(preset.transcode) { + if let Some(lowest_res) = project.source.transcode_lowest { for res in Resolution::STANDARD_RESOLUTIONS.into_iter().rev() { if res > project.source.metadata.as_ref().unwrap().source_res - || res > args.transcode_start.unwrap_or(preset.transcode_start) + || res > project.source.transcode_highest || res < lowest_res { continue; diff --git a/src/project.rs b/src/project.rs index 93d7a45b0d57730f9698348e2fe035862365e0b7..5e182e1fadd8ea1f7c10193e4bcb7f68dd4ff860 100644 --- a/src/project.rs +++ b/src/project.rs @@ -150,6 +150,11 @@ pub struct ProjectSource { #[serde_as(as = "Option<DisplayFromStr>")] pub end: Option<Time>, + #[serde_as(as = "Option<DisplayFromStr>")] + pub transcode_lowest: Option<Resolution>, + #[serde_as(as = "DisplayFromStr")] + pub transcode_highest: Resolution, + #[serde(default)] #[serde_as(as = "Vec<(DisplayFromStr, DisplayFromStr)>")] pub fast: Vec<(Time, Time)>,