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;
public class MangaHere extends ServerBase {
private static final String[] genre = {
"All", "Action", "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", "Shoujo Ai", "Shounen", "Slice of Life",
"Sports", "Supernatural", "Tragedy", "Yuri"
};
private static final String[] genreV = {
"directory", "action", "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", "shoujo Ai", "shounen", "slice_of_life",
"sports", "supernatural", "tragedy", "yuri"
};
private static final String PATRON_CAPS_VIS =
"<img src=\"(.+?)\".+?alt=\"(.+?)\".+?<a href=\"(.+?)\"";
private static final String PATTERN_SERIE =
"<li><a class=\"manga_info\" rel=\"([^\"]*)\" href=\"([^\"]*)\"><span>[^<]*</span>([^<]*)</a></li>";
private static final String PATRON_PORTADA = "<img src=\"(.+?cover.+?)\"";
private static final String PATRON_SINOPSIS =
"<p id=\"show\" style=\"display:none;\">(.+?) <a";
private static final String PATTERN_CAPITULOS =
"<li>[^<]*<span class=\"left\">[^<]*<a class=\"color_0077\" href=\"([^\"]*)\"[^>]*>([^<]*)</a>";
private static final String PATRON_LAST = ">(\\d+)</option>[^<]+?</select>";
private static final String PATRON_IMAGEN = "src=\"([^\"]+?/manga/.+?.(jpg|gif|jpeg|png|bmp).*?)\"";
private static String HOST = "http://www.mangahere.co";
private static String[] order = {
"Views", "A - Z", "Rating", "Last Update"
};
private static String[] orderM = {
"?views.za", "?name.az", "?rating.za", "?last_chapter_time.az"
};
MangaHere(Context context) {
super(context);
this.setFlag(R.drawable.flag_en);
this.setIcon(R.drawable.mangahere_icon);
this.setServerName("MangaHere");
setServerID(ServerBase.MANGAHERE);
}
@Override
public ArrayList<Manga> getMangas() throws Exception {
ArrayList<Manga> mangas = new ArrayList<>();
String data = getNavigatorAndFlushParameters().get(HOST + "/mangalist/");
Pattern p = Pattern.compile(PATTERN_SERIE);
Matcher m = p.matcher(data);
while (m.find()) {
mangas.add(new Manga(ServerBase.ESMANGAHERE, m.group(1), m.group(2), false));
}
return mangas;
}
@Override
public void loadChapters(Manga manga, boolean forceReload) throws Exception {
if (manga.getChapters().size() == 0 || forceReload) {
String data = getNavigatorAndFlushParameters().get(manga.getPath());
// Front
manga.setImages(getFirstMatchDefault(PATRON_PORTADA, data, ""));
// Summary
manga.setSynopsis(getFirstMatchDefault(PATRON_SINOPSIS, data, defaultSynopsis));
// Status
manga.setFinished(data.contains("</label>Completed</li>"));
// Author
manga.setAuthor(getFirstMatchDefault("Author.+?\">(.+?)<", data, ""));
// Genre
manga.setGenre(getFirstMatchDefault("<li><label>Genre\\(s\\):</label>(.+?)</li>", data, ""));
// Chapter
Pattern p = Pattern.compile(PATTERN_CAPITULOS);
Matcher m = p.matcher(data);
while (m.find()) {
Chapter mc = new Chapter(Util.getInstance().fromHtml(m.group(2)).toString().trim(), m.group(1));
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;
}
return chapter.getPath() + page + ".html";
}
@Override
public String getImageFrom(Chapter chapter, int page) throws Exception {
String data;
data = getNavigatorAndFlushParameters().get(this.getPagesNumber(chapter, page));
return getFirstMatch(PATRON_IMAGEN, data, "Error: Could not get the link to the image");
}
@Override
public void chapterInit(Chapter chapter) throws Exception {
String data;
data = getNavigatorAndFlushParameters().get(chapter.getPath());
String paginas =
getFirstMatch(PATRON_LAST, data, "Error: Could not get the number of pages");
chapter.setPages(Integer.parseInt(paginas));
}
@Override
public boolean hasList() {
return true;
}
@Override
public ServerFilter[] getServerFilters() {
return new ServerFilter[]{new ServerFilter("Genre", genre, ServerFilter.FilterType.SINGLE),
new ServerFilter("Order", order, ServerFilter.FilterType.SINGLE)};
}
@Override
public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception {
ArrayList<Manga> mangas = new ArrayList<>();
String web = HOST + "/" + genreV[filters[0][0]] + "/" + pageNumber + ".htm" + orderM[filters[1][0]];
//Log.d("MH","web: "+web);
String source = getNavigatorAndFlushParameters().get(web);
Pattern p = Pattern.compile("<img src=\"(.+?)\".+?alt=\"(.+?)\".+?<a href=\"(.+?)\"");
Matcher m = p.matcher(source);
while (m.find()) {
Manga manga = new Manga(getServerID(), Util.getInstance().fromHtml(m.group(2)).toString(), m.group(3), false);
manga.setImages(m.group(1));//.replace("thumb_", ""));
mangas.add(manga);
}
hasMore = !mangas.isEmpty();
return mangas;
}
@Override
public ArrayList<Manga> search(String term) throws Exception {
ArrayList<Manga> mangas = new ArrayList<>();
String data = getNavigatorAndFlushParameters().get(HOST + "/search.php?name=" + term);
Pattern p = Pattern.compile("<dt> <a href=\"(" + HOST +
"/manga/.+?)\".+?\">(.+?)<");
Matcher m = p.matcher(data);
while (m.find()) {
mangas.add(new Manga(getServerID(), m.group(2).trim(), m.group(1), false));
}
return mangas;
}
}