9 "github.com/anacrolix/bargle"
10 "github.com/anacrolix/torrent/metainfo"
11 "github.com/bradfitz/iter"
14 type pprintMetainfoFlags struct {
20 func metainfoCmd() (cmd bargle.Command) {
21 var metainfoPath string
22 var mi *metainfo.MetaInfo
23 // TODO: Test if bargle treats no subcommand as a failure.
24 cmd.Positionals = append(cmd.Positionals,
25 &bargle.Positional[*string]{
28 AfterParseFunc: func(ctx bargle.Context) error {
29 ctx.AfterParse(func() (err error) {
30 mi, err = metainfo.LoadFromFile(metainfoPath)
36 bargle.Subcommand{Name: "magnet", Command: func() (cmd bargle.Command) {
37 cmd.DefaultAction = func() (err error) {
38 info, err := mi.UnmarshalInfo()
42 fmt.Fprintf(os.Stdout, "%s\n", mi.Magnet(nil, &info).String())
47 //bargle.Subcommand{Name: "pprint", Command: func(ctx args.SubCmdCtx) (err error) {
48 // var flags pprintMetainfoFlags
49 // err = ctx.NewParser().AddParams(args.FromStruct(&flags)...).Parse()
53 // err = pprintMetainfo(mi, flags)
57 // if !flags.JustName {
58 // os.Stdout.WriteString("\n")
62 //bargle.Subcommand{Name: "infohash", Command: func(ctx args.SubCmdCtx) (err error) {
63 // fmt.Printf("%s: %s\n", mi.HashInfoBytes().HexString(), metainfoPath)
66 //bargle.Subcommand{Name: "list-files", Command: func(ctx args.SubCmdCtx) (err error) {
67 // info, err := mi.UnmarshalInfo()
69 // return fmt.Errorf("unmarshalling info from metainfo at %q: %v", metainfoPath, err)
71 // for _, f := range info.UpvertedFiles() {
72 // fmt.Println(f.DisplayPath(&info))
80 func pprintMetainfo(metainfo *metainfo.MetaInfo, flags pprintMetainfoFlags) error {
81 info, err := metainfo.UnmarshalInfo()
83 return fmt.Errorf("error unmarshalling info: %s", err)
86 fmt.Printf("%s\n", info.Name)
89 d := map[string]interface{}{
91 "Name.Utf8": info.NameUtf8,
92 "NumPieces": info.NumPieces(),
93 "PieceLength": info.PieceLength,
94 "InfoHash": metainfo.HashInfoBytes().HexString(),
95 "NumFiles": len(info.UpvertedFiles()),
96 "TotalLength": info.TotalLength(),
97 "Announce": metainfo.Announce,
98 "AnnounceList": metainfo.AnnounceList,
99 "UrlList": metainfo.UrlList,
101 if len(metainfo.Nodes) > 0 {
102 d["Nodes"] = metainfo.Nodes
105 d["Files"] = info.UpvertedFiles()
107 if flags.PieceHashes {
108 d["PieceHashes"] = func() (ret []string) {
109 for i := range iter.N(info.NumPieces()) {
110 ret = append(ret, hex.EncodeToString(info.Pieces[i*20:(i+1)*20]))
115 b, _ := json.MarshalIndent(d, "", " ")
116 _, err = os.Stdout.Write(b)