(说明: 这是我2007年写在cublog(China Unix)上的博客,现在把它转到这里来.)
一直很喜欢到中科大音乐网站听音乐,在教育网进入中科大的音乐网站速度超级快,另外这上面的音乐很全,质量特别好,所以推荐教育网内用户到music.ustc.edu.cn上面听音乐哦。
好是好,有时候很想把这些mp3下载下来,又一次看到一位仁兄写了一个用shell脚本下载的程序,我就仿照它用python写了一个。
首先,用firefox一类浏览器登陆music.ustc.edu.cn,找到你想要的专辑,点击[播放]。此时1个*.m3
u的文件.比如我下载了周华健的"让我喜欢让我忧"专辑的M3U文件,就保存为 "周华健-让我欢喜让我忧.m3u"
这个文件的格式为:
#EXTM3U 你现在还好吗 http://music2.ustc.edu.cn:8088/fe3e11885f53947efb6418fcc0540c5c%2F80%2Fde447c53c5adedbf28542f42cc8a8687.mp3 #EXTM3U 让我欢喜让我忧 http://music2.ustc.edu.cn:8088/27c85fd4fcd4cae342a9c1df6dc95793%2F81%2F8d8eeef5821e50b7e6696555cf789663.mp3
其实,我们要做的工作很简单,就是下载http后面那个mp3文件,然后命名为#EXTM3U 后面的那个文件名就可以了.
由于python的强大文件处理,我决定让他下载当前目录下的全部m3u文件.也就是说,你可以下载多个类似于"周华健-让我欢喜让我忧.m3u"的文件放在当前目录下,这个程序将会一个一个地,给每一张专辑建一个以专辑名为名的文件夹,然后把专辑里面的歌曲下载到对应的文件夹里面.
好了,开始吧.关键的一点,一定要对下载下来的文件进行解码处理,由于不知道它的文字编码方式,我使用了一个chardet库,专门用于检测字符的编码.由于整个程序很简单,我就直接贴在下面了:
#!c:\python25\python.exe # coding utf-8 # import os,sys import urllib,re,httplib import glob import chardet,string,re decode = '' logo = """ **************************************************************************** * Mp3 Downloader v1.0 * * download music form music.ustc.edu.cn * * 用法: 登陆http://music.ustc.edu.cn,找到想听的歌[专辑],点击“播放”,下载名* *为'music@ustc.m3u'的文件,建议使用firefox *浏览网页,否则IE会自动调用媒体播* *放器播放,无法下载m3u文件。把下载的m3u文件命名为"专辑名.m3u"的形式[专辑名 * *不要有空格!]. 本程序会自动把这些歌曲下载到当前目录下的以专辑名的文件夹名 * *字的文件夹下。可以有多个m3u共存,本程序会逐个下载,直到全部完成 * * Thank You for using! and Enjoy! * * By Yuanshl [yuanshl02_@_gmail.com] * * Form CSLab of Lanzhou University 2007/10/26 * """ print logo def tripstring(s): x = string.split(s) out = '' first = 1 for i in x: out += i #out = re.sub("'",'',out) return out for filex in glob.glob("*.m3u"): dirName = filex[:-4] f = open(filex,"r") lines = f.readlines() lineCount = len(lines) os.system("mkdir %s"%dirName) print "Downloading %s,Total %d songs"%(dirName,lineCount/2) for line in range(lineCount/2): decode = chardet.detect(lines[line*2])["encoding"] if decode != None: muName =lines[line*2][8:].decode(decode) else: muName =lines[line*2][8:].decode("gb2312") #muName=tripstring(muName) print muName muUrl = lines[line*2 + 1] muUrl = re.sub("\n",'',muUrl) muPath = re.sub(r"http://music2.ustc.edu.cn:8088/",'',muUrl)[:-5] print "Downloading Name = %s.mp3....." % muName[:-1] urlopen = urllib.URLopener() musicfile=urlopen.open("http://music2.ustc.edu.cn:8088" + "/" + muUrl) data = musicfile.read() musicfile.close() filename=muName[:-1] #decode = chardet.detect(filename)["encoding"] #print decode try: #filename = unicode(filename, 'cp936') musicfile=open("./%s/%s.mp3"%(dirName,filename.encode("gb2312")),'wb+') except: musicfile=open("./%s/%s.mp3"%(dirName,filename.encode("utf-8")),'wb+') musicfile.write(data) musicfile.close() print "Downloaded Ok!" musicfile.close() f.close() print "%d songs from %s downloaded Ok!"%(lineCount/2,dirName) print "All done! Enjoy!"程序的运行结果如下:
1,登陆中科大网站
2,运行程序:
前面说到字符的编码,这是最重要的,因为我这个程序在80%的情况下工作没有问题,但是也有少数情况下导致解码失败的情况.一直搞不懂什么原因.
最后不管你是否是一个程序员,如果你热爱音乐,喜欢到中科大听音乐又想下载的话,请给我邮件,我会在第一时间内把编译成exe的程序发给你,谢谢你的支持!