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
- BEPs:
- 3: Basic BitTorrent protocol
- 5: DHT
- 6: Fast Extension (have all/none only)
- 7: IPv6 Tracker Extension
- 9: ut_metadata
- 10: Extension protocol
- 11: PEX
- 12: Multitracker metadata extension
- 15: UDP Tracker Protocol
- 20: Peer ID convention ("-GTnnnn-")
- 23: Tracker Returns Compact Peer Lists
- 29: uTorrent transport protocol
- 41: UDP Tracker Protocol Extensions
- 42: DHT Security extension
- 43: Read-only DHT Nodes
Example ¶
package main import ( "log" "github.com/anacrolix/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/torrent" ) func main() { var f torrent.File // Accesses the parts of the torrent pertaining to f. Data will be // downloaded as required, per the configuration of the torrent.Reader. r := f.NewReader() defer r.Close() }
Output:
Index ¶
- Constants
- Variables
- func LoopbackListenHost(network string) string
- func NewUtpSocket(network, addr string, fc firewallCallback) (utpSocket, error)
- type AnacrolixDhtServerWrapper
- type Callbacks
- type ChunkSpec
- type Client
- func (cl *Client) AddDhtNodes(nodes []string)
- func (cl *Client) AddDhtServer(d DhtServer)
- func (cl *Client) AddDialer(d Dialer)
- func (cl *Client) AddListener(l Listener)
- 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) AddTorrentInfoHashWithStorage(infoHash metainfo.Hash, specStorage storage.ClientImpl) (t *Torrent, new bool)
- func (cl *Client) AddTorrentSpec(spec *TorrentSpec) (t *Torrent, new bool, err error)
- func (cl *Client) BadPeerIPs() []string
- func (cl *Client) Close()
- func (cl *Client) Closed() chansync.Done
- func (cl *Client) ConnStats() ConnStats
- func (cl *Client) DhtServers() []DhtServer
- func (cl *Client) ListenAddrs() (ret []net.Addr)
- func (cl *Client) Listeners() []Listener
- func (cl *Client) LocalPort() (port int)
- func (cl *Client) NewAnacrolixDhtServer(conn net.PacketConn) (s *dht.Server, err error)
- func (cl *Client) PeerID() PeerID
- func (cl *Client) String() string
- func (cl *Client) Torrent(ih metainfo.Hash) (t *Torrent, ok bool)
- func (cl *Client) Torrents() []*Torrent
- func (cl *Client) WaitAll() bool
- func (cl *Client) WriteStatus(_w io.Writer)
- type ClientConfig
- type ConnStats
- type Count
- type DhtAnnounce
- type DhtServer
- type DialContexter
- type DialResult
- type Dialer
- type File
- func (f *File) BytesCompleted() int64
- func (f *File) Cancel()deprecated
- func (f *File) DisplayPath() string
- func (f *File) Download()
- func (f File) FileInfo() metainfo.FileInfo
- func (f *File) Length() int64
- func (f *File) NewReader() Reader
- func (f *File) Offset() int64
- func (f File) Path() string
- func (f *File) Priority() piecePriority
- func (f *File) SetPriority(prio piecePriority)
- func (f *File) State() (ret []FilePieceState)
- func (f *File) Torrent() *Torrent
- type FilePieceState
- type Handle
- type HeaderObfuscationPolicy
- type InfoHash
- type IpPort
- type Listener
- type NetworkDialer
- type Peer
- type PeerConn
- type PeerExtensionBits
- type PeerID
- type PeerInfo
- type PeerMessageEvent
- type PeerRemoteAddr
- type PeerRequestEvent
- type PeerSource
- type PeerStorer
- type Piece
- type PieceState
- type PieceStateChange
- type PieceStateRun
- type PieceStateRuns
- type Reader
- type ReceivedUsefulDataEvent
- type Request
- type Torrent
- func (t *Torrent) AddClientPeer(cl *Client) int
- func (t *Torrent) AddPeers(pp []PeerInfo) int
- func (t *Torrent) AddTrackers(announceList [][]string)
- func (t *Torrent) AllowDataDownload()
- func (t *Torrent) AllowDataUpload()
- func (t *Torrent) AnnounceToDht(s DhtServer) (done <-chan struct{}, stop func(), err error)
- func (t *Torrent) BytesCompleted() int64
- func (t *Torrent) BytesMissing() int64
- func (t *Torrent) CancelPieces(begin, end pieceIndex)
- func (t *Torrent) Closed() <-chan struct{}
- func (t *Torrent) DisallowDataDownload()
- func (t *Torrent) DisallowDataUpload()
- func (t *Torrent) DownloadAll()
- func (t *Torrent) DownloadPieces(begin, end pieceIndex)
- func (t *Torrent) Drop()
- func (t *Torrent) Files() []*File
- func (t *Torrent) GotInfo() <-chan struct{}
- func (t *Torrent) Info() *metainfo.Info
- func (t *Torrent) InfoHash() metainfo.Hash
- func (t *Torrent) KnownSwarm() (ks []PeerInfo)
- func (t *Torrent) Length() int64
- func (t *Torrent) MergeSpec(spec *TorrentSpec) error
- func (t *Torrent) Metainfo() metainfo.MetaInfo
- func (t *Torrent) Name() string
- func (t *Torrent) NewReader() Reader
- func (t *Torrent) NumPieces() pieceIndex
- func (t *Torrent) PeerConns() []*PeerConn
- func (t *Torrent) Piece(i pieceIndex) *Piece
- func (t *Torrent) PieceBytesMissing(piece int) int64
- func (t *Torrent) PieceState(piece pieceIndex) PieceState
- func (t *Torrent) PieceStateRuns() PieceStateRuns
- func (t *Torrent) Seeding() bool
- func (t *Torrent) SetDisplayName(dn string)
- func (t *Torrent) SetInfoBytes(b []byte) (err error)
- func (t *Torrent) SetMaxEstablishedConns(max int) (oldMax int)
- func (t *Torrent) SetOnWriteChunkError(f func(error))
- func (t *Torrent) Stats() TorrentStats
- func (t *Torrent) String() string
- func (t *Torrent) SubscribePieceStateChanges() *pubsub.Subscription
- func (t *Torrent) VerifyData()
- type TorrentSpec
- type TorrentStats
Examples ¶
Constants ¶
const ( PiecePriorityNormal = types.PiecePriorityNormal PiecePriorityNone = types.PiecePriorityNone PiecePriorityNow = types.PiecePriorityNow PiecePriorityReadahead = types.PiecePriorityReadahead PiecePriorityNext = types.PiecePriorityNext PiecePriorityHigh = types.PiecePriorityHigh )
const ( PeerSourceTracker = "Tr" PeerSourceIncoming = "I" PeerSourceDhtGetPeers = "Hg" // Peers we found by searching a DHT. PeerSourceDhtAnnouncePeer = "Ha" // Peers that were announced to us by a DHT. PeerSourcePex = "X" // The peer was given directly, such as through a magnet link. PeerSourceDirect = "M" )
const UpnpDiscoverLogTag = "upnp-discover"
Variables ¶
var DefaultNetDialer = &net.Dialer{}
Used by wrappers of standard library network types.
var WebseedHttpClient = &http.Client{ Transport: &http.Transport{ MaxConnsPerHost: 10, }, }
Functions ¶
func LoopbackListenHost ¶
func NewUtpSocket ¶
Types ¶
type AnacrolixDhtServerWrapper ¶ added in v1.29.0
type AnacrolixDhtServerWrapper struct {
*dht.Server
}
func (AnacrolixDhtServerWrapper) Announce ¶ added in v1.29.0
func (me AnacrolixDhtServerWrapper) Announce(hash [20]byte, port int, impliedPort bool) (DhtAnnounce, error)
func (AnacrolixDhtServerWrapper) Ping ¶ added in v1.29.0
func (me AnacrolixDhtServerWrapper) Ping(addr *net.UDPAddr)
func (AnacrolixDhtServerWrapper) Stats ¶ added in v1.29.0
func (me AnacrolixDhtServerWrapper) Stats() interface{}
type Callbacks ¶ added in v1.16.0
type Callbacks struct { // Called after a peer connection completes the BitTorrent handshake. The Client lock is not // held. CompletedHandshake func(*PeerConn, InfoHash) ReadMessage func(*PeerConn, *pp.Message) ReadExtendedHandshake func(*PeerConn, *pp.ExtendedHandshakeMessage) PeerConnClosed func(*PeerConn) // Provides secret keys to be tried against incoming encrypted connections. ReceiveEncryptedHandshakeSkeys mse.SecretKeyIter ReceivedUsefulData []func(ReceivedUsefulDataEvent) ReceivedRequested []func(PeerMessageEvent) DeletedRequest []func(PeerRequestEvent) SentRequest []func(PeerRequestEvent) PeerClosed []func(*Peer) NewPeer []func(*Peer) }
These are called synchronously, and do not pass ownership of arguments (do not expect to retain data after returning from the callback). The Client and other locks may still be held. nil functions are not called.
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 NewClient ¶
func NewClient(cfg *ClientConfig) (cl *Client, err error)
func (*Client) AddDhtNodes ¶ added in v1.19.0
func (*Client) AddDhtServer ¶ added in v1.15.0
func (*Client) AddDialer ¶ added in v1.14.0
Adds a Dialer for outgoing connections. All Dialers are used when attempting to connect to a given address for any Torrent.
func (*Client) AddListener ¶ added in v1.14.0
Registers a Listener, and starts Accepting on it. You must Close Listeners provided this way yourself.
func (*Client) AddTorrent ¶
func (*Client) AddTorrentFromFile ¶
func (*Client) AddTorrentInfoHash ¶
func (*Client) AddTorrentInfoHashWithStorage ¶
func (cl *Client) AddTorrentInfoHashWithStorage(infoHash metainfo.Hash, specStorage storage.ClientImpl) (t *Torrent, new bool)
Adds a torrent by InfoHash with a custom Storage implementation. If the torrent already exists then this Storage is ignored and the existing torrent returned with `new` set to `false`
func (*Client) AddTorrentSpec ¶
func (cl *Client) AddTorrentSpec(spec *TorrentSpec) (t *Torrent, new bool, err error)
Add or merge a torrent spec. Returns new if the torrent wasn't already in the client. See also Torrent.MergeSpec.
func (*Client) BadPeerIPs ¶
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) ConnStats ¶ added in v1.17.0
Returns connection-level aggregate stats at the Client level. See the comment on TorrentStats.ConnStats.
func (*Client) DhtServers ¶
func (*Client) ListenAddrs ¶
ListenAddrs addresses currently being listened to.
func (*Client) LocalPort ¶
Returns the port number for the first listener that has one. No longer assumes that all port numbers are the same, due to support for custom listeners. Returns zero if no port number is found.
func (*Client) NewAnacrolixDhtServer ¶ added in v1.29.0
func (cl *Client) NewAnacrolixDhtServer(conn net.PacketConn) (s *dht.Server, err error)
Creates an anacrolix/dht Server, as would be done internally in NewClient, for the given conn.
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 ClientConfig ¶
type ClientConfig struct { // Store torrent file data in this directory unless .DefaultStorage 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. ListenHost func(network string) string ListenPort int NoDefaultPortForwarding bool UpnpID string // 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"` DhtStartingNodes func(network string) dht.StartingNodesGetter // Called for each anacrolix/dht Server created for the Client. ConfigureAnacrolixDhtServer func(*dht.ServerConfig) PeriodicallyAnnounceTorrentsToDht bool // Never send chunks to peers. NoUpload bool `long:"no-upload"` // Disable uploading even when it isn't fair. DisableAggressiveUpload bool `long:"disable-aggressive-upload"` // Upload even after there's nothing in it for us. By default uploading is // not altruistic, we'll only upload to encourage the peer to reciprocate. Seed bool `long:"seed"` // Only applies to chunks uploaded to peers, to maintain responsiveness // communicating local Client state to peers. Each limiter token // represents one byte. The Limiter's burst must be large enough to fit a // whole chunk, which is usually 16 KiB (see TorrentSpec.ChunkSize). UploadRateLimiter *rate.Limiter // Rate limits all reads from connections to peers. Each limiter token // represents one byte. The Limiter's burst must be bigger than the // largest Read performed on a the underlying rate-limiting io.Reader // minus one. This is likely to be the larger of the main read loop buffer // (~4096), and the requested chunk size (~16KiB, see // TorrentSpec.ChunkSize). DownloadRateLimiter *rate.Limiter // Maximum unverified bytes across all torrents. Not used if zero. MaxUnverifiedBytes int64 // 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. Builtin backends // are in the storage package. If not set, the "file" implementation is // used (and Closed when the Client is Closed). DefaultStorage storage.ClientImpl HeaderObfuscationPolicy HeaderObfuscationPolicy // The crypto methods to offer when initiating connections with header obfuscation. CryptoProvides mse.CryptoMethod // Chooses the crypto method to use when receiving connections with header obfuscation. CryptoSelector mse.CryptoSelector IPBlocklist iplist.Ranger DisableIPv6 bool `long:"disable-ipv6"` DisableIPv4 bool DisableIPv4Peers bool // Perform logging and any other behaviour that will help debug. Debug bool `help:"enable debugging"` Logger log.Logger // Defines proxy for HTTP requests, such as for trackers. It's commonly set from the result of // "net/http".ProxyURL(HTTPProxy). HTTPProxy func(*http.Request) (*url.URL, error) // HTTPUserAgent changes default UserAgent for HTTP requests HTTPUserAgent string // Updated occasionally to when there's been some changes to client // behaviour in case other clients are assuming anything of us. See also // `bep20`. ExtendedHandshakeClientVersion string // Peer ID client identifier prefix. We'll update this occasionally to // reflect changes to client behaviour that other clients may depend on. // Also see `extendedHandshakeClientVersion`. Bep20 string // Peer dial timeout to use when there are limited peers. NominalDialTimeout time.Duration // Minimum peer dial timeout to use (even if we have lots of peers). MinDialTimeout time.Duration EstablishedConnsPerTorrent int HalfOpenConnsPerTorrent int TotalHalfOpenConns int // Maximum number of peer addresses in reserve. TorrentPeersHighWater int // Minumum number of peers before effort is made to obtain more peers. TorrentPeersLowWater int // Limit how long handshake can take. This is to reduce the lingering // impact of a few bad apples. 4s loses 1% of successful handshakes that // are obtained with 60s timeout, and 5% of unsuccessful handshakes. HandshakesTimeout time.Duration // The IP addresses as our peers should see them. May differ from the // local interfaces due to NAT or other network configurations. PublicIp4 net.IP PublicIp6 net.IP // Accept rate limiting affects excessive connection attempts from IPs that fail during // handshakes or request torrents that we don't have. DisableAcceptRateLimiting bool // Don't add connections that have the same peer ID as an existing // connection for a given Torrent. DropDuplicatePeerIds bool // Drop peers that are complete if we are also complete and have no use for the peer. This is a // bit of a special case, since a peer could also be useless if they're just not interested, or // we don't intend to obtain all of a torrent's data. DropMutuallyCompletePeers bool // Whether to accept peer connections at all. AcceptPeerConnections bool // OnQuery hook func DHTOnQuery func(query *krpc.Msg, source net.Addr) (propagate bool) Extensions PeerExtensionBits DisableWebtorrent bool DisableWebseeds bool Callbacks Callbacks }
Probably not safe to modify this after it's given to a Client.
func NewDefaultClientConfig ¶
func NewDefaultClientConfig() *ClientConfig
func TestingConfig ¶ added in v1.14.0
func TestingConfig(t testing.TB) *ClientConfig
func (*ClientConfig) SetListenAddr ¶
func (cfg *ClientConfig) SetListenAddr(addr string) *ClientConfig
type ConnStats ¶
type ConnStats struct { // Total bytes on the wire. Includes handshakes and encryption. BytesWritten Count BytesWrittenData Count BytesRead Count BytesReadData Count BytesReadUsefulData Count BytesReadUsefulIntendedData Count ChunksWritten Count ChunksRead Count ChunksReadUseful Count ChunksReadWasted Count MetadataChunksRead Count // Number of pieces data was written to, that subsequently passed verification. PiecesDirtiedGood Count // Number of pieces data was written to, that subsequently failed verification. Note that a // connection may not have been the sole dirtier of a piece. PiecesDirtiedBad Count }
Various connection-level metrics. At the Torrent level these are aggregates. Chunks are messages with data payloads. Data is actual torrent content without any overhead. Useful is something we needed locally. Unwanted is something we didn't ask for (but may still be useful). Written is things sent to the peer, and Read is stuff received from them. Due to the implementation of Count, must be aligned on some platforms: See https://github.com/anacrolix/torrent/issues/262.
type Count ¶
type Count struct {
// contains filtered or unexported fields
}
func (*Count) MarshalJSON ¶ added in v1.2.0
type DhtAnnounce ¶ added in v1.15.0
type DhtAnnounce interface { Close() Peers() <-chan dht.PeersValues }
type DialContexter ¶ added in v1.29.0
type DialContexter interface {
DialContext(ctx context.Context, network, addr string) (net.Conn, error)
}
An interface to ease wrapping dialers that explicitly include a network parameter.
type DialResult ¶ added in v1.29.0
type Dialer ¶ added in v1.14.0
type Dialer interface { Dial(_ context.Context, addr string) (net.Conn, error) DialerNetwork() string }
Dialers have the network locked in.
type File ¶
type File struct {
// contains filtered or unexported fields
}
Provides access to regions of torrent data that correspond to its files.
func (*File) BytesCompleted ¶ added in v1.10.0
Number of bytes of the entire file we have completed. This is the sum of completed pieces, and dirtied chunks of incomplete pieces.
func (*File) DisplayPath ¶
The relative file path for a multi-file torrent, and the torrent name for a single-file torrent. Dir separators are '/'.
func (*File) Download ¶
func (f *File) Download()
Requests that all pieces containing data in the file be downloaded.
func (*File) Priority ¶
func (f *File) Priority() piecePriority
Returns the priority per File.SetPriority.
func (*File) SetPriority ¶
func (f *File) SetPriority(prio piecePriority)
Sets the minimum priority for pieces in the File.
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 }
The download status of a piece that comprises part of a File.
type HeaderObfuscationPolicy ¶ added in v1.5.0
type NetworkDialer ¶ added in v1.29.0
type NetworkDialer struct { Network string Dialer DialContexter }
Adapts a DialContexter to the Dial interface in this package.
func (NetworkDialer) DialerNetwork ¶ added in v1.29.0
func (me NetworkDialer) DialerNetwork() string
type Peer ¶
type Peer struct { Network string RemoteAddr PeerRemoteAddr Discovery PeerSource PeerPrefersEncryption bool // as indicated by 'e' field in extension handshake PeerListenPort int PeerMaxRequests maxRequests // Maximum pending requests the peer allows. PeerExtensionIDs map[pp.ExtensionName]pp.ExtensionNumber PeerClientName string // contains filtered or unexported fields }
func (*Peer) TryAsPeerConn ¶ added in v1.22.0
type PeerConn ¶ added in v1.15.0
type PeerConn struct { Peer // See BEP 3 etc. PeerID PeerID PeerExtensionBytes pp.PeerExtensionBits // contains filtered or unexported fields }
Maintains the state of a BitTorrent-protocol based connection with a peer.
func (*PeerConn) PeerPieces ¶ added in v1.15.0
Returns the pieces the peer could have based on their claims. If we don't know how many pieces are in the torrent, it could be a very large range the peer has sent HaveAll.
type PeerExtensionBits ¶
type PeerExtensionBits = pp.PeerExtensionBits
type PeerInfo ¶ added in v1.16.0
type PeerInfo struct { Id [20]byte Addr PeerRemoteAddr Source PeerSource // Peer is known to support encryption. SupportsEncryption bool peer_protocol.PexPeerFlags // Whether we can ignore poor or bad behaviour from the peer. Trusted bool }
Peer connection info, handed about publicly.
func (*PeerInfo) FromPex ¶ added in v1.16.0
func (me *PeerInfo) FromPex(na krpc.NodeAddr, fs peer_protocol.PexPeerFlags)
Generate PeerInfo from peer exchange
type PeerMessageEvent ¶ added in v1.22.0
type PeerRemoteAddr ¶ added in v1.22.0
type PeerRemoteAddr interface {
String() string
}
type PeerRequestEvent ¶ added in v1.22.0
type PeerSource ¶ added in v1.15.0
type PeerSource string
type PeerStorer ¶ added in v1.26.0
type PeerStorer interface {
PeerStore() peer_store.Interface
}
Optional interface for DhtServer's that can expose their peer store (if any).
type Piece ¶
type Piece struct {
// contains filtered or unexported fields
}
func (*Piece) SetPriority ¶
func (p *Piece) SetPriority(prio piecePriority)
func (*Piece) State ¶ added in v1.15.0
func (p *Piece) State() PieceState
func (*Piece) UpdateCompletion ¶ added in v1.16.0
func (p *Piece) UpdateCompletion()
Tells the Client to refetch the completion status from storage, updating priority etc. if necessary. Might be useful if you know the state of the piece data has changed externally.
type PieceState ¶
type PieceState struct { Priority piecePriority storage.Completion // The piece is being hashed, or is queued for hash. Deprecated: Use those fields instead. Checking bool Hashing bool QueuedForHash bool // The piece state is being marked in the storage. Marking 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.
func (PieceStateRun) String ¶ added in v1.15.0
func (psr PieceStateRun) String() (ret string)
Produces a small string representing a PieceStateRun.
type PieceStateRuns ¶ added in v1.15.0
type PieceStateRuns []PieceStateRun
func (PieceStateRuns) String ¶ added in v1.15.0
func (me PieceStateRuns) String() string
type Reader ¶
type Reader interface { io.Reader io.Seeker io.Closer missinggo.ReadContexter // Configure the number of bytes ahead of a read that should also be prioritized in preparation // for further reads. SetReadahead(int64) // Don't wait for pieces to complete and be verified. Read calls return as soon as they can when // the underlying chunks become available. SetResponsive() }
Accesses Torrent data via a Client. Reads block until the data is available. Seeks and readahead also drive Client behaviour.
type ReceivedUsefulDataEvent ¶ added in v1.22.0
type ReceivedUsefulDataEvent = PeerMessageEvent
type Torrent ¶
type Torrent struct {
// contains filtered or unexported fields
}
Maintains state of torrent within a Client. Many methods should not be called before the info is available, see .Info and .GotInfo.
func (*Torrent) AddClientPeer ¶
Adds a trusted, pending peer for each of the given Client's addresses. Typically used in tests to quickly make one Client visible to the Torrent of another Client.
func (*Torrent) AddTrackers ¶
func (*Torrent) AllowDataDownload ¶ added in v1.15.0
func (t *Torrent) AllowDataDownload()
func (*Torrent) AllowDataUpload ¶ added in v1.16.0
func (t *Torrent) AllowDataUpload()
Enables uploading data, if it was disabled.
func (*Torrent) AnnounceToDht ¶ added in v1.29.0
Announce using the provided DHT server. Peers are consumed automatically. done is closed when the announce ends. stop will force the announce to end.
func (*Torrent) BytesCompleted ¶
Number of bytes of the entire torrent we have completed. This is the sum of completed pieces, and dirtied chunks of incomplete pieces. Do not use this for download rate, as it can go down when pieces are lost or fail checks. Sample Torrent.Stats.DataBytesRead for actual file data download rate.
func (*Torrent) BytesMissing ¶
func (*Torrent) CancelPieces ¶
func (t *Torrent) CancelPieces(begin, end pieceIndex)
func (*Torrent) Closed ¶
func (t *Torrent) Closed() <-chan struct{}
Returns a channel that is closed when the Torrent is closed.
func (*Torrent) DisallowDataDownload ¶ added in v1.15.0
func (t *Torrent) DisallowDataDownload()
func (*Torrent) DisallowDataUpload ¶ added in v1.16.0
func (t *Torrent) DisallowDataUpload()
Disables uploading data, if it was enabled.
func (*Torrent) DownloadAll ¶
func (t *Torrent) DownloadAll()
Marks the entire torrent for download. Requires the info first, see GotInfo. Sets piece priorities for historical reasons.
func (*Torrent) DownloadPieces ¶
func (t *Torrent) DownloadPieces(begin, end pieceIndex)
Raise the priorities of pieces in the range [begin, end) to at least Normal priority. Piece indexes are not the same as bytes. Requires that the info has been obtained, see Torrent.Info and Torrent.GotInfo.
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 that the Info 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) KnownSwarm ¶
KnownSwarm returns the known subset of the peers in the Torrent's swarm, including active, pending, and half-open peers.
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) MergeSpec ¶ added in v1.16.0
func (t *Torrent) MergeSpec(spec *TorrentSpec) error
The trackers will be merged with the existing ones. If the Info isn't yet known, it will be set. spec.DisallowDataDownload/Upload will be read and applied The display name is replaced if the new spec provides one. Note that any `Storage` is ignored.
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. Note that you probably want to ensure the Torrent Info is available first.
func (*Torrent) NumPieces ¶
func (t *Torrent) NumPieces() pieceIndex
The number of pieces in the torrent. This requires that the info has been obtained first.
func (*Torrent) PieceBytesMissing ¶
Get missing bytes count for specific piece.
func (*Torrent) PieceState ¶
func (t *Torrent) PieceState(piece pieceIndex) PieceState
func (*Torrent) PieceStateRuns ¶
func (t *Torrent) PieceStateRuns() PieceStateRuns
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) SetMaxEstablishedConns ¶
func (*Torrent) SetOnWriteChunkError ¶ added in v1.15.0
Sets a handler that is called if there's an error writing a chunk to local storage. By default, or if nil, a critical message is logged, and data download is disabled.
func (*Torrent) Stats ¶
func (t *Torrent) Stats() TorrentStats
The returned TorrentStats may require alignment in memory. See https://github.com/anacrolix/torrent/issues/383.
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.
func (*Torrent) VerifyData ¶
func (t *Torrent) VerifyData()
Forces all the pieces to be re-hashed. See also Piece.VerifyData. This should not be called before the Info is available.
type TorrentSpec ¶
type TorrentSpec struct { // The tiered tracker URIs. Trackers [][]string InfoHash metainfo.Hash InfoBytes []byte // The name to use if the Name field from the Info isn't available. DisplayName string Webseeds []string DhtNodes []string PeerAddrs []string // The combination of the "xs" and "as" fields in magnet links, for now. Sources []string // The chunk size to use for outbound requests. Defaults to 16KiB if not set. ChunkSize int Storage storage.ClientImpl // Whether to allow data download or upload DisallowDataUpload bool DisallowDataDownload bool }
Specifies a new torrent for adding to a client. There are helpers for magnet URIs and torrent metainfo files.
func TorrentSpecFromMagnetUri ¶ added in v1.19.0
func TorrentSpecFromMagnetUri(uri string) (spec *TorrentSpec, err error)
func TorrentSpecFromMetaInfo ¶
func TorrentSpecFromMetaInfo(mi *metainfo.MetaInfo) *TorrentSpec
func TorrentSpecFromMetaInfoErr ¶ added in v1.30.2
func TorrentSpecFromMetaInfoErr(mi *metainfo.MetaInfo) (*TorrentSpec, error)
type TorrentStats ¶
type TorrentStats struct { // Aggregates stats over all connections past and present. Some values may not have much meaning // in the aggregate context. ConnStats // Ordered by expected descending quantities (if all is well). TotalPeers int PendingPeers int ActivePeers int ConnectedSeeders int HalfOpenPeers int }
Due to ConnStats, may require special alignment on some platforms. See https://github.com/anacrolix/torrent/issues/383.
Source Files ¶
- bad_storage.go
- bep40.go
- callbacks.go
- client.go
- closewrapper.go
- config.go
- conn_stats.go
- deferrwl.go
- dht.go
- dialer.go
- doc.go
- file.go
- global.go
- handshake.go
- ipport.go
- listen.go
- misc.go
- multiless.go
- networks.go
- peer-conn-msg-writer.go
- peer-impl.go
- peer_info.go
- peer_infos.go
- peerconn.go
- peerid.go
- pex.go
- pexconn.go
- piece.go
- piecestate.go
- portfwd.go
- prioritized_peers.go
- protocol.go
- ratelimitreader.go
- reader.go
- requesting.go
- socket.go
- spec.go
- t.go
- testing.go
- torrent.go
- torrent_pending_pieces.go
- torrent_stats.go
- tracker_scraper.go
- url-net-addr.go
- utp.go
- utp_libutp.go
- webrtc.go
- webseed-peer.go
- worst_conns.go
- wstracker.go
Directories ¶
Path | Synopsis |
---|---|
cmd
|
|
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. |
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. |
Package storage implements storage backends for package torrent.
|
Package storage implements storage backends for package torrent. |
tests
module
|
|
util
|
|
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. |
Package version provides default versions, user-agents etc.
|
Package version provides default versions, user-agents etc. |