]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Support watching for ".magnet" files in torrent directory
authorMatt Joiner <anacrolix@gmail.com>
Thu, 24 Jul 2014 03:44:23 +0000 (13:44 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 24 Jul 2014 03:44:23 +0000 (13:44 +1000)
util/dirwatch/dirwatch.go

index 7689edd0632c192a8c9c7b71f8ca33141cfafd10..05458217ee0d9b656a06d3fccdb0eeed4cb33e51 100644 (file)
@@ -2,6 +2,7 @@ package dirwatch
 
 import (
        "bitbucket.org/anacrolix/go.torrent"
+       "bufio"
        "github.com/anacrolix/libtorgo/metainfo"
        "github.com/go-fsnotify/fsnotify"
        "log"
@@ -28,6 +29,7 @@ type Instance struct {
        dirName               string
        Events                chan Event
        torrentFileInfoHashes map[string]torrent.InfoHash
+       magnetFileInfoHashes  map[string]map[torrent.InfoHash]struct{}
 }
 
 func (me *Instance) handleEvents() {
@@ -55,29 +57,80 @@ func torrentFileInfoHash(fileName string) (ih torrent.InfoHash, ok bool) {
        return
 }
 
-func (me *Instance) processFile(name string) {
-       name = filepath.Clean(name)
-       log.Print(name)
-       if filepath.Ext(name) != ".torrent" {
+func magnetFileURIs(name string) (uris []string, err error) {
+       f, err := os.Open(name)
+       if err != nil {
                return
        }
-       ih, ok := me.torrentFileInfoHashes[name]
-       if ok {
+       defer f.Close()
+       scanner := bufio.NewScanner(f)
+       for scanner.Scan() {
+               uris = append(uris, scanner.Text())
+       }
+       err = scanner.Err()
+       return
+}
+
+func (me *Instance) removeAllFileMagnets(name string) {
+       for ih := range me.magnetFileInfoHashes[name] {
                me.Events <- Event{
-                       TorrentFilePath: name,
-                       Change:          Removed,
-                       InfoHash:        ih,
+                       InfoHash: ih,
+                       Change:   Removed,
                }
        }
-       delete(me.torrentFileInfoHashes, name)
-       ih, ok = torrentFileInfoHash(name)
-       if ok {
-               me.torrentFileInfoHashes[name] = ih
-               me.Events <- Event{
-                       TorrentFilePath: name,
-                       Change:          Added,
-                       InfoHash:        ih,
+}
+
+func (me *Instance) removeTorrent(ih torrent.InfoHash) {
+       me.Events <- Event{
+               InfoHash: ih,
+               Change:   Removed,
+       }
+}
+
+func (me *Instance) processFile(name string) {
+       name = filepath.Clean(name)
+       log.Print(name)
+       switch filepath.Ext(name) {
+       case ".torrent":
+               ih, ok := me.torrentFileInfoHashes[name]
+               if ok {
+                       me.Events <- Event{
+                               TorrentFilePath: name,
+                               Change:          Removed,
+                               InfoHash:        ih,
+                       }
+               }
+               delete(me.torrentFileInfoHashes, name)
+               ih, ok = torrentFileInfoHash(name)
+               if ok {
+                       me.torrentFileInfoHashes[name] = ih
+                       me.Events <- Event{
+                               TorrentFilePath: name,
+                               Change:          Added,
+                               InfoHash:        ih,
+                       }
+               }
+       case ".magnet":
+               me.removeAllFileMagnets(name)
+               uris, err := magnetFileURIs(name)
+               if err != nil {
+                       log.Print(err)
+                       break
                }
+               for _, uri := range uris {
+                       m, err := torrent.ParseMagnetURI(uri)
+                       if err != nil {
+                               log.Printf("bad magnet uri in magnet file: %s", err)
+                               continue
+                       }
+                       me.removeTorrent(m.InfoHash)
+                       me.Events <- Event{
+                               Magnet: uri,
+                               Change: Added,
+                       }
+               }
+       default:
+               return
        }
 }