github.com/anacrolix/torrent@v1.61.0/cmd/magnet-metainfo/main.go (about)

     1  // Converts magnet URIs and info hashes into torrent metainfo files.
     2  package main
     3  
     4  import (
     5  	"log"
     6  	"net/http"
     7  	"os"
     8  	"sync"
     9  
    10  	_ "github.com/anacrolix/envpprof"
    11  	"github.com/anacrolix/tagflag"
    12  
    13  	"github.com/anacrolix/torrent"
    14  	"github.com/anacrolix/torrent/bencode"
    15  )
    16  
    17  func main() {
    18  	args := struct {
    19  		tagflag.StartPos
    20  		Magnet []string
    21  	}{}
    22  	tagflag.Parse(&args)
    23  	cl, err := torrent.NewClient(nil)
    24  	if err != nil {
    25  		log.Fatalf("error creating client: %s", err)
    26  	}
    27  	http.HandleFunc("/torrent", func(w http.ResponseWriter, r *http.Request) {
    28  		cl.WriteStatus(w)
    29  	})
    30  	http.HandleFunc("/dht", func(w http.ResponseWriter, r *http.Request) {
    31  		for _, ds := range cl.DhtServers() {
    32  			ds.WriteStatus(w)
    33  		}
    34  	})
    35  	wg := sync.WaitGroup{}
    36  	for _, arg := range args.Magnet {
    37  		t, err := cl.AddMagnet(arg)
    38  		if err != nil {
    39  			log.Fatalf("error adding magnet to client: %s", err)
    40  		}
    41  		wg.Add(1)
    42  		go func() {
    43  			defer wg.Done()
    44  			<-t.GotInfo()
    45  			mi := t.Metainfo()
    46  			t.Drop()
    47  			f, err := os.Create(t.Info().BestName() + ".torrent")
    48  			if err != nil {
    49  				log.Fatalf("error creating torrent metainfo file: %s", err)
    50  			}
    51  			defer f.Close()
    52  			err = bencode.NewEncoder(f).Encode(mi)
    53  			if err != nil {
    54  				log.Fatalf("error writing torrent metainfo file: %s", err)
    55  			}
    56  		}()
    57  	}
    58  	wg.Wait()
    59  }