From 8abee6504f680430af44827b92db23d7ca20b4e6 Mon Sep 17 00:00:00 2001 From: Noah Hsu Date: Wed, 29 Jun 2022 17:31:37 +0800 Subject: [PATCH] feat: set aria2 client and add url to aria2 api --- internal/aria2/aria2.go | 8 ++++ internal/bootstrap/data/setting.go | 3 ++ internal/conf/const.go | 36 +++++++++------- internal/model/setting.go | 1 + server/controllers/aria2.go | 69 ++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 server/controllers/aria2.go diff --git a/internal/aria2/aria2.go b/internal/aria2/aria2.go index eb6c34c6..ccf41f79 100644 --- a/internal/aria2/aria2.go +++ b/internal/aria2/aria2.go @@ -2,6 +2,8 @@ package aria2 import ( "context" + "github.com/alist-org/alist/v3/internal/conf" + "github.com/alist-org/alist/v3/internal/setting" "github.com/alist-org/alist/v3/pkg/aria2/rpc" "github.com/alist-org/alist/v3/pkg/task" "github.com/pkg/errors" @@ -13,6 +15,12 @@ var DownTaskManager = task.NewTaskManager[string](3) var notify = NewNotify() var client rpc.Client +func InitClient(timeout int) error { + uri := setting.GetByKey(conf.Aria2Uri) + secret := setting.GetByKey(conf.Aria2Secret) + return InitAria2Client(uri, secret, timeout) +} + func InitAria2Client(uri string, secret string, timeout int) error { c, err := rpc.New(context.Background(), uri, secret, time.Duration(timeout)*time.Second, notify) if err != nil { diff --git a/internal/bootstrap/data/setting.go b/internal/bootstrap/data/setting.go index 10466f07..50174410 100644 --- a/internal/bootstrap/data/setting.go +++ b/internal/bootstrap/data/setting.go @@ -89,6 +89,9 @@ func initialSettings() { {Key: conf.CustomizeHead, Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE}, {Key: conf.CustomizeBody, Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE}, {Key: conf.LinkExpiration, Value: "0", Type: conf.TypeNumber, Group: model.GLOBAL, Flag: model.PRIVATE}, + // aria2 settings + {Key: conf.Aria2Uri, Value: "http://localhost:6800/jsonrpc", Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE}, + {Key: conf.Aria2Secret, Value: "", Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE}, // single settings {Key: conf.Token, Value: token, Type: conf.TypeString, Group: model.SINGLE, Flag: model.PRIVATE}, } diff --git a/internal/conf/const.go b/internal/conf/const.go index d7341200..5f02f912 100644 --- a/internal/conf/const.go +++ b/internal/conf/const.go @@ -9,24 +9,30 @@ const ( ) const ( - VERSION = "version" - BaseUrl = "base_url" - SiteTitle = "site_title" - SiteLogo = "site_logo" - Favicon = "favicon" - Announcement = "announcement" - IconColor = "icon_color" - TextTypes = "text_types" - AudioTypes = "audio_types" - VideoTypes = "video_types" - ProxyTypes = "proxy_types" - PdfViewerUrl = "pdf_viewer_url" - AudioAutoplay = "audio_autoplay" - VideoAutoplay = "video_autoplay" + VERSION = "version" + BaseUrl = "base_url" + SiteTitle = "site_title" + SiteLogo = "site_logo" + Favicon = "favicon" + Announcement = "announcement" + IconColor = "icon_color" + + TextTypes = "text_types" + AudioTypes = "audio_types" + VideoTypes = "video_types" + ProxyTypes = "proxy_types" + PdfViewerUrl = "pdf_viewer_url" + AudioAutoplay = "audio_autoplay" + VideoAutoplay = "video_autoplay" + HideFiles = "hide_files" GlobalReadme = "global_readme" CustomizeHead = "customize_head" CustomizeBody = "customize_body" LinkExpiration = "link_expiration" - Token = "token" + + Aria2Uri = "aria2_uri" + Aria2Secret = "aria2_secret" + + Token = "token" ) diff --git a/internal/model/setting.go b/internal/model/setting.go index f252a841..97dc4625 100644 --- a/internal/model/setting.go +++ b/internal/model/setting.go @@ -6,6 +6,7 @@ const ( PREVIEW GLOBAL SINGLE + ARIA2 ) const ( diff --git a/server/controllers/aria2.go b/server/controllers/aria2.go new file mode 100644 index 00000000..41438450 --- /dev/null +++ b/server/controllers/aria2.go @@ -0,0 +1,69 @@ +package controllers + +import ( + "github.com/alist-org/alist/v3/internal/aria2" + "github.com/alist-org/alist/v3/internal/conf" + "github.com/alist-org/alist/v3/internal/db" + "github.com/alist-org/alist/v3/internal/model" + "github.com/alist-org/alist/v3/server/common" + "github.com/gin-gonic/gin" + stdpath "path" +) + +type SetAria2Req struct { + Uri string `json:"uri"` + Secret string `json:"secret"` +} + +func SetAria2(c *gin.Context) { + var req SetAria2Req + if err := c.ShouldBind(&req); err != nil { + common.ErrorResp(c, err, 400) + return + } + items := []model.SettingItem{ + {Key: conf.Aria2Uri, Value: req.Uri, Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE}, + {Key: conf.Aria2Secret, Value: req.Secret, Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE}, + } + if err := db.SaveSettingItems(items); err != nil { + common.ErrorResp(c, err, 500) + return + } + err := aria2.InitClient(2) + if err != nil { + common.ErrorResp(c, err, 500) + return + } + common.SuccessResp(c) +} + +type AddAria2Req struct { + Urls []string `json:"urls"` + Path string `json:"path"` +} + +func AddAria2(c *gin.Context) { + user := c.MustGet("user").(*model.User) + if !user.IsAdmin() && !user.Aira2 { + common.ErrorStrResp(c, "permission denied", 403) + return + } + if !aria2.IsAria2Ready() { + common.ErrorStrResp(c, "aria2 not ready", 500) + return + } + var req AddAria2Req + if err := c.ShouldBind(&req); err != nil { + common.ErrorResp(c, err, 400) + return + } + req.Path = stdpath.Join(user.BasePath, req.Path) + for _, url := range req.Urls { + err := aria2.AddURI(c, url, req.Path) + if err != nil { + common.ErrorResp(c, err, 500) + return + } + } + common.SuccessResp(c) +}