BitTorrent client and library in Go. Running in production at put.io.
Integration of embedded gRPC framework (All APIs translated to gRPC Server-Client (Peer providing information about data present in bolt db, torrent session states, other data stores such as piece cache statistics, pieces which are present in peers LRU cache, to reduce upload latencies)) in peers for executing APIs on different peers with very less data overhead.
- Core protocol
- Fast extension
- Magnet links
- Multiple trackers
- UDP trackers
- DHT
- PEX
- Message stream encryption
- WebSeed
- Fast resuming
- IP blocklist
- RPC server & client
- Console UI
- Tool for creating & reading .torrent files
If you are on MacOS you can install from brew:
brew install cenkalti/rain/rain
Otherwise, get the latest binary from releases page.
Rain is distributed as single binary file.
The main use case is running rain server
command and operating the server with rain client <subcommand>
commands.
Server consists of a BitTorrent client and a RPC server.
rain client
is used to give commands to the server.
There is also rain client console
command which opens up a text based UI that you can view and manage the torrents on the server.
Run rain help
to see other commands.
// Create a session
ses, _ := torrent.NewSession(torrent.DefaultConfig)
// Add magnet link
tor, _ := ses.AddURI(magnetLink, nil)
// Watch the progress
for range time.Tick(time.Second) {
s := tor.Stats()
log.Printf("Status: %s, Downloaded: %d, Peers: %d", s.Status.String(), s.Bytes.Completed, s.Peers.Total)
}
More complete example can be found under handleDownload
function at main.go file.
See package documentation for complete API.
All values have sensible defaults, so you can run Rain with an empty config but if you want to customize it's behavior,
you can pass a YAML config with -config
flag. Config keys must be in lowercase.
See the description of values in here: config.go
Rain is the main BitTorrent client used at put.io. It is designed to handle hundreds of torrents while using low system resources. The main difference from other clients is that Rain uses a separate peer port for each torrent. This allows Rain to download same torrent for multiple accounts in same private tracker and keep reporting their ratio correctly.
- IPv6 tracker extension
- IPv6 extension for DHT
- uTorrent transport protocol
- Superseeding
- HTTP seeding
- Merkle tree torrent extension
- uPnP port forwarding
- Selective downloading
- Sequential downloading