Skip to content

feat(tmdb): matching d'affiches adapté film/série/anime#6

Merged
ohugonnot merged 2 commits into
masterfrom
feat/tmdb-poster-matching
Jun 20, 2026
Merged

feat(tmdb): matching d'affiches adapté film/série/anime#6
ohugonnot merged 2 commits into
masterfrom
feat/tmdb-poster-matching

Conversation

@ohugonnot

Copy link
Copy Markdown
Owner

Contexte

Le matching d'affiches TMDB cherchait des films partout : toutes les séries et animés matchaient un film homonyme (« Breaking Bad » → film « Breaking Bad Wolf », « The Mandalorian » → le film, « One Piece » → « One Piece: Gold »…). Cette PR rend le matching réellement adaptatif au type de média et plus robuste sur les noms de release crades.

Changements

Cœur du matching (functions.php)

  • tmdb_match : boucle word-removal (raccourcit la requête mot par mot, garde la plus longue qui passe le seuil), année en paramètre TMDB typé (&year= / &first_air_date_year=), fusion bilingue fr/en des variantes de titre par id (clé pour l'anime), flag transitoire vs no-match (un 5xx passager ne brûle plus match_attempts).
  • Recherche toujours movie ET tv — c'est le scoring (popularité + similarité + type) qui tranche. C'était la régression principale.
  • Scoring sur toutes les variantes de titre + bonus de type TV renforcé quand le dossier est une série.
  • Regex épisode élargie aux numéros à 3-4 chiffres (s\d{1,2}e?\d{0,4}), validée sur un corpus de torrents réels.

Worker (tools/tmdb-worker.php)

  • Délègue à tmdb_match.
  • preferTv structurel : un dossier est une série s'il contient ≥2 vidéos ou des sous-dossiers saison/numérotés (Season 1, 01, 02) — plus fiable que parser le nom de fichier.
  • usleep uniquement sur appel réseau réel (plus de sommeil sur cache hit).

Démo Docker = vrai install

  • Suppression du seed en dur (seed-tmdb.php) → demo-bootstrap.php lance le vrai worker au démarrage ; worker ajouté au cron Docker (manquait aux installs Docker).
  • Médias de démo enrichis (films/séries/animés + cas limites réalistes).
  • Durcissement : media dir passé via variable exportée (pas d'interpolation dans su -c).

Doc & tests

  • docs/TMDB_POSTERS.md : flux complet du système d'affiches.
  • tests/TmdbMatchTest.php + cas d'extraction (épisodes 3-4 chiffres). Suite : 456 tests verts.

Vérification

Rebuild Docker propre (volumes vierges) : 11/11 séries+animés matchés en tv (vs 0/11 avant), 18/18 films restent movie, vidéo/HLS/transcode OK.

Lien démo du README mis à jour vers le nouveau serveur.

root added 2 commits June 20, 2026 10:48
Matching adapté au type de média et résilient aux noms de release crades.

- tmdb_match: boucle word-removal (raccourcit la requête mot par mot, garde la
  plus longue au-dessus du seuil), année en paramètre TMDB typé, fusion
  bilingue fr/en des titres par id, flag transitoire vs no-match pour ne pas
  brûler match_attempts sur un 5xx passager
- recherche TOUJOURS movie ET tv, le scoring tranche (corrige les séries qui
  matchaient un film homonyme : "Breaking Bad" -> film "Breaking Bad Wolf")
- preferTv structurel: >=2 vidéos ou sous-dossiers saison/numérotés -> série,
  plus fiable que le nom de fichier; bonus de type TV renforcé dans ce cas
- regex épisode élargie aux numéros 3-4 chiffres (s\d{1,2}e?\d{0,4})
- worker délègue à tmdb_match; sleep uniquement sur appel réseau réel
- démo: lance le vrai worker au démarrage (suppression du seed en dur), worker
  ajouté au cron Docker; médias de démo enrichis + cas limites
- durcissement: media dir passé via variable exportée (pas d'interpolation -c)
- docs/TMDB_POSTERS.md; tests tmdb_match + extraction (épisodes 3-4 chiffres)

Lien démo README mis à jour vers le nouveau serveur.
- params de sortie bool &$responded/$fromCache : défaut false (pas null) →
  type non-nullable attendu par PHPStan
- e2e: démo enrichie (18 films, 5 animés, 6 séries) → maj des comptes attendus
@ohugonnot ohugonnot merged commit 43a0754 into master Jun 20, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant