(说明: 这是我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的程序发给你,谢谢你的支持!