EasyVQD/internal/web/api/config.go
2026-01-17 16:19:36 +08:00

128 lines
3.7 KiB
Go

package api
import (
"easyvqd/internal/conf"
"git.lnton.com/lnton/pkg/reason"
"github.com/gin-gonic/gin"
"github.com/ixugo/goddd/pkg/web"
"github.com/jinzhu/copier"
"github.com/pelletier/go-toml/v2"
"io"
"log/slog"
"strconv"
"sync"
)
var confMutex sync.Mutex
type ConfigAPI struct {
cfg *conf.Bootstrap
uc *Usecase
}
func registerConfig(g gin.IRouter, api ConfigAPI, handler ...gin.HandlerFunc) {
group := g.Group("/api/configs", handler...)
//group.GET("", api.getToml)
//group.PUT("", api.editToml)
group.GET("/base", web.WarpH(api.getBase))
group.PUT("/base", web.WarpH(api.editBase))
group.GET("/default", web.WarpH(api.getDefaultConfig))
}
type getBaseOutput struct {
SaveDay int32 `json:"save_day"`
}
type editBaseInput struct {
SaveDay int32 `json:"save_day"`
}
type getBaseConfigOutput struct {
FrmNum int32 `json:"frm_num"`
IsDeepLearn bool `json:"is_deep_learn"`
VqdLgtDark conf.VqdLgtDark `json:"vqd_lgt_dark"` // 亮度检测
VqdBlue conf.VqdBlue `json:"vqd_blue"` // 蓝屏检查
VqdClarity conf.VqdClarity `json:"vqd_clarity"` // 清晰度检查
VqdShark conf.VqdShark `json:"vqd_shark"` // 抖动检查
VqdFreeze conf.VqdFreeze `json:"vqd_freeze"` // 冻结检测
VqdColor conf.VqdColor `json:"vqd_color"` // 偏色检测
VqdOcclusion conf.VqdOcclusion `json:"vqd_occlusion"` // 遮挡检测
VqdNoise conf.VqdNoise `json:"vqd_noise"` // 噪声检测
VqdContrast conf.VqdContrast `json:"vqd_contrast"` // 对比度检测
VqdMosaic conf.VqdMosaic `json:"vqd_mosaic"` // 马赛克检测
VqdFlower conf.VqdFlower `json:"vqd_flower"` // 花屏检测
}
func (uc *ConfigAPI) editBase(c *gin.Context, in *editBaseInput) (any, error) {
uc.cfg.VqdConfig.SaveDay = in.SaveDay
conf.WriteConfig(uc.cfg, uc.cfg.ConfigDirPath())
return in, nil
}
func (uc *ConfigAPI) getDefaultConfig(_ *gin.Context, _ *struct{}) (getBaseConfigOutput, error) {
return getBaseConfigOutput{
FrmNum: uc.cfg.VqdConfig.FrmNum,
IsDeepLearn: uc.cfg.VqdConfig.IsDeepLearn,
VqdLgtDark: uc.cfg.VqdLgtDark,
VqdBlue: uc.cfg.VqdBlue,
VqdClarity: uc.cfg.VqdClarity,
VqdShark: uc.cfg.VqdShark,
VqdFreeze: uc.cfg.VqdFreeze,
VqdColor: uc.cfg.VqdColor,
VqdOcclusion: uc.cfg.VqdOcclusion,
VqdNoise: uc.cfg.VqdNoise,
VqdContrast: uc.cfg.VqdContrast,
VqdMosaic: uc.cfg.VqdMosaic,
VqdFlower: uc.cfg.VqdFlower,
}, nil
}
func (uc *ConfigAPI) getBase(_ *gin.Context, _ *struct{}) (getBaseOutput, error) {
confMutex.Lock()
defer confMutex.Unlock()
return getBaseOutput{
SaveDay: uc.cfg.VqdConfig.SaveDay,
}, nil
}
func (uc *ConfigAPI) getToml(c *gin.Context) {
c.Header("Content-Type", "application/toml")
if err := toml.NewEncoder(c.Writer).Encode(uc.uc.Conf); err != nil {
slog.Error("获取配置失败", "err", err)
return
}
}
func (uc *ConfigAPI) editToml(c *gin.Context) {
b, err := io.ReadAll(io.LimitReader(c.Request.Body, 1024*20))
if err != nil {
web.Fail(c, reason.ErrBadRequest.SetMsg(err.Error()))
return
}
if len(b) <= 10 {
web.Fail(c, reason.ErrBadRequest.SetMsg("错误的文件"))
return
}
data, err := strconv.Unquote(string(b))
if err != nil {
web.Fail(c, reason.ErrBadRequest.SetMsg(err.Error()))
return
}
var cfg conf.Bootstrap
if err := toml.Unmarshal([]byte(data), &cfg); err != nil {
web.Fail(c, reason.ErrBadRequest.SetMsg(err.Error()))
return
}
if err := copier.Copy(uc.uc.Conf, cfg); err != nil {
web.Fail(c, reason.ErrServer.SetMsg(err.Error()))
return
}
if err := conf.WriteConfig(uc.uc.Conf, uc.uc.Conf.ConfigDirPath()); err != nil {
web.Fail(c, reason.ErrServer.SetMsg(err.Error()))
return
}
web.Success(c, gin.H{"msg": "ok"})
}