58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package downloaders
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"github.com/cavaliergopher/grab/v3"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
func GetGrabClient() *grab.Client {
|
|
tr := &http.Transport{
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
|
Proxy: http.ProxyFromEnvironment,
|
|
}
|
|
return &grab.Client{
|
|
UserAgent: "qBitTorrent",
|
|
HTTPClient: &http.Client{
|
|
Transport: tr,
|
|
},
|
|
}
|
|
}
|
|
|
|
func NormalGrab(client *grab.Client, url, filename string, progressCallback func(int64, int64)) error {
|
|
req, err := grab.NewRequest(filename, url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
resp := client.Do(req)
|
|
|
|
t := time.NewTicker(time.Second)
|
|
defer t.Stop()
|
|
|
|
var lastReported int64
|
|
Loop:
|
|
for {
|
|
select {
|
|
case <-t.C:
|
|
current := resp.BytesComplete()
|
|
speed := int64(resp.BytesPerSecond())
|
|
if current != lastReported {
|
|
if progressCallback != nil {
|
|
progressCallback(current-lastReported, speed)
|
|
}
|
|
lastReported = current
|
|
}
|
|
case <-resp.Done:
|
|
break Loop
|
|
}
|
|
}
|
|
|
|
// Report final bytes
|
|
if progressCallback != nil {
|
|
progressCallback(resp.BytesComplete()-lastReported, 0)
|
|
}
|
|
|
|
return resp.Err()
|
|
}
|