package ar.rulosoft.mimanganu.servers; import android.content.Context; import android.support.annotation.NonNull; 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; import ar.rulosoft.mimanganu.utils.Util; /** * Created by Raul on 03/02/2016. */ class RawSenManga extends ServerBase { public static String HOST = "http://raw.senmanga.com/"; private static String[] genre = new String[]{ "All", "Action", "Adult", "Adventure", "Comedy", "Cooking", "Drama", "Ecchi", "Fantasy", "Gender Bender", "Harem", "Historical", "Horror", "Josei", "Light Novel", "Martial Arts", "Mature", "Music", "Mystery", "Psychological", "Romance", "School Life", "Sci-Fi", "Seinen", "Shoujo", "Shoujo Ai", "Shounen", "Shounen Ai", "Slice of Life", "Smut", "Sports", "Supernatural", "Tragedy", "Webtoons", "Yuri" }; private static String[] genreV = new String[]{ "Manga/", "directory/category/Action/", "directory/category/Adult/", "directory/category/Adventure/", "directory/category/Comedy/", "directory/category/Cooking/", "directory/category/Drama/", "directory/category/Ecchi/", "directory/category/Fantasy/", "directory/category/Gender-Bender/", "directory/category/Harem/", "directory/category/Historical/", "directory/category/Horror/", "directory/category/Josei/", "directory/category/Light_Novel/", "directory/category/Martial_Arts/", "directory/category/Mature/", "directory/category/Music/", "directory/category/Mystery/", "directory/category/Psychological/", "directory/category/Romance/", "directory/category/School_Life/", "directory/category/Sci-Fi/", "directory/category/Seinen/", "directory/category/Shoujo/", "directory/category/Shoujo-Ai/", "directory/category/Shounen/", "directory/category/Shounen-Ai/", "directory/category/Slice_of_Life/", "directory/category/Smut/", "directory/category/Sports/", "directory/category/Supernatural/", "directory/category/Tragedy/", "directory/category/Webtoons/", "directory/category/Yuri/" }; private static String[] order = {"Most Popular", "Rating", "Title"}; private static String[] orderV = {"Manga/?order=popular", "Manga/?order=rating", "Manga/?order=title"}; RawSenManga(Context context) { super(context); this.setFlag(R.drawable.flag_raw); this.setIcon(R.drawable.senmanga); this.setServerName("SenManga"); setServerID(ServerBase.RAWSENMANGA); } @Override public ArrayList<Manga> getMangas() throws Exception { ArrayList<Manga> mangas = new ArrayList<>(); String data = getNavigatorAndFlushParameters().get(HOST + "Manga/?order=text-version"); Pattern p = Pattern.compile("\\d</td><td><a href=\"([^\"]+)\"\\s*>([^<]+)"); Matcher m = p.matcher(data); while (m.find()) { Manga manga = new Manga(getServerID(), m.group(2),HOST + m.group(1), false); mangas.add(manga); } return mangas; } @Override public ArrayList<Manga> search(String term) throws Exception { String web = HOST + "Search.php?q=" + URLEncoder.encode(term,"UTF-8"); String data = getNavigatorAndFlushParameters().get(web); Pattern p = Pattern.compile("<div class='search-results'>.+?<a href='(.+?)' title='(.+?)'"); Matcher m = p.matcher(data); ArrayList<Manga> mangas = new ArrayList<>(); while (m.find()){ Manga manga = new Manga(getServerID(),m.group(2),HOST + m.group(1),false); mangas.add(manga); } return mangas; } @Override public void loadChapters(Manga manga, boolean forceReload) throws Exception { if (manga.getChapters().size() == 0 || forceReload) { String data = getNavigatorAndFlushParameters().get(manga.getPath()); String data2 = getFirstMatchDefault("<div class=\"series_desc\">(.+?)<\\/div>", data, ""); manga.setSynopsis(Util.getInstance().fromHtml(getFirstMatchDefault("<div itemprop=\"description\">(.+?)<", data2, defaultSynopsis)).toString()); manga.setImages(HOST + getFirstMatchDefault("image\" src=\"(.+?)\"", data, "")); manga.setAuthor(Util.getInstance().fromHtml(getFirstMatchDefault("Author:<\\/strong> <span class='desc'>(.+?)<\\/span>", data2, "N/A")).toString()); manga.setGenre(Util.getInstance().fromHtml(getFirstMatchDefault("in:<\\/strong><\\/p> (.+?)<\\/p>", data2, "N/A")).toString().trim()); manga.setFinished(data2.contains("Complete")); Pattern p = Pattern.compile("<td><a href=\"(/.+?)\" title=\"(.+?)\""); Matcher m = p.matcher(data); while (m.find()) { Chapter mc = new Chapter(m.group(2).trim(), HOST + 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) { return null; } @Override public String getImageFrom(Chapter chapter, int page) throws Exception { if (chapter.getExtra() == null) { String data = getNavigatorAndFlushParameters().get(chapter.getPath()); chapter.setExtra(getFirstMatchDefault("<img src=\".(vi.+?/)[^/]+?\"", data, "can't get image base")); } return HOST + chapter.getExtra() + page; } @Override public void chapterInit(Chapter chapter) throws Exception { String data = getNavigatorAndFlushParameters().get(chapter.getPath()); String number = getFirstMatchDefault("</select> of (\\d+)", data, "Can't retrieve page quantity"); chapter.setPages(Integer.parseInt(number)); chapter.setExtra(getFirstMatchDefault("<img src=\".(vi.+?/)[^/]+?\"", data, "can't get image base")); } @NonNull private ArrayList<Manga> getMangasFromSource(String source) { Pattern p = Pattern.compile("<div class=\"cover\"><a href=\"/(.+?)\" title=\"(.+?)\"><img src=\"/(.+?)\""); Matcher m = p.matcher(source); ArrayList<Manga> mangas = new ArrayList<>(); while (m.find()){ Manga manga = new Manga(getServerID(),m.group(2),HOST + m.group(1),false); manga.setImages(HOST + m.group(3)); 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 { String web = HOST + genreV[filters[0][0]] + "?page=" + pageNumber; if (genre[filters[0][0]].equals("All")) web = HOST + orderV[filters[1][0]] + "&page=" + pageNumber; String source = getNavigatorAndFlushParameters().get(web); return getMangasFromSource(source); } @Override public boolean hasList() { return true; } }