package ar.rulosoft.mimanganu.servers;
import android.content.Context;
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;
class MangaFox extends ServerBase {
private static final String[] genre = {
"All",
"Action", "Adult", "Adventure", "Comedy", "Doujinshi", "Drama", "Ecchi",
"Fantasy", "Gender Bender", "Harem", "Historical", "Horror", "Josei", "Martial Arts",
"Mecha", "Mystery", "One Shot", "Psychological", "Romance", "School Life", "Sci-fi",
"Seinen", "Shoujo", "Shoujo Ai", "Shounen", "Shounen Ai", "Slice of Life", "Smut", "Sports",
"Supernatural", "Tragedy", "Webtoons", "Yaoi", "Yuri"
};
private static final String PATTERN_SERIE = "<li><a href=\"(.+?)\" rel=\"\\d+\" class=\"series_preview manga_(close|open)\">(.+?)</a></li>";
private static final String SEGMENTO = "<div class=\"manga_list\">(.+?)<div class=\"clear gap\">";
private static final String PATRON_PORTADA = "<div class=\"cover\">.+?src=\"(.+?)\"";
private static final String PATRON_SINOPSIS = "<p class=\"summary\">(.+?)</p>";
private static final String PATTERN_CAPITULOS = "<h\\d>[\\s]+<a href=\"([^\"]+)\".+?>([^<]+)([^\"]+<span class=\"title nowrap\">(.+?)<)?";
private static final String PATRON_LAST = "(\\d+)</option> <option value=\"0\"";
private static String HOST = "http://mangafox.me";
private static String genreVV = "/directory/";
/*private static String[] type = new String[]{
"Any", "Japanese Manga", "Korean Manhwa", "Chinese Manhua"
};
private static String[] typeV = new String[]{
"&type=", "&type=1", "&type=2", "&type=3"
};
private static String[] status = new String[]{
"Either", "Ongoing", "Completed"
};
private static String[] statusV = new String[]{
"&is_completed=", "&is_completed=1", "&is_completed=0"
};*/
private static String[] order = new String[]{
"Popularity", "Rating", "Latest Chapter", "Alphabetical"
};
private static String[] orderV = new String[]{
"", "?rating", "?latest", "?az"
};
/*private static String[] order = new String[]{
"Views", "Rating", "Latest Chapter", "Manga Title", "Chapters"
};
private static String[] orderV = new String[]{
"&sort=views", "&sort=rating", "&sort=last_chapter_time", "&sort=name&order=az", "&sort=total_chapters&order=za"
};*/
MangaFox(Context context) {
super(context);
this.setFlag(R.drawable.flag_en);
this.setIcon(R.drawable.mangafox_icon);
this.setServerName("MangaFox");
setServerID(ServerBase.MANGAFOX);
}
@Override
public ArrayList<Manga> getMangas() throws Exception {
ArrayList<Manga> mangas = new ArrayList<>();
String data = getNavigatorAndFlushParameters().getWithTimeout("http://mangafox.me/manga/");
data = getFirstMatch(SEGMENTO, data, "no se ha obtenido el segmento");
Pattern p = Pattern.compile(PATTERN_SERIE);
Matcher m = p.matcher(data);
while (m.find()) {
Manga manga = new Manga(ServerBase.MANGAFOX, m.group(3), m.group(1), false);
if (m.group(2).length() > 4) {
manga.setFinished(true);
}
mangas.add(manga);
}
return mangas;
}
@Override
public void loadChapters(Manga manga, boolean forceReload) throws Exception {
if (manga.getChapters().size() == 0 || forceReload) {
Pattern p;
Matcher m;
String data = getNavigatorAndFlushParameters().getWithTimeout((manga.getPath()));
// Title
manga.setImages(getFirstMatchDefault(PATRON_PORTADA, data, ""));
// Summary
manga.setSynopsis(getFirstMatchDefault(PATRON_SINOPSIS, data, defaultSynopsis));
manga.setFinished(data.contains("<h\\d>Status:</h\\d> <span> Completed"));
// Author
manga.setAuthor(getFirstMatchDefault("\"/search/author/.+?>(.+?)<", data, ""));
// Genre
manga.setGenre(Util.getInstance().fromHtml(getFirstMatchDefault("(<a href=\"http://mangafox.me/search/genres/.+?</td>)", data, "")).toString());
// Chapter
p = Pattern.compile(PATTERN_CAPITULOS);
m = p.matcher(data);
while (m.find()) {
Chapter mc;
if (m.group(4) != null)
mc = new Chapter(m.group(2).trim() + ": " + m.group(4), m.group(1).replace("1.html", ""));
else
mc = new Chapter(m.group(2).trim(), m.group(1).replace("1.html", ""));
mc.addChapterFirst(manga);
}
}
}
@Override
public void loadMangaInformation(Manga manga, boolean forceReload) throws Exception {
if (manga.getChapters().isEmpty() || forceReload)
loadChapters(manga, forceReload);
}
@Override
public String getPagesNumber(Chapter chapter, int page) {
if (page > chapter.getPages()) {
page = 1;
}
if (chapter.getPath().endsWith("html") && chapter.getPath().indexOf("/") > 0) {
chapter.setPath(chapter.getPath().substring(0, chapter.getPath().lastIndexOf("/") + 1));
}
return chapter.getPath() + page + ".html";
}
@Override
public String getImageFrom(Chapter chapter, int page) throws Exception {
//Log.d("Mfox", "getIF url: " + this.getPagesNumber(chapter, page));
String source = getNavigatorAndFlushParameters().getWithTimeout(this.getPagesNumber(chapter, page));
//Log.d("Mfox", "source: " + source);
String img = "";
if (!source.isEmpty()) {
try {
//><img src="([^"]+?.(jpg|gif|jpeg|png|bmp))
img = getFirstMatch(">[\\s]*<img src=\"(.+?)\"", source, "Error getting image link");
} catch (Exception e) {
e.printStackTrace();
}
//Log.d("Mfox", "img: " + img);
}
return img;
}
@Override
public void chapterInit(Chapter chapter) throws Exception {
String source;
source = getNavigatorAndFlushParameters().getWithTimeout(chapter.getPath());
String paginas = getFirstMatch(PATRON_LAST, source, "Error: no se pudo obtener el numero de paginas");
chapter.setPages(Integer.parseInt(paginas)); //last page is for comments
}
@Override
public boolean hasList() {
return true;
}
@Override
public ArrayList<Manga> search(String term) throws Exception {
ArrayList<Manga> mangas = new ArrayList<>();
String data = getNavigatorAndFlushParameters()
.getWithTimeout("http://mangafox.me/search.php?name_method=cw&name="
+ term
+ "&type=&author_method=cw&author=&artist_method=cw&artist=&genres%5BAction%5D=0&genres%5BAdult%5D=0&genres%5BAdventure%5D=0&genres%5BComedy%5D=0&genres%5BDoujinshi%5D=0&genres%5BDrama%5D=0&genres%5BEcchi%5D=0&genres%5BFantasy%5D=0&genres%5BGender+Bender%5D=0&genres%5BHarem%5D=0&genres%5BHistorical%5D=0&genres%5BHorror%5D=0&genres%5BJosei%5D=0&genres%5BMartial+Arts%5D=0&genres%5BMature%5D=0&genres%5BMecha%5D=0&genres%5BMystery%5D=0&genres%5BOne+Shot%5D=0&genres%5BPsychological%5D=0&genres%5BRomance%5D=0&genres%5BSchool+Life%5D=0&genres%5BSci-fi%5D=0&genres%5BSeinen%5D=0&genres%5BShoujo%5D=0&genres%5BShoujo+Ai%5D=0&genres%5BShounen%5D=0&genres%5BShounen+Ai%5D=0&genres%5BSlice+of+Life%5D=0&genres%5BSmut%5D=0&genres%5BSports%5D=0&genres%5BSupernatural%5D=0&genres%5BTragedy%5D=0&genres%5BWebtoons%5D=0&genres%5BYaoi%5D=0&genres%5BYuri%5D=0&released_method=eq&released=&rating_method=eq&rating=&is_completed=&advopts=1");
Pattern p = Pattern.compile("<td><a href=\"(http://mangafox.me/manga/.+?)\".+?\">(.+?)<");
Matcher m = p.matcher(data);
while (m.find()) {
mangas.add(new Manga(getServerID(), m.group(2).trim(), m.group(1), false));
}
return mangas;
}
@Override
public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception {
String web;
if (genre[filters[0][0]].equals("All")) {
if (pageNumber == 1)
web = HOST + genreVV + orderV[filters[1][0]];
else
web = HOST + genreVV + pageNumber + ".htm" + orderV[filters[1][0]];
} else
web = HOST + genreVV + genre[filters[0][0]].toLowerCase().replaceAll(" ", "-") + "/" + pageNumber + ".htm" + orderV[filters[1][0]];
//Log.d("Mfox","web: "+web);
String source = getNavigatorAndFlushParameters().getWithTimeout(web);
Pattern p = Pattern.compile("<img src=\"(http://h\\.mfcdn\\.net/store/manga/.+?)\".+?<a class=\"title\" href=\"(.+?)\" rel=\"\\d+\">(.+?)</a>");
Matcher m = p.matcher(source);
ArrayList<Manga> mangas = new ArrayList<>();
//Log.d("Mfox","prematch");
while (m.find()) {
/*Log.d("Mfox","(1): "+m.group(1));
Log.d("Mfox","(2): "+m.group(2));
Log.d("Mfox","(3): "+m.group(3));*/
Manga manga = new Manga(getServerID(), m.group(3), m.group(2), false);
manga.setImages(m.group(1));
mangas.add(manga);
}
return mangas;
}
@Override
public ServerFilter[] getServerFilters() {
return new ServerFilter[]{//new ServerFilter("Type", type, ServerFilter.FilterType.SINGLE),
new ServerFilter("Genres", genre, ServerFilter.FilterType.SINGLE),
//new ServerFilter("Completed Series", status, ServerFilter.FilterType.SINGLE),
new ServerFilter("Order", order, ServerFilter.FilterType.SINGLE)};
}
}