5.3 KiB
Jardin App — Améliorations récentes
Date : 2026-03-22
1. Conversion HEIC → PNG automatique à l'upload
Problème : Les photos prises avec un iPhone sont au format HEIC, non reconnu par les navigateurs web.
Solution : Lors de tout upload de média (route POST /api/media/upload), le backend détecte automatiquement le format HEIC/HEIF et le convertit en WEBP avant stockage.
Fichiers modifiés :
backend/app/routers/media.py— détection par magic bytes + conversion viapillow-heifbackend/requirements.txt— ajout depillow-heiffrontend/src/views/*— inputs file acceptent désormais.heic,.HEIC
Comportement :
- Fichier
.heicreçu → converti en WEBP (même qualité que les autres imports) - Miniature 300 px générée normalement
- Nom de fichier stocké en
.webpdans la base de données
2. Redimensionnement des images de la bibliothèque
Contexte : Le paramètre "Largeur max des photos" dans Réglages s'appliquait uniquement aux nouvelles photos. Les photos déjà importées restaient à leur taille d'origine.
Ajout : Un bouton "Appliquer à la bibliothèque" dans la section Images des Réglages permet de redimensionner rétroactivement toutes les photos existantes.
Règle appliquée : Si la largeur d'une photo est inférieure ou égale au paramètre configuré, elle n'est pas modifiée (pas d'agrandissement).
Fichiers modifiés :
backend/app/routers/settings.py— endpointPOST /api/settings/images/resize-allfrontend/src/api/settings.ts— méthoderesizeAllImages()frontend/src/views/ReglagesView.vue— bouton + feedback avec stats (redimensionnées / ignorées / erreurs)
Endpoint retourne :
{ "ok": true, "redimensionnees": 42, "ignorees": 128, "erreurs": 0 }
3. Sauvegarde Samba (backup réseau)
Contexte : La sauvegarde ZIP existante ne proposait qu'un téléchargement local.
Ajout : Section "Sauvegarde Samba" dans les Réglages permettant d'envoyer automatiquement la sauvegarde vers un partage réseau Windows/NAS.
Paramètres configurables :
| Champ | Exemple |
|---|---|
| Adresse IP / nom du serveur | 192.168.1.10 ou nas.local |
| Partage | Sauvegardes |
| Sous-dossier | jardin/backups |
| Utilisateur | gilles |
| Mot de passe | (masqué) |
Fichiers modifiés :
backend/app/routers/settings.py— endpointPOST /api/settings/backup/samba(génère le ZIP, copie viasmbclientoupysmb)backend/app/models/user_settings.py— cléssamba_*persistées en basefrontend/src/api/settings.ts— méthodesgetSambaSettings(),saveSambaSettings(),backupToSamba()frontend/src/views/ReglagesView.vue— formulaire Samba + bouton "Envoyer la sauvegarde" + feedback
4. Restauration de sauvegarde
Contexte : Il était possible de créer un backup ZIP mais pas de le restaurer depuis l'interface.
Ajout : Bouton "Restaurer une sauvegarde" dans la section Sauvegarde des Réglages.
Deux modes de restauration :
| Mode | Comportement |
|---|---|
| Écraser tout (toggle activé, rouge) | Remplace la BDD entière + écrase tous les fichiers uploads |
| Ajouter uniquement (toggle désactivé, jaune) | Insère les lignes absentes (INSERT OR IGNORE) + copie uniquement les fichiers manquants |
Sécurité :
- Confirmation obligatoire avec
window.confirm()décrivant le mode sélectionné - Message d'avertissement "irréversible" affiché avant action
Technique (mode écraser) :
engine.dispose()— libère les connexions SQLAlchemyPRAGMA wal_checkpoint(TRUNCATE)— vide le WAL SQLite- Copie directe du fichier
.dbdepuis le ZIP
Technique (mode ajouter) :
sqlite3natif —INSERT OR IGNOREtable par table depuis la BDD du ZIPforeign_keys=OFFpendant la fusion pour éviter les conflits de contraintes
Fichiers modifiés :
backend/app/routers/settings.py— helper_merge_db_add_only()+ endpointPOST /api/settings/backup/restorefrontend/src/api/settings.ts— méthoderestoreBackup(file, overwrite)frontend/src/views/ReglagesView.vue— sélecteur ZIP + toggle mode + bouton ♻️ + feedback coloré
Endpoint retourne :
{
"ok": true,
"uploads_copies": 27,
"uploads_ignores": 0,
"db_restauree": true,
"db_lignes_ajoutees": 0,
"erreurs": 0
}
Résumé des endpoints ajoutés
| Méthode | Route | Description |
|---|---|---|
POST |
/api/settings/images/resize-all |
Redimensionne toutes les images de la bibliothèque |
POST |
/api/settings/backup/samba |
Envoie la sauvegarde ZIP vers un partage Samba |
POST |
/api/settings/backup/restore |
Restaure un backup ZIP (écraser ou ajouter) |
Dette technique restante
- Le redimensionnement "bibliothèque" tourne de façon synchrone — pour de très grandes bibliothèques (> 500 photos), envisager une tâche en arrière-plan avec progression SSE.
- La connexion Samba utilise
subprocess+smbclientoupysmb: tester la compatibilité avec les NAS Synology / QNAP. - Après une restauration "écraser", les sessions utilisateurs actives travaillent toujours sur l'ancienne BDD jusqu'au prochain cycle de connexion SQLAlchemy. Un rechargement de page suffit.