From 43b2d3ee21574117bfdcd45b9fbbfa10fe847ce9 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Sun, 3 Jul 2022 21:46:28 +1000 Subject: [PATCH] cmd/torrent serve: Support multiple file paths --- cmd/torrent/serve.go | 104 ++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/cmd/torrent/serve.go b/cmd/torrent/serve.go index cf6d483f..0d3487d4 100644 --- a/cmd/torrent/serve.go +++ b/cmd/torrent/serve.go @@ -14,9 +14,9 @@ import ( ) func serve() (cmd bargle.Command) { - var filePath string + var filePaths []string cmd.Positionals = append(cmd.Positionals, &bargle.Positional{ - Value: &bargle.String{Target: &filePath}, + Value: bargle.AutoUnmarshaler(&filePaths), }) cmd.Desc = "creates and seeds a torrent from a filepath" cmd.DefaultAction = func() error { @@ -30,56 +30,58 @@ func serve() (cmd bargle.Command) { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { cl.WriteStatus(w) }) - totalLength, err := totalLength(filePath) - if err != nil { - return fmt.Errorf("calculating total length of %q: %v", filePath, err) - } - pieceLength := metainfo.ChoosePieceLength(totalLength) - info := metainfo.Info{ - PieceLength: pieceLength, - } - err = info.BuildFromFilePath(filePath) - if err != nil { - return fmt.Errorf("building info from path %q: %w", filePath, err) - } - for _, fi := range info.Files { - log.Printf("added %q", fi.Path) - } - mi := metainfo.MetaInfo{ - InfoBytes: bencode.MustMarshal(info), - } - pc, err := storage.NewDefaultPieceCompletionForDir(".") - if err != nil { - return fmt.Errorf("new piece completion: %w", err) - } - defer pc.Close() - ih := mi.HashInfoBytes() - to, _ := cl.AddTorrentOpt(torrent.AddTorrentOpts{ - InfoHash: ih, - Storage: storage.NewFileOpts(storage.NewFileClientOpts{ - ClientBaseDir: filePath, - FilePathMaker: func(opts storage.FilePathMakerOpts) string { - return filepath.Join(opts.File.Path...) - }, - TorrentDirMaker: nil, - PieceCompletion: pc, - }), - }) - defer to.Drop() - err = to.MergeSpec(&torrent.TorrentSpec{ - InfoBytes: mi.InfoBytes, - Trackers: [][]string{{ - `wss://tracker.btorrent.xyz`, - `wss://tracker.openwebtorrent.com`, - "http://p4p.arenabg.com:1337/announce", - "udp://tracker.opentrackr.org:1337/announce", - "udp://tracker.openbittorrent.com:6969/announce", - }}, - }) - if err != nil { - return fmt.Errorf("setting trackers: %w", err) + for _, filePath := range filePaths { + totalLength, err := totalLength(filePath) + if err != nil { + return fmt.Errorf("calculating total length of %q: %v", filePath, err) + } + pieceLength := metainfo.ChoosePieceLength(totalLength) + info := metainfo.Info{ + PieceLength: pieceLength, + } + err = info.BuildFromFilePath(filePath) + if err != nil { + return fmt.Errorf("building info from path %q: %w", filePath, err) + } + for _, fi := range info.Files { + log.Printf("added %q", fi.Path) + } + mi := metainfo.MetaInfo{ + InfoBytes: bencode.MustMarshal(info), + } + pc, err := storage.NewDefaultPieceCompletionForDir(".") + if err != nil { + return fmt.Errorf("new piece completion: %w", err) + } + defer pc.Close() + ih := mi.HashInfoBytes() + to, _ := cl.AddTorrentOpt(torrent.AddTorrentOpts{ + InfoHash: ih, + Storage: storage.NewFileOpts(storage.NewFileClientOpts{ + ClientBaseDir: filePath, + FilePathMaker: func(opts storage.FilePathMakerOpts) string { + return filepath.Join(opts.File.Path...) + }, + TorrentDirMaker: nil, + PieceCompletion: pc, + }), + }) + defer to.Drop() + err = to.MergeSpec(&torrent.TorrentSpec{ + InfoBytes: mi.InfoBytes, + Trackers: [][]string{{ + `wss://tracker.btorrent.xyz`, + `wss://tracker.openwebtorrent.com`, + "http://p4p.arenabg.com:1337/announce", + "udp://tracker.opentrackr.org:1337/announce", + "udp://tracker.openbittorrent.com:6969/announce", + }}, + }) + if err != nil { + return fmt.Errorf("setting trackers: %w", err) + } + fmt.Printf("%v: %v\n", to, to.Metainfo().Magnet(&ih, &info)) } - fmt.Printf("%v: %v\n", to, to.Metainfo().Magnet(&ih, &info)) select {} } return -- 2.44.0