Files
TorrServerJellyfin/server/torr/utils/torrent.go
2021-04-20 11:01:32 +03:00

98 lines
2.0 KiB
Go

package utils
import (
"encoding/base32"
"io/ioutil"
"math/rand"
"net/http"
"path/filepath"
"strings"
"server/settings"
"golang.org/x/time/rate"
)
var defTrackers = []string{
"http://retracker.local",
"http://bt4.t-ru.org/ann?magnet",
"http://retracker.mgts.by:80/announce",
"http://tracker.city9x.com:2710/announce",
"http://tracker.electro-torrent.pl:80/announce",
"http://tracker.internetwarriors.net:1337/announce",
"http://tracker2.itzmx.com:6961/announce",
"udp://opentor.org:2710",
"udp://public.popcorn-tracker.org:6969/announce",
"udp://tracker.opentrackr.org:1337/announce",
"http://bt.svao-ix.ru/announce",
"udp://explodie.org:6969/announce",
}
var loadedTrackers []string
func GetTrackerFromFile() []string {
name := filepath.Join(settings.Path, "trackers.txt")
buf, err := ioutil.ReadFile(name)
if err == nil {
list := strings.Split(string(buf), "\n")
var ret []string
for _, l := range list {
if strings.HasPrefix(l, "udp") || strings.HasPrefix(l, "http") {
ret = append(ret, l)
}
}
return ret
}
return nil
}
func GetDefTrackers() []string {
loadNewTracker()
if len(loadedTrackers) == 0 {
return defTrackers
}
return loadedTrackers
}
func loadNewTracker() {
if len(loadedTrackers) > 0 {
return
}
resp, err := http.Get("https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best_ip.txt")
if err == nil {
buf, err := ioutil.ReadAll(resp.Body)
if err == nil {
arr := strings.Split(string(buf), "\n")
var ret []string
for _, s := range arr {
s = strings.TrimSpace(s)
if len(s) > 0 {
ret = append(ret, s)
}
}
loadedTrackers = append(ret, defTrackers...)
}
}
}
func PeerIDRandom(peer string) string {
randomBytes := make([]byte, 32)
_, err := rand.Read(randomBytes)
if err != nil {
panic(err)
}
return peer + base32.StdEncoding.EncodeToString(randomBytes)[:20-len(peer)]
}
func Limit(i int) *rate.Limiter {
l := rate.NewLimiter(rate.Inf, 0)
if i > 0 {
b := i
if b < 16*1024 {
b = 16 * 1024
}
l = rate.NewLimiter(rate.Limit(i), b)
}
return l
}