9 "github.com/anacrolix/args"
10 "github.com/anacrolix/torrent/metainfo"
11 "github.com/bradfitz/iter"
14 type pprintMetainfoFlags struct {
20 func metainfoCmd(ctx args.SubCmdCtx) (err error) {
21 var metainfoPath string
22 var mi *metainfo.MetaInfo
23 // TODO: Treat no subcommand as a failure.
24 return ctx.NewParser().AddParams(
25 args.Pos("torrent file", &metainfoPath, args.AfterParse(func() (err error) {
26 mi, err = metainfo.LoadFromFile(metainfoPath)
29 args.Subcommand("magnet", func(ctx args.SubCmdCtx) (err error) {
30 info, err := mi.UnmarshalInfo()
34 fmt.Fprintf(os.Stdout, "%s\n", mi.Magnet(nil, &info).String())
37 args.Subcommand("pprint", func(ctx args.SubCmdCtx) (err error) {
38 var flags pprintMetainfoFlags
39 err = ctx.NewParser().AddParams(args.FromStruct(&flags)...).Parse()
43 err = pprintMetainfo(mi, flags)
48 os.Stdout.WriteString("\n")
52 args.Subcommand("infohash", func(ctx args.SubCmdCtx) (err error) {
53 fmt.Printf("%s: %s\n", mi.HashInfoBytes().HexString(), metainfoPath)
56 args.Subcommand("list-files", func(ctx args.SubCmdCtx) (err error) {
57 info, err := mi.UnmarshalInfo()
59 return fmt.Errorf("unmarshalling info from metainfo at %q: %v", metainfoPath, err)
61 for _, f := range info.UpvertedFiles() {
62 fmt.Println(f.DisplayPath(&info))
69 func pprintMetainfo(metainfo *metainfo.MetaInfo, flags pprintMetainfoFlags) error {
70 info, err := metainfo.UnmarshalInfo()
72 return fmt.Errorf("error unmarshalling info: %s", err)
75 fmt.Printf("%s\n", info.Name)
78 d := map[string]interface{}{
80 "Name.Utf8": info.NameUtf8,
81 "NumPieces": info.NumPieces(),
82 "PieceLength": info.PieceLength,
83 "InfoHash": metainfo.HashInfoBytes().HexString(),
84 "NumFiles": len(info.UpvertedFiles()),
85 "TotalLength": info.TotalLength(),
86 "Announce": metainfo.Announce,
87 "AnnounceList": metainfo.AnnounceList,
88 "UrlList": metainfo.UrlList,
90 if len(metainfo.Nodes) > 0 {
91 d["Nodes"] = metainfo.Nodes
94 d["Files"] = info.UpvertedFiles()
96 if flags.PieceHashes {
97 d["PieceHashes"] = func() (ret []string) {
98 for i := range iter.N(info.NumPieces()) {
99 ret = append(ret, hex.EncodeToString(info.Pieces[i*20:(i+1)*20]))
104 b, _ := json.MarshalIndent(d, "", " ")
105 _, err = os.Stdout.Write(b)