]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/magnet-metainfo/main.go
536f7abff308df7cab39fcbe70418bb11333c798
[btrtrc.git] / cmd / magnet-metainfo / main.go
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().Name + ".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 }