From 223d71883ed9b493d8521211b5119485e72e11e9 Mon Sep 17 00:00:00 2001 From: jbperrin Date: Fri, 17 Jul 2026 15:54:00 +0200 Subject: [PATCH] fix: gallery download - use local URL for proxy, rename file with event name + photo date --- backend/api/gallery.py | 30 ++++++++++++++++++++------ frontend/templates/public/gallery.html | 4 ++-- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/backend/api/gallery.py b/backend/api/gallery.py index 2bea5da..1b919d8 100644 --- a/backend/api/gallery.py +++ b/backend/api/gallery.py @@ -87,19 +87,35 @@ async def api_gallery_photos( @router.get("/api/gallery/download/{photo_id}") async def download_photo(request: Request, photo_id: str): - """Proxy la photo full-res avec un nom de fichier lie a l'evenement en cours.""" + """Proxy la photo full-res avec Content-Disposition et nom basé sur l'événement + date photo.""" pb = request.app.state.photobooth_service cfg = request.app.state.config event_svc = getattr(request.app.state, "event_service", None) - img_url = pb.media_url(photo_id) + # Toujours fetcher depuis localhost (base_url), pas l'URL publique + local_url = f"{pb._base.rstrip('/')}/media/full/{photo_id}" + + # Nom de l'événement (lisible) + date de la photo depuis le disque + event_name = (cfg.event.name or cfg.event.slug or "Photomaton").replace(" ", "_") slug = cfg.event.slug or "photomaton" - date_str = datetime.now().strftime("%Y-%m-%d") - filename = f"{slug}_By_LSDW_{date_str}.jpg" + + # Tenter de récupérer la vraie date depuis le fichier + photo_date = datetime.now().strftime("%Y-%m-%d_%H-%M") + try: + media_dir = Path(cfg.photobooth.media_dir) + candidates = list(media_dir.glob(f"{photo_id}*")) + if candidates: + mtime = candidates[0].stat().st_mtime + photo_date = datetime.fromtimestamp(mtime).strftime("%Y-%m-%d_%H-%M") + except Exception: + pass + + safe_name = "".join(c if c.isalnum() or c in "-_." else "_" for c in event_name) + filename = f"{safe_name}_{photo_date}.jpg" try: async with httpx.AsyncClient(timeout=30.0) as client: - r = await client.get(img_url) + r = await client.get(local_url) r.raise_for_status() if event_svc: @@ -116,8 +132,8 @@ async def download_photo(request: Request, photo_id: str): }, ) except Exception as e: - logger.warning("Download proxy echoue (%s), fallback redirect: %s", photo_id, e) - return RedirectResponse(url=img_url) + logger.warning("Download proxy échoue (%s): %s", photo_id, e) + return RedirectResponse(url=pb.media_url(photo_id)) def _is_image(item: dict) -> bool: diff --git a/frontend/templates/public/gallery.html b/frontend/templates/public/gallery.html index 3147abe..cf64b3c 100644 --- a/frontend/templates/public/gallery.html +++ b/frontend/templates/public/gallery.html @@ -35,7 +35,7 @@ Photo
Connectez-vous au WiFi Photomaton pour télécharger
@@ -75,7 +75,7 @@ async function loadPhotos(page = 1) {
Photo
`).join('');