MyPhotoShare, une galerie de médias pour le Web pas comme les autres

Posté par  . Édité par Ysabeau, Julien Jorge, Benoît Sibaud et palm123. Modéré par Ysabeau. Licence CC By‑SA.
57
26
oct.
2021
Graphisme/photo

MyPhotoShare est un générateur de site Web statique de galerie de médias (licence GPLv3), à partir d’une arborescence de répertoires contenant des photos et des vidéos. Donc vous prenez ce gros répertoire où vous accumulez toutes ces photos ou vidéos depuis tant d’années, vous exécutez l’indexeur de MyPhotoShare en le pointant vers ce répertoire, et celui-ci vous construit un site Web statique avec lequel vous pouvez montrer vos photos au reste de l’univers…

Mais attention, site Web statique ne signifie pas fonctions limitées ! En effet, MyPhotoShare propose plusieurs fonctions de navigation ou de recherche de vos médias, par mot clé ou par date, par localisation géographique sur une carte. Les métadonnées associées aux médias, soit dans les images JPEG soit dans des fichiers album.ini externes, facilitent la classification ou l’affichage de descriptions. Enfin, des extensions basées sur des réseaux neuronaux permettent d’ajouter l’identification automatique des personnes ou des scènes.

De nouvelles fonctions sont ajoutées très fréquemment à MyPhotoShare qui en est rendu actuellement à la version 5.3.10. Bien que MyPhotoShare soit peu connu, le principal développeur est très dynamique et fait évoluer rapidement l’application ou corrige les bogues qui lui sont remontés. Nous allons vous présenter ce qui différencie MyPhotoShare des autres applications de galerie.

Sommaire

La galerie de démonstration de MyPhotoShare

Comment ça fonctionne ?

Probablement comme tout le monde qui possède un appareil photo numérique ou un téléphone intelligent, vous avez accumulé au fil du temps un nombre incommensurable de photos. Peut-être avez-vous fait le tri de ces photos qui reposent dans de nombreux répertoires, et maintenant vous souhaitez les partager, sur le Web, avec vos amis ou votre famille. Mais vous voulez garder le contrôle sur ces photos et éviter qu’elles soient utilisées par les géants du Web à des fins pas tout le temps humanitaires. Bref, vous voulez les présenter dans une galerie Web, peut-être sur votre petit serveur à la maison ou chez un hébergeur.

Entre en scène MyPhotoShare… Cette application va vous permettre de parcourir l’arborescence des répertoires de photos pour générer un site Web de galerie média. La particularité de MyPhotoShare est que le site Web de la galerie est statique, c’est-à-dire que ce n’est pas une application qui s’exécute sur le serveur Web et qu’il n’utilise pas de base de données. Le programme d’indexation des médias (le scanner de MyPhotoShare) construit tous les fichiers pour l’affichage du site Web à l’avance, qui seront mis en page dans le navigateur Web du visiteur. Vous pouvez imaginer cette opération d’indexation des médias comme la préparation d’un gros cache sur le disque du serveur web. Le serveur web est donc réduit à récupérer et envoyer des fichiers, chose qu’il sait faire de façon efficace, plutôt que d’exécuter du code PHP ou autre pour retrouver l’image à afficher et à la dimensionner pour l’affichage…

Les avantages d’un site Web statique

Comme nous venons de le voir, le premier avantage se situe au niveau de la performance. Puisque tous les éléments constituants la page HTML qui sera affichée dans le navigateur Web sont déjà prêts, le travail du serveur Web se limite à les récupérer sur le disque et à les envoyer au navigateur du visiteur. À titre d’exemple, cette caractéristique me permet d’héberger MyPhotoShare sur un Chromebook qui ne brille pas par sa puissance.

D’autre part, les médias, photos et vidéos, sont rarement modifiés. Donc si une photo est redimensionnée à l’avance pour un affichage sur un téléphone portable, le résultat pourra être réutilisé par tous les visiteurs utilisant leur téléphone intelligent. Il suffit de conserver ce fichier dans un cache. C’est ce dont se charge le scanner de MyPhotoShare. Il prépare tous les fichiers, pour tous les cas de figures. Et comme il y a généralement peu de changements d’une exécution à l’autre, peut-être l’ajout de quelques photos, cette opération s’effectue rapidement, car le scanner ne considère que les fichiers médias nouveaux ou modifiés. En effectuant cette opération de préparation du contenu à un moment où le serveur est moins sollicité, on réserve sa puissance pour les moments achalandés. Globalement, le serveur Web peut accepter plus de sessions simultanées, car il n’exécute pas de code dynamique, contrairement à une galerie écrite en PHP par exemple.

Une autre conséquence de cette façon de procéder est d’améliorer la sécurité globale du serveur Web. En effet, le scanner peut effectuer son travail avec un compte utilisateur qui permet d’écrire sur le disque alors que le compte utilisateur du serveur Web peut être limité uniquement à de la lecture de ces fichiers. En réduisant le périmètre d’attaque du serveur Web et en limitant les tâches qu’il réalise, on s’assure d’une bonne sécurité. Il sera difficile pour un hacker de perturber le fonctionnement de la galerie média.

Quelles sont alors les faiblesses d’un site Web statique ?

Si un site Web statique est à la fois performant et sécurisé, quels sont ses désavantages ? Le principal est qu’il n’est pas aussi dynamique qu’une application Web qui pourrait utiliser toutes les capacités du serveur, avec une base de données et des calculs dynamiques. On ne peut pas avoir le beurre et l’argent du beurre ! Mais dans le cas d’une galerie média, ces possibilités dynamiques ne sont pas nécessaires. D’ailleurs MyPhotoShare offre des fonctions de navigation ou de recherche évoluées sans nécessiter de calculs dynamiques du serveur Web.

Un autre désavantage est que l’utilisateur du site Web ne peut pas pousser d’information vers le serveur. En effet, comme nous l’avons dit, celui-ci est en lecture seule. Il est donc impossible d’y conserver les résultats d’un formulaire Web, ni même de le traiter, car il n’utilise pas de langage tel que PHP ou Python, ou de conserver des informations de l’internaute. Vous cherchiez une galerie qui vous offre le contrôle de vos fichiers, et en plus vous garantissez à vos visiteurs qu’ils ne laisseront pas de traces !

