fix(tmdb): un titre sans identifiant IMDb sur TMDB remonte ses flux (FOXA-2841) #37
No reviewers
Labels
No labels
montee-majeure
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
foXaCe/wacustom!37
Loading…
Reference in a new issue
No description provided.
Delete branch "agent/opencode-gratuit/ec44c9114e04"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Un film ou une série trop récent, ou trop niche, n'a pas encore de fiche IMDb sur TMDB. Le catalogue (AIOMetadata) sert alors un
tmdb:<id>au lieu d'untt…— etextract_media_infone connaissait pas cette forme.Le défaut, tel que mesuré
/find— qui exige un IMDb id — échouait toujours, etstream.py:610rendait[]. Zéro flux, sans erreur visible, sur un titre que le catalogue servait correctement. Le chemin est vivant, pas du code mort :wastream/utils/validators.py:141(le parseur) →wastream/services/stream.py:586(appel) →wastream/services/stream.py:605(résolution TMDB parimdb_id).Ce qui change
tmdb:dédiée dansextract_media_info. Elle sorttmdb_id, jamaisimdb_id; les quatre branches rendent désormais la même clétmdb_id, àNonepourtt…etkitsu:. Un film reste sans saison ni épisode, comme la formett…d'un film ; c'est une série qui prendsaison:episodeà partir de la troisième et quatrième partie./find:get_enhanced_metadata_by_tmdb_id/get_metadata_by_tmdb_iddanswastream/services/tmdb.py,_get_metadata_by_tmdb_iddanswastream/services/stream.py, et l'aiguillage dansget_streams.L'amont
dydy13014/wacustom(27bb2b9, 2026-10-01) prend la même direction et extrait les mêmes deux constructeurs. On ne recopie pas son patch : la résolution est écrite dans notre structure, et elle est plus complète sur trois points.genre_idsn'existe que sur un résultat de recherche ; la fiche/tv/{id}rendgenres, une liste d'objets. Sans la reprise, la détection d'anime (genre 16 + mot-clé 210024) ne verrait jamais rien sur le chemintmdb:<id>— tout anime servi entmdb:<id>aurait été cherché comme une série, donc par les mauvais mots-clés.external_idsentre dans l'append_to_responsedu film, que l'amont ne demande que sur le chemintmdb:. Chez nous il est demandé dans les deux cas : c'est la même requête, et c'est le seul endroit où TMDB peut livrer un identifiant que le catalogue ne connaissait pas — un titre lié à une fiche IMDb depuis la dernière visite redevient lisible par les sources qui l'exigent. L'IMDb id connu du/findreste prioritaire./find; à défaut, elle vient de la fiche. Un/findsansrelease_datene coûte plus un filtre d'année dans la recherche.Un piège, tenu : TMDB rend
external_ids: nullsur certaines fiches. Les deux constructeurs lisent la clé à travers unor {}— sans quoi toute la fiche part en erreur et l'addon rend zéro flux, exactement le symptôme qu'on corrige. Un identifianttmdb:qui n'est pas un entier est refusé avant toute requête, et le parseur retombe alors sur le découpage générique : l'échec reste celui d'aujourd'hui, il n'y en a pas de nouveau.Porte
Le chemin
/findn'a pas bougé : deux requêtes, dans le même ordre, et les deux constructeurs rendent exactement les mêmes clés que les deuxreturnd'avant — vérifié par lecture de l'arbre, pas à l'œil.Rouge avant, vert après. Base
21dd7be, suite neuve seule, code d'avant :Les 4 qui passent déjà sont les cas du chemin
/find: ce sont des verrous de non-régression, pas des témoins du correctif. Après, sur l'arbre fusionné avecmain(qui porte les six cas deFOXA-2842) :Écart 31 / 489 → 32 / 532 : +1 suite, +43 tests, aucun retrait. Les 43 cas de
tests/test_tmdb_sans_imdb.pycouvrent les trois formes (tt…,tmdb:,kitsu:) côte à côte, un film et une série résolus sans/find, l'anime lu sur la fiche,external_ids: null, le jeton vide et l'identifiant non numérique qui ne posent aucune requête, la fiche introuvable et la panne réseau qui rendentNonesans lever, et l'aiguillage deget_streamsavec la bonne saison et le bon épisode. Cinq assertions detest_validators.pycomplétées de la clétmdb_id; rien d'autre n'y change.La référence
maina avancé entre le premier jet et cette fusion : la référence passe à 32 / 532, et l'écart honnête est489 + 43, pas483 + 43. Les deux Blocs de conflit (CLAUDE.md,JOURNAL.md) sont résolus à la main, les trois valeurs dans l'ordre, l'entrée deFOXA-2842replantée avant la mienne.Un film ou une série trop récent, ou trop niche, n'a pas encore de fiche IMDb sur TMDB : le catalogue (AIOMetadata) sert alors un `tmdb:<id>` au lieu d'un `tt…`. `extract_media_info` ne connaissait pas cette forme — le découpage générique prenait le littéral `tmdb` pour un IMDb id, décalait saison et épisode d'un cran, et `/find` (qui exige un IMDb id) échouait toujours. L'addon rendait zéro flux pour ces titres. Une forme `tmdb:` dédiée dans le parseur, et une résolution TMDB directe par identifiant (`get_enhanced_metadata_by_tmdb_id`, `get_metadata_by_tmdb_id`) qui interroge la fiche sans passer par `/find`. L'amont `dydy13014/wacustom` (27bb2b9) prend la même direction ; on ne recopie pas son patch, on écrit la résolution dans notre structure. Trois points où la notre est plus complète : - `genre_ids` n'existe que sur un résultat de recherche. La fiche `/tv/{id}` rend `genres` ; sans la reprise, la détection d'anime (genre 16 + mot-clé 210024) ne verrait jamais rien sur le chemin `tmdb:<id>` et tout anime y serait cherché comme une série. - `external_ids` entre dans l'`append_to_response` du film, qui ne le demandait pas : c'est le seul endroit où TMDB peut livrer un IMDb id que le catalogue ne connaissait pas (titre lié depuis la dernière visite). Aucun surcoût — c'est la même requête. - l'année d'un film ou d'une série vient de la fiche quand le résultat de recherche n'en porte pas ; la perdre ne coûtait qu'un filtre d'année en moins dans la recherche. `external_ids: null` est une réponse réelle de TMDB : les deux builders tolèrent la clé nulle. Un identifiant `tmdb:` qui n'est pas un entier retombe sur le découpage générique — donc sur l'échec d'aujourd'hui, pas sur un nouveau. Le chemin `/find` n'a pas bougé : deux requêtes, dans l'ordre, mêmes clés rendues. Écart : 31 suites / 483 tests → 32 suites / 526 tests, 0 échec. `tests/test_tmdb_sans_imdb.py` (43 cas) fige les trois formes (`tt…`, `tmdb:`, `kitsu:`) côte à côte, la résolution directe, et l'aiguillage de `get_streams`. Les quatre cas du chemin `/find` passent aussi sur le code d'avant : ce sont des verrous de non-régression.