Studio Drupal · Diego-Suarez, Madagascar
Fondé en 2025 · 12°16′ S

Species External Entity

Module Drupal transformant un nom d'espèce ou un ID du Catalogue of Life en entité vivante : taxonomie, photos, statut de conservation et données écologiques issues d'API publiques de biodiversité, miroir local pour la vitesse.

Ce que c'est

Species External Entity, nom machine species_ext, transforme un nom d'espèce ou un identifiant de taxon du Catalogue of Life en une entité Drupal complète. Sa taxonomie, sa description, ses photographies, son statut de conservation et ses relations écologiques sont collectés en direct à partir d'API publiques de biodiversité, puis répliqués localement afin que les pages restent rapides.

Il est fourni sous forme de deux modules : species_ext, le moteur de données, et le module facultatif species_ext_map, une couche de présentation qui transforme les champs résolus en cartes, graphiques et galerie photo. Le moteur de données fonctionne en production sur Biodiversa, Museo Avellonia et le Quercus Project. Sur le Quercus Project, ses données d'espèces alimentent également le visualiseur Ecosystems de MADDev.

En un coup d'œil

Modules
species_ext, le moteur de données : plugins de source, résolveurs, le miroir local et les types de champs de l'entité species_x ; species_ext_map, une couche de présentation optionnelle pour les cartes, les graphiques et une galerie
Cœur de Drupal
10 ou 11
Nécessite
entities_ext, dynamic_mirror_base, key et le module Link du cœur de Drupal ; species_ext_map nécessite en plus le module contribué Leaflet
Type d'entité
species_x, identifié par l'ID de taxon du Catalogue of Life
Rendu
Chargement standard, BigPipe ou progressif, afin que les champs critiques apparaissent immédiatement et que les champs d'enrichissement arrivent en continu sans bloquer la page
Statut
En production sur Biodiversa, Museo Avellonia et le Quercus Project

Ce que voient les visiteurs et les conservateurs

Sur les sites qui installent le sous-module facultatif species_ext_map, une page d’espèce ajoute une carte de densité d’occurrences GBIF année par année dessinée avec Leaflet, un histogramme de phénologie, un graphique de tendance des populations, une galerie photo et un widget de consultation et de recherche ; elle ne présente que ce que species_ext a déjà résolu et n’effectue aucun appel de données de son propre chef. Il est utilisé sur Museo Avellonia et le Quercus Project. Sur le Quercus Project, les pages d’espèces comportent également un balisage SEO et une jolie URL /species/{name} plutôt que le chemin interne de l’entité.

Un conservateur peut marquer une espèce comme vedette et ajouter ses propres photographies via une petite entité locale qui se trouve aux côtés des données résolues. Ces ajouts ne sont jamais écrasés par l’actualisation mensuelle provenant de l’amont.

Ce que cela apporte à un site Drupal

Type d'entité

species_x : une entité externe dont la clé est l'ID de taxon du Catalogue of Life, avec des champs, des modes d'affichage et Gérer l'affichage comme toute autre entité Drupal, même si personne ne saisit son contenu à la main.

Plugins de source

Un plugin @SpeciesSource par source amont, parcourus par ordre de poids jusqu'à ce que l'un d'eux se résolve : une liste de contrôle locale du Catalogue of Life sans appel réseau, l'API du Catalogue of Life, Wikipédia, GBIF, iNaturalist, la Liste rouge de l'UICN, EOL et GloBI.

Routes

/admin/config/services/species-ext : activer ou désactiver chaque source, définir la clé d'API de l'UICN et choisir le mode de rendu. /species-ext/lookup : un point de terminaison POST pour l'autocomplétion et la recherche de taxons. Une route de désambiguïsation gère un nom qui correspond à plus d'un taxon.

Commandes Drush

species-ext:warm, pour préchauffer immédiatement une ou plusieurs espèces ; species-ext:warm-queue, pour vider immédiatement la file d'attente de préchauffage.

Verrouillage des champs

Un SpeciesDmbAdapter connecte les champs species_x à dynamic_mirror_base, afin qu'un éditeur puisse verrouiller un champ résolu ou le remplacer localement, via le même flux de travail que les autres modules d'entités externes de MADDev.

Sources de données et licences

  • Catalogue of Life : taxonomie, nom accepté, paternité et synonymes ; une table de liste de contrôle locale répond également aux recherches courantes sans appel réseau
  • Wikipédia : une description en langage clair
  • GBIF : enregistrements d'occurrence, répartition, données phénologiques et une boîte englobante de carte ; pour species_ext_map, une couche de tuiles de densité d'occurrence pré-rendue qui ne nécessite aucune clé GBIF et ne télécharge aucune donnée d'occurrence brute vers le serveur
  • iNaturalist : un nom vernaculaire, un résumé du taxon, des photographies, des comptages d'observations et des observations récentes
  • Liste rouge de l'UICN : statut de conservation, tendance des populations, menaces et habitat
  • EOL (Encyclopedia of Life) : une description lorsque Wikipédia n'en a pas
  • GloBI (Global Biotic Interactions) : le réseau d'interactions, ce qu'une espèce mange, ce qui la mange et ce sur quoi elle vit

Une espèce est résolue une fois, la première fois qu'elle est mise en avant, et se matérialise dans une table miroir locale afin que les pages restent rapides ; une tâche cron l'actualise chaque mois. Les appels sortants sont regroupés par lots et dédupliqués via le request_bus partagé, et une source qui dépasse le délai d'attente n'efface jamais une valeur déjà stockée. Les clés GBIF, iNaturalist et de la Liste rouge de l'UICN sont facultatives, conservées dans le module key plutôt que dans le code ; sans clé de l'UICN, le module se dégrade proprement au lieu d'échouer.

Décisions de conception

  • Résolution des sources au niveau des champs. Chaque champ est résolu indépendamment depuis la source amont qui le fournit, plutôt qu’une API faisant autorité pour l’ensemble de l’enregistrement.
  • Identité de repli pondérée. Les plugins sources sont parcourus par ordre de poids et le premier qui résout l’emporte. Le Catalogue of Life couvre un peu plus de 80 % des espèces connues, donc une espèce qui en est absente obtient tout de même une identité à partir du titre de l’article Wikipédia, d’un identifiant iNaturalist ou d’une clé de taxon GBIF.
  • Matérialiser une fois, actualiser chaque mois. Une espèce est stockée dans un miroir local la première fois qu’elle est mise en avant, plutôt que la page ne déclenche jusqu’à sept appels d’API en direct à chaque affichage, puis elle est maintenue à jour par cron plutôt qu’à la demande.
  • Les modifications du conservateur ne sont jamais écrasées. Un indicateur de mise en avant et les photographies du conservateur sont stockés localement et survivent à chaque actualisation en amont.
  • Conçu pour être réutilisable. Rien dans species_ext n’est spécifique à un site ; les préoccupations propres à un site restent dans le module propre à ce projet.

Démarrer un projet.

Parlez-nous des données sur les espèces ou la biodiversité que votre site Drupal doit afficher.