refactor: modularize downloader architecture

This commit is contained in:
OpenClaw Agent
2026-09-16 06:41:45 +08:00
parent 6c585ff835
commit 285064d144
11 changed files with 766 additions and 558 deletions
+85
View File
@@ -0,0 +1,85 @@
package main
import (
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/studio-b12/gowebdav"
)
func (a *App) getSettings(c *gin.Context) {
c.JSON(200, gin.H{
"amApi": a.cfg.AMAPI, "downloadDir": a.cfg.DownloadDir,
"webdavUrl": a.cfg.WebDAVURL, "webdavUser": a.cfg.WebDAVUser,
"webdavPass": a.cfg.WebDAVPass, "webdavPath": a.cfg.WebDAVPath,
"quality": a.cfg.DefaultQuality, "webdavVersionPolicy": a.cfg.WebDAVVersionPolicy,
"localFilePolicy": a.cfg.LocalFilePolicy,
})
}
func (a *App) putSettings(c *gin.Context) {
var v map[string]string
if c.BindJSON(&v) != nil {
c.Status(400)
return
}
if x := v["amApi"]; x != "" {
a.cfg.AMAPI = x
a.saveSetting("am_api", x)
a.am = &AMAPIClient{BaseURL: x, HTTP: a.httpClient}
}
if x := v["downloadDir"]; x != "" {
a.cfg.DownloadDir = x
a.saveSetting("download_dir", x)
}
if p := v["webdavVersionPolicy"]; p == "keep" || p == "replace_lower" {
a.cfg.WebDAVVersionPolicy = p
}
if p := v["localFilePolicy"]; p == "keep" || p == "delete_after_upload" {
a.cfg.LocalFilePolicy = p
}
if x, ok := v["webdavUrl"]; ok {
a.cfg.WebDAVURL = x
}
if x, ok := v["webdavUser"]; ok {
a.cfg.WebDAVUser = x
}
if x, ok := v["webdavPass"]; ok {
a.cfg.WebDAVPass = x
}
if x, ok := v["webdavPath"]; ok {
a.cfg.WebDAVPath = strings.Trim(x, "/")
}
if x, ok := v["quality"]; ok && x != "" {
a.cfg.DefaultQuality = x
}
for k, x := range map[string]string{
"webdav_url": a.cfg.WebDAVURL, "webdav_user": a.cfg.WebDAVUser, "webdav_pass": a.cfg.WebDAVPass,
"webdav_path": a.cfg.WebDAVPath, "quality": a.cfg.DefaultQuality,
"webdav_version_policy": a.cfg.WebDAVVersionPolicy, "local_file_policy": a.cfg.LocalFilePolicy,
} {
a.saveSetting(k, x)
}
if a.cfg.WebDAVURL != "" {
a.storage = NewWebDAVStorage(a.cfg)
} else {
a.storage = nil
}
c.JSON(200, gin.H{"ok": true})
}
func (a *App) testWebDAV(c *gin.Context) {
var v struct{ URL, User, Pass, Path string }
if c.BindJSON(&v) != nil {
c.Status(400)
return
}
client := gowebdav.NewClient(v.URL, v.User, v.Pass)
client.SetTimeout(20 * time.Second)
if err := client.Connect(); err != nil {
c.JSON(502, gin.H{"ok": false, "error": err.Error()})
return
}
c.JSON(200, gin.H{"ok": true, "path": v.Path})
}