revert to _9 and add save info bytes

This commit is contained in:
YouROK
2020-04-18 15:19:39 +03:00
parent 0bc5ea3084
commit 45b2bfdd05
12 changed files with 93 additions and 72 deletions

View File

@@ -7,8 +7,6 @@ import (
"server/utils"
dht2 "github.com/anacrolix/dht"
"github.com/anacrolix/torrent/metainfo"
"github.com/labstack/echo"
"github.com/labstack/gommon/bytes"
@@ -41,12 +39,10 @@ func statePage(c echo.Context) error {
for _, dht := range state.DHTs {
msg += fmt.Sprintf("%s DHT server at %s:<br>\n", dht.Addr().Network(), dht.Addr().String())
dhtStats := dht.Stats()
if ds, ok := dhtStats.(dht2.ServerStats); ok {
msg += fmt.Sprintf("\t&emsp;# Nodes: %d (%d good, %d banned)<br>\n", ds.Nodes, ds.GoodNodes, ds.BadNodes)
msg += fmt.Sprintf("\t&emsp;Server ID: %x<br>\n", dht.ID())
msg += fmt.Sprintf("\t&emsp;Announces: %d<br>\n", ds.SuccessfulOutboundAnnouncePeerQueries)
msg += fmt.Sprintf("\t&emsp;Outstanding transactions: %d<br>\n", ds.OutstandingTransactions)
}
msg += fmt.Sprintf("\t&emsp;# Nodes: %d (%d good, %d banned)<br>\n", dhtStats.Nodes, dhtStats.GoodNodes, dhtStats.BadNodes)
msg += fmt.Sprintf("\t&emsp;Server ID: %x<br>\n", dht.ID())
msg += fmt.Sprintf("\t&emsp;Announces: %d<br>\n", dhtStats.SuccessfulOutboundAnnouncePeerQueries)
msg += fmt.Sprintf("\t&emsp;Outstanding transactions: %d<br>\n", dhtStats.OutstandingTransactions)
}
sort.Slice(state.Torrents, func(i, j int) bool {

View File

@@ -84,7 +84,7 @@ func torrentAdd(c echo.Context) error {
return echo.NewHTTPError(http.StatusBadRequest, "Link must be non-empty")
}
magnet, err := helpers.GetMagnet(jreq.Link)
magnet, infoBytes, err := helpers.GetMagnet(jreq.Link)
if err != nil {
fmt.Println("Error get magnet:", jreq.Hash, err)
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
@@ -94,7 +94,17 @@ func torrentAdd(c echo.Context) error {
magnet.DisplayName = jreq.Title
}
err = helpers.Add(bts, *magnet, !jreq.DontSave)
tor := bts.GetTorrent(magnet.InfoHash)
if tor != nil {
return c.String(http.StatusOK, magnet.InfoHash.HexString())
}
torDb, err := settings.LoadTorrentDB(magnet.InfoHash.HexString())
if err == nil && torDb != nil {
infoBytes = torDb.InfoBytes
}
err = helpers.Add(bts, *magnet, infoBytes, !jreq.DontSave)
if err != nil {
fmt.Println("Error add torrent:", jreq.Hash, err)
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
@@ -117,7 +127,7 @@ func torrentUpload(c echo.Context) error {
defer form.RemoveAll()
_, dontSave := form.Value["DontSave"]
var magnets []metainfo.Magnet
magnets := map[*metainfo.Magnet][]byte{}
for _, file := range form.File {
torrFile, err := file[0].Open()
@@ -138,12 +148,12 @@ func torrentUpload(c echo.Context) error {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
magnet := mi.Magnet(info.Name, mi.HashInfoBytes())
magnets = append(magnets, magnet)
magnets[&magnet] = mi.InfoBytes
}
ret := make([]string, 0)
for _, magnet := range magnets {
er := helpers.Add(bts, magnet, !dontSave)
for magnet, infobytes := range magnets {
er := helpers.Add(bts, *magnet, infobytes, !dontSave)
if er != nil {
err = er
fmt.Println("Error add torrent:", magnet.String(), er)
@@ -334,7 +344,7 @@ func preload(hashHex, fileLink string, size int64) *echo.HTTPError {
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Error parser magnet in db: "+hashHex)
}
tor, err = bts.AddTorrent(m, nil)
tor, err = bts.AddTorrent(m, torrDb.InfoBytes, nil)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
@@ -476,7 +486,7 @@ func torrentPlay(c echo.Context) error {
}
}
magnet, err := helpers.GetMagnet(link)
magnet, infoBytes, err := helpers.GetMagnet(link)
if err != nil {
fmt.Println("Error get magnet:", link, err)
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
@@ -484,7 +494,7 @@ func torrentPlay(c echo.Context) error {
tor := bts.GetTorrent(magnet.InfoHash)
if tor == nil {
tor, err = bts.AddTorrent(*magnet, nil)
tor, err = bts.AddTorrent(*magnet, infoBytes, nil)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
@@ -502,6 +512,7 @@ func torrentPlay(c echo.Context) error {
if t, err := settings.LoadTorrentDB(magnet.InfoHash.HexString()); t == nil && err == nil {
torrDb := toTorrentDB(tor)
if torrDb != nil {
torrDb.InfoBytes = infoBytes
settings.SaveTorrentDB(torrDb)
}
}
@@ -565,7 +576,7 @@ func torrentView(c echo.Context) error {
return echo.NewHTTPError(http.StatusBadRequest, "Error parser magnet in db: "+hashHex)
}
tor, err = bts.AddTorrent(m, nil)
tor, err = bts.AddTorrent(m, torrDb.InfoBytes, nil)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}

View File

@@ -9,33 +9,42 @@ import (
"strings"
"time"
"server/settings"
"github.com/anacrolix/torrent/metainfo"
)
func GetMagnet(link string) (*metainfo.Magnet, error) {
func GetMagnet(link string) (*metainfo.Magnet, []byte, error) {
url, err := url.Parse(link)
if err != nil {
return nil, err
return nil, nil, err
}
var mag *metainfo.Magnet
var infoBytes []byte
switch strings.ToLower(url.Scheme) {
case "magnet":
mag, err = getMag(url.String())
if err == nil {
torDb, err := settings.LoadTorrentDB(mag.InfoHash.HexString())
if err == nil && torDb != nil {
infoBytes = torDb.InfoBytes
}
}
case "http", "https":
mag, err = getMagFromHttp(url.String())
mag, infoBytes, err = getMagFromHttp(url.String())
case "":
mag, err = getMag("magnet:?xt=urn:btih:" + url.Path)
case "file":
mag, err = getMagFromFile(url.Path)
mag, infoBytes, err = getMagFromFile(url.Path)
default:
err = fmt.Errorf("unknown scheme:", url, url.Scheme)
}
if err != nil {
return nil, err
return nil, nil, err
}
return mag, nil
return mag, infoBytes, nil
}
func getMag(link string) (*metainfo.Magnet, error) {
@@ -43,10 +52,10 @@ func getMag(link string) (*metainfo.Magnet, error) {
return &mag, err
}
func getMagFromHttp(url string) (*metainfo.Magnet, error) {
func getMagFromHttp(url string) (*metainfo.Magnet, []byte, error) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
return nil, nil, err
}
client := new(http.Client)
@@ -55,38 +64,38 @@ func getMagFromHttp(url string) (*metainfo.Magnet, error) {
resp, err := client.Do(req)
if err != nil {
return nil, err
return nil, nil, err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil, errors.New(resp.Status)
return nil, nil, errors.New(resp.Status)
}
minfo, err := metainfo.Load(resp.Body)
if err != nil {
return nil, err
return nil, nil, err
}
info, err := minfo.UnmarshalInfo()
if err != nil {
return nil, err
return nil, nil, err
}
mag := minfo.Magnet(info.Name, minfo.HashInfoBytes())
return &mag, nil
return &mag, minfo.InfoBytes, nil
}
func getMagFromFile(path string) (*metainfo.Magnet, error) {
func getMagFromFile(path string) (*metainfo.Magnet, []byte, error) {
if runtime.GOOS == "windows" && strings.HasPrefix(path, "/") {
path = strings.TrimPrefix(path, "/")
}
minfo, err := metainfo.LoadFromFile(path)
if err != nil {
return nil, err
return nil, nil, err
}
info, err := minfo.UnmarshalInfo()
if err != nil {
return nil, err
return nil, nil, err
}
mag := minfo.Magnet(info.Name, minfo.HashInfoBytes())
return &mag, nil
return &mag, minfo.InfoBytes, nil
}

View File

@@ -13,9 +13,9 @@ import (
"github.com/anacrolix/torrent/metainfo"
)
func Add(bts *torr.BTServer, magnet metainfo.Magnet, save bool) error {
func Add(bts *torr.BTServer, magnet metainfo.Magnet, infobytes []byte, save bool) error {
fmt.Println("Adding torrent", magnet.String())
_, err := bts.AddTorrent(magnet, func(torr *torr.Torrent) {
_, err := bts.AddTorrent(magnet, infobytes, func(torr *torr.Torrent) {
if torr, _ := settings.LoadTorrentDB(magnet.InfoHash.HexString()); torr != nil {
return
}
@@ -24,6 +24,7 @@ func Add(bts *torr.BTServer, magnet metainfo.Magnet, save bool) error {
torDb.Hash = torr.Hash().HexString()
torDb.Size = torr.Length()
torDb.Magnet = magnet.String()
torDb.InfoBytes = infobytes
torDb.Timestamp = time.Now().Unix()
files := torr.Stats().FileStats
sort.Slice(files, func(i, j int) bool {

View File

@@ -89,12 +89,12 @@ var settingsPage = `
<br>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">Peer strategy</div>
<div class="input-group-text">Шифрование</div>
</div>
<select id="PeerStrategy" class="form-control">
<option value="0">Duplicate Request Timeout</option>
<option value="1">Fastest</option>
<option value="2">Fuzzing</option>
<select id="Encryption" class="form-control">
<option value="0">По умолчанию</option>
<option value="1">Отключить</option>
<option value="2">Принудительно</option>
</select>
</div>
<br>
@@ -171,7 +171,7 @@ var settingsPage = `
data.DisableUPNP = $('#DisableUPNP').prop('checked');
data.DisableDHT = $('#DisableDHT').prop('checked');
data.DisableUpload = $('#DisableUpload').prop('checked');
data.PeerStrategy = Number($('#PeerStrategy').val());
data.Encryption = Number($('#Encryption').val());
data.ConnectionsLimit = Number($('#ConnectionsLimit').val());
data.DhtConnectionLimit = Number($('#DhtConnectionLimit').val());
@@ -205,7 +205,7 @@ var settingsPage = `
$('#DisableUPNP').prop('checked', data.DisableUPNP);
$('#DisableDHT').prop('checked', data.DisableDHT);
$('#DisableUpload').prop('checked', data.DisableUpload);
$('#PeerStrategy').val(data.PeerStrategy);
$('#Encryption').val(data.Encryption);
$('#ConnectionsLimit').val(data.ConnectionsLimit);
$('#DhtConnectionLimit').val(data.DhtConnectionLimit);