Spaces:
Build error
Build error
| import os | |
| import gradio as gr | |
| import logging | |
| from datetime import datetime | |
| from dotenv import load_dotenv | |
| # Cargar variables de entorno | |
| load_dotenv() | |
| # Configuración inicial | |
| logging.basicConfig(filename='art_transformer.log', level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| # Importaciones internas | |
| from image_processor.analyzer import ImageAnalyzer | |
| from image_processor.framer import FrameGenerator | |
| from image_processor.priority_queue import PriorityQueue | |
| from image_processor.google_auth import GooglePhotosAuth | |
| from image_processor.monitoring import ResourceMonitor | |
| class ArtTransformer: | |
| def __init__(self): | |
| self.openai_key = os.getenv("OPENAI_API_KEY") | |
| self.analyzer = ImageAnalyzer() | |
| self.framer = FrameGenerator(self.openai_key) | |
| self.auth = GooglePhotosAuth() | |
| self.queue = PriorityQueue() | |
| self.monitor = ResourceMonitor(interval=15) | |
| self.current_job = None | |
| def process_album(self, image_paths, priority=2, progress=gr.Progress()): | |
| try: | |
| self.monitor.start() | |
| # Autenticación con Google Photos | |
| credentials = self.auth.authenticate() | |
| # Configurar cola de prioridad | |
| for idx, path in enumerate(image_paths): | |
| self.queue.add_task(priority + idx/1000, path) | |
| results = [] | |
| total = len(image_paths) | |
| while not self.queue.is_empty(): | |
| if self.current_job and self.current_job.is_alive(): | |
| yield gr.Gallery(visible=True), f"⏳ Procesando {self.current_job.name}..." | |
| next_path = self.queue.get_next_task() | |
| self.current_job = threading.Thread( | |
| target=self._process_single_image, | |
| args=(next_path, results, progress), | |
| name=f"Job-{datetime.now().strftime('%H%M%S')}" | |
| ) | |
| self.current_job.start() | |
| self.current_job.join() | |
| return self._build_output(results), "✅ Proceso completado!" | |
| except Exception as e: | |
| logger.error(f"Error general: {str(e)}") | |
| return None, f"❌ Error crítico: {str(e)}" | |
| finally: | |
| self.monitor.stop() | |
| def create_interface(): | |
| with gr.Blocks(title="Art Transformer", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🎨 Transformador Artístico Automático") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| api_key = gr.Textbox( | |
| label="OpenAI API Key", | |
| type="password", | |
| placeholder="sk-...", | |
| info="Necesario para generar marcos" | |
| ) | |
| priority = gr.Dropdown( | |
| label="Prioridad", | |
| choices=[("Alta", 0), ("Media", 1), ("Baja", 2)], | |
| value=1 | |
| ) | |
| btn_run = gr.Button("Iniciar Procesamiento", variant="primary") | |
| with gr.Column(scale=3): | |
| gallery = gr.Gallery( | |
| label="Resultados", | |
| columns=4, | |
| height="auto", | |
| object_fit="contain" | |
| ) | |
| status = gr.Textbox(label="Estado", interactive=False) | |
| inputs = gr.File( | |
| file_count="multiple", | |
| file_types=["image"], | |
| label="Subir imágenes" | |
| ) | |
| btn_run.click( | |
| fn=ArtTransformer().process_album, | |
| inputs=[inputs, priority], | |
| outputs=[gallery, status] | |
| ) | |
| return demo | |
| if __name__ == "__main__": | |
| demo = create_interface() | |
| demo.queue(concurrency_count=2, max_size=10) | |
| demo.launch(server_name="0.0.0.0", server_port=7860) |