Faire tenir un calendrier de compétitions avec des sources incomplètes

Je nage en compétition, en catégorie Maîtres. Chaque saison je refais la même recherche : quelles courses près de chez moi, à quelles dates, et est-ce que celle-là vaut le déplacement.

Aucun site ne répond à ça.

L’agenda de BBN Natation, un club francilien, recense une partie des compétitions à venir. Couloir 4 reprend les données de liveFFN et en publie une autre partie. La Ligue Île-de-France sort un PDF par saison, que personne n’a envie de lire. Il faut piocher dans les trois.

collecte-competitions-ffn sert à ça. Il ne scrape pas parfaitement le calendrier fédéral, il n’essaie même pas. Il prend ce qui existe et en sort un rapport que je peux lire en deux minutes.

BBN donne le local, Couloir 4 donne le détail

BBN Natation tourne sous WordPress avec une API propre. Titre, dates, lieu, parfois un code postal, des tags du genre CD92. C’est la source qui connaît la région, le club référence les compet du coin et les classe par département.

Il y a des trous. Des compétitions absentes. Des lieux sans ville. Des tags départementaux qui sautent selon les fiches.

Couloir 4, c’est du JSON, mis à jour depuis liveFFN : nom, ville, dates, niveau, bassin, coordonnées, lien vers la fiche. Beaucoup plus facile à traiter.

Sauf qu’il ne montre que ce qui est déjà ouvert sur liveFFN. Une course annoncée par le club mais pas encore au calendrier fédéral n’existe pas pour lui. Et c’est un site tiers, monté par un type, pas une source officielle. Ça peut disparaître demain.

Les deux ne se remplacent pas. Il faut les deux.

Le rapprochement des doublons

L’outil interroge les deux sources sur une période, puis normalise.

L’étape pénible, c’est les doublons. La même compet arrive avec deux titres. « 100 Maîtres d’automne 2026 à Poissy » d’un côté, « 100 Maitres d’automne » de l’autre, sans accent sur Maîtres, sans ville, sans année. La fusion compare les dates, la ville et les mots du titre qui portent du sens.

Quand ça matche, je garde une fiche et je prends le meilleur des deux : liens, bassin, niveau, identifiants. Une compet vue des deux côtés ressort plus complète que dans chaque source séparée.

Je reste prudent sur la dédup. Deux événements d’une même source ne fusionnent jamais sur un titre approchant. Et quand la ville manque d’un côté, le rapprochement échoue. Résultat : des doublons qui passent quand même. Ça m’arrive encore.

Le département plutôt que le rayon

Au début je filtrais au rayon, 80 km autour d’Antony. Mauvais découpage. Ça inclut des coins très différents et ça coupe des départements en deux.

Maintenant je choisis un département, le 92 par exemple, et le rapport classe en trois : le département, les limitrophes, le reste de la région. Les nationales et les internationales restent visibles où qu’elles soient.

Pour trouver le département, dans l’ordre : les coordonnées Couloir 4, le code postal BBN, le tag CDxx, puis une recherche sur le nom de ville. Si rien de fiable ne sort, la compet part en Département indéterminé. Je préfère ça à une attribution au hasard.

Ce qu’il ne fait pas

Le rapport est du Markdown. Rien d’autre. Pas d’écriture dans un calendrier, pas de réservation, pas de décision.

C’est un choix, pas une étape en attente. Un rapport que je relis me laisse le dernier mot. Une synchro auto m’aurait apporté des erreurs silencieuses, des doublons et des suppressions que personne ne sait annuler.

La V1 ne lit pas le PDF de la Ligue, ne scrape pas FFN Extranat. Ce sont des pistes, pas des prérequis.

Le lancer

Saison 2026-2027, département 92 :

python -m collecte_competitions_ffn \
  --start 2026-09-01 \
  --end 2027-08-31 \
  --department 92 \
  --output competitions.md

Dernière exécution : 59 compétitions fusionnées, 24 après classement. Le rapport sépare le 92, les limitrophes, les nationales, les internationales et les quelques indéterminées.

Chaque ligne garde le lien vers la source. Quand la compet est dans les deux, les deux liens sont là.

Où ça casse

Le lieu, d’abord. Une compet avec un tag départemental et pas de ville, ça arrive. Et les fautes de frappe, comme « Soissy-sous-Montmorency » au lieu de Soisy. Le tag sauve la première, pas la seconde.

Ensuite geo.api.gouv.fr. Si l’API tombe, l’outil abandonne après trois échecs et balance tout le reste en indéterminé. C’est mieux qu’une attribution fausse, mais l’utilisateur ne voit rien passer.

Et le rapprochement des titres reste de l’heuristique. Ça marche sur ce que j’ai vu, pas sur tout. Un titre trop générique, une ville absente, une date qui bouge d’un jour : doublon ou faux positif.

Ces limites sont dans le code et dans les tests, pas cachées en dessous.

Le code

Public sur GitLab : https://gitlab.com/nicodel/collecte-competitions-ffn

Il y a la collecte, la déduplication, le classement départemental, les fixtures, les tests. Le référentiel départements, régions et voisinages est versionné, avec le script qui le régénère.

C’est un outil personnel, pas un produit. Il fait un travail borné : ramasser des compétitions dispersées et les rendre lisibles. Si le même besoin existe ailleurs, il y a de quoi l’adapter.