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 jtx on 07.05.2016.
*/
class MangaEden extends ServerBase {
public static String HOST = "http://www.mangaeden.com/";
private static String[] genre = new String[]{
"Action", "Adult",
"Adventure", "Comedy", "Doujinshi", "Drama", "Ecchi", "Fantasy",
"Gender Bender", "Harem", "Historical", "Horror", "Josei", "Martial Arts",
"Mature", "Mecha", "Mystery", "One Shot", "Psychological", "Romance",
"School Life", "Sci-fi", "Seinen", "Shoujo", "Shounen", "Slice of Life",
"Smut", "Sports", "Supernatural", "Tragedy", "Webtoons", "Yaoi",
"Yuri"
};
private static String[] genreV = new String[]{
"4e70e91bc092255ef70016f8", "4e70e92fc092255ef7001b94",
"4e70e918c092255ef700168e", "4e70e918c092255ef7001675", "4e70e928c092255ef7001a0a", "4e70e918c092255ef7001693", "4e70e91ec092255ef700175e", "4e70e918c092255ef7001676",
"4e70e921c092255ef700184b", "4e70e91fc092255ef7001783", "4e70e91ac092255ef70016d8", "4e70e919c092255ef70016a8", "4e70e920c092255ef70017de", "4e70e923c092255ef70018d0",
"4e70e91bc092255ef7001705", "4e70e922c092255ef7001877", "4e70e918c092255ef7001681", "4e70e91dc092255ef7001747", "4e70e919c092255ef70016a9", "4e70e918c092255ef7001677",
"4e70e918c092255ef7001688", "4e70e91bc092255ef7001706", "4e70e918c092255ef700168b", "4e70e918c092255ef7001667", "4e70e918c092255ef700166f", "4e70e918c092255ef700167e",
"4e70e922c092255ef700185a", "4e70e91dc092255ef700172e", "4e70e918c092255ef700166a", "4e70e918c092255ef7001672", "4e70ea70c092255ef7006d9c", "4e70e91ac092255ef70016e5",
"4e70e92ac092255ef7001a57"
};
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"
};
MangaEden(Context context) {
super(context);
this.setFlag(R.drawable.flag_en);
this.setIcon(R.drawable.mangaeden);
this.setServerName("MangaEden");
setServerID(ServerBase.MANGAEDEN);
}
@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/en/en-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());
// Status
manga.setFinished(getFirstMatchDefault("Status</h(.+?)<h", source, "").contains("Completed"));
// Author
manga.setAuthor(Util.getInstance().fromHtml(getFirstMatchDefault("Author</h4>(.+?)<h4>", source, "")).toString().trim().replaceAll("\n", ""));
// Genres
manga.setGenre((Util.getInstance().fromHtml(getFirstMatchDefault("Genres</h4>(.+?)<h4>", source, "").replace("a><a", "a>, <a")).toString().trim()));
// Chapters
Pattern pattern = Pattern.compile("<tr.+?href=\"(/en/en-manga/.+?)\".+?>(.+?)</a");
Matcher matcher = pattern.matcher(source);
ArrayList<Chapter> chapters = new ArrayList<>();
while (matcher.find()) {
/*Log.d("ME", "1: " + matcher.group(1));
Log.d("ME", "2: " + matcher.group(2));*/
chapters.add(0, new Chapter(Util.getInstance().fromHtml(matcher.group(2).replaceAll("Chapter", " Ch ")).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 pattern = Pattern.compile("<tr><td><a href=\"/en/en-manga/(.+?)\" class=\"(.+?)\">(.+?)</a>");
Matcher matcher = pattern.matcher(source);
ArrayList<Manga> mangas = new ArrayList<>();
while (matcher.find()) {
Manga manga = new Manga(getServerID(), matcher.group(3), HOST + "en/en-manga/" + matcher.group(1), matcher.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=\"(/en/en-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 == 60)
break;
}
return mangas;
}
//http://www.mangaeden.com/en/en-directory/?status=2&author=&title=&releasedType=0&released=&artist=&type=0&categoriesInc=4e70e91bc092255ef70016f8&categoriesInc=4e70e91ec092255ef700175e&page=2
@Override
public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception {
String web = HOST + "en/en-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/eng/";
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;
}
}