Go to file
Matt Joiner de928be582 Remove premature update to piece priority after piece is completed
This should have prevented Torrent.piecePriorityChanged from being called, meaning requests for the completed piece were not canceled, and the piece remained in connection's piece request queue, which meant wasted effort downloading chunks for an already acquired piece.

Thanks to @elgatito for discovering the issue.
2018-01-28 15:52:14 +11:00
.circleci Fix benchmark job in CI 2018-01-25 17:20:07 +11:00
bencode bencode: Add ignore_unmarshal_type_error tag 2018-01-27 14:31:46 +11:00
cmd cmd/torrent: Fix logging when progress bar and stderr are the same file 2018-01-25 13:12:46 +11:00
fs Add File priorities 2018-01-21 22:49:12 +11:00
internal sortimports 2018-01-09 23:12:01 +11: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 bencode: Add ignore_unmarshal_type_error tag 2018-01-27 14:31:46 +11:00
mmap_span mmap_span: Synchronize access to memory maps to avoid race when unmapping 2018-01-06 16:39:52 +11:00
mse Improve some log messages 2018-01-25 13:10:52 +11:00
peer_protocol Fix peer_protocol benchmark 2018-01-25 17:43:45 +11:00
storage storage: Export NewSqlitePieceCompletion 2018-01-12 11:09:33 +11:00
testdata Add the fs test torrent to the repo 2017-12-29 13:50:26 +11:00
tracker megacheck and staticcheck fixes 2018-01-06 16:53:40 +11:00
util megacheck and staticcheck fixes 2018-01-06 16:53:40 +11:00
LICENSE Update LICENSE 2018-01-27 11:21: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 Update Client.newConnection with changed rateLimitedReader interface 2018-01-28 15:42:37 +11:00
client_test.go Avoid race in test 2018-01-27 14:31:46 +11:00
config.go Add very tentative UPnP NAT traversal 2018-01-25 13:14:20 +11:00
conn_stats.go Add connection read stats 2016-07-12 16:42:04 +10:00
connection.go Add separate piece priorities, and cache pending pieces 2018-01-25 17:18:36 +11:00
connection_test.go Add Torrent.setInfo 2018-01-25 17:10:37 +11:00
doc.go List implemented BEPs 2016-07-11 13:53:00 +10:00
example_test.go Add File.NewReader 2018-01-06 16:37:13 +11:00
file.go Fix file piece index offset calculations 2018-01-25 17:01:29 +11: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 Make peerID a public type 2018-01-06 15:50:45 +11:00
handshake_test.go Generalise use of peerExtensionBytes 2017-11-08 19:28:03 +11:00
issue97_test.go Add Torrent.setInfo 2018-01-25 17:10:37 +11: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 Add some helpful comments to type PeerID 2018-01-25 13:14:37 +11:00
peerid_test.go Make peerID a public type 2018-01-06 15:50:45 +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 Add separate piece priorities, and cache pending pieces 2018-01-25 17:18:36 +11:00
piecestate.go Change the way piece state is exposed to give more detail 2015-06-01 18:22:12 +10:00
portfwd.go Add very tentative UPnP NAT traversal 2018-01-25 13:14:20 +11:00
protocol.go Abstract out making a cancel message 2017-09-18 13:42:42 +10:00
ratelimitreader.go Fix download rate limiter and add test 2018-01-28 15:28:45 +11:00
reader.go Add TODO 2018-01-25 17:43:33 +11:00
reader_test.go Add File.NewReader 2018-01-06 16:37:13 +11:00
rlreader_test.go Fix download rate limiter and add test 2018-01-28 15:28:45 +11:00
spec.go Add error return value to metainfo.MetaInfo.UnmarshalInfo 2016-09-20 12:32:15 +10:00
t.go Avoid race in test 2018-01-27 14:31:46 +11:00
torrent.go Remove premature update to piece priority after piece is completed 2018-01-28 15:52:14 +11:00
torrent_stats.go Added peer count stats to TorrentStats struct 2017-04-22 23:29:10 -04:00
torrent_test.go Add separate piece priorities, and cache pending pieces 2018-01-25 17:18:36 +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