perf(details): Odysee par l'API LBRY + cache des métadonnées (45 s → 0,2 s)

Mesuré avant : `/api/details/odysee/…` = 44,7 s puis « No video formats
found! » — la page Watch restait une minute sans titre, vues, description ni
vignette. L'extracteur `lbry` de yt-dlp n'est pas utilisable ici.

- Nouvelle branche Odysee dans /api/details : `resolve` de l'API LBRY
  (`server/providers/odysee.mjs` → `resolveOdyseeVideo`) = 229 ms mesurés,
  titre/description/vignette/durée/date/canal + avatar. Claim introuvable →
  404 `odysee_claim_not_found` (le client garde les données du flux), panne →
  502 `odysee_details_failed`. Jamais de repli yt-dlp (45 s pour échouer).
- `views` volontairement OMIS pour Odysee : ni LBRY ni lighthouse n'exposent
  de compteur pour un claim isolé (l'`effective_amount` est un montant LBC).
- Cache mémoire de /api/details : 6 h, LRU 500 (`DETAILS_CACHE_TTL_MS`,
  `DETAILS_CACHE_MAX_ENTRIES`) — métadonnées immuables, chaque /watch
  relançait un dump complet.
- `views`/`duration` ne sont plus émis quand ils valent 0 : un 0 écrasait la
  valeur du flux côté client (merge sur `typeof === 'number'`), d'où les
  « 0 vue » sur les fournisseurs muets — même doctrine que
  `parseRumbleViews` (« jamais de compteur à 0 »).
- Mapping pur `odyseeClaimToVideo` testé hors ligne : 21 assertions,
  `npm run test:odysee`.
This commit is contained in:
2026-10-02 14:48:53 -04:00
parent 6f6d7ddde1
commit c45e04af42
5 changed files with 198 additions and 3 deletions
+1
View File
@@ -27,6 +27,7 @@
"fixtures:record": "node ./server/tests/record_provider_shapes.mjs",
"doc:providers": "node ./server/tests/generate-provider-doc.mjs",
"test:rumble": "node ./server/tests/rumble-ld.test.mjs",
"test:odysee": "node ./server/tests/odysee-resolve.test.mjs",
"test:cache": "node ./server/tests/search-cache.test.mjs",
"test:videos": "node ./server/tests/videos_catalog.test.mjs",
"test:channelref": "node ./server/tests/channel_ref.test.mjs",