From a7dfa2d0f01df4a087e3d29f84b0dcb486749c08 Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Wed, 24 Jul 2024 15:55:33 +0800 Subject: [PATCH] feat: fetch torznab results cocurrently --- pkg/torznab/torznab.go | 20 ++++++++++++-------- server/core/torrent.go | 31 +++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/pkg/torznab/torznab.go b/pkg/torznab/torznab.go index cf1c284..166fe76 100644 --- a/pkg/torznab/torznab.go +++ b/pkg/torznab/torznab.go @@ -1,12 +1,14 @@ package torznab import ( + "context" "encoding/xml" "io" "net/http" "net/url" "polaris/log" "strconv" + "time" "github.com/pkg/errors" ) @@ -59,7 +61,6 @@ type Item struct { Name string `xml:"name,attr"` Value string `xml:"value,attr"` } `xml:"attr"` - } func (i *Item) GetAttr(key string) string { @@ -75,12 +76,12 @@ func (r *Response) ToResults() []Result { for _, item := range r.Channel.Item { r := Result{ Name: item.Title, - Magnet: item.Link, - Size: mustAtoI(item.Size), - Seeders: mustAtoI(item.GetAttr("seeders")), - Peers: mustAtoI(item.GetAttr("peers")), + Magnet: item.Link, + Size: mustAtoI(item.Size), + Seeders: mustAtoI(item.GetAttr("seeders")), + Peers: mustAtoI(item.GetAttr("peers")), Category: mustAtoI(item.GetAttr("category")), - Source: r.Channel.Title, + Source: r.Channel.Title, } res = append(res, r) } @@ -96,7 +97,10 @@ func mustAtoI(key string) int { return i } func Search(torznabUrl, api, keyWord string) ([]Result, error) { - req, err := http.NewRequest(http.MethodGet, torznabUrl, nil) + ctx, cancel := context.WithTimeout(context.TODO(), 10*time.Second) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, torznabUrl, nil) if err != nil { return nil, errors.Wrap(err, "new request") } @@ -130,5 +134,5 @@ type Result struct { Seeders int Peers int Category int - Source string + Source string } diff --git a/server/core/torrent.go b/server/core/torrent.go index 4daf4c9..690a03d 100644 --- a/server/core/torrent.go +++ b/server/core/torrent.go @@ -10,6 +10,7 @@ import ( "sort" "strconv" "strings" + "sync" "github.com/pkg/errors" ) @@ -97,14 +98,32 @@ func searchWithTorznab(db *db.Client, q string) []torznab.Result { var res []torznab.Result allTorznab := db.GetAllTorznabInfo() + resChan := make(chan []torznab.Result) + var wg sync.WaitGroup + for _, tor := range allTorznab { - resp, err := torznab.Search(tor.URL, tor.ApiKey, q) - if err != nil { - log.Errorf("search %s error: %v", tor.Name, err) - continue - } - res = append(res, resp...) + wg.Add(1) + go func () { + log.Debugf("search torznab %v with %v", tor.Name, q) + defer wg.Done() + resp, err := torznab.Search(tor.URL, tor.ApiKey, q) + if err != nil { + log.Errorf("search %s error: %v", tor.Name, err) + return + } + resChan <- resp + + }() } + go func() { + wg.Wait() + close(resChan) // 在所有的worker完成后关闭Channel + }() + + for result := range resChan { + res = append(res, result...) + } + sort.Slice(res, func(i, j int) bool { var s1 = res[i] var s2 = res[j]