批量检测音频文件的MD5值并自动去除重复文件的小工具——经调教ChatGPT而成

本文中的Python代码由ChatGPT生成。经本人多次调教,终成本版。

需求/最终效果

  • 批量检测音频文件的MD5值
    • 有重复的,高亮显示
    • 按照文件的创建时间检测,先检测创建时间最早的
    • 所有MD5一致的文件中,除了创建时间最早的外,均被视为「重复」
  • 可删除重复文件

界面截图

所需环境/工具/库

  • Python
  • ffmpeg
  • mutagen

调教过程

实际共调教、测试数十次。下表仅展示相对重要项。

调教前调教后
检测包括元数据在内的文件的MD5仅检测音轨内容(不包标题、艺术家等含元数据);但不修改原始文件
没有提示哪些文件是重复的高亮显示重复的文件;并且可批量删除这些文件,仅保留创建时间最早者
文件多了可能会卡住、提示未响应多线程处理
仅在状态栏中提示了正在处理的文件,且文件名与MD5值未分列显示所有被检测的文件,并且文件名与MD5值分列展示
增加「仅查看重复项」的复选框。
列表中仅显示文件名及MD5值在列表中增加「标题」「参与创作的艺术家」「唱片集」「比特率」元数据
正在检测时,列表中无内容正在检测时,实时显示已检测的文件的信息
未展示竖向滚动条列表中文件数量多时,展示竖向滚动条
未显示文件数量检测任务完成后,显示总文件数量和重复的文件数量
增加「创建时间」一列 ,并增加排序功能
表:调教前后的功能/效果对比

本人与ChatGPT的聊天记录:

更多截图:

按照创建时间检测

完整Python代码

新版(调整布局、避免闪烁等):

该版本360可能会阻止filedialog.askdirectory() 弹窗(即点击「浏览」无法弹出对话框),但键入路径也可使用,不影响检测MD5的功能

非新版:

不去除标签(元数据)检测:

把原有的def md5_of_audio(self, filepath)及其内容(共约10余行)替换为以下内容即可。优点是速度极快,但去重效果不佳。

打包为可执行文件

在.py所在的文件夹的地址栏覆盖输入cmd后回车,键入以下命令(选其一)。

方法A——追求打开时的效率,但多文件
pyinstaller --windowed MP3_MD5.py

生成的结构:

📂 dist
└── 📂
├── MP3_MD5.exe ← 主程序
├── ffmpeg.exe ← 手动复制过来(必须)
├── mutagen/… ← 自动打包
├── 所需的DLL等支持库

方法B——仅主程序和FFmpeg,打开效率中等

打包后,同样需要手动复制ffmpeg.exe到主程序所在目录。

pyinstaller --onefile --windowed MP3MD5.py
方法C——仅一个exe文件,但打开效率最慢

提示:该方法还需提前在调用 ffmpeg 的地方使用。本人未测试成功

点击展开

1、在调用 ffmpeg 的地方使用:ffmpeg = get_ffmpeg_path()
subprocess.run([ffmpeg, "-version"])

2、将以下代码插入至py文件,大约第9行。

3、使用以下命令打包:

pyinstaller --onefile --windowed --add-binary "ffmpeg.exe;." MP3MD5.py

第三方工具或库的解释

ffmpeg

须利用ffmpeg的如下命令将 MP3 转为无标签的音频数据:
ffmpeg -y -i input.mp3 -vn -f wav output.wav
不依赖它就无法提取音频、也无法保证 MD5 是“音频一致性”的标志。
官方网站:https://ffmpeg.org/download.html(如需在此处下载,选择release full的压缩包)
  1. 访问:https://www.123912.com/s/iJ9WTd-HcRmH,下载其中的3个exe
  2. 配置环境变量:
    • 在“系统变量”中找到 Path,点击编辑、新建,添加bin的路径(标准做法,但本人测试未成功)
    • 将三个exe放置于:C:\windows\(该方法测试成功)
  3. 测试
    • CMD中运行:ffmpeg -version,若有正确输出,则代表成功。

mutagen(为读取音频文件的元数据)

mutagen 是 Python 里一个非常流行的音频标签处理库,专门用来读写各种音频文件的元数据(标签),比如 MP3、FLAC、MP4、OGG 等格式。

使用以下命令安装

注释

  • MD5:属于哈希的一种,计算速度最快。

成品工具