]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add magnet-metainfo, tool to download magnet to torrent file
authorMatt Joiner <anacrolix@gmail.com>
Thu, 25 Sep 2014 08:05:52 +0000 (18:05 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 25 Sep 2014 08:05:52 +0000 (18:05 +1000)
client.go
cmd/magnet-metainfo/main.go [new file with mode: 0644]
cmd/torrent/main.go
cmd/torrentfs/main.go
fs/torrentfs_test.go
torrent.go

index 39dc0a1e1d60e2a6372e7df3e210668c99b853b6..56df4285fe1eb3c38a12ad52479d464b65d9c542 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1083,6 +1083,21 @@ func (cl *Client) setMetaData(t *torrent, md metainfo.Info, bytes []byte) (err e
        }
 
        cl.downloadStrategy.TorrentStarted(t)
+       select {
+       case t.gotMetainfo <- &metainfo.MetaInfo{
+               Info: metainfo.InfoEx{
+                       Info: md,
+               },
+               CreationDate: time.Now().Unix(),
+               Comment:      "metadata set in client",
+               CreatedBy:    "go.torrent",
+               // TODO(anacrolix): Expose trackers given when torrent added.
+       }:
+       default:
+               panic("shouldn't block")
+       }
+       close(t.gotMetainfo)
+       t.gotMetainfo = nil
        return
 }
 
@@ -1096,7 +1111,10 @@ func newTorrent(ih InfoHash, announceList [][]string) (t *torrent, err error) {
 
                closing:           make(chan struct{}),
                ceasingNetworking: make(chan struct{}),
+
+               gotMetainfo: make(chan *metainfo.MetaInfo, 1),
        }
+       t.GotMetainfo = t.gotMetainfo
        t.Trackers = make([][]tracker.Client, len(announceList))
        for tierIndex := range announceList {
                tier := t.Trackers[tierIndex]
@@ -1120,12 +1138,12 @@ func newTorrent(ih InfoHash, announceList [][]string) (t *torrent, err error) {
        return
 }
 
-func (cl *Client) AddMagnet(uri string) (err error) {
+func (cl *Client) AddMagnet(uri string) (t *torrent, err error) {
        m, err := ParseMagnetURI(uri)
        if err != nil {
                return
        }
-       t, err := newTorrent(m.InfoHash, [][]string{m.Trackers})
+       t, err = newTorrent(m.InfoHash, [][]string{m.Trackers})
        if err != nil {
                return
        }
diff --git a/cmd/magnet-metainfo/main.go b/cmd/magnet-metainfo/main.go
new file mode 100644 (file)
index 0000000..9e73c91
--- /dev/null
@@ -0,0 +1,48 @@
+// Converts magnet URIs and info hashes into torrent metainfo files.
+package main
+
+import (
+       "flag"
+       "log"
+       "os"
+       "sync"
+
+       "github.com/anacrolix/libtorgo/bencode"
+
+       "bitbucket.org/anacrolix/go.torrent"
+)
+
+func main() {
+       flag.Parse()
+       cl, err := torrent.NewClient(nil)
+       if err != nil {
+               log.Fatalf("error creating client: %s", err)
+       }
+       wg := sync.WaitGroup{}
+       for _, arg := range flag.Args() {
+               t, err := cl.AddMagnet(arg)
+               if err != nil {
+                       log.Fatalf("error adding magnet to client: %s", err)
+               }
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+                       mi, ok := <-t.GotMetainfo
+                       t.Close()
+                       if !ok {
+                               log.Printf("no metainfo for %q", t.Name())
+                               return
+                       }
+                       f, err := os.Create(mi.Info.Name + ".torrent")
+                       if err != nil {
+                               log.Fatalf("error creating torrent metainfo file: %s", err)
+                       }
+                       defer f.Close()
+                       err = bencode.NewEncoder(f).Encode(mi)
+                       if err != nil {
+                               log.Fatalf("error writing torrent metainfo file: %s", err)
+                       }
+               }()
+       }
+       wg.Wait()
+}
index ed98932421d78d76ae4fa34a7e05c679ffe6c470..20a7f6e317cc5fe98b477a8f9f2322adf7e2b236 100644 (file)
@@ -56,7 +56,7 @@ func main() {
                                log.Fatalf("error parsing magnet uri: %s", err)
                        }
                        ih = m.InfoHash
-                       err = client.AddMagnet(arg)
+                       _, err = client.AddMagnet(arg)
                        if err != nil {
                                log.Fatalf("error adding magnet: %s", err)
                        }
index 4a5b75993445f46987904a2a4fdfbacccb3ac5a5..fa9389e4e0f71bf099bfddc3dd7fde4375f95dd9 100644 (file)
@@ -130,7 +130,7 @@ func main() {
                                                log.Printf("error adding torrent to client: %s", err)
                                        }
                                } else if ev.MagnetURI != "" {
-                                       err := client.AddMagnet(ev.MagnetURI)
+                                       _, err := client.AddMagnet(ev.MagnetURI)
                                        if err != nil {
                                                log.Printf("error adding magnet: %s", err)
                                        }
index fb214bdf04c1bf60072cc878850f502468de7aab..8cd8ebe55a210477e7e68f92ce6576de5579c794 100644 (file)
@@ -142,7 +142,7 @@ func TestDownloadOnDemand(t *testing.T) {
                seeder.WriteStatus(w)
        })
        defer seeder.Stop()
-       err = seeder.AddMagnet(fmt.Sprintf("magnet:?xt=urn:btih:%x", layout.Metainfo.Info.Hash))
+       _, err = seeder.AddMagnet(fmt.Sprintf("magnet:?xt=urn:btih:%x", layout.Metainfo.Info.Hash))
        if err != nil {
                t.Fatal(err)
        }
index ce9d92730b0e5d52248f79b0dd80fd9eca51bea9..c4686edadec51cca491db1f28af95a2136dcca2f 100644 (file)
@@ -67,6 +67,9 @@ type torrent struct {
        DisplayName  string
        MetaData     []byte
        metadataHave []bool
+
+       gotMetainfo chan *metainfo.MetaInfo
+       GotMetainfo <-chan *metainfo.MetaInfo
 }
 
 func (t *torrent) worstConnsHeap() (wcs *worstConns) {