github.com/anacrolix/torrent@v1.61.0/internal/cmd/issue-908/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "os" 8 9 "github.com/davecgh/go-spew/spew" 10 11 "github.com/anacrolix/torrent" 12 "github.com/anacrolix/torrent/bencode" 13 "github.com/anacrolix/torrent/metainfo" 14 ) 15 16 func main() { 17 cfg := torrent.NewDefaultClientConfig() 18 cfg.Seed = true 19 cfg.Debug = true 20 cfg.NoDefaultPortForwarding = true 21 cfg.DisableIPv6 = true 22 23 cl, err := torrent.NewClient(cfg) 24 if err != nil { 25 log.Fatal(err) 26 } 27 fmt.Printf("%x\n", cl.PeerID()) 28 defer cl.Close() 29 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 30 cl.WriteStatus(w) 31 }) 32 go http.ListenAndServe(":8080", nil) 33 34 filePath := "testdata" 35 fi, err := os.Stat(filePath) 36 if err != nil { 37 panic(err) 38 } 39 totalLength := fi.Size() 40 if err != nil { 41 log.Fatal(err) 42 } 43 pieceLength := metainfo.ChoosePieceLength(totalLength) 44 info := metainfo.Info{ 45 PieceLength: pieceLength, 46 } 47 err = info.BuildFromFilePath(filePath) 48 if err != nil { 49 log.Fatal(err) 50 } 51 for _, fi := range info.Files { 52 log.Printf("added %q", fi.BestPath()) 53 } 54 mi := &metainfo.MetaInfo{ 55 InfoBytes: bencode.MustMarshal(info), 56 } 57 spew.Dump(info) 58 torrentFile := mi 59 torrentFile.Announce = "" 60 61 // Add the torrent to the client 62 tor, err := cl.AddTorrent(torrentFile) 63 if err != nil { 64 log.Fatal(err) 65 } 66 67 // Wait for the torrent to be ready 68 <-tor.GotInfo() 69 70 hash := tor.InfoHash() 71 fmt.Printf("%v\n", tor.Metainfo().Magnet(&hash, tor.Info())) 72 73 // Announce the torrent to DHT 74 for _, _ds := range cl.DhtServers() { 75 ds := _ds 76 done, _, err := tor.AnnounceToDht(ds) 77 if err != nil { 78 log.Fatal(err) 79 } 80 for c := range done { 81 fmt.Println("++++++++++++++++++++++++", c) 82 } 83 } 84 select {} 85 }