88"""
99
1010import eel
11+ import eel .browsers
1112import os
1213import sys
1314import platform
3637cipher = Fernet (SECRET_KEY )
3738
3839BASE_PATH = file_handler .BASE_PATH
39- # Definir ruta al navegador portable (dentro del proyecto)
40- if platform .system () == "Windows" :
41- BROWSER_PATH = os .path .join (BASE_PATH , "chromium" , "chrome.exe" )
42- else :
43- # Asumimos Linux/Mac
44- BROWSER_PATH = os .path .join (BASE_PATH , "chromium" , "chrome" )
40+ def get_chromium_path ():
41+ """Detecta la ruta de Chromium considerando PyInstaller (_internal) y el Sistema Operativo"""
42+ # Detectar si estamos en el .exe o en VS Code
43+ if hasattr (sys , '_MEIPASS' ):
44+ base_dir = sys ._MEIPASS
45+ else :
46+ base_dir = os .path .abspath (os .path .dirname (__file__ ))
47+
48+ # Detectar el Sistema Operativo para el nombre del ejecutable
49+ if platform .system () == "Windows" :
50+ exe_name = "chrome.exe"
51+ else :
52+ # En Linux/Mac los binarios no llevan .exe
53+ exe_name = "chrome" # O "chromium"
54+
55+ return os .path .join (base_dir , 'chromium' , exe_name )
4556
46- # Configurar Eel para usar este navegador Específico
47- if os .path .exists (BROWSER_PATH ):
48- print (f"[INFO] Usando Chromium Portable: { BROWSER_PATH } " )
49- eel .browsers .set_path ('chrome' , BROWSER_PATH )
50- else :
51- print ("[WARN] Chromium portable no encontrado. Intentando navegador del sistema..." )
57+ CHROMIUM_PATH = get_chromium_path ()
5258
53- # Inicialización de Eel
54- # Aseguramos que la carpeta web exista
55- if not os .path .exists ('web' ):
56- print ("[ERROR CRÍTICO] La carpeta 'web' no existe. Asegúrate de haber creado el index.html allí." )
59+ # Configurar Eel para usar este navegador específico si existe
60+ if os .path .exists (CHROMIUM_PATH ):
61+ print (f"[INFO] Usando Chromium Portable en: { CHROMIUM_PATH } " )
62+ eel .browsers .set_path ('chrome' , CHROMIUM_PATH )
63+ else :
64+ print (f"[WARN] Chromium portable no encontrado en: { CHROMIUM_PATH } " )
65+ print ("El sistema usará el navegador por defecto (Edge/Chrome/Safari) como respaldo." )
66+
67+ def get_web_path ():
68+ """Detecta inteligentemente dónde está la carpeta web (VS Code vs .exe)"""
69+ if hasattr (sys , '_MEIPASS' ):
70+ # Si estamos dentro del .exe, PyInstaller guarda los datos en _MEIPASS (carpeta _internal)
71+ return os .path .join (sys ._MEIPASS , 'web' )
72+ else :
73+ # Si estamos ejecutando el script normal en VS Code
74+ return os .path .join (os .path .abspath (os .path .dirname (__file__ )), 'web' )
75+
76+ WEB_PATH = get_web_path ()
77+
78+ if not os .path .exists (WEB_PATH ):
79+ print (f"[ERROR CRÍTICO] La carpeta 'web' no existe en la ruta esperada: { WEB_PATH } " )
80+ input ("Presiona Enter para salir..." )
5781 sys .exit ()
5882
59- # Inicializamos apuntando a la carpeta donde está index.html
60- eel .init ('web' )
83+ # Inicializamos Eel apuntando a la ruta absoluta blindada
84+ eel .init (WEB_PATH )
6185
6286# ---------------------------------------------------------
6387# FUNCIONES EXPUESTAS A JAVASCRIPT (API DE EEL)
@@ -109,8 +133,8 @@ def api_load_project(filename):
109133 except Exception as e :
110134 return {'error' : f"Error de lectura: { str (e )} " }
111135
112- @eel .expose
113- def api_save_model_file (data , filename ):
136+ # @eel.expose
137+ #* def api_save_model_file(data, filename):
114138 """
115139 Guarda la arquitectura del modelo ML (nodos/conexiones)
116140 como archivo .edubotml en la carpeta 'models'.
@@ -271,8 +295,8 @@ def api_add_node_manually(node_data):
271295 return True
272296
273297# GESTIÓN DE ARCHIVOS GENÉRICOS
274- @eel .expose
275- def api_file_save (content , name , file_type = "auto" ):
298+ # @eel.expose
299+ #* def api_file_save(content, name, file_type="auto"):
276300 """
277301 Guarda archivos generados (ej. exportaciones a C, datasets).
278302 NOTA: El orden de argumentos se ajustó para coincidir con JS (content, name).
@@ -284,8 +308,8 @@ def api_file_save(content, name, file_type="auto"):
284308 except Exception as e :
285309 return {"success" : False , "error" : str (e )}
286310
287- @eel .expose
288- def api_file_list ():
311+ # @eel.expose
312+ #* def api_file_list():
289313 try :
290314 file_handler .ensure_dir_exist ()
291315
@@ -302,8 +326,8 @@ def api_file_list():
302326 except Exception as e :
303327 return {"error" : str (e )}
304328
305- @eel .expose
306- def api_load_dataset_data (name ):
329+ # @eel.expose
330+ #* def api_load_dataset_data(name):
307331 """
308332 Conecta la UI con la capacidad de lectura híbrida (CSV/JSON).
309333 Permite a la interfaz previsualizar datos sin importar el formato origen.
@@ -318,8 +342,8 @@ def api_load_dataset_data(name):
318342 return {"success" : False , "error" : str (e )}
319343
320344# ESTIMACIÓN DE MEMORIA
321- @eel .expose
322- def api_estimate_memory_desktop (model_name ):
345+ # @eel.expose
346+ #* def api_estimate_memory_desktop(model_name):
323347 try :
324348 entry = ml_manager ._MODEL_REGISTRY .get (model_name )
325349 if not entry :
@@ -337,8 +361,8 @@ def api_estimate_memory_desktop(model_name):
337361 return {"error" : str (e )}
338362
339363# EXPORTACIÓN A C
340- @eel .expose
341- def api_export_c_model (model_name ):
364+ # @eel.expose
365+ #* def api_export_c_model(model_name):
342366 """
343367 Genera el código C/C++ para Arduino del modelo entrenado y lo guarda en disco.
344368 Incluye automáticamente cabeceras y guardas para Arduino Uno.
0 commit comments