github.com/anacrolix/torrent@v1.61.0/cmd/magnet-metainfo/main.go (about) 1 // Converts magnet URIs and info hashes into torrent metainfo files. 2 package main 3 4 import ( 5 "log" 6 "net/http" 7 "os" 8 "sync" 9 10 _ "github.com/anacrolix/envpprof" 11 "github.com/anacrolix/tagflag" 12 13 "github.com/anacrolix/torrent" 14 "github.com/anacrolix/torrent/bencode" 15 ) 16 17 func main() { 18 args := struct { 19 tagflag.StartPos 20 Magnet []string 21 }{} 22 tagflag.Parse(&args) 23 cl, err := torrent.NewClient(nil) 24 if err != nil { 25 log.Fatalf("error creating client: %s", err) 26 } 27 http.HandleFunc("/torrent", func(w http.ResponseWriter, r *http.Request) { 28 cl.WriteStatus(w) 29 }) 30 http.HandleFunc("/dht", func(w http.ResponseWriter, r *http.Request) { 31 for _, ds := range cl.DhtServers() { 32 ds.WriteStatus(w) 33 } 34 }) 35 wg := sync.WaitGroup{} 36 for _, arg := range args.Magnet { 37 t, err := cl.AddMagnet(arg) 38 if err != nil { 39 log.Fatalf("error adding magnet to client: %s", err) 40 } 41 wg.Add(1) 42 go func() { 43 defer wg.Done() 44 <-t.GotInfo() 45 mi := t.Metainfo() 46 t.Drop() 47 f, err := os.Create(t.Info().BestName() + ".torrent") 48 if err != nil { 49 log.Fatalf("error creating torrent metainfo file: %s", err) 50 } 51 defer f.Close() 52 err = bencode.NewEncoder(f).Encode(mi) 53 if err != nil { 54 log.Fatalf("error writing torrent metainfo file: %s", err) 55 } 56 }() 57 } 58 wg.Wait() 59 }