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;
import ar.rulosoft.mimanganu.utils.Util;
import ar.rulosoft.navegadores.Navigator;
/**
* Created by Raul on 29/11/2015.
*/
class RuNineManga extends ServerBase {
public static String HOST = "http://ru.ninemanga.com";
private static String[] genre = new String[]{
"арт", "боевик", "боевыеискусства", "вампиры", "гарем",
"гендернаяинтрига", "героическоефэнтези", "детектив", "дзёсэй", "додзинси",
"драма", "игра", "история", "кодомо", "комедия",
"махо-сёдзё", "меха", "мистика", "научнаяфантастика", "повседневность",
"постапокалиптика", "приключения", "психология", "романтика", "самурайскийбоевик",
"сверхъестественное", "сёдзё", "сёдзё-ай", "сёнэн", "сёнэн-ай",
"спорт", "сэйнэн", "трагедия", "триллер", "ужасы",
"фантастика", "фэнтези", "школа", "этти", "юри"
};
private static String[] genreV = new String[]{
"90", "53", "58", "85", "73",
"81", "68", "72", "64", "62",
"51", "76", "75", "89", "57",
"88", "84", "71", "79", "65",
"87", "59", "54", "61", "82",
"55", "67", "78", "52", "63",
"69", "74", "70", "83", "86",
"77", "56", "66", "60", "80"
};
private static String[] orderV = {"/list/Hot-Book/", "/list/New-Update/", "/category/", "/list/New-Book/"};
private static String[] order = {"Топ манга", "Последние", "Каталог манги", "новая книга"};
private static String[] complete = new String[]{"или", "Да", "Нет"};
private static String[] completeV = new String[]{"either", "yes", "no"};
RuNineManga(Context context) {
super(context);
this.setFlag(R.drawable.flag_ru);
this.setIcon(R.drawable.ninemanga);
this.setServerName("RuNineManga");
setServerID(ServerBase.RUNINEMANGA);
}
@Override
public ArrayList<Manga> getMangas() throws Exception {
return null;
}
@Override
public ArrayList<Manga> search(String term) throws Exception {
String source = getNavigatorWithNeededHeader().get(
HOST + "/search/?wd=" + URLEncoder.encode(term, "UTF-8"));
ArrayList<Manga> mangas = new ArrayList<>();
Pattern p = Pattern.compile("bookname\" href=\"(/manga/[^\"]+)\">(.+?)<");
Matcher m = p.matcher(source);
while (m.find()) {
Manga manga = new Manga(RUNINEMANGA, 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() == null || manga.getChapters().size() == 0 || forceReload)
loadMangaInformation(manga, forceReload);
}
@Override
public void loadMangaInformation(Manga manga, boolean forceReload) throws Exception {
String source = getNavigatorWithNeededHeader().get(manga.getPath() + "?waring=1");
// Front
manga.setImages(getFirstMatchDefault("<img itemprop=\"image\".+?src=\"(.+?)\"", source, ""));
// Summary
String summary = getFirstMatchDefault("<p itemprop=\"description\">(.+?)</p>",
source, defaultSynopsis).replaceAll("<.+?>", "");
manga.setSynopsis(Util.getInstance().fromHtml(summary.replaceFirst("резюме:", "")).toString());
// Status
manga.setFinished(false);//not supported by server
// Author
manga.setAuthor(getFirstMatchDefault("itemprop=\"author\".+?>(.+?)<", source, ""));
// Genre
manga.setGenre((Util.getInstance().fromHtml(getFirstMatchDefault("<li itemprop=\"genre\".+?</b>(.+?)</li>", source, "").replace("a><a", "a>, <a") + ".").toString().trim()));
// Chapter
Pattern p = Pattern.compile(
"<a class=\"chapter_list_a\" href=\"(/chapter.+?)\" title=\"(.+?)\">(.+?)</a>");
Matcher matcher = p.matcher(source);
ArrayList<Chapter> chapters = new ArrayList<>();
while (matcher.find()) {
chapters.add(0, new Chapter(matcher.group(3), HOST + matcher.group(1)));
}
manga.setChapters(chapters);
}
@Override
public String getPagesNumber(Chapter chapter, int page) {
return chapter.getPath().replace(".html", "-" + page + ".html");
}
@Override
public String getImageFrom(Chapter chapter, int page) throws Exception {
if (chapter.getExtra() == null)
setExtra(chapter);
String[] images = chapter.getExtra().split("\\|");
return images[page];
}
private void setExtra(Chapter chapter) throws Exception {
Navigator nav = getNavigatorWithNeededHeader();
nav.addHeader("Referer", chapter.getPath());
nav.get(HOST + "/show_ads/google/");
String source = nav.get(chapter.getPath().replace(".html", "-" + chapter.getPages() + "-1.html"));
Pattern p = Pattern.compile("src=\"(http://www\\.mangarussia\\.com/comics/[^\"]+?)\"");
Matcher m = p.matcher(source);
String images = "";
while (m.find()) {
images = images + "|" + m.group(1);
}
chapter.setExtra(images);
}
@Override
public void chapterInit(Chapter chapter) throws Exception {
String source = getNavigatorWithNeededHeader().get(chapter.getPath());
String nop = getFirstMatch("\\d+/(\\d+)</option>[\\s]*</select>", source, "Не удалось получить количество страниц");
chapter.setPages(Integer.parseInt(nop));
}
@Deprecated
private ArrayList<Manga> getMangasFromSource(String source) {
ArrayList<Manga> mangas = new ArrayList<>();
Pattern p = Pattern.compile("<a href=\"(/manga/[^\"]+)\"><img src=\"(.+?)\".+?alt=\"([^\"]+)\"");
Matcher m = p.matcher(source);
while (m.find()) {
Manga manga = new Manga(RUNINEMANGA, m.group(3), HOST + m.group(1), false);
manga.setImages(m.group(2));
mangas.add(manga);
}
return mangas;
}
@Override
public ServerFilter[] getServerFilters() {
return new ServerFilter[]{
new ServerFilter("Included Genre(s)", genre, ServerFilter.FilterType.MULTI),
new ServerFilter("Excluded Genre(s)", genre, ServerFilter.FilterType.MULTI),
new ServerFilter("Completed Series", complete, ServerFilter.FilterType.SINGLE),
new ServerFilter("Order", order, ServerFilter.FilterType.SINGLE)
};
}
@Override
public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception {
String includedGenres = "";
if (filters[0].length > 0) {
for (int i = 0; i < filters[0].length; i++) {
includedGenres = includedGenres + genreV[filters[0][i]] + "%2C"; // comma
}
}
String excludedGenres = "";
if (filters[1].length > 0) {
for (int i = 0; i < filters[1].length; i++) {
excludedGenres = excludedGenres + genreV[filters[1][i]] + "%2C"; // comma
}
}
String web;
if (filters[0].length < 1 && filters[1].length < 1)
web = HOST + orderV[filters[3][0]];
else
web = "http://ru.ninemanga.com/search/?name_sel=contain&wd=&author_sel=contain&author=&artist_sel=contain&artist=&category_id=" + includedGenres + "&out_category_id=" + excludedGenres + "&completed_series=" + completeV[filters[2][0]] + "&type=high&page=" + pageNumber + ".html";
//Log.d("NM","web: "+web);
String source = getNavigatorWithNeededHeader().get(web);
// regex to generate genre ids: <li id="cate_.+?" cate_id="(.+?)" cur="none" class="cate_list"><label><a class="sub_clk cirmark">(.+?)</a></label></li>
Pattern pattern = Pattern.compile("<dl class=\"bookinfo\">.+?href=\"(.+?)\"><img src=\"(.+?)\".+?\">(.+?)<");
Matcher matcher = pattern.matcher(source);
ArrayList<Manga> mangas = new ArrayList<>();
while (matcher.find()) {
/*Log.d("NM","(2): "+matcher.group(2));
Log.d("NM","(1): "+matcher.group(1));*/
Manga m = new Manga(getServerID(), Util.getInstance().fromHtml(matcher.group(3)).toString(), HOST + matcher.group(1), false);
m.setImages(matcher.group(2));
mangas.add(m);
}
return mangas;
}
public Navigator getNavigatorWithNeededHeader() throws Exception {
Navigator nav = new Navigator(context);
nav.addHeader("Accept-Language", "es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3");
return nav;
}
@Override
public boolean hasList() {
return false;
}
}