歌词歌曲下载接口
最近在完成自制音乐播放器的歌曲歌词下载功能,网上搜了一圈,终于让我发现了一个可以利用的接口。在此跟大家分享一下
歌曲下载
这是一般格式
http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$
如:
http://box.zhangmen.baidu.com/x?op=12&count=1&title=背对背拥抱$$林俊杰$$$$
会返回如下的xml文本
<result>
<count>1</count>
<url>
<encode>
<![CDATA[
http://zhangmenshiting.baidu.com/data2/music/64011745/Z2ZjZWZta21fn6NndK6ap5WXcJmXZ2tvZpiUapmZaW1hYpVma5hqa5VqZ2dobm6ZYmpjaZmaaGtqaplrmW9raGFmZFqin5t1YWBjaWxubWxpY2Rpa2tnaTE$
]]>
</encode>
<decode>
<![CDATA[
64011745.mp3?xcode=eb1475fa6dc2500b26b33d843387a1805dd1398f7d940041&mid=0.05786481156501
]]>
</decode>
<type>8</type>
<lrcid>873341</lrcid>
<flag>1</flag>
</url>
<durl>
<encode>
<![CDATA[
http://zhangmenshiting2.baidu.com/data2/music/64011734/Z2ZjZWZtamxfn6NndK6ap5WXcJmXZ2tvZpiUapmZaW1hYpVma5hqa5VqZ2dobm6ZYmpjmWdrmptlY2iZZ5tqcJZmalqin5t1YWBjaWxubWxpY2Rpa2tnaTE$
]]>
</encode>
<decode>
<![CDATA[
64011734.mp3?xcode=eb1475fa6dc2500b26b33d843387a180e25cc415e2e38e47&mid=0.05786481156501
]]>
</decode>
<type>8</type>
<lrcid>873341</lrcid>
<flag>1</flag>
</durl>
<p2p>
<hash>5d6db7e87e4aaf2f6897823ff6054317f611236c</hash>
<url>
<![CDATA[ ]]>
</url>
<type>mp3</type>
<size>5744279</size>
<bitrate>192</bitrate>
</p2p>
</result>
其中主要分为count节点、url节点、durl节点和p2p节点。
count节点返回的是搜索到歌曲的数量。
url节点、durl节点都返回歌曲的下载地址。
下载地址是encode节点的内容加上decode节点的内容,如下:
url中的下载链接:
http://zhangmenshiting.baidu.com/data2/music/64011745/Z2ZjZWZta21fn6NndK6ap5WXcJmXZ2tvZpiUapmZaW1hYpVma5hqa5VqZ2dobm6ZYmpjaZmaaGtqaplrmW9raGFmZFqin5t1YWBjaWxubWxpY2Rpa2tnaTE$64011745.mp3?xcode=eb1475fa6dc2500b26b33d843387a1805dd1398f7d940041&mid=0.05786481156501
durl中的下载链接:
http://zhangmenshiting2.baidu.com/data2/music/64011734/Z2ZjZWZtamxfn6NndK6ap5WXcJmXZ2tvZpiUapmZaW1hYpVma5hqa5VqZ2dobm6ZYmpjmWdrmptlY2iZZ5tqcJZmalqin5t1YWBjaWxubWxpY2Rpa2tnaTE$64011734.mp3?xcode=eb1475fa6dc2500b26b33d843387a180e25cc415e2e38e47&mid=0.05786481156501
经比较,url的下载链接的歌名没有经过格式化,且容量较小,猜测应该是品质较低。
而durl中的下载链接的歌名经过格式化,容量也较大。建议利用durl返回的链接。
歌词下载
这是百度歌词的下载地址:
http://box.zhangmen.baidu.com/bdlrc/
需要在后面加上下载后返回的 lrcid。先去掉lrcid的后两位。如:
<lrcid>873341</lrcid>
去掉后两位为8733,然后加在下载地址后面,最后在加载完整的lrcid,最终格式如下:
http://box.zhangmen.baidu.com/bdlrc/8733/873341.lrc
下面借助OkHttp做个演示:
/**
* Created by XSX on 2016/2/14.
*/
public class MusicDownLoad {
public static OkHttpClient okHttpClient;
/**
* 下载歌曲
*
* @param title 歌名
* @param author 歌手
*/
public void downLoad(String title, String author) {
String url = "http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$";
//替换掉关键词
url = url.replace("{title}", title).replace("{author}", author);
System.out.println(url);
okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
try {
Response response = okHttpClient.newCall(request).execute();
String result = response.body().string();
System.out.println("返回的xml为:\n" + result);
parseResultXML(result);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 返回歌曲下载链接
* @param result
* @return
*/
public String parseResultXML(String result) {
try {
XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
pullParser.setInput(new StringReader(result));
List<String> encodes = new ArrayList<>();
List<String> decodes = new ArrayList<>();
int eventType = pullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String tagName=pullParser.getName();
if (tagName.equals("count")){
//判断是否找到数据
if (pullParser.nextText().equals("0")){
//无数据
return null;
}
}
if (tagName.equals("encode")) {
encodes.add(pullParser.nextText());
} else if (tagName.equals("decode")) {
decodes.add(pullParser.nextText());
}
break;
case XmlPullParser.END_TAG:
break;
}
//去下个节点
eventType = pullParser.next();
}
//下载链接都放在list中了
//取出durl中的下载链接
String encode = encodes.get(1);
String decode = decodes.get(1);
return encode+decode;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}