X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FMangaHub.java;fp=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FMangaHub.java;h=437914ac3da77a68f4285d7baea601d3fd4ba4df;hp=0000000000000000000000000000000000000000;hb=413bcc29038d9c46c785142332839d41fd3c10e6;hpb=f3ce1b69a14003f0a6067e501b36a9051bceb34a
diff --git a/src/be/nikiroo/fanfix/supported/MangaHub.java b/src/be/nikiroo/fanfix/supported/MangaHub.java
new file mode 100644
index 0000000..437914a
--- /dev/null
+++ b/src/be/nikiroo/fanfix/supported/MangaHub.java
@@ -0,0 +1,207 @@
+package be.nikiroo.fanfix.supported;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map.Entry;
+
+import org.jsoup.nodes.Element;
+
+import be.nikiroo.fanfix.Instance;
+import be.nikiroo.fanfix.data.MetaData;
+import be.nikiroo.utils.Image;
+import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.StringUtils;
+
+/**
+ * Support class for MangaHub, a website
+ * dedicated to Manga.
+ *
+ * @author niki
+ */
+class MangaHub extends BasicSupport {
+ @Override
+ protected boolean isHtml() {
+ return true;
+ }
+
+ @Override
+ protected MetaData getMeta() throws IOException {
+ MetaData meta = new MetaData();
+
+ meta.setTitle(getTitle());
+ meta.setDate("");
+ meta.setAuthor(getAuthor());
+ meta.setTags(getTags());
+ meta.setSource(getType().getSourceName());
+ meta.setUrl(getSource().toString());
+ meta.setPublisher(getType().getSourceName());
+ meta.setUuid(getSource().toString());
+ meta.setLuid("");
+ meta.setLang("en");
+ meta.setSubject("manga");
+ meta.setType(getType().toString());
+ meta.setImageDocument(true);
+ meta.setCover(getCover());
+
+ return meta;
+ }
+
+ private String getTitle() {
+ Element doc = getSourceNode();
+
+ Element el = doc.getElementsByTag("h1").first();
+ if (el != null) {
+ return StringUtils.unhtml(el.text()).trim();
+ }
+
+ return null;
+ }
+
+ private String getAuthor() {
+ String author = "";
+
+ Element el = getSourceNode().select("h1+div span:not([class])").first();
+ if (el != null)
+ author = StringUtils.unhtml(el.text()).trim();
+ return author;
+ }
+
+ private List getTags() {
+ return getListA("genre-label");
+ }
+
+ private List getListA(String uniqueClass) {
+ List list = new ArrayList();
+
+ Element doc = getSourceNode();
+ Element el = doc.getElementsByClass(uniqueClass).first();
+ if (el != null) {
+ for (Element valueA : el.getElementsByTag("a")) {
+ list.add(StringUtils.unhtml(valueA.text()).trim());
+ }
+ }
+
+ return list;
+ }
+
+ @Override
+ protected String getDesc() {
+ Element doc = getSourceNode();
+ Element title = doc.getElementsByClass("fullcontent").first();
+ if (title != null) {
+ return StringUtils.unhtml(title.text()).trim();
+ }
+
+ return null;
+ }
+
+ private Image getCover() {
+ Element doc = getSourceNode();
+ Element cover = doc.getElementsByClass("manga-thumb").first();
+ if (cover != null) {
+ try {
+ return bsImages.getImage(this, new URL(cover.absUrl("src")));
+ } catch (MalformedURLException e) {
+ Instance.getTraceHandler().error(e);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ protected List> getChapters(Progress pg) {
+ List> urls = new ArrayList>();
+
+ Element doc = getSourceNode();
+ for (Element el : doc.getElementsByClass("list-group-item")) {
+ Element urlEl = el.getElementsByTag("a").first();
+ if (urlEl == null)
+ continue;
+
+ String url = urlEl.absUrl("href");
+
+ String title = "";
+ el = el.getElementsByClass("text-secondary").first();
+ if (el != null) {
+ title = StringUtils.unhtml(el.text()).trim();
+ }
+
+ try {
+ urls.add(new AbstractMap.SimpleEntry(title, new URL(url)));
+ } catch (Exception e) {
+ Instance.getTraceHandler().error(e);
+ }
+ }
+
+ // by default, the chapters are in reversed order
+ Collections.reverse(urls);
+
+ return urls;
+ }
+
+ @Override
+ protected String getChapterContent(URL chapUrl, int number, Progress pg) throws IOException {
+ if (pg == null) {
+ pg = new Progress();
+ }
+
+ // 1. Get the title and chapter url part
+ String path = chapUrl.getPath();
+ if (path.endsWith("/")) {
+ path = path.substring(0, path.length() - "/".length());
+ }
+ String tab[] = path.split("/");
+ String chap = tab[tab.length - 1];
+ String title = tab[tab.length - 2];
+
+ if (chap.startsWith("chapter-")) {
+ chap = chap.substring("chapter-".length());
+ }
+
+ // 2. generate an image base
+ String base = "https://img.mghubcdn.com/file/imghub/" + title + "/" + chap + "/";
+
+ // 3. add each chapter
+ StringBuilder builder = new StringBuilder();
+
+ int i = 1;
+ String url = base + i + ".jpg";
+ while (getHttpStatus(new URL(url)) != 404) {
+ builder.append("[");
+ builder.append(url);
+ builder.append("]
");
+
+ i++;
+ url = base + i + ".jpg";
+ }
+
+ return builder.toString();
+ }
+
+ // HTTP response code, or -1 if other error
+ private int getHttpStatus(URL url) {
+ try {
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ try {
+ connection.setRequestMethod("HEAD");
+ return connection.getResponseCode();
+ } finally {
+ connection.disconnect();
+ }
+ } catch (Exception e) {
+ return -1;
+ }
+ }
+
+ @Override
+ protected boolean supports(URL url) {
+ return "mangahub.io".equals(url.getHost()) || "www.mangahub.io".equals(url.getHost());
+ }
+}