github.com/anacrolix/torrent@v1.61.0/cmd/torrent/create.go (about)

     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  }