refactor(probe): 统一内嵌 ffprobe 为 Windows 版本

- 删除 macOS 和非 Windows 平台的内嵌 ffprobe 实现
- 移除 build.sh 中针对不同操作系统的构建逻辑
- 更新 README.md 中关于多平台 ffprobe 内嵌的说明
- 修改 SkipNames 列表,移除对 ffprobe_mac 的跳过配置
- 将内嵌的 ffprobe 统一为 Windows 版本 (ffprobe.exe)
This commit is contained in:
2025-04-04 21:08:45 +08:00
parent 13bb195e1d
commit b812abd345
6 changed files with 13 additions and 39 deletions
+5 -5
View File
@@ -12,7 +12,7 @@
- **音频归类**:音频文件单独归入「音频」目录 - **音频归类**:音频文件单独归入「音频」目录
- **异常兜底**:读取失败、不支持的格式自动归入「读取异常」「已忽略」目录 - **异常兜底**:读取失败、不支持的格式自动归入「读取异常」「已忽略」目录
- **自动整理**:无需人工干预,扫描 → 分析 → 移动一次完成,跨磁盘自动降级为复制后删除 - **自动整理**:无需人工干预,扫描 → 分析 → 移动一次完成,跨磁盘自动降级为复制后删除
- **全格式支持**:视频/音频以**内嵌的 ffprobe**(按系统自动内嵌 macOS/Windows 对应版本)作为最终判定依据,**凡是 ffmpeg 支持的格式都能识别**,不再依赖扩展名白名单 - **全格式支持**:视频/音频以**内嵌的 ffprobe**(Windows 版)作为最终判定依据,**凡是 ffmpeg 支持的格式都能识别**,不再依赖扩展名白名单
- **媒体信息入库**:自动将文件的 MD5 与完整媒体信息(类型/宽高/时长/编码/容器等)存入根目录下的 `media-info.db`(SQLite,xorm 驱动),支持按字段查询与去重 - **媒体信息入库**:自动将文件的 MD5 与完整媒体信息(类型/宽高/时长/编码/容器等)存入根目录下的 `media-info.db`(SQLite,xorm 驱动),支持按字段查询与去重
## 支持的格式 ## 支持的格式
@@ -32,9 +32,9 @@ sh build.sh
``` ```
- 依赖 Go 1.19+(`go.mod` 指定 1.19) - 依赖 Go 1.19+(`go.mod` 指定 1.19)
- 每个平台构建时只内嵌**本平台**的 ffprobe:`internal/probe/bin/ffprobe_mac`(macOS)、`internal/probe/bin/ffprobe.exe`(Windows),需提前放置(未入库,见 `.gitignore`) - 构建时内嵌 **Windows 版 ffprobe**:`internal/probe/bin/ffprobe.exe`,需提前放置(未入库,见 `.gitignore`)
- `build.sh` 按系统类型编译:**Windows** 下 `go build` 后使用 `upx` 压缩,输出 `kenaito-media-picker.exe`;**macOS / Linux** 直接构建,输出 `kenaito-media-picker`(不压缩) - `build.sh` 在 **Windows** 下 `go build` 后使用 `upx` 压缩,输出 `kenaito-media-picker.exe`
- 编译所需工具(ffmpeg / upx)压缩包已放在 `doc/` 目录,按需解压使用(upx 仅 Windows 构建时需要,放置于项目根目录 `upx`) - 编译所需工具(ffmpeg / upx)压缩包已放在 `doc/` 目录,按需解压使用(upx 放置于项目根目录 `upx`)
## 使用方法 ## 使用方法
@@ -117,7 +117,7 @@ lightScore = 亮度 > 175 的像素占比
- 默认使用**移动**模式,原文件会从源目录移走;同名文件跨磁盘时自动降级为复制 + 删除 - 默认使用**移动**模式,原文件会从源目录移走;同名文件跨磁盘时自动降级为复制 + 删除
- 已整理文件全部移动到 `{当前目录名}-picker` 白名单目录内,重复运行会跳过该目录,并将新文件并入已有的分类目录 - 已整理文件全部移动到 `{当前目录名}-picker` 白名单目录内,重复运行会跳过该目录,并将新文件并入已有的分类目录
- GIF 图片单独归入「图片_GIF」;GIF 视频按方向归入「视频_*_GIF」 - GIF 图片单独归入「图片_GIF」;GIF 视频按方向归入「视频_*_GIF」
- ffprobe 按系统内嵌(macOS/Windows),运行前释放到当前目录、结束后自动删除;若当前平台无内嵌版本,视频/音频将不处理 - ffprobe 内嵌(Windows),运行前释放到当前目录、结束后自动删除
## License ## License
+2 -12
View File
@@ -1,23 +1,13 @@
#!/bin/sh #!/bin/sh
# 构建脚本:按系统类型选择编译方式 # 构建脚本:Windows 平台编译,go build + upx 压缩 → kenaito-media-picker.exe
# Windows (MINGW/MSYS/CYGWIN): go build + upx 压缩 → kenaito-media-picker.exe # Windows (MINGW/MSYS/CYGWIN): go build + upx 压缩
# macOS / Linux: 直接构建,不压缩 → kenaito-media-picker
set -e set -e
case "$(uname -s)" in
MINGW*|MSYS*|CYGWIN*)
echo "=== Windows: go build + upx 压缩" echo "=== Windows: go build + upx 压缩"
rm -f kenaito-media-picker.exe kenaito-media-picker-release.exe rm -f kenaito-media-picker.exe kenaito-media-picker-release.exe
go build -o kenaito-media-picker-release.exe . go build -o kenaito-media-picker-release.exe .
./upx -o kenaito-media-picker.exe kenaito-media-picker-release.exe ./upx -o kenaito-media-picker.exe kenaito-media-picker-release.exe
rm -f kenaito-media-picker-release.exe rm -f kenaito-media-picker-release.exe
;;
*)
echo "=== 非 Windows (macOS/Linux): 直接构建,不压缩"
rm -f kenaito-media-picker
go build -o kenaito-media-picker .
;;
esac
echo "=== 构建完成" echo "=== 构建完成"
@@ -1,5 +1,3 @@
//go:build windows
package probe package probe
import _ "embed" import _ "embed"
-8
View File
@@ -1,8 +0,0 @@
//go:build darwin
package probe
import _ "embed"
//go:embed bin/ffprobe_mac
var embeddedFFprobe []byte // macOS 版 ffprobe(未入库,见 .gitignore)
@@ -1,6 +0,0 @@
//go:build !darwin && !windows
package probe
// embeddedFFprobe 当前平台没有内嵌的 ffprobe
var embeddedFFprobe []byte
+1 -1
View File
@@ -28,7 +28,7 @@ func main() {
res, err := scanner.Scan(scanner.Options{ res, err := scanner.Scan(scanner.Options{
RootDir: rootDir, RootDir: rootDir,
SkipDir: pickerDir, SkipDir: pickerDir,
SkipNames: []string{store.DBFileName, probe.FFprobeExeName, "ffprobe_mac"}, SkipNames: []string{store.DBFileName, probe.FFprobeExeName},
}) })
if err != nil { if err != nil {
fmt.Println("=== 扫描失败:", err) fmt.Println("=== 扫描失败:", err)