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 EsMangaHere extends ServerBase { 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 = "href=\"(/manga.+?)\".+?>(.+?)</a>"; private static final String PATRON_SEG_CAP = "<div class=\"detail_list\">(.+?)</ul></div></div><ul"; private static final String PATRON_CAPS_VIS = "<img src=\"(.+?)\" alt=\"(.+?)\".+?<a href=\"(.+?)\""; private static final String PATRON_LAST = ">(\\d+)</option>[^<]+?</select>"; private static final String PATRON_IMAGEN = "src=\"([^\"]+?.(jpg|gif|jpeg|png|bmp).*?)\""; private static String[] categorias = { "Todo", "Acción", "Aventura", "Comedia", "Doujinshi", "Drama", "Ecchi", "Fantasía", "Gender Bender", "Harem", "Histórico", "Horror", "Josei", "Artes Marciales", "Maduro", "Mecha", "Misterio", "Oneshot", "Psicológico", "Romance", "Escolar", "Ciencia Ficción", "Seinen", "Shojo", "Shojo Ai", "Shounen", "Vida Cotidiana", "Deportes", "Sobrenatural", "Tragedia", "Yuri" }; private static String[] categoriasV = { "directory/", "acción/", "aventura/", "comedia/", "doujinshi/", "drama/", "ecchi/", "fantasía/", "gender_bender/", "harem/", "histórico/", "horror/", "josei/", "artes_marciales/", "maduro/", "mecha/", "misterio/", "oneshot/", "psicológico/", "romance/", "escolar/", "ciencia_ficción/", "seinen/", "shojo/", "shojo_ai/", "shounen/", "vida_cotidiana/", "deportes/", "sobrenatural/", "tragedia/", "yuri/" }; private static String[] orden = { "Lecturas", "A - Z", "Mejor Calificados", "Ultimos Actualizados" }; private static String[] ordenM = { "?views.za", "?name.az", "?rating.za", "?last_chapter_time.az" }; public EsMangaHere(Context context) { super(context); this.setFlag(R.drawable.flag_es); this.setIcon(R.drawable.mangahere_icon); this.setServerName("EsMangaHere"); setServerID(ServerBase.ESMANGAHERE); } @Override public ArrayList<Manga> getMangas() throws Exception { ArrayList<Manga> mangas = new ArrayList<>(); String data = getNavigatorAndFlushParameters().getWithTimeout("http://es.mangahere.co/mangalist/"); Pattern p = Pattern.compile(PATTERN_SERIE); Matcher matcher = p.matcher(data); while (matcher.find()) { mangas.add(new Manga(getServerID(), matcher.group(1), matcher.group(2), false)); } return mangas; } @Override public void loadChapters(Manga manga, boolean forceReload) throws Exception { if (manga.getChapters().size() == 0 || forceReload) { Pattern p; Matcher matcher; String data = getNavigatorAndFlushParameters().getWithTimeout((manga.getPath())); // portada manga.setImages(getFirstMatchDefault(PATRON_PORTADA, data, "")); // sinopsis manga.setSynopsis(getFirstMatchDefault(PATRON_SINOPSIS, data, defaultSynopsis)); // estado manga.setFinished(getFirstMatchDefault("<li><label>Estado:</label>(.+?)</li>", data, "En desarrollo").length() == 9); //autor manga.setAuthor(getFirstMatchDefault("Autor.+?\">(.+?)<", data, "")); //generos manga.setGenre((Util.getInstance().fromHtml(getFirstMatchDefault("<li>[^:]+nero\\(s\\):(.+?)</li>", data, "")).toString().trim())); // capitulos data = getFirstMatch(PATRON_SEG_CAP, data, "Error al obtener lista de capítulos"); p = Pattern.compile(PATTERN_CAPITULOS); matcher = p.matcher(data); while (matcher.find()) { Chapter chapter = new Chapter(matcher.group(2).trim(), "http://es.mangahere.co" + matcher.group(1)); chapter.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 source = getNavigatorAndFlushParameters().getWithTimeout(this.getPagesNumber(chapter, page)); return getFirstMatch("src=\"([^\"]+?.(jpg|gif|jpeg|png|bmp).*?)\"", source, "Error: no se pudo obtener el enlace a la imagen"); } @Override public void chapterInit(Chapter chapter) throws Exception { String source = getNavigatorAndFlushParameters().getWithTimeout(chapter.getPath(), chapter.getPath()); String pages = getFirstMatch(PATRON_LAST, source, "Error: no se pudo obtener el numero de paginas"); chapter.setPages(Integer.parseInt(pages)); } @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://es.mangahere.co/site/search?name=" + term); Pattern p = Pattern.compile("<dt> <a href=\"(http://es.mangahere.co/manga/.+?)\".+?'>(.+?)<"); Matcher matcher = p.matcher(data); while (matcher.find()) { mangas.add(new Manga(getServerID(), matcher.group(2).trim(), matcher.group(1), false)); } return mangas; } @Override public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception { ArrayList<Manga> mangas = new ArrayList<>(); String web = "http://es.mangahere.co/" + categoriasV[filters[0][0]] + pageNumber + ".htm" + ordenM[filters[1][0]]; String data = getNavigatorAndFlushParameters().getWithTimeout(web); Pattern p = Pattern.compile(PATRON_CAPS_VIS); Matcher matcher = p.matcher(data); while (matcher.find()) { Manga manga = new Manga(getServerID(), matcher.group(2), matcher.group(3), false); manga.setImages(matcher.group(1).replace("thumb_", "")); mangas.add(manga); } hasMore = !mangas.isEmpty(); return mangas; } @Override public ServerFilter[] getServerFilters() { return new ServerFilter[]{new ServerFilter("Genero", categorias, ServerFilter.FilterType.SINGLE), new ServerFilter("Orden", orden, ServerFilter.FilterType.SINGLE)}; } }