- 新增ReadPsdImage函数支持PSD/PSB格式图片信息读取 - 修改文件扫描逻辑,将视频处理改为媒体候选处理,使用ffprobe统一判定 - 添加对PSB格式的支持,与PSD共享相同8BPS文件头处理 - 重构handle_image.go中的图片处理逻辑,优化错误处理和记录保存 - 更新文件扫描过滤规则,支持更多图片格式并跳过数据库文件 - 添加文件MD5计算功能用于文件唯一性标识 - 修改媒体处理流程,支持音频文件识别和分类处理 - 移除废弃的视频时长转换函数和相关依赖 - 更新依赖版本并添加SQLite支持用于媒体信息存储
98 lines
2.8 KiB
Go
98 lines
2.8 KiB
Go
package core
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/redmask-hb/GoSimplePrint/goPrint"
|
||
"kenaito-media-picker/store"
|
||
"kenaito-media-picker/util"
|
||
"kenaito-media-picker/vars"
|
||
"log"
|
||
"os"
|
||
"path"
|
||
"path/filepath"
|
||
"strings"
|
||
)
|
||
|
||
type FileScanner struct {
|
||
}
|
||
|
||
func (FileScanner) DoScan(rootDir string) {
|
||
fmt.Printf("=== 开始扫描文件 \n")
|
||
if err := filepath.Walk(rootDir, visit); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
doReadFileMimeInfo()
|
||
}
|
||
|
||
func doReadFileMimeInfo() {
|
||
total := len(vars.GlobalFilePathList)
|
||
fmt.Printf("=== 文件总数: %d \n", total)
|
||
// 扫描文件mime信息
|
||
var count = 0
|
||
bar := goPrint.NewBar(100)
|
||
bar.SetNotice("=== 扫描文件Mime:")
|
||
bar.SetGraph(">")
|
||
bar.SetNoticeColor(goPrint.FontColor.Red)
|
||
for _, currentPath := range vars.GlobalFilePathList {
|
||
// mime
|
||
mt := util.ReadFileMimeInfo(currentPath)
|
||
if mt != nil {
|
||
vars.GlobalFilePath2MimeInfoMap[currentPath] = mt.String()
|
||
} else {
|
||
vars.GlobalFilePath2MimeInfoMap[currentPath] = ""
|
||
}
|
||
count = count + 1
|
||
bar.PrintBar(util.CalcPercentage(count, total))
|
||
}
|
||
bar.PrintEnd("=== Finish")
|
||
}
|
||
|
||
func (FileScanner) DoFilter() {
|
||
total := len(vars.GlobalFilePathList)
|
||
var count = 0
|
||
bar := goPrint.NewBar(100)
|
||
bar.SetNotice("=== 过滤已支持的媒体:")
|
||
bar.SetGraph(">")
|
||
for _, globalFilePath := range vars.GlobalFilePathList {
|
||
fileMime := vars.GlobalFilePath2MimeInfoMap[globalFilePath]
|
||
count = count + 1
|
||
// 图片
|
||
ext := path.Ext(globalFilePath)
|
||
if strings.Contains(fileMime, "image/") || util.IsSupportImage(ext) || strings.EqualFold(ext, ".psd") {
|
||
vars.GlobalImagePathList = append(vars.GlobalImagePathList, globalFilePath)
|
||
bar.PrintBar(util.CalcPercentage(count, total))
|
||
continue
|
||
}
|
||
// 其余作为媒体候选,由ffprobe最终判定(视频/音频/不支持),
|
||
// 只要ffmpeg支持的格式都会被识别,不再依赖扩展名白名单
|
||
if util.IsPotentialMedia(fileMime) {
|
||
vars.GlobalMediaPathList = append(vars.GlobalMediaPathList, globalFilePath)
|
||
bar.PrintBar(util.CalcPercentage(count, total))
|
||
continue
|
||
}
|
||
// 明显的非媒体文件(代码/文档/压缩包等)直接不处理
|
||
}
|
||
bar.PrintEnd("=== Finish")
|
||
}
|
||
|
||
// 定义walkFn回调函数visit
|
||
func visit(currentPath string, info os.FileInfo, err error) error {
|
||
if err != nil {
|
||
return err // 如果有错误,直接返回
|
||
}
|
||
if info.IsDir() && vars.GlobalPickerDir != "" && currentPath == vars.GlobalPickerDir {
|
||
return filepath.SkipDir // 跳过白名单目录(已整理文件的输出目录)
|
||
}
|
||
if !info.IsDir() {
|
||
if filepath.Base(currentPath) == store.DBFileName {
|
||
return nil // 跳过媒体信息数据库文件
|
||
}
|
||
vars.GlobalFilePathList = append(vars.GlobalFilePathList, currentPath)
|
||
// filename, include ext
|
||
vars.GlobalFilePath2FileNameMap[currentPath] = filepath.Base(currentPath)
|
||
// file ext
|
||
vars.GlobalFilePath2FileExtMap[currentPath] = path.Ext(currentPath)
|
||
}
|
||
return nil
|
||
}
|