package com.lq.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import com.lq.fragment.SettingFragment;
import android.content.Context;
import android.preference.PreferenceManager;
import android.util.Log;
/**
* @author lq 2013-6-1 lq2625304@gmail.com
* */
public class LyricDownloadManager {
private static final String TAG = LyricDownloadManager.class
.getSimpleName();
public static final String GB2312 = "GB2312";
public static final String UTF_8 = "utf-8";
private final int mTimeOut = 10 * 1000;
private LyricXMLParser mLyricXMLParser = new LyricXMLParser();
private URL mUrl = null;
private int mDownloadLyricId = -1;
private Context mContext = null;
public LyricDownloadManager(Context c) {
mContext = c;
}
/*
* 根据歌曲名和歌手名取得该歌的XML信息文件 返回歌词保存路径
*/
public String searchLyricFromWeb(String musicName, String singerName) {
Log.i(TAG, "下载前,歌曲名:" + musicName + ",歌手名:" + singerName);
// 传进来的如果是汉字,那么就要进行编码转化
try {
musicName = URLEncoder.encode(musicName, UTF_8);
singerName = URLEncoder.encode(singerName, UTF_8);
} catch (UnsupportedEncodingException e2) {
e2.printStackTrace();
}
// 百度音乐盒的API
String strUrl = "http://box.zhangmen.baidu.com/x?op=12&count=1&title="
+ musicName + "$$" + singerName + "$$$$";
// 生成URL
try {
mUrl = new URL(strUrl);
Log.i(TAG, "请求获取歌词信息的URL:" + mUrl);
} catch (Exception e1) {
e1.printStackTrace();
}
try {
HttpURLConnection httpConn = (HttpURLConnection) mUrl
.openConnection();
httpConn.setReadTimeout(mTimeOut);
if (httpConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
Log.i(TAG, "http连接失败");
return null;
}
httpConn.connect();
Log.i(TAG, "http连接成功");
// 将百度音乐盒的返回的输入流传递给自定义的XML解析器,解析出歌词的下载ID
mDownloadLyricId = mLyricXMLParser.parseLyricId(httpConn
.getInputStream());
httpConn.disconnect();
} catch (IOException e1) {
e1.printStackTrace();
Log.i(TAG, "http连接连接IO异常");
return null;
} catch (Exception e) {
e.printStackTrace();
Log.i(TAG, "XML解析错误");
return null;
}
return fetchLyricContent(musicName, singerName);
}
/** 根据歌词下载ID,获取网络上的歌词文本内容 */
private String fetchLyricContent(String musicName, String singerName) {
if (mDownloadLyricId == -1) {
Log.i(TAG, "未指定歌词下载ID");
return null;
}
BufferedReader br = null;
StringBuilder content = null;
String temp = null;
String lyricURL = "http://box.zhangmen.baidu.com/bdlrc/"
+ mDownloadLyricId / 100 + "/" + mDownloadLyricId + ".lrc";
Log.i(TAG, "歌词的真实下载地址:" + lyricURL);
try {
mUrl = new URL(lyricURL);
} catch (MalformedURLException e2) {
e2.printStackTrace();
}
// 获取歌词文本,存在字符串类中
try {
// 建立网络连接
br = new BufferedReader(new InputStreamReader(mUrl.openStream(),
GB2312));
if (br != null) {
content = new StringBuilder();
// 逐行获取歌词文本
while ((temp = br.readLine()) != null) {
content.append(temp);
Log.i(TAG, "<Lyric>" + temp);
}
br.close();
}
} catch (IOException e1) {
e1.printStackTrace();
Log.i(TAG, "歌词获取失败");
}
try {
musicName = URLDecoder.decode(musicName, UTF_8);
singerName = URLDecoder.decode(singerName, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (content != null) {
// 检查保存的目录是否已经创建
String folderPath = PreferenceManager.getDefaultSharedPreferences(
mContext).getString(SettingFragment.KEY_LYRIC_SAVE_PATH,
Constant.LYRIC_SAVE_FOLDER_PATH);
File savefolder = new File(folderPath);
if (!savefolder.exists()) {
savefolder.mkdirs();
}
String savePath = folderPath + musicName + "_" + singerName
+ ".lrc";
Log.i(TAG, "歌词保存路径:" + savePath);
saveLyric(content.toString(), savePath);
return savePath;
} else {
return null;
}
}
/** 将歌词保存到本地,写入外存中 */
private void saveLyric(String content, String filePath) {
// 保存到本地
File file = new File(filePath);
try {
OutputStream outstream = new FileOutputStream(file);
OutputStreamWriter out = new OutputStreamWriter(outstream);
out.write(content);
out.close();
} catch (java.io.IOException e) {
e.printStackTrace();
Log.i(TAG, "很遗憾,将歌词写入外存时发生了IO错误");
}
Log.i(TAG, "歌词保存成功");
}
}