feat: 添加动漫色情检测(WD Tagger v3),媒体库展示优化
- 新增 anime_nsfw 模块:WD Tagger v3 模型检测动漫/二次元图片 - 修复误判:当 general 评分最高时判定为安全,避免非动漫图误判 - 数据库存储四个 rating 原始分数(JSON),无需重扫即可查看 - 媒体库新增动漫色情检测列、文件路径列(支持一键复制) - 修复预览图加载占位符显示两个点的问题 - 移动文件按钮不再限制扫描完成后才显示
This commit is contained in:
@@ -23,6 +23,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"kenaito-media-picker/internal/anime_nsfw"
|
||||
"kenaito-media-picker/internal/config"
|
||||
"kenaito-media-picker/internal/mover"
|
||||
"kenaito-media-picker/internal/nsfw"
|
||||
@@ -249,7 +250,7 @@ func (s *ScanService) Cancel() error {
|
||||
|
||||
// Move 触发文件移动操作。
|
||||
// 根据 scan_log 中记录的分类结果,将文件从源路径移动到目标目录。
|
||||
// 只有在扫描完成(state == done)且当前没有任务运行时才能调用。
|
||||
// 只有在扫描完成(state == done)或 scan_log 有记录时才能调用。
|
||||
func (s *ScanService) Move() error {
|
||||
s.mu.Lock()
|
||||
|
||||
@@ -259,10 +260,14 @@ func (s *ScanService) Move() error {
|
||||
return errors.New("扫描整理正在运行中,请等待完成")
|
||||
}
|
||||
|
||||
// 必须先完成一次扫描,才有 scan_log 记录
|
||||
// 必须先完成一次扫描,或者 scan_log 有记录,才有数据可移动
|
||||
if s.state != ScanDone {
|
||||
s.mu.Unlock()
|
||||
return errors.New("请先完成扫描后再执行移动")
|
||||
// 检查 scan_log 是否有记录
|
||||
hasLog, err := s.store.HasScanLog()
|
||||
if err != nil || !hasLog {
|
||||
s.mu.Unlock()
|
||||
return errors.New("请先完成扫描后再执行移动")
|
||||
}
|
||||
}
|
||||
|
||||
// 把状态改成"运行中",清空上一次的残留信息
|
||||
@@ -681,8 +686,22 @@ func (s *ScanService) runScan(ctx context.Context, rootDir, destDir string) erro
|
||||
}
|
||||
}
|
||||
|
||||
// ---------- 第六步(可选):动漫色情识别 ----------
|
||||
// 用本机 python + WD Tagger v3 起一个本地检测服务。没装 python/onnxruntime 时跳过。
|
||||
animeNsfwDet := (*anime_nsfw.Detector)(nil)
|
||||
if cfg := config.GetAppConfig(); cfg.AnimeNSFWEnabled {
|
||||
if d, err := anime_nsfw.Start(cfg.NSFWPython, cfg.AnimeNSFWThreshold); err != nil {
|
||||
fmt.Printf("=== 动漫色情识别未启用(图片照常处理): %v\n", err)
|
||||
} else {
|
||||
animeNsfwDet = d
|
||||
defer animeNsfwDet.Stop()
|
||||
fmt.Println("=== 动漫色情识别已启用(WD Tagger v3)")
|
||||
}
|
||||
}
|
||||
|
||||
org := organize.New(pickerDir, ffprobePath, ffmpegPath, s.store, ctx)
|
||||
org.SetNSFWDetector(nsfwDet)
|
||||
org.SetAnimeNSFWDetector(animeNsfwDet)
|
||||
org.SetRotateImages(config.GetAppConfig().RotateImages)
|
||||
|
||||
// 整个"整理"分两个阶段,界面上共用一条进度条:
|
||||
|
||||
Reference in New Issue
Block a user