4 "bitbucket.org/anacrolix/go.torrent/dht"
5 "bitbucket.org/anacrolix/go.torrent/util"
15 "github.com/anacrolix/libtorgo/metainfo"
17 "bitbucket.org/anacrolix/go.torrent"
21 downloadDir = flag.String("downloadDir", "", "directory to store download torrent data")
22 testPeer = flag.String("testPeer", "", "bootstrap peer address")
23 httpAddr = flag.String("httpAddr", "localhost:0", "http serve address")
24 // TODO: Check the default torrent listen port.
25 listenAddr = flag.String("listenAddr", ":6882", "incoming connection address")
26 disableTrackers = flag.Bool("disableTrackers", false, "disable trackers")
27 seed = flag.Bool("seed", false, "seed after downloading")
31 log.SetFlags(log.LstdFlags | log.Lshortfile)
35 func makeListener() net.Listener {
36 l, err := net.Listen("tcp", *listenAddr)
45 util.LoggedHTTPServe(*httpAddr)
47 dhtServer := &dht.Server{
48 Socket: func() *net.UDPConn {
49 addr, err := net.ResolveUDPAddr("udp4", *listenAddr)
51 log.Fatalf("error resolving dht listen addr: %s", err)
53 s, err := net.ListenUDP("udp4", addr)
55 log.Fatalf("error creating dht socket: %s", err)
60 err := dhtServer.Init()
62 log.Fatalf("error initing dht server: %s", err)
65 err := dhtServer.Serve()
67 log.Fatalf("error serving dht: %s", err)
71 err := dhtServer.Bootstrap()
73 log.Printf("error bootstrapping dht server: %s", err)
76 client := torrent.Client{
77 DataDir: *downloadDir,
78 Listener: makeListener(),
79 DisableTrackers: *disableTrackers,
82 http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
88 fmt.Fprintln(os.Stderr, "no torrents specified")
91 for _, arg := range flag.Args() {
92 var ih torrent.InfoHash
93 if strings.HasPrefix(arg, "magnet:") {
94 m, err := torrent.ParseMagnetURI(arg)
96 log.Fatalf("error parsing magnet uri: %s", err)
99 err = client.AddMagnet(arg)
101 log.Fatalf("error adding magnet: %s", err)
104 metaInfo, err := metainfo.LoadFromFile(arg)
108 err = client.AddTorrent(metaInfo)
112 ih = torrent.BytesInfoHash(metaInfo.Info.Hash)
114 client.PrioritizeDataRegion(ih, 0, 999999999)
115 err := client.AddPeers(ih, func() []torrent.Peer {
119 addr, err := net.ResolveTCPAddr("tcp", *testPeer)
123 return []torrent.Peer{{
135 if client.WaitAll() {
136 log.Print("all torrents completed!")
138 log.Fatal("y u no complete torrents?!")