metainfo/announcelist.go | 27 +++++++++++++++++++++++++++ metainfo/metainfo.go | 23 +++++++++++++++-------- diff --git a/metainfo/announcelist.go b/metainfo/announcelist.go new file mode 100644 index 0000000000000000000000000000000000000000..3a5c09d48349f896134b4ba7e0cb7429d3553853 --- /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 decfc3a001aac6fa6ee53efcb4d0ff261a79d6fb..947bd7136b0e9d61e8ab9522853ff485fd92d633 100644 --- a/metainfo/metainfo.go +++ b/metainfo/metainfo.go @@ -11,7 +11,7 @@ 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 @@ } // 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 +}