]> Sergey Matveev's repositories - btrtrc.git/commitdiff
cmd/torrent metainfo magnet: Support v2 torrents
authorMatt Joiner <anacrolix@gmail.com>
Mon, 25 Mar 2024 02:32:46 +0000 (13:32 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 25 Mar 2024 02:32:46 +0000 (13:32 +1100)
cmd/torrent/metainfo.go
metainfo/metainfo.go

index dd9d399c49ec83214d6d88783094ab8d14d6dd05..1a940fc506babf8e973d65bef29c47166c294ec3 100644 (file)
@@ -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
index 6a5ea1cd906aedee70fe551616f36962c31ada5f..383b5ca9b9e8b90f97ba99c36869ee473197610a 100644 (file)
@@ -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) {