Board logo

标题: [原创代码] 【未完】Python音乐管理类 [打印本页]

作者: canyuexiaolang    时间: 2013-8-17 12:38     标题: 【未完】Python音乐管理类

做了一半。现在支持音乐的标签读取。包括ID3v1和ID3v2。本来打算继续写移动到手机或者mp3的。连上我的Windows Phone之后找不到WindowsPhone所在的盘符了=。=
  1. # -*- coding:utf-8 -*-
  2. import os
  3. import binascii
  4. class MusicManager(object):
  5.     """Python音乐管理类"""
  6.     ManagePath = os.getcwd() #音乐源文件目录
  7.     _MusicEndNameList = ['.mp3']
  8.     def seekMusic(self):
  9.         """以列表形式返回指定目录的音乐文件"""
  10.         return [filename for filename in os.listdir(self.ManagePath) if self.endsWith(filename, self._MusicEndNameList)]
  11.     def checkID3(self, filename):
  12.         """判断是否为音乐文件并判断是ID3v1还是ID3v2类型的音乐文件"""
  13.         musicOpen = open(self.ManagePath + filename, 'r')
  14.         try:
  15.             if musicOpen.read(3) == 'ID3':
  16.                 musicOpen.seek(-128, 2)
  17.                 if musicOpen.read(3) == 'TAG':
  18.                     musicOpen.close()
  19.                     return 'ID3v1'
  20.                 else:
  21.                     musicOpen.seek(0, 0)
  22.                     if int(ord(musicOpen.read(4)[-1])) == 3:
  23.                         musicOpen.close()
  24.                         return 'ID3v2'
  25.                     else:
  26.                         error
  27.         except:
  28.             musicOpen.close()
  29.             return 'illegal'
  30.     def endsWith(self, filename, endings):
  31.         """判断是否为音乐文件,返回布朗值"""
  32.         endofile = '.' + filename.split('.')[-1]
  33.         return endofile in endings
  34.     def getID3(self, filename):
  35.         """获取音乐信息的总调用"""
  36.         if self.checkID3(i) == 'ID3v1':
  37.             return self.getID3_1(filename)
  38.         elif self.checkID3(i) == 'ID3v2':
  39.             return self.getID3_2(filename)
  40.     def getID3_1(self, filename):
  41.         """获取ID3v1音乐的信息,返回字典"""
  42.         musicOpen = open(self.ManagePath + filename, 'r')
  43.         musicOpen.seek(-128, 2)
  44.         musicOpen.read(3)
  45.         return {'title':musicOpen.read(30), 'artist':musicOpen.read(30), 'album':musicOpen.read(30), 'file':self.ManagePath + filename}
  46.     def getID3_2(self, filename):
  47.         """获取ID3v2音乐的信息,返回字典"""
  48.         isend = False
  49.         musicOpen = open(self.ManagePath + filename, 'r')
  50.         musicOpen.seek(10, 1)
  51.         mark = musicOpen.read(4)
  52.         #这里的算法我写的太蛋疼了,求高手封装成函数
  53.         while isend == False:
  54.             if mark == '    ':
  55.                 isend = True
  56.                 break
  57.             if mark == 'TIT2':
  58.                 strlen = int(binascii.b2a_hex(musicOpen.read(4)), 16)
  59.                 musicOpen.read(2) #Flag
  60.                 title = musicOpen.read(strlen)
  61.                 mark = musicOpen.read(4)
  62.             elif mark == 'TPE1':
  63.                 strlen = int(binascii.b2a_hex(musicOpen.read(4)), 16)
  64.                 musicOpen.read(2) #Flag
  65.                 artist = musicOpen.read(strlen)
  66.                 mark = musicOpen.read(4)
  67.             elif mark == 'TALB':
  68.                 strlen = int(binascii.b2a_hex(musicOpen.read(4)), 16)
  69.                 musicOpen.read(2) #Flag
  70.                 album = musicOpen.read(strlen)
  71.                 mark = musicOpen.read(4)
  72.             else:
  73.                 strlen = int(binascii.b2a_hex(musicOpen.read(4)), 16)
  74.                 if not strlen == 0:
  75.                     musicOpen.read(strlen + 2)
  76.                     mark = musicOpen.read(4)
  77.                 else:
  78.                     break
  79.         return {'title':title, 'artist':artist, 'album':album, 'file':self.ManagePath + filename}
  80.     def showMusicInfo(self, musicInfoDic):
  81.         """因为字典排列顺序错乱,以一定格式打印字典"""
  82.         print 'Path    :', musicInfoDic['file']
  83.         print 'Album   :', musicInfoDic['album']
  84.         print 'Article :', musicInfoDic['artist']
  85.         print 'Title   :', musicInfoDic['title'] , '\n'
  86. #DEMO
  87. Music = MusicManager()
  88. Music.ManagePath = os.getcwd() + '\\' #当前目录,如果有\要双写。比如D:\\Music\\。最后两个“\\”一定要加上
  89. MusicList = Music.seekMusic()
  90. for i in MusicList:
  91.     Music.showMusicInfo(Music.getID3(i))
复制代码

作者: canyuexiaolang    时间: 2013-8-17 12:41

源:http://blog.ricter.info/article?id=65
话说我怎么发现Python也不上主页了 ..




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2