Mais alors, comment ça marche ? Tout se passe dans le navigateur Web…

Comme je l’ai déjà dit, le scanner est un programme d’indexation des fichiers photo et vidéo (les médias) contenus dans les répertoires (les albums). Il crée des fichiers JSON qui sont l’équivalent des fichiers d’index d’une base de données. Lorsqu’un internaute consulte un site MyPhotoShare, son navigateur va charger la page d’accueil de la galerie. Le JavaScript contenu dans cette page va charger, en fonction des actions de l’utilisateur, les fichiers JSON correspondants ainsi que les images nécessaires au rendu de la page. Pour que ça fonctionne, il faut que le scanner ait généré à l’avance tous les fichiers JSON pour toutes les actions possibles !

Et oui, on peut voir cette façon de procéder comme un avantage et un désavantage. Le site statique doit préparer le rendu des pages à l’avance, indépendamment des requêtes des différents visiteurs. C’est vrai qu’il est possible que certaines pages générées à l’avance ne soient jamais affichées et que l’indexeur ait travaillé inutilement, mais si le site est populaire la probabilité que ce travail soit inutile diminue. Au contraire, un serveur dynamique recréerait à chaque fois le contenu d’une page pour tout nouveau visiteur. Le site web statique optimise donc l’effort à court terme (répondre à une requête HTTP) et sur le long terme (préparer le travail et le garder dans un cache permanent). Et comme je l’ai dit précédemment, la fréquence de modification du contenu peut jouer également en faveur ou en défaveur d’un site Web statique, mais dans le cas d’une galerie média, c’est bien souvent un avantage, car les changements sont peu fréquents.

Essayez un site de démonstration

Si vous voulez voir à quoi MyPhotoShare ressemble, il y a quelques sites de démonstration dans les liens de la dépêche.

Le site principal de démonstration, en anglais, a été construit pour tester la version de développement et présenter certaines fonctions de MyPhotoShare. En particulier, vous pouvez utiliser le mot de passe pwd pour afficher et naviguer dans le contenu protégé.

Une version au contenu média identique, mais en français, est hébergée sur mon petit serveur à la maison. Tout comme pour le site principal, le mot de passe pwd dévoilera un album protégé.

Les principales fonctions

MyPhotoShare possède les fonctions classiques auxquelles on pourrait s’attendre d’une galerie moderne, comme l’affichage des médias aussi bien sur un ordinateur qu’une tablette ou un téléphone mobile. Je vais plutôt présenter les fonctions qu’on ne s’attendrait pas à trouver sur un site Web statique.

Pourquoi gérer des métadonnées ?

Les métadonnées ajoutent de l’information aux photos et vidéos conservées. Certaines métadonnées techniques sont injectées automatiquement par l’appareil photo dans les zones EXIF, IPTC ou XMP des fichiers JPEG, telles que la résolution de l’image, l’ouverture de l’objectif, la date de la capture ou les coordonnées GPS de la prise de vue. L’utilisateur peut ajouter d’autres métadonnées descriptives en donnant un nom significatif au fichier JPEG, ou en éditant les zones EXIF.

MyPhotoShare va extraire les métadonnées des fichiers médias, mais va également permettre à l’utilisateur de définir des métadonnées dans des fichiers album.ini qui sont placés dans les répertoires de photos et vidéos. Ces fichiers album.ini permettent d’y définir de nouvelles métadonnées descriptives ou techniques, sans toucher aux fichiers originaux. En effet, les métadonnées provenant de l’album.ini ont priorité sur celles présentes dans le JPEG. Si par exemple, je numérise en 2021 une diapositive prise en 1978, je peux préciser dans le fichier album.ini la véritable date de la prise de vue. Je peux également y ajouter une description avec une mise en forme HTML que MyPhotoShare peut ou non afficher, suivant les désirs du visiteur du site Web.

En dehors de ne pas avoir à modifier les fichiers médias originaux, l’avantage des fichiers de métadonnées album.ini est qu’ils sont associés aux répertoires (les albums) et donc que l’on peut les transférer lorsqu’on recopie le répertoire. En plus, ils sont éditables avec un simple éditeur de texte et ils peuvent donc être enrichis facilement sans nécessiter d’autre logiciel ou d’éditeur d’image. Enfin, ils ouvrent la porte à l’ajout d’information automatique à partir d’autres outils, sans risquer de perdre les photos originales, ce dont je parlerai un peu plus loin.

Dans le futur, j’espère que les fichiers album.ini permettront de changer le fonctionnement du scanner en fonction des informations qu’ils contiennent. Actuellement, les paramètres de l’indexeur sont définis dans le fichier de configuration, par défaut dans /etc/myphotoshare/myphotoshare.conf et ces paramètres s’appliquent pour l’ensemble de l’arborescence des albums. On peut imaginer qu’il sera possible de modifier localement ces paramètres, dans le cadre d’un répertoire contenant un fichier album.ini, afin d’avoir une couleur de page Web différente ou pour afficher automatiquement les descriptions…

MyPhotoShare utilise les métadonnées dans de nombreuses fonctions :

  • navigation par type de métadonnée ;
  • recherche de contenu média ;
  • affichage ou non des métadonnées.

Navigation dans les médias

Les médias sont disposés dans des répertoires sur le disque du serveur. Naturellement, MyPhotoShare traduit ces répertoires en albums et en propose l’affichage. Mais il ajoute des répertoires virtuels qui enrichissent la navigation dans les photos. Ainsi, MyPhotoShare offre un affichage des médias dans des albums triés par date: année, mois et jour. Il est également possible d’afficher les médias par dans des albums répartis par emplacement géographique: pays, région ou province, ville.

Sur ce dernier point, la navigation par carte, accessible en cliquant sur l’icône d’épingle, permet d’afficher les photos suivant les lieux.

Affichage de la carte avec les photos

Les résultats de recherche sont également regroupés dans un album virtuel. Et il est aussi possible de combiner plusieurs albums. Par exemple, sélectionner une région sur la carte pour ensuite afficher les photos correspondant aux résultats d’une recherche par mot clé.

