From 916af3e62bfc4d23e1b510614e182411d7848259 Mon Sep 17 00:00:00 2001 From: Xavier Date: Mon, 24 Aug 2026 20:44:15 +0200 Subject: [PATCH] =?UTF-8?q?D=C3=A9ploiement=20serveur=20pour=20test=20de?= =?UTF-8?q?=20g=C3=A9n=C3=A9ration=20multim=C3=A9dia=20(HuggingFace=20+=20?= =?UTF-8?q?Cloudflare)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 18 ++++++++++++++---- modules/ai_media.py | 13 +++++-------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/main.py b/main.py index 5a01e86..c13bd3b 100644 --- a/main.py +++ b/main.py @@ -20,13 +20,17 @@ from modules.billing_manager import charger_soldes, sauvegarder_soldes # Lancement du module d'auto-mise à jour en arrière-plan import modules.model_updater +dossier_media = "/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media" +os.makedirs(dossier_media, exist_ok=True) + # --- MIDDLEWARE DE SÉCURITÉ --- class SecurityMiddleware(BaseHTTPMiddleware): async def dispatch(self, request, call_next): ip = request.headers.get("X-Forwarded-For", request.client.host).split(",")[0].strip() utilisateur = request.cookies.get("aethas_user", "visiteur") - if not request.url.path.startswith("/Logo") and not request.url.path.startswith("/login"): + # EXCLUSION DE /Media POUR NE PAS BLOQUER L'IMAGE + if not request.url.path.startswith(("/Logo", "/login", "/Media")): if verifier_et_bloquer_vpn(ip, utilisateur): return HTMLResponse("

Accès refusé

VPN ou Proxy strictement interdit.

", status_code=403) @@ -44,10 +48,16 @@ app, rt = fast_app( middleware=[Middleware(SecurityMiddleware)] ) -dossier_media = "/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media" -os.makedirs(dossier_media, exist_ok=True) app.mount("/Logo", StaticFiles(directory="Logo"), name="Logo") -app.mount("/Media", StaticFiles(directory="/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media"), name="Media") +# (J'ai supprimé l'ancien montage /Media capricieux de Docker) + +# --- ROUTE DÉDIÉE POUR L'AFFICHAGE ET TÉLÉCHARGEMENT DES MÉDIAS --- +@rt('/Media/{filename}') +def serve_media(filename: str): + chemin = os.path.join(dossier_media, filename) + if os.path.exists(chemin): + return FileResponse(chemin, media_type="image/png") + return HTMLResponse("Image introuvable sur le disque", status_code=404) # --- ROUTES D'AUTHENTIFICATION --- @rt('/login') diff --git a/modules/ai_media.py b/modules/ai_media.py index 362d939..401297b 100644 --- a/modules/ai_media.py +++ b/modules/ai_media.py @@ -2,7 +2,7 @@ import os import requests import time import concurrent.futures -import base64 # <-- NOUVEL IMPORT POUR DECODER L'IMAGE +import base64 from modules.logger import log_event def generer_image_cloudflare(prompt: str) -> bytes: @@ -17,21 +17,16 @@ def generer_image_cloudflare(prompt: str) -> bytes: try: resp = requests.post(url, headers=headers, json={"prompt": prompt}, timeout=120) if resp.status_code == 200: - # On vérifie si Cloudflare nous répond en texte (JSON) if "application/json" in resp.headers.get("Content-Type", ""): data = resp.json() if data.get("success") and "result" in data: - # On transforme le texte Base64 en véritable fichier image binaire return base64.b64decode(data["result"]) else: - # S'il répond nativement en binaire (parfois le cas selon la requête) return resp.content except Exception as e: log_event("WARNING", "MEDIA", f"Échec Cloudflare : {e}") return None -# ... (le reste du fichier reste identique) - def generer_image_huggingface(prompt: str) -> bytes: """Appel à l'API HuggingFace""" api_key = os.getenv("HUGGINGFACE_API_KEY") @@ -72,7 +67,8 @@ def generer_les_deux_images(prompt: str, fichiers: list) -> tuple: if img_cf: nom_cf = f"img_cf_{int(time.time())}.png" with open(os.path.join(dossier_media, nom_cf), 'wb') as f: f.write(img_cf) - reponse_md += f"### ☁️ Cloudflare Workers AI (SDXL)\n![Cloudflare](/Media/{nom_cf})\n\n---\n\n" + reponse_md += f"### ☁️ Cloudflare Workers AI (SDXL)\n![Cloudflare](/Media/{nom_cf})\n\n" + reponse_md += f"**[📥 Cliquez ici pour télécharger l'image](/Media/{nom_cf})**\n\n---\n\n" fournisseurs_actifs.append("Cloudflare") trace.append("🟢 Cloudflare : Succès") else: @@ -83,6 +79,7 @@ def generer_les_deux_images(prompt: str, fichiers: list) -> tuple: nom_hf = f"img_hf_{int(time.time())}.png" with open(os.path.join(dossier_media, nom_hf), 'wb') as f: f.write(img_hf) reponse_md += f"### 🤗 HuggingFace (SDXL)\n![HuggingFace](/Media/{nom_hf})\n\n" + reponse_md += f"**[📥 Cliquez ici pour télécharger l'image](/Media/{nom_hf})**\n\n" fournisseurs_actifs.append("HuggingFace") trace.append("🟢 HF : Succès") else: @@ -90,7 +87,7 @@ def generer_les_deux_images(prompt: str, fichiers: list) -> tuple: # Si les deux ont échoué if not img_hf and not img_cf: - return "*Échec critique : HuggingFace et Cloudflare ont échoué (ou clés manquantes).* \nVérifiez les logs du serveur.", "#ff4444", "Système", "Erreur", trace + return "*Échec critique : HuggingFace et Cloudflare ont échoué.*", "#ff4444", "Système", "Erreur", trace return reponse_md, "#00e5ff", " + ".join(fournisseurs_actifs), "Stable Diffusion XL", trace