From 6edbf5b19304f483cf5869d9e8d9ce35ea650a5f Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 1 Jul 2016 18:13:50 +0200 Subject: Read torrent --- meta/torrent.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'meta') diff --git a/meta/torrent.go b/meta/torrent.go index 88c48d6..65e74bd 100644 --- a/meta/torrent.go +++ b/meta/torrent.go @@ -5,9 +5,12 @@ import ( "crypto/sha1" "errors" "fmt" + "io/ioutil" "os" "path" "time" + + "dim13.org/btget/bencode" ) var ErrNotImplemented = errors.New("not implemented") @@ -28,6 +31,19 @@ type Info struct { Private bool `bencode:"private"` } +func New(fname string) (Torrent, error) { + var tor Torrent + body, err := ioutil.ReadFile(fname) + if err != nil { + return Torrent{}, err + } + err = bencode.Unmarshal(body, &tor) + if err != nil { + return Torrent{}, err + } + return tor, nil +} + func (i Info) NPieces() int { return len(i.Pieces) / 20 } @@ -78,10 +94,33 @@ func (i Info) FindFile(chunk, offset int) int { return 0 } +func (i Info) Offset(piece int) int { + return i.PieceLength * piece +} + +func (i Info) FileOffset(piece int) (n, off int) { + var l File + off = i.PieceLength * piece + for n, l = range i.Files { + if l.Length < off { + off -= l.Length + } + } + return n, off +} + +/* + * 0 1 2 3 4 5 6 7 #piece + * |----|----|----|----|----|----|----|--| pieces + * |-|----|--|----|----------|-|----|----| files + * 0 1 2 3 4 5 6 7 #file + */ + func (i Info) WriteAt(b []byte, off int64) (n int, err error) { return 0, ErrNotImplemented } +// ReadAt ... func (i Info) ReadAt(b []byte, off int64) (n int, err error) { if i.isSingleFile() { fd, err := os.OpenFile(i.Name, os.O_RDWR|os.O_CREATE, 0644) @@ -90,6 +129,8 @@ func (i Info) ReadAt(b []byte, off int64) (n int, err error) { } defer fd.Close() return fd.ReadAt(b, int64(i.PieceLength)*off) + } else { + } return 0, ErrNotImplemented } -- cgit v1.2.3