48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
# 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)
|