package com.konka.music.lrc; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpGet; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import android.provider.MediaStore; import android.util.Log; public class LyricHelper { private static final String TAG = "LyricHelper"; private static final String DEFAULT_ENCODING = "gb18030"; private static final String QQ_SEARCH_BASE_URL = "http://qqmusic.qq.com/fcgi-bin/qm_getLyricId.fcg"; private static final String QQ_LYRIC_BASE_URL = "http://music.qq.com/miniportal/static/lyric/"; private static final String BAIDU_SEARCH_BASE_URL = "http://box.zhangmen.baidu.com/x?op=12&count=1"; private static final String BAIDU_LYRIC_BASE_URL = "http://box.zhangmen.baidu.com/bdlrc/"; public static boolean searchLryics(String song, String artist) { boolean result = false; String lyricPath = MusicUtils.getLyricFile(song, artist); if (lyricPath != null) { String songId = searchLyricFromQQ(song, artist); if (songId != null) { String url = buildQQLyricUrl(songId); Log.d(TAG, "search url:" + url); try { HttpResponse response = HttpManager .execute(new HttpGet(url)); if (response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { InputStream is = response.getEntity().getContent(); XmlPullParserFactory factory = XmlPullParserFactory .newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(is, DEFAULT_ENCODING); int eventType = xpp.getEventType(); String tag = ""; while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { tag = xpp.getName(); if (tag.equals("lyric")) { xpp.next(); String lycis = xpp.getText(); result = MusicUtils.saveFile(lyricPath, lycis); break; } } eventType = xpp.next(); } } } catch (Exception e1) { Log.e(TAG, "Exception", e1); } } if (!result) { // Get lyric failed from QQ String lyricId = searchLyricFromBaidu(song, artist); if (lyricId != null) { String url = buildBaiduLyricUrl(lyricId); Log.d(TAG, "search url:" + url); try { HttpResponse response = HttpManager .execute(new HttpGet(url)); if (response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { InputStream is = response.getEntity().getContent(); if (is != null) { result = MusicUtils.saveFile(lyricPath, is); } } } catch (Exception e1) { Log.e(TAG, "Exception", e1); } } } } return result; } private static String searchLyricFromQQ(String song, String artist) { String lyricID = null; String url = buildQQSearchUrl(song, artist); Log.d(TAG, "search url:" + url); try { HttpResponse response = HttpManager.execute(new HttpGet(url)); if (response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { InputStream is = response.getEntity().getContent(); XmlPullParserFactory factory = XmlPullParserFactory .newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(is, DEFAULT_ENCODING); int eventType = xpp.getEventType(); String tag = ""; while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { tag = xpp.getName(); if (tag.equals("songcount")) { xpp.next(); int count = Integer.parseInt(xpp.getText()); Log.i(TAG, "search count:" + count); if (count == 0) { break; } } else if (tag.equals("songinfo")) { final int attrSize = xpp.getAttributeCount(); for (int i = 0; i < attrSize; i++) { String attrName = xpp.getAttributeName(i); if (attrName.equalsIgnoreCase("id")) { lyricID = xpp.getAttributeValue(i); break; } } } } eventType = xpp.next(); } } } catch (Exception e1) { Log.e(TAG, "Exception", e1); } return lyricID; } private static String buildBaiduSearchUrl(String song, String artist) { if (artist != null && artist.length() > 0 && !artist.equals(MediaStore.UNKNOWN_STRING)) { StringBuilder sb = new StringBuilder(); sb.append(BAIDU_SEARCH_BASE_URL); sb.append("&title="); try { sb.append(URLEncoder.encode(song, "gbk")); sb.append("$$"); sb.append(URLEncoder.encode(artist, "gbk")); } catch (UnsupportedEncodingException e) { Log.e(TAG, "UnsupportedEncodingException", e); } sb.append("$$$$"); return sb.toString(); } return null; } private static String buildBaiduLyricUrl(String lyricId) { int id = -1; if (lyricId != null) { try { id = Integer.parseInt(lyricId); } catch (Exception e) { } } if (id > -1) { StringBuilder sb = new StringBuilder(); sb.append(BAIDU_LYRIC_BASE_URL); int tmp = id / 100; sb.append(tmp); sb.append("/"); sb.append(lyricId); sb.append(".lrc"); return sb.toString(); } return null; } private static String searchLyricFromBaidu(String song, String artist) { String lyricID = null; String url = buildBaiduSearchUrl(song, artist); Log.d(TAG, "search url:" + url); if (url != null) { try { HttpResponse response = HttpManager.execute(new HttpGet(url)); if (response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { InputStream is = response.getEntity().getContent(); XmlPullParserFactory factory = XmlPullParserFactory .newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(is, DEFAULT_ENCODING); int eventType = xpp.getEventType(); String tag = ""; while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { tag = xpp.getName(); if (tag.equals("count")) { xpp.next(); int count = Integer.parseInt(xpp.getText()); Log.i(TAG, "search count:" + count); if (count == 0) { break; } } else if (tag.equals("lrcid")) { xpp.next(); lyricID = xpp.getText(); break; } } eventType = xpp.next(); } } } catch (Exception e1) { Log.e(TAG, "Exception", e1); } } return lyricID; } private static String buildQQSearchUrl(String song, String artist) { StringBuilder sb = new StringBuilder(); sb.append(QQ_SEARCH_BASE_URL); sb.append("?name="); try { sb.append(URLEncoder.encode(song, "gb18030")); if (artist != null && artist.length() > 0 && !artist.equals(MediaStore.UNKNOWN_STRING)) { sb.append("&singer="); sb.append(URLEncoder.encode(artist, "gb18030")); } } catch (UnsupportedEncodingException e) { Log.e(TAG, "UnsupportedEncodingException", e); } sb.append("&from=qqplayer"); return sb.toString(); } private static String buildQQLyricUrl(String songId) { StringBuilder sb = new StringBuilder(); sb.append(QQ_LYRIC_BASE_URL); int length = songId.length(); String tmp = songId.substring(length - 2); sb.append(tmp); sb.append("/"); sb.append(songId); sb.append(".xml"); return sb.toString(); } }