Documentation ¶
Index ¶
- Constants
- Variables
- func ChoosePieceLength(totalLength int64) (pieceLength int64)
- func GeneratePieces(r io.Reader, pieceLength int64, b []byte) ([]byte, error)
- func HashForPiecePad(pieceLength int64) (hash [32]byte)
- func ValidatePieceLayers(pieceLayers map[string]string, fileTree *FileTree, pieceLength int64) (err error)
- type AnnounceList
- type ExtendedFileAttrs
- type FileInfo
- type FileTree
- type FileTreeFile
- type Hash
- type Info
- func (info *Info) BestName() string
- func (info *Info) BuildFromFilePath(root string) (err error)
- func (info *Info) FilesArePieceAligned() bool
- func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) (err error)
- func (info *Info) HasV1() bool
- func (info *Info) HasV2() bool
- func (info *Info) IsDir() bool
- func (info *Info) NumPieces() (num int)
- func (info *Info) Piece(index int) Piece
- func (info *Info) TotalLength() (ret int64)
- func (info *Info) UpvertedFiles() (files []FileInfo)
- func (info *Info) UpvertedV1Files() (files []FileInfo)
- type Magnet
- type MagnetV2
- type MetaInfo
- func (mi *MetaInfo) HashInfoBytes() (infoHash Hash)
- func (mi MetaInfo) Magnet(infoHash *Hash, info *Info) (m Magnet)deprecated
- func (mi *MetaInfo) MagnetV2() (m MagnetV2, err error)
- func (mi *MetaInfo) SetDefaults()
- func (mi MetaInfo) UnmarshalInfo() (info Info, err error)
- func (mi *MetaInfo) UpvertedAnnounceList() AnnounceList
- func (mi MetaInfo) Write(w io.Writer) error
- type Node
- type Piece
- type PieceKey
- type UrlList
Constants ¶
const FileTreePropertiesKey = ""
const HashSize = infohash.Size
const NoName = "-"
The Info.Name field is "advisory". For multi-file torrents it's usually a suggested directory name. There are situations where we don't want a directory (like using the contents of a torrent as the immediate contents of a directory), or the name is invalid. Transmission will inject the name of the torrent file if it doesn't like the name, resulting in a different infohash (https://github.com/transmission/transmission/issues/1775). To work around these situations, we will use a sentinel name for compatibility with Transmission and to signal to our own client that we intended to have no directory name. By exposing it in the API we can check for references to this behaviour within this implementation.
Variables ¶
var ( NewHashFromHex = infohash.FromHexString HashBytes = infohash.HashBytes )
var ParseMagnetURI = ParseMagnetUri
Deprecated: Use ParseMagnetUri.
Functions ¶
func ChoosePieceLength ¶
Choose a good piecelength.
func HashForPiecePad ¶
Returns the padding hash for the hash layer corresponding to a piece. It can't be zero because that's the bottom-most layer (the hashes for the smallest blocks).
Types ¶
type AnnounceList ¶
type AnnounceList [][]string
func (AnnounceList) Clone ¶
func (al AnnounceList) Clone() AnnounceList
func (AnnounceList) DistinctValues ¶
func (al AnnounceList) DistinctValues() (ret []string)
func (AnnounceList) OverridesAnnounce ¶
func (al AnnounceList) OverridesAnnounce(announce string) bool
Whether the AnnounceList should be preferred over a single URL announce.
type ExtendedFileAttrs ¶
type ExtendedFileAttrs struct { Attr string `bencode:"attr,omitempty"` SymlinkPath []string `bencode:"symlink path,omitempty"` Sha1 string `bencode:"sha1,omitempty"` }
See BEP 47. This is common to both Info and FileInfo.
type FileInfo ¶
type FileInfo struct { // BEP3. With BEP 47 this can be optional, but we have no way to describe that without breaking // the API. Length int64 `bencode:"length"` Path []string `bencode:"path"` // BEP3 // Unofficial extension by BiglyBT? https://github.com/BiglySoftware/BiglyBT/issues/1274. Might // be a safer bet when available: https://github.com/dannyzb/torrent/pull/915. PathUtf8 []string `bencode:"path.utf-8,omitempty"` ExtendedFileAttrs // BEP 52. This isn't encoded in a v1 FileInfo, but is exposed here for APIs that expect to deal // v1 files. PiecesRoot g.Option[[32]byte] `bencode:"-"` TorrentOffset int64 `bencode:"-"` }
Information specific to a single file inside the MetaInfo structure.
func (*FileInfo) DisplayPath ¶
type FileTree ¶
type FileTree struct { File FileTreeFile Dir map[string]FileTree }
The fields here don't need bencode tags as the marshalling is done manually.
func (*FileTree) NumEntries ¶
func (*FileTree) PiecesRootAsByteArray ¶
func (*FileTree) UnmarshalBencode ¶
type FileTreeFile ¶
type Info ¶
type Info struct { PieceLength int64 `bencode:"piece length"` // BEP3 Pieces []byte `bencode:"pieces"` // BEP3 Name string `bencode:"name"` // BEP3 NameUtf8 string `bencode:"name.utf-8,omitempty"` Length int64 `bencode:"length,omitempty"` // BEP3, mutually exclusive with Files ExtendedFileAttrs Private *bool `bencode:"private,omitempty"` // BEP27 // TODO: Document this field. Source string `bencode:"source,omitempty"` Files []FileInfo `bencode:"files,omitempty"` // BEP3, mutually exclusive with Length // BEP 52 (BitTorrent v2) MetaVersion int64 `bencode:"meta version,omitempty"` FileTree FileTree `bencode:"file tree,omitempty"` }
The info dictionary. See BEP 3 and BEP 52.
func (*Info) BuildFromFilePath ¶
This is a helper that sets Files and Pieces from a root path and its children.
func (*Info) FilesArePieceAligned ¶
func (*Info) GeneratePieces ¶
Sets Pieces (the block of piece hashes in the Info) by using the passed function to get at the torrent data.
func (*Info) HasV2 ¶
Whether the Info can be used as a v2 info dict, including having a V2 infohash.
func (*Info) IsDir ¶
Whether all files share the same top-level directory name. If they don't, Info.Name is usually used.
func (*Info) TotalLength ¶
func (*Info) UpvertedFiles ¶
The files field, converted up from the old single-file in the parent info dict if necessary. This is a helper to avoid having to conditionally handle single and multi-file torrent infos.
func (*Info) UpvertedV1Files ¶
UpvertedFiles but specific to the files listed in the v1 info fields. This will include padding files for example that wouldn't appear in v2 file trees.
type Magnet ¶
type Magnet struct { InfoHash Hash // Expected in this implementation Trackers []string // "tr" values DisplayName string // "dn" value, if not empty Params url.Values // All other values, such as "x.pe", "as", "xs" etc. }
Magnet link components.
func ParseMagnetUri ¶
ParseMagnetUri parses Magnet-formatted URIs into a Magnet instance
type MagnetV2 ¶
type MagnetV2 struct { InfoHash g.Option[Hash] // Expected in this implementation V2InfoHash g.Option[infohash_v2.T] Trackers []string // "tr" values DisplayName string // "dn" value, if not empty Params url.Values // All other values, such as "x.pe", "as", "xs" etc. }
Magnet link components.
func ParseMagnetV2Uri ¶
ParseMagnetUri parses Magnet-formatted URIs into a Magnet instance
type MetaInfo ¶
type MetaInfo struct { InfoBytes bencode.Bytes `bencode:"info,omitempty"` // BEP 3 Announce string `bencode:"announce,omitempty"` // BEP 3 AnnounceList AnnounceList `bencode:"announce-list,omitempty"` // BEP 12 Nodes []Node `bencode:"nodes,omitempty,ignore_unmarshal_type_error"` // BEP 5 // Where's this specified? Mentioned at // https://wiki.theory.org/index.php/BitTorrentSpecification: (optional) the creation time of // the torrent, in standard UNIX epoch format (integer, seconds since 1-Jan-1970 00:00:00 UTC) CreationDate int64 `bencode:"creation date,omitempty,ignore_unmarshal_type_error"` Comment string `bencode:"comment,omitempty"` CreatedBy string `bencode:"created by,omitempty"` Encoding string `bencode:"encoding,omitempty"` UrlList UrlList `bencode:"url-list,omitempty"` // BEP 19 WebSeeds // BEP 52 (BitTorrent v2): Keys are file merkle roots ("pieces root"s), and the values are the // concatenated hashes of the merkle tree layer that corresponds to the piece length. PieceLayers map[string]string `bencode:"piece layers,omitempty"` }
Also known as a torrent file.
func LoadFromFile ¶
Convenience function for loading a MetaInfo from a file.
func (*MetaInfo) HashInfoBytes ¶
func (*MetaInfo) MagnetV2 ¶
Creates a MagnetV2 from a MetaInfo. This supports v1, hybrid, and v2 magnet links.
func (*MetaInfo) SetDefaults ¶
func (mi *MetaInfo) SetDefaults()
Set good default values in preparation for creating a new MetaInfo file.
func (MetaInfo) UnmarshalInfo ¶
func (*MetaInfo) UpvertedAnnounceList ¶
func (mi *MetaInfo) UpvertedAnnounceList() AnnounceList
Returns the announce-list converted from the old single announce field if necessary.
type Piece ¶
type Piece struct { Info *Info // Can we embed the fields here instead, or is it something to do with saving memory? // contains filtered or unexported fields }