package be.nikiroo.fanfix.supported; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map.Entry; import java.util.Scanner; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.utils.IOUtils; import be.nikiroo.utils.Progress; import be.nikiroo.utils.StringUtils; class MangaFox extends BasicSupport { @Override protected boolean isHtml() { return true; } @Override public String getSourceName() { return "MangaFox.me"; } @Override protected MetaData getMeta(URL source, InputStream in) throws IOException { MetaData meta = new MetaData(); meta.setTitle(getTitle(reset(in))); meta.setAuthor(getAuthor(reset(in))); meta.setDate(getDate(reset(in))); meta.setTags(getTags(reset(in))); meta.setSource(getSourceName()); meta.setUrl(source.toString()); meta.setPublisher(getSourceName()); meta.setUuid(source.toString()); meta.setLuid(""); meta.setLang("EN"); meta.setSubject("manga"); meta.setType(getType().toString()); meta.setImageDocument(true); meta.setCover(getCover(reset(in))); return meta; } private List getTags(InputStream in) { List tags = new ArrayList(); String line = getLine(in, "/genres/", 0); if (line != null) { line = StringUtils.unhtml(line); String[] tab = line.split(","); if (tab != null) { for (String tag : tab) { tags.add(tag.trim()); } } } return tags; } private String getTitle(InputStream in) { String line = getLine(in, " property=\"og:title\"", 0); if (line != null) { int pos = -1; for (int i = 0; i < 3; i++) { pos = line.indexOf('"', pos + 1); } if (pos >= 0) { line = line.substring(pos + 1); pos = line.indexOf('"'); if (pos >= 0) { return line.substring(0, pos); } } } return null; } private String getAuthor(InputStream in) { List authors = new ArrayList(); String line = getLine(in, "/author/", 0, false); if (line != null) { for (String ln : StringUtils.unhtml(line).split(",")) { if (ln != null && !ln.trim().isEmpty() && !authors.contains(ln.trim())) { authors.add(ln.trim()); } } } try { in.reset(); } catch (IOException e) { Instance.syserr(e); } line = getLine(in, "/artist/", 0, false); if (line != null) { for (String ln : StringUtils.unhtml(line).split(",")) { if (ln != null && !ln.trim().isEmpty() && !authors.contains(ln.trim())) { authors.add(ln.trim()); } } } if (authors.isEmpty()) { return null; } else { StringBuilder builder = new StringBuilder(); for (String author : authors) { if (builder.length() > 0) { builder.append(", "); } builder.append(author); } return builder.toString(); } } private String getDate(InputStream in) { String line = getLine(in, "/released/", 0); if (line != null) { line = StringUtils.unhtml(line); return line.trim(); } return null; } @Override protected String getDesc(URL source, InputStream in) { String line = getLine(in, " property=\"og:description\"", 0); if (line != null) { int pos = -1; for (int i = 0; i < 3; i++) { pos = line.indexOf('"', pos + 1); } if (pos >= 0) { line = line.substring(pos + 1); pos = line.indexOf('"'); if (pos >= 0) { return line.substring(0, pos); } } } return null; } private BufferedImage getCover(InputStream in) { String line = getLine(in, " property=\"og:image\"", 0); String cover = null; if (line != null) { int pos = -1; for (int i = 0; i < 3; i++) { pos = line.indexOf('"', pos + 1); } if (pos >= 0) { line = line.substring(pos + 1); pos = line.indexOf('"'); if (pos >= 0) { cover = line.substring(0, pos); } } } if (cover != null) { InputStream coverIn; try { coverIn = openEx(cover); try { return IOUtils.toImage(coverIn); } finally { coverIn.close(); } } catch (IOException e) { } } return null; } @Override protected List> getChapters(URL source, InputStream in, Progress pg) { List> urls = new ArrayList>(); String volumeAt = "

"; String linkAt = "href=\"http://mangafox.me/"; String endAt = "