Ading cleanup and small improvements
This commit is contained in:
+38
-6
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user