# processors/case_normalizer.py import os from core.constants import IMAGE_EXTENSIONS from core.result import StepResult def preview_normalize_case(work_dir: str, mode: str = "lower") -> list[tuple[str, str]]: """Devuelve lista de (nombre_actual, nombre_final) sin modificar nada.""" result = [] for root, _, files in os.walk(work_dir): for f in files: stem, ext = os.path.splitext(f) if not ext or ext.lower() not in IMAGE_EXTENSIONS: continue target_ext = ext.lower() if mode == "lower" else ext.upper() if ext != target_ext: result.append((f, stem + target_ext)) return sorted(result) def normalize_case(work_dir: str, mode: str = "lower") -> StepResult: """ Renombra las extensiones de las imágenes en work_dir al case indicado. Solo afecta a extensiones de imagen (IMAGE_EXTENSIONS); ComicInfo.xml y otros ficheros no de imagen quedan intactos. En Linux (FS sensible al case) el rename directo es seguro. """ changed = False details = [] for root, _, files in os.walk(work_dir): for f in files: stem, ext = os.path.splitext(f) if not ext or ext.lower() not in IMAGE_EXTENSIONS: continue target_ext = ext.lower() if mode == "lower" else ext.upper() if ext == target_ext: continue src = os.path.join(root, f) dst = os.path.join(root, stem + target_ext) os.rename(src, dst) details.append(f"{f} → {stem + target_ext}") changed = True return StepResult(step="normalize_case", changed=changed, details=details)