package com.sdsmdg.harjot.MusicDNA.lyrics;
import com.sdsmdg.harjot.MusicDNA.annotations.Reflection;
import com.sdsmdg.harjot.MusicDNA.utilities.Net;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
@Reflection
public class JLyric {
public static final String domain = "j-lyric.net";
private static final String baseUrl = "http://search.j-lyric.net/index.php?ct=0&ca=0&kl=&cl=0&ka=%1s&kt=%1s";
public static ArrayList<Lyrics> search(String query) {
ArrayList<Lyrics> results = new ArrayList<>();
Elements artistBlocks = null;
try {
Document searchPage = Jsoup.connect(String.format("http://search.j-lyric.net/index.php?ct=0&ka=&ca=0&kl=&cl=0&kt=%s", URLEncoder.encode(query, "UTF-8")))
.userAgent(Net.USER_AGENT).get();
artistBlocks = searchPage.body().select("div#lyricList .body");
} catch (IOException e) {
e.printStackTrace();
}
if (artistBlocks == null || artistBlocks.first() == null)
return results;
for(Element result: artistBlocks) {
Lyrics l = new Lyrics(Lyrics.SEARCH_ITEM);
String title = result.select("div.title > a").text();
String artist = result.select("div.status > a").text();
String url = result.select("div.title > a").attr("href");
l.setTitle(title);
l.setArtist(artist);
l.setURL(url);
l.setSource("J-Lyric");
results.add(l);
}
return results;
}
@Reflection
public static Lyrics fromMetaData(String artist, String song) {
if ((artist == null) || (song == null))
return new Lyrics(Lyrics.ERROR);
String encodedArtist;
String encodedSong;
String url;
try {
encodedArtist = URLEncoder.encode(artist, "UTF-8");
encodedSong = URLEncoder.encode(song, "UTF-8");
Document searchPage = Jsoup.connect(String.format(baseUrl, encodedArtist, encodedSong))
.userAgent(Net.USER_AGENT).get();
if (!searchPage.location().startsWith("http://search.j-lyric.net/"))
throw new IOException("Redirected to wrong domain " + searchPage.location());
Elements artistBlocks = searchPage.body().select("div#lyricList");
//@todo give all results
if (artistBlocks.first() == null) {
Lyrics lyrics = new Lyrics(Lyrics.NO_RESULT);
lyrics.setArtist(artist);
lyrics.setTitle(song);
return lyrics;
}
url = artistBlocks.first().select("div.title a").attr("href");
} catch (IOException e) {
e.printStackTrace();
return new Lyrics(Lyrics.ERROR);
}
return fromURL(url, artist, song);
}
public static Lyrics fromURL(String url, String artist, String song) {
Lyrics lyrics;
String text = null;
try {
Document lyricsPage = Jsoup.connect(url).userAgent(Net.USER_AGENT).get();
if (!lyricsPage.location().contains(domain))
throw new IOException("Redirected to wrong domain " + lyricsPage.location());
text = lyricsPage.select("p#lyricBody").html();
if (artist == null)
artist = lyricsPage.select("div.body")
.get(0).child(0).child(0).child(0).child(0).child(0).text();
if (song == null)
song = lyricsPage.select("div.caption").get(0).child(0).text();
} catch (IOException e) {
e.printStackTrace();
}
if (text == null)
lyrics = new Lyrics(Lyrics.ERROR);
else
lyrics = new Lyrics(Lyrics.POSITIVE_RESULT);
lyrics.setArtist(artist);
lyrics.setTitle(song);
lyrics.setText(text);
lyrics.setSource("J-Lyric");
lyrics.setURL(url);
return lyrics;
}
}