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

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 一致。

构建编译

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/ 目录,按需解压使用

使用方法

# 双击有风险, 双击需谨慎
将 kenaito-media-picker.exe 拖拽到需要整理的文件夹内,双击运行即可

# 或命令行运行
kenaito-media-picker.exe

程序启动后有 5 秒倒计时,期间可 Ctrl+C 取消;倒计时结束后自动开始整理。

整理规则

执行后,会在当前目录生成一批以 UUID 开头命名的子目录,文件按规则移动(或复制)进去:

图片

{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}-图片_已忽略          ← 不支持格式的图片

视频 / 音频

{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 支持的视频/音频格式均可识别。

目录结构

├── 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

S
Description
媒体文件自动分类整理工具:扫描图片/视频/音频,按方向 + 分辨率 + 明暗自动归档,内置 Web 管理界面与 ffprobe 探测
Readme Apache-2.0
493 MiB
Languages
Go 60.1%
Vue 19.5%
Roff 11.6%
Python 7.8%
JavaScript 0.6%
Other 0.3%