import os import asyncio from concurrent.futures import ThreadPoolExecutor import gradio as gr # Configuración CRÍTICA para evitar timeouts GRADIO_TIMEOUT = 6000 # 10 minutos (en segundos) MAX_VIDEO_DURATION = 1000 # 2 minutos (evita procesos eternos) async def crear_video_profesional(prompt, custom_script, voz_index, musica=None): try: # 1. Simulamos un proceso largo (¡esto es lo que causa el timeout!) # Reemplaza esto con tu lógica real de generación await asyncio.sleep(30) # Solo para prueba # 2. Devuelve un video de prueba (eliminar en producción) return "video_prueba.mp4" except Exception as e: print(f"ERROR: {str(e)}") return None # 👇 **Solución Mágica**: Ejecución en hilos separados def run_async_with_timeout(prompt, script, voz_index, musica=None): with ThreadPoolExecutor() as executor: future = executor.submit( lambda: asyncio.run(crear_video_profesional(prompt, script, voz_index, musica)) ) return future.result(timeout=GRADIO_TIMEOUT) # Interfaz Minimalista (para enfocarnos en el timeout) with gr.Blocks() as app: with gr.Row(): prompt = gr.Textbox(label="Tema") btn = gr.Button("Generar") output = gr.Video() btn.click( fn=run_async_with_timeout, # 👈 Usamos el wrapper anti-timeout inputs=[prompt, gr.Textbox(visible=False), gr.Number(visible=False)], outputs=output ) if __name__ == "__main__": app.launch( server_name="0.0.0.0", server_port=7860, # ⚠️ Configuración CLAVE para el timeout app_kwargs={"timeout": GRADIO_TIMEOUT} )