2016-09-11 12:09:40 +08:00
|
|
|
package torrent
|
|
|
|
|
|
|
|
import (
|
2021-08-01 19:38:35 +08:00
|
|
|
"fmt"
|
|
|
|
|
2016-09-11 12:09:40 +08:00
|
|
|
"github.com/anacrolix/torrent/metainfo"
|
|
|
|
"github.com/anacrolix/torrent/storage"
|
|
|
|
)
|
|
|
|
|
2020-06-02 11:53:25 +08:00
|
|
|
// Specifies a new torrent for adding to a client. There are helpers for magnet URIs and torrent
|
|
|
|
// metainfo files.
|
2016-09-11 12:09:40 +08:00
|
|
|
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
|
2020-06-02 11:53:25 +08:00
|
|
|
Webseeds []string
|
|
|
|
DhtNodes []string
|
2020-11-12 12:25:06 +08:00
|
|
|
PeerAddrs []string
|
2020-06-02 13:06:05 +08:00
|
|
|
// The combination of the "xs" and "as" fields in magnet links, for now.
|
|
|
|
Sources []string
|
2020-06-02 11:53:25 +08:00
|
|
|
|
|
|
|
// The chunk size to use for outbound requests. Defaults to 16KiB if not set.
|
2016-09-11 12:09:40 +08:00
|
|
|
ChunkSize int
|
|
|
|
Storage storage.ClientImpl
|
2020-06-04 03:17:47 +08:00
|
|
|
|
|
|
|
// Whether to allow data download or upload
|
|
|
|
DisallowDataUpload bool
|
|
|
|
DisallowDataDownload bool
|
2016-09-11 12:09:40 +08:00
|
|
|
}
|
|
|
|
|
2020-11-09 07:56:27 +08:00
|
|
|
func TorrentSpecFromMagnetUri(uri string) (spec *TorrentSpec, err error) {
|
|
|
|
m, err := metainfo.ParseMagnetUri(uri)
|
2016-09-11 12:09:40 +08:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
spec = &TorrentSpec{
|
|
|
|
Trackers: [][]string{m.Trackers},
|
|
|
|
DisplayName: m.DisplayName,
|
|
|
|
InfoHash: m.InfoHash,
|
2020-06-02 11:53:25 +08:00
|
|
|
Webseeds: m.Params["ws"],
|
2020-06-02 13:06:05 +08:00
|
|
|
Sources: append(m.Params["xs"], m.Params["as"]...),
|
2020-11-12 12:25:06 +08:00
|
|
|
PeerAddrs: m.Params["x.pe"], // BEP 9
|
|
|
|
// TODO: What's the parameter for DHT nodes?
|
2016-09-11 12:09:40 +08:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-08-01 19:38:35 +08:00
|
|
|
func TorrentSpecFromMetaInfoErr(mi *metainfo.MetaInfo) (*TorrentSpec, error) {
|
2020-06-02 11:53:25 +08:00
|
|
|
info, err := mi.UnmarshalInfo()
|
|
|
|
if err != nil {
|
2021-08-01 19:38:35 +08:00
|
|
|
return nil, fmt.Errorf("unmarshalling info: %w", err)
|
2020-06-02 11:53:25 +08:00
|
|
|
}
|
|
|
|
return &TorrentSpec{
|
|
|
|
Trackers: mi.UpvertedAnnounceList(),
|
|
|
|
InfoHash: mi.HashInfoBytes(),
|
2016-09-11 12:09:40 +08:00
|
|
|
InfoBytes: mi.InfoBytes,
|
|
|
|
DisplayName: info.Name,
|
2020-06-02 11:53:25 +08:00
|
|
|
Webseeds: mi.UrlList,
|
|
|
|
DhtNodes: func() (ret []string) {
|
2021-08-11 10:27:00 +08:00
|
|
|
ret = make([]string, 0, len(mi.Nodes))
|
2020-06-02 11:53:25 +08:00
|
|
|
for _, node := range mi.Nodes {
|
|
|
|
ret = append(ret, string(node))
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}(),
|
2021-08-01 19:38:35 +08:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func TorrentSpecFromMetaInfo(mi *metainfo.MetaInfo) *TorrentSpec {
|
|
|
|
ts, err := TorrentSpecFromMetaInfoErr(mi)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
2016-09-11 12:09:40 +08:00
|
|
|
}
|
2021-08-01 19:38:35 +08:00
|
|
|
return ts
|
2016-09-11 12:09:40 +08:00
|
|
|
}
|