90 lines
2.4 KiB
Go
90 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"path/filepath"
|
|
|
|
"github.com/anacrolix/bargle"
|
|
"github.com/anacrolix/log"
|
|
|
|
"github.com/anacrolix/torrent"
|
|
"github.com/anacrolix/torrent/bencode"
|
|
"github.com/anacrolix/torrent/metainfo"
|
|
"github.com/anacrolix/torrent/storage"
|
|
)
|
|
|
|
func serve() (cmd bargle.Command) {
|
|
var filePaths []string
|
|
cmd.Positionals = append(cmd.Positionals, &bargle.Positional{
|
|
Value: bargle.AutoUnmarshaler(&filePaths),
|
|
})
|
|
cmd.Desc = "creates and seeds a torrent from a filepath"
|
|
cmd.DefaultAction = func() error {
|
|
cfg := torrent.NewDefaultClientConfig()
|
|
cfg.Seed = true
|
|
cl, err := torrent.NewClient(cfg)
|
|
if err != nil {
|
|
return fmt.Errorf("new torrent client: %w", err)
|
|
}
|
|
defer cl.Close()
|
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
cl.WriteStatus(w)
|
|
})
|
|
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))
|
|
}
|
|
select {}
|
|
}
|
|
return
|
|
}
|