Full-featured BitTorrent client package and utilities
Go to file
Matt Joiner 110764480e Avoid triggering writer cond where possible 2017-09-01 12:09:41 +10:00
.circleci Get torrentfs fuse test working 2017-08-29 14:02:30 +10:00
bencode Make bencode.Bytes work with pointer and nonpointer receivers 2016-08-26 20:29:29 +10:00
cmd cmd/torrent: Enhance debugging 2017-09-01 10:35:40 +10:00
fs Get torrentfs fuse test working 2017-08-29 14:02:30 +10:00
internal Remove the InfoEx type, and don't generate its infohash on the fly 2016-08-26 20:29:05 +10:00
iplist iplist: Add TODO to allow unmapping 2017-06-11 20:09:40 +10:00
logonce logonce is a package that prints each distinct message only once 2014-11-16 13:04:44 -06:00
metainfo metainfo URL list can be a string or list 2017-06-16 17:07:30 +10:00
mmap_span refactor struct identifiers to follow conventional go names 2016-04-18 23:11:11 -05:00
mse Try to reduce allocations in cipherReader 2017-08-28 17:27:53 +10:00
peer_protocol Add peer_protocol.Message.MustMarshalBinary 2017-08-31 14:30:53 +10:00
storage bug fix: initial infoHash for mmapStoragePiece 2017-07-10 19:33:39 +08:00
testdata Add benchmark for adding a torrent with a lot of pieces 2015-06-22 19:43:22 +10:00
tracker Add CircleCI 2.0 turd 2017-08-27 02:10:17 +10:00
util gofmt simplify 2016-11-22 14:01:09 +11:00
LICENSE The license is MPL2.0 2015-03-25 17:35:33 +11:00
README.md cmd/torrentfs: Switch to tagflag and rename -torrentPath->-metainfoDir 2017-08-27 12:25:51 +10:00
TODO Remove completed TODO item 2016-11-25 17:24:16 +11:00
client.go Avoid triggering writer cond where possible 2017-09-01 12:09:41 +10:00
client_test.go Remove unused functions 2017-08-26 13:23:04 +10:00
config.go sortimports 2017-03-19 17:04:32 +11:00
conn_stats.go Add connection read stats 2016-07-12 16:42:04 +10:00
connection.go Avoid triggering writer cond where possible 2017-09-01 12:09:41 +10:00
connection_test.go Generate requests, cancels and interest state in the connection writer 2017-08-31 23:48:52 +10:00
doc.go List implemented BEPs 2016-07-11 13:53:00 +10:00
example_test.go Merge Torrent and torrent types 2016-04-03 18:40:43 +10:00
file.go Move File.State lock to top of function 2017-05-26 13:00:28 +10:00
file_test.go Add File.Cancel 2016-02-05 01:18:54 +11:00
global.go Track buffered but not posted messages, and unify the expvar names for those counters 2017-09-01 10:53:59 +10:00
issue97_test.go Fixes for changes to metainfo.MetaInfo.UnmarshalInfo 2016-09-20 18:39:07 +10:00
main_test.go Skeleton TestMain 2016-07-10 22:58:43 +10:00
misc.go Kick only the worst connection when a piece fails a check 2016-11-23 12:59:23 +11:00
misc_test.go Replace go-check with testify 2015-08-03 16:23:05 +10:00
pex.go Redo the compact peer types 2015-08-17 19:52:47 +10:00
pex_test.go Redo the compact peer types 2015-08-17 19:52:47 +10:00
piece.go Comment on PiecePriorityNext 2016-08-30 16:55:50 +10:00
piecestate.go Change the way piece state is exposed to give more detail 2015-06-01 18:22:12 +10:00
ratelimitreader.go Keep rate limited reader reads to within the burst capacity 2017-08-31 14:32:22 +10:00
reader.go Synchronize Torrent.Info 2017-08-29 15:16:53 +10:00
reader_test.go Maintain a torrent.Reader for each file handle 2017-08-28 01:42:02 +10:00
spec.go Add error return value to metainfo.MetaInfo.UnmarshalInfo 2016-09-20 12:32:15 +10:00
t.go Synchronize Torrent.Info 2017-08-29 15:16:53 +10:00
torrent.go Generate requests, cancels and interest state in the connection writer 2017-08-31 23:48:52 +10:00
torrent_stats.go Added peer count stats to TorrentStats struct 2017-04-22 23:29:10 -04:00
torrent_test.go Close implicit Client default storage on Client.Close 2017-06-01 22:57:08 +10:00
tracker_scraper.go Tidy the next announce tracker status field 2017-08-17 01:18:18 +10:00
utp.go Use DialContext instead of DialTimeout with utp 2017-08-16 15:35:17 +10:00
utp_go.go Use go-libutp if cgo is enabled 2017-06-16 18:08:24 +10:00
utp_libutp.go Use go-libutp if cgo is enabled 2017-06-16 18:08:24 +10:00
worst_conns.go Ditch the use of generic slices.HeapInterface for finding the worst "bad" connection 2016-10-31 16:24:48 +11:00

