Documentation ¶
Overview ¶
Package torrent implements a torrent client. Goals include:
- Configurable data storage, such as file, mmap, and piece-based.
- Downloading on demand: torrent.Reader will request only the data required to satisfy Reads, which is ideal for streaming and torrentfs.
BitTorrent features implemented include:
- Protocol obfuscation
- DHT
- uTP
- PEX
- Magnet links
- IP Blocklists
- Some IPv6
- HTTP and UDP tracker clients
Example ¶
package main import ( "log" "github.com/bigflood/torrent" ) func main() { c, _ := torrent.NewClient(nil) defer c.Close() t, _ := c.AddMagnet("magnet:?xt=urn:btih:ZOCMZQIPFFW7OLLMIC5HUB6BPCSDEOQU") <-t.GotInfo() t.DownloadAll() c.WaitAll() log.Print("ermahgerd, torrent downloaded") }
Output:
Example (FileReader) ¶
package main import ( "github.com/anacrolix/missinggo" "github.com/bigflood/torrent" ) func main() { var ( t *torrent.Torrent f torrent.File ) r := t.NewReader() defer r.Close() // Access the parts of the torrent pertaining to f. Data will be // downloaded as required, per the configuration of the torrent.Reader. _ = missinggo.NewSectionReadSeeker(r, f.Offset(), f.Length()) }
Output:
Index ¶
- Constants
- type Client
- func (cl *Client) AddDHTNodes(nodes []string)
- func (cl *Client) AddMagnet(uri string) (T *Torrent, err error)
- func (cl *Client) AddTorrent(mi *metainfo.MetaInfo) (T *Torrent, err error)
- func (cl *Client) AddTorrentFromFile(filename string) (T *Torrent, err error)
- func (cl *Client) AddTorrentInfoHash(infoHash metainfo.Hash) (t *Torrent, new bool)
- func (cl *Client) AddTorrentSpec(spec *TorrentSpec) (t *Torrent, new bool, err error)
- func (cl *Client) Close()
- func (cl *Client) DHT() *dht.Server
- func (cl *Client) IPBlockList() iplist.Ranger
- func (cl *Client) ListenAddr() net.Addr
- func (cl *Client) PeerID() string
- func (cl *Client) SetIPBlockList(list iplist.Ranger)
- func (cl *Client) Torrent(ih metainfo.Hash) (t *Torrent, ok bool)
- func (cl *Client) Torrents() (ret []*Torrent)
- func (cl *Client) WaitAll() bool
- func (cl *Client) WriteStatus(_w io.Writer)
- type Config
- type File
- func (f *File) Cancel()
- func (f *File) DisplayPath() string
- func (f *File) Download()
- func (f File) FileInfo() metainfo.FileInfo
- func (f *File) Length() int64
- func (f *File) Offset() int64
- func (f File) Path() string
- func (f *File) PrioritizeRegion(off, len int64)
- func (f *File) State() (ret []FilePieceState)
- func (f *File) Torrent() *Torrent
- type FilePieceState
- type Handle
- type Peer
- type PieceState
- type PieceStateChange
- type PieceStateRun
- type Reader
- func (r *Reader) Close() error
- func (r *Reader) Read(b []byte) (n int, err error)
- func (r *Reader) ReadContext(b []byte, ctx context.Context) (n int, err error)
- func (r *Reader) Seek(off int64, whence int) (ret int64, err error)
- func (r *Reader) SetReadahead(readahead int64)
- func (r *Reader) SetResponsive()
- func (r *Reader) Torrent() *Torrent
- type Torrent
- func (t *Torrent) AddPeers(pp []Peer)
- func (t *Torrent) AddTrackers(announceList [][]string)
- func (t *Torrent) BytesCompleted() int64
- func (t *Torrent) CancelPieces(begin, end int)
- func (t *Torrent) DownloadAll()
- func (t *Torrent) DownloadPieces(begin, end int)
- func (t *Torrent) Drop()
- func (t *Torrent) Files() (ret []File)
- func (t *Torrent) GotInfo() <-chan struct{}
- func (t *Torrent) Info() *metainfo.InfoEx
- func (t *Torrent) InfoHash() metainfo.Hash
- func (t *Torrent) Length() int64
- func (t *Torrent) Metainfo() *metainfo.MetaInfo
- func (t *Torrent) Name() string
- func (t *Torrent) NewReader() (ret *Reader)
- func (t *Torrent) NumPieces() int
- func (t *Torrent) PieceState(piece int) PieceState
- func (t *Torrent) PieceStateRuns() []PieceStateRun
- func (t *Torrent) Seeding() bool
- func (t *Torrent) SetDisplayName(dn string)
- func (t *Torrent) SetInfoBytes(b []byte) (err error)
- func (t *Torrent) String() string
- func (t *Torrent) SubscribePieceStateChanges() *pubsub.Subscription
- type TorrentSpec
Examples ¶
Constants ¶
const ( PiecePriorityNone piecePriority = iota // Not wanted. PiecePriorityNormal // Wanted. PiecePriorityReadahead // May be required soon. PiecePriorityNext // Succeeds a piece where a read occurred. PiecePriorityNow // A read occurred in this piece. )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Clients contain zero or more Torrents. A Client manages a blocklist, the TCP/UDP protocol ports, and DHT as desired.
func (*Client) AddDHTNodes ¶
func (*Client) AddTorrent ¶
func (*Client) AddTorrentFromFile ¶
func (*Client) AddTorrentInfoHash ¶
func (*Client) AddTorrentSpec ¶
func (cl *Client) AddTorrentSpec(spec *TorrentSpec) (t *Torrent, new bool, err error)
Add or merge a torrent spec. If the torrent is already present, the trackers will be merged with the existing ones. If the Info isn't yet known, it will be set. The display name is replaced if the new spec provides one. Returns new if the torrent wasn't already in the client.
func (*Client) Close ¶
func (cl *Client) Close()
Stops the client. All connections to peers are closed and all activity will come to a halt.
func (*Client) IPBlockList ¶
func (*Client) ListenAddr ¶
func (*Client) SetIPBlockList ¶
func (*Client) WaitAll ¶
Returns true when all torrents are completely downloaded and false if the client is stopped before that.
func (*Client) WriteStatus ¶
Writes out a human readable status of the client, such as for writing to a HTTP status page.
type Config ¶
type Config struct { // Store torrent file data in this directory unless TorrentDataOpener is // specified. DataDir string `long:"data-dir" description:"directory to store downloaded torrent data"` // The address to listen for new uTP and TCP bittorrent protocol // connections. DHT shares a UDP socket with uTP unless configured // otherwise. ListenAddr string `long:"listen-addr" value-name:"HOST:PORT"` // Don't announce to trackers. This only leaves DHT to discover peers. DisableTrackers bool `long:"disable-trackers"` DisablePEX bool `long:"disable-pex"` // Don't create a DHT. NoDHT bool `long:"disable-dht"` // Overrides the default DHT configuration. DHTConfig dht.ServerConfig // Don't ever send chunks to peers. NoUpload bool `long:"no-upload"` // Upload even after there's nothing in it for us. By default uploading is // not altruistic. Seed bool `long:"seed"` // User-provided Client peer ID. If not present, one is generated automatically. PeerID string // For the bittorrent protocol. DisableUTP bool // For the bittorrent protocol. DisableTCP bool `long:"disable-tcp"` // Called to instantiate storage for each added torrent. Provided backends // are in $REPO/data. If not set, the "file" implementation is used. DefaultStorage storage.Client DisableEncryption bool `long:"disable-encryption"` IPBlocklist iplist.Ranger DisableIPv6 bool `long:"disable-ipv6"` // Perform logging and any other behaviour that will help debug. Debug bool `help:"enable debug logging"` }
Override Client defaults.
type File ¶
type File struct {
// contains filtered or unexported fields
}
Provides access to regions of torrent data that correspond to its files.
func (*File) DisplayPath ¶
The relative file path for a multi-file torrent, and the torrent name for a single-file torrent.
func (*File) Download ¶
func (f *File) Download()
Requests that all pieces containing data in the file be downloaded.
func (*File) PrioritizeRegion ¶
Requests that torrent pieces containing bytes in the given region of the file be downloaded.
func (*File) State ¶
func (f *File) State() (ret []FilePieceState)
Returns the state of pieces in this file.
type FilePieceState ¶
type FilePieceState struct { Bytes int64 // Bytes within the piece that are part of this File. PieceState }
type PieceState ¶
type PieceState struct { Priority piecePriority // The piece is available in its entirety. Complete bool // The piece is being hashed, or is queued for hash. Checking bool // Some of the piece has been obtained. Partial bool }
The current state of a piece.
type PieceStateChange ¶
type PieceStateChange struct { Index int PieceState }
type PieceStateRun ¶
type PieceStateRun struct { PieceState Length int // How many consecutive pieces have this state. }
Represents a series of consecutive pieces with the same state.
type Reader ¶
type Reader struct {
// contains filtered or unexported fields
}
Accesses torrent data via a client.
func (*Reader) ReadContext ¶
func (*Reader) SetReadahead ¶
Configure the number of bytes ahead of a read that should also be prioritized in preparation for further reads.
func (*Reader) SetResponsive ¶
func (r *Reader) SetResponsive()
Don't wait for pieces to complete and be verified. Read calls return as soon as they can when the underlying chunks become available.
type Torrent ¶
type Torrent struct {
// contains filtered or unexported fields
}
Maintains state of torrent within a Client.
func (*Torrent) AddTrackers ¶
func (*Torrent) BytesCompleted ¶
Number of bytes of the entire torrent we have completed.
func (*Torrent) CancelPieces ¶
func (*Torrent) DownloadAll ¶
func (t *Torrent) DownloadAll()
Marks the entire torrent for download. Requires the info first, see GotInfo.
func (*Torrent) DownloadPieces ¶
func (*Torrent) Drop ¶
func (t *Torrent) Drop()
Drop the torrent from the client, and close it. It's always safe to do this. No data corruption can, or should occur to either the torrent's data, or connected peers.
func (*Torrent) Files ¶
Returns handles to the files in the torrent. This requires the metainfo is available first.
func (*Torrent) GotInfo ¶
func (t *Torrent) GotInfo() <-chan struct{}
Returns a channel that is closed when the info (.Info()) for the torrent has become available.
func (*Torrent) InfoHash ¶
The torrent's infohash. This is fixed and cannot change. It uniquely identifies a torrent.
func (*Torrent) Length ¶
The completed length of all the torrent data, in all its files. This is derived from the torrent info, when it is available.
func (*Torrent) Metainfo ¶
Returns a run-time generated metainfo for the torrent that includes the info bytes and announce-list as currently known to the client.
func (*Torrent) Name ¶
The current working name for the torrent. Either the name in the info dict, or a display name given such as by the dn value in a magnet link, or "".
func (*Torrent) NewReader ¶
Returns a Reader bound to the torrent's data. All read calls block until the data requested is actually available.
func (*Torrent) NumPieces ¶
The number of pieces in the torrent. This requires that the info has been obtained first.
func (*Torrent) PieceState ¶
func (t *Torrent) PieceState(piece int) PieceState
func (*Torrent) PieceStateRuns ¶
func (t *Torrent) PieceStateRuns() []PieceStateRun
Returns the state of pieces of the torrent. They are grouped into runs of same state. The sum of the state run lengths is the number of pieces in the torrent.
func (*Torrent) Seeding ¶
Returns true if the torrent is currently being seeded. This occurs when the client is willing to upload without wanting anything in return.
func (*Torrent) SetDisplayName ¶
Clobbers the torrent display name. The display name is used as the torrent name if the metainfo is not available.
func (*Torrent) SetInfoBytes ¶
func (*Torrent) SubscribePieceStateChanges ¶
func (t *Torrent) SubscribePieceStateChanges() *pubsub.Subscription
The subscription emits as (int) the index of pieces as their state changes. A state change is when the PieceState for a piece alters in value.
type TorrentSpec ¶
type TorrentSpec struct { // The tiered tracker URIs. Trackers [][]string InfoHash metainfo.Hash Info *metainfo.InfoEx // The name to use if the Name field from the Info isn't available. DisplayName string // The chunk size to use for outbound requests. Defaults to 16KiB if not // set. ChunkSize int Storage storage.Client }
Specifies a new torrent for adding to a client. There are helpers for magnet URIs and torrent metainfo files.
func TorrentSpecFromMagnetURI ¶
func TorrentSpecFromMagnetURI(uri string) (spec *TorrentSpec, err error)
func TorrentSpecFromMetaInfo ¶
func TorrentSpecFromMetaInfo(mi *metainfo.MetaInfo) (spec *TorrentSpec)
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
cmd
|
|
dht-ping
Pings DHT nodes with the given network addresses.
|
Pings DHT nodes with the given network addresses. |
magnet-metainfo
Converts magnet URIs and info hashes into torrent metainfo files.
|
Converts magnet URIs and info hashes into torrent metainfo files. |
torrent
Downloads torrents from the command-line.
|
Downloads torrents from the command-line. |
torrent-pick
Downloads torrents from the command-line.
|
Downloads torrents from the command-line. |
torrentfs
Mounts a FUSE filesystem backed by torrents and magnet links.
|
Mounts a FUSE filesystem backed by torrents and magnet links. |
Standard use involves creating a Server, and calling Announce on it with the details of your local torrent client and infohash of interest.
|
Standard use involves creating a Server, and calling Announce on it with the details of your local torrent client and infohash of interest. |
internal
|
|
Package iplist handles the P2P Plaintext Format described by https://en.wikipedia.org/wiki/PeerGuardian#P2P_plaintext_format.
|
Package iplist handles the P2P Plaintext Format described by https://en.wikipedia.org/wiki/PeerGuardian#P2P_plaintext_format. |
cmd/pack-blocklist
Takes P2P blocklist text format in stdin, and outputs the packed format from the iplist package.
|
Takes P2P blocklist text format in stdin, and outputs the packed format from the iplist package. |
Package logonce implements an io.Writer facade that only performs distinct writes.
|
Package logonce implements an io.Writer facade that only performs distinct writes. |
dirwatch
Package dirwatch provides filesystem-notification based tracking of torrent info files and magnet URIs in a directory.
|
Package dirwatch provides filesystem-notification based tracking of torrent info files and magnet URIs in a directory. |