python判断重复音乐
需要安装库eyed3
pip install eyed3
思路
遍历文件,用eyed3解析音乐信息,通过音乐的长度来判断是否重复,长度是这样的数据: 333.91380609797875,对于不同的音乐来说是很难重复的,可以把它当做一个hash函数来使用了,而且相比于真正的hash函数,如同时下载了一个低清和高清版本,他仍然可以找到重复音乐
import eyed3
import os
import re
# 把不用遍历的文件和目录放在这
ignore_list = ['script.py', '其他']
count_music_by_length = {}
repeat_list_maybe = []
except_list = []
def loadMusic(file_name):
audiofile = eyed3.load(file_name)
if audiofile is not None:
# 根据歌曲长度大致判断是否重复,注意不要用int, 长度是有很多小数位的,保存为整数会有很多歌曲重复
music_length = str(audiofile.info.time_secs)
music_list = count_music_by_length.setdefault(music_length, [])
music_list.append(file_name)
if (len(music_list) > 1):
repeat_list_maybe.append(" ".join(music_list))
return True
return False
def walkFile(path):
for root, dirs, files in os.walk(path):
dirname = os.path.basename(root)
if (dirname in ignore_list):
continue
print("\n-----当前目录", dirname)
# 遍历文件
for file in files:
if (file in ignore_list):
continue
try :
file_path = os.path.join(root, file)
# 暂时只能支持mp3格式
if re.search(r'\.(mp|MP)3$', file):
if not loadMusic(file_path):
except_list.append("eyed3.load 加载失败:" + file_path)
except Exception as e:
except_list.append("未知错误:"+ file + " 错误:" + str(e))
print("-----end-----", dirname)
if __name__ == '__main__':
walkFile('./')
print("可能重复的音乐:\n", "\n".join(repeat_list_maybe))
运行结果
可能重复的音乐:
./齊豫 - 欲水.mp3 ./齐豫 - 欲水.MP3
./韩红,林俊杰 - 飞云之下.mp3 ./music.ghpym.com\飞云之下 - 韩红&林俊杰.mp3
......
问题
- 部分音乐播放器来源的音乐是无法读取和修改文件信息的,这时 eyed3.load会返回空值,这种音乐在windows上都是无法编辑详细信息的,不知如何处理
- 暂时只能支持mp3格式