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
 ......

问题

  1. 部分音乐播放器来源的音乐是无法读取和修改文件信息的,这时 eyed3.load会返回空值,这种音乐在windows上都是无法编辑详细信息的,不知如何处理
  2. 暂时只能支持mp3格式