Mise à jour de la configuration de la base de données pour utiliser PostgreSQL et ajout de Redis dans le fichier .env. Modifications du Dockerfile pour installer les dépendances nécessaires. Amélioration des services de stockage pour supporter les opérations asynchrones avec S3 et le stockage local. Refactorisation des pipelines d'images pour une meilleure gestion des tâches asynchrones. Ajout de la gestion des clés API dans l'authentification. Mise à jour de la documentation et des exemples d'utilisation.
CI / Lint & Format (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled

This commit is contained in:
2026-02-24 16:19:18 -05:00
parent cc99fea20a
commit d68deb9c74
20 changed files with 235 additions and 285 deletions
+14 -11
View File
@@ -2,16 +2,19 @@
Service d'extraction EXIF — Pillow + piexif
"""
import logging
import io
from datetime import datetime
from pathlib import Path
from typing import Any
logger = logging.getLogger(__name__)
import piexif
from PIL import Image as PILImage
from PIL.ExifTags import TAGS, GPSTAGS
from app.services.storage_backend import get_storage_backend
logger = logging.getLogger(__name__)
def _dms_to_decimal(dms: tuple, ref: str) -> float | None:
"""Convertit les coordonnées GPS DMS (degrés/minutes/secondes) en décimal."""
@@ -49,10 +52,10 @@ def _safe_str(value: Any) -> str | None:
return str(value)
def extract_exif(file_path: str) -> dict:
async def extract_exif(file_path: str) -> dict:
"""
Extrait toutes les métadonnées EXIF d'une image.
Retourne un dict structuré avec les données parsées.
Supporte Local et S3 via StorageBackend.
"""
result = {
"raw": {},
@@ -73,15 +76,15 @@ def extract_exif(file_path: str) -> dict:
}
try:
path = Path(file_path)
if not path.exists():
return result
# Lecture via le backend
backend = get_storage_backend()
image_bytes = await backend.get_bytes(file_path)
# ── Lecture EXIF brute via piexif ─────────────────────
try:
exif_data = piexif.load(str(path))
exif_data = piexif.load(image_bytes)
except Exception:
# JPEG sans EXIF, PNG, etc.
# Image sans EXIF
return result
raw_dict = {}
@@ -155,7 +158,7 @@ def extract_exif(file_path: str) -> dict:
pass
# ── Dict brut lisible (TAGS humains) ──────────────────
with PILImage.open(path) as img:
with PILImage.open(io.BytesIO(image_bytes)) as img:
raw_exif = img._getexif()
if raw_exif:
for tag_id, val in raw_exif.items():