--- /dev/null
+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
+}
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"`
// 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
+}