]> Sergey Matveev's repositories - btrtrc.git/blob - metainfo/metainfo.go
add BEP references to documentation of the metadata fields
[btrtrc.git] / metainfo / metainfo.go
1 package metainfo
2
3 import (
4         "io"
5         "os"
6         "time"
7
8         "github.com/anacrolix/torrent/bencode"
9 )
10
11 type MetaInfo struct {
12         InfoBytes    bencode.Bytes `bencode:"info,omitempty"`          // BEP 3
13         Announce     string        `bencode:"announce,omitempty"`      // BEP 3
14         AnnounceList AnnounceList  `bencode:"announce-list,omitempty"` // BEP 12
15         Nodes        []Node        `bencode:"nodes,omitempty"`         // BEP 5
16         CreationDate int64         `bencode:"creation date,omitempty,ignore_unmarshal_type_error"`
17         Comment      string        `bencode:"comment,omitempty"`
18         CreatedBy    string        `bencode:"created by,omitempty"`
19         Encoding     string        `bencode:"encoding,omitempty"`
20         UrlList      UrlList       `bencode:"url-list,omitempty"` // BEP 19
21 }
22
23 // Load a MetaInfo from an io.Reader. Returns a non-nil error in case of
24 // failure.
25 func Load(r io.Reader) (*MetaInfo, error) {
26         var mi MetaInfo
27         d := bencode.NewDecoder(r)
28         err := d.Decode(&mi)
29         if err != nil {
30                 return nil, err
31         }
32         return &mi, nil
33 }
34
35 // Convenience function for loading a MetaInfo from a file.
36 func LoadFromFile(filename string) (*MetaInfo, error) {
37         f, err := os.Open(filename)
38         if err != nil {
39                 return nil, err
40         }
41         defer f.Close()
42         return Load(f)
43 }
44
45 func (mi MetaInfo) UnmarshalInfo() (info Info, err error) {
46         err = bencode.Unmarshal(mi.InfoBytes, &info)
47         return
48 }
49
50 func (mi MetaInfo) HashInfoBytes() (infoHash Hash) {
51         return HashBytes(mi.InfoBytes)
52 }
53
54 // Encode to bencoded form.
55 func (mi MetaInfo) Write(w io.Writer) error {
56         return bencode.NewEncoder(w).Encode(mi)
57 }
58
59 // Set good default values in preparation for creating a new MetaInfo file.
60 func (mi *MetaInfo) SetDefaults() {
61         mi.Comment = "yoloham"
62         mi.CreatedBy = "github.com/anacrolix/torrent"
63         mi.CreationDate = time.Now().Unix()
64         // mi.Info.PieceLength = 256 * 1024
65 }
66
67 // Creates a Magnet from a MetaInfo.
68 func (mi *MetaInfo) Magnet(displayName string, infoHash Hash) (m Magnet) {
69         for t := range mi.UpvertedAnnounceList().DistinctValues() {
70                 m.Trackers = append(m.Trackers, t)
71         }
72         m.DisplayName = displayName
73         m.InfoHash = infoHash
74         return
75 }
76
77 // Returns the announce list converted from the old single announce field if
78 // necessary.
79 func (mi *MetaInfo) UpvertedAnnounceList() AnnounceList {
80         if mi.AnnounceList.OverridesAnnounce(mi.Announce) {
81                 return mi.AnnounceList
82         }
83         if mi.Announce != "" {
84                 return [][]string{{mi.Announce}}
85         }
86         return nil
87 }