From 6c585ff8358fe05bc70dfba6bd953607876e3635 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Wed, 16 Sep 2026 06:20:24 +0800 Subject: [PATCH] feat: add local file retention policy --- index.html | 8 ++++---- main.go | 30 ++++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index f20a3ca..d812ff5 100644 --- a/index.html +++ b/index.html @@ -12,8 +12,8 @@

找到你想听的音乐

搜索歌曲、歌手或专辑,加入下载队列即可。

最近下载
-
下载队列
任务会自动处理,完成后可在本地下载目录找到文件。
-

音乐 API

用于搜索和解析音乐资源,与 Downloader Web 服务分离。

当前服务架构:Downloader Web 使用 9540,音乐 API 使用 9530。

下载

设置文件保存位置与默认音质。

WebDAV

可选的 NAS/远程音乐库同步配置。

“清理旧低音质”只删除数据库中已确认属于同一首歌、且音质低于当前版本的旧 WebDAV 文件,不会扫描或删除未知文件。
+
下载队列
任务会自动处理;本地文件是否保留由“设置 → 下载 → 本地文件策略”决定。
+

音乐 API

用于搜索和解析音乐资源,与 Downloader Web 服务分离。

当前服务架构:Downloader Web 使用 9540,音乐 API 使用 9530。

下载

设置文件保存位置与默认音质。

仅在 WebDAV 上传成功或远端已存在相同大小文件后删除本地成品;上传失败不会删除。

WebDAV

可选的 NAS/远程音乐库同步配置。

“清理旧低音质”只删除数据库中已确认属于同一首歌、且音质低于当前版本的旧 WebDAV 文件,不会扫描或删除未知文件。
diff --git a/main.go b/main.go index 4ad9f81..c2f552f 100644 --- a/main.go +++ b/main.go @@ -59,8 +59,8 @@ type SongRequest struct { Quality string `json:"quality"` } type Config struct { - AMAPI, DownloadDir, WebDAVURL, WebDAVUser, WebDAVPass, WebDAVPath, DefaultQuality, WebDAVVersionPolicy string - WorkerCount int + AMAPI, DownloadDir, WebDAVURL, WebDAVUser, WebDAVPass, WebDAVPath, DefaultQuality, WebDAVVersionPolicy, LocalFilePolicy string + WorkerCount int } type App struct { db *gorm.DB @@ -89,6 +89,9 @@ func main() { if a.cfg.WebDAVVersionPolicy == "" { a.cfg.WebDAVVersionPolicy = "keep" } + if a.cfg.LocalFilePolicy == "" { + a.cfg.LocalFilePolicy = "keep" + } a.startWorkers() r := gin.Default() r.StaticFile("/", "/app/index.html") @@ -125,6 +128,8 @@ func (a *App) loadSettings() { a.cfg.DefaultQuality = s.Value case "webdav_version_policy": a.cfg.WebDAVVersionPolicy = s.Value + case "local_file_policy": + a.cfg.LocalFilePolicy = s.Value } } } @@ -434,6 +439,7 @@ func (a *App) upload(t *Task) { t.Status = "done" t.Progress = 100 a.db.Save(t) + a.cleanupLocalFile(t) return } } @@ -453,6 +459,16 @@ func (a *App) upload(t *Task) { t.Status = "done" t.Progress = 100 a.db.Save(t) + a.cleanupLocalFile(t) +} +func (a *App) cleanupLocalFile(t *Task) { + if a.cfg.LocalFilePolicy != "delete_after_upload" || t.LocalPath == "" { + return + } + if err := os.Remove(t.LocalPath); err != nil && !os.IsNotExist(err) { + t.Error = "WebDAV 上传成功,但删除本地文件失败: " + err.Error() + 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} @@ -495,7 +511,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, "webdavVersionPolicy": a.cfg.WebDAVVersionPolicy}) + 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 @@ -510,6 +526,9 @@ func (a *App) putSettings(c *gin.Context) { if p := v["webdavVersionPolicy"]; p != "keep" && p != "replace_lower" { v["webdavVersionPolicy"] = "keep" } + if p := v["localFilePolicy"]; p != "keep" && p != "delete_after_upload" { + v["localFilePolicy"] = "keep" + } if x := v["downloadDir"]; x != "" { a.cfg.DownloadDir = x a.save("download_dir", x) @@ -523,7 +542,10 @@ func (a *App) putSettings(c *gin.Context) { 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} { + if p := v["localFilePolicy"]; p == "keep" || p == "delete_after_upload" { + a.cfg.LocalFilePolicy = 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, "local_file_policy": a.cfg.LocalFilePolicy} { a.save(k, x) } c.JSON(200, gin.H{"ok": true})