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