feat: make WebDAV version cleanup configurable

This commit is contained in:
OpenClaw Agent
2026-09-16 05:55:35 +08:00
parent 83224fe5b5
commit 94e84b53cf
2 changed files with 52 additions and 7 deletions
+49 -4
View File
@@ -59,8 +59,8 @@ type SongRequest struct {
Quality string `json:"quality"`
}
type Config struct {
AMAPI, DownloadDir, WebDAVURL, WebDAVUser, WebDAVPass, WebDAVPath, DefaultQuality string
WorkerCount int
AMAPI, DownloadDir, WebDAVURL, WebDAVUser, WebDAVPass, WebDAVPath, DefaultQuality, WebDAVVersionPolicy string
WorkerCount int
}
type App struct {
db *gorm.DB
@@ -86,6 +86,9 @@ func main() {
a := &App{db: db, cfg: Config{AMAPI: getenv("AM_API_URL", "http://127.0.0.1:9530/api"), DownloadDir: getenv("DOWNLOAD_DIR", "/downloads"), DefaultQuality: getenv("DEFAULT_QUALITY", "standard"), WorkerCount: atoi(getenv("WORKERS", "2"), 2)}, queue: make(chan uint, 100), httpClient: &http.Client{Timeout: 2 * time.Minute}}
_ = os.MkdirAll(a.cfg.DownloadDir, 0755)
a.loadSettings()
if a.cfg.WebDAVVersionPolicy == "" {
a.cfg.WebDAVVersionPolicy = "keep"
}
a.startWorkers()
r := gin.Default()
r.StaticFile("/", "/app/index.html")
@@ -120,6 +123,8 @@ func (a *App) loadSettings() {
a.cfg.WebDAVPath = s.Value
case "quality":
a.cfg.DefaultQuality = s.Value
case "webdav_version_policy":
a.cfg.WebDAVVersionPolicy = s.Value
}
}
}
@@ -442,10 +447,44 @@ func (a *App) upload(t *Task) {
a.fail(t, err)
return
}
if a.cfg.WebDAVVersionPolicy == "replace_lower" {
a.removeLowerQualityVersions(client, remote, t)
}
t.Status = "done"
t.Progress = 100
a.db.Save(t)
}
func (a *App) removeLowerQualityVersions(client *gowebdav.Client, remote string, t *Task) {
levels := map[string]int{"standard": 1, "exhigh": 2, "sq": 3, "lossless": 4, "hires": 5, "jyeffect": 6, "sky": 7, "jymaster": 8, "atmos": 9, "atmos_plus": 10, "master": 11}
current := levels[t.ActualQuality]
if current == 0 {
current = levels[t.ResolvedQuality]
}
if current == 0 {
current = levels[t.Quality]
}
if current == 0 {
return
}
var old []Task
a.db.Where("artist = ? AND title = ? AND album = ? AND status = ? AND id <> ?", t.Artist, t.Title, t.Album, "done", t.ID).Find(&old)
for _, candidate := range old {
q := candidate.ActualQuality
if q == "" {
q = candidate.ResolvedQuality
}
if q == "" {
q = candidate.Quality
}
if levels[q] <= 0 || levels[q] >= current || candidate.RemotePath == "" || candidate.RemotePath == remote {
continue
}
if _, err := client.Stat(candidate.RemotePath); err == nil {
_ = client.Remove(candidate.RemotePath)
}
}
}
func (a *App) fail(t *Task, err error) {
if t.LocalPath != "" {
_ = os.Remove(t.LocalPath + ".part")
@@ -456,7 +495,7 @@ func (a *App) fail(t *Task, err error) {
}
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})
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})
}
func (a *App) putSettings(c *gin.Context) {
var v map[string]string
@@ -468,6 +507,9 @@ func (a *App) putSettings(c *gin.Context) {
a.cfg.AMAPI = x
a.save("am_api", x)
}
if p := v["webdavVersionPolicy"]; p != "keep" && p != "replace_lower" {
v["webdavVersionPolicy"] = "keep"
}
if x := v["downloadDir"]; x != "" {
a.cfg.DownloadDir = x
a.save("download_dir", x)
@@ -478,7 +520,10 @@ func (a *App) putSettings(c *gin.Context) {
a.cfg.WebDAVPass = v["webdavPass"]
a.cfg.WebDAVPath = strings.Trim(v["webdavPath"], "/")
a.cfg.DefaultQuality = v["quality"]
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} {
if p := v["webdavVersionPolicy"]; p == "keep" || p == "replace_lower" {
a.cfg.WebDAVVersionPolicy = p
}
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} {
a.save(k, x)
}
c.JSON(200, gin.H{"ok": true})