client_test.go | 2 +- cmd/torrent-magnet/main.go | 2 +- metainfo/magnet_test.go | 2 +- metainfo/metainfo.go | 16 ++++++++++++---- metainfo/metainfo_test.go | 5 +++++ diff --git a/client_test.go b/client_test.go index 5abc83e4df4121d76d8d9ed6758d60eaffa44bda..adcd0c720d020e0d1796165c5ccfa408ab659cad 100644 --- a/client_test.go +++ b/client_test.go @@ -672,7 +672,7 @@ err = info.BuildFromFilePath(filepath.Join(dir, name)) require.NoError(t, err) mi.InfoBytes, err = bencode.Marshal(info) require.NoError(t, err) - magnet := mi.Magnet(name, mi.HashInfoBytes()).String() + magnet := mi.Magnet(nil, &info).String() tr, err := cl.AddTorrent(&mi) require.NoError(t, err) require.True(t, tr.Seeding()) diff --git a/cmd/torrent-magnet/main.go b/cmd/torrent-magnet/main.go index 7be1e4af7e64d7092873306f8a1d396b3b1d4842..8f04a37dbce34d6dbfb9390296bf8d5ab67763fe 100644 --- a/cmd/torrent-magnet/main.go +++ b/cmd/torrent-magnet/main.go @@ -23,5 +23,5 @@ fmt.Fprintf(os.Stderr, "error unmarshalling info: %s", err) os.Exit(1) } - fmt.Fprintf(os.Stdout, "%s\n", mi.Magnet(info.Name, mi.HashInfoBytes()).String()) + fmt.Fprintf(os.Stdout, "%s\n", mi.Magnet(nil, &info).String()) } diff --git a/metainfo/magnet_test.go b/metainfo/magnet_test.go index e11abf6e95f2aba8021124e77933b44257ff6d88..24db8fdba4b746867baaf7564f8f8649b56031cc 100644 --- a/metainfo/magnet_test.go +++ b/metainfo/magnet_test.go @@ -76,7 +76,7 @@ require.NoError(t, err) info, err := mi.UnmarshalInfo() require.NoError(t, err) - m := mi.Magnet(info.Name, mi.HashInfoBytes()) + m := mi.Magnet(nil, &info) assert.EqualValues(t, "bootstrap.dat", m.DisplayName) diff --git a/metainfo/metainfo.go b/metainfo/metainfo.go index 2e471c8acbdfbb3eb42dedc53f6f8f324cb17def..9b06ebd46f86a1219f29b214d6da877a22b8c034 100644 --- a/metainfo/metainfo.go +++ b/metainfo/metainfo.go @@ -67,13 +67,21 @@ mi.CreationDate = time.Now().Unix() // mi.Info.PieceLength = 256 * 1024 } -// Creates a Magnet from a MetaInfo. -func (mi *MetaInfo) Magnet(displayName string, infoHash Hash) (m Magnet) { +// Creates a Magnet from a MetaInfo. Optional infohash and parsed info can be provided. +func (mi *MetaInfo) Magnet(infoHash *Hash, info *Info) (m Magnet) { for t := range mi.UpvertedAnnounceList().DistinctValues() { m.Trackers = append(m.Trackers, t) } - m.DisplayName = displayName - m.InfoHash = infoHash + if info != nil { + m.DisplayName = info.Name + } + if infoHash != nil { + m.InfoHash = *infoHash + } else { + m.InfoHash = mi.HashInfoBytes() + } + //m.Params = make(url.Values) + //m.Params["ws"] = mi.UrlList return } diff --git a/metainfo/metainfo_test.go b/metainfo/metainfo_test.go index e54447ae5aadeebffb25a50171f5885dd15a1e24..6aae2b4fec1a3a5cb790ae6ad30035cc5f59207c 100644 --- a/metainfo/metainfo_test.go +++ b/metainfo/metainfo_test.go @@ -9,6 +9,7 @@ "path/filepath" "testing" "github.com/anacrolix/missinggo" + qt "github.com/frankban/quicktest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -121,12 +122,16 @@ func TestMetainfoWithListURLList(t *testing.T) { mi, err := LoadFromFile("testdata/SKODAOCTAVIA336x280_archive.torrent") require.NoError(t, err) assert.Len(t, mi.UrlList, 3) + qt.Assert(t, mi.Magnet(nil, nil).String(), qt.ContentEquals, + "magnet:?xt=urn:btih:d4b197dff199aad447a9a352e31528adbbd97922&tr=http%3A%2F%2Fbt1.archive.org%3A6969%2Fannounce&tr=http%3A%2F%2Fbt2.archive.org%3A6969%2Fannounce") } func TestMetainfoWithStringURLList(t *testing.T) { mi, err := LoadFromFile("testdata/flat-url-list.torrent") require.NoError(t, err) assert.Len(t, mi.UrlList, 1) + qt.Assert(t, mi.Magnet(nil, nil).String(), qt.ContentEquals, + "magnet:?xt=urn:btih:9da24e606e4ed9c7b91c1772fb5bf98f82bd9687&tr=http%3A%2F%2Fbt1.archive.org%3A6969%2Fannounce&tr=http%3A%2F%2Fbt2.archive.org%3A6969%2Fannounce") } // https://github.com/anacrolix/torrent/issues/247