package music.search; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.ArrayList; import music.info.MusicInfo; public abstract class MusicSearcher { private String prefix; private String encodeStyle; public MusicSearcher(String pre, String encodeSty) { prefix = pre; encodeStyle = encodeSty; } // 获得结果页的内容,一般有多条结果 public ArrayList<MusicInfo> search(String keyword) throws Exception { String listPage = fetchHtmlPage(prefix+URLEncoder.encode(keyword), encodeStyle); return getMusicList(listPage); } // 解析搜索页 public abstract ArrayList<MusicInfo> getMusicList(String listPage) throws Exception; // 解析获得需要下载的歌的地址 public abstract void getDownloadUrl(String downloadPage, MusicInfo info); // 获得需要下载的歌的url public void fetchDownloadUrl(MusicInfo info) throws Exception { if(info.getDownloadUrl()==null || info.getDownloadUrl().equals("")) { try { getDownloadUrl(fetchHtmlPage(info.getUrl(), encodeStyle), info); } catch (IOException e) { System.out.println("fetchHtmlPage err in MusicSearcher"); e.printStackTrace(); throw new Exception(); } } } // 判断一首歌是否在list中 public static boolean inList(ArrayList<MusicInfo> list, MusicInfo music) { for(MusicInfo info: list) if(music.equals(info)) return true; return false; } // 获得link的网页内容 public static String fetchHtmlPage(String link, String coding) throws IOException { URL url = new URL(link); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"); connection.setRequestProperty("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); connection.setRequestProperty("Accept-Language", "en-us"); connection.setRequestProperty("Accept-Charset", "utf-8, iso-8859-1, utf-16, *;q=0.7"); connection.setRequestProperty("Keep-Alive", "300"); connection.setRequestProperty("Connection", "keep-alive"); connection.setConnectTimeout(20000); connection.connect(); //String cookie = connection.getHeaderField("Set-Cookie"); StringBuilder builder = new StringBuilder(1024*4); InputStreamReader is = coding != null ? new InputStreamReader(connection.getInputStream(), coding) : new InputStreamReader(connection.getInputStream()); BufferedReader reader = new BufferedReader(is); String line = null; while ((line = reader.readLine()) != null) { builder.append(line + "\n"); } try { is.close(); } catch (Exception e) { e.printStackTrace(); } return builder.toString(); } }