一个利用python从中科大音乐网站下载mp3的程序

时间:2021-06-11 03:57:30

    (说明: 这是我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,登陆中科大网站
一个利用python从中科大音乐网站下载mp3的程序
    2,运行程序:
一个利用python从中科大音乐网站下载mp3的程序
    前面说到字符的编码,这是最重要的,因为我这个程序在80%的情况下工作没有问题,但是也有少数情况下导致解码失败的情况.一直搞不懂什么原因.
    最后不管你是否是一个程序员,如果你热爱音乐,喜欢到中科大听音乐又想下载的话,请给我邮件,我会在第一时间内把编译成exe的程序发给你,谢谢你的支持!