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;
/**
* Created by Raul on 17/07/2016.
*/
class LeoManga extends ServerBase {
public static String HOST = "leomanga.com";
private static String[] demografia = {
"Todo", "Shonen", "Shojo", "Josei", "Seinen", "Kodomo", "Yuri"
};
private static String[] estado = {
"Todo", "Finalizado", "En curso"
};
private static String[] estadoV = {
"", "&estado=finalizado", "&estado=en-curso"
};
private static String[] demografiaV = {
"", "&demografia=shonen", "&demografia=shojo", "&demografia=josei",
"&demografia=seinen", "&demografia=kodomo", "&demografia=yuri"
};
private static String[] genres = {
"Acción", "Artes Marciales", "Aventura", "Ciencia Ficción", "Comedia",
"Deporte", "Doujinshi", "Drama", "Ecchi", "Escolar", "Fantasía", "Gender Bender", "Gore", "Harem", "Histórico", "Horror",
"Lolicon", "Magia", "Mecha", "Misterio", "Musical", "One-Shot", "Parodia", "Policíaca", "Psicológica", "Romance", "Shojo Ai",
"Slice of Life", "Smut", "Sobrenatural", "Superpoderes", "Tragedia"
};
private static String[] categoriasV = {
"accion", "artes-marciales", "aventura", "ciencia-ficcion", "comedia", "deporte",
"doujinshi", "drama", "ecchi", "escolar", "fantasia", "gender-bender", "gore", "harem",
"historico", "horror", "lolicon", "magia", "mecha", "misterio", "musical", "one-shot",
"parodia", "policiaca", "psicologica", "romance", "shojo-ai", "slice-of-life", "smut",
"sobrenatural", "Superpoderes", "tragedia"
};
private static String[] orden = {
"Lecturas", "Alfabetico", "Valoración", "Fecha"
};
private static String[] ordenM = {
"", "orden=alfabetico", "orden=valoracion", "orden=fecha"
};
private static String[] estilo = {
"Todos", "Manga", "Manhwa", "Manhua"
};
private static String[] estiloV = {
"Todos", "Manga", "Manhwa", "Manhua"
};
LeoManga(Context context) {
super(context);
this.setFlag(R.drawable.flag_es);
this.setIcon(R.drawable.leomanga);
this.setServerName("LeoManga");
setServerID(ServerBase.LEOMANGA);
}
@Override
public ArrayList<Manga> getMangas() throws Exception {
return null;
}
@Override
public ArrayList<Manga> search(String term) throws Exception {
String web = "http://" + HOST + "/buscar?s=" + URLEncoder.encode(term, "UTF-8");
String data = getNavigatorAndFlushParameters().get(web);
Pattern pattern = Pattern.compile("<td onclick='window.location=\"(.+?)\"'>.+?<img src=\"(.+?)\"[^>]alt=\"(.+?)\"");
Matcher m = pattern.matcher(data);
ArrayList<Manga> mangas = new ArrayList<>();
while (m.find()) {
mangas.add(new Manga(LEOMANGA, m.group(3), "http://" + HOST + m.group(1), false));
}
return mangas;
}
@Override
public void loadChapters(Manga manga, boolean forceReload) throws Exception {
loadMangaInformation(manga, forceReload);
}
@Override
public void loadMangaInformation(Manga manga, boolean forceReload) throws Exception {
if (manga.getChapters().size() == 0 || forceReload) {
String data = getNavigatorAndFlushParameters().get(manga.getPath());
manga.setSynopsis(getFirstMatchDefault("<p class=\"text-justify\">(.+?)</p>", data, defaultSynopsis));
String image = getFirstMatchDefault("<img data-original=\"(.+?)\"", data, "");
if (image.length() > 4) {
manga.setImages("http://" + HOST + image);
} else {
manga.setImages("");
}
manga.setAuthor(getFirstMatch("<a href=\"/autor.+?\">(.+?)<", data, "n/a"));
manga.setGenre(getFirstMatch("Géneros:.+?</div>(.+?)</div>", data, "").replaceAll("<.*?>", "").replaceAll(",[\\s]*", ",").trim());
manga.setFinished(getFirstMatchDefault("curs-state\">(.+?)<", data, "").contains("Finalizado"));
ArrayList<Chapter> chapters = new ArrayList<>();
Pattern pattern = Pattern.compile("<li>[\\s]*<a href=\"(/manga/.+?)\">(.+?)</a>");
Matcher matcher = pattern.matcher(data);
while (matcher.find()) {
chapters.add(0,new Chapter(matcher.group(2).replaceAll("<.+?>", "").trim(), "http://" + 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 {
return chapter.getExtra().split("\\|")[page];
}
@Override
public void chapterInit(Chapter chapter) throws Exception {
String data = getNavigatorAndFlushParameters().get(chapter.getPath());
String web = "http://" + HOST + getFirstMatch("href=\"([^\"]+)\">Online", data, "Error obteniendo paginas 1");
data = getNavigatorAndFlushParameters().get(web);
String sub = "http://" + HOST + getFirstMatch("id=\"read-chapter\" data-name=\"(.+?)\"", data, "Error obteniendo paginas 3");
String[] pos = getFirstMatch("pos=\"(.+?)\"", data, "Error obteniendo paginas 4").split(";");
chapter.setPages(pos.length);
String images = "";
for (String i : pos) {
images = images + "|" + sub + i;
}
chapter.setExtra(images);
}
@Override
public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception {
String web = "http://" + HOST + "/directorio-manga?pagina=" + pageNumber;
//demografia
web = web + demografiaV[filters[0][0]];
//genero
String gen = "&genero=";
for (int i = 0; i < filters[1].length; i++) {
gen = gen + categoriasV[filters[1][i]] + "|";
}
if (gen.length() > 8) {
gen = gen.substring(0, gen.length() - 1);
web = web + gen;
}
//estado
web = web + estadoV[filters[2][0]];
//orden
web = web + ordenM[filters[3][0]];
String data = getNavigatorAndFlushParameters().get(web);
return getMangasFromSource(data);
}
private ArrayList<Manga> getMangasFromSource(String data) {
ArrayList<Manga> mangas = new ArrayList<>();
Pattern p = Pattern.compile("<a href=\"(/manga/.+?)\".+?src=\"(.+?)\" alt=\"(.+?)\"");
Matcher m = p.matcher(data);
while (m.find()) {
Manga manga = new Manga(LEOMANGA, m.group(3), "http://" + HOST + m.group(1), false);
manga.setImages("http://" + HOST + m.group(2).replace("thumb-", ""));
mangas.add(manga);
}
return mangas;
}
@Override
public ServerFilter[] getServerFilters() {
return new ServerFilter[]{new ServerFilter("Demografia", demografia, ServerFilter.FilterType.SINGLE),
new ServerFilter("Genero", genres, ServerFilter.FilterType.MULTI),
new ServerFilter("Estado", estado, ServerFilter.FilterType.SINGLE),
new ServerFilter("Orden", orden, ServerFilter.FilterType.SINGLE)
};
}
@Override
public boolean hasList() {
return false;
}
@Override
public boolean needRefererForImages() {
return false;
}
}