diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000..91c6b99 Binary files /dev/null and b/__pycache__/config.cpython-312.pyc differ diff --git a/config.py b/config.py new file mode 100644 index 0000000..42d87a6 --- /dev/null +++ b/config.py @@ -0,0 +1,26 @@ +# Configuración de base de datos +DB_USER = 'root' +DB_PASSWORD = 'unJEPimbJddHP8' +DB_HOST = '172.18.0.2' +DB_PORT = 3306 +DB_NAME = 'zxdb' + +# Rutas de destino y caché +DESTINATION_PATH = '/home/sergio/zx/zxdb/games/' +CACHE_PATH = '/home/sergio/zx/zxdb/cache/games/' +TEMP_FILE = '/tmp/zxdb.download.tmp' + +# Configuración de separaciones y ordenación +SHOULD_CLEAR_DESTINATION_PATH = True # Establece si se limpia primero la carpeta de destino +SHOULD_SPLIT_MODERN_AND_CLASSIC = False # Separa los juegos en dos carpetas a partir de un año especificado +SHOULD_SORT_BY_YEAR = False # Separa los juegos por carpetas en función de su año de lanzamiento +SHOULD_SORT_BY_LETTER = False # Separa los juegos por carpetas en función de su primera letra +SHOULD_SORT_BY_DEVELOPER = True # Separa los juegos por desarrollador + +# Configuración de espera +WAIT = True # Establece una pausa aleatoria entre descargas +MIN_WAIT = 2 # Cantidad de segundos mínima a esperar entre descargas +MAX_WAIT = 4 # Cantidad de segundos máxima a esperar entre descargas + +# Año usado para la separación entre juegos clásicos y modernos +LAST_CLASSIC_YEAR = 1993 diff --git a/queries.sql b/queries.sql index c225411..e62af7f 100644 --- a/queries.sql +++ b/queries.sql @@ -81,7 +81,10 @@ WHERE AND f.text <> '?' ) AND r.release_seq = 0 - AND l.name like 'ZOSYA%' + AND ( + LOWER(l.name) like 'zosya%' + OR LOWER(l.name) like 'dinamic%' + ) AND ( g.text like '%Game:%' AND g.text not like 'Casual%' diff --git a/requirements.txt b/requirements.txt index 8b93013..f47c290 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ mysql-connector-python requests -python-dotenv logging unidecode \ No newline at end of file diff --git a/zxdb.py b/zxdb.py index fc87097..147b920 100644 --- a/zxdb.py +++ b/zxdb.py @@ -1,6 +1,7 @@ ## Script para descargar ficheros de spectrum a partir de zxdb ## Imports utilizados en el script +import config import logging import mysql.connector import os @@ -10,7 +11,6 @@ import shutil import sqlite3 import time import zipfile -from dotenv import load_dotenv from mysql.connector import errorcode from unidecode import unidecode from urllib.parse import urlparse @@ -18,18 +18,16 @@ from urllib.request import urlretrieve from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry -# Cargar las variables de entorno desde el archivo .env -load_dotenv() - # Configuración del logger logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') -config = { - "user": os.getenv("DB_USER"), - "password": os.getenv("DB_PASSWORD"), - "host": os.getenv("DB_HOST"), - "port": os.getenv("DB_PORT"), - "database": os.getenv("DB_NAME"), +# Configuración de base de datos +config_db = { + "user": config.DB_USER, + "password": config.DB_PASSWORD, + "host": config.DB_HOST, + "port": config.DB_PORT, + "database": config.DB_NAME, "raise_on_warnings": True, } @@ -41,20 +39,22 @@ url_prefix = { } # Rutas locales donde depositar los resultados -destination_path = os.getenv('DESTINATION_PATH') -cache_path = os.getenv('CACHE_PATH') -temp_file = os.getenv('TEMP_FILE') +destination_path = config.DESTINATION_PATH +cache_path = config.CACHE_PATH +temp_file = config.TEMP_FILE +# Parámetros de configuración +should_clear_destination_path = config.SHOULD_CLEAR_DESTINATION_PATH # Establece si se limpia primero la carpeta de destino +should_split_modern_and_classic = config.SHOULD_SPLIT_MODERN_AND_CLASSIC # Separa los juegos en dos carpetas a partir de un año especificado +should_sort_by_year = config.SHOULD_SORT_BY_YEAR # Separa los juegos por carpetas en función de su año de lanzamiento +should_sort_by_letter = config.SHOULD_SORT_BY_LETTER # Separa los juegos por carpetas en función de su primera letra +should_sort_by_developer = config.SHOULD_SORT_BY_DEVELOPER # Separa los juegos por desarrollador +wait = config.WAIT # Establece una pausa aleatoria entre descargas -# Parametros de configuración -should_clear_destination_path = os.getenv('SHOULD_CLEAR_DESTINATION_PATH') == 'True' # Establece si se limpia primero la carpeta de destino -should_split_modern_and_classic = os.getenv('SHOULD_SPLIT_MODERN_AND_CLASSIC') == 'True'# Separa los juegos en dos carpetas a partir de un año especificado -should_sort_by_year = os.getenv('SHOULD_SORT_BY_YEAR') == 'True' # Separa los juegos por carpetas en función de su año de lanzamiento -should_sort_by_letter = os.getenv('SHOULD_SORT_BY_LETTER') == 'True' # Separa los juegos por carpetas en función de su primera letra -wait = os.getenv('WAIT') == 'True' # Establece una pausa aleatoria entre descargas -min_wait = int(os.getenv('MIN_WAIT')) # Cantidad de segundos mínima a esperar entre descargas -max_wait = int(os.getenv('MAX_WAIT')) # Cantidad de segundos máxima a esperar entre descargas -last_classic_year = int(os.getenv('LAST_CLASSIC_YEAR'))# Año usado para la separación entre juegos clásicos y modernos +# Leer variables numéricas +min_wait = config.MIN_WAIT # Cantidad de segundos mínima a esperar entre descargas +max_wait = config.MAX_WAIT # Cantidad de segundos máxima a esperar entre descargas +last_classic_year = config.LAST_CLASSIC_YEAR # Año usado para la separación entre juegos clásicos y modernos # Tipos de fichero que se guardan en la carpeta raíz del juego filetypes_on_root = [ @@ -98,7 +98,7 @@ def select(cursor, query_index=0): # Establece la conexión a la BBDD y ejecuta la consulta def connect(query_index=0): try: - with mysql.connector.connect(**config) as connection: + with mysql.connector.connect(**config_db) as connection: with connection.cursor() as cursor: # Ejecutar la consulta 1 select(cursor, query_index=query_index) @@ -201,7 +201,7 @@ def print_status(current_file, total_files, element, total_files_width, status=" ) # Compone la carpeta de destino en función de varios parámetros -def get_final_destination_folder(year, root_folder): +def get_final_destination_folder(developer, year, root_folder): # Carpeta basada en los años de vida comercial del spectrum folder1 = "" if should_split_modern_and_classic: @@ -210,24 +210,30 @@ def get_final_destination_folder(year, root_folder): else: folder1 = "classics" - # Carpeta basada en el año de lanzamiento + # Carpeta basada en el desarrollador folder2 = "" + if should_sort_by_developer: + developer = unidecode(developer or "") + folder2 = os.path.join(developer[0].upper(), developer) + + # Carpeta basada en el año de lanzamiento + folder3 = "" if should_sort_by_year: - folder2 = str(year) if year not in [None, "none"] else "unknown" + folder3 = str(year) if year not in [None, "none"] else "unknown" # Carpeta basada en la primera letra del nombre de la carpeta raíz - folder3 = "" + folder4 = "" if should_sort_by_letter: if root_folder[0].isdigit(): - folder3 = "0-9" + folder4 = "0-9" else: - folder3 = root_folder[0].upper() + folder4 = root_folder[0].upper() # Asegurarse de que root_folder es una cadena root_folder = root_folder or "" # Combina los prefijos y la carpeta raíz para obtener la carpeta de destino final - return os.path.join(folder1, folder2, folder3, root_folder) + return os.path.join(folder1, folder2, folder3, folder4, root_folder) # Crea las carpetas de destino y copia o extrae el archivo de la caché @@ -248,7 +254,7 @@ def get_files(): last_game_folder = "" for element in elements: - classification_folder = get_final_destination_folder(element["release_year"], element["root_folder"]) + classification_folder = get_final_destination_folder(element["developer"], element["release_year"], element["root_folder"]) destination_folder = os.path.join(destination_path, classification_folder) destination_subfolder = os.path.join(destination_folder, element["subfolder"]) @@ -358,7 +364,7 @@ def print_elements(mode=0): def main(): connect(query_index=3) process_elements() - #print_elements(mode=1) + print_elements(mode=1) clear_destination_folder() get_files() remove_empty_directories(destination_path)