YTSFlix_Go/handler/engine.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
}