]> Sergey Matveev's repositories - btrtrc.git/blob - spec.go
Make use of magnet source fields and expose Torrent.MergeSpec
[btrtrc.git] / spec.go
1 package torrent
2
3 import (
4         "github.com/anacrolix/torrent/metainfo"
5         "github.com/anacrolix/torrent/storage"
6 )
7
8 // Specifies a new torrent for adding to a client. There are helpers for magnet URIs and torrent
9 // metainfo files.
10 type TorrentSpec struct {
11         // The tiered tracker URIs.
12         Trackers  [][]string
13         InfoHash  metainfo.Hash
14         InfoBytes []byte
15         // The name to use if the Name field from the Info isn't available.
16         DisplayName string
17         Webseeds    []string
18         DhtNodes    []string
19         // The combination of the "xs" and "as" fields in magnet links, for now.
20         Sources []string
21
22         // The chunk size to use for outbound requests. Defaults to 16KiB if not set.
23         ChunkSize int
24         Storage   storage.ClientImpl
25 }
26
27 func TorrentSpecFromMagnetURI(uri string) (spec *TorrentSpec, err error) {
28         m, err := metainfo.ParseMagnetURI(uri)
29         if err != nil {
30                 return
31         }
32         spec = &TorrentSpec{
33                 Trackers:    [][]string{m.Trackers},
34                 DisplayName: m.DisplayName,
35                 InfoHash:    m.InfoHash,
36                 Webseeds:    m.Params["ws"],
37                 Sources:     append(m.Params["xs"], m.Params["as"]...),
38                 // TODO: What's the parameter for DHT nodes or bootstrap peers in a magnet link?
39         }
40         return
41 }
42
43 func TorrentSpecFromMetaInfo(mi *metainfo.MetaInfo) *TorrentSpec {
44         info, err := mi.UnmarshalInfo()
45         if err != nil {
46                 panic(err)
47         }
48         return &TorrentSpec{
49                 Trackers:    mi.UpvertedAnnounceList(),
50                 InfoHash:    mi.HashInfoBytes(),
51                 InfoBytes:   mi.InfoBytes,
52                 DisplayName: info.Name,
53                 Webseeds:    mi.UrlList,
54                 DhtNodes: func() (ret []string) {
55                         ret = make([]string, len(mi.Nodes))
56                         for _, node := range mi.Nodes {
57                                 ret = append(ret, string(node))
58                         }
59                         return
60                 }(),
61         }
62 }