MyPhotoShare, une galerie photo statique mais musclée

Présentation animée de quelques fonctions de MyPhotoShare

Une démonstration animée des fonctions de MyPhotoShare v5.0
Quelques possibilités de MyPhotoShare v5.0

Exposez vos médias, photos et vidéos sur le Web et partagez-les avec votre famille et vos amis

Publiez vos photos et vidéos sur un site web static performant et sécurisé.

MyPhotoShare est un générateur de galerie média statique. C'est-à-dire qu'un programme, l'indexeur (ou scanner), va parcourir des dossiers contenant des photos et des vidéos et va générer un index de tous ces fichiers afin de les rendre disponibles à partir d'une seule page Web statique. D'un point de vue de la sécurité, rien n'est modifiable. Et du côté de la performance, le serveur Web dédie ses ressources pour fournir les médias, pas pour redimensionner des images ou gérer une base de données...

Quels sont les avantages d'un site web static? À l'origine, le Web a été inventé pour partager des documents, puis il a évolué pour supporter des applications. Donc un site web static renoue avec la pureté initiale du Web. Surtout si le contenu des pages ne change pas, comme c'est souvent le cas dans une galerie média, pourquoi vouloir rendre plus complexe l'affichage de photos ou de vidéos? L'indexeur vient simplifier l'opération en générant automatiquement le contenu des pages à afficher. En fait, dans le cas de MyPhotoShare, il ne génère pas des pages HTML mais des fichiers d'index au format JSON, qui sont interprétés par la page HTML5 dans le navigateur de l'utilisateur. D'un point de vue de la sécurité, il devient dont plus difficile de hacker l'application pour prendre contrôle du serveur.

