]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/torrent-metainfo-pprint/main.go
Switch to goimports import sorting
[btrtrc.git] / cmd / torrent-metainfo-pprint / main.go
1 package main
2
3 import (
4         "bufio"
5         "encoding/hex"
6         "encoding/json"
7         "fmt"
8         "io"
9         "log"
10         "os"
11
12         "github.com/anacrolix/envpprof"
13         "github.com/anacrolix/tagflag"
14         "github.com/anacrolix/torrent/metainfo"
15         "github.com/bradfitz/iter"
16 )
17
18 var flags struct {
19         JustName    bool
20         PieceHashes bool
21         Files       bool
22         tagflag.StartPos
23 }
24
25 func processReader(r io.Reader) error {
26         metainfo, err := metainfo.Load(r)
27         if err != nil {
28                 return err
29         }
30         info, err := metainfo.UnmarshalInfo()
31         if err != nil {
32                 return fmt.Errorf("error unmarshalling info: %s", err)
33         }
34         if flags.JustName {
35                 fmt.Printf("%s\n", info.Name)
36                 return nil
37         }
38         d := map[string]interface{}{
39                 "Name":         info.Name,
40                 "NumPieces":    info.NumPieces(),
41                 "PieceLength":  info.PieceLength,
42                 "InfoHash":     metainfo.HashInfoBytes().HexString(),
43                 "NumFiles":     len(info.UpvertedFiles()),
44                 "TotalLength":  info.TotalLength(),
45                 "Announce":     metainfo.Announce,
46                 "AnnounceList": metainfo.AnnounceList,
47                 "UrlList":      metainfo.UrlList,
48         }
49         if flags.Files {
50                 d["Files"] = info.Files
51         }
52         if flags.PieceHashes {
53                 d["PieceHashes"] = func() (ret []string) {
54                         for i := range iter.N(info.NumPieces()) {
55                                 ret = append(ret, hex.EncodeToString(info.Pieces[i*20:(i+1)*20]))
56                         }
57                         return
58                 }()
59         }
60         b, _ := json.MarshalIndent(d, "", "  ")
61         _, err = os.Stdout.Write(b)
62         return err
63 }
64
65 func main() {
66         defer envpprof.Stop()
67         tagflag.Parse(&flags)
68         err := processReader(bufio.NewReader(os.Stdin))
69         if err != nil {
70                 log.Fatal(err)
71         }
72         if !flags.JustName {
73                 os.Stdout.WriteString("\n")
74         }
75 }