README.md

torrent

CircleCI GoDoc Join the chat at https://gitter.im/anacrolix/torrent

This repository implements BitTorrent-related packages and command-line utilities in Go. The emphasis is on use as a library from other projects. It's been used 24/7 in production by a downstream, private service since late 2014.

There is support for protocol encryption, DHT, PEX, uTP, and various extensions. See the package documentation for a more complete list. There are several data storage backends provided: blob, file, and mmap, and you can write your own, such as to store data on S3, or in a database. You can use the provided binaries in ./cmd, or use torrent as a library for your own applications.

Many of the sub-packages can be used for other purposes: bencode, and tracker, in particular.

Installation

Install the library package with go get github.com/anacrolix/torrent, or the provided cmds with go get github.com/anacrolix/torrent/cmd/....

Library example

There is a small example in the package documentation.

Other public projects using torrent

Mobile

There's a branch called mobile that supports binding to torrent with the gomobile tool. It has some API changes as required by gomobile. Checkout the mobile branch, and bind as usual.

Commands

Here I'll describe what some of the provided commands in ./cmd do.

Note that the godo command which is invoked in the following examples builds and executes a Go import path, like go run. It's easier to use this convention than to spell out the install/invoke cycle for every single example.

torrent

Downloads torrents from the command-line. This first example does not use godo.

$ go get github.com/anacrolix/torrent/cmd/torrent
# Now 'torrent' should be in $GOPATH/bin, which should be in $PATH.
$ torrent 'magnet:?xt=urn:btih:KRWPCX3SJUM4IMM4YF5RPHL6ANPYTQPU'
ubuntu-14.04.2-desktop-amd64.iso [===================================================================>]  99% downloading (1.0 GB/1.0 GB)
2015/04/01 02:08:20 main.go:137: downloaded ALL the torrents
$ md5sum ubuntu-14.04.2-desktop-amd64.iso
1b305d585b1918f297164add46784116  ubuntu-14.04.2-desktop-amd64.iso
$ echo such amaze
wow

torrentfs

torrentfs mounts a FUSE filesystem at -mountDir. The contents are the torrents described by the torrent files and magnet links at -metainfoDir. Data for read requests is fetched only as required from the torrent network, and stored at -downloadDir.

$ mkdir mnt torrents
$ godo github.com/anacrolix/torrent/cmd/torrentfs -mountDir=mnt -metainfoDir=torrents &
$ cd torrents
$ wget http://releases.ubuntu.com/14.04.2/ubuntu-14.04.2-desktop-amd64.iso.torrent
$ cd ..
$ ls mnt
ubuntu-14.04.2-desktop-amd64.iso
$ pv mnt/ubuntu-14.04.2-desktop-amd64.iso | md5sum
996MB 0:04:40 [3.55MB/s] [========================================>] 100%
1b305d585b1918f297164add46784116  -

torrent-magnet

Creates a magnet link from a torrent file. Note the extracted trackers, display name, and info hash.

$ godo github.com/anacrolix/torrent/cmd/torrent-magnet < ubuntu-14.04.2-desktop-amd64.iso.torrent
magnet:?xt=urn:btih:546cf15f724d19c4319cc17b179d7e035f89c1f4&dn=ubuntu-14.04.2-desktop-amd64.iso&tr=http%3A%2F%2Ftorrent.ubuntu.com%3A6969%2Fannounce&tr=http%3A%2F%2Fipv6.torrent.ubuntu.com%3A6969%2Fannounce