电脑上存放了特别的歌曲,大概有2400首左右,每次通过播放器选择相应歌曲实在麻烦,于是打算自己使用Java写一个终端下的音乐播放器,我使用的ubuntu,因为java是跨平台语言,所以什么系统已经无所谓了。首先本片文章讲述歌词的获取。
网上有很多关于百度音乐,QQ音乐等的歌词获取,个人尝试了一下百度音乐,可以获取,但是却发现一个问题,获取的歌词没有我们在百度音乐网页上看到的全面,我搜过了一下 “丁当的猜不透”,结果网上的代码根本搜不到任何歌词,但是在线版百度音乐确实有,不过对于一些经典歌曲还是能够搜索到相关的歌词的。QQ音乐已经把相应接口关闭。与其使用这些没有开发的api,不如找一个开放api的歌词搜索平台,歌词迷就是其中一个。
歌词迷(http://api.geci.me/en/latest/#)提供了3种歌词检索方式,还有一个封面检索
我们为了提高歌词的准确性,采用歌曲名加歌词的方式进行搜索,api说明如下
根据歌曲名和歌手名获取歌词
-
请求地址
http://geci.me/api/lyric/:song/:artist
返回格式 JSON
-
请求方法 GET
返回数据样式
{
"count": 14,
"code": 0,
"result":
[
{"lrc": "http://s.geci.me/lrc/166/16685/1668536.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1668536, "aid": 1563419},
{"lrc": "http://s.geci.me/lrc/167/16796/1679605.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1679605, "aid": 1571906},
{"lrc": "http://s.geci.me/lrc/168/16819/1681961.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1681961, "aid": 1573814},
{"lrc": "http://s.geci.me/lrc/179/17907/1790768.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1790768, "aid": 1656038},
{"lrc": "http://s.geci.me/lrc/187/18757/1875769.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 1875769, "aid": 1718741},
{"lrc": "http://s.geci.me/lrc/226/22642/2264296.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2264296, "aid": 2003267},
{"lrc": "http://s.geci.me/lrc/228/22889/2288967.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2288967, "aid": 2020610},
{"lrc": "http://s.geci.me/lrc/233/23323/2332322.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2332322, "aid": 2051678},
{"lrc": "http://s.geci.me/lrc/283/28376/2837689.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 2837689, "aid": 2412704},
{"lrc": "http://s.geci.me/lrc/311/31116/3111659.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3111659, "aid": 2607041},
{"lrc": "http://s.geci.me/lrc/316/31663/3166350.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3166350, "aid": 2647055},
{"lrc": "http://s.geci.me/lrc/318/31803/3180339.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3180339, "aid": 2657468},
{"lrc": "http://s.geci.me/lrc/377/37740/3774083.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3774083, "aid": 3093833},
{"lrc": "http://s.geci.me/lrc/386/38612/3861244.lrc", "song": "\u6d77\u9614\u5929\u7a7a", "artist": "Beyond", "sid": 3861244, "aid": 3161846}
]
}
下面我们就开始具体实现歌词地址捕获:
第一步:定义相应的bean
由返回结果可以确定相应bean的定义,为什么要使用这个bean呢,首先操作方便,其次便于扩展,最后可以使用Gson方便的将json转换为bean,定义bean是变量名字请与返回数据名字保持一致,代码如下:
package honest.playmusic.bean;
import java.util.List;
/**
* 歌词
* @author 李跃东
* @mail androiddevelop@qq.com
* @date 2013-11-8
*/
public class OnlineLrc {
public int count;
public int code ;
public List<LrcInfo> result;
public void setCount(int count) {
this.count = count;
}
public void setCode(int code) {
this.code = code;
}
public void setResult(List<LrcInfo> result) {
this.result = result;
}
public int getCount() {
return count;
}
public int getCode() {
return code;
}
public List<LrcInfo> getResult() {
return result;
}
}
package honest.playmusic.bean;
/**
* 歌曲信息(名字,绝对路径,播放时长,总帧数)
* @author 李跃东
* @mail androiddevelop@qq.com
* @date 2013-11-8
*/
public class Music {
private String musicName; //音乐名字
private String musicAuthor; //歌手
private String musicAbsolutePath; //音乐绝对路径
private long musicTime; //音乐总时长 (ms)
private int musicFrameNumber; // 音乐总帧数
public String getMusicName() {
return musicName;
}
public void setMusicName(String musicName) {
this.musicName = musicName;
}
public String getMusicAuthor() {
return musicAuthor;
}
public void setMusicAuthor(String musicAuthor) {
this.musicAuthor = musicAuthor;
}
public String getMusicAbsolutePath() {
return musicAbsolutePath;
}
public void setMusicAbsolutePath(String musicAbsolutePath) {
this.musicAbsolutePath = musicAbsolutePath;
}
public long getMusicTime() {
return musicTime;
}
public void setMusicTime(long musicTime) {
this.musicTime = musicTime;
}
public int getMusicFrameNumber() {
return musicFrameNumber;
}
public void setMusicFrameNumber(int musicFrameNumber) {
this.musicFrameNumber = musicFrameNumber;
}
}
第二步:获取在线歌词
获取在线歌词只用按照官方的请求地址,使用java网络编程的相关操作
/**
* 网上得到歌词
* @param title 歌曲名
* @param singer 歌手
* @throws IOException
* @throws MalformedURLException
*/
public OnlineLrc getOnlineLrc(String title,String singer) throws MalformedURLException, IOException{
String musicAddress="http://geci.me/api/lyric/"+title+"/"+singer;
URLConnection connection=new URL(musicAddress).openConnection();
BufferedReader in=new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer res=new StringBuffer("");
String tmp;
while((tmp=in.readLine())!=null){
res.append(tmp);
}
OnlineLrc lrc=new OnlineLrc();
Gson gson=new Gson();
lrc=gson.fromJson(res.toString(), new TypeToken<OnlineLrc>(){}.getType());
return lrc;
}
第三步:提取json数据中的地址
这里我们使用一个开源的数据转化项目gson,它的官方地址http://code.google.com/p/google-gson,gson可以方便的进行json与bean之间的转换,将得到的json转换为bean,然后进行简单的操作即可将所有的歌词地址提取出来,代码如下:
/**
* 获取歌词所有地址
* @param title 歌曲名
* @param singer 歌手
* @throws IOException
* @throws MalformedURLException
*/
public List<String> getMusicLrc(String title,String singer) throws MalformedURLException, IOException{
List<String> address=new ArrayList<String>();
OnlineLrc onlineLrc=getOnlineLrc(title, singer);
List<Lrc> lrc=onlineLrc.getResult();
for(int i=0;i<lrc.size();i++)
address.add(lrc.get(i).getLrc());
return address;
}
这样我们就得到了所有歌曲的歌词地址了,测试一下
public static void main(String[] args) {
try {
List<String> res=new OnlineLrcManager().getMusicLrc("猜不透","丁当");
for(int i=0;i<res.size();i++)
System.out.println(res.get(i));
}catch (Exception e) {
e.printStackTrace();
}
}
结果如下:
http://s.geci.me/lrc/382/38295/3829595.lrc
http://s.geci.me/lrc/423/42360/4236045.lrc
下载一个,打开查看:
[ti:猜不透]
[ar:丁当]
[al:《我爱上的》]
[by:百岛@UKOO]
[00:00.00]
[00:02.00]丁当 - 猜不透
[00:04.00]专辑:《我爱上的》
[00:06.00]作词:黄婷
[00:08.00]作曲:林迈可
[00:10.00]编曲:林迈可
[00:12.00]LRC:百岛@UKOO音乐论坛
[00:14.00]@网络支持:UKOO www.ukoo.net@
[00:16.00]
[00:26.69]猜不透 你最近是好是坏更沉默
[00:38.13]我也不想去追问 太多
[00:45.52]让试探为彼此的心 上了锁
[00:53.55]
[00:54.43]猜不透 相处会比分开还寂寞
[01:05.48]两个人都只是得过且过
[01:12.37]无法感受每次触摸 是真的 是热的
[01:24.47]
[01:25.27]如果忽远忽近的洒脱 是你要的*
[01:32.07]那我宁愿回到一个人生活
[01:39.72]如果忽冷忽热的温柔 是你的借口
[01:46.70]那我宁愿对你从没认真过
[01:53.99]
[02:03.02]猜不透 相处会比分开还寂寞
[02:14.01]两个人都只是得过且过
[02:21.09]无法感受每次触摸 是真的 是热的
[02:33.39]
[02:34.19]如果忽远忽近的洒脱 是你要的*
[02:40.89]那我宁愿回到一个人生活
[02:47.59]如果忽冷忽热的温柔 是你的借口
[02:54.59]那我宁愿对你从没认真过
[03:01.37]
[03:01.95]如果忽远忽近的洒脱 是你要的*
[03:08.75]那我宁愿回到一个人生活
[03:15.65]如果忽冷忽热的温柔 是你的借口
[03:22.49]那我宁愿对你从没认真过
[03:29.03]
[03:29.44]到底这感觉谁对谁错
[03:33.58]我已不想追究
[03:36.26]越是在乎的人越是猜不透
[03:44.70]
歌词获取结束,下一篇将会继续讲解 音乐播放器(2)--歌曲数据存放
转载请注明原帖地址:http://blog.csdn.net/dliyuedong/article/details/14527067