Albirew/nyaa-pantsu
Albirew
/
nyaa-pantsu
Archivé
1
0
Bifurcation 0

Update stats.go

Cette révision appartient à :
kilo 2017-11-07 16:45:23 +01:00 révisé par GitHub
Parent ca271e2ac6
révision 22e1c7e9a7
Signature inconnue de Forgejo
ID de la clé GPG: 4AEE18F83AFDEB23
1 fichiers modifiés avec 82 ajouts et 3 suppressions

Voir le fichier

@ -1,6 +1,7 @@
package torrentController
import (
"encoding/hex"
"strconv"
"strings"
"net/url"
@ -9,10 +10,33 @@ import (
"github.com/NyaaPantsu/nyaa/models/torrents"
"github.com/NyaaPantsu/nyaa/models"
"github.com/NyaaPantsu/nyaa/config"
"github.com/NyaaPantsu/nyaa/utils/log"
"github.com/NyaaPantsu/nyaa/utils/format"
"github.com/Stephen304/goscrape"
"github.com/gin-gonic/gin"
"github.com/anacrolix/dht"
"github.com/anacrolix/torrent"
)
var client *torrent.Client
func initClient() error {
clientConfig := torrent.Config{
DHTConfig: dht.ServerConfig{
StartingNodes: dht.GlobalBootstrapAddrs,
},
ListenAddr: ":5977",
}
cl, err := torrent.NewClient(&clientConfig)
if err != nil {
log.Errorf("error creating client: %s", err)
return err
}
client = cl
return nil
}
// ViewHeadHandler : Controller for getting torrent stats
func GetStatsHandler(c *gin.Context) {
id, err := strconv.ParseInt(c.Param("id"), 10, 32)
@ -42,13 +66,13 @@ func GetStatsHandler(c *gin.Context) {
}
var Trackers []string
if len(Trackers) > 3 {
if len(torrent.Trackers) > 3 {
for _, line := range strings.Split(torrent.Trackers[3:], "&tr=") {
tracker, error := url.QueryUnescape(line)
if error == nil && strings.Contains(tracker, "udp://") {
if error == nil && strings.HasPrefix(tracker, "udp") {
Trackers = append(Trackers, tracker)
}
//Cannot scrape from http trackers so don't put them in the array
//Cannot scrape from http trackers only keep UDP ones
}
}
@ -57,7 +81,15 @@ func GetStatsHandler(c *gin.Context) {
Trackers = append(Trackers, line)
}
}
err = ScrapeFiles(format.InfoHashToMagnet(strings.TrimSpace(torrent.Hash), torrent.Name, Trackers...), torrent)
if err != nil {
return
}
return
stats := goscrape.Single(Trackers, []string{
torrent.Hash,
})[0]
@ -96,6 +128,53 @@ func GetStatsHandler(c *gin.Context) {
return
}
type TStruct struct {
Peers goscrape.Result
Trackers []string
//Files []metainfo.FileInfo
Files []torrent.File
Magnet string
}
func ScrapeFiles(magnet string, torrent models.Torrent) error {
if client == nil {
err := initClient()
if err != nil {
return err
}
}
t, _ := client.AddMagnet(magnet)
<-t.GotInfo()
infoHash := t.InfoHash()
dst := make([]byte, hex.EncodedLen(len(t.InfoHash())))
hex.Encode(dst, infoHash[:])
var UDP []string
for _, tracker := range t.Metainfo().AnnounceList[0] {
if strings.HasPrefix(tracker, "udp") {
UDP = append(UDP, tracker)
}
}
if len(UDP) != 0 {
udpscrape := goscrape.NewBulk(UDP)
results := udpscrape.ScrapeBulk([]string{torrent.Hash})[0]
if results.Btih != "0" {
torrent.Scrape = &models.Scrape{torrent.ID, uint32(results.Seeders), uint32(results.Leechers),uint32(results.Completed), time.Now()}
}
}
torrent.FileList = []models.File{}
for i, file := range t.Files() {
log.Errorf("----- File %d / Path %s / Length %d", i, file.DisplayPath(), file.Length())
torrent.FileList = append(torrent.FileList, models.File{uint(i), torrent.ID, file.DisplayPath(), file.Length()})
}
torrent.Update(true)
t.Drop()
return nil
}
func contains(s []string, e string) bool {
for _, a := range s {
if a == e {