Fix: al no posar el nom del desarrollador en la carpeta quan s'ordenava per desarrollador, no trobava la cache

This commit is contained in:
2024-11-20 17:12:56 +01:00
parent 94bfefc8ac
commit 5530326300
+21 -40
View File
@@ -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.