]> Sergey Matveev's repositories - btrtrc.git/commitdiff
metainfo: Improve MetaInfo.AnnounceList handling
authorMatt Joiner <anacrolix@gmail.com>
Wed, 15 Feb 2017 09:05:28 +0000 (20:05 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 15 Feb 2017 09:05:28 +0000 (20:05 +1100)
metainfo/announcelist.go [new file with mode: 0644]
metainfo/metainfo.go

diff --git a/metainfo/announcelist.go b/metainfo/announcelist.go
new file mode 100644 (file)
index 0000000..3a5c09d
--- /dev/null
@@ -0,0 +1,27 @@
+package metainfo
+
+type AnnounceList [][]string
+
+// Whether the AnnounceList should be preferred over a single URL announce.
+func (al AnnounceList) OverridesAnnounce(announce string) bool {
+       for _, tier := range al {
+               for _, url := range tier {
+                       if url != "" || announce == "" {
+                               return true
+                       }
+               }
+       }
+       return false
+}
+
+func (al AnnounceList) DistinctValues() (ret map[string]struct{}) {
+       for _, tier := range al {
+               for _, v := range tier {
+                       if ret == nil {
+                               ret = make(map[string]struct{})
+                       }
+                       ret[v] = struct{}{}
+               }
+       }
+       return
+}
index decfc3a001aac6fa6ee53efcb4d0ff261a79d6fb..947bd7136b0e9d61e8ab9522853ff485fd92d633 100644 (file)
@@ -11,7 +11,7 @@ import (
 type MetaInfo struct {
        InfoBytes    bencode.Bytes `bencode:"info"`
        Announce     string        `bencode:"announce,omitempty"`
-       AnnounceList [][]string    `bencode:"announce-list,omitempty"`
+       AnnounceList AnnounceList  `bencode:"announce-list,omitempty"`
        Nodes        []Node        `bencode:"nodes,omitempty"`
        CreationDate int64         `bencode:"creation date,omitempty"`
        Comment      string        `bencode:"comment,omitempty"`
@@ -66,15 +66,22 @@ func (mi *MetaInfo) SetDefaults() {
 
 // Creates a Magnet from a MetaInfo.
 func (mi *MetaInfo) Magnet(displayName string, infoHash Hash) (m Magnet) {
-       for _, tier := range mi.AnnounceList {
-               for _, tracker := range tier {
-                       m.Trackers = append(m.Trackers, tracker)
-               }
-       }
-       if m.Trackers == nil && mi.Announce != "" {
-               m.Trackers = []string{mi.Announce}
+       for t := range mi.UpvertedAnnounceList().DistinctValues() {
+               m.Trackers = append(m.Trackers, t)
        }
        m.DisplayName = displayName
        m.InfoHash = infoHash
        return
 }
+
+// Returns the announce list converted from the old single announce field if
+// necessary.
+func (mi *MetaInfo) UpvertedAnnounceList() AnnounceList {
+       if mi.AnnounceList.OverridesAnnounce(mi.Announce) {
+               return mi.AnnounceList
+       }
+       if mi.Announce != "" {
+               return [][]string{[]string{mi.Announce}}
+       }
+       return nil
+}