Skip to content

About

Turns a public Letterboxd profile into written verdicts, compares two profiles, and exports month mosaics. No API key, no export, zero dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Ton Letterboxd

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.

Lancer

node serveur.mjs        # http://127.0.0.1:8127

Ou 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

D'où viennent les chiffres

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

Activer TMDB

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.

Partager une analyse

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.

Mesuré avec TMDB sur un profil réel

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.

Comparer deux profils

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.

La fiabilité, affichée

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.

Le récap d'année

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.

Ce qu'il te reste à voir

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.

Les petits finitions

  • 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 un role="group" avec son titre. Le libellé et le nombre suffisent — inutile de faire lire deux fois la même chose à un lecteur d'écran.

Ce que la page affiche

  1. 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.
  2. 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.
  3. 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.
  4. Tes mieux et moins bien notés, avec les affiches tirées du flux.
  5. La liste des films revus.
  6. 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).

Mesuré sur un profil réel (dave)

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.

Direction artistique

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.

La mosaïque des films par mois

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.

Mesuré sur un profil réel (dave)

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 %

Les pièges rencontrés

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.

Ce qui manque

  • 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.

About

Turns a public Letterboxd profile into written verdicts, compares two profiles, and exports month mosaics. No API key, no export, zero dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages