Android获取百度音乐下载音乐和歌词下载链接
首先,你必须通过以下连接下载歌曲:
http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$
能够获取一个xml文件通过解析xml文件就能够读取到音乐下载的地址和歌词下载的地址。
部分代码:
String title = "六月的雨";
String singer = "胡歌";
String url = "http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$"
url=url.replace("{title}", URLEncoder.encode(title, "utf-8"));
//将String字符串转码
if(singer == null) {
url=url.replace("$${author}$$$$", "");
}else {
url=url.replace("{author}", URLEncoder.encode(singer, "utf-8"));
}
以下这部分是依据url地址,下载xml文件的代码:
public static InputStream downLoad(String urlStr) {
//依据网络地址获取输入流
InputStream inputStream = null;
try {
URL url = new URL(urlStr);
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
urlConn.setRequestMethod("GET");
urlConn.setConnectTimeout(10000);
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
//urlConn.setUseCaches(true);
urlConn.connect();
System.out.println("UrlCode:"+urlConn.getResponseCode());
if(urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
System.out.println("请求失败");
}else {
System.out.println("请求成功 ");
}
inputStream = urlConn.getInputStream();
}catch(Exception e) {
e.printStackTrace();
}
return inputStream;
}
public static String downLoadTextFile(String url) {
StringBuffer sb = new StringBuffer();
BufferedReader buffer = null;
InputStream instream = null;
String line=null;
try {
instream = downLoad(url);
buffer = new BufferedReader(new InputStreamReader(instream,"GB2312"));
while((line = buffer.readLine()) != null){
System.out.println(line);
sb.append(line+"\n");
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
buffer.close();
instream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
下载的XML文件例如以下:
<<result>
<count>1</count>
<url>
<encode>
<![CDATA[
http://zhangmenshiting.baidu.com/data2/music/35447544/ZGdnaGxra2xfn6NndK6ap5WXcJppZ2ppZ2aWaWaXnWthlJSWmphucGJklZaWmJiakmlplpZuZ5xkaZZramdtbGFmbFqin5t1YWBnamVtcGhpaGhpa21rcTE$
]]>
</encode>
<decode>
<![CDATA[
35447544.mp3?xcode=f413164c51af30babeb7812bbababa76ba80d37c75164049&mid=0.46079086556749
]]>
</decode>
<type>8</type>
<lrcid></lrcid>
<flag>1</flag>
</url>
<durl>
<encode>
<![CDATA[
http://zhangmenshiting2.baidu.com/data2/music/35447547/ZGdnaGxra29fn6NndK6ap5WXcJppZ2ppZ2aWaWaXnWthlJSWmphucGJklZaWmJiakmlpZZaYZ2pnY2xobm1wbpOTaFqin5t1YWBnamVtcGhpaGhpa21rcTE$
]]>
</encode>
<decode>
<![CDATA[
35447547.mp3?
xcode=f413164c51af30babeb7812bbababa761ab0261949796ba5&mid=0.46079086556749
]]>
</decode>
<type>8</type>
<lrcid>35220</lrcid>
<flag>1</flag>
</durl>
<p2p>
<hash>9d1c20c4d3055f25acb6b61d727cafcfae096519</hash>
<url>
<![CDATA[ ]]>
</url>
<type>mp3</type>
<size>5511091</size>
<bitrate>192</bitrate>
</p2p>
</result>
当中的count值为1是说返回的是一个,,encode里的值是歌曲加密后的地址,加密仅仅是对文件名称加密
的,
我们须要的仅仅是前面的路径,也就是 http://zhangmenshiting.baidu.com/data2/music/35447544/
这部分,然后复制decode 的值:
35447544.mp3?
xcode=f413164c51af30babeb7812bbababa76ba80d37c75164049&mid=0.46079086556749
把他们连接起来就是mp3的url下载地址:
http://zhangmenshiting.baidu.com/data2/music/35447544/35447544.mp3?xcode=f413164c51af30babeb7812bbababa76ba80d37c75164049&mid=0.46079086556749
http://box.zhangmen.baidu.com/bdlrc/
这个是百度lrc歌词存放地址,
xml中的lrcid就是地址可是要把它转换一下。首先
35220/100 =352.20 取小于等于352.20 的最大整数就是352,于是这首歌完整的歌词地址就出来了:
/.lrc
这部分也是网上看到的,能够到网上查到的。好像就是这么个规则
以下是解析XML文件:
//使用dom解析xml文件
public static String parasXML(InputStream inputStream) {
try {
String lrcid = null,url = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(inputStream);
Element root = dom.getDocumentElement();
Node count = root.getFirstChild();
NodeList items = root.getElementsByTagName("url");
if(items.getLength() <= 0) {
System.out.println("歌曲未找到");
return null;
}else {
Element urlNode = (Element)items.item(0);
//System.out.println(urlNode.getTextContent());
Element lrcidNode = (Element)(urlNode.getElementsByTagName("lrcid").item(0));
Element encodeNode = (Element)urlNode.getElementsByTagName("encode").item(0);
Element decodeNode = (Element)urlNode.getElementsByTagName("decode").item(0);
if(encodeNode == null) {
System.out.println("歌曲信息为空,无法下载");
return null;
}else {
System.out.println("encode="+encodeNode.getTextContent());
}
if(lrcidNode == null) {
System.out.println("lrcid == null");
}else {
System.out.println(lrcidNode.getNodeName());
}
if("lrcid".equals(lrcidNode.getNodeName())) {
System.out.println(lrcidNode.getTextContent());
lrcid = lrcidNode.getTextContent();
}else {
System.out.println(lrcidNode.getNodeName());
}
//获取encode里的值
String temp1 = encodeNode.getTextContent();
//获取decodeNode的值
String temp2 = decodeNode.getTextContent();
StringBuffer buffer = new StringBuffer();
//接下来是将temp1和temp2进行切割解码合并在一起
String [] arrayTemp1 = temp1.split("/");
for(int i=0;i<arrayTemp1.length-1;i++) {
buffer.append(arrayTemp1[i]+"/");
}
//把解码的地址合在一起
buffer.append(temp2);
url = buffer.toString();
url = url + "##"+ lrcid;
System.out.println("xml:url="+url);
return url;
}
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
后面就能够通过##来分开url和lrcid的值从而获取对应的值
下载文件的就能够先获取InputStream然后通过这个流接口获取对应的值
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Android获取百度音乐下载音乐和歌词下载链接的更多相关文章
- Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)
Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...
- 模仿《百度音乐HD》添加到下载框动画
上次听有人说喜欢<百度音乐HD>添加到下载动画 ,我就尝试模仿了下,没想到,今天code4app(地址)也有了这个,但是 这个动画基本相同,我们的思路还是部一样的. 都可以参考 .主要关键 ...
- QQ音乐2019客户端-获取任意歌单完整歌曲列表和下载音乐文件方法
步骤 1.在web网站上搜搜任意歌单 https://y.qq.com/#type=index/ 例如:中国好声音4.5.6.7.8季 打开后显示网址: https://y.qq.com/n/yqq ...
- android快捷简单的实现音乐播放器
自己做了一个相对完整的音乐播放器,现在把播放模块提取出来,分享给大家.音乐播放器基本功能都实现了的,可能有些BUG,希望谅解. 播放器功能如下: 1.暂停,播放 2.拖动条实现,快进,快退 3.歌词同 ...
- Android应用--简、美音乐播放器增加音量控制
Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...
- C# WPF 低仿网易云音乐(PC)歌词控件
原文:C# WPF 低仿网易云音乐(PC)歌词控件 提醒:本篇博客记录了修改的过程,废话比较多,需要项目源码和看演示效果的直接拉到文章最底部~ 网易云音乐获取歌词的api地址 http://music ...
- Python爬虫全网搜索并下载音乐
现在写一篇博客总是喜欢先谈需求或者本内容的应用场景,是的,如果写出来的东西没有任何应用价值,确实也没有实际意义.今天的最早的需求是来自于如何免费[白嫖]下载全网优质音乐,我去b站上面搜索到了一个大牛做 ...
- Android命令行播放MP3音乐
/*************************************************************************** * Android命令行播放MP3音乐 * 说 ...
- Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用
Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...
随机推荐
- Linq读取XML数据
1.XML数据格式:<?xml version="1.0"?><customers> <customer> <id>ALFK ...
- 10、bitmap格式分析
说到图片,位图(Bitmap)当然是最简单的,它Windows显示图片的基本格式,其文件扩展名为*.BMP.在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图个时候才能显示出来,各种 ...
- 几款用jQuery写的h5小游戏
人人都说前端用来做游戏是一件很困难的事情,遇到这些js的逻辑性问题,是不是有点懵?其实,做完一款游戏之后就会发现,没啥难的地方,差不多都是换汤不换药,作为爱玩游戏的我,也总结收集了几款比较流行的小软件 ...
- [Angular2 Router] Resolving route data in Angular 2
From Article: RESOLVING ROUTE DATA IN ANGULAR 2 Github If you know Anuglar UI router, you must know ...
- ConcurrentLinkedQueue使用方法
它是一个基于链接节点的无界线程安全队列.该队列的元素遵循先进先出的原则.头是最先加入的,尾是最近加入的. 插入元素是追加到尾上.提取一个元素是从头提取.当多个线程共享访问一个公共 collection ...
- 【codeforces 742C】Arpa's loud Owf and Mehrdad's evil plan
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- jquery pagination分页的两种实现方式
原文链接:http://blog.csdn.net/qq_37936542/article/details/79457012 此插件是jQuery的ajax分页插件.如果你用到此插件作分页的时候,涉及 ...
- 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照
本文主要介绍String类.StringBuffer类.StringBuilder类的差别 : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...
- JAVA类(下)
我看完了Java类,与C++相比,复杂了一点.其中有类的嵌套定义即内部类,枚举类等. 我看这两节花了我很多时间.其中有一些概念还是有点难懂. 下面,我详细总结内部类与枚举类. 内部类 内部类的主要作用 ...
- .net core 下使用StackExchange的Redis库访问超时解决
原文:.net core 下使用StackExchange的Redis库访问超时解决 目录 问题:并发稍微多的情况下Redis偶尔返回超时 给出了参考网址? 结论 小备注 引用链接 问题:并发稍微多的 ...