From 1b6a6f72b02ba00fcef5e09695db14a755331398 Mon Sep 17 00:00:00 2001 From: Mivik <54128043+Mivik@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:44:45 +0800 Subject: [PATCH] Basic support for serializing v2 torrent file (#968) * Support marshalling FileTree * Omit Pieces in torrent info if empty Otherwise some BitTorrent client (e.g. libttorrent) will not be able to parse v2 torrent file. --- metainfo/file-tree.go | 29 +++++++++++++++++++++++++++++ metainfo/info.go | 6 +++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/metainfo/file-tree.go b/metainfo/file-tree.go index 2b651bd4..6401b1ed 100644 --- a/metainfo/file-tree.go +++ b/metainfo/file-tree.go @@ -49,6 +49,35 @@ func (ft *FileTree) UnmarshalBencode(bytes []byte) (err error) { var _ bencode.Unmarshaler = (*FileTree)(nil) +func (ft *FileTree) MarshalBencode() (bytes []byte, err error) { + if ft.IsDir() { + dir := make(map[string]bencode.Bytes, len(ft.Dir)) + for _, key := range ft.orderedKeys() { + if key == FileTreePropertiesKey { + continue + } + sub := g.MapMustGet(ft.Dir, key) + subBytes, err := sub.MarshalBencode() + if err != nil { + return nil, err + } + dir[key] = subBytes + } + return bencode.Marshal(dir) + } else { + fileBytes, err := bencode.Marshal(ft.File) + if err != nil { + return nil, err + } + res := map[string]bencode.Bytes{ + "": fileBytes, + } + return bencode.Marshal(res) + } +} + +var _ bencode.Marshaler = (*FileTree)(nil) + func (ft *FileTree) NumEntries() (num int) { num = len(ft.Dir) if g.MapContains(ft.Dir, FileTreePropertiesKey) { diff --git a/metainfo/info.go b/metainfo/info.go index 5252e209..015876ed 100644 --- a/metainfo/info.go +++ b/metainfo/info.go @@ -13,9 +13,9 @@ import ( // The info dictionary. See BEP 3 and BEP 52. type Info struct { - PieceLength int64 `bencode:"piece length"` // BEP3 - Pieces []byte `bencode:"pieces"` // BEP3 - Name string `bencode:"name"` // BEP3 + PieceLength int64 `bencode:"piece length"` // BEP3 + Pieces []byte `bencode:"pieces,omitempty"` // BEP3 + Name string `bencode:"name"` // BEP3 NameUtf8 string `bencode:"name.utf-8,omitempty"` Length int64 `bencode:"length,omitempty"` // BEP3, mutually exclusive with Files ExtendedFileAttrs -- 2.48.1