Path: blob/main/internal/offline_download/aria2/aria2.go
1562 views
package aria212import (3"context"4"fmt"5"strconv"6"time"78"github.com/alist-org/alist/v3/internal/errs"910"github.com/alist-org/alist/v3/internal/conf"11"github.com/alist-org/alist/v3/internal/model"12"github.com/alist-org/alist/v3/internal/offline_download/tool"13"github.com/alist-org/alist/v3/internal/setting"14"github.com/alist-org/alist/v3/pkg/aria2/rpc"15"github.com/pkg/errors"16log "github.com/sirupsen/logrus"17)1819var notify = NewNotify()2021type Aria2 struct {22client rpc.Client23}2425func (a *Aria2) Run(task *tool.DownloadTask) error {26return errs.NotSupport27}2829func (a *Aria2) Name() string {30return "aria2"31}3233func (a *Aria2) Items() []model.SettingItem {34// aria2 settings35return []model.SettingItem{36{Key: conf.Aria2Uri, Value: "http://localhost:6800/jsonrpc", Type: conf.TypeString, Group: model.OFFLINE_DOWNLOAD, Flag: model.PRIVATE},37{Key: conf.Aria2Secret, Value: "", Type: conf.TypeString, Group: model.OFFLINE_DOWNLOAD, Flag: model.PRIVATE},38}39}4041func (a *Aria2) Init() (string, error) {42a.client = nil43uri := setting.GetStr(conf.Aria2Uri)44secret := setting.GetStr(conf.Aria2Secret)45c, err := rpc.New(context.Background(), uri, secret, 4*time.Second, notify)46if err != nil {47return "", errors.Wrap(err, "failed to init aria2 client")48}49version, err := c.GetVersion()50if err != nil {51return "", errors.Wrapf(err, "failed get aria2 version")52}53a.client = c54log.Infof("using aria2 version: %s", version.Version)55return fmt.Sprintf("aria2 version: %s", version.Version), nil56}5758func (a *Aria2) IsReady() bool {59return a.client != nil60}6162func (a *Aria2) AddURL(args *tool.AddUrlArgs) (string, error) {63options := map[string]interface{}{64"dir": args.TempDir,65}66gid, err := a.client.AddURI([]string{args.Url}, options)67if err != nil {68return "", err69}70notify.Signals.Store(gid, args.Signal)71return gid, nil72}7374func (a *Aria2) Remove(task *tool.DownloadTask) error {75_, err := a.client.Remove(task.GID)76return err77}7879func (a *Aria2) Status(task *tool.DownloadTask) (*tool.Status, error) {80info, err := a.client.TellStatus(task.GID)81if err != nil {82return nil, err83}84total, err := strconv.ParseInt(info.TotalLength, 10, 64)85if err != nil {86total = 087}88downloaded, err := strconv.ParseUint(info.CompletedLength, 10, 64)89if err != nil {90downloaded = 091}92s := &tool.Status{93Completed: info.Status == "complete",94Err: err,95TotalBytes: total,96}97s.Progress = float64(downloaded) / float64(total) * 10098if len(info.FollowedBy) != 0 {99s.NewGID = info.FollowedBy[0]100notify.Signals.Delete(task.GID)101notify.Signals.Store(s.NewGID, task.Signal)102}103switch info.Status {104case "complete":105s.Completed = true106case "error":107s.Err = errors.Errorf("failed to download %s, error: %s", task.GID, info.ErrorMessage)108case "active":109s.Status = "aria2: " + info.Status110if info.Seeder == "true" {111s.Completed = true112}113case "waiting", "paused":114s.Status = "aria2: " + info.Status115case "removed":116s.Err = errors.Errorf("failed to download %s, removed", task.GID)117default:118return nil, errors.Errorf("[aria2] unknown status %s", info.Status)119}120return s, nil121}122123var _ tool.Tool = (*Aria2)(nil)124125func init() {126tool.Tools.Add(&Aria2{})127}128129130