]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/torrent/main.go
Can now download from magnet links
[btrtrc.git] / cmd / torrent / main.go
1 package main
2
3 import (
4         "flag"
5         "fmt"
6         "log"
7         "net"
8         "net/http"
9         _ "net/http/pprof"
10         "os"
11         "strings"
12
13         "github.com/anacrolix/libtorgo/metainfo"
14
15         "bitbucket.org/anacrolix/go.torrent"
16 )
17
18 var (
19         downloadDir = flag.String("downloadDir", "", "directory to store download torrent data")
20         testPeer    = flag.String("testPeer", "", "bootstrap peer address")
21         httpAddr    = flag.String("httpAddr", "", "http serve address")
22         // TODO: Check the default torrent listen port.
23         listenAddr      = flag.String("listenAddr", ":6882", "incoming connection address")
24         disableTrackers = flag.Bool("disableTrackers", false, "disable trackers")
25         seed            = flag.Bool("seed", false, "seed after downloading")
26 )
27
28 func init() {
29         log.SetFlags(log.LstdFlags | log.Lshortfile)
30         flag.Parse()
31 }
32
33 func makeListener() net.Listener {
34         l, err := net.Listen("tcp", *listenAddr)
35         if err != nil {
36                 log.Fatal(err)
37         }
38         return l
39 }
40
41 func main() {
42         if *httpAddr != "" {
43                 go http.ListenAndServe(*httpAddr, nil)
44         }
45         client := torrent.Client{
46                 DataDir:         *downloadDir,
47                 Listener:        makeListener(),
48                 DisableTrackers: *disableTrackers,
49         }
50         http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
51                 client.WriteStatus(w)
52         })
53         client.Start()
54         defer client.Stop()
55         if flag.NArg() == 0 {
56                 fmt.Fprintln(os.Stderr, "no torrents specified")
57                 return
58         }
59         for _, arg := range flag.Args() {
60                 var ih torrent.InfoHash
61                 if strings.HasPrefix(arg, "magnet:") {
62                         m, err := torrent.ParseMagnetURI(arg)
63                         if err != nil {
64                                 log.Fatalf("error parsing magnet uri: %s", err)
65                         }
66                         ih = m.InfoHash
67                         err = client.AddMagnet(arg)
68                         if err != nil {
69                                 log.Fatalf("error adding magnet: %s", err)
70                         }
71                 } else {
72                         metaInfo, err := metainfo.LoadFromFile(arg)
73                         if err != nil {
74                                 log.Fatal(err)
75                         }
76                         err = client.AddTorrent(metaInfo)
77                         if err != nil {
78                                 log.Fatal(err)
79                         }
80                         ih = torrent.BytesInfoHash(metaInfo.InfoHash)
81                 }
82                 client.PrioritizeDataRegion(ih, 0, 999999999)
83                 err := client.AddPeers(ih, func() []torrent.Peer {
84                         if *testPeer == "" {
85                                 return nil
86                         }
87                         addr, err := net.ResolveTCPAddr("tcp", *testPeer)
88                         if err != nil {
89                                 log.Fatal(err)
90                         }
91                         return []torrent.Peer{{
92                                 IP:   addr.IP,
93                                 Port: addr.Port,
94                         }}
95                 }())
96                 if err != nil {
97                         log.Fatal(err)
98                 }
99         }
100         if *seed {
101                 select {}
102         }
103         if client.WaitAll() {
104                 log.Print("all torrents completed!")
105         } else {
106                 log.Fatal("y u no complete torrents?!")
107         }
108 }