]> Sergey Matveev's repositories - btrtrc.git/blobdiff - spec.go
Move TorrentSpec stuff into its own file
[btrtrc.git] / spec.go
diff --git a/spec.go b/spec.go
new file mode 100644 (file)
index 0000000..e6b58d8
--- /dev/null
+++ b/spec.go
@@ -0,0 +1,48 @@
+package torrent
+
+import (
+       "github.com/anacrolix/torrent/metainfo"
+       "github.com/anacrolix/torrent/storage"
+)
+
+// Specifies a new torrent for adding to a client. There are helpers for
+// magnet URIs and torrent metainfo files.
+type TorrentSpec struct {
+       // The tiered tracker URIs.
+       Trackers  [][]string
+       InfoHash  metainfo.Hash
+       InfoBytes []byte
+       // The name to use if the Name field from the Info isn't available.
+       DisplayName string
+       // The chunk size to use for outbound requests. Defaults to 16KiB if not
+       // set.
+       ChunkSize int
+       Storage   storage.ClientImpl
+}
+
+func TorrentSpecFromMagnetURI(uri string) (spec *TorrentSpec, err error) {
+       m, err := metainfo.ParseMagnetURI(uri)
+       if err != nil {
+               return
+       }
+       spec = &TorrentSpec{
+               Trackers:    [][]string{m.Trackers},
+               DisplayName: m.DisplayName,
+               InfoHash:    m.InfoHash,
+       }
+       return
+}
+
+func TorrentSpecFromMetaInfo(mi *metainfo.MetaInfo) (spec *TorrentSpec) {
+       info := mi.UnmarshalInfo()
+       spec = &TorrentSpec{
+               Trackers:    mi.AnnounceList,
+               InfoBytes:   mi.InfoBytes,
+               DisplayName: info.Name,
+               InfoHash:    mi.HashInfoBytes(),
+       }
+       if spec.Trackers == nil && mi.Announce != "" {
+               spec.Trackers = [][]string{{mi.Announce}}
+       }
+       return
+}