10 "github.com/anacrolix/tagflag"
11 "github.com/davecgh/go-spew/spew"
13 "github.com/anacrolix/torrent"
14 "github.com/anacrolix/torrent/metainfo"
15 "github.com/anacrolix/torrent/tracker"
18 func argSpec(arg string) (ts *torrent.TorrentSpec, err error) {
19 if strings.HasPrefix(arg, "magnet:") {
20 return torrent.TorrentSpecFromMagnetURI(arg)
22 mi, err := metainfo.LoadFromFile(arg)
26 ts = torrent.TorrentSpecFromMetaInfo(mi)
34 Torrents []string `arity:"+"`
39 ar := tracker.AnnounceRequest{
45 for _, arg := range flags.Torrents {
46 ts, err := argSpec(arg)
50 ar.InfoHash = ts.InfoHash
51 for _, tier := range ts.Trackers {
52 for _, tURI := range tier {
54 go doTracker(tURI, wg.Done, ar)
61 func doTracker(tURI string, done func(), ar tracker.AnnounceRequest) {
63 for _, res := range announces(tURI, ar) {
65 resp := res.AnnounceResponse
67 log.Printf("error announcing to %q: %s", tURI, err)
70 log.Printf("tracker response from %q: %s", tURI, spew.Sdump(resp))
74 type announceResult struct {
75 tracker.AnnounceResponse
79 func announces(uri string, ar tracker.AnnounceRequest) (ret []announceResult) {
80 u, err := url.Parse(uri)
82 return []announceResult{{error: err}}
84 a := tracker.Announce{
88 if u.Scheme == "udp" {
90 ret = append(ret, announce(a))
92 ret = append(ret, announce(a))
95 return []announceResult{announce(a)}
98 func announce(a tracker.Announce) announceResult {
100 return announceResult{resp, err}