* fix(qbittorrent): wait for qbittorrent to parse torrent and create task #3413 * fix(qbittorrent): check task state correctly * fix(qbittorrent): fix path sent to `op.Put()`
This commit is contained in:
parent
6659f6d367
commit
d92c10da56
@ -242,6 +242,19 @@ type TorrentInfo struct {
|
|||||||
Upspeed int `json:"upspeed"` // 上传速度(字节/秒)
|
Upspeed int `json:"upspeed"` // 上传速度(字节/秒)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type InfoNotFoundError struct {
|
||||||
|
Id string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i InfoNotFoundError) Error() string {
|
||||||
|
return "there should be exactly one task with tag \"alist-" + i.Id + "\""
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewInfoNotFoundError(id string) InfoNotFoundError {
|
||||||
|
return InfoNotFoundError{Id: id}
|
||||||
|
}
|
||||||
|
|
||||||
func (c *client) GetInfo(id string) (TorrentInfo, error) {
|
func (c *client) GetInfo(id string) (TorrentInfo, error) {
|
||||||
var infos []TorrentInfo
|
var infos []TorrentInfo
|
||||||
|
|
||||||
@ -266,7 +279,7 @@ func (c *client) GetInfo(id string) (TorrentInfo, error) {
|
|||||||
return TorrentInfo{}, err
|
return TorrentInfo{}, err
|
||||||
}
|
}
|
||||||
if len(infos) != 1 {
|
if len(infos) != 1 {
|
||||||
return TorrentInfo{}, errors.New("there should be exactly one task with tag \"alist-" + id + "\"")
|
return TorrentInfo{}, NewInfoNotFoundError(id)
|
||||||
}
|
}
|
||||||
return infos[0], nil
|
return infos[0], nil
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
@ -29,6 +28,30 @@ func (m *Monitor) Loop() error {
|
|||||||
completed bool
|
completed bool
|
||||||
)
|
)
|
||||||
m.finish = make(chan struct{})
|
m.finish = make(chan struct{})
|
||||||
|
|
||||||
|
// wait for qbittorrent to parse torrent and create task
|
||||||
|
m.tsk.SetStatus("waiting for qbittorrent to parse torrent and create task")
|
||||||
|
waitCount := 0
|
||||||
|
for {
|
||||||
|
_, err := qbclient.GetInfo(m.tsk.ID)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
switch err.(type) {
|
||||||
|
case InfoNotFoundError:
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
waitCount += 1
|
||||||
|
if waitCount >= 60 {
|
||||||
|
return errors.New("torrent parse timeout")
|
||||||
|
}
|
||||||
|
timer := time.NewTimer(time.Second)
|
||||||
|
<-timer.C
|
||||||
|
}
|
||||||
|
|
||||||
outer:
|
outer:
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@ -61,29 +84,13 @@ func (m *Monitor) update() (bool, error) {
|
|||||||
progress := float64(info.Completed) / float64(info.Size) * 100
|
progress := float64(info.Completed) / float64(info.Size) * 100
|
||||||
m.tsk.SetProgress(int(progress))
|
m.tsk.SetProgress(int(progress))
|
||||||
switch info.State {
|
switch info.State {
|
||||||
case UPLOADING:
|
case UPLOADING, PAUSEDUP, QUEUEDUP, STALLEDUP, FORCEDUP, CHECKINGUP:
|
||||||
case PAUSEDUP:
|
|
||||||
case QUEUEDUP:
|
|
||||||
case STALLEDUP:
|
|
||||||
case FORCEDUP:
|
|
||||||
case CHECKINGUP:
|
|
||||||
err = m.complete()
|
err = m.complete()
|
||||||
return true, errors.WithMessage(err, "failed to transfer file")
|
return true, errors.WithMessage(err, "failed to transfer file")
|
||||||
case ALLOCATING:
|
case ALLOCATING, DOWNLOADING, METADL, PAUSEDDL, QUEUEDDL, STALLEDDL, CHECKINGDL, FORCEDDL, CHECKINGRESUMEDATA, MOVING:
|
||||||
case DOWNLOADING:
|
|
||||||
case METADL:
|
|
||||||
case PAUSEDDL:
|
|
||||||
case QUEUEDDL:
|
|
||||||
case STALLEDDL:
|
|
||||||
case CHECKINGDL:
|
|
||||||
case FORCEDDL:
|
|
||||||
case CHECKINGRESUMEDATA:
|
|
||||||
case MOVING:
|
|
||||||
case UNKNOWN: // or maybe should return an error for UNKNOWN?
|
|
||||||
m.tsk.SetStatus("qbittorrent downloading")
|
m.tsk.SetStatus("qbittorrent downloading")
|
||||||
return false, nil
|
return false, nil
|
||||||
case ERROR:
|
case ERROR, MISSINGFILES, UNKNOWN:
|
||||||
case MISSINGFILES:
|
|
||||||
return true, errors.Errorf("failed to download %s, error: %s", m.tsk.ID, info.State)
|
return true, errors.Errorf("failed to download %s, error: %s", m.tsk.ID, info.State)
|
||||||
}
|
}
|
||||||
return true, errors.New("unknown error occurred downloading qbittorrent") // should never happen
|
return true, errors.New("unknown error occurred downloading qbittorrent") // should never happen
|
||||||
@ -130,7 +137,7 @@ func (m *Monitor) complete() error {
|
|||||||
}
|
}
|
||||||
stream := &model.FileStream{
|
stream := &model.FileStream{
|
||||||
Obj: &model.Object{
|
Obj: &model.Object{
|
||||||
Name: path.Base(filePath),
|
Name: file.Name,
|
||||||
Size: size,
|
Size: size,
|
||||||
Modified: time.Now(),
|
Modified: time.Now(),
|
||||||
IsFolder: false,
|
IsFolder: false,
|
||||||
@ -138,8 +145,7 @@ func (m *Monitor) complete() error {
|
|||||||
ReadCloser: f,
|
ReadCloser: f,
|
||||||
Mimetype: mimetype,
|
Mimetype: mimetype,
|
||||||
}
|
}
|
||||||
newDistDir := filepath.Join(dstDirActualPath, file.Name)
|
return op.Put(tsk.Ctx, storage, dstDirActualPath, stream, tsk.SetProgress)
|
||||||
return op.Put(tsk.Ctx, storage, newDistDir, stream, tsk.SetProgress)
|
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user