detecta extensions mal nombrades cbz/cbr

This commit is contained in:
2026-02-18 12:26:02 +01:00
parent 7a47aea9bd
commit eb589ce949
2 changed files with 105 additions and 40 deletions
+43 -9
View File
@@ -1,25 +1,58 @@
# main.py
import sys
import argparse
from core.scanner import find_comic_files
from processors.validator import validate_comic
def parse_args():
parser = argparse.ArgumentParser(
description="Gestor de colección de cómics CBR/CBZ"
)
parser.add_argument(
"--ruta",
type=str,
required=True,
help="Ruta base donde buscar los cómics"
)
parser.add_argument(
"--listar",
action="store_true",
help="Listar todos los archivos CBR/CBZ encontrados"
)
parser.add_argument(
"--validar",
action="store_true",
help="Validar los archivos encontrados"
)
# Aquí podremos añadir más opciones en el futuro:
# parser.add_argument("--convertir", action="store_true", help="Convertir CBR a CBZ")
# parser.add_argument("--organizar", action="store_true", help="Organizar la colección")
return parser.parse_args()
def main():
if len(sys.argv) > 1:
base_path = sys.argv[1]
else:
base_path = input("Introduce la ruta de la colección: ").strip()
args = parse_args()
print(f"Buscando archivos CBR/CBZ en: {base_path}\n")
comic_files = find_comic_files(base_path)
print(f"Buscando archivos CBR/CBZ en: {args.ruta}\n")
comic_files = find_comic_files(args.ruta)
if not comic_files:
print("No se encontraron archivos .cbr o .cbz")
return
print(f"Se encontraron {len(comic_files)} archivos.\n")
if args.listar:
print("Archivos encontrados:")
for f in comic_files:
print(f" - {f}")
print()
if args.validar:
print("Validando archivos...\n")
for f in comic_files:
result = validate_comic(f)
print(result)
@@ -36,5 +69,6 @@ def main():
print()
if __name__ == "__main__":
main()
+46 -15
View File
@@ -2,7 +2,7 @@
import os
import zipfile
import rarfile # Necesita: pip install rarfile
import rarfile
IMAGE_EXTENSIONS = {".jpg", ".jpeg", ".png", ".webp"}
TRASH_FILES = {"thumbs.db", ".ds_store"}
@@ -14,6 +14,7 @@ class ValidationResult:
self.errors = []
self.warnings = []
self.images = []
self.real_format = None # "rar", "zip", None
def add_error(self, msg):
self.is_valid = False
@@ -27,31 +28,61 @@ class ValidationResult:
return f"[{status}] {self.path}"
def try_open_rar(path):
try:
archive = rarfile.RarFile(path, "r")
archive.namelist() # fuerza lectura
return archive
except:
return None
def try_open_zip(path):
try:
archive = zipfile.ZipFile(path, "r")
archive.namelist()
return archive
except:
return None
def validate_comic(path):
"""
Valida un archivo CBR/CBZ y devuelve un ValidationResult.
"""
result = ValidationResult(path)
ext = os.path.splitext(path)[1].lower()
try:
if ext == ".cbz":
archive = zipfile.ZipFile(path, "r")
file_list = archive.namelist()
archive = None
elif ext == ".cbr":
archive = rarfile.RarFile(path, "r")
file_list = archive.namelist()
# 1) Intentar abrir como RAR
if ext == ".cbr":
archive = try_open_rar(path)
if archive:
result.real_format = "rar"
else:
# 2) Intentar abrir como ZIP (CBZ renombrado)
archive = try_open_zip(path)
if archive:
result.real_format = "zip"
result.add_warning("El archivo tiene extensión .cbr pero es un ZIP (CBZ renombrado)")
else:
result.add_error("No se pudo abrir como RAR ni como ZIP")
return result
# 3) Si es CBZ, abrir como ZIP
elif ext == ".cbz":
archive = try_open_zip(path)
if archive:
result.real_format = "zip"
else:
result.add_error("No se pudo abrir el archivo ZIP")
return result
else:
result.add_error("Extensión no reconocida")
return result
except Exception as e:
result.add_error(f"No se pudo abrir el archivo: {e}")
return result
# 4) Validar contenido
file_list = archive.namelist()
# Comprobar imágenes
for f in file_list:
name = f.lower()
_, fext = os.path.splitext(name)