feat: save hash instead of link, and refactor torrent download

This commit is contained in:
Simon Ding
2025-02-01 14:22:34 +08:00
parent 8b6558b2b5
commit 2821d49673
18 changed files with 463 additions and 236 deletions

View File

@@ -18,5 +18,5 @@ type Torrent interface {
type Downloader interface {
GetAll() ([]Torrent, error)
Download(link, dir string) (Torrent, error)
Download(link, hash, dir string) (Torrent, error)
}

View File

@@ -61,49 +61,45 @@ func (c *Client) GetAll() ([]pkg.Torrent, error) {
return res, nil
}
func (c *Client) Download(link, dir string) (pkg.Torrent, error) {
func (c *Client) Download(link, hash, dir string) (pkg.Torrent, error) {
err := c.c.DownloadLinks([]string{link}, qbt.DownloadOptions{Savepath: &dir, Category: &c.category})
if err != nil {
return nil, errors.Wrap(err, "qbt download")
}
magnet, err := utils.Link2Magnet(link)
if err != nil {
return nil, errors.Errorf("converting link to magnet error, link: %v, error: %v", link, err)
}
hash, err := utils.MagnetHash(magnet)
if err != nil {
return nil, errors.Wrap(err, "get hash")
}
return &Torrent{hash: hash, c: c.c}, nil
}
func NewTorrent(info Info, link string) (*Torrent, error) {
func NewTorrentHash(info Info, hash string) (*Torrent, error) {
c, err := NewClient(info.URL, info.User, info.Password)
if err != nil {
return nil, err
}
magnet, err := utils.Link2Magnet(link)
if err != nil {
return nil, errors.Errorf("converting link to magnet error, link: %v, error: %v", link, err)
}
hash, err := utils.MagnetHash(magnet)
if err != nil {
return nil, err
}
t := &Torrent{
c: c.c,
hash: hash,
}
if !t.Exists() {
return nil, errors.Errorf("torrent not exist: %v", magnet)
return nil, errors.Errorf("torrent not exist: %v", hash)
}
return t, nil
}
func NewTorrent(info Info, link string) (*Torrent, error) {
magnet, err := utils.Link2Magnet(link)
if err != nil {
return nil, errors.Errorf("converting link to magnet error, link: %v, error: %v", link, err)
}
hash, err := utils.MagnetHash(magnet)
if err != nil {
return nil, err
}
return NewTorrentHash(info, hash)
}
type Torrent struct {
c *qbt.Client
hash string

View File

@@ -63,7 +63,7 @@ func (c *Client) GetAll() ([]pkg.Torrent, error) {
return torrents, nil
}
func (c *Client) Download(link, dir string) (pkg.Torrent, error) {
func (c *Client) Download(link, hash, dir string) (pkg.Torrent, error) {
t, err := c.c.TorrentAdd(context.TODO(), transmissionrpc.TorrentAddPayload{
Filename: &link,
@@ -74,16 +74,6 @@ func (c *Client) Download(link, dir string) (pkg.Torrent, error) {
}
log.Debugf("get torrent info: %+v", t)
magnet, err := utils.Link2Magnet(link)
if err != nil {
return nil, errors.Errorf("converting link to magnet error, link: %v, error: %v", link, err)
}
hash, err := utils.MagnetHash(magnet)
if err != nil {
return nil, errors.Wrap(err, "get hash")
}
return &Torrent{
hash: hash,
c: c.c,
@@ -91,33 +81,38 @@ func (c *Client) Download(link, dir string) (pkg.Torrent, error) {
}, err
}
func NewTorrent(cfg Config, link string) (*Torrent, error) {
func NewTorrentHash(cfg Config, hash string) (*Torrent, error) {
c, err := NewClient(cfg)
if err != nil {
return nil, err
}
magnet, err := utils.Link2Magnet(link)
if err != nil {
return nil, errors.Errorf("converting link to magnet error, link: %v, error: %v", link, err)
}
hash, err := utils.MagnetHash(magnet)
if err != nil {
return nil, err
}
t := &Torrent{
c: c.c,
hash: hash,
//cfg: cfg,
}
if !t.Exists() {
return nil, errors.Errorf("torrent not exist: %v", magnet)
return nil, errors.Errorf("torrent not exist: %v", hash)
}
return t, nil
}
func NewTorrent(cfg Config, link string) (*Torrent, error) {
magnet, err := utils.Link2Magnet(link)
if err != nil {
return nil, errors.Errorf("converting link to magnet error, link: %v, error: %v", link, err)
}
hash, err := utils.MagnetHash(magnet)
if err != nil {
return nil, err
}
return NewTorrentHash(cfg, hash)
}
type Torrent struct {
//t *transmissionrpc.Torrent
c *transmissionrpc.Client

View File

@@ -222,6 +222,33 @@ func isWSL() bool {
return strings.Contains(strings.ToLower(string(releaseData)), "microsoft")
}
func Link2Hash(link string) (string, error) {
if strings.HasPrefix(strings.ToLower(link), "magnet:") {
return MagnetHash(link)
}
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse //do not follow redirects
},
}
resp, err := client.Get(link)
if err != nil {
return "", errors.Wrap(err, "get link")
}
defer resp.Body.Close()
if resp.StatusCode >= 300 && resp.StatusCode < 400 {
//redirects
tourl := resp.Header.Get("Location")
return Link2Hash(tourl)
}
info, err := metainfo.Load(resp.Body)
if err != nil {
return "", errors.Wrap(err, "parse response")
}
return info.HashInfoBytes().AsString(), nil
}
func Link2Magnet(link string) (string, error) {
if strings.HasPrefix(strings.ToLower(link), "magnet:") {
return link, nil