La recherche de contenu média

Retrouver une photo parmi toutes celles accumulées depuis des années s’avère souvent une tâche difficile. La navigation temporelle de MyPhotoShare va permettre de retrouver la photo du mariage du cousin Émile, mais encore faut-il se souvenir de la date du mariage ! Heureusement que les appareils photos numériques incluent automatiquement la date de prise de vue dans les fichiers JPEG… De même, on pourra essayer de retrouver la photo d’Émile en navigant par emplacement géographique, si le téléphone portable a consigné les coordonnées GPS dans les métadonnées, ou si celles-ci ont été ajoutées ultérieurement.

Si le propriétaire a enrichi sa collection de médias de métadonnées descriptives, au minimum en nommant les fichiers médias ou les répertoires, idéalement en renseignant les champs de métadonnées EXIF ou ceux des album.ini, MyPhotoShare va utiliser ces informations pour permettre des recherches textuelles par mot clé.

Les options de recherche texte

Il peut paraître étonnant qu’un site Web statique propose des options de recherche telles que la recherche partielle dans les mots, ou sans tenir compte de l’accentuation. MyPhotoShare supporte également d’affiner les recherches en les combinant. Si avec ça on ne retrouve pas Émile dans son costume trois pièces !

Personnaliser l’affichage

Chaque visiteur de la galerie peut personnaliser l’affichage suivant son goût. MyPhotoShare dispose d’options de base :

Les options d’affichage de l’interface utilisateur

  • Présentation des albums et médias :
    • ordre de tri de l’affichage, par date ou par nom, en sens croissant ou décroissant ;
    • ordre de tri des médias, par date ou par nom, en sens croissant ou décroissant ;
    • offichage du titre et du chemin d’accès à l’album ;
    • nombre de médias dans l’album et les sous-albums ;
    • vignettes carrées ou dans la proportion originale ;
    • afficher le nom du fichier média ;
    • afficher les descriptions ;
    • afficher les étiquettes ;
    • encadrer les vignettes pour les présenter comme des diapositives ;
    • espacer l’affichage des vignettes.

Les choix de l’utilisateur sont conservés dans un cookie qui lui permettra de retrouver ses préférences lors des visites ultérieures.

Bien sûr, le propriétaire du site Web va définir des options d’affichage globales dans le fichier de configuration myphotoshare.conf, telles que la couleur de fond de page, la langue d’affichage par défaut ou la taille des vignettes, etc.

Pour le moment, l’affichage est relativement figé: une galerie MyPhotoShare ne se distinguera pas tellement d’une autre galerie MyPhotoShare. On y trouve soit des albums, soit une planche contact de médias, soit une photo principale et un ruban. J’aimerais que MyPhotoShare évolue, dans le futur, pour pouvoir organiser l’affichage par album, pour que ceux-ci soient le support visuel d’une histoire…

Partager des photos

Vous avez enfin retrouvé les photos du cousin Émile ! Il ne reste plus qu’à effectuer une sélection où l’oncle Robert apparaît et les lui envoyer. MyPhotoShare vous permet de sélectionner des médias. Avez-vous remarqué la boite à cocher dans les vignettes de médias, au coin bas gauche, des captures d’écran précédentes ? Il suffit de cliquer sur cette boite pour ajouter le média correspondant à la sélection. Ou bien de sélectionner tous les médias affichés en utilisant le menu. Ou encore sélectionner tous les résultats d’une recherche…

Une fois que tous les médias ont été ajoutés dans votre sélection, MyPhotoShare vous permet de les télécharger. L’application construit un fichier Zip que vous pouvez sauvegarder sur votre ordinateur. Avant de recevoir le fichier Zip, on peut sélectionner les types de fichiers (photos et/ou vidéos) et si la sélection doit intégrer les sous-albums.

Mais peut-être préférez-vous partager un lien dans un courriel ou sur une plateforme sociale ? Les icônes de partage, affichés sur le bord gauche de la galerie, servent justement à ça. Si vous cliquez sur l’enveloppe, votre client de messagerie construit un courriel avec le lien de la page courante. De même, en cliquant sur le [f], vous pourrez partager les médias de la page courante sur Facebook. S’il s’agit d’un album, MyPhotoShare construit une vignette mosaïque avec le contenu.

Ces fonctions de partage social ont donné à la galerie son nom …Share. Elles sont les seules requiérant l’utilisation de PHP par le serveur Web, et qui font que la page d’accueil soit index.php. Si ces fonctions ne vous sont pas utiles, vous pouvez utiliser la version statique index.html.

Les sites de partage social, affichés par leur icône, sont paramétrables dans le fichier de configuration myphotoshare.conf du site. Ceux affichés dans les captures d’écrans sont ceux par défaut. Il faut parfois publier quelques photos sur les gros sites sociaux pour rappeler aux internautes que le Web existe en dehors de Facebook…

Des fonctions avancées

De base, si OpenCV est installé sur le serveur, alors le programme d’indexation scanner l’utilisera pour déterminer si un visage apparaît sur une photo et s’arrangera pour centrer le visage lors de la préparation de la vignette. C’est plus pratique d’avoir des vignettes où l’on reconnaît immédiatement qui s’y trouve!

Reconnaissance des visages

J’ai développé deux extensions pour ajouter des fonctions avancées à MyPhotoShare. La première est la reconnaissance des visages. À partir de répertoires contenant des photos et des fichiers album.ini qui identifient des personnes sur ces photos, le script Python mps_autofaces va apprendre à reconnaître ces personnes à l’aide d’un réseau de neurones. Puis il va re-parcourir l’arborescence des albums et des photos, et modifier les métadonnées des fichiers album.ini pour y ajouter le nom des personnes qui apparaissent sur les photos.

Les résultats produits par cette extension sont époustouflants. J’ai parfois du mal à reconnaître une personne sur une photo, mais mps_autofaces est capable de l’identifier s’il l’a déjà apprise. Comme expliqué sur la page Gitlab du projet en anglais, j’utilise un répertoire contenant des photos de portraits ou des photos d’identité, afin que l’apprentissage du réseau de neurone soit facilité. Mais même avec une seule photo d’un individu, cette extension est capable de reconnaître cette personne dans des contextes variables ou à des âges différents.

