ungdev / EtuUTT

Site étudiant de l'UTT
http://etu.utt.fr
MIT License
19 stars 14 forks source link

Conservation des données exif dans les images de la gallerie Argentique #273

Closed Alabate closed 2 years ago

Alabate commented 2 years ago

Objectif

Actuellement le système de génération du cache (glide) des images argentique fait qu'on perd toutes les données exif sur les photos affichées. Y compris la date de prise de photo, donc quand les photos sont téléchargées, elles sont classées n'importe comment par les logiciels de galerie (typiquement sur smartphone). Et il n'y a actuellement aucun moyen de récupérer cette information du point de vue de l'utilisateur final.

Etape 1 : Passer à Imagick

La première chose à faire c'est de passer le driver de Glide depuis gd (valeur par défaut) à imagick. gd est en effet incapable de sauvegarder une image avec des données exif, donc peu importe ce qu'on fait il les effacera. Il est possible qu'on ait une différence de performance, mais je ne l'ai pas mesuré. Cependant on reste sur une implé compilées donc ça devrait pas être trop violent non plus je pense.

Les deux driver sont présent dans l'image docker larueli/php-base-image, donc si c'est bien celle là qui est utilisé sur la prod, il n'y aura pas de soucis.

Etape 2 : Eviter de re-créer l'image quand ce n'est pas nécéssaire

Je viens ensuite hériter le Manipulator Encode parce qu'il vient re-créer l'image de zero pour ajouter un fond blanc alors que ça n'a d'interet que lorsque le format d'image source support le transparent. Ce qui n'est pas le cas la plupart du temps pour nous (les photos sont généralement en jpg qui ne supporte pas la transparence). Le fait de re-créer l'image nous faisait perdre les données exif en plus d'avoir probablement un cout en mémoire supplémentaire pour rien.

Une fois la classe Manipulator héritée, on fait hérite ServerFactory pour nous permettre d'utiliser notre nouveau Manipulator. Au passage j'enlève tous les autres Manipulators dont on ne se sert pas.

Les nouvelles images de cache créées auront maintenant leurs données exif conservées. Cependant ça ne sera pas le cas sur les anciennes images pour lesquels nous avons déjà un cache.

Etape 3 : Ajouter une option sur le warmup de cache pour supprimer les anciennes images

Il faudra donc lancer la commande suivante en prod une fois déployé

 ./bin/console etu:argentique:warmup -f

Notes

J'aurais bien aimé ajouter quelques tests, mais de ce que je vois ils sont pas executés et phpunit semble pas installé ? Donc j'ai même pas pu lancer les existants. Si les tests sont actuellement run et que j'ai pas vu, dites moi, j'en rajouterais.

larueli commented 2 years ago

Pour répondre à tes interrogations :

Un grand merci pour ta contribution !