This commit is contained in:
2025-09-15 21:17:57 +08:00
parent 524da0830a
commit 413ac308ac
9 changed files with 394 additions and 26 deletions
+85 -5
View File
@@ -8,15 +8,19 @@ import (
"github.com/gin-gonic/gin"
"kenaito-media-picker/internal/store"
"kenaito-media-picker/internal/sysinfo"
)
// 配置键名(存储在 AppConfig 表中)
const (
ConfigKeyNsfwType = "nsfw.type" // 检测类型:"" / "human" / "anime"
ConfigKeyNsfwThreshold = "nsfw.threshold" // 人类检测阈值
ConfigKeyAnimeNsfwThreshold = "anime.threshold" // 二次元检测阈值
ConfigKeyScanDir = "scan.scanDir" // 扫描目录
ConfigKeyDestDir = "scan.destDir" // 存放目录
ConfigKeyNsfwType = "nsfw.type" // 检测类型:"" / "human" / "anime"
ConfigKeyNsfwThreshold = "nsfw.threshold" // 人类检测阈值
ConfigKeyAnimeNsfwThreshold = "anime.threshold" // 二次元检测阈值
ConfigKeyNsfwWorkers = "nsfw.workers" // 人类检测 worker 数量
ConfigKeyAnimeNsfwWorkers = "anime.workers" // 二次元检测 worker 数量
ConfigKeyOrganizeWorkers = "organize.workers" // Go 端探测/MIME/移动 worker 数量
ConfigKeyScanDir = "scan.scanDir" // 扫描目录
ConfigKeyDestDir = "scan.destDir" // 存放目录
)
// ConfigController 配置相关接口。
@@ -34,6 +38,9 @@ type NsfwConfig struct {
Type string `json:"type"` // 检测类型:"" / "human" / "anime"
HumanThreshold float64 `json:"humanThreshold"` // 人类检测阈值
AnimeThreshold float64 `json:"animeThreshold"` // 二次元检测阈值
HumanWorkers int `json:"humanWorkers"` // 人类检测 worker 数量
AnimeWorkers int `json:"animeWorkers"` // 二次元检测 worker 数量
GoWorkers int `json:"goWorkers"` // Go 端 worker 数量
}
// GetNsfwConfig 处理 GET /api/config/nsfw:获取 NSFW 配置。
@@ -54,10 +61,34 @@ func (c *ConfigController) GetNsfwConfig(ctx *gin.Context) {
}
}
humanWorkers := 4
if v := c.store.GetConfig(ConfigKeyNsfwWorkers); v != "" {
if w, err := strconv.Atoi(v); err == nil && w > 0 {
humanWorkers = w
}
}
animeWorkers := 2
if v := c.store.GetConfig(ConfigKeyAnimeNsfwWorkers); v != "" {
if w, err := strconv.Atoi(v); err == nil && w > 0 {
animeWorkers = w
}
}
goWorkers := 0 // 0 表示使用文件配置或自动计算
if v := c.store.GetConfig(ConfigKeyOrganizeWorkers); v != "" {
if w, err := strconv.Atoi(v); err == nil && w >= 0 {
goWorkers = w
}
}
Success(ctx, NsfwConfig{
Type: nsfwType,
HumanThreshold: humanThreshold,
AnimeThreshold: animeThreshold,
HumanWorkers: humanWorkers,
AnimeWorkers: animeWorkers,
GoWorkers: goWorkers,
})
}
@@ -66,6 +97,9 @@ type UpdateNsfwConfigReq struct {
Type string `json:"type"` // 检测类型:"" / "human" / "anime"
HumanThreshold float64 `json:"humanThreshold"` // 人类检测阈值
AnimeThreshold float64 `json:"animeThreshold"` // 二次元检测阈值
HumanWorkers int `json:"humanWorkers"` // 人类检测 worker 数量
AnimeWorkers int `json:"animeWorkers"` // 二次元检测 worker 数量
GoWorkers int `json:"goWorkers"` // Go 端 worker 数量(0 表示使用文件配置)
}
// UpdateNsfwConfig 处理 PUT /api/config/nsfw:更新 NSFW 配置。
@@ -90,6 +124,17 @@ func (c *ConfigController) UpdateNsfwConfig(ctx *gin.Context) {
req.AnimeThreshold = 0.5
}
// 校验 worker 数量
if req.HumanWorkers <= 0 {
req.HumanWorkers = 4
}
if req.AnimeWorkers <= 0 {
req.AnimeWorkers = 2
}
if req.GoWorkers < 0 {
req.GoWorkers = 0
}
// 保存配置
if err := c.store.SaveConfig(ConfigKeyNsfwType, req.Type); err != nil {
Error(ctx, http.StatusInternalServerError, "保存配置失败:"+err.Error())
@@ -103,10 +148,45 @@ func (c *ConfigController) UpdateNsfwConfig(ctx *gin.Context) {
Error(ctx, http.StatusInternalServerError, "保存配置失败:"+err.Error())
return
}
if err := c.store.SaveConfig(ConfigKeyNsfwWorkers, strconv.Itoa(req.HumanWorkers)); err != nil {
Error(ctx, http.StatusInternalServerError, "保存配置失败:"+err.Error())
return
}
if err := c.store.SaveConfig(ConfigKeyAnimeNsfwWorkers, strconv.Itoa(req.AnimeWorkers)); err != nil {
Error(ctx, http.StatusInternalServerError, "保存配置失败:"+err.Error())
return
}
if err := c.store.SaveConfig(ConfigKeyOrganizeWorkers, strconv.Itoa(req.GoWorkers)); err != nil {
Error(ctx, http.StatusInternalServerError, "保存配置失败:"+err.Error())
return
}
Success(ctx, nil)
}
// SystemInfo 系统信息响应。
type SystemInfo struct {
CPUCores int `json:"cpuCores"` // CPU 逻辑核心数
MemoryGB float64 `json:"memoryGB"` // 内存大小(GB)
RecommendedGo int `json:"recommendedGo"` // 推荐的 Go 端 worker 数
RecommendedNsfw int `json:"recommendedNsfw"` // 推荐的人类检测 worker 数
RecommendedAnime int `json:"recommendedAnime"` // 推荐的二次元检测 worker 数
}
// GetSystemInfo 处理 GET /api/config/system:获取系统信息和推荐配置。
func (c *ConfigController) GetSystemInfo(ctx *gin.Context) {
info := sysinfo.GetSystemInfo()
workers := sysinfo.CalculateWorkerConfig(info)
Success(ctx, SystemInfo{
CPUCores: info.CPUCores,
MemoryGB: info.MemoryGB,
RecommendedGo: workers.GoWorkers,
RecommendedNsfw: workers.NsfwWorkers,
RecommendedAnime: workers.AnimeNsfwWorkers,
})
}
// UpdateScanDirReq 更新扫描目录配置请求。
type UpdateScanDirReq struct {
ScanDir string `json:"scanDir"` // 扫描目录
+1
View File
@@ -52,6 +52,7 @@ func NewRouter(st *store.Store) *gin.Engine {
cc := NewConfigController(st)
apiGroup.GET("/config/nsfw", cc.GetNsfwConfig)
apiGroup.PUT("/config/nsfw", cc.UpdateNsfwConfig)
apiGroup.GET("/config/system", cc.GetSystemInfo)
apiGroup.PUT("/config/scan-dir", cc.UpdateScanDir)
}
return r