Le premier soir, la page fonctionnait. Le catalogue PS Plus, trié par note, avec un joli filtre par genre. J’ai cherché un jeu que je connaissais. Il apparaissait deux fois, avec deux notes différentes. Un autre, que je savais présent dans le catalogue, n’y était pas. Un troisième était marqué comme « retiré » alors que je l’avais lancé la veille.
Ce que je croyais
Que le catalogue était une liste. Une liste de titres, que quatre sources publiques décrivent chacune à leur manière, et qu’il suffisait de recouper par le titre pour obtenir une fiche propre : la note d’une source, la date de sortie d’une autre, la présence dans le catalogue d’une troisième.
Le premier script de collecte a été écrit en une heure. Le recoupement par titre, en dix minutes. C’est là que les trois semaines ont commencé.
Ce que c’était
Deux problèmes, que je prenais pour un seul.
Le premier : un titre n’est pas un identifiant. Le même jeu s’appelle « Nom du jeu », « Nom du jeu™ », « Nom du jeu — Director’s Cut », « NOM DU JEU Remastered » ou « Nom du jeu (PS4 & PS5) » selon la source. Deux jeux différents peuvent porter le même nom à dix ans d’écart. Une source met l’année, l’autre non.
Le second, plus embêtant : il n’y a pas un catalogue. Il y en a un par pays. Un jeu présent en France peut être absent en Allemagne, ou en partir un mois plus tôt. La source qui annonce les retraits parle du catalogue américain. Celle qui liste le contenu parle de celui que son auteur consulte. Personne ne ment ; personne ne décrit la même chose.
La réponse est en deux parties. Une normalisation des titres, agressive mais documentée :
function cle(titre: string): string {
return titre
.normalize('NFD').replace(/[̀-ͯ]/g, '') // accents
.replace(/[™®©]/g, '')
.replace(/\s*[\(\[].*?[\)\]]/g, '') // (PS4 & PS5), [Remastered]
.replace(/\s*[—–:-]\s*(director'?s cut|remastered|definitive edition|edition)\b.*$/i, '')
.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();
}
Et une liste de correspondances manuelles pour les cas que la règle ne peut pas trancher, avec un rapport chaque matin des titres qui n’ont trouvé aucune correspondance. Les premières semaines, il y en avait quarante. Aujourd’hui, deux ou trois par mois.
Pour les pays, j’ai arrêté de chercher la vérité. Chaque jeu a une ligne par pays, avec la date à laquelle il y a été vu pour la dernière fois. « Retiré » n’est plus une information qu’on lit quelque part, c’est une déduction : absent depuis trois passages consécutifs. « Retrait imminent » vient des annonces officielles, et je dis de quel pays elles parlent.
Ce que j’en retiens
L’outil d’IA a écrit la collecte, l’interface, le traitement de nuit, sans que j’aie grand-chose à corriger. Il n’a rien pu faire pour le recoupement, parce que le recoupement n’est pas un problème de code. C’est une suite de décisions : est-ce que ces deux titres sont le même jeu ? Est-ce que cette source fait foi pour ce pays ? Chaque décision est petite, discutable, et il y en a eu des centaines.
C’est pour ça que la méthodologie est publiée sur le site. Pas par transparence abstraite : parce que la note affichée est le résultat de choix, et que quelqu’un qui n’est pas d’accord avec un choix doit pouvoir le voir.
Fusionner des données, ce n’est pas écrire du code. C’est prendre trois cents petites décisions, et les noter quelque part.
Recevoir le journal
Une entrée par semaine environ. Ce que je construis, ce qui casse, ce que j'apprends. Pas de promotion, désinscription en un clic.
Vous pouvez aussi suivre le flux RSS.