X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=spec.go;h=8cce3cb326f1ff3594b921338804f381d5a7e7cd;hb=20b437730ddd9862348871516aa2f4ca5433d959;hp=e12bb0cb26367626b53fbec35392b0a0e7c4f691;hpb=555cb064dd1d001e3ca8f0cdd75a971ca2367255;p=btrtrc.git diff --git a/spec.go b/spec.go index e12bb0cb..8cce3cb3 100644 --- a/spec.go +++ b/spec.go @@ -4,27 +4,36 @@ import ( "fmt" "github.com/anacrolix/torrent/metainfo" + pp "github.com/anacrolix/torrent/peer_protocol" "github.com/anacrolix/torrent/storage" ) -// Specifies a new torrent for adding to a client. There are helpers for magnet URIs and torrent -// metainfo files. +// Specifies a new torrent for adding to a client, or additions to an existing Torrent. There are +// constructor functions for magnet URIs and torrent metainfo files. TODO: This type should be +// dismantled into a new Torrent option type, and separate Torrent mutate method(s). type TorrentSpec struct { // The tiered tracker URIs. - Trackers [][]string + Trackers [][]string + // TODO: Move into a "new" Torrent opt type. 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 + // WebSeed URLs. For additional options add the URLs separately with Torrent.AddWebSeeds + // instead. + 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 + // The chunk size to use for outbound requests. Defaults to 16KiB if not set. Can only be set + // for new Torrents. TODO: Move into a "new" Torrent opt type. + ChunkSize pp.Integer + // TODO: Move into a "new" Torrent opt type. + Storage storage.ClientImpl + + DisableInitialPieceCheck bool // Whether to allow data download or upload DisallowDataUpload bool @@ -48,10 +57,12 @@ func TorrentSpecFromMagnetUri(uri string) (spec *TorrentSpec, err error) { return } +// The error will be from unmarshalling the info bytes. The TorrentSpec is still filled out as much +// as possible in this case. func TorrentSpecFromMetaInfoErr(mi *metainfo.MetaInfo) (*TorrentSpec, error) { info, err := mi.UnmarshalInfo() if err != nil { - return nil, fmt.Errorf("unmarshalling info: %w", err) + err = fmt.Errorf("unmarshalling info: %w", err) } return &TorrentSpec{ Trackers: mi.UpvertedAnnounceList(), @@ -60,15 +71,16 @@ func TorrentSpecFromMetaInfoErr(mi *metainfo.MetaInfo) (*TorrentSpec, error) { DisplayName: info.Name, Webseeds: mi.UrlList, DhtNodes: func() (ret []string) { - ret = make([]string, len(mi.Nodes)) + ret = make([]string, 0, len(mi.Nodes)) for _, node := range mi.Nodes { ret = append(ret, string(node)) } return }(), - }, nil + }, err } +// Panics if there was anything missing from the metainfo. func TorrentSpecFromMetaInfo(mi *metainfo.MetaInfo) *TorrentSpec { ts, err := TorrentSpecFromMetaInfoErr(mi) if err != nil {