]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/torrent/main.go
Add CopyExact util function
[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         "bitbucket.org/anacrolix/go.torrent/util"
14
15         "github.com/anacrolix/libtorgo/metainfo"
16
17         "bitbucket.org/anacrolix/go.torrent"
18 )
19
20 var (
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")
28 )
29
30 func init() {
31         log.SetFlags(log.LstdFlags | log.Lshortfile)
32         flag.Parse()
33 }
34
35 func main() {
36         if *httpAddr != "" {
37                 util.LoggedHTTPServe(*httpAddr)
38         }
39         client, err := torrent.NewClient(&torrent.Config{
40                 DataDir:         *downloadDir,
41                 DisableTrackers: *disableTrackers,
42                 ListenAddr:      *listenAddr,
43         })
44         if err != nil {
45                 log.Fatalf("error creating client: %s", err)
46         }
47         http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
48                 client.WriteStatus(w)
49         })
50         defer client.Stop()
51         if flag.NArg() == 0 {
52                 fmt.Fprintln(os.Stderr, "no torrents specified")
53                 return
54         }
55         for _, arg := range flag.Args() {
56                 var ih torrent.InfoHash
57                 if strings.HasPrefix(arg, "magnet:") {
58                         m, err := torrent.ParseMagnetURI(arg)
59                         if err != nil {
60                                 log.Fatalf("error parsing magnet uri: %s", err)
61                         }
62                         ih = m.InfoHash
63                         err = client.AddMagnet(arg)
64                         if err != nil {
65                                 log.Fatalf("error adding magnet: %s", err)
66                         }
67                 } else {
68                         metaInfo, err := metainfo.LoadFromFile(arg)
69                         if err != nil {
70                                 log.Fatal(err)
71                         }
72                         err = client.AddTorrent(metaInfo)
73                         if err != nil {
74                                 log.Fatal(err)
75                         }
76                         util.CopyExact(&ih, metaInfo.Info.Hash)
77                 }
78                 client.PrioritizeDataRegion(ih, 0, 999999999)
79                 err := client.AddPeers(ih, func() []torrent.Peer {
80                         if *testPeer == "" {
81                                 return nil
82                         }
83                         addr, err := net.ResolveTCPAddr("tcp", *testPeer)
84                         if err != nil {
85                                 log.Fatal(err)
86                         }
87                         return []torrent.Peer{{
88                                 IP:   addr.IP,
89                                 Port: addr.Port,
90                         }}
91                 }())
92                 if err != nil {
93                         log.Fatal(err)
94                 }
95         }
96         if *seed {
97                 select {}
98         }
99         if client.WaitAll() {
100                 log.Print("all torrents completed!")
101         } else {
102                 log.Fatal("y u no complete torrents?!")
103         }
104 }