Files
TorrServerJellyfin/server/torr/btserver.go
2021-08-27 18:40:53 +03:00

137 lines
3.3 KiB
Go

package torr
import (
"log"
"net"
"strconv"
"sync"
"github.com/anacrolix/torrent"
"github.com/anacrolix/torrent/metainfo"
"server/settings"
"server/torr/storage/torrstor"
"server/torr/utils"
)
type BTServer struct {
config *torrent.ClientConfig
client *torrent.Client
storage *torrstor.Storage
torrents map[metainfo.Hash]*Torrent
mu sync.Mutex
}
func NewBTS() *BTServer {
bts := new(BTServer)
bts.torrents = make(map[metainfo.Hash]*Torrent)
return bts
}
func (bt *BTServer) Connect() error {
bt.mu.Lock()
defer bt.mu.Unlock()
var err error
bt.configure()
bt.client, err = torrent.NewClient(bt.config)
bt.torrents = make(map[metainfo.Hash]*Torrent)
InitApiHelper(bt)
return err
}
func (bt *BTServer) Disconnect() {
bt.mu.Lock()
defer bt.mu.Unlock()
if bt.client != nil {
bt.client.Close()
bt.client = nil
utils.FreeOSMemGC()
}
}
func (bt *BTServer) configure() {
blocklist, _ := utils.ReadBlockedIP()
bt.config = torrent.NewDefaultClientConfig()
bt.storage = torrstor.NewStorage(settings.BTsets.CacheSize)
bt.config.DefaultStorage = bt.storage
userAgent := "qBittorrent/4.3.2"
peerID := "-qB4320-"
upnpID := "TorrServer"
cliVers := userAgent //"uTorrent/2210(25302)"
bt.config.Debug = settings.BTsets.EnableDebug
bt.config.DisableIPv6 = settings.BTsets.EnableIPv6 == false
bt.config.DisableTCP = settings.BTsets.DisableTCP
bt.config.DisableUTP = settings.BTsets.DisableUTP
bt.config.NoDefaultPortForwarding = settings.BTsets.DisableUPNP
bt.config.NoDHT = settings.BTsets.DisableDHT
bt.config.DisablePEX = settings.BTsets.DisablePEX
bt.config.NoUpload = settings.BTsets.DisableUpload
bt.config.IPBlocklist = blocklist
bt.config.Bep20 = peerID
bt.config.PeerID = utils.PeerIDRandom(peerID)
bt.config.UpnpID = upnpID
bt.config.HTTPUserAgent = userAgent
bt.config.ExtendedHandshakeClientVersion = cliVers
bt.config.EstablishedConnsPerTorrent = settings.BTsets.ConnectionsLimit
bt.config.TotalHalfOpenConns = 500
// Encryption/Obfuscation
bt.config.HeaderObfuscationPolicy = torrent.HeaderObfuscationPolicy{
RequirePreferred: settings.BTsets.ForceEncrypt,
Preferred: true,
}
if settings.BTsets.DownloadRateLimit > 0 {
bt.config.DownloadRateLimiter = utils.Limit(settings.BTsets.DownloadRateLimit * 1024)
}
if settings.BTsets.UploadRateLimit > 0 {
bt.config.UploadRateLimiter = utils.Limit(settings.BTsets.UploadRateLimit * 1024)
}
if settings.BTsets.PeersListenPort > 0 {
log.Println("Set listen port", settings.BTsets.PeersListenPort)
bt.config.ListenPort = settings.BTsets.PeersListenPort
} else {
upnpport := 32000
for {
log.Println("Check upnp port", upnpport)
l, err := net.Listen("tcp", ":"+strconv.Itoa(upnpport))
if l != nil {
l.Close()
}
if err == nil {
break
}
upnpport++
}
log.Println("Set upnp port", upnpport)
bt.config.ListenPort = upnpport
}
log.Println("Client config:", settings.BTsets)
}
func (bt *BTServer) GetTorrent(hash torrent.InfoHash) *Torrent {
if torr, ok := bt.torrents[hash]; ok {
return torr
}
return nil
}
func (bt *BTServer) ListTorrents() map[metainfo.Hash]*Torrent {
list := make(map[metainfo.Hash]*Torrent)
for k, v := range bt.torrents {
list[k] = v
}
return list
}
func (bt *BTServer) RemoveTorrent(hash torrent.InfoHash) {
if torr, ok := bt.torrents[hash]; ok {
torr.Close()
}
}