Skip to content

Commit ab8e485

Browse files
blakesimsclaude
andcommitted
Fix multi-segment recording data loss during recovery
The recovery process sorted segment directories alphabetically, causing segment-10 to come before segment-2. Combined with index assignment from enumeration, this caused middle segments (2-9) to be incorrectly processed and their video data lost. Fixes: - Use natural numeric sort for segment directories - Parse segment index from folder name instead of enumeration - Use actual segment path from metadata in create_project_config Fixes #1509 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent c59f1b4 commit ab8e485

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

crates/recording/src/recovery.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,22 @@ impl RecoveryManager {
136136
.filter(|e| e.path().is_dir())
137137
.collect();
138138

139-
segment_dirs.sort_by_key(|e| e.file_name());
139+
segment_dirs.sort_by_key(|e| {
140+
let name = e.file_name().to_string_lossy().to_string();
141+
name.strip_prefix("segment-")
142+
.and_then(|s| s.parse::<u32>().ok())
143+
.unwrap_or(u32::MAX)
144+
});
140145

141-
for (index, segment_entry) in segment_dirs.iter().enumerate() {
146+
for segment_entry in &segment_dirs {
142147
let segment_path = segment_entry.path();
143148

149+
let folder_name = segment_entry.file_name().to_string_lossy().to_string();
150+
let index: u32 = folder_name
151+
.strip_prefix("segment-")
152+
.and_then(|s| s.parse().ok())
153+
.unwrap_or(0);
154+
144155
let display_dir = segment_path.join("display");
145156
let display_info = Self::find_complete_fragments_with_init(&display_dir);
146157
let mut display_fragments = display_info.fragments;
@@ -186,7 +197,7 @@ impl RecoveryManager {
186197
let cursor_path = Self::probe_cursor(&segment_path.join("cursor.json"));
187198

188199
recoverable_segments.push(RecoverableSegment {
189-
index: index as u32,
200+
index,
190201
display_fragments,
191202
display_init_segment,
192203
camera_fragments,
@@ -899,11 +910,7 @@ impl RecoveryManager {
899910
.iter()
900911
.enumerate()
901912
.filter_map(|(i, segment)| {
902-
let segment_base = format!("content/segments/segment-{i}");
903-
let display_path = recording
904-
.project_path
905-
.join(&segment_base)
906-
.join("display.mp4");
913+
let display_path = recording.project_path.join(segment.display.path.as_str());
907914

908915
let duration = get_media_duration(&display_path)
909916
.map(|d| d.as_secs_f64())

0 commit comments

Comments
 (0)