diff --git a/zxdb.py b/zxdb.py index 1654d76..7db8a05 100644 --- a/zxdb.py +++ b/zxdb.py @@ -112,7 +112,6 @@ def select(cursor, query_index=0): # Registro de consulta ejecutada logging.info(f"Consulta {query_index} ejecutada correctamente con {len(ELEMENTS)} resultados.") - def connect(query_index=0): """ Establece la conexión a la base de datos y ejecuta la consulta. @@ -148,7 +147,6 @@ def connect(query_index=0): except Exception as e: logging.error(f"Error inesperado: {e}") - def update_url(element, url_prefix): """ Añade un prefijo a la URL en el diccionario `element` según el prefijo proporcionado en `url_prefix`. @@ -175,7 +173,6 @@ def update_url(element, url_prefix): elif url.startswith("/nvg"): element["url"] = url_prefix["nvg"] + url[4:] - def process_elements(): """ Procesa todos los elementos, modificando cada uno de sus parámetros. @@ -190,7 +187,7 @@ def process_elements(): - Calcula el nombre del fichero si es un zip. Modifica: - - ELEMENTS (list): Actualiza cada diccionario en ELEMENTS con las claves 'root_folder', 'url', 'file_name', 'subfolder', 'is_zip', y 'non_zip_file_name'. + - ELEMENTS (list): Actualiza cada diccionario en ELEMENTS con las claves 'game_folder_name', 'url', 'file_name', 'subfolder', 'is_zip', y 'non_zip_file_name'. Ejemplo: >>> process_elements() @@ -198,11 +195,8 @@ def process_elements(): global ELEMENTS for i in range(len(ELEMENTS)): # Construye el nombre de la carpeta raiz - if SHOULD_SORT_BY_DEVELOPER: - ELEMENTS[i]["root_folder"] = f"{ELEMENTS[i]['title']} ({ELEMENTS[i]['release_year']})" - else: - ELEMENTS[i]["root_folder"] = f"{ELEMENTS[i]['title']} ({ELEMENTS[i]['release_year']})({ELEMENTS[i]['developer']})" - ELEMENTS[i]["root_folder"] = normalize_path(ELEMENTS[i]["root_folder"]) + ELEMENTS[i]["game_folder_name"] = f"{ELEMENTS[i]['title']} ({ELEMENTS[i]['release_year']})({ELEMENTS[i]['developer']})" + ELEMENTS[i]["game_folder_name"] = normalize_path(ELEMENTS[i]["game_folder_name"]) # Añade el prefijo a la url y normaliza los enlaces de "wos" update_url(ELEMENTS[i], URL_PREFIX) @@ -219,7 +213,6 @@ def process_elements(): # Calcula el nombre del fichero si es un zip ELEMENTS[i]["non_zip_file_name"] = ELEMENTS[i]["file_name"][:-4] if ELEMENTS[i]["is_zip"] else ELEMENTS[i]["file_name"] - def url_filename(url): """ Devuelve el fichero que forma la parte final de una URL. @@ -240,7 +233,6 @@ def url_filename(url): filename = os.path.basename(path) return filename - def download_file(url, destination): """ Descarga un fichero a partir de una URL. @@ -279,7 +271,6 @@ def download_file(url, destination): logging.error(f"Error al descargar el archivo: {e}") return False - def unzip_file(src, dst): """ Descomprime los ficheros que coinciden con la lista de extensiones. @@ -321,7 +312,6 @@ def unzip_file(src, dst): except Exception as e: logging.error(f"Ocurrió un error: {e}") - def print_status(current_file, total_files, element, total_files_width, status="cached"): """ Imprime el estado de un archivo en el proceso de descarga. @@ -352,15 +342,14 @@ def print_status(current_file, total_files, element, total_files_width, status=" ) ) - -def get_final_destination_folder(developer, year, root_folder): +def get_final_destination_folder(title, year, developer): """ Compone la carpeta de destino en función de varios parámetros. Parámetros: developer (str): Nombre del desarrollador del juego. year (int o str): Año de lanzamiento del juego. - root_folder (str): Nombre de la carpeta raíz. + game_folder_name (str): Nombre de la carpeta raíz. Retorna: str: La ruta completa de la carpeta de destino final. @@ -376,7 +365,7 @@ def get_final_destination_folder(developer, year, root_folder): >>> get_final_destination_folder("Nintendo", 1985, "Super Mario") 'by_developer/N/Nintendo/1985/Super Mario' """ - # Carpeta basada en los años de vida comercial del spectrum + # Carpeta basada en los años de vida comercial del spectrum o el tipo de agrupación folder1 = "" if SHOULD_SPLIT_MODERN_AND_CLASSIC: if year == "none" or year is None or year > LAST_CLASSIC_YEAR: @@ -402,18 +391,16 @@ def get_final_destination_folder(developer, year, root_folder): # Carpeta basada en la primera letra del nombre de la carpeta raíz folder4 = "" if SHOULD_SORT_BY_LETTER: - if root_folder[0].isdigit(): + if game_folder_name[0].isdigit(): folder4 = "0-9" else: - folder4 = root_folder[0].upper() + folder4 = game_folder_name[0].upper() - # Asegurarse de que root_folder es una cadena - root_folder = root_folder or "" + # Compone el nombre de la carpeta de destino del juego + game_folder_name = f"{title} ({year})" if SHOULD_SORT_BY_DEVELOPER else f"{title} ({year})({developer})" # Combina los prefijos y la carpeta raíz para obtener la carpeta de destino final - return os.path.join(folder1, folder2, folder3, folder4, root_folder) - - + return os.path.join(folder1, folder2, folder3, folder4, game_folder_name) def process_cache_file(cache_file, destination_subfolder, destination_file, element): """ @@ -439,7 +426,6 @@ def process_cache_file(cache_file, destination_subfolder, destination_file, elem else: shutil.copyfile(cache_file, destination_file) - def get_files(): """ Obtiene los ficheros de la consulta desde internet o desde la caché y los deposita en la carpeta destino, @@ -466,11 +452,11 @@ def get_files(): last_game_folder = "" for element in ELEMENTS: - classification_folder = get_final_destination_folder(element["developer"], element["release_year"], element["root_folder"]) + classification_folder = get_final_destination_folder(element["title"], element["release_year"], element["developer"]) destination_folder = os.path.join(DESTINATION_PATH, classification_folder) destination_subfolder = os.path.join(destination_folder, element["subfolder"]) - cache_folder = os.path.join(CACHE_PATH, element["root_folder"]) + cache_folder = os.path.join(CACHE_PATH, element["game_folder_name"]) cache_subfolder = os.path.join(cache_folder, element["subfolder"]) # Ruta completa hasta el fichero de destino y de caché @@ -480,9 +466,9 @@ def get_files(): # Actualiza las variables de presentación current_file += 1 - if element["root_folder"] != last_game_folder: - print("\n{}".format(element["root_folder"])) - last_game_folder = element["root_folder"] + if element["game_folder_name"] != last_game_folder: + print("\n{}".format(element["game_folder_name"])) + last_game_folder = element["game_folder_name"] try: # Si el fichero no existe en la carpeta de destino @@ -517,7 +503,6 @@ def get_files(): except Exception as e: logging.error(f"Error al procesar el fichero {element['file_name']}: {e}") - def normalize_path(path): """ Elimina los caracteres ilegales de la cadena de texto. @@ -543,7 +528,6 @@ def normalize_path(path): path = unidecode(path.replace(char, replace_with)) return path - def remove_empty_directories(path): """ Elimina los subdirectorios vacíos. @@ -570,7 +554,6 @@ def remove_empty_directories(path): # El directorio no está vacío o ocurrió otro error pass - def clear_destination_folder(): """ Limpia la carpeta de destino. @@ -598,7 +581,6 @@ def clear_destination_folder(): except Exception as e: logging.error(f'No se pudo eliminar {file_path}. Razón: {e}') - def print_elements(mode=0): """ Imprime la lista de elementos en diferentes modos. @@ -610,7 +592,7 @@ def print_elements(mode=0): Comportamiento: - Modo 0: Recorre todos los elementos en ELEMENTS e imprime cada clave y valor en un formato legible. - - Modo 1: Elimina duplicados basándose en la carpeta raíz ('root_folder') y los imprime. Luego, muestra el número total de entradas únicas. + - Modo 1: Elimina duplicados basándose en la carpeta raíz ('game_folder_name') y los imprime. Luego, muestra el número total de entradas únicas. Ejemplo: >>> print_elements(0) @@ -626,14 +608,13 @@ def print_elements(mode=0): # Segundo bucle for con eliminación de duplicados seen = set() for element in ELEMENTS: - root_folder = element['root_folder'] - if root_folder not in seen: - print(root_folder) - seen.add(root_folder) + game_folder_name = element['game_folder_name'] + if game_folder_name not in seen: + print(game_folder_name) + seen.add(game_folder_name) # Imprimir el número de elementos únicos print(f"Número de entradas: {len(seen)}") - def main(): """ Bucle principal que ejecuta las principales funciones del programa.