Files
kenaito-media-picker/main.go
T
odboy 066e28a2d6 feat(core): 优化媒体文件扫描和处理功能
- 添加跳过ffprobe相关文件的逻辑,避免处理临时释放文件
- 修复图片处理中的变量引用错误
- 实现大文件指纹复用机制,避免重复全量读取计算MD5
- 新增文件头尾采样指纹算法,提升大文件处理性能
- 重构ffprobe内嵌资源管理,支持多平台自动选择对应版本
- 添加媒体信息数据库的指纹索引和去向跟踪功能
- 优化程序启动流程,失败时跳过媒体整理但保留图片处理
- 更新文档说明多平台ffprobe支持和构建要求
2025-03-21 21:00:59 +08:00

59 lines
1.8 KiB
Go

package main
import (
_ "embed"
"fmt"
_ "image/gif" // 导入gif支持
_ "image/jpeg" // 导入jpeg支持
_ "image/png" // 导入png支持
"kenaito-media-picker/core"
"kenaito-media-picker/store"
"kenaito-media-picker/util"
"kenaito-media-picker/vars"
"os"
"path/filepath"
"time"
)
func main() {
fmt.Println("=== 警告:该程序会改变目录结构,将在5秒后开始执行")
time.Sleep(time.Second * 5)
rootDir, err := os.Getwd()
if err != nil {
fmt.Println("=== 获取当前路径异常", err)
return
}
pickerDir := filepath.Join(rootDir, filepath.Base(rootDir)+"-picker")
vars.GlobalPickerDir = pickerDir
fmt.Printf("=== 整理输出目录(白名单): %s \n", pickerDir)
scanner := core.FileScanner{}
scanner.DoScan(rootDir)
scanner.DoFilter()
// 初始化媒体信息数据库(失败不影响整理,仅无法记录)
if err := store.Init(filepath.Join(rootDir, store.DBFileName)); err != nil {
fmt.Println("=== 初始化数据库失败(继续整理, 不记录媒体信息):", err)
}
defer store.Close()
// 释放内嵌ffprobe(按当前系统);失败只跳过媒体整理,图片照常处理
ffprobeReady := true
if len(vars.GlobalImagePathList) > 0 || len(vars.GlobalMediaPathList) > 0 {
if err := util.ReleaseFFprobe(); err != nil {
fmt.Println("=== 释放解码器失败, 视频/音频整理将跳过(图片照常处理):", err)
ffprobeReady = false
}
}
defer util.RemoveFFprobe()
if len(vars.GlobalImagePathList) > 0 {
core.DoHandleImage(pickerDir)
}
if len(vars.GlobalMediaPathList) > 0 && ffprobeReady {
core.DoHandleMedia(pickerDir)
}
// 所有移动完成后,回填文件的归类目录与去向
for src, dest := range vars.GlobalPath2DestDirMap {
if err := store.UpdateMediaDest(src, dest); err != nil {
fmt.Printf("=== 更新媒体去向失败: %s, 错误: %v\n", src, err)
}
}
}