2013-09-26 17:49:15 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
2013-11-04 21:07:28 +08:00
|
|
|
"fmt"
|
2013-09-26 17:49:15 +08:00
|
|
|
"log"
|
2013-09-29 06:11:24 +08:00
|
|
|
"net"
|
2013-11-04 21:07:28 +08:00
|
|
|
"net/http"
|
|
|
|
_ "net/http/pprof"
|
|
|
|
"os"
|
2014-06-26 22:57:07 +08:00
|
|
|
"strings"
|
2014-03-20 13:58:09 +08:00
|
|
|
|
2014-06-28 17:38:31 +08:00
|
|
|
"github.com/anacrolix/libtorgo/metainfo"
|
2014-03-20 13:58:09 +08:00
|
|
|
|
|
|
|
"bitbucket.org/anacrolix/go.torrent"
|
2014-08-21 19:08:56 +08:00
|
|
|
"bitbucket.org/anacrolix/go.torrent/util"
|
2013-09-26 17:49:15 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
downloadDir = flag.String("downloadDir", "", "directory to store download torrent data")
|
2013-11-04 21:07:28 +08:00
|
|
|
testPeer = flag.String("testPeer", "", "bootstrap peer address")
|
2014-11-17 11:21:13 +08:00
|
|
|
httpAddr = flag.String("httpAddr", "localhost:6061", "http serve address")
|
2014-03-20 21:13:32 +08:00
|
|
|
// TODO: Check the default torrent listen port.
|
2014-11-17 11:21:13 +08:00
|
|
|
listenAddr = flag.String("listenAddr", ":50007", "incoming connection address")
|
2014-05-21 15:38:09 +08:00
|
|
|
disableTrackers = flag.Bool("disableTrackers", false, "disable trackers")
|
|
|
|
seed = flag.Bool("seed", false, "seed after downloading")
|
2014-12-01 17:29:56 +08:00
|
|
|
upload = flag.Bool("upload", true, "upload data to peers")
|
2013-09-26 17:49:15 +08:00
|
|
|
)
|
|
|
|
|
2014-08-25 20:14:10 +08:00
|
|
|
func main() {
|
2013-09-30 19:51:08 +08:00
|
|
|
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
2013-09-26 17:49:15 +08:00
|
|
|
flag.Parse()
|
2014-06-27 16:57:35 +08:00
|
|
|
if *httpAddr != "" {
|
2014-07-22 23:54:58 +08:00
|
|
|
util.LoggedHTTPServe(*httpAddr)
|
2013-11-04 21:07:28 +08:00
|
|
|
}
|
2014-08-21 16:07:06 +08:00
|
|
|
client, err := torrent.NewClient(&torrent.Config{
|
2014-05-21 15:38:09 +08:00
|
|
|
DataDir: *downloadDir,
|
|
|
|
DisableTrackers: *disableTrackers,
|
2014-08-21 16:07:06 +08:00
|
|
|
ListenAddr: *listenAddr,
|
2014-12-01 17:29:56 +08:00
|
|
|
NoUpload: !*upload,
|
2014-08-21 16:07:06 +08:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("error creating client: %s", err)
|
2013-11-04 21:07:28 +08:00
|
|
|
}
|
2014-06-27 16:57:35 +08:00
|
|
|
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
|
|
|
|
client.WriteStatus(w)
|
|
|
|
})
|
2013-11-04 21:07:28 +08:00
|
|
|
defer client.Stop()
|
|
|
|
if flag.NArg() == 0 {
|
|
|
|
fmt.Fprintln(os.Stderr, "no torrents specified")
|
|
|
|
return
|
|
|
|
}
|
2013-09-26 17:49:15 +08:00
|
|
|
for _, arg := range flag.Args() {
|
2014-12-01 17:37:33 +08:00
|
|
|
t := func() torrent.Torrent {
|
|
|
|
if strings.HasPrefix(arg, "magnet:") {
|
|
|
|
t, err := client.AddMagnet(arg)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("error adding magnet: %s", err)
|
|
|
|
}
|
|
|
|
return t
|
|
|
|
} else {
|
|
|
|
metaInfo, err := metainfo.LoadFromFile(arg)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
t, err := client.AddTorrent(metaInfo)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
return t
|
2014-06-26 22:57:07 +08:00
|
|
|
}
|
2014-12-01 17:37:33 +08:00
|
|
|
}()
|
2014-08-28 08:05:41 +08:00
|
|
|
// client.PrioritizeDataRegion(ih, 0, 999999999)
|
2014-12-01 17:37:33 +08:00
|
|
|
err := t.AddPeers(func() []torrent.Peer {
|
2013-11-04 21:07:28 +08:00
|
|
|
if *testPeer == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
addr, err := net.ResolveTCPAddr("tcp", *testPeer)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
return []torrent.Peer{{
|
2014-03-20 13:58:09 +08:00
|
|
|
IP: addr.IP,
|
|
|
|
Port: addr.Port,
|
|
|
|
}}
|
2013-11-04 21:07:28 +08:00
|
|
|
}())
|
2013-09-29 06:11:24 +08:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2014-12-01 17:37:33 +08:00
|
|
|
go func() {
|
|
|
|
<-t.GotMetainfo
|
|
|
|
t.DownloadAll()
|
|
|
|
}()
|
2013-09-26 17:49:15 +08:00
|
|
|
}
|
2014-05-21 15:38:09 +08:00
|
|
|
if *seed {
|
|
|
|
select {}
|
|
|
|
}
|
2014-04-09 00:36:05 +08:00
|
|
|
if client.WaitAll() {
|
2014-08-28 08:05:41 +08:00
|
|
|
log.Print("downloaded ALL the torrents")
|
2014-04-09 00:36:05 +08:00
|
|
|
} else {
|
|
|
|
log.Fatal("y u no complete torrents?!")
|
|
|
|
}
|
2013-09-26 17:49:15 +08:00
|
|
|
}
|