Bien sûr, les grands sites d’hébergements de photos ou des réseaux sociaux ont des fonctions similaires, probablement plus performantes que mps_autofaces car celles-ci doivent pouvoir reconnaître des personnes que vous ne connaissez même pas! Mais je préfère garder le contrôle de mes photos et de l’utilisation de mon image personnelle.

Reconnaissance de scènes

La deuxième extension s’attaque à la reconnaissance des scènes et des objets dans les photos. Le principe est le même que pour la reconnaissance des individus: le programme entraîne un réseau de neurones à reconnaître des objets et des situations à partir d’une base d’images d’apprentissage. J’utilise les collections d’images de Visual Genome et MS COCO pour cette opération. Ces bases d’images contiennent à elles deux plus de 400 000 images exemples annotées décrivant les scènes et les objets présents. Ce jeu d’apprentissage est amélioré par diverses techniques, par exemple, en appliquant un effet miroir aux images pour doubler le nombre d’exemples d’apprentissage. Comme la phase d’apprentissage est très longue, de multiples sauvegardes du réseau de neurones sont réalisées.

Une fois que le réseau de neurones fournit de bons résultats de reconnaissance sur les images de test, il peut appliquer ses connaissances sur le contenu des albums de MyPhotoShare avec la commande mps_autoscenes. Ce script modifie également les fichiers album.ini pour y ajouter les étiquettes correspondantes aux objets ou scènes reconnues automatiquement.

Comme MyPhotoShare propose une interface utilisateur dans plusieurs langues (actuellement le français, l’italien, l’anglais et l’espagnol), il était nécessaire que les étiquettes automatiques des objets et scènes soient dans la langue du site Web. Ceci est rendu possible par l’utilisation de la base lexicale WordNet qui permet une traduction des concepts, à partir de l’anglais qui a servi pour les annotations, vers la langue du site.

Malheureusement, même avec des centaines de milliers d’exemples, et plusieurs jours d’apprentissage sur mes ordinateurs personnels, les résultats ne sont pas au même niveau que la reconnaissance des visages. mps_autoscenes est capable de reconnaître de nombreux objets (des fleurs, des animaux, des véhicules ou des personnes, etc.) dans mes photos. Il ne commet pas d’erreur d’interprétation dans environ 50% des cas, ce qui signifie que dans les 50% restants, il confondra le portrait du cousin Félicien avec une cafetière! Je ne dispose pas des moyens nécessaires pour améliorer ces résultats pour le moment. Et comme MyPhotoShare ne dispose pas encore d’une fonction de recherche avec pondération dans les étiquettes, je suis obligé de réviser manuellement les étiquettes automatiques ajoutées par mps_autoscenes.

Et des tas d’autres fonctions…

MyPhotoShare possède de nombreuses autres fonctions sur lesquelles je ne m’étendrai pas. Regardez la liste complète sur le site Gitlab du projet. On notera :

  • la navigation dans la galerie peut s’effectuer entièrement au clavier, mais une souris à roulette améliore l’expérience utilisateur ;
  • la galerie fonctionne aussi bien sur un grand écran d’ordinateur que sur celui d’un téléphone portable ;
  • la protection d’album ou de certaines photos par un mot de passe personnalisable. Deux visiteurs peuvent voir des contenus différents… ;
  • l’affichage en plein écran et l’agrandissement d’une photo sans limite ;
  • les images s’affichent à l’écran avec une animation fluide. Elles sont préchargées par le navigateur pour offrir une bonne réactivité, même avec de nombreuses images ;
  • les fichiers d’images sont redimensionnés dans le cache pour optimiser la résolution d’affichage en fonction de la plateforme, et, évidemment, améliorer la performance lors de l’affichage dans le navigateur ;
  • et, bien sûr un générateur de paquet Debian/Ubuntu pour faciliter l’installation et les mises à jour du serveur !

Techniquement

Tout cela est bien beau, mais est-ce que ça va fonctionner sur ma machine ?

Installation sur le serveur Web

S’il s’agit d’un ordinateur qui roule Debian ou Ubuntu, le plus simple est d’utiliser un paquet d’une livraison récente qui se chargera de vérifier les dépendances. Si la toute dernière version de MyPhotoShare n’est pas encore disponible empaquetée, construisez vous-même le paquet en anglais.

Sinon si votre ordinateur carbure avec Linux ou un système assimilé, la procédure d’installation en anglais vous guidera pas-à-pas pour y installer les logiciels et modules nécessaires et vous indiquera même comment configurer votre serveur Web.

Nous n’avons jamais essayé d’installer MyPhotoShare sur un ordinateur Windows. Si vous tentez l’expérience, partagez vos résultats ! MyPhotoShare est programmé principalement en Python, donc techniquement ce ne devrait pas être impossible…

Performance

MyPhotoShare a fait le choix de générer un site Web statique plutôt que d’utiliser du code serveur en PHP ou en Python. Cette décision, prise il y a de nombreuses années par l’auteur initial, s’est avérée un bon choix. Ainsi la galerie est capable de fonctionner même sur de très petits serveurs économes en puissance électrique. C’est à vous, propriétaires de Raspberry v1 ou Cubox-i qui dorment inutilisés sur des étagères, auxquels je parle !

Voici quelques chiffres tirés des tests de Paolo Benvenuto, le développeur principal qui maintient et améliore MyPhotoShare.

Performance du scanner

À titre de comparaison, sur un PC de bureau, avec les albums de médias sur une partition NAS :

  • indexer une arborescence de 692 photos, pour un total de 2,3 Go, en mettant en œuvre la détection de visages, prend environ 700 secondes (environ 1 s/média). La détection de visage dans la préparation des vignettes prend environ 267 ms/photo quant-à elle ;

  • la réindexation d’une collection de 36 000 fichiers médias pour un total de 87 Go dure environ 14 minutes (20 ms/média; 50 médias/s) lorsque les sommes de contrôle ne sont pas utilisées. Le temps d’exécution passe à 90 minutes (110 ms/média; 9 média/s) si les sommes de contrôle sont activées ;

  • scanner 40 000 photos et moins de 100 vidéos, pour la première fois, dure environ 5 heures avec les sommes de contrôle activées.

