13 releases (5 stable)

1.0.4 May 7, 2022
1.0.3 Dec 12, 2021
1.0.2 Oct 28, 2021
0.2.1 Oct 23, 2021
0.1.0 Sep 16, 2021

#556 in Network programming

45 downloads per month
Used in rtorrent-utils

MIT license

72KB
1K SLoC

rtorrent-xmlrpc-bindings

Typed, Rust-ey bindings for the XMLRPC rtorrent API

Interface

The top-level structure is Server, which represents a logical XMLRPC endpoint. (For now, only HTTP endpoints are supported, but that could be expanded relatively easily.)

One can get a list of loaded torrents via Server::download_list(). Download objects represent a loaded torrent (identified by SHA1 digest, in hex).

For each Download, there are a number of accessors for attributes on that loaded torrent. (Accessors on Download correspond to the d.* methods in the rtorrent API.) Additionally, one can get a list of trackers for that download with Download::trackes().

Tracker objects represent a specific tracker for a given download. (Accessors on Tracker correspond to the t.* methods in the rtorrent API.) One example is Tracker::url().

We can get the Peers for a loaded torrent via the Download::peers() method. Peers represent other participants in the swarm for that particular torrent. (Accessors on Peer correspond to the p.* methods in the rtorrent API.) One example is Peer::address().

File objects represent an individual file associated with a download. Downloads may have one or more Download::files(). Accessors on File correspond to the f.* methods in the rtorrent API. An example is File::path().

Example

For each torrent, print its name, and whether or not it is active.

use rtorrent_xmlrpc_bindings as rtorrent;
use rtorrent::Result;

fn main() -> Result<()> {
    let handle = rtorrent::Server::new("http://1.2.3.4/RPC2");
    for dl in handle.download_list()? {
        println!("{}: {}", dl.name()?, if dl.is_active()? { "active" } else { "inactive" });
    }
    Ok(())
}

Do the same thing, using the multicall API.

use rtorrent_xmlrpc_bindings as rtorrent;
use rtorrent::multicall::d;

let handle = rtorrent::Server::new("http://1.2.3.4/RPC2");
d::MultiBuilder::new("default")
    .call(d::NAME)
    .call(d::IS_ACTIVE)
    .invoke()?
    .iter()
    .for_each(|(name, active)| {
        println!("{}: {}", name, if active { "active" } else { "inactive" });
    });

Dependencies

~1.5MB
~31K SLoC