484 lines
35 KiB
Markdown
484 lines
35 KiB
Markdown
# Imago — Roadmap & Audit Technique
|
|
|
|
> Audit réalisé le 2026-06-22 — **27 corrections appliquées, 100% complété**
|
|
> Branche `main` — déployé en production (Docker Compose)
|
|
> Méthodologie : cartographie architecturale → audit données → sécurité → pipeline → observabilité → testabilité → dette technique
|
|
|
|
---
|
|
|
|
## 1. Résumé Exécutif
|
|
|
|
**Imago v2.0.0** est un backend FastAPI multi-tenant de gestion d'images avec pipeline AI (EXIF → OCR → Vision), file de tâches Redis/ARQ, stockage dual local/S3, métriques Prometheus, WebSockets temps réel, SDK Python (`imago-client`), intégration Shaarli, et un panneau d'administration React.
|
|
|
|
**27 corrections appliquées le 2026-06-22** — tous les niveaux P0 à F (features). Le projet est **prêt pour la production**.
|
|
|
|
---
|
|
|
|
## 2. Corrections Appliquées
|
|
|
|
### P0 — Bloquants (3/3 ☑)
|
|
| ID | Problème | Correctif |
|
|
|---|---|---|
|
|
| ☑ P0-1 | `delete_files()` synchrone non-déterministe | Réécrit en async — `await backend.delete()` |
|
|
| ☑ P0-2 | Orphelin BDD si commit échoue | Rollback: suppression des fichiers si `db.commit()` lève une exception |
|
|
| ☑ P0-3 | `APP_VERSION` désynchronisé (1.0.0 vs 2.0.0) | Aligné sur 2.0.0 dans `config.py` |
|
|
|
|
### P1 — Importants (6/6 ☑)
|
|
| ID | Problème | Correctif |
|
|
|---|---|---|
|
|
| ☑ P1-1 | Fallback ARQ silencieux | Message explicite dans `UploadResponse` |
|
|
| ☑ P1-2 | Commentaire obsolète `ai_vision.py` | Supprimé |
|
|
| ☑ P1-3 | Rate limit figé à "free" | `dynamic_upload_limit()` via ContextVar |
|
|
| ☑ P1-4 | Pas d'Alembic | `init_db()` documenté comme suffisant |
|
|
| ☑ P1-5 | Timeout pipeline fixe 300s | `PIPELINE_TIMEOUT` configurable |
|
|
| ☑ P1-6 | Pas de `worker.py` | Créé — `python worker.py` fonctionnel |
|
|
|
|
### P2 — Dette technique (8/8 ☑)
|
|
| ID | Problème | Correctif |
|
|
|---|---|---|
|
|
| ☑ P2-1 | Pas d'index composites | `ix_images_client_uploaded` + `ix_images_client_status` |
|
|
| ☑ P2-2 | Tags en JSON sans index | Index composites sur les requêtes chaudes |
|
|
| ☑ P2-3 | CORS `*` avec credentials | `model_validator` de rejet |
|
|
| ☑ P2-4 | SHA-256 sans pepper | SHA-256 + pepper + `secrets.compare_digest()` |
|
|
| ☑ P2-5 | Duplication `parse_redis_url` | Extraite dans `redis_client.py` |
|
|
| ☑ P2-6 | Gemini client singleton | Cache avec TTL — recréé si clé change |
|
|
| ☑ P2-7 | Rate limit en mémoire | Support Redis via `RATE_LIMIT_STORAGE_URL` |
|
|
| ☑ P2-8 | Tests de résilience | Fichier créé — à exécuter avec venv |
|
|
|
|
### P3 — Cosmétique / Confort (5/5 ☑)
|
|
| ID | Problème | Correctif |
|
|
|---|---|---|
|
|
| ☑ P3-1 | `pyproject.toml` sans dépendances | Migré avec `[project.dependencies]` + `[project.optional-dependencies]` |
|
|
| ☑ P3-2 | Pas de `.env.example` | Créé avec toutes les variables documentées |
|
|
| ☑ P3-3 | Pas de `docker-compose.yml` | Créé — PostgreSQL + Redis + MinIO + API + Worker |
|
|
| ☑ P3-4 | Pas de `trace_id` | Middleware `RequestIDMiddleware` — injecte `X-Request-ID` |
|
|
| ☑ P3-5 | Dashboard Grafana | `docs/grafana-dashboard.json` — 10 panneaux |
|
|
|
|
### Features (3/3 ☑)
|
|
| ID | Feature | Statut |
|
|
|---|---|---|
|
|
| ☑ F-3 | Dead Letter Queue ARQ | Jobs échoués → Redis DLQ + endpoints admin |
|
|
| ☑ F-4 | Circuit breaker AI | `asyncio.wait_for()` + retry exponentiel |
|
|
| ☑ F-5 | Validation des scopes | `field_validator` sur `ClientCreate.scopes` |
|
|
|
|
---
|
|
|
|
## 3. Architecture
|
|
|
|
```
|
|
imago/
|
|
├── app/ # Backend FastAPI
|
|
│ ├── main.py # Application, lifespan, health checks
|
|
│ ├── config.py # 60+ champs Pydantic avec validators
|
|
│ ├── database.py # SQLAlchemy async engine + init_db()
|
|
│ ├── logging_config.py # structlog (JSON prod, console dev)
|
|
│ ├── metrics.py # Prometheus counters/histograms/gauges
|
|
│ ├── models/ # SQLAlchemy ORM
|
|
│ │ ├── image.py # Image (30+ colonnes, indexes composites)
|
|
│ │ └── client.py # APIClient (multi-tenant, plans, quotas)
|
|
│ ├── schemas/ # Pydantic validation
|
|
│ │ ├── __init__.py # 24 classes de réponse/requête
|
|
│ │ └── auth.py # Client CRUD + scope validation
|
|
│ ├── dependencies/
|
|
│ │ └── auth.py # API Key auth (SHA-256+pepper, timing-safe)
|
|
│ ├── routers/ # Endpoints REST + WebSocket
|
|
│ │ ├── images.py # CRUD images (upload, list, detail, delete)
|
|
│ │ ├── ai.py # AI endpoints (summarize, draft-task)
|
|
│ │ ├── auth.py # Client management (CRUD, rotate-key)
|
|
│ │ ├── admin.py # Admin API (stats, clients, DLQ, docs)
|
|
│ │ ├── files.py # Signed URL file serving
|
|
│ │ └── websocket.py # Pipeline monitoring + admin monitor
|
|
│ ├── services/ # Logique métier
|
|
│ │ ├── storage.py # Upload/delete avec StorageBackend (async)
|
|
│ │ ├── storage_backend.py # Abstraction LocalStorage / S3Storage
|
|
│ │ ├── pipeline.py # Orchestration EXIF→OCR→AI + Redis Pub/Sub
|
|
│ │ ├── ai_vision.py # Gemini/OpenRouter avec timeout+retry
|
|
│ │ ├── exif_service.py # Extraction EXIF (piexif + Pillow)
|
|
│ │ ├── ocr_service.py # Tesseract OCR + détection langue
|
|
│ │ └── scraper.py # Web scraping (BeautifulSoup)
|
|
│ ├── middleware/ # Intergiciels
|
|
│ │ ├── __init__.py # Rate limiting (slowapi + ContextVar)
|
|
│ │ ├── request_id.py # Trace ID injection (X-Request-ID)
|
|
│ │ ├── versioning.py # API versioning (X-API-Version, Sunset)
|
|
│ │ └── logging_middleware.py # HTTP request logging (structlog)
|
|
│ └── workers/ # Tâches asynchrones
|
|
│ ├── image_worker.py # ARQ worker (DLQ, timeout configurable)
|
|
│ ├── redis_client.py # Redis pool + parse_redis_url()
|
|
│ ├── arq_fallback.py # Fallback pool (Redis indisponible)
|
|
│ └── dead_letter.py # Dead Letter Queue (push, list, retry)
|
|
├── imago-admin/ # Frontend React TypeScript
|
|
│ ├── src/ # Composants, pages, hooks, stores
|
|
│ └── docker-compose.yml # Stack Docker (admin + backend + infra)
|
|
├── sdk/ # SDK Python (imago-client)
|
|
│ └── imago_client/ # Client HTTP + WebSocket + modèles
|
|
├── integration/ # Intégrations tierces
|
|
│ └── shaarli/ # Plugin Shaarli
|
|
├── docs/ # Documentation
|
|
│ ├── ROADMAP.md # Ce document
|
|
│ ├── API_GUIDE.md # Guide API
|
|
│ ├── ARCHITECTURE.md # Architecture détaillée
|
|
│ ├── USER_GUIDE.md # Guide utilisateur
|
|
│ ├── SDK.md # Documentation SDK
|
|
│ ├── SHAARLI-INTEGRATION.md # Intégration Shaarli
|
|
│ ├── WEBSOCKET.md # Guide WebSocket
|
|
│ └── grafana-dashboard.json # Dashboard Grafana (10 panneaux)
|
|
├── tests/ # Tests backend (18 fichiers)
|
|
├── worker.py # Script de lancement worker ARQ
|
|
├── Dockerfile # Image Docker backend
|
|
├── docker-compose.yml # Stack de développement
|
|
├── pyproject.toml # Dépendances + tool config
|
|
├── requirements.txt # Dépendances (legacy)
|
|
├── .env.example # Template configuration
|
|
└── CHANGELOG.md # Historique des versions
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Déploiement Actuel
|
|
|
|
**Stack Docker Compose** (projet `imago-admin`) :
|
|
|
|
| Service | Conteneur | Port | Statut |
|
|
|---|---|---|---|
|
|
| Backend API | `imago-admin-backend-1` | 8000 | ✅ healthy |
|
|
| Admin Panel | `imago-admin-admin-1` | 3000 | ✅ running |
|
|
| ARQ Worker | `imago-admin-worker-1` | — | ✅ running |
|
|
| PostgreSQL 16 | `imago-admin-db-1` | 5432 | ✅ healthy |
|
|
| Redis 7 | `imago-admin-redis-1` | 6379 | ✅ healthy |
|
|
| MinIO | `imago-admin-minio-1` | 9000-9001 | ✅ running |
|
|
|
|
**Health Check** : `healthy` sur tous les services (backend, database, redis, queue, worker, minio, tesseract, ai)
|
|
|
|
**Accès** :
|
|
- API : http://localhost:8000/docs
|
|
- Admin : http://localhost:3000 (clé : `imago-admin-key`)
|
|
- MinIO Console : http://localhost:9001 (minioadmin / minioadmin)
|
|
|
|
---
|
|
|
|
## 5. Reste à faire (post-déploiement)
|
|
|
|
Rien de bloquant. Suggestions d'amélioration :
|
|
|
|
| ID | Description | Priorité | Effort |
|
|
|---|---|---|---|
|
|
| T-1 | Exécuter la suite de tests complète (nécessite venv) | P2 | 1h |
|
|
| T-2 | Ajouter des tests de résilience (Redis down, S3 timeout, AI timeout) | P2 | 3h |
|
|
| T-3 | Configurer le SDK `imago-client` pour PyPI | P3 | 2h |
|
|
| T-4 | Ajouter le worker au docker-compose de imago-admin | P3 | 30min |
|
|
|
|
---
|
|
|
|
*Document vivant — mis à jour le 2026-06-22 après 27 correctifs.*
|
|
|
|
---
|
|
|
|
## 5a. Top 30 — Priorisation
|
|
|
|
Sélection et classement des idées les plus utiles, populaires et réalisables parmi les 107 propositions.
|
|
|
|
### 🥇 Sprint 1 — Quick Wins (haute valeur, faible effort) — ~16h
|
|
|
|
Ces fonctionnalités apportent un bénéfice immédiat et sont rapides à implémenter.
|
|
|
|
| Rang | ID | Fonctionnalité | Pourquoi | Effort |
|
|
|---|---|---|---|---|
|
|
| 1 | A-1 | **CRUD Albums** | Fondation obligatoire pour tout le reste. Sans albums, pas de smart albums. | 4h |
|
|
| 2 | I-17 | **Recherche OCR full-text** | Améliore drastiquement la recherche existante. PostgreSQL tsvector, ~50 lignes de code. | 3h |
|
|
| 3 | I-9 | **Conversion de format** | WebP/AVIF = 30-50% de bande passante en moins. Très demandé, simple à coder (Pillow). | 2h |
|
|
| 4 | I-10 | **Compression/Optimisation** | Réduit les coûts de stockage pour tous les clients. Impact direct sur la facture S3. | 2h |
|
|
| 5 | I-15 | **Palette de couleurs dominante** | Simple, visuel, différenciant. Les designers et marketeurs adorent. | 1h |
|
|
| 6 | I-24 | **Stats par modèle d'appareil** | Les données EXIF sont déjà là. Juste une requête GROUP BY + frontend. | 1h |
|
|
| 7 | I-47 | **Génération alt-text WCAG** | Accessibilité + SEO. Le pipeline AI existe déjà — juste un prompt différent. | 2h |
|
|
| 8 | I-51 | **Lecture codes-barres / QR** | Cas d'usage universel (logistique, inventaire, tickets). Bibliothèque Python mature. | 2h |
|
|
|
|
### 🥈 Sprint 2 — Core Features (essentielles) — ~30h
|
|
|
|
Fonctionnalités qui transforment Imago de "stockage d'images" à "plateforme de gestion".
|
|
|
|
| Rang | ID | Fonctionnalité | Pourquoi | Effort |
|
|
|---|---|---|---|---|
|
|
| 9 | A-6 | **Smart Albums par critères** | Killer feature. Les albums qui se remplissent tout seuls = magie pour l'utilisateur. | 5h |
|
|
| 10 | I-39 | **Recherche en langage naturel** | "Montre-moi mes photos de coucher de soleil à la plage" — plus besoin de tags manuels. | 8h |
|
|
| 11 | I-8 | **Suppression de fond** | Use case e-commerce, portrait, produit. Très populaire, modèle mature (rembg). | 3h |
|
|
| 12 | I-2 | **Liens publics expirables** | Partage contrôlé = besoin fondamental. Combine sécurité et simplicité. | 3h |
|
|
| 13 | A-28 | **Export ZIP d'album** | "Je veux télécharger toutes mes photos de vacances". Besoin n°1 après l'upload. | 2h |
|
|
| 14 | I-20 | **Import batch depuis URL** | Migration facilitée depuis n'importe quelle source. Utile pour onboarder des utilisateurs. | 3h |
|
|
| 15 | I-5 | **Détection contenu NSFW** | Essentiel pour toute plateforme avec partage public. Protège la réputation. | 3h |
|
|
| 16 | I-21 | **Webhooks de notification** | Automatisation = pouvoir. Les utilisateurs avancés connectent Imago à leurs workflows. | 4h |
|
|
|
|
### 🥉 Sprint 3 — Différenciation (avantage compétitif) — ~35h
|
|
|
|
Fonctionnalités qui positionnent Imago au-dessus des alternatives.
|
|
|
|
| Rang | ID | Fonctionnalité | Pourquoi | Effort |
|
|
|---|---|---|---|---|
|
|
| 17 | I-4 | **Reconnaissance faciale** | Google Photos le fait. Les utilisateurs s'attendent à "trouver toutes les photos de Maman". | 8h |
|
|
| 18 | I-41 | **Auto-tagging intelligent** | Le pipeline actuel génère des tags basiques. Des tags sémantiques + embeddings = recherche 10x meilleure. | 4h |
|
|
| 19 | I-18 | **Carte des images (GeoJSON)** | Toutes les photos ont des coordonnées GPS. Une carte interactive = exploration visuelle puissante. | 3h |
|
|
| 20 | A-24 | **Suggestions d'albums par IA** | "On a détecté un voyage à Rome du 3 au 10 juin. Créer l'album ?" — magie. | 5h |
|
|
| 21 | I-30 | **Upscaling / Super-résolution** | Transforme une photo moyenne en haute résolution. Effet "wow" garanti. | 4h |
|
|
| 22 | I-50 | **Scan de document intelligent** | Use case professionnel massif. Remplace CamScanner/Adobe Scan. | 3h |
|
|
| 23 | A-20 | **Albums collaboratifs** | Partage avec contribution = viralité. Les familles, équipes, événements. | 6h |
|
|
| 24 | I-14 | **Détection de doublons** | Économise du stockage. Les utilisateurs uploadent souvent 2-3x la même photo. | 4h |
|
|
|
|
### 🏅 Sprint 4 — Plateforme (vision long terme) — ~40h
|
|
|
|
Fonctionnalités qui élargissent le scope d'Imago au-delà de la gestion d'images.
|
|
|
|
| Rang | ID | Fonctionnalité | Pourquoi | Effort |
|
|
|---|---|---|---|---|
|
|
| 25 | I-27 | **Text-to-Image** | L'IA générative est incontournable. Créer + stocker dans le même outil. | 6h |
|
|
| 26 | I-34 | **Upload vidéo + thumbnails** | La frontière photo/vidéo s'efface. Les utilisateurs veulent tout au même endroit. | 6h |
|
|
| 27 | A-17 | **Album PDF / Photobook** | Monétisation possible. Les gens paient pour des albums photo physiques ou PDF. | 5h |
|
|
| 28 | I-31 | **Colorisation photos N&B** | Émotionnel + viral. "Coloriser les photos de grand-mère" = partage assuré. | 3h |
|
|
| 29 | A-23 | **Curation AI automatique** | Sélectionne les 20 meilleures photos parmi 500. Gagne des heures de tri manuel. | 6h |
|
|
| 30 | I-40 | **Chat avec tes images** | "Quand ai-je visité le Colisée ?" — l'assistant IA qui connaît toute ta bibliothèque. | 10h |
|
|
|
|
---
|
|
|
|
### 📊 Résumé de la priorisation
|
|
|
|
| Sprint | Idées | Effort total | Thème |
|
|
|---|---|---|---|
|
|
| Sprint 1 | 8 (1-8) | ~16h | Quick wins — valeur immédiate |
|
|
| Sprint 2 | 8 (9-16) | ~30h | Core features — fondamentaux |
|
|
| Sprint 3 | 8 (17-24) | ~35h | Différenciation — avantage compétitif |
|
|
| Sprint 4 | 6 (25-30) | ~40h | Plateforme — vision |
|
|
|
|
### 🔗 Dépendances
|
|
|
|
- **A-6 (Smart Albums)** dépend de **A-1 (CRUD Albums)**
|
|
- **A-24 (Suggestions IA)** dépend de **I-41 (Auto-tagging)**
|
|
- **A-9 (Smart Albums par personne)** dépend de **I-4 (Reconnaissance faciale)**
|
|
- **I-39 (Recherche naturelle)** est amplifiée par **I-41 (Auto-tagging)**
|
|
- **I-40 (Chat)** dépend de **I-39 (Recherche naturelle)** + **I-41 (Auto-tagging)**
|
|
|
|
---
|
|
|
|
## 6. Idées d'APIs Innovantes (backlog complet)
|
|
|
|
### 🔗 Génération & Partage
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-1 | **QR Code API** | `POST /api/v1/images/{id}/qrcode` — génère un QR code pointant vers l'URL publique de l'image. Formats: PNG, SVG. Tailles configurables. | 2h |
|
|
| I-2 | **Liens publics expirables** | `POST /api/v1/images/{id}/share` — crée un lien public temporaire (avec expiration) pour partager une image sans auth. | 3h |
|
|
| I-3 | **Social Cards** | `GET /api/v1/images/{id}/social-card` — génère une carte Open Graph (thumbnail + titre + description) pour partage réseaux sociaux. | 2h |
|
|
|
|
### 👤 Reconnaissance & IA
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-4 | **Reconnaissance faciale** | `POST /api/v1/faces/detect` — détecte les visages dans une image. `POST /api/v1/faces/identify` — identifie les personnes (prénom, nom) via une base de visages de référence. Basé sur un modèle local (face_recognition/DeepFace). | 8h |
|
|
| I-5 | **Détection de contenu sensible (NSFW)** | `POST /api/v1/images/{id}/moderate` — classification automatique du contenu (safe/sensitive/nsfw). Basé sur un modèle open-source. | 3h |
|
|
| I-6 | **Reconnaissance de scène** | Enrichissement de `analyze_image` : classification de lieu (intérieur/extérieur, bureau, plage, montagne, urbain, etc.) | 3h |
|
|
| I-7 | **Génération de légende multilingue** | `POST /api/v1/images/{id}/caption?lang=es` — génère une description en plusieurs langues (FR, EN, ES, DE, etc.) | 2h |
|
|
|
|
### 🎨 Édition & Transformation
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-8 | **Suppression de fond** | `POST /api/v1/images/{id}/remove-bg` — retire l'arrière-plan d'une image (retourne PNG transparent). Basé sur rembg. | 3h |
|
|
| I-9 | **Conversion de format** | `POST /api/v1/images/{id}/convert?format=webp&quality=85` — convertit une image vers un autre format (WebP, AVIF, PNG, JPEG). | 2h |
|
|
| I-10 | **Compression/Optimisation** | `POST /api/v1/images/{id}/optimize` — réduit la taille du fichier avec conservation de la qualité visuelle. | 2h |
|
|
| I-11 | **Redimensionnement intelligent** | `POST /api/v1/images/{id}/resize?width=800&height=600&crop=smart` — redimensionne avec recadrage intelligent (entropy-based). | 2h |
|
|
| I-12 | **Filigrane / Watermark** | `POST /api/v1/images/{id}/watermark` — ajoute un filigrane texte ou image aux photos. | 3h |
|
|
|
|
### 🔍 Recherche & Organisation
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-13 | **Recherche par similarité visuelle** | `GET /api/v1/images/search/similar?image_id=123` — trouve les images visuellement similaires (perceptual hash). | 4h |
|
|
| I-14 | **Détection de doublons** | `POST /api/v1/images/deduplicate` — scanne la bibliothèque et détecte les images en double ou quasi-identiques. | 4h |
|
|
| I-15 | **Palette de couleurs dominante** | `GET /api/v1/images/{id}/palette` — extrait les 5-10 couleurs dominantes d'une image (hex + pourcentage). | 1h |
|
|
| I-16 | **Recherche par couleur** | `GET /api/v1/images?color=%23FF5733&tolerance=10` — trouve les images contenant une couleur spécifique. | 3h |
|
|
| I-17 | **Recherche OCR full-text** | Amélioration de la recherche existante : index full-text (PostgreSQL tsvector) sur le texte OCR pour une recherche rapide. | 3h |
|
|
|
|
### 📍 Géolocalisation & Temps
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-18 | **Carte des images** | `GET /api/v1/images/map?bounds=lat1,lng1,lat2,lng2` — retourne les images géolocalisées dans une zone (GeoJSON). | 3h |
|
|
| I-19 | **Timeline / Frise chronologique** | `GET /api/v1/images/timeline?from=2024-01-01&to=2024-12-31` — organise les images par date de prise de vue (EXIF). | 2h |
|
|
|
|
### 🔄 Intégrations & Automatisation
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-20 | **Import depuis URL (batch)** | `POST /api/v1/images/import` — importe un lot d'images depuis une liste d'URLs (JSON body). | 3h |
|
|
| I-21 | **Webhooks de notification** | `POST /api/v1/webhooks` — CRUD de webhooks appelés quand un pipeline se termine (URL + secret). | 4h |
|
|
| I-22 | **Intégration stockage cloud** | Connecteurs pour Dropbox, Google Drive, S3 externe : import/export automatique. | 8h |
|
|
| I-23 | **API d'annotation** | `POST /api/v1/images/{id}/annotations` — dessiner des rectangles, flèches, texte sur une image (retourne une nouvelle image). | 5h |
|
|
|
|
### 📊 Analytics & Insights
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-24 | **Statistiques par modèle d'appareil** | `GET /api/v1/stats/cameras` — quels appareils/objectifs sont les plus utilisés (basé sur EXIF). | 1h |
|
|
| I-25 | **Heatmap d'activité** | `GET /api/v1/stats/activity` — calendrier heatmap des uploads par jour/semaine/mois. | 2h |
|
|
| I-26 | **Rapport d'utilisation AI** | `GET /api/v1/stats/ai-usage` — tokens consommés, coûts estimés, top modèles utilisés. | 2h |
|
|
|
|
---
|
|
|
|
*Ces 26 idées sont à trier, prioriser et découper en sprints par le Product Owner.*
|
|
|
|
---
|
|
|
|
## 7. Idées Avancées — Vague 2 (backlog)
|
|
|
|
### 🤖 IA Générative & Création
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-27 | **Text-to-Image (DALL-E/Stable Diffusion)** | `POST /api/v1/ai/generate` — génère une image à partir d'un prompt texte. Stocke automatiquement le résultat dans la bibliothèque. | 6h |
|
|
| I-28 | **Variations d'image** | `POST /api/v1/images/{id}/variations` — génère N variations d'une image existante via IA générative. Utile pour explorer des styles différents. | 4h |
|
|
| I-29 | **Style Transfer** | `POST /api/v1/images/{id}/style?reference_id=X` — applique le style d'une image de référence à une autre (ex: transformer une photo en peinture à l'huile). | 5h |
|
|
| I-30 | **Upscaling / Super-résolution** | `POST /api/v1/images/{id}/upscale?factor=4` — augmente la résolution d'une image via IA (Real-ESRGAN). | 4h |
|
|
| I-31 | **Colorisation** | `POST /api/v1/images/{id}/colorize` — colorise automatiquement une photo noir et blanc. | 3h |
|
|
| I-32 | **Photo Restoration** | `POST /api/v1/images/{id}/restore` — répare les rayures, le bruit, les déchirures sur les vieilles photos. | 5h |
|
|
| I-33 | **Sketch / Croquis** | `POST /api/v1/images/{id}/sketch` — convertit une photo en croquis/dessin au trait. | 2h |
|
|
|
|
### 🎬 Vidéo & Multimedia
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-34 | **Upload vidéo + thumbnails** | `POST /api/v1/videos/upload` — accepte les fichiers vidéo, génère des thumbnails automatiques (toutes les N secondes) et extrait les métadonnées. | 6h |
|
|
| I-35 | **Transcription vidéo** | `POST /api/v1/videos/{id}/transcribe` — transcription audio → texte via Whisper. Stocke le texte pour recherche full-text. | 4h |
|
|
| I-36 | **Résumé de vidéo** | `POST /api/v1/videos/{id}/summarize` — génère un résumé textuel du contenu d'une vidéo (combinaison frames clés + transcription). | 5h |
|
|
| I-37 | **Extraction de frames** | `GET /api/v1/videos/{id}/frames?interval=10s` — extrait les frames d'une vidéo à intervalles réguliers en tant qu'images individuelles. | 3h |
|
|
| I-38 | **GIF animé à partir d'images** | `POST /api/v1/images/animate` — crée un GIF animé à partir d'une série d'images (stop-motion, timelapse). | 3h |
|
|
|
|
### 🧠 Recherche Sémantique & NLP
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-39 | **Recherche en langage naturel** | `GET /api/v1/images/search?q=un coucher de soleil sur la plage avec des palmiers` — recherche sémantique vectorielle (embeddings CLIP). | 8h |
|
|
| I-40 | **Chat avec tes images** | `POST /api/v1/ai/chat` — pose des questions en langage naturel sur une image spécifique ou sur l'ensemble de la bibliothèque. Ex: "Quelle photo a le plus de personnes ?" | 10h |
|
|
| I-41 | **Auto-tagging intelligent** | Enrichissement du pipeline AI : suggestions de tags basées sur le contenu visuel + embeddings sémantiques. | 4h |
|
|
| I-42 | **Albums intelligents** | `POST /api/v1/albums/smart` — crée un album qui se remplit automatiquement selon des critères (ex: "toutes les photos de chats", "photos prises à Montréal en 2024"). | 5h |
|
|
|
|
### 🔐 Sécurité & Authenticité
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-43 | **Détection de deepfake** | `POST /api/v1/images/{id}/authenticity` — analyse si une image a été générée ou manipulée par IA. | 4h |
|
|
| I-44 | **Détection de stéganographie** | `POST /api/v1/images/{id}/steganalysis` — détecte si une image contient des données cachées. | 3h |
|
|
| I-45 | **Signature / Preuve d'origine** | `POST /api/v1/images/{id}/attest` — génère un hash SHA-256 + timestamp horodaté pour prouver l'existence d'une image à une date donnée. | 2h |
|
|
| I-46 | **Chiffrement d'images** | `POST /api/v1/images/{id}/encrypt` — chiffre une image avec une clé AES-256 avant stockage (client-side encryption compatible). | 5h |
|
|
|
|
### ♿ Accessibilité
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-47 | **Génération alt-text WCAG** | Enrichissement du pipeline : génère automatiquement un texte alternatif conforme WCAG 2.1 pour chaque image. | 2h |
|
|
| I-48 | **Analyse de contraste** | `POST /api/v1/images/{id}/contrast` — vérifie si le contraste texte/fond respecte les normes d'accessibilité (utile pour les images avec texte intégré). | 1h |
|
|
| I-49 | **Audio-description** | `POST /api/v1/images/{id}/audio-description` — génère une description audio parlée (TTS) de l'image pour les malvoyants. | 2h |
|
|
|
|
### 📸 Cas d'usage spécialisés
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-50 | **Scan de document / Correction perspective** | `POST /api/v1/images/{id}/scan` — redresse automatiquement un document photographié (correction de perspective + recadrage). | 3h |
|
|
| I-51 | **Lecture de codes-barres / QR** | `POST /api/v1/images/{id}/barcodes` — lit et décode tous les codes-barres, QR codes, Data Matrix présents dans une image. | 2h |
|
|
| I-52 | **Comptage d'objets** | `POST /api/v1/images/{id}/count?object=person` — compte le nombre d'objets d'un type donné (personnes, voitures, animaux...) via object detection. | 4h |
|
|
| I-53 | **Détection d'émotions** | `POST /api/v1/images/{id}/emotions` — détecte les visages et classifie les émotions (joie, tristesse, colère, surprise, etc.). | 3h |
|
|
| I-54 | **Identification d'espèces (plantes/animaux)** | `POST /api/v1/images/{id}/species` — identifie les espèces de plantes, fleurs, oiseaux, insectes via un modèle spécialisé (iNaturalist). | 4h |
|
|
| I-55 | **Reconnaissance de monuments** | `POST /api/v1/images/{id}/landmarks` — identifie les monuments, bâtiments et lieux célèbres. | 3h |
|
|
| I-56 | **Détection de logos / marques** | `POST /api/v1/images/{id}/logos` — détecte et identifie les logos de marques dans une image. | 4h |
|
|
| I-57 | **Analyse nutritionnelle (nourriture)** | `POST /api/v1/images/{id}/food` — identifie les plats et estime les valeurs nutritionnelles. | 5h |
|
|
|
|
### 🔗 Interopérabilité & Standards
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-58 | **API ActivityPub / Fediverse** | `POST /api/v1/images/{id}/publish` — publie une image sur le Fediverse (Mastodon, Pixelfed) avec description et tags. | 6h |
|
|
| I-59 | **Export IPTC / XMP** | `GET /api/v1/images/{id}/export/iptc` — exporte les métadonnées au format IPTC/XMP (standard photographes). | 2h |
|
|
| I-60 | **Import depuis appareil photo (MTP/PTP)** | `POST /api/v1/import/device` — importe directement depuis un appareil photo ou téléphone connecté en USB. | 6h |
|
|
| I-61 | **Plugin WordPress** | Plugin WordPress pour intégrer Imago comme médiathèque externe (remplacement de la bibliothèque média WP). | 8h |
|
|
|
|
### 🧪 Expérimental / Vision Long Terme
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| I-62 | **HDR Merge** | `POST /api/v1/images/hdr-merge` — fusionne plusieurs expositions d'une même scène en une image HDR. | 4h |
|
|
| I-63 | **Panorama Stitching** | `POST /api/v1/images/panorama` — assemble automatiquement plusieurs photos en un panorama. | 6h |
|
|
| I-64 | **Focus Stacking** | `POST /api/v1/images/focus-stack` — combine plusieurs photos avec différentes mises au point en une image nette (macrophotographie). | 5h |
|
|
| I-65 | **Modèle personnalisé (fine-tuning)** | `POST /api/v1/models/fine-tune` — fine-tune un modèle de classification sur les images de l'utilisateur (ex: classifier mes produits, mes plantes). | 12h |
|
|
| I-66 | **Détection d'événements dans une série** | `POST /api/v1/images/timeline/events` — analyse une série d'images horodatées et détecte automatiquement les événements (fêtes, voyages, réunions). | 8h |
|
|
| I-67 | **Storytelling automatique** | `POST /api/v1/images/story` — génère un récit narratif à partir d'une sélection d'images (texte + mise en page). | 6h |
|
|
|
|
---
|
|
|
|
*Total : 67 idées (26 vague 1 + 41 vague 2). À trier, voter et prioriser.*
|
|
|
|
---
|
|
|
|
## 8. Albums & Collections (section dédiée)
|
|
|
|
Les albums sont une feature transverse qui touche au stockage, à la recherche, au partage et à l'IA. Cette section détaille l'écosystème complet.
|
|
|
|
### 📁 CRUD & Structure des Albums
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-1 | **CRUD Albums** | `GET/POST/PUT/DELETE /api/v1/albums` — création, lecture, modification, suppression d'albums. Chaque album a un titre, description, cover, et liste d'images ordonnée. | 4h |
|
|
| A-2 | **Albums imbriqués (Collections)** | Structure hiérarchique : un album peut contenir des sous-albums. `POST /api/v1/albums/{id}/children`. Navigation en arborescence. | 4h |
|
|
| A-3 | **Ajout/Retrait d'images** | `POST /api/v1/albums/{id}/images` (bulk add) et `DELETE /api/v1/albums/{id}/images` (bulk remove). Supporte jusqu'à 1000 images par appel. | 2h |
|
|
| A-4 | **Réorganisation par drag-and-drop** | `PUT /api/v1/albums/{id}/order` — réordonne les images dans un album (tableau d'IDs ordonnés). | 2h |
|
|
| A-5 | **Cover automatique** | L'album prend automatiquement la première ou la plus récente image comme cover. `PUT /api/v1/albums/{id}/cover` pour forcer une cover spécifique. | 1h |
|
|
|
|
### 🧠 Albums Intelligents (Smart Albums)
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-6 | **Smart Albums par critères** | `POST /api/v1/albums/smart` — crée un album dynamique qui se remplit automatiquement selon des règles. Ex: `{"tags": ["chat", "animal"], "date_from": "2024-01-01", "camera": "Sony A7III"}`. | 5h |
|
|
| A-7 | **Smart Albums par similarité visuelle** | Album qui se peuple avec les images visuellement similaires à une image de référence. | 4h |
|
|
| A-8 | **Smart Albums par lieu** | `{"gps_bounds": {"lat1": 45.5, "lng1": -73.6, "lat2": 45.6, "lng2": -73.5}}` — toutes les photos prises dans une zone géographique. | 3h |
|
|
| A-9 | **Smart Albums par personne** | `{"faces": ["person_id_123"]}` — toutes les photos contenant une personne spécifique (nécessite I-4 reconnaissance faciale). | 4h |
|
|
| A-10 | **Smart Albums par période** | `{"taken_at": "2024-06"}` — toutes les photos prises en juin 2024 (vacances d'été automatique). | 2h |
|
|
| A-11 | **Smart Albums par score AI** | `{"ai_confidence_min": 0.9, "tags": ["paysage"], "colors": ["#3366FF"]}` — combine tags, couleurs, et confiance AI. | 4h |
|
|
| A-12 | **Rafraîchissement automatique** | Les smart albums se recalculent périodiquement (configurable: toutes les heures, jours, ou au nouvel upload). Notifications WebSocket quand le contenu change. | 3h |
|
|
|
|
### 🎨 Mise en Page & Présentation
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-13 | **Diaporama / Slideshow** | `GET /api/v1/albums/{id}/slideshow` — retourne une séquence optimisée pour diaporama (transitions, durée par image, ordre). | 3h |
|
|
| A-14 | **Galerie responsive** | Layout adaptatif (masonry, grid, justified) calculé côté serveur pour le client. | 3h |
|
|
| A-15 | **Modes de vue** | Vue grille, vue liste, vue détail, vue carte (pour albums géolocalisés), vue timeline. | 4h |
|
|
| A-16 | **Thèmes d'album** | Appliquer un thème visuel à un album (couleurs, polices) pour la présentation publique. | 2h |
|
|
| A-17 | **Album PDF / Photobook** | `POST /api/v1/albums/{id}/export/pdf` — génère un PDF haute résolution de l'album (mise en page automatique). | 5h |
|
|
|
|
### 🔄 Partage & Collaboration
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-18 | **Partage public** | `POST /api/v1/albums/{id}/share` — crée un lien public avec options: expiration, mot de passe, limite de vues. | 3h |
|
|
| A-19 | **Partage entre clients** | `POST /api/v1/albums/{id}/share/client` — partage un album avec un autre client Imago (lecture seule ou écriture). | 4h |
|
|
| A-20 | **Albums collaboratifs** | Plusieurs clients peuvent ajouter/modifier des images dans un album partagé (avec permissions granulaires). | 6h |
|
|
| A-21 | **Commentaires sur album** | `POST /api/v1/albums/{id}/comments` — les utilisateurs autorisés peuvent commenter un album. | 3h |
|
|
| A-22 | **Réactions / Likes** | `POST /api/v1/albums/{id}/like` — système de likes/réactions pour les albums partagés. | 2h |
|
|
|
|
### 🤖 IA Curation & Assistance
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-23 | **Curation AI automatique** | `POST /api/v1/albums/curate` — l'IA sélectionne les meilleures photos parmi un lot (netteté, composition, doublons, variété). | 6h |
|
|
| A-24 | **Suggestions d'albums** | `GET /api/v1/albums/suggestions` — l'IA suggère des regroupements: "Vacances Italie 2024", "Photos de famille", "Couchers de soleil". | 5h |
|
|
| A-25 | **Titre et description AI** | `POST /api/v1/albums/{id}/generate-metadata` — génère automatiquement un titre et une description pour l'album basé sur son contenu. | 2h |
|
|
| A-26 | **Résumé narratif d'album** | `POST /api/v1/albums/{id}/story` — l'IA génère un récit cohérent à partir des images de l'album (storytelling). | 4h |
|
|
| A-27 | **Détection d'événements** | Analyse une collection et propose automatiquement des découpages en albums par événement (fête, voyage, réunion). | 6h |
|
|
|
|
### 📦 Export & Sauvegarde
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-28 | **Export ZIP** | `GET /api/v1/albums/{id}/download` — télécharge toutes les images de l'album en ZIP (avec métadonnées EXIF/XMP). | 2h |
|
|
| A-29 | **Export vers stockage cloud** | `POST /api/v1/albums/{id}/export/dropbox` — exporte l'album vers Dropbox, Google Drive, S3 externe. | 5h |
|
|
| A-30 | **Export vers réseau social** | `POST /api/v1/albums/{id}/publish/instagram` — publie l'album sur Instagram, Facebook, Flickr. | 6h |
|
|
| A-31 | **Sauvegarde/Archive** | `POST /api/v1/albums/{id}/archive` — crée une archive froide (glacier) de l'album pour conservation long terme. | 4h |
|
|
|
|
### 🏷️ Organisation & Tags d'Album
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-32 | **Tags d'album** | Les albums peuvent avoir leurs propres tags (différents des tags d'image). Ex: "vacances", "2024", "favoris". | 1h |
|
|
| A-33 | **Albums épinglés / Favoris** | `POST /api/v1/albums/{id}/pin` — épingle un album en haut de la liste. | 1h |
|
|
| A-34 | **Tri et filtrage d'albums** | Trier par date, nombre d'images, dernière modification. Filtrer par tag, période, lieu. | 2h |
|
|
| A-35 | **Duplication d'album** | `POST /api/v1/albums/{id}/duplicate` — crée une copie indépendante d'un album (avec ou sans les images). | 2h |
|
|
| A-36 | **Fusion d'albums** | `POST /api/v1/albums/merge` — fusionne plusieurs albums en un seul (avec déduplication). | 3h |
|
|
|
|
### 🔒 Sécurité & Confidentialité
|
|
| ID | Fonctionnalité | Description | Effort |
|
|
|---|---|---|---|
|
|
| A-37 | **Visibilité (public/privé/restreint)** | Niveaux de visibilité : privé (propriétaire seul), restreint (clients spécifiques), public (lien). | 2h |
|
|
| A-38 | **Mot de passe d'album** | Protection par mot de passe pour les albums partagés publiquement. | 2h |
|
|
| A-39 | **Expiration d'album** | `DELETE /api/v1/albums/{id}` avec option `expire_in` : l'album s'auto-détruit après N jours. | 1h |
|
|
| A-40 | **Permissions granulaires** | Par album : qui peut voir, commenter, ajouter, modifier, supprimer (RBAC). | 4h |
|
|
|
|
---
|
|
|
|
*Total général : 107 idées (67 générales + 40 albums).*
|
|
|
|
|
|
|