Go to file
Matt Joiner c44ee5fec4 Use peerID type more, and make its Stringer output nicer 2018-01-06 12:34:31 +11:00
.circleci Add apt-get update to CI 2017-10-12 16:32:11 +11:00
bencode bencode.scanner.ReadByte returned errors when it shouldn't have 2017-11-10 23:44:24 +11:00
cmd adding http user-agent setters and usage 2017-12-28 10:47:51 +02:00
fs Add the fs test torrent to the repo 2017-12-29 13:50:26 +11:00
internal Remove the InfoEx type, and don't generate its infohash on the fly 2016-08-26 20:29:05 +10:00
iplist More megacheck 2017-11-08 00:12:34 +11:00
logonce logonce is a package that prints each distinct message only once 2014-11-16 13:04:44 -06:00
metainfo Update error message in metainfo.Info.writeFiles 2017-12-29 12:18:55 +11:00
mmap_span refactor struct identifiers to follow conventional go names 2016-04-18 23:11:11 -05:00
mse sortimports 2017-12-01 18:12:29 +11:00
peer_protocol Apply megacheck to torrent package 2017-11-07 16:11:59 +11:00
storage missinggo.LimitLen changed 2017-12-03 13:44:08 +11:00
testdata Add the fs test torrent to the repo 2017-12-29 13:50:26 +11:00
tracker adding http user-agent setters and usage 2017-12-28 10:47:51 +02: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 Add a link to Trickl 2017-11-06 13:42:46 +11:00
TODO Remove completed TODO item 2016-11-25 17:24:16 +11:00
client.go Use peerID type more, and make its Stringer output nicer 2018-01-06 12:34:31 +11:00
client_test.go Fix the Stats panic in #214 2017-12-02 09:58:08 +11:00
config.go adding http user-agent setters and usage 2017-12-28 10:47:51 +02:00
conn_stats.go Add connection read stats 2016-07-12 16:42:04 +10:00
connection.go Use peerID type more, and make its Stringer output nicer 2018-01-06 12:34:31 +11:00
connection_test.go Track completion known to implementation state 2017-10-12 16:09:32 +11: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 feat(config): Allows the torrent client to customise the client identity and connection config 2017-11-07 20:14:13 +02:00
handshake.go Use peerID type more, and make its Stringer output nicer 2018-01-06 12:34:31 +11:00
handshake_test.go Generalise use of peerExtensionBytes 2017-11-08 19:28:03 +11:00
issue97_test.go Fixes for changes to metainfo.MetaInfo.UnmarshalInfo 2016-09-20 18:39:07 +10:00
issue211_test.go Remove racy part of test 2017-12-01 23:08:53 +11:00
main_test.go Fix a lot of noisy logging and test warnings 2017-11-07 16:00:08 +11:00
misc.go Move some code around 2017-11-08 15:00:18 +11:00
misc_test.go Implement new request strategy 2017-09-23 15:25:47 +10:00
peerid.go Use peerID type more, and make its Stringer output nicer 2018-01-06 12:34:31 +11:00
peerid_test.go Use peerID type more, and make its Stringer output nicer 2018-01-06 12:34:31 +11: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 Fix a lot of noisy logging and test warnings 2017-11-07 16:00:08 +11:00
piecestate.go Change the way piece state is exposed to give more detail 2015-06-01 18:22:12 +10:00
protocol.go Abstract out making a cancel message 2017-09-18 13:42:42 +10:00
ratelimitreader.go Keep rate limited reader reads to within the burst capacity 2017-08-31 14:32:22 +10:00
reader.go missinggo.LimitLen changed 2017-12-03 13:44:08 +11: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 Make type piece public 2017-09-15 19:35:16 +10:00
torrent.go Improve a log message 2017-12-28 23:58:07 +11:00
torrent_stats.go Added peer count stats to TorrentStats struct 2017-04-22 23:29:10 -04:00
torrent_test.go Add a test for behaviour after getting metadata_size and before GotInfo 2017-11-08 19:31:10 +11:00
tracker_scraper.go adding http user-agent setters and usage 2017-12-28 10:47:51 +02:00
utp.go Use DialContext instead of DialTimeout with utp 2017-08-16 15:35:17 +10:00
utp_go.go added disable_libutp build flag usage (#215) 2017-12-06 11:56:26 +11:00
utp_libutp.go added disable_libutp build flag usage (#215) 2017-12-06 11:56:26 +11:00
utp_test.go Fix panic when error occurs binding uTP socket 2017-09-14 00:25:29 +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 package 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

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