eliminades duplicitats en els arguments

This commit is contained in:
2026-02-19 10:11:08 +01:00
parent 0f8f904b97
commit 18e22e167d
2 changed files with 88 additions and 33 deletions
+82 -1
View File
@@ -1,3 +1,84 @@
# comic_manager # comic_manager
Utilitat per a escanejar i reparar coleccions de comics CLI para escanear y reparar colecciones de cómics en formato CBR/CBZ.
## Instalación
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Dependencia de sistema para leer archivos RAR:
sudo apt install unrar
```
## Uso
```bash
python main.py --ruta <directorio> [opciones]
```
`--ruta` es obligatorio. Se puede combinar con uno o más flags de operación.
---
## Opciones de inspección
| Flag | Descripción |
|------|-------------|
| `--listar` | Lista todos los ficheros CBR/CBZ encontrados bajo `--ruta`. |
| `--validar` | Valida cada cómic: detecta extensión incorrecta, ficheros basura, páginas mal numeradas, imágenes de formatos mezclados y ausencia de `ComicInfo.xml`. Solo muestra los cómics con problemas. |
---
## Operaciones
Modifican los ficheros directamente. Se pueden combinar entre sí.
Las operaciones que tocan el contenido del archivo piden confirmación por defecto, mostrando una preview de los cambios antes de aplicarlos. Usa `--no-preguntar` para desactivar este comportamiento.
| Flag | Descripción | Pide confirmación |
|------|-------------|-------------------|
| `--limpiar` | Elimina ficheros basura (`thumbs.db`, `.ds_store`, `__MACOSX`, `desktop.ini`) y reempaqueta como CBZ. | Sí |
| `--convertir` | Convierte al formato indicado por `--formato` (por defecto CBZ). | No |
| `--estandarizar` | Equivale a `--limpiar` + `--convertir` en secuencia. | Solo para limpieza |
| `--renumerar` | Renombra las páginas a numeración secuencial con zero-padding (`001.jpg`, `002.jpg`…). | Sí |
| `--uniformizar-imagenes` | Convierte todas las imágenes al formato indicado por `--formato-imagen`. | Sí |
### Opciones de formato
| Flag | Valores | Por defecto | Descripción |
|------|---------|-------------|-------------|
| `--formato` | `cbz`, `cbr` | `cbz` | Formato de archivo destino para `--convertir` y `--estandarizar`. |
| `--formato-imagen` | `jpg`, `png`, `webp` | `png` | Formato de imagen destino para `--uniformizar-imagenes`. |
| `--no-preguntar` | — | — | Desactiva la confirmación interactiva: aplica todas las operaciones automáticamente. |
---
## Ejemplos
```bash
# Ver qué cómics hay en la colección
python main.py --ruta ~/Comics --listar
# Revisar problemas sin modificar nada
python main.py --ruta ~/Comics --validar
# Limpiar basura (pide confirmación por cada cómic)
python main.py --ruta ~/Comics --limpiar
# Limpiar basura sin preguntar (modo automático)
python main.py --ruta ~/Comics --limpiar --no-preguntar
# Limpiar y convertir todo a CBZ (pide confirmación para la limpieza)
python main.py --ruta ~/Comics --estandarizar
# Convertir todo a CBZ sin confirmación
python main.py --ruta ~/Comics --convertir
# Renumerar páginas de todos los cómics (pide confirmación)
python main.py --ruta ~/Comics --renumerar
# Convertir imágenes a WebP (pide confirmación)
python main.py --ruta ~/Comics --uniformizar-imagenes --formato-imagen webp
```
+6 -32
View File
@@ -41,12 +41,11 @@ def _print_preview(step: str, preview: dict, formato: str) -> None:
print(f" {orig:<{_COL_W}} {final}") print(f" {orig:<{_COL_W}} {final}")
print(f"Formato final del archivo: {fmt}") 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 make_confirm_fn(args):
def confirm_fn(step: str, preview: dict) -> bool: def confirm_fn(step: str, preview: dict) -> bool:
if step == "convert":
return True # No destructivo, no necesita confirmación
print() print()
_print_preview(step, preview, args.formato) _print_preview(step, preview, args.formato)
answer = input("¿Aplicar? [s/N] ").strip().lower() answer = input("¿Aplicar? [s/N] ").strip().lower()
@@ -68,11 +67,6 @@ def parse_args():
parser.add_argument("--uniformizar-imagenes", action="store_true") parser.add_argument("--uniformizar-imagenes", action="store_true")
parser.add_argument("--formato-imagen", choices=["jpg", "png", "webp"], default="png") 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") parser.add_argument("--no-preguntar", action="store_true")
return parser.parse_args() return parser.parse_args()
@@ -96,29 +90,7 @@ def main():
print() print()
return return
# --- Fix flags (interactivos) --- # --- Construir steps ---
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 = [] steps = []
if args.limpiar or args.estandarizar: if args.limpiar or args.estandarizar:
steps.append("clean") steps.append("clean")
@@ -130,13 +102,15 @@ def main():
steps.append("convert") steps.append("convert")
if steps: if steps:
confirm_fn = None if args.no_preguntar else make_confirm_fn(args)
pipeline = Pipeline( pipeline = Pipeline(
steps=steps, steps=steps,
desired_format=args.formato, desired_format=args.formato,
desired_image_format="." + args.formato_imagen, desired_image_format="." + args.formato_imagen,
) )
for f in comic_files: for f in comic_files:
result = pipeline.run(f) print(f"\n=== {f} ===")
result = pipeline.run(f, confirm_fn=confirm_fn)
print(result.summary()) print(result.summary())