feat: résolution Premium → Debrid → Free et plugins Real-Debrid / AllDebrid (MAT-142)
Ferme MAT-142. Deux plugins debrid, une cascade de résolution configurable, et les entrées registry correspondantes.
Ce qui change côté hôte
La résolution d'un lien ne prenait plus le premier plugin qui revendiquait l'URL. Elle parcourt maintenant les niveaux dans l'ordre défini dans Settings → Downloads (Premium → Debrid → Free par défaut) et retient, pour chaque lien, le plugin et le compte à utiliser. Chaque niveau qui décline enregistre pourquoi, donc une cascade épuisée nomme les rungs essayés au lieu d'échouer sur un « aucune source » nu (R-04).
resolve_url trie désormais les plugins Debrid en dernier : sur l'ordre alphabétique seul, vortex-mod-alldebrid volait les URLs que vortex-mod-mediafire possède.
Un config.toml édité à la main ne peut plus casser la cascade : un niveau inconnu fait échouer le chargement bruyamment, une liste partielle ou dupliquée est renormalisée vers les trois niveaux.
Les deux plugins
vortex-mod-realdebridv1.0.0 — 58 testsvortex-mod-alldebridv1.0.0 — 48 tests
Les deux passent le lien à leur API, renvoient l'URL CDN directe, et ne retournent jamais vers la page d'origine (R-02). Le token vit dans le keyring, lu via get_credential ; il n'est ni loggé, ni persisté, ni recopié dans un message d'erreur — y compris quand serde échoue sur le payload de credential, où l'erreur d'origine est volontairement jetée parce qu'elle cite la valeur fautive (R-05).
Les codes d'erreur de chaque service sont mappés sur les codes machine de l'hôte pour que la cascade sache pourquoi un niveau décline. Le sens du mapping compte : un code ACCOUNT_* fait cesser à l'hôte d'utiliser le compte pour tous les hosters, donc une panne qui appartient au hoster ou au service debrid n'est jamais classée comme telle. Deux codes AllDebrid étaient du mauvais côté et ont été corrigés — LINK_HOST_UNAVAILABLE (hoster HS) et NO_SERVER (AllDebrid saturé) désactivaient un abonnement payant valide pour une panne tierce.
AllDebrid répond HTTP 200 sur presque tous ses échecs, donc l'enveloppe est parsée avant que quoi que ce soit soit traité comme un succès.
Registry
Les checksums viennent des SHA256SUMS produits par la CI de chaque plugin, pas d'un build local : les artefacts WASM ne sont pas reproductibles bit à bit hors runner. Vérifiés en retéléchargeant les assets publiés.
Les deux entrées exigent Vortex 0.3.0 — c'est la version qui apporte la cascade. Sur un hôte plus ancien, un plugin debrid n'est qu'un revendiquant d'URL de plus et passerait devant le plugin hoster qui possède le domaine.
Écart assumé sur R-01
R-01 demande « trafic restant + expiration ». Seule l'expiration est remontée. Aucun des deux services n'expose un quota scalaire en octets : limitedHostersQuotas d'AllDebrid compte des téléchargements par hoster et par jour, et les limites Real-Debrid sont une map par hôte derrière /traffic. L'UI formate ces champs avec formatBytes, donc les remonter afficherait un chiffre faux. La vue Accounts dégrade proprement sur « inconnu ». Documenté dans les deux READMEs.
Tests
1817 tests Rust et 747 tests front passent. Chaque plugin a des tests de parsing sur payloads capturés plus un smoke test qui charge le vrai artefact WASM release et appelle chaque export à travers l'ABI Extism réelle, host functions stubbées comprises. Les deux CI plugin sont vertes et les releases v1.0.0 publiées.
Ce que les tests ne couvrent pas : l'ordonnancement Debrid en dernier dans resolve_url n'a pas de test automatisé — le dépôt hôte n'a aucune fixture WASM et en ajouter une pour une ligne de tri coûterait plus que ce qu'elle protège. La cascade elle-même, qui est le vrai mécanisme de R-03, est testée avec des mocks in-memory des deux services.
Summary by cubic
Adds debrid support with a configurable Premium → Debrid → Free resolution order and safer fallbacks with clear reasons. Addresses MAT-142 by integrating vortex-mod-realdebrid and vortex-mod-alldebrid to expand host coverage.
-
New Features
- Debrid plugins:
vortex-mod-realdebridandvortex-mod-alldebridreturn direct CDN links via keyring-held tokens, map service errors to host codes, and parse AllDebrid’s 200-error envelope. - Resolution cascade: the host walks the order set in Settings → Downloads, choosing the plugin and account before any hoster is contacted; every declined tier records why. Debrid plugins are ordered after hosters during URL claiming.
- Settings/API: new “Resolution priority” UI with i18n;
resolution_orderadded to IPC and config with validation and normalization. - Registry: both plugins added with CI SHA256 checksums and a minimum Vortex version of 0.3.0.
- Tests: cascade walk and download-time fallback tests, plus UI tests for the setting.
- Debrid plugins:
-
Bug Fixes
- Debrid that fails at download time now falls through to anonymous hoster extraction; when no rung delivers,
ResolutionExhaustedlists all reasons. Captcha challenges pass through, and premium never downgrades to free. - Fallthrough targets only hosters, never a second debrid, avoiding misreporting the free rung.
- IPC hardening: resolution tier identifiers are length-bounded to prevent oversized error strings.
- Debrid that fails at download time now falls through to anonymous hoster extraction; when no rung delivers,
Summary by CodeRabbit
- New Features
- Added support for Real-Debrid and AllDebrid, including premium expiry reporting.
- Introduced a configurable Premium → Debrid → Free resolution order for link resolution and hoster extraction.
- Bug Fixes
- Improved debrid/free fallback behavior with clearer multi-tier error reporting when all rungs are exhausted.
- Hardened IPC/config handling by rejecting oversized resolution tier identifiers.
- Documentation
- Updated changelog and added localized UI strings for the new resolution order setting.
- Tests
- Added/updated unit and UI tests covering tier ordering, fallback scenarios, and settings behavior.