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 MangaPanda extends ServerBase { private static final String PATTERN_SERIE = "<li><a href=\"([^\"]+)\">([^<]+)"; private static final String PATTERN_SUB = "<div class=\"series_col\">([\\s\\S]+?)<div id=\"adfooter\">"; private static final String PATTERN_FRAG_CHAPTER = "<div id=\"chapterlist\">([\\s\\S]+?)</table>"; private static final String PATTERN_CHAPTER = "<a href=\"([^\"]+)\">([^\"]+?)</a>.:([^\"]+?)</td>"; private static final String PATTERN_CHAPTER_WEB = "/[-|\\d]+/([^/]+)/chapter-(\\d+).html"; private static String HOST = "http://www.mangapanda.com"; private static String[] genre = new String[]{ "Action", "Adventure", "Comedy", "Demons", "Drama", "Ecchi", "Fantasy", "Gender bender", "Harem", "Historical", "Horror", "Josei", "Magic", "Martial arts", "Mature", "Mecha", "Military", "Mystery", "One Shot", "Psychological", "Romance", "School life", "Sci-fi", "Seinen", "Shoujo", "Shoujoai", "Shounen", "Shounenai", "Slice of Life", "Smut", "Sports", "Super Power", "Supernatural", "Tragedy", "Vampire", "Yaoi", "Yuri" }; private static String[] type = new String[]{ "Both", "Manhwa", "Manga" }; private static String[] typeV = new String[]{ "&rd=0", "&rd=1", "&rd=2" }; private static String[] status = new String[]{ "Both", "Ongoing", "Completed" }; private static String[] statusV = new String[]{ "&status=", "&status=1", "&status=2" }; private static String[] order = new String[]{ "Popularity", "Alphabetical", "Similarity" }; private static String[] orderV = new String[]{ "&order=2", "&order=1", "&order=" }; MangaPanda(Context context) { super(context); this.setFlag(R.drawable.flag_en); this.setIcon(R.drawable.mangapanda_icon); this.setServerName("Mangapanda.com"); setServerID(ServerBase.MANGAPANDA); } void SetHost(String new_host) { HOST = new_host; } @Override public ArrayList<Manga> getMangas() throws Exception { ArrayList<Manga> mangas = new ArrayList<>(); String data = getNavigatorAndFlushParameters().get(HOST + "/alphabetical"); Pattern p = Pattern.compile(PATTERN_SUB); Matcher m = p.matcher(data); if (m.find()) { String b = m.group(1); Pattern p1 = Pattern.compile(PATTERN_SERIE); Matcher m1 = p1.matcher(b); while (m1.find()) { mangas.add(new Manga(this.getServerID(), m1.group(2), HOST + m1.group(1), false)); } } return mangas; } @Override public ArrayList<Manga> search(String term) throws Exception { ArrayList<Manga> mangas = new ArrayList<>(); String data = getNavigatorAndFlushParameters().get(HOST + "/actions/search/?q=" + term + "&limit=100"); Pattern p = Pattern.compile("(.+?)\\|.+?\\|(/.+?)\\|\\d+"); Matcher m = p.matcher(data); while (m.find()) { mangas.add(new Manga(getServerID(), m.group(1).trim(), HOST + m.group(2), false)); } return mangas; } @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 data = getNavigatorAndFlushParameters().get(manga.getPath()); Pattern p = Pattern.compile(PATTERN_FRAG_CHAPTER); Matcher m = p.matcher(data); if (m.find()) { Pattern p1 = Pattern.compile(PATTERN_CHAPTER); Matcher m1 = p1.matcher(m.group(1)); while (m1.find()) { String web = m1.group(1); if (web.matches(PATTERN_CHAPTER_WEB)) { Pattern p2 = Pattern.compile(PATTERN_CHAPTER_WEB); Matcher m2 = p2.matcher(web); if (m2.find()) web = m2.group(1) + "/" + m2.group(2); } String chName = m1.group(2); if (!m1.group(3).trim().isEmpty()) chName += " :" + m1.group(3); manga.addChapter(new Chapter(chName, HOST + web)); } } // Summary manga.setSynopsis(getFirstMatchDefault("<p>(.+)</p>", data, defaultSynopsis)); // Title manga.setImages(getFirstMatchDefault("mangaimg\"><img src=\"([^\"]+)", data, "")); // Status manga.setFinished(data.contains("</td><td>Completed</td>")); // Genre manga.setGenre(Util.getInstance().fromHtml(getFirstMatchDefault("Genre:</td><td>(.+?)</td>", data, "").replace("a> <a", "a>, <a")).toString()); // Author manga.setAuthor(Util.getInstance().fromHtml(getFirstMatchDefault("Author:</td><td>(.+?)<", data, "")).toString()); } @Override public String getPagesNumber(Chapter chapter, int page) { page = (page > chapter.getPages()) ? 1 : page; return chapter.getPath() + "/" + page; } @Override public String getImageFrom(Chapter chapter, int page) throws Exception { String data; data = getNavigatorAndFlushParameters().get(this.getPagesNumber(chapter, page)); return getFirstMatch("src=\"([^\"]+?.(jpg|gif|jpeg|png|bmp))", 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 pages = getFirstMatch("of (\\d+)</div>", data, "Error: Could not get the number of pages"); chapter.setPages(Integer.parseInt(pages)); } @Override public ServerFilter[] getServerFilters() { return new ServerFilter[]{new ServerFilter("Genre", genre, ServerFilter.FilterType.MULTI), new ServerFilter("Manga Type", type, ServerFilter.FilterType.SINGLE), new ServerFilter("Manga Status", status, ServerFilter.FilterType.SINGLE), new ServerFilter("Sorting Order", order, ServerFilter.FilterType.SINGLE)}; } ///search/?w=&rd=0&status=0&order=0&genre=1000010000000000000000000000000000000&p=0 @Override public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception { String gens = ""; for (int i = 0; i < genre.length; i++) { if (contains(filters[0], i)) { gens = gens + "1"; } else { gens = gens + "0"; } } ArrayList<Manga> mangas = new ArrayList<>(); String web = HOST + "/search/?w=" + typeV[filters[1][0]] + statusV[filters[2][0]] + orderV[filters[3][0]] + "&genre=" + gens + "&p=" + ((pageNumber - 1) * 30); String data = getNavigatorAndFlushParameters().get(web); Pattern p = Pattern.compile("(http:[^']+/cover/.+?)'.+?<h3><a href=\"(.+?)\">(.+?)<"); Matcher m = p.matcher(data); while (m.find()) { Manga manga = new Manga(getServerID(), m.group(3), HOST + m.group(2), false); manga.setImages(m.group(1).replace("r0", "l0")); mangas.add(manga); } return mangas; } @Override public boolean hasList() { return true; } }