Files
comic-manager/main.py
T

145 lines
4.7 KiB
Python

# main.py
import argparse
from core.scanner import find_comic_files
from core.pipeline import Pipeline
_COL_W = 30
_SEP = "" * 44
def _print_preview(step: str, preview: dict, formato: str) -> None:
fmt = formato.upper()
if step == "clean":
print("Ficheros basura a eliminar:")
for item in preview["items"]:
print(f" - {item}")
print(f"Formato final del archivo: {fmt}")
elif step == "normalize_pages":
renames = preview["renames"]
n = len(renames)
print(f"Renombrado de páginas ({n} páginas):")
print(f" {'Nombre actual':<{_COL_W}} → Nombre final")
print(f" {_SEP}")
display = renames[:10] if n > 20 else renames
for orig, final in display:
print(f" {orig:<{_COL_W}} {final}")
if n > 20:
print(f" ... y {n - 10} más")
print(f"Formato final del archivo: {fmt}")
elif step == "normalize_images":
conversions = preview["conversions"]
target_ext = preview["target_ext"].lstrip(".")
lossless = " (sin pérdida)" if target_ext.lower() == "png" else ""
print(f"Conversión de imágenes a {target_ext.upper()}{lossless}:")
print(f" {'Imagen actual':<{_COL_W}} → Imagen final")
print(f" {_SEP}")
for orig, final in conversions:
print(f" {orig:<{_COL_W}} {final}")
print(f"Formato final del archivo: {fmt}")
elif step == "convert":
print(f"Conversión de formato de archivo a {preview['target_format']}.")
def make_confirm_fn(args):
def confirm_fn(step: str, preview: dict) -> bool:
print()
_print_preview(step, preview, args.formato)
answer = input("¿Aplicar? [s/N] ").strip().lower()
return answer in ("s", "si", "", "y", "yes")
return confirm_fn
def parse_args():
parser = argparse.ArgumentParser(description="Gestor de cómics CBR/CBZ")
parser.add_argument("--ruta", required=True)
parser.add_argument("--listar", action="store_true")
parser.add_argument("--validar", action="store_true")
parser.add_argument("--limpiar", action="store_true")
parser.add_argument("--convertir", action="store_true")
parser.add_argument("--estandarizar", action="store_true")
parser.add_argument("--formato", choices=["cbz", "cbr"], default="cbz")
parser.add_argument("--renumerar", action="store_true")
parser.add_argument("--uniformizar-imagenes", action="store_true")
parser.add_argument("--formato-imagen", choices=["jpg", "png", "webp"], default="png")
# Fix flags (interactivos)
parser.add_argument("--fix_remove_trash", action="store_true")
parser.add_argument("--fix_page_numbering", action="store_true")
parser.add_argument("--fix_image_extensions", action="store_true")
parser.add_argument("--fix_all", action="store_true")
parser.add_argument("--no-preguntar", action="store_true")
return parser.parse_args()
def main():
args = parse_args()
comic_files = find_comic_files(args.ruta)
if args.listar:
for f in comic_files:
print(f)
if args.validar:
pipeline = Pipeline(steps=[])
for f in comic_files:
result = pipeline.run(f)
if result.has_issues():
print(result.full_report())
print()
return
# --- Fix flags (interactivos) ---
fix_steps = []
if args.fix_remove_trash or args.fix_all:
fix_steps.append("clean")
if args.fix_page_numbering or args.fix_all:
fix_steps.append("normalize_pages")
if args.fix_image_extensions or args.fix_all:
fix_steps.append("normalize_images")
if fix_steps:
confirm_fn = None if args.no_preguntar else make_confirm_fn(args)
pipeline = Pipeline(
steps=fix_steps,
desired_format=args.formato,
desired_image_format="." + args.formato_imagen,
)
for f in comic_files:
print(f"\n=== {f} ===")
result = pipeline.run(f, confirm_fn=confirm_fn)
print(result.summary())
return
# --- Flags clásicos (sin confirmación) ---
steps = []
if args.limpiar or args.estandarizar:
steps.append("clean")
if args.renumerar:
steps.append("normalize_pages")
if args.uniformizar_imagenes:
steps.append("normalize_images")
if args.convertir or args.estandarizar:
steps.append("convert")
if steps:
pipeline = Pipeline(
steps=steps,
desired_format=args.formato,
desired_image_format="." + args.formato_imagen,
)
for f in comic_files:
result = pipeline.run(f)
print(result.summary())
if __name__ == "__main__":
main()