aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/btshow/main.go9
-rw-r--r--meta/torrent.go41
2 files changed, 42 insertions, 8 deletions
diff --git a/cmd/btshow/main.go b/cmd/btshow/main.go
index f335729..a737733 100644
--- a/cmd/btshow/main.go
+++ b/cmd/btshow/main.go
@@ -2,12 +2,10 @@ package main
import (
"fmt"
- "io/ioutil"
"log"
"net/url"
"os"
- "dim13.org/btget/bencode"
"dim13.org/btget/meta"
)
@@ -15,12 +13,7 @@ func main() {
if len(os.Args) != 2 {
log.Fatal("usage: ", os.Args[0], " <torrent>")
}
- tfile, err := ioutil.ReadFile(os.Args[1])
- if err != nil {
- log.Fatal(err)
- }
- var tor meta.Torrent
- err = bencode.Unmarshal(tfile, &tor)
+ tor, err := meta.New(os.Args[1])
if err != nil {
log.Fatal(err)
}
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
}