package com.ringtone.music; import java.net.URLEncoder; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.content.Context; import android.os.Handler; import android.text.TextUtils; public class SkreemrMusicSearcher implements IMusicSearcher { private static final String URL_SEARCH = "http://www.skreemr.com/results.jsp?q="; private static final Pattern PATTERN_BLOCK = Pattern.compile("<\\!-- result table begins -->(.*?)<\\!-- result table ends -->", Pattern.DOTALL); private static final Pattern PATTERN = Pattern.compile( "onclick=\"javascript:pageTracker._trackPageview\\(\'/clicks.*?>" + "(.*?)</a>.*?" + // 1 "soundFile=(.*?)\'.*?" + // 2 "<td>mp3\\s*[-].*?[-].*?[-](.*?)(mb|kb)" // 3 , Pattern.DOTALL); int mStart; String mSearchUrl; boolean mDone; public SkreemrMusicSearcher() { } @Override public ArrayList<MusicInfo> getNextResultList(Context context) { if (mDone) return new ArrayList<MusicInfo>(); if (mStart > 0) { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { String url = getNextUrl(); Utils.D("URL = " + url); String html = NetUtils.fetchHtmlPage(MusicSearcherFactory.ID_SKREEMR, url, "UTF-8"); if (TextUtils.isEmpty(html)) return null; ArrayList<MusicInfo> musicList = getMusicInfoListFromHtml(html); if (musicList.size() > 0) { if (musicList.size() < 10) { mDone = true; } mStart += musicList.size(); } return musicList; } catch (Exception e) { e.printStackTrace(); return null; } } private String getNextUrl() { return mStart == 0 ? mSearchUrl : mSearchUrl + "&l=10&s=" + mStart; } private ArrayList<MusicInfo> getMusicInfoListFromHtml(String html) { Utils.D("+++++++++++++++"); Utils.printD(html); Utils.D("---------------"); ArrayList<MusicInfo> musicList = new ArrayList<MusicInfo>(); Matcher matcherBlock = PATTERN_BLOCK.matcher(html); while (matcherBlock.find()) { Matcher m = PATTERN.matcher(matcherBlock.group(1)); while (m.find()) { MusicInfo info = new MusicInfo(); String[] artistAndTitle = m.group(1).trim().split("-", 2); if (artistAndTitle.length == 2) { info.setArtist(artistAndTitle[0].trim()); info.setTitle(artistAndTitle[1].trim()); } else { info.setArtist(""); info.setTitle(artistAndTitle[0].trim()); } info.addDownloadUrl(m.group(2).trim().replaceAll("%3A", ":").replaceAll("%2F", "/")); String size = m.group(3).trim(); if (m.group(4).equals("kb")) { info.setDisplayFileSize(size + "K"); } else { info.setDisplayFileSize(size + "M"); } musicList.add(info); } } return musicList; } @Override public void setMusicDownloadUrl(Context context, MusicInfo info) { // TODO Auto-generated method stub } @Override public void setQuery(String query) { mStart = 0; mDone = false; mSearchUrl = URL_SEARCH + URLEncoder.encode(query); } }