Files
zxdb/zxdb/filesystem.py
T
JailDesigner 10b4e8cf20 Añadido resumen final de descargas al terminar o interrumpir
Muestra contadores de ficheros por estado (caché, descargados,
no encontrados, omitidos) tanto al finalizar normalmente como
al interrumpir con Ctrl+C.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 13:51:05 +01:00

98 lines
3.4 KiB
Python

import logging
import os
import shutil
import config
def print_status(current_file, total_files, element, total_files_width, status="cached"):
"""
Imprime el estado de un archivo en el proceso de descarga.
Parámetros:
current_file (int): El número del archivo actual en el proceso de descarga.
total_files (int): El número total de archivos en el proceso de descarga.
element (dict): Diccionario con información del archivo actual ('file_name' y 'filetype').
total_files_width (int): Ancho del campo para el número total de archivos.
status (str): El estado del archivo (predeterminado es "cached").
"""
print(
"({:{width}} / {}) : {:<10} : {} ({})".format(
current_file,
total_files,
status,
element["file_name"],
element["filetype"],
width=total_files_width,
)
)
def print_elements(elements, mode=0):
"""
Imprime la lista de elementos en diferentes modos.
Parámetros:
elements (list): Lista de diccionarios con los datos de los elementos.
mode (int): El modo de impresión.
- Si es 0, imprime todos los elementos con sus claves y valores.
- Si es 1, imprime los nombres de carpeta únicos y el número total.
"""
if mode == 0:
for element in elements:
print('')
for key, value in element.items():
print(key, ':', value)
elif mode == 1:
seen = set()
for element in elements:
game_folder_name = element['game_folder_name']
if game_folder_name not in seen:
print(game_folder_name)
seen.add(game_folder_name)
print(f"Número de entradas: {len(seen)}")
def clear_destination_folder():
"""
Limpia la carpeta de destino si la opción está habilitada en la configuración.
"""
if config.SHOULD_CLEAR_DESTINATION_PATH:
logging.info("Limpiando la carpeta de destino ...")
for filename in os.listdir(config.DESTINATION_PATH):
file_path = os.path.join(config.DESTINATION_PATH, filename)
try:
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
logging.info(f"Archivo eliminado: {file_path}")
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
logging.info(f"Directorio eliminado: {file_path}")
except Exception as e:
logging.error(f'No se pudo eliminar {file_path}. Razón: {e}')
def print_summary(stats: dict) -> None:
print("\n--- Resumen ---")
print(f" Caché: {stats.get('cached', 0)}")
print(f" Descargados: {stats.get('downloaded', 0)}")
print(f" No encontrados: {stats.get('not_found', 0)}")
print(f" Omitidos: {stats.get('skipped', 0)}")
def remove_empty_directories(path):
"""
Elimina los subdirectorios vacíos de forma recursiva.
Parámetros:
path (str): La ruta del directorio raíz desde donde se inicia la eliminación.
"""
for root, dirs, files in os.walk(path, topdown=False):
for dir in dirs:
dir_path = os.path.join(root, dir)
try:
os.rmdir(dir_path)
logging.info(f"Directorio vacío eliminado: {dir_path}")
except OSError:
pass