Repository navigation
resolver plugin
A resolver is what makes a one-click hoster, a multihoster or a debrid service downloadable. It turns a link of its provider into exactly one downloadable file — an address, a name, a size and headers — checks whether links are alive, and reports on the account: valid or not, premium or not, how much traffic is left. The bytes themselves are fetched by rDownloader's own transfer engine, not by the plugin.
Pick a crawler instead when one address stands for many files, a stream transform when the provider encrypts on the client, and a remote job when the provider works on a job for minutes or hours before there is a file.
| Scaffold | rdownloader plugin new --type resolver |
plugin_type |
resolver |
| World | resolver-plugin |
| Exports |
match-url, check-account, resolve, check, hosters
|
| Template | sdk/templates/resolver |
| Contract | Interface resolver |
-
You are asked before you are handed a link.
match-urlreaches nothing, and the host also checks the link againstmatch_domainsinmanifest.toml; a resolver that claims links belonging to nobody fails conformance. -
You never see a credential.
{{secret:<reference>}}in a header or query value is expanded by the host on the way out, towards the domains the manifest grants, and only for the account the call is made for. -
An account check states findings, not hopes.
premiumistrueonly where the check actually read a subscription.
The scaffold asks for secrets — the account's password slot, which requests reach only as
{{secret:…}} — and net_http with the hoster's own domains. A resolver may also ask for
cookies (the account's cookies for one address) and captcha (a challenge handed to the
configured solver or the person), and nothing else.
A resolver carries a [provider] section: the provider row the account form is built from — its
slug, kind, which credentials it takes and which hosts the secret may be sent to. Beside it,
match_domains names the links it claims at intake and download_domains where a resolved file
may be served from. The provider row explains
every field.
Ask for exactly what you use: the install preview shows every grant, and a component importing an interface its manifest does not grant cannot be instantiated. Every capability is listed under Capabilities.
plugin new reads its templates from sdk/templates, so run it from a checkout of the repository:
git clone https://github.com/degoya/rDownloader.git
cd rDownloader
rdownloader plugin new --type resolver --out ../myhoster
cd ../myhosterWithout an installation of rDownloader, the packaging tool rd-pack —
cargo build --profile release-test -p rd-pack in the checkout — takes the same arguments:
target/release-test/rd-pack plugin new --type resolver --out ../myhoster.
The directory name becomes the crate name and the plugin's slug (--name sets another). The
scaffold gets its own plugin id, its own copy of the contract in wit/rdownloader.wit and its own
Ed25519 key pair: plugin-signing.key, whose public half is already in manifest.toml. Keep that
file out of version control.
-
src/lib.rsdecides which links are yours. ReplaceHOSTSand keep it in step withmatch_domains; claim exact hosts and their sub-domains, never a host that merely ends in the same letters. -
src/guest.rsholds the four calls against your provider's API: the account check,resolve, the batch link check andhosters. -
manifest.toml:match_domains,download_domains, the[provider]row and[capabilities.net_http] domains— the narrowest list that works, including the CDN a download redirects to. -
locales/en.json: the English text of every failure code you report.
Change description and author under [metadata], and read the comment at the top of
src/lib.rs: it states what the host promises this type.
cargo testThe unit tests need no WebAssembly toolchain: only src/guest.rs is wasm32-specific. Give every
answer of your provider you read a test of its own.
cargo build --release --target wasm32-unknown-unknown
wasm-tools component new target/wasm32-unknown-unknown/release/myhoster.wasm -o target/myhoster.wasmThis needs the wasm32-unknown-unknown target and wasm-tools 1.261.0, the version the bundled
plugins are made with: cargo build makes a core module that carries the world src/guest.rs
generates, and wasm-tools component new turns it into the component. The plugin is built
without WASI: a component importing anything outside rdownloader:plugin is refused — see
Building without WASI.
rdownloader plugin package --manifest manifest.toml \
--component target/myhoster.wasm \
--locales locales --key plugin-signing.key --output myhoster.rdplug
rdownloader plugin conformance myhoster.rdplug --jsonconformance answers whether this application would run the package; it has to be clean before
you publish. For a key that outlives the scaffold, rdownloader plugin keygen --role plugin --output ./keys writes a pair: the Base64 in the .pub file goes into public_key, and key_id
gets a name of your own. In CI, RDOWNLOADER_PLUGIN_SIGNING_KEY holding the private key's PEM
text replaces --key. Details:
Packaging, signing and distribution.
For a first try without signing, package with --development instead of --key and start
rdownloader serve --plugin-development-mode, the only mode that accepts an unsigned package.
Install a signed package under Settings → Plugins → Add as an upload, or with
rdownloader plugin install myhoster.rdplug --root data/plugins. Review before installing shows
every permission and the signing key; a key this installation has not seen asks to be trusted —
compare its fingerprint. The message after installing says whether the plugin runs at once or
after the next restart; see Installing and trust.
Add an account for your provider under Settings → Accounts (see Hosters and accounts), run its account check, then paste a link into the LinkGrabber: the online check and the download go through your plugin.
Publish the .rdplug together with your key's fingerprint, or — so that people get your new
versions in the Catalogue — in a plugin repository of your own: a signed index built with
rdownloader plugin index build and a repository-role key. A repository only delivers: every
package in it still needs your plugin key, approved by the person installing it. See
A repository index and
Running a plugin repository.
The SDK's reusable CI workflow,
sdk/ci/plugin.yml, builds,
checks the imports, packages and runs conformance on every push and pull request; it signs only
on a push to the default branch or a tag, so a pull request never sees the key.
- Resolvers in the plugin reference — what the host does with each call, in full
-
Interface
resolver— every function and type, generated from the contract - Developing a plugin — the tools, translations, errors and what every type shares
-
The
resolvertemplate on GitHub
Getting started
- Installation
- Building from source
- Translating rDownloader
- First run
- Your first download
- The interface
Using rDownloader
- The download queue
- Download history
- The LinkGrabber
- Site rules
- Hosters and accounts
- Usenet and NZB
- BitTorrent
- Video and audio downloads
- Image galleries
- Livestream recording
- FTP, SFTP and WebDAV
- Object storage
- Subscriptions
- Remote jobs
- Storage, categories and rules
- Watched folders
- Post-processing
- Bandwidth and power
- Notifications
- Automation
- Statistics
- Keyboard and accessibility
Integrations
- Browser extension
- Desktop capture agent
- Command line client
- REST API
- MCP server
- Automation tool compatibility
Operating
- Docker and NAS
- Synology NAS
- Reverse proxy
- Accounts, sessions and permissions
- Sign in with an identity provider
- External tools
- Backup and restore
- Updates
- Security and privacy
- Diagnostics and maintenance
- Troubleshooting
- Defaults and limits
- Support matrix
Plugins
Plugin development
- Developing a plugin
- Resolver
- Transfer backend
- Intake parser
- Intake parser with mirrors
- Folder crawler
- Remote job
- Sign-in
- OAuth sign-in
- Metadata enricher
- Notification destination
- Post-processing step
- Upload destination
- Stream transform
- Plugin reference
- Packaging, signing and distribution
- Running a plugin repository
Reference