Sur le volet de la performance, le travail du serveur se réduit à l'envoi des fichiers d'images ou de vidéos, ou des fichiers JSON. En effet, quel que soit le visiteur, l'affichage d'une page de la galerie aura le même contenu média (l'apparence peut être différente en fonction des choix de présentation du visiteur). Donc on peut 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 ne soient jamais affichées et que l'indexeur ait travaillé inutilement, mais si le site est populaire la probabilité de ce travail inutile diminue. Au contraire, un serveur dynamique recréerait à chaque fois le contenu d'une page pour tout nouveau visiteur. Le site web static 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).

Ces deux arguments sont particulièrement adaptés au contexte d'une galerie média, avec du contenu qui évolue incrémentalement. En contrepartie, comme le serveur ne peut plus réagir aux interactions des visiteurs, les fonctions dynamiques de l'application doivent s'exécuter du côté du client, dans son navigateur Web. On croit parfois que celà limite les possibilités, ce n'est pas le cas et MyPhotoShare peut prouver le contraire.


Site Web static ne signifie pas fonctions limitées!

En fait, MyPhotoShare dispose de toutes les fonctions que vous pourriez attendre d'une galerie média. Un site Web static est plus performant et sécurisé qu'une galerie photo dynamique, mais nous n'avons pas voulu faire de compromis sur les fonctions offertes aux utilisateurs.


Vous m'avez donné envie, je voudrais le voir en vrai...

Voici quelques sites qui vous permettront d'essayer MyPhotoShare. La langue d'affichage proposée lors de votre visite dépend de la configuration de votre navigateur web.


Vous m'avez convaincu, je veux l'installer!

Avec un paquet Debian/Ubuntu

La manière la plus simple d'installer MyPhotoShare est d'utiliser le paquet Debian/Ubuntu. Installez-le à l'aide de la commande sudo dpkg -i myphotoshare_VERSION.deb après avoir remplacé par la VERSION que vous avez téléchargée. Veuillez noter que toutes les versions ne donnent pas lieu à la création d'un paquet; peut-être désirez-vous utiliser la dernière version et il vous faudra suivre la procédure d'installation manuelle.

Ensuite, déposez vos médias, photos ou vidéos, dans le répertoire /usr/local/share/media et attendez que la tâche d'indexation du scanner fasse son office durant la nuit.

Si vous êtes pressés, vous pouvez démarrer l'indexation des médias immédiatement à l'aide de la commande myphotoshare_scanner /etc/myphotoshare/myphotoshare.conf, mais peut-être voudrez-vous configurer quelques options dans le fichier de configuration /etc/myphotoshare/myphotoshare.conf?

Installation manuelle

L'installation manuelle n'est pas beaucoup plus compliquée et vous permettra de comprendre le fonctionnement de la galerie. Suivez les instructions détaillées. Nous y expliquons comment télécharger la dernière version depuis GitLab et nous vous guidons pas-à-pas sur comment monter un site web pour exposer vos photos.


Une grande liste de fonctions

Déroulez les sections pour afficher leur contenu...

Montrez vos médias graphiques
  • Gestion des images et vidéos. Partagez des photos ou des vidéos, individuellement ou par album complet.
  • Vous pouvez naviguer dans les médias par dossier, par date ou par localisation géographique. Changez de type d'affichage par album, date ou géolocalisation.
  • L'affichage des médias et albums peut être trié par date ou par nom, de manière ascendante ou inverse.
  • Recherchez des médias par nom de fichier ou d'album, par son titre ou sa description, ou bien dans les étiquettes. Recherchez sur des mots complets ou à l'intérieur des mots, en considérant les accents ou la casse des caractères, dans l'album courant (qui peut être un album virtuel, comme un résultat de recherche) ou dans tous les albums.
  • Les vignettes des photos et vidéos peuvent être retaillées au format carré, centrées sur les visages (avec une détection des visages à l'aide d'OpenCV).
  • Les albums sont téléchargeable au complet à partir du menu , en incluant éventuellement les sous-albums, avec le choix des types de médias: photos, vidéos ou les deux.
  • Les images peuvent être indexées et étiquetées automatiquement avec les extensions d'apprentissage automatique.
Des fonctions pour les photographes
  • Les photos qui contiennent des métadonnées géographiques GPS permettent la navigation par pays/région/lieu. Les noms sont obtenus du service web GeoNames.
  • Affichage en plein écran.
  • Affichage des métadonnées techniques EXIF, IPTC and XMP.
  • Lien vers le fichier de la photo originale.
  • URL de la photo originale pour téléchargement direct.
  • Des entrées de menu pour le téléchargement de l'album au complet, incluant ou non les sous-albums.
  • Une fonction zoom pour agrandir une image sans limite.
  • La configuration d'installation permet de chosir s'il faut répliquer les métadonnées EXIF dans les vignettes, y compris les informations de copyright.

La documentation sur les métadonnées.

Géolocalisez vos médias
  • Affichage des photos sur la carte (merci Leaflet) dans une fenêtre popup.
  • Cliquez sur la carte pour afficher les marqueurs de prises de vue les plus proches.
  • Des photos peuvent être ajoutées ([Shift]+clic) ou retirées ([Ctrl]+clic) de la fenêtre popup de la carte.
  • Paolo Benvenuto qui maintient le projet l'a appelé MyPhotoShare car le but premier est le partage avec les amis et la famille. Vous pouvez télécharger un média, un album complet ou même le résultat de votre sélection. Vous pouvez aussi partager le contenu par courriel ou sur les principaux réseaux sociaux.

La documentation sur la géolocalisation.

Une galerie pour les mobiles
  • Support des actions mobiles telles que le balayage ou le pincement pour naviguer ou redimenssionner l'affichage.
  • Des images et des vignettes précises pour les téléphones mobiles.
  • Redimensionnement des médias.
Une interface utilisateur complète
  • Navigation complète au clavier: avec les flèches du curseur et les touches [PageHaut] et [PageBas]; [f] passe en plein écran (full screen); [d] télécharge le fichier original (download); [o] affiche l'original; [s] affiche la carte (show map); [m] affiche les métadonnées; [e] ouvre le menu; [+] agrandit tandis que [-] réduit; [Espace] ou [RetourArrière] (comme dans Darktable), [<] ou [>] effectuent une rotation des modes d'affichage: par album -> par date -> par GPS -> par carte -> par sélection; [/] change l'ordre de tri des albums ou des médias.
  • Lorsque l'image est agrandie, les touches du curseur permettent de déplacer l'image.
  • Support de la roulette de la souris, incluant pour retailler avec [Ctrl] ou [Shift].
  • L'utilisateur peut modifier de nombreuses options de présentation dans le menu.
  • Animation lors des changements de médias.
  • Vue séparée des albums et des médias.
  • Disponible en anglais, italien, espagnol, français. La localisation de l'interface utilisateur s'effectue dans un fichier séparé. Ajoutez votre langage!
  • Chargement anticipé des vignettes pour un affichage plus rapide des pages.

La documentation sur la navigation au clavier.

Partagez vos photos avec vos amis
  • Boutons de partage pour Facebook, Whatsapp (version mobile), Twitter, Pinterest ou par courriel. Sur Facebook, Whatsapp et Pinterest, une prévisualisation du contenu de l'album ou des photos est partagée.
  • Activez d'autres sites sociaux tels que Google, LinkedIn, Tumblr, vk ou buffer depuis le fichier de configuration.
Optimisations
  • Préchargement des métadonnées.
  • Préchargement des photos.
  • Le scanner utilise un algorithme de parcours d'arbre aléatoire récursif et asynchrone pour indexer les médias.
  • La page HTML5 utilise des feuilles de style CSS et des fichiers JavScript minifiés pour réduire la bande passante et le temps de chargement.
Gardez le contrôle sur vos œuvres
  • Les albums et médias peuvent être protégés par des mots de passe. Les mots de passes peuvent être spécifiés pour les albums, les fichiers ou les deux.
  • Des modèles (patterns) sont définis pour l'arbre des répertoires et spécifient ce que doivent protéger chaque mot de passe; les modes supportés: sensible à la casse ou non, sur le nom complet ou partiel des répertoires ou des fichiers, sur les répertoires ou les fichiers uniquement, ou les deux.
  • Les mots de passe ne sont pas exposés dans le JavaScript, et il est très difficile de trouver les données et médias sécurisés dans le cache (mais pas imppossible!)

La documentation à ce sujet.

Les albums virtuels (Nouveauté v5.0)
  • Les albums et les médias peuvent être sélectionnés individuellement en cliquant à la souris, ou en par une opération, soit dans des albums physiques (les répertoires, par date ou par localisation) ou dans des albums virtuels résultats d'une recherche, d'un sélection GPS ou de la navigation par la carte.
  • Les médias et albums sélectionnées peuvent être vus comme un album dans lequel on peut naviguer, télécharger, trier, afficher sur la carte, etc.
Des extensions d'apprentissage machine (Nouveauté v5.0)
  • Reconnaissance automatique des visages avec mps_autofaces. Reconnaissez facilement les membres de votre famille à partir de quelques photos.
  • Reconnaissance d'objets et de scènes dans les photos avec mps_autoscenes.
Des fonctions en vrac...
  • Mesurez la fréquentation de votre galerie avec Google Analytics ou avec Matomo.
  • De nombreuses options de configuration sont disponibles dans le fichier de configuration.
  • Le répertoire du cache est optimisé pour les grandes galeries.
  • Le répertoire source des albums peut se trouver n'importe où sur le serveur.
  • Il est possible d'empêcher l'indexation de certains albums par le scanner.
  • Le niveau de verbosité du scanner est configurable.
  • Mode debug pour les développeurs.
  • Les métadonnées des photos peuvent être surchargées par des valeurs dans des fichiers album.ini.
  • Un format d'URL consistant.
  • Créez un paquet d'installation Debian/Ubuntu avec mps_debian pour faciliter l'installation.

Trouvez la réponse à vos question dans la Foire aux question ou dans la documentation.


Sous le capot: parlons technique...

MyPhotoShare est constitué de deux parties: un script Python et une application JavaScript.

Le script Python, l'indexeur ou scanner, parcourt un arbre de répertoires contenant des images et des vidéos (nous utilisons le terme général média). Chaque répertoire constitue un album. Ce script remplit un second répertoire, dénommé le cache, avec des fichiers statics JSON et des réductions des images et vidéos (les vignettes). Il écrit un fichier options.json à la racine du site et contenant les options de configuration. Le scanner extrait les étiquettes de métadonnées EXIF depuis les photos JPEG ou des vidéos, ou bien les métadonnées spécifiées par le propriétaires dans les fichiers album.ini, et crée des fichiers d'index JSON dans le cache. MyPhotoShare détecte les dates et heures de modification des fichiers pour évaluer si une réindexation est nécessaire. Le travail du scanner sera très rapide si aucun changement n'a eu lieu depuis la dernière exécution.

L'application JavaScript est constituée d'un seul fichier index.php ou index.html. Elle charge le fichier options.json ainsi que les fichiers JSON statics générés, à la demande depuis le répertoire de cache, afin de créer une interface Web performante.

Performance du scanner

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

Consommation mémoire

L'indexation de 45000 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 40000 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.

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%

Quel futur pour MyPhotoShare?

MyPhotoShare a commencé sa vie sous le nom photofloat que lui a donné sont auteur Jason A. Donenfeld. Le code a été extrait en 2016 dans une nouvelle branche quand Jason a arrêté de le développer, puis enrichi par Jerome Charaoui pour supporter les vidéos, avec les contributions de Paolo Benvenuto et de Pierre Métras.

Actuellement, MyPhotoShare est principalement développé par Paolo Benvenuto qui a ajouté de nombreuses fonctions au programme original. Moi, Pierre Métras, j'y contribue de temps en temps quelques ajouts ou des corrections de bugs. D'ailleurs, la liste des tickets du projet répertorie de nombreuses idées d'améliorations. Mais nous manquons de bras pour les implémenter. Si vous connaissez Python or JavaScript, si vous maîtrisez HTML5 et les feuilles de style CSS, voire vous connaissez une langue différente de celles que nous parlons, ou tout simplement vous disposez de quelques heures pour tester l'application, n'hésitez pas à nous donner un coup de main pour améliorer l'application. Si vous avez une idée pour adapter MyPhotoShare à vos besoins, partagez-la sur Gitlab, même en français!

Par exemple, je voulais ajouter des fonctions de reconnaissance de scènes pour étiqueter automatiquement les dizaines de milliers de photos de ma collection. Pas question de mettre mes photos privées chez les GAFA de ce monde! J'ai donc décidé d'ajouter un module d'extension qui analyse les images à partir des banques d'images de Visual Genome et de MS COCO et les associe à des synsets de WordNet, ce qui permet de présenter les scènes reconnues dans toutes les langues supportées. Le module mps_autoscenes a ainsi vu le jour, mettant en œuvre des techniques d'apprentissage profond. Malheureusement, mon portable i5 ne dispose pas d'une puissance suffisante pour optimiser le réseau de neurones, même après 15 jours de calculs. Actuellement, mps_autoscenes reconnaît correctement les éléments d'une photo dans plus de 50% des cas, mais est encore loin de remplacer les humains ou les meilleurs logiciels. Si vous avez la capacité de l'améliorer, n'hésitez pas!

En revanche, l'autre module d'extention mps_autofaces, dont la tâche est d'identifier les personnes dans les photos a un taux de succès diabolique! À partir d'une liste de portraits identifiés qui lui sert de modèle d'apprentissage, il reconnaît ensuite toutes les apparitions de ces personnes dans les photos et met à jour les métadonnées de MyPhotoShare.

Ces deux exemples présentent mes contributions à ce projet. Vous aussi, vous pourriez y apporter les vôtres!