抽空研究了一下百度fm的机制,发现没有想像中复杂啊。
这篇文章参考了zhangyuanwe的XBMC百度FM插件。
检查http://fm.baidu.com的源代码,在最后一部分的javascript代码段可以发现rawChannelList={...},这里即是频道列表的信息。
为方便处理,先将这段代码按照json的方式解析为python列表:
start = html.find("{", html.find("rawChannelList")) # find javascript code of the channel list urls
end = html.find(";", start)
listjson = html[start:end].strip() # cut spaces to get channel list json
#print listjson
# parse channel json
data = json.loads(listjson) # parse json
channel_id_list = []
for item in data['channel_list']:
# print "Channel Name:\t", item['channel_name'], "Category:\t", item['cate']
channel_id_list.append(item['channel_id']) # get channel id
这里截取了channel_name和channel_id标签,后者用来找到该频道的地址。百度FM的频道格式为http://fm.baidu.com/dev/api/?tn=playlist&format=json&id=,这里的id即是channel_id的内容。将上面的网址补全,用urlopen打开并读取,即可得到频道列表的json数据。
上图中有用数据只有channel_id和channel_name,我们需要使用channel_id来补全http://music.baidu.com/data/music/fmlink?type=mp3&rate=320&songIds=以得到真正的歌曲列表。同样,这是一个json格式的数据,解析后得到:
这里面就是我们想要得到的数据了,尤其是songLink,它即是在线播放地址,也可以用于下载地址。
如果开发更为完备的应用,应该获取上面的其他信息。
把这些信息进行组织,可以形成歌单,如获取歌名、图片、歌词等,存储到文件里,可以由mplayer这样支持流媒体的播放器进行播放。
这是我下载的结果: