From 8dc7615432e0b9611238f70562e660e5da7fbd21 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Mon, 25 Mar 2024 13:32:46 +1100 Subject: [PATCH] cmd/torrent metainfo magnet: Support v2 torrents --- cmd/torrent/metainfo.go | 4 ++-- metainfo/metainfo.go | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cmd/torrent/metainfo.go b/cmd/torrent/metainfo.go index dd9d399c..1a940fc5 100644 --- a/cmd/torrent/metainfo.go +++ b/cmd/torrent/metainfo.go @@ -49,11 +49,11 @@ func metainfoCmd() (cmd bargle.Command) { }, bargle.Subcommand{Name: "magnet", Command: func() (cmd bargle.Command) { cmd.DefaultAction = func() (err error) { - info, err := mi.UnmarshalInfo() + m, err := mi.MagnetV2() if err != nil { return } - fmt.Fprintf(os.Stdout, "%s\n", mi.Magnet(nil, &info).String()) + fmt.Fprintf(os.Stdout, "%v\n", m.String()) return nil } return diff --git a/metainfo/metainfo.go b/metainfo/metainfo.go index 6a5ea1cd..383b5ca9 100644 --- a/metainfo/metainfo.go +++ b/metainfo/metainfo.go @@ -8,6 +8,7 @@ import ( "time" "github.com/anacrolix/torrent/bencode" + infohash_v2 "github.com/anacrolix/torrent/types/infohash-v2" ) // Also known as a torrent file. @@ -72,7 +73,8 @@ func (mi *MetaInfo) SetDefaults() { mi.CreationDate = time.Now().Unix() } -// Creates a Magnet from a MetaInfo. Optional infohash and parsed info can be provided. +// Deprecated: Use MagnetV2. Creates a Magnet from a MetaInfo. Optional infohash and parsed info can +// be provided. func (mi MetaInfo) Magnet(infoHash *Hash, info *Info) (m Magnet) { m.Trackers = append(m.Trackers, mi.UpvertedAnnounceList().DistinctValues()...) if info != nil { @@ -88,6 +90,25 @@ func (mi MetaInfo) Magnet(infoHash *Hash, info *Info) (m Magnet) { return } +// Creates a MagnetV2 from a MetaInfo. This supports v1, hybrid, and v2 magnet links. +func (mi *MetaInfo) MagnetV2() (m MagnetV2, err error) { + m.Trackers = append(m.Trackers, mi.UpvertedAnnounceList().DistinctValues()...) + info, err := mi.UnmarshalInfo() + if err != nil { + return + } + m.DisplayName = info.BestName() + if info.HasV1() { + m.InfoHash.Set(mi.HashInfoBytes()) + } + if info.HasV2() { + m.V2InfoHash.Set(infohash_v2.HashBytes(mi.InfoBytes)) + } + m.Params = make(url.Values) + m.Params["ws"] = mi.UrlList + return +} + // Returns the announce-list converted from the old single announce field if necessary. func (mi *MetaInfo) UpvertedAnnounceList() AnnounceList { if mi.AnnounceList.OverridesAnnounce(mi.Announce) { -- 2.48.1