Adding fix to recover narration.json

This commit is contained in:
2026-07-27 10:48:44 +02:00
parent a8aab55bd2
commit cdda2e9024
+28 -5
View File
@@ -625,12 +625,35 @@ def parse_narration(
default_filters = config.default_filters if config else {} default_filters = config.default_filters if config else {}
narration = {} narration = {}
_narr_video_exts = {".mov", ".mp4", ".webm", ".avi", ".mkv", ".m4v"}
for segment_id, segment_data in data.items(): for segment_id, segment_data in data.items():
if "source_file" not in segment_data: if not segment_data.get("source_file"):
raise ParseError( # source_file can drift out of an entry (case/sync churn between
f"Narration segment '{segment_id}' missing required field 'source_file'", # machines). Recover the way import/prune/trim do: find the raw
narration_path, # recording whose stem matches the segment id, case-insensitively.
) recovered = None
for sub in ("raw_mov", "processed"):
sub_dir = narration_dir / sub
if not sub_dir.is_dir():
continue
for f in sorted(sub_dir.iterdir()):
if (
f.is_file()
and f.suffix.lower() in _narr_video_exts
and f.stem.lower() == segment_id.lower()
):
recovered = f"{sub}/{f.name}"
break
if recovered:
break
if recovered is None:
raise ParseError(
f"Narration segment '{segment_id}' missing required field 'source_file' "
f"and no matching recording was found in raw_mov/ or processed/. "
f"Add a 'source_file' or run 'import' to repair narration.json.",
narration_path,
)
segment_data = {**segment_data, "source_file": recovered}
# Resolve filter - can be a list or a string reference to default_filters # Resolve filter - can be a list or a string reference to default_filters
filter_value = segment_data.get("filter", []) filter_value = segment_data.get("filter", [])