package com.sdsmdg.harjot.MusicDNA.lyrics; import com.sdsmdg.harjot.MusicDNA.annotations.Reflection; import com.sdsmdg.harjot.MusicDNA.utilities.Net; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import static com.sdsmdg.harjot.MusicDNA.lyrics.Lyrics.ERROR; import static com.sdsmdg.harjot.MusicDNA.lyrics.Lyrics.NO_RESULT; import static com.sdsmdg.harjot.MusicDNA.lyrics.Lyrics.POSITIVE_RESULT; @Reflection public class MetalArchives { public static final String domain = "metal-archives.com"; @Reflection public static Lyrics fromMetaData(String artist, String title) { String baseURL = "http://www.metal-archives.com/search/ajax-advanced/searching/songs/?bandName=%s&songTitle=%s&releaseType[]=1&exactSongMatch=1&exactBandMatch=1"; String urlArtist = artist.replaceAll("\\s","+"); String urlTitle = title.replaceAll("\\s","+"); String url; String text; try { String response = Net.getUrlAsString(String.format(baseURL, urlArtist, urlTitle)); JsonObject jsonResponse = new JsonParser().parse(response).getAsJsonObject(); JsonArray track = jsonResponse.getAsJsonArray("aaData").get(0).getAsJsonArray(); StringBuilder builder = new StringBuilder(); for (int i = 0; i < track.size(); i++) builder.append(track.get(i).getAsString()); Document trackDocument = Jsoup.parse(builder.toString()); url = trackDocument.getElementsByTag("a").get(1).attr("href"); String id = trackDocument.getElementsByClass("viewLyrics").get(0).id().substring(11); text = Jsoup.connect("http://www.metal-archives.com/release/ajax-view-lyrics/id/"+id) .get().body().html(); } catch (JsonParseException | IndexOutOfBoundsException e) { return new Lyrics(NO_RESULT); } catch (Exception e) { return new Lyrics(ERROR); } Lyrics lyrics = new Lyrics(POSITIVE_RESULT); lyrics.setArtist(artist); lyrics.setTitle(title); lyrics.setText(text); lyrics.setSource(domain); lyrics.setURL(url); return lyrics; } @Reflection public static Lyrics fromURL(String url, String artist, String title){ // TODO: support metal-archives URL return new Lyrics(NO_RESULT); } }