- 移除固定的明暗阈值等级数组,改用动态分档机制 - 引入 neutralMargin 常量,当两分差幅小于 0.15 时视为中性图 - 修改 BrightnessName 函数,实现三分法分类:bright_N、dark_N、mid - 新增 brightnessTier 辅助函数,将占比分档到最接近的 10% - 完全透明的像素(alpha=0)不再参与明暗统计计算 - 更新错误提示信息,明暗分析失败时按中性 mid 归类 - 调整 README 文档描述,同步更新明暗分类规则说明
125 lines
7.0 KiB
Markdown
125 lines
7.0 KiB
Markdown
# kenaito-media-picker
|
||
|
||
媒体分辨率分类整理工具:一键扫描目录下所有图片与视频,按横屏 / 竖屏 / 等比和分辨率自动归类到对应子目录。
|
||
|
||
## 功能特性
|
||
|
||
- **图片 / 视频 / 音频**:扫描当前目录(递归),自动识别图片、视频与音频文件
|
||
- **标准分辨率归类**:720P、1080P、2K、2.5K、影院 2K、DCI 4K、8K 及带鱼屏(UltraWide 2K/3K/4K)等标准规格单独建目录
|
||
- **非标分辨率归类**:按像素区间(每 1024px 一档)自动归入 1K ~ 19K / 普通 / 原图(原画质)目录
|
||
- **方向区分**:横屏、竖屏、等比(正方形)分开整理,GIF 单独处理
|
||
- **明暗分类**:基于 ITU-R BT.601 亮度公式分析每张图片明暗程度,暗色(亮度 < 80)像素占比为 darkScore、亮色(亮度 > 175)像素占比为 lightScore;以两者差幅判定亮暗主导,在目录名末尾追加 `-dark_N` / `-mid` / `-bright_N`(N 为占比四舍五入到 10% 的档位)
|
||
- **音频归类**:音频文件单独归入「音频」目录
|
||
- **异常兜底**:读取失败、不支持的格式自动归入「读取异常」「已忽略」目录
|
||
- **自动整理**:无需人工干预,扫描 → 分析 → 移动一次完成,跨磁盘自动降级为复制后删除
|
||
- **全格式支持**:视频/音频以**内嵌的 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:`internal/probe/bin/ffprobe_mac`(macOS)、`internal/probe/bin/ffprobe.exe`(Windows),需提前放置(未入库,见 `.gitignore`)
|
||
- `build.sh` 按系统类型编译:**Windows** 下 `go build` 后使用 `upx` 压缩,输出 `kenaito-media-picker.exe`;**macOS / Linux** 直接构建,输出 `kenaito-media-picker`(不压缩)
|
||
- 编译所需工具(ffmpeg / upx)压缩包已放在 `doc/` 目录,按需解压使用(upx 仅 Windows 构建时需要,放置于项目根目录 `upx`)
|
||
|
||
## 使用方法
|
||
|
||
```text
|
||
# 双击有风险, 双击需谨慎
|
||
将 kenaito-media-picker.exe 拖拽到需要整理的文件夹内,双击运行即可
|
||
|
||
# 或命令行运行
|
||
kenaito-media-picker.exe
|
||
```
|
||
|
||
程序启动后有 **5 秒倒计时**,期间可 Ctrl+C 取消;倒计时结束后自动开始整理。
|
||
|
||
## 整理规则
|
||
|
||
执行后,会在当前目录生成一批以 UUID 开头命名的子目录,文件按规则移动(或复制)进去:
|
||
|
||
### 图片
|
||
|
||
```text
|
||
{uid}-图片_横屏_720P-dark_100 ← 1280×720,暗色主导
|
||
{uid}-图片_横屏_1D5KP-mid ← 1600×900,明暗均衡
|
||
{uid}-图片_横屏_1080P-bright_100 ← 1920×1080,亮色主导
|
||
{uid}-图片_横屏_2DKP-dark_70 ← 2048×1080(影院 2K)
|
||
{uid}-图片_竖屏_... ← 竖屏按同样规则(普通 / 1K~19K / 原图)
|
||
{uid}-图片_等比_... ← 等比(正方形)按同样规则
|
||
{uid}-图片_GIF ← 所有 GIF 图片
|
||
{uid}-图片_PSD ← 所有 PSD 文件
|
||
{uid}-图片_读取异常 ← 无法读取尺寸的图片
|
||
{uid}-图片_已忽略 ← 不支持格式的图片
|
||
```
|
||
|
||
### 视频 / 音频
|
||
|
||
```text
|
||
{uid}-视频_横屏_720P / 1080P / 2DKP / 2D5KP / 4KP / 4KHP / 8KP
|
||
{uid}-视频_横屏_UltraWide2KP / UltraWide3KP / UltraWide4KP
|
||
{uid}-视频_横屏_1k ~ 19k / 普通 / 原画质
|
||
{uid}-视频_竖屏_1k ~ 19k / 普通 / 原画质
|
||
{uid}-视频_等比_1k ~ 19k / 普通 / 原画质
|
||
{uid}-视频_横屏_GIF / 视频_竖屏_GIF / 视频_等比_GIF
|
||
音频 ← 所有音频文件(ffmpeg 可识别的格式)
|
||
视频_读取异常 ← mime 为视频但 ffprobe 读取失败
|
||
视频_已忽略 ← 非媒体文件或无法识别
|
||
```
|
||
|
||
> 视频时长与分辨率通过内嵌 ffprobe 读取(处理时会临时释放到当前目录、完成后自动删除);凡 ffmpeg 支持的视频/音频格式均可识别。
|
||
|
||
## 明暗评分算法
|
||
|
||
```text
|
||
brightness = 0.299×R + 0.587×G + 0.114×B (ITU-R BT.601)
|
||
darkScore = 亮度 < 80 的像素占比
|
||
lightScore = 亮度 > 175 的像素占比
|
||
```
|
||
|
||
- **判定规则**:`lightScore` 高于 `darkScore` 15 个百分点以上归 `-bright_N`,反之归 `-dark_N`;差幅不足 15% 视为中性归 `-mid`(不强制二选一)
|
||
- **档位命名**:N 为占比四舍五入到 10% 的档位(10~100),如 darkScore 0.70 → `dark_70`,表示占比命中 [N-5%, N+5%) 区间
|
||
- **透明处理**:完全透明的像素(alpha=0)不计入统计,全透明图片归 `-mid`
|
||
- **性能**:大图(>100 万像素)自动采样加速
|
||
|
||
## 目录结构
|
||
|
||
```text
|
||
├── main.go # 程序入口(装配与编排)
|
||
├── internal/
|
||
│ ├── scanner/ # 文件扫描、MIME 读取、图片/媒体候选过滤
|
||
│ ├── probe/ # 媒体探测:图片尺寸 + ffprobe 解析 + 内嵌解码器释放
|
||
│ ├── classify/ # 纯函数归类规则(方向 + 标准分辨率 + K档 + 明暗等级)
|
||
│ ├── organize/ # 整理编排:探测→归类→收集→移动→记录去向
|
||
│ ├── mover/ # 文件移动(rename / 跨盘 copy+delete)
|
||
│ ├── store/ # SQLite 媒体信息持久化
|
||
│ └── digest/ # 文件 MD5 / 指纹采样
|
||
├── doc/ # 构建依赖(ffmpeg / upx 压缩包)
|
||
└── build.sh # 编译脚本(upx 压缩)
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
- 默认使用**移动**模式,原文件会从源目录移走;同名文件跨磁盘时自动降级为复制 + 删除
|
||
- 已整理文件全部移动到 `{当前目录名}-picker` 白名单目录内,重复运行会跳过该目录,并将新文件并入已有的分类目录
|
||
- GIF 图片单独归入「图片_GIF」;GIF 视频按方向归入「视频_*_GIF」
|
||
- ffprobe 按系统内嵌(macOS/Windows),运行前释放到当前目录、结束后自动删除;若当前平台无内嵌版本,视频/音频将不处理
|
||
|
||
## License
|
||
|
||
Apache 2.0
|