La conversion des vidéos prend beaucoup plus de temps que celle des photos, d’autant plus que leur durée est grande.

Consommation mémoire

L’indexation de 45 000 médias nécessite 1,5 Go/2,1 Go de mémoire vive/virtuelle.

Code JavaScript

Le code JavaScript est optimisé et la galerie gère facilement 40 000 médias.

Cependant, si un album contient plus de 1000 photos, il faut s’attendre à quelques lenteurs d’affichage. Malgré tout, la galerie reste utilisable.

Taille du cache

Bien sûr, la performance se paie au prix de l’espace disque utilisé par le cache. Nous avons essayé de le garder dans des limites raisonnables. Le ratio de la taille du cache par rapport à la taille des albums originaux dépend de nombreux facteurs tels que le nombre de tailles d’images intermédiaires que vous désirez (voir l’option reduced_sizes dans le fichier de configuration) et des options de transcodage vidéo (voir video_preset par exemple), ou bien sûr de la durée des vidéos. Il faut noter que ces chiffres ont été obtenus alors que le scanner était configuré pour créer trois images de tailles différentes, alors que la configuration par défaut actuelle se limite à deux images.

Site Nombre de médias Taille des albums Taille du cache Ratio cache/albums
Démo AlternaTV 95 images 675 Mo 116 Mo 17%
Site de production #1 14k médias dont 20 vidéos 95 Go 25 Go 26%
Site de production #2 20k médias dont 439 vidéos 92 Go 66 Go 77%
Site de production #3 26k médias dont 430 vidéos 232 Go 82 Go 35%

Une feuille de route pour le futur

MyPhotoShare est une branche de PhotoFloat, galerie développée par Jason A. Donenfeld, vers 2016, lorsque son auteur a arrêté de le développer. La branche a été enrichie par Jerome Charaoui pour supporter les vidéos, avec les contributions de Paolo Benvenuto et de Pierre Métras. Paolo en est maintenant le développeur principal, l’enrichissant de nouvelles fonctions au fil des versions.

Les idées ne manquent pas pour améliorer le logiciel. Ce sont plus les ressources et le temps de les mettre en œuvre qui font défaut. Si vous cherchez un projet en source ouvert pour occuper quelques soirées, n’hésitez pas à indiquer votre intérêt sur le Gitlab du projet ou dans les commentaires de la dépêche. Voici quelques sujets tirés de ma boite à idées :

  • Permettre la recherche de photos similaires en effectuant du hachage perceptuel (Perceptual hashing). Le scanner calcule déjà un hachage pour détecter les modifications dans les albums entre deux exécutions; il suffirait d’ajouter au code Python celle pour le hachage perceptuel des images, et de conserver les résultats dans un fichier JSON. Ensuite, il faudrait un peu de code JavaScript pour ajouter l’option de menu correspondante.

  • Ajouter d’autres langues à l’interface utilisateur. Une traduction en bulgare est en cours, mais l’ajout de l’allemand ou du portugais, ou des langues asiatiques permettrait de toucher un public plus large. Le dictionnaire des messages se trouve dans un fichier JavaScript qu’il est facile d’enrichir avec de nouvelles traductions. Je peux vous indiquer comment procéder ; il suffit de savoir utiliser un éditeur de texte et de maîtriser une langue.

  • Peaufiner la feuille de style CSS pour moderniser l’affichage par défaut de la galerie. Offrir plus d’options au propriétaire du site de créer une présentation qui se démarque.

  • Idéalement, comme écrit ci-dessus, chaque album pourrait devenir le support d’une histoire en images, en sortant du modèle linéaire de la pellicule qui liste les médias au bas de l’écran. Mais on pourrait également imaginer des fichiers story.ini qui regroupent des médias tirés de plusieurs albums pour construire une trame narrative. Ce type d’affichage pourrait être utilisé pour présenter un voyage dont les photos sont réparties sur plusieurs albums, ou l’histoire d’une personne pour une page de généalogie…

  • Ajouter un tatouage numérique ou une signature lors de l’indexation et de la création du cache d’images.

  • Permettre aux visiteurs de la galerie d'identifier les meilleures photos. La qualité d’une photo est subjective et pas forcément partagée entre son auteur et celui qui la contemple, mais certains photos se démarquent et il faut pouvoir les mettre de l’avant dans l’accumulation des fichiers que nos gadgets numériques génèrent…

L’avenir de MyPhotoShare est donc devant nous, tant qu’on ne se retourne pas comme disait Pierre Dac. Comme cette galerie est à code source ouvert sous licence GPLv3, vous aussi pouvez y contribuer. Une première étape serait de l’essayer et de partager vos photos sur le Web.

