Colle l'adresse d'un profil Letterboxd public : tu obtiens les grands chiffres de sa page « A Life in Film », l'analyse de ses derniers visionnages, et des verdicts rédigés que Letterboxd ne fait pas.
Aucune clé d'API, aucun export à demander, aucune connexion.
node serveur.mjs # http://127.0.0.1:8127Ou double-clique Lancer Ton Letterboxd.cmd. Saisis letterboxd.com/tonpseudo
ou juste tonpseudo.
node verif.mjs dave # vérification en console, serveur lancé
node --test "test/*.test.mjs" # 22 tests, aucun réseau| Source | Ce qu'elle donne | Limite |
|---|---|---|
/<user>/rss/ |
les ~50 derniers films : date de visionnage, note, rewatch, année, identifiant TMDB, affiche | 50 entrées, pas plus |
/<user>/stats/ |
les agrégats de toute une vie : films, heures, réalisateurs, pays, série, jours à 2+ films | publique seulement pour les comptes Patron |
| TMDB | genres, réalisateurs, pays, durée, note moyenne | demande une clé gratuite |
Sans clé, la page fonctionne : les blocs genres, réalisateurs et pays sont simplement absents, avec un message qui explique quoi faire.
La clé se crée en trois minutes sur themoviedb.org (compte gratuit, « API Key (v3 auth) »). Elle ne se met jamais dans le code :
# soit un fichier à la racine du dossier
echo TA_CLE > tmdb.key
# soit une variable d'environnement
$env:TMDB_KEY = "TA_CLE"Le serveur lit la clé au démarrage et l'annonce dans la console : « TMDB : clé présente » ou « sans clé ».
Ce que ça débloque : tes genres (avec leurs pourcentages), tes réalisateurs les plus vus, tes pays de production, ton temps d'écran, et deux verdicts qui n'existent nulle part ailleurs :
- ton écart à la moyenne TMDB : « tu notes 0,8 étoile plus sévèrement que la planète ». La moyenne TMDB est ramenée sur cinq étoiles pour être comparable.
- toi et la foule : le croisement de tes notes avec le nombre de votants TMDB. Trois tranches — confidentiel sous 500 votants, connu, populaire au-delà de 5 000 — et ta moyenne dans chacune. « Tu notes 4,3 les films confidentiels, 2,3 les populaires. » Aucun appel réseau supplémentaire : le nombre de votants arrive avec la fiche.
Un bouton « Copier le lien » construit une adresse qui contient les deux
profils : ?user=dave&user2=jack. Quelqu'un qui l'ouvre tombe directement sur
la comparaison, sans rien saisir. C'est le seul « état » de la page — tout le
reste est recalculé à la volée.
50 films identifiés sur 50, en une passe :
| Genres | Drame 23 (46 %) · Comédie 17 (34 %) · Aventure 12 · Thriller 11 |
| Réalisateurs | Anthony Russo 2 · Bryan Singer 2 · Joe Russo 2 · Paweł Pawlikowski 2 |
| Pays | États-Unis 40 · Royaume-Uni 13 · France 9 · Allemagne 4 |
| Durée | 116 min de moyenne, 96 heures au total |
| Popularité | Confidentiel 24 films (3,9★) · Connu 12 (3,3★) · Populaire 11 (3,9★) |
| Plus obscur | Club Kid — 1 votant |
| Plus vu | Avengers: Infinity War — 33 331 votants |
Le verdict « toi et la foule » sort ici à 0 étoile d'écart entre le confidentiel et le populaire : la popularité ne change rien à ses notes. Ce n'est pas une absence de résultat, c'est un résultat.
Le serveur relaie ces deux URL (elles ne sont pas ouvertes par CORS) avec un
cache de six heures. Aucune pagination n'est scrapée : robots.txt interdit
les URL de tri (/by/…), et parcourir cinquante pages serait abusif.
Un second champ dans le formulaire. On obtient :
- vos films en commun et le taux de recouvrement (Jaccard) ;
- votre complicité : la part de films où vos notes sont à moins d'une demi-étoile l'une de l'autre ;
- votre plus gros désaccord, nommé, avec les deux notes ;
- qui est le plus sévère, sur les moyennes globales.
Le rapprochement se fait sur le titre et l'année, nettoyés des accents, de la casse et de la ponctuation : « Amélie » et « Amelie » sont le même film. Un bouton exporte la comparaison en image.
Mesuré sur deux vrais profils (dave et jack) : 10 films en commun sur 90
(11 % de recouvrement), 80 % d'accord sur les notes, et un plus gros
désaccord à 1,5 étoile sur The Rivals of Amziah King.
Un verdict calculé sur trois films n'est pas un constat. Chaque verdict porte
une fiabilité (bonne au-delà de 12 notes ou 20 films, faible en dessous), et
les cartes concernées affichent une pastille « échantillon faible ». C'est une
règle qu'on s'était donnée sur les abandons : ne pas conclure sans matière.
Un sélecteur d'année et un bouton : la même fiche, avec les chiffres de l'année
seule et le titre « TON ANNÉE 2026 ». Le fichier s'appelle
letterboxd-<pseudo>-2026.png.
Le seul bloc qui donne des conseils plutôt que des constats. Pour les trois réalisateurs les plus vus, on va chercher leur filmographie TMDB et on compare : « Bryan Singer — 2 / 10 vus, prochain : Bohemian Rhapsody (2018) ».
Le filtre compte : seuls les films ayant au moins 100 votants TMDB sont comptés. Sans lui, la filmographie d'un réalisateur inclut ses courts-métrages et ses téléfilms, et « il te reste 23 films » devient une plaisanterie.
- Bouton « Actualiser » : le cache de profils dure six heures. Après une
soirée ciné, la page te montrait encore la veille. Le bouton force la relecture
(
?forcer=1), sans vider le cache TMDB qui, lui, ne change pas. - Mosaïque d'un mois : au-delà de 48 affiches, l'image l'annonce désormais (« N de plus sur Letterboxd ») au lieu de perdre silencieusement les dernières. Le chargement des vignettes suit la même limite, ce qui évite les tuiles grises.
- Accessibilité : les barres sont décoratives (
aria-hidden) et chaque bloc porte unrole="group"avec son titre. Le libellé et le nombre suffisent — inutile de faire lire deux fois la même chose à un lecteur d'écran.
- Les grands chiffres — comme « A Life in Film » : 2 608 films, 4 968 heures, 1 418 réalisateurs, 74 pays, 51 semaines de série, 346 journées à deux films ou plus. Sans page Stats, la page bascule sur le flux.
- Nos verdicts — sévérité qui dérive, retard de visionnage, décennie de référence, plus long silence, rythme, journées chargées, rewatchs.
- Sept blocs de statistiques (grille responsive) :
- la répartition des notes par demi-étoile ;
- les jours de la semaine ;
- les décennies de sortie, avec l'année médiane ;
- le volume par mois ;
- les notes par décennie — est-on plus sévère sur le cinéma récent ?
- le rythme (films/semaine, jour favori, séries, rewatchs) ;
- les extrêmes : plus ancien, plus récent, plus long silence, mois le plus chargé, parts de 5★, de 0,5★ et de notes moyennes.
- Tes mieux et moins bien notés, avec les affiches tirées du flux.
- La liste des films revus.
- Trois exports : la fiche récapitulative, la mosaïque de tous les mois, et la mosaïque d'un seul mois (sélecteur + affiches en grand).
| Page Stats | 2 608 films · 4 968 heures · 1 418 réalisateurs · 74 pays · 51 sem. · 346 jours 2+ |
| Flux | 50 visionnages, 48 notés, moyenne 3,7 |
| Rythme | 2,5 films par semaine, jour favori le vendredi (16 films) |
| Décennies | 2020s : 40 · 2010s : 6 · 2000s : 2 · 1990s : 1 · 1980s : 1 |
| Année médiane | 2026 · le plus ancien : Landscape in the Mist (1988) |
| Volume | octobre 2026 : 22 films, septembre : 15 |
| Plus long silence | 31 jours, du 9 juillet au 10 août 2026 |
| Notes | 48 % de notes moyennes (2,5 à 3,5), 0 % de 5★, 0 % de 0,5★ |
Le dernier chiffre est le plus parlant : sur cinquante films, aucun 5 étoiles et aucun 0,5. Un profil qui ne s'enthousiasme ni ne s'indigne — exactement le genre de chose qu'un simple graphique ne dit pas.
Palette reprise de Letterboxd — orange, vert, bleu sur bleu-noir — mais structurée, pas copiée :
- un bandeau à perforations en haut de page, en dégradé répété, pour l'idée de pellicule ;
- la marque en petites capitales espacées avec un tiret orange ;
- les grands chiffres sur des cartes avec un liseré tricolore en bas ;
- les verdicts avec une barre d'accent à gauche, verte ou rouge selon le sens du constat ;
- les affiches en grille, ombrées, qui se soulèvent au survol, avec la note en vert.
Aucun asset, aucune police distante : les perforations sont un
repeating-linear-gradient, le reste est du CSS.
Deux exports, deux mises en page.
Tous les mois : une ligne par mois (le plus récent en haut), les affiches à la suite, la note en pastille, neuf affiches par ligne, un « +N » quand le mois déborde, huit mois maximum.
Un seul mois : un sélecteur liste les mois disponibles avec leur nombre de
films ; l'export bascule sur une mise en page dédiée — affiches de 156 × 234
(contre 92 × 138), six par ligne, plusieurs lignes si le mois est chargé, le nom
du mois en titre et le titre de chaque film sous son affiche. Le fichier
s'appelle letterboxd-<pseudo>-2026-11-mosaique.png, donc il ne s'écrase pas
avec celui d'un autre mois.
Le problème technique, et sa solution. Les affiches viennent de
a.ltrbxd.com, qui n'envoie aucun en-tête CORS (vérifié). Dessinée
directement, une image distante « souille » le canvas, et toBlob() refuse
alors de produire le fichier : l'export échouerait sans message clair.
D'où la route /api/affiche?u=… : le serveur relaie l'image depuis notre
propre origine, avec une liste blanche de domaine (ltrbxd.com uniquement) et
un cache disque. Mesuré : 137 ms au premier chargement, 46 ms ensuite.
Un domaine étranger est refusé en 400.
| Page Stats | 2 608 films · 4 968 heures · 1 418 réalisateurs · 74 pays · 51 sem. · 346 jours 2+ |
| Flux | 50 visionnages, 48 notés, moyenne 3,7 |
| Rythme | 2,5 films par semaine, jour favori le vendredi |
| Journées | 11 journées à deux films ou plus, la plus chargée à 4 |
| Rewatch | 20 % |
Le balisage sépare le nombre de son libellé. Ma première version cherchait
« 2,608 Films » dans le HTML ; en réalité c'est 2,608</span><span>Films. Tout
revenait vide sans erreur. L'extracteur retire désormais les balises avant de
chercher — et un test le vérifie sur un extrait balisé.
Le flux mélange les films et les listes. Seules les entrées qui portent une
letterboxd:watchedDate sont des visionnages.
Une note absente n'est pas un zéro. Les moyennes et la répartition n'incluent que les films réellement notés.
La page Stats n'existe pas pour tout le monde. Son absence n'est pas une erreur : la page le dit et analyse le flux seul.
- Genres, réalisateurs et pays en détail : la page Stats n'en donne que le compte. Il faudrait TMDB (via les identifiants du flux) pour « tes réalisateurs les plus vus ».
- L'historique complet : impossible sans l'export CSV du compte. Le flux s'arrête à cinquante films, et c'est une contrainte de Letterboxd, pas de notre code.