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; import ar.rulosoft.navegadores.Navigator; class ReadComicOnline extends ServerBase { private static final String PATTERN_CHAPTER = "<td>[\\s]*<a[\\s]*href=\"(/Comic/[^\"]+)\"[^>]*>([^\"]+)</a>[\\s]*</td>"; private static final String PATTERN_SEARCH = "href=\"(/Comic/.*?)\">([^<]+)</a>[^<]+<p>[^<]+<span class=\"info\""; //public static String IP = "31.192.104.134"; private static String HOST = "readcomiconline.to"; private static String[] genre = new String[]{ "All", "Action", "Adventure", "Anthology", "Anthropomorphic", "Biography", "Children", "Comedy", "Crime", "Drama", "Family", "Fantasy", "Fighting", "Graphic Novels", "Historical", "Horror", "Leading Ladies", "LGBTQ", "Literature", "Manga", "Martial Arts", "Mature", "Military", "Movies & TV", "Mystery", "Mythology", "Personal", "Political", "Post-Apocalyptic", "Psychological", "Pulp", "Robots", "Romance", "School Life", "Sci-Fi", "Slice of Life", "Spy", "Superhero", "Supernatural", "Suspense", "Thriller", "Vampires", "Video Games", "War", "Western", "Zombies" }; private static String[] genreV = new String[]{ "/ComicList", "/Genre/Action", "/Genre/Adventure", "/Genre/Anthology", "/Genre/Anthropomorphic", "/Genre/Biography", "/Genre/Children", "/Genre/Comedy", "/Genre/Crime", "/Genre/Drama", "/Genre/Family", "/Genre/Fantasy", "/Genre/Fighting", "/Genre/Graphic-Novels", "/Genre/Historical", "/Genre/Horror", "/Genre/Leading-Ladies", "/Genre/LGBTQ", "/Genre/Literature", "/Genre/Manga", "/Genre/Martial-Arts", "/Genre/Mature", "/Genre/Military", "/Genre/Movies-TV", "/Genre/Mystery", "/Genre/Mythology", "/Genre/Personal", "/Genre/Political", "/Genre/Post-Apocalyptic", "/Genre/Psychological", "/Genre/Pulp", "/Genre/Robots", "/Genre/Romance", "/Genre/School-Life", "/Genre/Sci-Fi", "/Genre/Slice-of-Life", "/Genre/Spy", "/Genre/Superhero", "/Genre/Supernatural", "/Genre/Suspense", "/Genre/Thriller", "/Genre/Vampires", "/Genre/Video-Games", "/Genre/War", "/Genre/Western", "/Genre/Zombies" }; private static String[] order = {"Popularity", "Latest Update", "New Manga", "a-z"}; private static String[] orderV = new String[]{"/MostPopular", "/LatestUpdate", "/Newest", ""}; private static String[] state = new String[]{ "Any", "Ongoing", "Completed" }; private static String[] stateV = new String[]{ "", "Ongoing", "Completed" }; ReadComicOnline(Context context) { super(context); this.setFlag(R.drawable.flag_en); this.setIcon(R.drawable.readcomiconline); this.setServerName("ReadComicOnline"); setServerID(ServerBase.READCOMICONLINE); } @Override public ArrayList<Manga> getMangas() throws Exception { return null; } @Override public ArrayList<Manga> search(String term) throws Exception { Navigator nav = getNavigatorAndFlushParameters(); nav.addPost("keyword", term); String source = nav.post("http://" + HOST + "/Search/Comic"); ArrayList<Manga> searchList; Pattern p = Pattern.compile(PATTERN_SEARCH); Matcher m = p.matcher(source); if (m.find()) { searchList = new ArrayList<>(); boolean status = getFirstMatchDefault("Status:</span> ([\\S]+)", m.group(), "Ongoing").length() == 9; searchList.add(new Manga(READCOMICONLINE, m.group(2), m.group(1), status)); } else { searchList = getMangasSource(source); } return searchList; } @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 source = getNavigatorAndFlushParameters().get("http://" + HOST + manga.getPath()); // Summary manga.setSynopsis(Util.getInstance().fromHtml(getFirstMatchDefault( "<span " + "class=\"info\">Summary:</span>(.+?)</div>", source, defaultSynopsis)).toString()); // Cover Image //Log.d("RCO", "m.gI: " + manga.getImages()); if (manga.getImages() == null || manga.getImages().isEmpty()) { String coverImage = getFirstMatchDefault("rel=\"image_src\" href=\"(.+?)\" + \"\"", source, ""); //Log.d("RCO", "cI: " + coverImage); if (!coverImage.isEmpty()) { manga.setImages(coverImage); } } // Author String artist = getFirstMatchDefault("Artist:.+?\">(.+?)</a>", source, ""); String writer = getFirstMatchDefault("Writer:.+?\">(.+?)</a>", source, ""); if (artist.equals(writer)) manga.setAuthor(artist); else manga.setAuthor(artist + ", " + writer); // Genre manga.setGenre((Util.getInstance().fromHtml(getFirstMatchDefault("Genres:(.+?)</p>", source, "")).toString().replaceAll("^\\s+", "").trim())); manga.setFinished(getFirstMatchDefault("Status:</span> ([\\S]+)", source, "Ongoing").length() == 9); // Chapter Pattern p = Pattern.compile(PATTERN_CHAPTER); Matcher matcher = p.matcher(source); ArrayList<Chapter> chapters = new ArrayList<>(); while (matcher.find()) { chapters.add(0, new Chapter(matcher.group(2).replace(" Read Online", ""), matcher.group(1))); } manga.setChapters(chapters); } @Override public String getPagesNumber(Chapter chapter, int page) { return chapter.getPath(); } @Override public String getImageFrom(Chapter chapter, int page) throws Exception { if (chapter.getExtra() == null || chapter.getExtra().length() < 2) { String source = getNavigatorAndFlushParameters().post("http://" + HOST + chapter.getPath()); Pattern p = Pattern.compile("lstImages.push\\(\"(.+?)\""); Matcher m = p.matcher(source); String images = ""; while (m.find()) { images = images + "|" + m.group(1); } chapter.setExtra(images); } return chapter.getExtra().split("\\|")[page]; } @Override public void chapterInit(Chapter chapter) throws Exception { int pages = 0; if (chapter.getExtra() == null || chapter.getExtra().length() < 2) { String source = getNavigatorAndFlushParameters().get("http://" + HOST + chapter.getPath().replaceAll("[^!-z]+", ""), "http://" + HOST + chapter.getPath()); Pattern p = Pattern.compile("lstImages.push\\(\"(.+?)\""); Matcher m = p.matcher(source); String images = ""; while (m.find()) { pages++; images = images + "|" + m.group(1); } chapter.setExtra(images); } chapter.setPages(pages); } private ArrayList<Manga> getMangasSource(String source) { ArrayList<Manga> mangas = new ArrayList<>(); Pattern p = Pattern.compile("src=\"([^\"]+)\" style=\"float.+?href=\"(.+?)\">(.+?)<"); Matcher m = p.matcher(source); while (m.find()) { /*Log.d("RCO", "1: " + m.group(1)); Log.d("RCO", "2: " + m.group(2)); Log.d("RCO", "3: " + m.group(3));*/ Manga manga = new Manga(READCOMICONLINE, 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("Genre", genre, ServerFilter.FilterType.SINGLE), new ServerFilter("Order", order, ServerFilter.FilterType.SINGLE)}; } @Override public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception { /*if (pageNumber > 1) { return new ArrayList<>(); } else { Navigator nav = getNavigatorAndFlushParameters(); nav.addPost("comicName", ""); if (filters[0].length == 0) { for (int i = 1; i < genre.length; i++) { nav.addPost("genres", "0"); } } else { for (int i = 1; i < genre.length; i++) { if (contains(filters[0], i)) { nav.addPost("genres", "1"); } else { nav.addPost("genres", "0"); } } } nav.addPost("status", stateV[filters[1][0]]); String source = nav.post("http://" + HOST + "/AdvanceSearch"); return getMangasSource(source); }*/ return getMangasFiltered(filters[0][0], filters[1][0], pageNumber); } public ArrayList<Manga> getMangasFiltered(int category, int order, int pageNumber) throws Exception { String web = genreV[category] + orderV[order]; if (pageNumber > 1) { web = web + "?page=" + pageNumber; } //Log.d("RCO", "web: "+"http://" + HOST + web); String source = getNavigatorAndFlushParameters().get("http://" + HOST + web); return getMangasSource(source); } @Override public boolean hasList() { return false; } }