diff --git a/crates/constants/src/lib.rs b/crates/constants/src/lib.rs index 3b523de..4b6a7bc 100644 --- a/crates/constants/src/lib.rs +++ b/crates/constants/src/lib.rs @@ -76,7 +76,9 @@ pub mod filename { pub const VIDEO: &str = "recording.mp4"; /// The input recording file pub const INPUTS: &str = "inputs.csv"; - /// The metadata file + /// The metadata file, before validation + pub const METADATA_UNVALIDATED: &str = "metadata_unvalidated.json"; + /// The metadata file, after validation pub const METADATA: &str = "metadata.json"; } diff --git a/src/record/local_recording.rs b/src/record/local_recording.rs index eb0710d..6f049c8 100644 --- a/src/record/local_recording.rs +++ b/src/record/local_recording.rs @@ -404,6 +404,8 @@ impl LocalRecording { let uploaded_file_path = path.join(constants::filename::recording::UPLOADED); let upload_progress_file_path = path.join(constants::filename::recording::UPLOAD_PROGRESS); let metadata_path = path.join(constants::filename::recording::METADATA); + let metadata_unvalidated_path = + path.join(constants::filename::recording::METADATA_UNVALIDATED); // Get the folder name let folder_name = path @@ -438,7 +440,8 @@ impl LocalRecording { }) } else { // Not uploaded yet (and not invalid) - let metadata: Option> = std::fs::read_to_string(metadata_path) + let metadata: Option> = std::fs::read_to_string(&metadata_path) + .or_else(|_| std::fs::read_to_string(&metadata_unvalidated_path)) .ok() .and_then(|s| serde_json::from_str(&s).ok()) .map(Box::new); @@ -542,7 +545,8 @@ impl LocalRecording { recorder_extra: Option, ) -> Result<()> { // Resolve metadata path from recording location - let metadata_path = recording_location.join(constants::filename::recording::METADATA); + let metadata_path = + recording_location.join(constants::filename::recording::METADATA_UNVALIDATED); // Create metadata let duration = start_instant.elapsed().as_secs_f64(); diff --git a/src/validation/mod.rs b/src/validation/mod.rs index d085d63..d5e0b9d 100644 --- a/src/validation/mod.rs +++ b/src/validation/mod.rs @@ -70,16 +70,24 @@ fn validate_folder_impl(path: &Path) -> Result> { csv_path.display() )]); } + // Determine source: prefer unvalidated (original), fall back to validated (old recordings) + let unvalidated_path = path.join(constants::filename::recording::METADATA_UNVALIDATED); let meta_path = path.join(constants::filename::recording::METADATA); - if !meta_path.is_file() { + + let source_path = if unvalidated_path.is_file() { + &unvalidated_path + } else if meta_path.is_file() { + &meta_path + } else { return Err(vec![format!( - "No metadata file found in {} (expected {})", + "No metadata file found in {} (expected {} or {})", path.display(), + unvalidated_path.display(), meta_path.display() )]); - } + }; - let metadata = std::fs::read_to_string(&meta_path) + let metadata = std::fs::read_to_string(source_path) .map_err(|e| vec![format!("Error reading metadata file: {e:?}")])?; let mut metadata = serde_json::from_str::(&metadata) .map_err(|e| vec![format!("Error parsing metadata file: {e:?}")])?;