metainfo/metainfo.go | 2 +- metainfo/metainfo_test.go | 12 ++++++++++++ metainfo/urllist.go | 27 +++++++++++++++++++++++++++ diff --git a/metainfo/metainfo.go b/metainfo/metainfo.go index 947bd7136b0e9d61e8ab9522853ff485fd92d633..55624e99c5db448f3ac2ed2e42df48b3f60e61bb 100644 --- a/metainfo/metainfo.go +++ b/metainfo/metainfo.go @@ -17,7 +17,7 @@ CreationDate int64 `bencode:"creation date,omitempty"` Comment string `bencode:"comment,omitempty"` CreatedBy string `bencode:"created by,omitempty"` Encoding string `bencode:"encoding,omitempty"` - URLList []string `bencode:"url-list,omitempty"` + UrlList UrlList `bencode:"url-list,omitempty"` } // Load a MetaInfo from an io.Reader. Returns a non-nil error in case of diff --git a/metainfo/metainfo_test.go b/metainfo/metainfo_test.go index 037f8825f5a4421be15fa77d705b54c97721716b..2f1ec7450cd033f645b5a38e3752ec4df46bb54d 100644 --- a/metainfo/metainfo_test.go +++ b/metainfo/metainfo_test.go @@ -116,3 +116,15 @@ testUnmarshal(t, `d4:infoe`, &MetaInfo{}) testUnmarshal(t, `d4:infoabce`, nil) testUnmarshal(t, `d4:infodee`, &MetaInfo{InfoBytes: []byte("de")}) } + +func TestMetainfoWithListURLList(t *testing.T) { + mi, err := LoadFromFile("testdata/SKODAOCTAVIA336x280_archive.torrent") + require.NoError(t, err) + assert.Len(t, mi.UrlList, 3) +} + +func TestMetainfoWithStringURLList(t *testing.T) { + mi, err := LoadFromFile("testdata/flat-url-list.torrent") + require.NoError(t, err) + assert.Len(t, mi.UrlList, 1) +} diff --git a/metainfo/testdata/SKODAOCTAVIA336x280_archive.torrent b/metainfo/testdata/SKODAOCTAVIA336x280_archive.torrent new file mode 100644 index 0000000000000000000000000000000000000000..40ec11f6e8b833034e980af28a3264ada1da5bee Binary files /dev/null and b/metainfo/testdata/SKODAOCTAVIA336x280_archive.torrent differ diff --git a/metainfo/testdata/flat-url-list.torrent b/metainfo/testdata/flat-url-list.torrent new file mode 100644 index 0000000000000000000000000000000000000000..216ab38cacceff5f5bfd42e1958ce966dad53a1c Binary files /dev/null and b/metainfo/testdata/flat-url-list.torrent differ diff --git a/metainfo/urllist.go b/metainfo/urllist.go new file mode 100644 index 0000000000000000000000000000000000000000..8171f1982636819855c06a30410513fcd7699a52 --- /dev/null +++ b/metainfo/urllist.go @@ -0,0 +1,27 @@ +package metainfo + +import ( + "github.com/anacrolix/torrent/bencode" +) + +type UrlList []string + +var ( + _ bencode.Unmarshaler = (*UrlList)(nil) +) + +func (me *UrlList) UnmarshalBencode(b []byte) error { + if len(b) == 0 { + return nil + } + if b[0] == 'l' { + var l []string + err := bencode.Unmarshal(b, &l) + *me = l + return err + } + var s string + err := bencode.Unmarshal(b, &s) + *me = []string{s} + return err +}