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;
/**
* Created by xtj-9182 on 01.12.2016.
*/
class ReadMangaToday extends ServerBase {
private static String HOST = "http://www.readmanga.today";
private static String[] genre = new String[]{
"All",
"Action",
"Adventure",
"Comedy",
"Doujinshi",
"Drama",
"Ecchi",
"Fantasy",
"Gender Bender",
"Harem",
"Historical",
"Horror",
"Josei",
"Lolicon",
"Martial Arts",
"Mature",
"Mecha",
"Mystery",
"One shot",
"Psychological",
"Romance",
"School Life",
"Sci-fi",
"Seinen",
"Shotacon",
"Shoujo",
"Shoujo Ai",
"Shounen",
"Shounen Ai",
"Slice of Life",
"Smut",
"Sports",
"Supernatural",
"Tragedy",
"Yaoi",
"Yuri"
};
private static String genreVV = "/category/";
ReadMangaToday(Context context) {
super(context);
this.setFlag(R.drawable.flag_en);
this.setIcon(R.drawable.readmangatoday);
this.setServerName("ReadMangaToday");
setServerID(ServerBase.READMANGATODAY);
}
@Override
public ArrayList<Manga> getMangas() throws Exception {
return null;
}
@Override
public ArrayList<Manga> search(String search) throws Exception {
ArrayList<Manga> mangas = new ArrayList<>();
String web = "http://www.readmanga.today/manga-list/";
if (Character.isLetter(search.charAt(0)))
web = web + search.toLowerCase().charAt(0);
int count = -1;
String[] alphabet = {"t", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "v", "w", "x", "y", "z"};
while (mangas.isEmpty()) {
//Log.d("RMT", "web: " + web);
String source = getNavigatorAndFlushParameters().get(web);
Pattern pattern = Pattern.compile("<a href=\"(http://www\\.readmanga\\.today/[^\"]+?)\">(.+?)</a>");
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
if (matcher.group(2).toLowerCase().contains(search.toLowerCase())) {
/*Log.d("RMT", "1: " + matcher.group(1));
Log.d("RMT", "2: " + matcher.group(2));*/
Manga manga = new Manga(getServerID(), matcher.group(2), matcher.group(1), false);
mangas.add(manga);
}
}
if (count == alphabet.length)
break;
if (count == -1)
web = "http://www.readmanga.today/manga-list/";
else {
web = "http://www.readmanga.today/manga-list/";
web = web + alphabet[count];
}
count++;
}
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 = getNavigatorAndFlushParameters().getAndReturnResponseCodeOnFailure(manga.getPath());
if (source.equals("400")) {
// ReadMangaToday returns 400 Bad Request sometimes
// deleting it's cookies will usually get rid of the error
Util.getInstance().removeSpecificCookies(context, HOST);
}
// Cover
if (manga.getImages() == null || manga.getImages().isEmpty() || manga.getImages().contains("thumb")) {
String img = getFirstMatchDefault("<div class=\"col-md-3\">.+?<img src=\"(.+?)\" alt=", source, "");
manga.setImages(img);
}
// Summary
String summary = getFirstMatchDefault("<li class=\"list-group-item movie-detail\">(.+?)</li>", source, "");
manga.setSynopsis(Util.getInstance().fromHtml(summary.trim()).toString());
// Status
boolean status = !getFirstMatchDefault("<dt>Status:</dt>.+?<dd>(.+?)</dd>", source, "").contains("Ongoing");
manga.setFinished(status);
// Author
String author = "";
//String author = getFirstMatchDefault("<li class=\"director\">.+?<li><a href=\".+?\">(.+?)</a>", source, "");
Pattern p1 = Pattern.compile("<li><a href=\"http://www\\.readmanga\\.today/people/[^\"]+?\">([^\"]+?)</a>");
Matcher matcher1 = p1.matcher(source);
while (matcher1.find()) {
//Log.d("RMT", "(1): " + matcher1.group(1));
if (!author.equals(matcher1.group(1) + ", ")) {
author += matcher1.group(1);
author += ", ";
}
}
if (author.endsWith(", "))
author = author.substring(0, author.length() - 2);
manga.setAuthor(author);
// Genre
String genre = Util.getInstance().fromHtml(getFirstMatchDefault("<dt>Categories:</dt>.+?<dd>(.+?)</dd>", source, "").replaceAll("</a>", ",</a>")).toString().trim();
//Log.d("RMT", "g: " + genre);
if (genre.endsWith(","))
genre = genre.substring(0, genre.length() - 1);
manga.setGenre(genre);
// Chapters
//<li>.+?<a href="(.+?)">.+?<span class="val"><span class="icon-arrow-2"></span>(.+?)</span>
Pattern p = Pattern.compile("<li>[\\s]*<a href=\"([^\"]+?)\">[\\s]*<span class=\"val\"><span class=\"icon-arrow-.\"></span>(.+?)</span>");
Matcher matcher = p.matcher(source);
ArrayList<Chapter> chapters = new ArrayList<>();
while (matcher.find()) {
/*Log.d("RMT", "(2): " + matcher.group(2).trim());
Log.d("RMT", "(1): " + matcher.group(1));*/
chapters.add(0, new Chapter(matcher.group(2).trim(), matcher.group(1)));
}
manga.setChapters(chapters);
}
@Override
public String getPagesNumber(Chapter chapter, int page) {
return null;
}
@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 {
String source = getNavigatorAndFlushParameters().getAndReturnResponseCodeOnFailure(chapter.getPath() + "/all-pages");
if (source.equals("400")) {
Util.getInstance().removeSpecificCookies(context, HOST);
}
//Log.d("RMT", "s: " + source);
Pattern p = Pattern.compile("<img src=\"([^\"]+)\" class=\"img-responsive-2\">");
Matcher matcher = p.matcher(source);
String images = "";
while (matcher.find()) {
//Log.d("RMT","(1): "+matcher.group(1));
images = images + "|" + matcher.group(1);
}
chapter.setExtra(images);
}
@Override
public void chapterInit(Chapter chapter) throws Exception {
String source = getNavigatorAndFlushParameters().getAndReturnResponseCodeOnFailure(chapter.getPath());
if (source.equals("400")) {
Util.getInstance().removeSpecificCookies(context, HOST);
}
//Log.d("RMT","p: "+chapter.getPath());
String pageNumber = getFirstMatchDefault("\">(\\d+)</option>[\\s]*</select>", source,
"failed to get the number of pages");
//Log.d("RMT","pa: "+pageNumber);
chapter.setPages(Integer.parseInt(pageNumber));
}
@Override
public ServerFilter[] getServerFilters() {
return new ServerFilter[]{
new ServerFilter("Genre(s)", genre, ServerFilter.FilterType.SINGLE),
};
}
@Override
public ArrayList<Manga> getMangasFiltered(int[][] filters, int pageNumber) throws Exception {
String web;
if (genre[filters[0][0]].equals("All")) {
if(pageNumber == 1)
web = HOST + "/hot-manga/";
else
web = HOST + "/hot-manga/" + pageNumber;
}
else
web = HOST + genreVV + genre[filters[0][0]].toLowerCase().replaceAll(" ","-") +"/"+ pageNumber;
//Log.d("RMT", "web: " + web);
String source = getNavigatorAndFlushParameters().getAndReturnResponseCodeOnFailure(web);
if (source.equals("400")) {
Util.getInstance().removeSpecificCookies(context, HOST);
}
// regex to generate genre ids: <li>.+?title="All Categories - (.+?)">
Pattern pattern = Pattern.compile("<div class=\"left\">.+?<a href=\"(.+?)\" title=\"(.+?)\"><img src=\"(.+?)\" alt=\"");
Matcher matcher = pattern.matcher(source);
ArrayList<Manga> mangas = new ArrayList<>();
while (matcher.find()) {
/*Log.d("RMT","(2): "+matcher.group(2));
Log.d("RMT","(1): "+matcher.group(1));
Log.d("RMT","(3): "+matcher.group(3));*/
Manga m = new Manga(getServerID(), matcher.group(2), matcher.group(1), false);
//Log.d("RMT","img: "+matcher.group(3).replace("thumb/",""));
m.setImages(matcher.group(3).replace("thumb/",""));
mangas.add(m);
}
return mangas;
}
@Override
public boolean hasList() {
return false;
}
}