adding more fields for torrent files
This commit is contained in:
parent
8baf937ecf
commit
a418f5cb4b
2 changed files with 62 additions and 13 deletions
|
@ -1,27 +1,36 @@
|
||||||
package torrent
|
package torrent
|
||||||
|
|
||||||
import (
|
import (
|
||||||
//"github.com/vbatts/go-bt/bencode"
|
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
// https://wiki.theory.org/BitTorrentSpecification#Metainfo_File_Structure
|
||||||
map[string]interface {}{"announce":"http://torrent.fedoraproject.org:6969/announce", "creation date":1387244350, "info":map[string]interface {}{"files":[]interface {}{map[string]interface {}{"length":1125, "path":[]interface {}{"Fedora-20-x86_64-CHECKSUM"}}, map[string]interface {}{"length":4603248640, "path":[]interface {}{"Fedora-20-x86_64-DVD.iso"}}}, "name":"Fedora-20-x86_64-DVD", "piece length":262144, "pieces":"m\x
|
|
||||||
*/
|
|
||||||
type File struct {
|
type File struct {
|
||||||
// URL of a main tracker
|
// URL of a main tracker
|
||||||
Announce string `bencode:"announce"`
|
Announce string `bencode:"announce"`
|
||||||
|
|
||||||
|
// List of additional trackers
|
||||||
|
AnnounceList []string `bencode:"announce-list"`
|
||||||
|
|
||||||
// Epoch of the creation of this torrent
|
// Epoch of the creation of this torrent
|
||||||
CreationDate int64 `bencode:"creation date"`
|
CreationDate int64 `bencode:"creation date,omitempty"`
|
||||||
|
|
||||||
// Dictionary about this torrent, including files to be tracked
|
// Dictionary about this torrent, including files to be tracked
|
||||||
Info TorrentFileInfo `bencode:"info"`
|
Info InfoSection `bencode:"info,omitempty"`
|
||||||
|
|
||||||
|
// free-form textual comments of the author
|
||||||
|
Comment string `bencode:"comment,omitempty"`
|
||||||
|
|
||||||
|
// name and version of the program used to create the .torrent
|
||||||
|
CreatedBy string `bencode:"created by,omitempty"`
|
||||||
|
|
||||||
|
// string encoding used to generate the `pieces` and `info` fields
|
||||||
|
Encoding string `bencode:"encoding"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TorrentFileInfo struct {
|
type InfoSection struct {
|
||||||
// suggested file/directory name where the file(s) are to be saved
|
// suggested file/directory name where the file(s) are to be saved
|
||||||
Name string `bencode:"name"`
|
Name string `bencode:"name,omitempty"`
|
||||||
|
|
||||||
// hash list of joined SHA1 sums (160-bit length)
|
// hash list of joined SHA1 sums (160-bit length)
|
||||||
Pieces string `bencode:"pieces"`
|
Pieces string `bencode:"pieces"`
|
||||||
|
@ -30,16 +39,19 @@ type TorrentFileInfo struct {
|
||||||
PieceLength int64 `bencode:"piece length"`
|
PieceLength int64 `bencode:"piece length"`
|
||||||
|
|
||||||
// size of the file in bytes (only if this torrent is for a single file)
|
// size of the file in bytes (only if this torrent is for a single file)
|
||||||
Length int64 `bencode:"length"`
|
Length int64 `bencode:"length,omitempty"`
|
||||||
|
|
||||||
|
// 32-char hexadecimal string corresponding to the MD5 sum of the file (only if this torrent is for a single file)
|
||||||
|
MD5 string `bencode:"md5sum,omitempty"`
|
||||||
|
|
||||||
// list of information about the files
|
// list of information about the files
|
||||||
Files []FileInfo `bencode:"files"`
|
Files []FileInfo `bencode:"files"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tfi TorrentFileInfo) PiecesList() []string {
|
func (is InfoSection) PiecesList() []string {
|
||||||
pieces := []string{}
|
pieces := []string{}
|
||||||
for i := 0; i < (len(tfi.Pieces) / sha1.Size); i++ {
|
for i := 0; i < (len(is.Pieces) / sha1.Size); i++ {
|
||||||
pieces = append(pieces, tfi.Pieces[i*sha1.Size:(i+1)*sha1.Size])
|
pieces = append(pieces, is.Pieces[i*sha1.Size:(i+1)*sha1.Size])
|
||||||
}
|
}
|
||||||
return pieces
|
return pieces
|
||||||
}
|
}
|
||||||
|
@ -50,6 +62,9 @@ type FileInfo struct {
|
||||||
|
|
||||||
// list of strings corresponding to subdirectory names, the last of which is the actual file name
|
// list of strings corresponding to subdirectory names, the last of which is the actual file name
|
||||||
Path []string `bencode:"path"`
|
Path []string `bencode:"path"`
|
||||||
|
|
||||||
|
// 32-char hexadecimal string corresponding to the MD5 sum of the file (only if this torrent is for a single file)
|
||||||
|
MD5 string `bencode:"md5sum,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type torrentError struct {
|
type torrentError struct {
|
||||||
|
@ -104,7 +119,7 @@ func DecocdeTorrentData(data interface{}) (*File, error) {
|
||||||
return &File{
|
return &File{
|
||||||
Announce: announce,
|
Announce: announce,
|
||||||
CreationDate: creationDate,
|
CreationDate: creationDate,
|
||||||
Info: TorrentFileInfo{
|
Info: InfoSection{
|
||||||
Name: infoName,
|
Name: infoName,
|
||||||
Length: infoLength,
|
Length: infoLength,
|
||||||
Pieces: pieces,
|
Pieces: pieces,
|
||||||
|
|
34
torrent/file_test.go
Normal file
34
torrent/file_test.go
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package torrent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/vbatts/go-bt/bencode"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestFileMarshal(t *testing.T) {
|
||||||
|
f1 := File{
|
||||||
|
Announce: "http://foo.bar.com:9090/announce",
|
||||||
|
AnnounceList: []string{"http://foo.bar.com:9091/announce",
|
||||||
|
"http://foo.bar.com:9092/announce",
|
||||||
|
"http://foo.bar.com:9093/announce",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, err := bencode.Marshal(f1)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f2 := File{}
|
||||||
|
err = bencode.Unmarshal(buf, &f2)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if f1.Announce != f2.Announce {
|
||||||
|
t.Errorf("expected %q, got %q", f1.Announce, f2.Announce)
|
||||||
|
}
|
||||||
|
if len(f1.AnnounceList) != len(f2.AnnounceList) {
|
||||||
|
t.Errorf("expected %q, got %q", len(f1.AnnounceList), len(f2.AnnounceList))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue