package ar.rulosoft.mimanganu.servers;
import android.content.Context;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import ar.rulosoft.mimanganu.R;
import ar.rulosoft.mimanganu.componentes.Chapter;
import ar.rulosoft.mimanganu.componentes.Manga;
import ar.rulosoft.mimanganu.componentes.ServerFilter;
import ar.rulosoft.mimanganu.utils.Util;
/**
* Created by Raul on 03/12/2015.
*/
class MangaEdenIt extends ServerBase {
public static String HOST = "http://www.mangaeden.com/";
private static String[] genre = new String[]{
"Avventura", "Azione", "Bara", "Commedia", "Demenziale",
"Dounshinji","Drama","Ecchi","Fantasy","Harem","Hentai",
"Horror","Josei","Magico","Mecha","Misteri","Musica",
"Psicologico","Raccolta","Romantico","Sci-Fi","Scolastico","Seinen",
"Sentimentale","Shota","Shoujo","Shounen","Sovrannaturale","Splatter",
"Sportivo","Storico","Vita Quotidiana","Yaoi","Yuri"
};
private static String[] genreV = new String[]{
"4e70ea8cc092255ef70073d3", "4e70ea8cc092255ef70073c3", "4e70ea90c092255ef70074b7", "4e70ea8cc092255ef70073d0", "4e70ea8fc092255ef7007475",
"4e70ea93c092255ef70074e4","4e70ea8cc092255ef70073f9","4e70ea8cc092255ef70073cd","4e70ea8cc092255ef70073c4","4e70ea8cc092255ef70073d1","4e70ea90c092255ef700749a",
"4e70ea8cc092255ef70073ce","4e70ea90c092255ef70074bd","4e70ea93c092255ef700751b","4e70ea8cc092255ef70073ef","4e70ea8dc092255ef700740a","4e70ea8fc092255ef7007456",
"4e70ea8ec092255ef7007439","4e70ea90c092255ef70074ae","4e70ea8cc092255ef70073c5","4e70ea8cc092255ef70073e4","4e70ea8cc092255ef70073e5","4e70ea8cc092255ef70073ea",
"4e70ea8dc092255ef7007432","4e70ea90c092255ef70074b8","4e70ea8dc092255ef7007421","4e70ea8cc092255ef70073c6","4e70ea8cc092255ef70073c7","4e70ea99c092255ef70075a3",
"4e70ea8dc092255ef7007426","4e70ea8cc092255ef70073f4","4e70ea8ec092255ef700743f","4e70ea8cc092255ef70073de","4e70ea9ac092255ef70075d1"
};
private static String[] type = new String[]{
"Japanese Manga", "Korean Manhwa", "Chinese Manhua", "Comic", "Doujinshi"
};
private static String[] typeV = new String[]{
"&type=0", "&type=1", "&type=2", "&type=3", "&type=4"
};
private static String[] status = new String[]{
"Ongoing", "Completed", "Suspended"
};
private static String[] statusV = new String[]{
"&status=1", "&status=2", "&status=0"
};
private static String[] order = new String[]{
"Front page", "Views", "Latest Chapter", "Manga Title", "Chapters"
};
private static String[] orderV = new String[]{
"", "&order=1", "&order=3", "&order=-0", "&order=2"
};
MangaEdenIt(Context context) {
super(context);
this.setFlag(R.drawable.flag_it);
this.setIcon(R.drawable.mangaeden);
this.setServerName("MangaEdentIt");
setServerID(ServerBase.MANGAEDENIT);
}
@Override
public ArrayList<Manga> getMangas() throws Exception {
return null;
}
@Override
public ArrayList<Manga> search(String term) throws Exception {
String source = getNavigatorAndFlushParameters().get("http://www.mangaeden.com/it/it-directory/?title=" + URLEncoder.encode(term, "UTF-8") + "&author=&artist=&releasedType=0&released=");
return getMangasFromSource(source);
}
@Override
public void loadChapters(Manga manga, boolean forceReload) throws Exception {
if (manga.getChapters() == null || manga.getChapters().size() == 0 || forceReload)
loadMangaInformation(manga, forceReload);
}
@Override
public void loadMangaInformation(Manga manga, boolean forceReload) throws Exception {
String source = getNavigatorAndFlushParameters().get(manga.getPath());
// Front
String image = getFirstMatchDefault("<div class=\"mangaImage2\"><img src=\"(.+?)\"", source, "");
if(image.length() > 2)
image = "http:" + image;
manga.setImages(image);
// Summary
String summary = getFirstMatchDefault("mangaDescription\">(.+?)</h",
source, defaultSynopsis).replaceAll("<.+?>", "");
manga.setSynopsis(Util.getInstance().fromHtml(summary).toString());
// Stato
manga.setFinished(getFirstMatchDefault("Stato</h(.+?)<h", source, "").contains("Completato"));
// Autor
manga.setAuthor(Util.getInstance().fromHtml(getFirstMatchDefault("Autore</h4>(.+?)<h4>", source, "")).toString().trim().replaceAll("\n", ""));
// Genere
manga.setGenre((Util.getInstance().fromHtml(getFirstMatchDefault("Genere</h4>(.+?)<h4>", source, "").replace("a><a", "a>, <a")).toString().trim()));
// Chapters
Pattern p = Pattern.compile("<tr.+?href=\"(/it/it-manga/.+?)\".+?>(.+?)</a");
Matcher matcher = p.matcher(source);
ArrayList<Chapter> chapters = new ArrayList<>();
while (matcher.find()) {
chapters.add(0, new Chapter(Util.getInstance().fromHtml(matcher.group(2).replaceAll("Capitolo", " Cap ")).toString(), HOST + matcher.group(1)));
}
manga.setChapters(chapters);
}
@Override
public String getPagesNumber(Chapter chapter, int page) {
return null;
}
@Override
public String getImageFrom(Chapter chapter, int page) throws Exception {
if (chapter.getExtra() == null || chapter.getExtra().length() < 2) {
setExtra(chapter);
}
return chapter.getExtra().split("\\|")[page];
}
private int setExtra(Chapter chapter) throws Exception {
int pages = 0;
String source = getNavigatorAndFlushParameters().get(chapter.getPath());
Pattern pattern = Pattern.compile("fs\":\\s*\"(.+?)\"");
Matcher matcher = pattern.matcher(source);
String images = "";
while (matcher.find()) {
pages++;
//Log.d("ME", "1: " + "http:" + matcher.group(1));
images = images + "|" + "http:" + matcher.group(1);
}
chapter.setExtra(images);
return pages;
}
@Override
public void chapterInit(Chapter chapter) throws Exception {
if (chapter.getExtra() == null || chapter.getExtra().length() < 2) {
chapter.setPages(setExtra(chapter));
} else
chapter.setPages(0);
}
private ArrayList<Manga> getMangasFromSource(String source) {
Pattern p = Pattern.compile("<tr><td><a href=\"/it/it-manga/(.+?)\" class=\"(.+?)\">(.+?)</a>");
Matcher m = p.matcher(source);
ArrayList<Manga> mangas = new ArrayList<>();
while (m.find()) {
Manga manga = new Manga(getServerID(), m.group(3), HOST + "it/it-manga/" + m.group(1), m.group(2).contains("close"));
mangas.add(manga);
}
return mangas;
}
private ArrayList<Manga> getMangasFromFrontpage(String source) {
String newSource = "";
try {
newSource = getFirstMatchDefault("<ul id=\"news\"(.+?)</ul>", source, "");
//Log.d("ME","nS: "+newSource);
} catch (Exception e) {
e.printStackTrace();
}
Pattern pattern1 = Pattern.compile("<img src=\"(//cdn\\.mangaeden\\.com/mangasimg/.+?)\".+?<div class=\"hottestInfo\">[\\s]*<a href=\"(/it/it-manga/[^\"<>]+?)\" class=.+?\">(.+?)</a>");
Matcher matcher1;
if (newSource.isEmpty())
matcher1 = pattern1.matcher(source);
else
matcher1 = pattern1.matcher(newSource);
ArrayList<Manga> mangas = new ArrayList<>();
int i = 0;
while (matcher1.find()) {
i++;
/*Log.d("ME", "(1): " + "http:" + matcher1.group(1));
Log.d("ME", "(2): " + matcher1.group(2));
Log.d("ME", "(3): " + matcher1.group(3));*/
Manga manga = new Manga(getServerID(), Util.getInstance().fromHtml(matcher1.group(3)).toString(), HOST + matcher1.group(2), false);
manga.setImages("http:" + matcher1.group(1));
mangas.add(manga);
//Log.d("ME", "i: " + i);
if (newSource.isEmpty())
if (i == 40)
break;
}
return mangas;
}
@Override
public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception {
String web = HOST + "it/it-directory/?author=&title=";
for (int i = 0; i < filters[3].length; i++) {
web = web + statusV[filters[3][i]];
}
for (int i = 0; i < filters[1].length; i++) {
web = web + "&categoriesInc=" + genreV[filters[1][i]];
}
for (int i = 0; i < filters[2].length; i++) {
web = web + "&categoriesExcl=" + genreV[filters[2][i]];
}
web = web + "&artist=";
for (int i = 0; i < filters[0].length; i++) {
web = web + typeV[filters[0][i]];
}
if (orderV[filters[4][0]].equals("")) {
web = "http://www.mangaeden.com/it/";
String source = getNavigatorAndFlushParameters().get(web);
return getMangasFromFrontpage(source);
} else {
web = web + orderV[filters[4][0]] + "&page=" + pageNumber;
String source = getNavigatorAndFlushParameters().get(web);
return getMangasFromSource(source);
}
}
@Override
public ServerFilter[] getServerFilters() {
return new ServerFilter[]{new ServerFilter("Type", type, ServerFilter.FilterType.MULTI),
new ServerFilter("Included Genre(s)", genre, ServerFilter.FilterType.MULTI),
new ServerFilter("Excluded Genre(s)", genre, ServerFilter.FilterType.MULTI),
new ServerFilter("Status", status, ServerFilter.FilterType.MULTI),
new ServerFilter("Order", order, ServerFilter.FilterType.SINGLE)
};
}
@Override
public boolean hasList() {
return false;
}
}