83 lines
1.6 KiB
Go
83 lines
1.6 KiB
Go
|
package torrent
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/anacrolix/torrent"
|
||
|
"github.com/distribyted/distribyted/config"
|
||
|
"github.com/distribyted/distribyted/fs"
|
||
|
"github.com/distribyted/distribyted/stats"
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
)
|
||
|
|
||
|
type Handler struct {
|
||
|
c *torrent.Client
|
||
|
s *stats.Torrent
|
||
|
|
||
|
fssMu sync.Mutex
|
||
|
fss map[string][]fs.Filesystem
|
||
|
}
|
||
|
|
||
|
func NewHandler(c *torrent.Client, s *stats.Torrent) *Handler {
|
||
|
return &Handler{
|
||
|
c: c,
|
||
|
s: s,
|
||
|
fss: make(map[string][]fs.Filesystem),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *Handler) Load(path string, ts []*config.Torrent) error {
|
||
|
var torrents []fs.Filesystem
|
||
|
for _, mpcTorrent := range ts {
|
||
|
var t *torrent.Torrent
|
||
|
var err error
|
||
|
|
||
|
switch {
|
||
|
case mpcTorrent.MagnetURI != "":
|
||
|
t, err = s.c.AddMagnet(mpcTorrent.MagnetURI)
|
||
|
break
|
||
|
case mpcTorrent.TorrentPath != "":
|
||
|
t, err = s.c.AddTorrentFromFile(mpcTorrent.TorrentPath)
|
||
|
break
|
||
|
default:
|
||
|
err = fmt.Errorf("no magnet URI or torrent path provided")
|
||
|
}
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// only get info if name is not available
|
||
|
if t.Name() == "" {
|
||
|
log.WithField("hash", t.InfoHash()).Info("getting torrent info")
|
||
|
<-t.GotInfo()
|
||
|
}
|
||
|
|
||
|
s.s.Add(path, t)
|
||
|
torrents = append(torrents, fs.NewTorrent(t))
|
||
|
|
||
|
log.WithField("name", t.Name()).WithField("path", path).Info("torrent added to mountpoint")
|
||
|
}
|
||
|
|
||
|
folder := path
|
||
|
|
||
|
s.fssMu.Lock()
|
||
|
defer s.fssMu.Unlock()
|
||
|
s.fss[folder] = torrents
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *Handler) Fileststems() map[string][]fs.Filesystem {
|
||
|
return s.fss
|
||
|
}
|
||
|
|
||
|
func (s *Handler) RemoveAll() error {
|
||
|
s.fssMu.Lock()
|
||
|
defer s.fssMu.Unlock()
|
||
|
|
||
|
s.fss = make(map[string][]fs.Filesystem)
|
||
|
s.s.RemoveAll()
|
||
|
return nil
|
||
|
}
|