normalizar-case
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
# 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)
|
||||
@@ -155,3 +155,28 @@ def check_comicinfo(names: list[str]) -> StepResult:
|
||||
)
|
||||
warnings = [] if found else ["Falta ComicInfo.xml"]
|
||||
return StepResult(step="check_comicinfo", changed=False, warnings=warnings)
|
||||
|
||||
|
||||
def check_extension_case(names: list[str], mode: str = "lower") -> StepResult:
|
||||
"""Detecta imágenes cuya extensión no está en el case esperado (lower/upper)."""
|
||||
mismatches = []
|
||||
for name in names:
|
||||
normalized = name.replace("\\", "/")
|
||||
if normalized.endswith("/"):
|
||||
continue
|
||||
basename = normalized.rsplit("/", 1)[-1]
|
||||
_, ext = os.path.splitext(basename)
|
||||
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:
|
||||
mismatches.append(basename)
|
||||
|
||||
if not mismatches:
|
||||
warnings = []
|
||||
elif len(mismatches) <= 3:
|
||||
warnings = [f"Case incorrecto en extensión: {f}" for f in sorted(mismatches)]
|
||||
else:
|
||||
warnings = [f"Case incorrecto en extensión: {len(mismatches)} ficheros"]
|
||||
|
||||
return StepResult(step="check_extension_case", changed=False, warnings=warnings)
|
||||
|
||||
Reference in New Issue
Block a user