82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
|
package handler
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/anacrolix/torrent"
|
||
|
"github.com/sirupsen/logrus"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
type Engine struct {
|
||
|
client *torrent.Client
|
||
|
files map[string]*MovieTorrent
|
||
|
storagePath string
|
||
|
}
|
||
|
|
||
|
func NewEngine(storagePath string) (*Engine, error) {
|
||
|
logrus.Info("Creating Streaming engine")
|
||
|
if storagePath == "" {
|
||
|
storagePath = os.TempDir()
|
||
|
logrus.Debug("Storage path undefined. Using default temp directory")
|
||
|
}
|
||
|
logrus.Debugf("Storage Path: %s", storagePath)
|
||
|
conf := torrent.NewDefaultClientConfig()
|
||
|
conf.DataDir = storagePath
|
||
|
c, err := torrent.NewClient(conf)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &Engine{c, map[string]*MovieTorrent{}, storagePath}, nil
|
||
|
}
|
||
|
|
||
|
func (e *Engine) Close() {
|
||
|
e.client.Close()
|
||
|
}
|
||
|
|
||
|
func (e *Engine) Get(fileName string) (*MovieTorrent, error) {
|
||
|
logrus.Infof("Requesting torrent: %s", fileName)
|
||
|
if mt, ok := e.files[fileName]; ok {
|
||
|
return mt, nil
|
||
|
}
|
||
|
return nil, fmt.Errorf("not found: %s", fileName)
|
||
|
}
|
||
|
|
||
|
func (e *Engine) Prepare(magnet string) error {
|
||
|
logrus.Debugf("preparing magnet: %s", magnet)
|
||
|
t, err := e.client.AddMagnet(magnet)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
<-t.GotInfo()
|
||
|
return nil
|
||
|
}
|
||
|
func (e *Engine) Download(magnet string) (*MovieTorrent, error) {
|
||
|
logrus.Debugf("downloading magnet: %s", magnet)
|
||
|
t, err := e.client.AddMagnet(magnet)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
<-t.GotInfo()
|
||
|
file := getLargestFile(t)
|
||
|
file.Download()
|
||
|
mt := newMovieTorrent(file, t)
|
||
|
mt.engine = e
|
||
|
e.files[mt.FileName] = mt
|
||
|
logrus.Infof("Downloading: %s", mt.FileName)
|
||
|
return mt, nil
|
||
|
}
|
||
|
|
||
|
func getLargestFile(t *torrent.Torrent) *torrent.File {
|
||
|
var target *torrent.File
|
||
|
var maxSize int64
|
||
|
|
||
|
for _, file := range t.Files() {
|
||
|
if maxSize < file.Length() {
|
||
|
maxSize = file.Length()
|
||
|
target = file
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return target
|
||
|
}
|