package com.ringtone.music;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringEscapeUtils;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.text.TextUtils;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class BDSearcher implements IMusicSearcher {
//private static final String BASE_URL = "http://221.195.40.105:10008/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&lm=0&word=";
private static final String BASE_URL = "http://221.195.40.183/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&lm=0&word=";
private static final Pattern PATTERN = Pattern.compile(
"<tr>\\s*"+
"<td class=tdn>.*?</td>\\s*" +
"<td class=d><a href=\"(.*?)\".*?target=\"_blank\">(.*?)</a></td>\\s*" +
"<td>(.*?)</td>\\s*" +
"<td.*?</td>\\s*" +
"<td.*?</td>\\s*" +
"<td.*?</td>\\s*" +
"<td.*?</td>\\s*" +
"<td>(.*?)</td>.*?" +
"</tr>" +
""
,
Pattern.DOTALL
);
private static final Pattern PATTERN_ARTIST = Pattern.compile(
"<a href=.*?target=\"_blank\">(.*?)</a>",
Pattern.DOTALL);
private int mStart = 0;
private String mSearchUrl;
private volatile String mDownloadLink;
private volatile WebView mWebView;
private volatile boolean mReady;
private final Object mLock = new Object();
private String getNextUrl() {
return mStart == 0 ? mSearchUrl : mSearchUrl + "&pn=" + mStart;
}
private ArrayList<MusicInfo> getMusicInfoListFromHtml(String html) {
Utils.D("+++++++++++++++");
Utils.printD(html);
Utils.D("---------------");
ArrayList<MusicInfo> musicList = new ArrayList<MusicInfo>();
Matcher m = PATTERN.matcher(html);
while (m.find()) {
MusicInfo info = new MusicInfo();
info.addUrl(Utils.trimTag(m.group(1).trim()));
info.setTitle(StringEscapeUtils.unescapeHtml(Utils.trimTag(m.group(2).trim())));
info.setDisplayFileSize(Utils.trimTag(m.group(4).trim()));
Matcher m2 = PATTERN_ARTIST.matcher(m.group(3));
if (m2.find()) {
info.setArtist(StringEscapeUtils.unescapeHtml(Utils.trimTag(m2.group(1).trim())));
}
/*
System.out.println("====================");
System.out.println(matcherBlock.group(1));
System.out.println(matcherBlock.group(2));
System.out.println(matcherBlock.group(3));
System.out.println(matcherBlock.group(4));
*/
musicList.add(info);
}
return musicList;
}
@Override
public void setMusicDownloadUrl(Context context, MusicInfo info) {
mDownloadLink = null;
mReady = false;
final Activity activity = (Activity)context;
final String url = info.getUrl();
Utils.D("url: " + url);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mWebView != null)
mWebView.destroy();
mWebView = new WebView(activity);
mWebView.getSettings().setLoadsImagesAutomatically(false);
mWebView.getSettings().setBlockNetworkImage(true);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
mWebView.setWebViewClient(new FetchLinkWebViewClient());
mWebView.loadUrl(url);
Utils.D("loadUrl: " + url);
}
});
synchronized(mLock) {
while (!mReady) {
try {
mLock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
}
info.addDownloadUrl(mDownloadLink);
return;
}
}
private class MyJavaScriptInterface {
@SuppressWarnings("unused")
public void getLink(String html) {
Utils.D("getLink()");
mDownloadLink = html;
mReady = true;
synchronized(mLock) {
mLock.notify();
}
}
}
private class FetchLinkWebViewClient extends WebViewClient {
public FetchLinkWebViewClient() {
super();
}
@Override
public void onPageFinished(WebView view, String url) {
Utils.D("onPageFinished()");
view.loadUrl("javascript:window.HTMLOUT.getLink(document.getElementById(\'urla\').href);");
}
}
@Override
public void setQuery(String query) {
// TODO Auto-generated method stub
mStart = 0;
mSearchUrl = BASE_URL + URLEncoder.encode(query);
}
@Override
public ArrayList<MusicInfo> getNextResultList(Context context) {
try {
String url = getNextUrl();
Utils.D("URL = " + url);
String html = NetUtils.fetchHtmlPage(MusicSearcherFactory.ID_BAIDU, url, "gb2312");
if (TextUtils.isEmpty(html))
return null;
ArrayList<MusicInfo> musicList = getMusicInfoListFromHtml(html);
if (musicList.size() > 0) {
mStart += musicList.size();
}
return musicList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}