Aller plus loin

  • # Des loutres !

    Posté par  (site Web personnel) . Évalué à 1.

    Tu as oublié d'indiquer la meilleure des fonctionnalités : ça affiche des photos de loutres !

    Sinon une petite critique : je me dis que ce serait quand même mieux en essayant d'aligner/espacer un peu les photos (avec un alignement par le haut sans doute, ce sera jamais parfait mais je pense que ça sera plus lisible) : https://myphotosharedemo.qumran2.net/#!/_f-chenal_du_moine .

    • [^] # Re: Des loutres !

      Posté par  . Évalué à 4.

      La présentation générale de la page est définie par le propriétaire du site. Pour les sites de démonstration, nous avons laissé les défauts du fichier de configuration, qui peuvent être changés mais de manière limitée. Comme je l'ai écrit, la mise en page pourrait être largement améliorée. Mais il faut maîtriser les feuilles de style CSS, et ce n'est pas le cas pour moi.

      Les visiteurs disposent aussi de quelques options d'affichage dans le menu hamburger en haut à droite de la page.

  • # Quelques soucis

    Posté par  (site Web personnel) . Évalué à 6.

    Le projet me plaît bien mais je n'ai pas encore pu générer ma galerie. Pourtant j'ai essayé !

    J'ai installé la 5.3.10 via le paquet Debian. Premier souci, mineur, en éditant /etc/myphotoshare/myphotoshare.conf pour indiquer le chemin vers ma galerie. Le fichier commence avec ce commentaire :

     Do not modify this file:
     # * copy it to any location on your disk (e.g. /etc/myphotoshare) and rename it removing the trailing .defaults"
     # * then, in _your_ copy:
     # * - […]
    

    Du coup j'ai copié le fichier comme indiqué, mais en fait il ne fallait pas. Je suppose que ce commentaire concerne le fichier de l'archive source, auquel cas il faudrait l'enlever du paquet Debian.

    Deuxième souci, myphotoshare_scanner plante ligne 1058. En effet, lowercase_stopwords est un dict et ne peut donc pas être soustrait à un set. Tu vas me dire, ce genre d'erreur de typage, relevée le plus tardivement possible, en prod sur le poste du client, c'est tout l'intérêt des langages interprétés ; mais tu digresse là :)

    Je corrige le script et relance la commande sur ma bibliothèque. 13 000 fichiers dont un millier de vidéos. C'est plutôt long (je le lance sur un eeepc, un double cœurs à 1,66 GHz avec 1 Go de RAM et un disque SSD). Ça plante au bout de 21 heures car une des images est tronquée. Je relance, et j'ai l'impression que le script reprend de zéro :/

    Si je peux me permettre quelques suggestions d'amélioration, ce serait pratique si le script était plus résistant aux erreurs et s'il pouvait être interrompu et reprendre là où il s'est arrêté. Si en plus le site pouvait se mettre à jour au fur et à mesure du scan, ça serait top.

    J'espère que le second scan sera bon car le projet a l'air vraiment super :)

    • [^] # Re: Quelques soucis

      Posté par  . Évalué à 3. Dernière modification le 26/10/21 à 21:48.

      Tout d'abord concernant le commentaire dans /etc/myphotoshare/myphotoshare.conf, je vais regarder comment l'enlever. Ce fichier est copié directement depuis le modèle myphotoshare.conf.defaults, qui comme son nom l'indique est un modèle. En fait, le constructeur de paquet Debian utilise directement une copie de ce fichier et je ne m'étais jamais rendu compte de l'existence de ce commentaire. J'en prends note.

      Pour le plantage de myphotoshare_scanner, je vois qu'il vient d'être remonté sur le Gitlab du projet. Je fais confiance à Paolo Benvenuto qui maintient le code pour le corriger rapidement.

      Concernant la possibilité d'interrompre le travail du scanner, bonne nouvelle car Paolo vient de l'implanter dans la version de développement aujourd'hui et il faudra que je teste la correction. Je l'attendais également depuis si longtemps…

      Je serais toi, j'interromprais le scan en cours pour essayer la nouvelle version de développement car l'indexation de plus de 10000 photos sur une petite machine prend beaucoup de temps la première fois pour créer le cache. La version de développement qui permet d'y aller incrémentalement évitera d'avoir à recommencer à zéro à chaque fois.

      Si le scanner plante à cause d'un mauvaise fichier image, il faudrait également le remonter dans les tickets du projet pour attraper ces types d'erreur.

      • [^] # Re: Quelques soucis

        Posté par  . Évalué à 4.

        Paolo Benvenuto vient de proposer d'ajouter une option par défaut pour sauvegarder les fichiers d'index JSON après le traitement de chaque album de photos. Le scanner sera un peu plus lent mais il sera résilient aux plantages. Il suffira de le relancer, après la correction de l'erreur, pour que le processus d'indexation reprenne là où l'erreur était survenue.

        J'ai oublié de préciser dans ma précédente réponse que pour pouvoir utiliser l'indexation incrémentale dans la version de développement, il faut définir le paramètre max_scanner_duration et lui donner une durée d'exécution maximale. Cette option est utile pour éviter que le processus ne fonctionne plus de 24 heures sur une petite machine. Elle permet d'y aller par tranches horaires.

        Le changement de sauvegarde intermédiaire que propose d'ajouter Paolo sera plus utile au cas où l'indexation plante en cas d'erreur.

  • # Gestion des thèmes

    Posté par  (site Web personnel) . Évalué à 7.

    Ça a l'air plutôt sympa et je met ça dans ma todolist à tester. Mon logiciel de galerie photo n'est plus maintenu et il va finir par avoir besoin d'un remplaçant.

    Petite remarque sur l'aspect css : pour le moment il n'y a qu'un seul thème et la hiérarchie fait qu'on ne peux pas vraiment envisager plusieurs thèmes. Ça peut être intéressant de faire évoluer ça, pour que par la suite des dev css puissent proposer des thèmes variés et que ce soit simple à tester par des gens qui ne touchent pas trop au code (on sélectionne le thème et hop ! ça s'affiche). C'est aussi pratique dans le cas où on veut laisser le visiteur choisir son thème : c'est du confort un peu gadget mais c'est sympa.

    Concernant les types de vue, c'est vraiment sympa, la base est très bonne. Lorsque je l'installerais sur mon serveur, je sais que je vais bidouiller pour arriver à avoir une vue en "mur de brique" (un peu comme ce qu'on trouve sur Pinterest), parce que j'utilise ce genre de logiciel pour stocker des inspirations visuelles et que ça correspond bien à certains moments de travail. Peut-être que cela peut faire partie des pistes de features : permettre de choisir des dispositions différentes pour afficher les photos (en ligne, en mur…).

    • [^] # Re: Gestion des thèmes

      Posté par  . Évalué à 2.

      Comme je l'ai écrit dans la dépêche, nous ne sommes pas très forts en HTML/CSS, ce qui réduit les possibilités de thèmes d'affichage que MyPhotoShare propose actuellement. Mais c'est vraiment quelque chose qui m'intéresserait d'avoir également.

      Le mieux serait d'ouvrir un ticket pour expliquer les limitations du code actuel (comment le restructurer) et nous donner des pistes sur comment le réaliser.

    • [^] # Re: Album photo à l'abandon

      Posté par  (site Web personnel) . Évalué à 1.

      Salut, quel est cet ancien moteur plus maintenu?

      Il y a une quinzaine d'années j'ai fait des scripts Bash pour générer des galleries HTML, surtout dans le but de les mettre sur CD.

      Concernant MyPhotoShare, je n'accroche pas du tout au code HTML choisi pour être généré, je le trouve trop moderne.

      • [^] # Re: Album photo à l'abandon

        Posté par  (site Web personnel) . Évalué à 5.

        Photoshow : le projet continue d'intéresser du monde vu les pull requests et les issues, mais il n'y a pas eu de modif depuis quelques années. Ça répond encore à mes besoins en l'état mais à un moment ça risque de craquer avec les nouvelles versions de PHP. Et autant je peux bidouiller un peu de CSS à l'occasion, autant je n'ai pas les compétences pour me plonger plus avant dans le code. Il est tout de même très accessible, j'ai réussi à lire une bonne part du code.

        Sur mon usage : j'ai un dossier sur mon ordi, synchronisé via Syncthing avec un serveur, que Photoshow affiche alors en ligne. Ça marche bien, y'a même pas de cron à paramétrer mais par contre le cache semble moins efficace que ce que propose MyPhotoShare.

        Je viens de jeter un œil sur le code HTML de MyPhotoShare, je ne sais pas si c'est moderne mais il y a en effet des bizarreries :D Par exemple pourquoi il y a la balise "style" dans les éléments, sur les sites de démo ? C'est un souci de design, ça rends toute intervention sur les feuilles de style inutiles. À partir du moment où on appelle une feuille de style CSS, il ne doit plus y avoir de balises du type . Maintenant le plus pertinent serais effectivement de contribuer… Mais entre mon niveau d'anglais à ras des pâquerettes, mon temps plus que limité et le fait que je ne suis vraiment pas assez compétente pour comprendre quand ces styles sont générées, ça va être laborieux.

        • [^] # Re: Album photo à l'abandon

          Posté par  . Évalué à 5.

          Je viens de jeter un œil sur le code HTML de MyPhotoShare, je ne sais pas si c'est moderne mais il y a en effet des bizarreries :D Par exemple pourquoi il y a la balise "style" dans les éléments, sur les sites de démo ? C'est un souci de design, ça rends toute intervention sur les feuilles de style inutiles. À partir du moment où on appelle une feuille de style CSS, il ne doit plus y avoir de balises du type.

          Suite à ton commentaire, j'ai ouvert un billet sur le Gitlab du projet et Paolo a déjà effectué la correction dans la branche development.

          Maintenant le plus pertinent serais effectivement de contribuer… Mais entre mon niveau d'anglais à ras des pâquerettes, mon temps plus que limité et le fait que je ne suis vraiment pas assez compétente pour comprendre quand ces styles sont générées, ça va être laborieux.

          Si tu veux, tu peux ouvrir des tickets en français et je peux me charger de les traduire en anglais pour que Paolo puisse intervenir, si nécessaire. Comme je l'ai écrit, la mise en page HTML/CSS n'est pas notre matière forte et savoir quelles sont les fonctions qui intéressent les utilisateurs et des pistes sur leurs attentes et comment les implémenter, nous aiderait à définir la feuille de route de MyPhotoShare.

  • # Ca peut se faire aussi avec jekyll

    Posté par  . Évalué à 1. Dernière modification le 27/10/21 à 17:26.

    Je m'étais fait le mien avec Jekyl et un script bash.

    Le script bash :
    - parcourait le répertoire contenant les photos
    - générait les fichiers markdown avec l'entête yaml (en fait j'automatise une entrée de blog par image)
    - générait les miniatures pour les pages de navigation

    Ensuite compilation du site avec jekyll.

    J'ai pas toutes les fonctionnalités de myPhotoshare, mais tout dépend des templates (la cartographie et le diaporama sont assez simples à mettre en place)

  • # Déploiement sur un hébergement mutualisé?

    Posté par  . Évalué à 1.

    Bonjour et merci pour cette dépêche très complète.
    Si je comprends bien le fonctionnement, le scanner va générer un site web statique en local sur la machine qui exécute le programme.
    À partir de là, est ce que je peux simplement transférer un dossier contenant ce site via rsync / ftp / ssh sur mon hébergement mutualisé (sur lequel je n'ai pas la main pour installer MyPhotoShare) ?

    • [^] # Re: Déploiement sur un hébergement mutualisé?

      Posté par  . Évalué à 3.

      Théoriquement, oui.

      Je réponds en utilisant cet adverbe car je ne l'ai jamais testé. J'ai même ouvert un billet pour demander que MyPhotoShare soit complètement portable, sans serveur Web. Et c'est quelque chose que je voudrais explorer mais je n'ai pas eu le temps.

      En fait, je viens de l'essayer rapidement en déplaçant le site de démonstration dans un autre répertoire et mes tests rapides montrent que ça fonctionne (Ouf!)

      Si vous voulez essayer l'opération, voici les répertoires et fichiers qui doivent se retrouver sur le serveur de l'hébergeur, dans le répertoire du site Web:

      albums                              # Les photos originales
      cache                               # Le cache généré par le scanner de MyPhotoShare
      css                                 # Provient de myphotoshare/web/css
      fonts                               # Provient de myphotoshare/web/fonts
      .htaccess                           # Provient de myphotoshare/web/.htaccess
      img                                 # Provient de myphotoshare/web/img
      index.html                          # Provient de myphotoshare/web/index.html
      index.php                           # Provient de myphotoshare/web/index.php
      js                                  # Provient de myphotoshare/web/js
      

      Le fichier .htaccess est utilisé par Apache et doit probablement être adapté pour un autre type de serveur.

      Peut-être faut-il vérifier que le paramétrage du fichier myphotoshare.conf qui est utilisé par le scanner corresponde à l'arborescence du serveur Web final. En particulier, dans les paramètres index_html_path, album_path et cache_path, mais je ne suis pas certain qu'ils sont utilisés par le JavaScript.

      Enfin, si le serveur Web est purement statique, sans support de PHP, il y a 3 fonctions optionnelles de MyPhotoShare qui ne fonctionneront pas:

      • Le partage sur les réseaux sociaux: les icônes qui s'affichent à la gauche de l'écran dans les captures (configuration social).
      • La possibilité pour l'internaute de demander au propriétaire du site Web de lui envoyer un mot de passe pour voir les photos ou dossiers protégés (configuration request_password_email).
      • La possibilité pour l'internaute d'envoyer au propriétaire du site le géo-positionnement d'une photo (configuration user_may_suggest_location = true).

      Dans ce cas, il faut utiliser la page d'accueil index.html plutôt que index.php.

      Merci de nous tenir au courant si ça fonctionne ou si vous rencontrez des problèmes. Nous vous aiderons à les résoudre.

      • [^] # Re: Déploiement sur un hébergement mutualisé?

        Posté par  . Évalué à 2.

        Merci. Je suis en réflexion pour remplacer piwigo qui ne me convient pas, et comme j'ai yunohost qui tourne sur un raspberrypi ce projet pourrait me tenter (j'aime beaucoup le côté simple et minimaliste).
        J'essaie de tester à l'occasion!

  • # Alléger l'interface

    Posté par  . Évalué à 1.

    Y-a-t-il moyen de désactiver les cases à cocher, les boutons +-, les flèches sur les côtés, les boutons de partage ? Je les trouve envahissant, surtout sur téléphone en plein écran j'aimerais que l'interface se cache pour laisser toute la place à la photo et ne s'affiche que si l'on tape quelque part.

    • [^] # Re: Alléger l'interface

      Posté par  . Évalué à 2. Dernière modification le 02/11/21 à 17:16.

      Actuellement, non. Je trouve également que l'interface utilisateur est un peu trop intrusive mais je n'ai pas réussi à convaincre Paolo Benvenuto. Il y a déjà beaucoup d'améliorations avec la version actuelle (le menu est plus organisé, les icônes plus petits) mais on pourrait faire mieux.

      J'ai ouvert plusieurs billets il y a quelques mois pour commencer la réflexion mais il faut croire que Paolo n'en ressent pas le besoin de son côté. Et comme je l'ai dit, l'ergonomie HTML/CSS n'est pas notre point fort et toute contribution serait bien venue. Même d'ouvrir un billet Gitlab pour rapporter la demande serait utile…

  • # sécurité ?

    Posté par  . Évalué à 5.

    Il y a quelques années, j'utilisais photofloat sur un sheevaplug et cela me convenait parfaitement. Lors du remplacement de ce bon petit soldat, j'avais zappé la mise en place d'un outil de partage d'image de ce type et je me remets en quête d'une solution qui bénéficierait toujours d'un mainteneur. Donc je vais naturellement voir ce qu'il se dit dans le l'entrée de retrait de photofloat de debian et je découvre qu'on parle de MyPhotoShare, ex photofloat-enhanced, mais pas dans tes termes élogieux en ce qui concerne la sécurité:

    Le projet a été forké en juin 2017, sous le nom photofloatenhanced, qui a été dénoncé comme non-securisé par le mainteneur original […]
    Lors d'une conversation avec l'auteur dans le canal #wireguard (puisque Donenfeld travaille également sur ce logiciel VPN), il expliquait que le fork avait une vulnérabilité de traversée de répertoires et exprimait en général son hostilité au fork.

    Que Jason Donenfeld soit hostile au fork du fait de l'insertion de code php dans un projet qui se voulait minimaliste, je peux le comprendre, tout comme je peux comprendre le besoin de l'auteur du fork d'intégrer ce genre de changements.

    Mais, si l'auteur ou un contributeur passe par là, est-ce que la remarque faite il y a 4 ans par Donenfeld sur cette vulnérabilité a donné lieu aux corrections nécessaires ? Est ce que les aspects sécurité ont fait l'objet d'avantage d'attention depuis 2017 ?

    • [^] # Re: sécurité ?

      Posté par  . Évalué à 3.

      Je n'étais pas au courant du problème de sécurité remonté par Jason Donenfeld. Il faudra que je demande à Paolo Benvenuto si c'est le cas car je n'ai rien trouvé parmi la liste des tickets sur Gitlab.

      Tout comme Jason, je suis pour limiter voire retirer l'usage du PHP dans MyPhotoShare car les fonctions qui le requièrent ne me sont pas utiles:

      • Partage de liens sur Facebook et autres sites sociaux.
      • Permettre l'envoi d'un mot de passe à des utilisateurs qui voudraient accéder à des albums protégés.
      • Permettre à des utilisateurs de géolocaliser des photos/albums.

      C'est pourquoi j'ai créé la page index.html qui peut être utilisée pour remplacer index.php et permettre à MyPhotoShare d'être 100% statique.

      Concernant la sécurité de MyPhotoShare en général, elle repose principalement sur le fait que le site est statique et donc sur la sécurité de la configuration du serveur Web. L'ajout de code PHP peut apporter des failles, mais le code n'a pas donné lieu à un audit par d'autres développeurs pour valider cette partie, car MyPhotoShare n'est pas un logiciel très diffusé. Je n'ai pas trouvé de détails du problème reporté par Jason qui me permettrait de tester mon site, au moins à l'aide d'un scanner de vulnérabilités. En tout cas, l'absence de base de données ferme la porte aux vulnérabilités classiques…

      Du point de la sécurité des albums/médias protégés, il ne faut pas s'attendre à de la sécurité bancaire. Il s'agit plutôt d'albums/médias qui ne sont pas publics et dont l'accès est réservé à ceux qui possèdent le mot de passe pour les afficher. Ces médias/albums sont renommés avec une fonction de hashage que le code JavaScript sait décoder. Donc quelqu'un avec beaucoup de volonté pourrait analyser le code JavaScript minifyé pour trouver où sont cachés ces fichiers…

      Moi aussi, j'utilisais photofloat sous Debian et j'étais content de son interface minimale. Mais lorsqu'il a arrêté d'être supporté, j'étais content que quelqu'un continue de faire vivre ce projet et d'y ajouter des fonctions intéressantes comme le géopositionnement des médias ou les recherches par mot-clé et bine d'autres fonctions. Le projet a beaucoup grossi depuis photofloat et est devenu plus complexe. Je pense que si une communauté d'utilisateurs et éventuellement de contributeurs minimale se constituait autour de MyPhotoShare, l'évolution du projet serait plus contrôlée, par exemple pour garantir le fonctionnement sur des ordinateurs minimalistes auto-hébergés.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.