From: Matt Joiner Date: Wed, 15 Feb 2017 09:05:28 +0000 (+1100) Subject: metainfo: Improve MetaInfo.AnnounceList handling X-Git-Tag: v1.0.0~482 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=6ca3275752956e184ebc161f5d60009cfcd4bed9;p=btrtrc.git metainfo: Improve MetaInfo.AnnounceList handling --- diff --git a/metainfo/announcelist.go b/metainfo/announcelist.go new file mode 100644 index 00000000..3a5c09d4 --- /dev/null +++ b/metainfo/announcelist.go @@ -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 +} diff --git a/metainfo/metainfo.go b/metainfo/metainfo.go index decfc3a0..947bd713 100644 --- a/metainfo/metainfo.go +++ b/metainfo/metainfo.go @@ -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 +}