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

116 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# kenaito-media-picker
媒体分辨率分类整理工具:一键扫描目录下所有图片与视频,按横屏 / 竖屏 / 等比和分辨率自动归类到对应子目录。
## 功能特性
- **图片 / 视频 / 音频**:扫描当前目录(递归),自动识别图片、视频与音频文件
- **标准分辨率归类**:720P、1080P、2K、2.5K、影院 2K、DCI 4K、8K 及带鱼屏(UltraWide 2K/3K/4K)等标准规格单独建目录
- **非标分辨率归类**:按像素区间自动归入 1K ~ 9K / 普通 / 原图(原画质)目录
- **方向区分**:横屏、竖屏、等比(正方形)分开整理,GIF 单独处理
- **音频归类**:音频文件单独归入「音频」目录
- **异常兜底**:读取失败、不支持的格式自动归入「读取异常」「已忽略」目录
- **自动整理**:无需人工干预,扫描 → 分析 → 移动一次完成,跨磁盘自动降级为复制后删除
- **全格式支持**:视频/音频以**内嵌的 ffprobe**(按系统自动内嵌 macOS/Windows 对应版本)作为最终判定依据,**凡是 ffmpeg 支持的格式都能识别**,不再依赖扩展名白名单
- **媒体信息入库**:自动将文件的 MD5 与完整媒体信息(类型/宽高/时长/编码/容器等)存入根目录下的 `media-info.db`(SQLite,xorm 驱动),支持按字段查询与去重
## 支持的格式
| 类型 | 格式 |
|------|------|
| 图片 | JPG / JPEG / JPE / JFIF / PNG / GIF / BMP / WEBP / PSB,PSD 单独归入「图片_PSD」;Go 无法解码的图片格式(如 TIFF)由 ffprobe 兜底 |
| 视频 | 凡 ffmpeg 支持的容器/编码均可识别(MP4 / MKV / AVI / MOV / TS / FLV / WMV / RM / RMVB / WEBM / M2TS 等),以 ffprobe 探测结果为准 |
| 音频 | 凡 ffmpeg 支持的音频(MP3 / WAV / FLAC / AAC / M4A / OGG / WMA 等)归入「音频」目录 |
> 判断依据:图片按文件 MIME + 扩展名识别(扩展名大小写不敏感);视频/音频由 ffprobe 读取媒体流判定,支持范围与 ffmpeg 一致。
## 构建编译
```shell
sh build.sh
```
- 依赖 Go 1.19+(`go.mod` 指定 1.19)
- 每个平台构建时只内嵌**本平台**的 ffprobe:`vars/bin/ffprobe_mac`(macOS)、`vars/bin/ffprobe.exe`(Windows),需提前放置(未入库,见 `.gitignore`)
- `build.sh` 使用 `upx` 压缩产物,输出 `kenaito-media-picker.exe`(Windows 单文件)
- 编译所需工具(ffmpeg / upx)压缩包已放在 `doc/` 目录,按需解压使用
## 使用方法
```text
# 双击有风险, 双击需谨慎
将 kenaito-media-picker.exe 拖拽到需要整理的文件夹内,双击运行即可
# 或命令行运行
kenaito-media-picker.exe
```
程序启动后有 **5 秒倒计时**,期间可 Ctrl+C 取消;倒计时结束后自动开始整理。
## 整理规则
执行后,会在当前目录生成一批以 UUID 开头命名的子目录,文件按规则移动(或复制)进去:
### 图片
```text
{uid}-图片_横屏_720P ← 1280×720
{uid}-图片_横屏_1D5KP ← 1600×900
{uid}-图片_横屏_1080P ← 1920×1080
{uid}-图片_横屏_2DKP ← 2048×1080(影院 2K)
{uid}-图片_横屏_2D5KP ← 2560×1440(2.5K)
{uid}-图片_横屏_ultraWide2KP ← 2560×1080(带鱼屏)
{uid}-图片_横屏_ultraWide3KP ← 3440×1440(带鱼屏)
{uid}-图片_横屏_ultraWide4KP ← 5120×2160(带鱼屏)
{uid}-图片_横屏_4KP ← 3840×2160
{uid}-图片_横屏_4KHP ← 4096×2160(DCI 4K)
{uid}-图片_横屏_8KP ← 7680×4320
{uid}-图片_横屏_1K ~ 9K ← 非标规格按像素区间
{uid}-图片_横屏_普通 ← 像素不足 1000
{uid}-图片_横屏_原图 ← 像素 ≥ 10000
{uid}-图片_竖屏_... ← 竖屏按同样规则(普通 / 1K~9K / 原图)
{uid}-图片_等比_... ← 等比(正方形)按同样规则
{uid}-图片_GIF ← 所有 GIF 图片
{uid}-图片_PSD ← 所有 PSD 文件
{uid}-图片_读取异常 ← 无法读取尺寸的图片
{uid}-图片_已忽略 ← 不支持格式的图片
```
### 视频 / 音频
```text
{uid}-视频_横屏_720P / 1080P / 2DKP / 2D5KP / 4KP / 4KHP / 8KP
{uid}-视频_横屏_UltraWide2KP / UltraWide3KP / UltraWide4KP
{uid}-视频_横屏_1k ~ 9k / 普通 / 原画质
{uid}-视频_竖屏_1k ~ 9k / 普通 / 原画质
{uid}-视频_等比_1k ~ 9k / 普通 / 原画质
{uid}-视频_横屏_GIF / 视频_竖屏_GIF / 视频_等比_GIF
音频 ← 所有音频文件(ffmpeg 可识别的格式)
视频_读取异常 ← mime 为视频但 ffprobe 读取失败
已忽略 ← 非媒体文件或无法识别
```
> 视频时长与分辨率通过内嵌 ffprobe 读取(处理时会临时释放到当前目录、完成后自动删除);凡 ffmpeg 支持的视频/音频格式均可识别。
## 目录结构
```text
├── main.go # 程序入口(扫描 → 过滤 → 图片/媒体处理)
├── core/ # 核心逻辑:文件扫描、MIME 过滤、图片/视频/音频分组与移动
├── util/ # 工具:MIME 识别、图片尺寸读取、ffprobe 封装、文件移动
├── vars/ # 全局状态 + 按系统内嵌 ffprobe(go:embed,二进制在 vars/bin/)
├── doc/ # 构建依赖(ffmpeg / upx 压缩包)
└── build.sh # 编译脚本(upx 压缩)
```
## 注意事项
- 默认使用**移动**模式,原文件会从源目录移走;同名文件跨磁盘时自动降级为复制 + 删除
- 已整理文件全部移动到 `{当前目录名}-picker` 白名单目录内,重复运行会跳过该目录,并将新文件并入已有的分类目录
- GIF 图片单独归入「图片_GIF」;GIF 视频按方向归入「视频_*_GIF」
- ffprobe 按系统内嵌(macOS/Windows),运行前释放到当前目录、结束后自动删除;若当前平台无内嵌版本,视频/音频将不处理
## License
Apache 2.0