]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/torrent/create.go
gorond ./...
[btrtrc.git] / cmd / torrent / create.go
1 package main
2
3 import (
4         "os"
5
6         "github.com/anacrolix/bargle"
7         "github.com/anacrolix/tagflag"
8
9         "github.com/anacrolix/torrent/bencode"
10         "github.com/anacrolix/torrent/metainfo"
11 )
12
13 var builtinAnnounceList = [][]string{
14         {"http://p4p.arenabg.com:1337/announce"},
15         {"udp://tracker.opentrackr.org:1337/announce"},
16         {"udp://tracker.openbittorrent.com:6969/announce"},
17 }
18
19 func create() (cmd bargle.Command) {
20         var args struct {
21                 AnnounceList      []string `name:"a" help:"extra announce-list tier entry"`
22                 EmptyAnnounceList bool     `name:"n" help:"exclude default announce-list entries"`
23                 Comment           string   `name:"t" help:"comment"`
24                 CreatedBy         string   `name:"c" help:"created by"`
25                 InfoName          *string  `name:"i" help:"override info name (defaults to ROOT)"`
26                 PieceLength       tagflag.Bytes
27                 Url               []string `name:"u" help:"add webseed url"`
28                 Private           *bool
29                 Root              string `arg:"positional"`
30         }
31         cmd = bargle.FromStruct(&args)
32         cmd.Desc = "Creates a torrent metainfo for the file system rooted at ROOT, and outputs it to stdout"
33         cmd.DefaultAction = func() (err error) {
34                 mi := metainfo.MetaInfo{
35                         AnnounceList: builtinAnnounceList,
36                 }
37                 if args.EmptyAnnounceList {
38                         mi.AnnounceList = make([][]string, 0)
39                 }
40                 for _, a := range args.AnnounceList {
41                         mi.AnnounceList = append(mi.AnnounceList, []string{a})
42                 }
43                 mi.SetDefaults()
44                 if len(args.Comment) > 0 {
45                         mi.Comment = args.Comment
46                 }
47                 if len(args.CreatedBy) > 0 {
48                         mi.CreatedBy = args.CreatedBy
49                 }
50                 mi.UrlList = args.Url
51                 info := metainfo.Info{
52                         PieceLength: args.PieceLength.Int64(),
53                         Private:     args.Private,
54                 }
55                 err = info.BuildFromFilePath(args.Root)
56                 if err != nil {
57                         return
58                 }
59                 if args.InfoName != nil {
60                         info.Name = *args.InfoName
61                 }
62                 mi.InfoBytes, err = bencode.Marshal(info)
63                 if err != nil {
64                         return
65                 }
66                 err = mi.Write(os.Stdout)
67                 return
68         }
69         return
70 }