Ading cleanup and small improvements

This commit is contained in:
2026-07-16 16:00:19 +02:00
parent 24b04fd55e
commit fa8512ff3d
2 changed files with 62 additions and 11 deletions
+38 -6
View File
@@ -2185,22 +2185,54 @@ def _prune_manifest(
if (key.lower() if lowercase_keys else key) not in keep_ids
]
if not to_remove:
# Case-collision duplicates: when keys are case-insensitive (videos), several
# keys can share the same lowercase form (e.g. "KnightRotating" and
# "knightrotating"). Markers resolve by lowercased id, so only the exact
# lowercase key is ever reachable — the other case-variants are dead weight.
# Collapse each surviving collision group to its lowercase canonical.
dup_remove: list[tuple[str, str]] = [] # (removed_key, kept_canonical_key)
if lowercase_keys:
remove_set = set(to_remove)
groups: dict[str, list[str]] = {}
for key in data:
if key in remove_set:
continue
groups.setdefault(key.lower(), []).append(key)
for low, keys in groups.items():
if len(keys) < 2:
continue
# Keep the already-lowercase key (what the renderer resolves); else
# the first-seen, so at least one entry survives.
canonical = next((k for k in keys if k == low), keys[0])
for key in keys:
if key != canonical:
dup_remove.append((key, canonical))
if not to_remove and not dup_remove:
if verbose:
print(f" {path.name}: all {len(data)} {label} entries in use.")
return 0
print(f" {path.name}: removing {len(to_remove)} unused {label} entr"
f"{'y' if len(to_remove) == 1 else 'ies'}:")
for key in to_remove:
print(f" - {key}")
if to_remove:
print(f" {path.name}: removing {len(to_remove)} unused {label} entr"
f"{'y' if len(to_remove) == 1 else 'ies'}:")
for key in to_remove:
print(f" - {key}")
if dup_remove:
print(f" {path.name}: removing {len(dup_remove)} case-duplicate {label} entr"
f"{'y' if len(dup_remove) == 1 else 'ies'}:")
for key, canonical in dup_remove:
print(f" - {key} (duplicate of '{canonical}')")
if not dry_run:
for key in to_remove:
del data[key]
for key, _ in dup_remove:
del data[key]
_write_json_preserve(path, data)
return len(to_remove)
return len(to_remove) + len(dup_remove)
def _prune_narration(project_path: Path, verbose: bool, dry_run: bool) -> int: