X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FMangaLel.java;fp=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FMangaLel.java;h=43d0b2cff22972d6e45dc245ae4b3669ae4bfd9a;hb=af1f506fb4bb7265645e34cd03c6c7178d6a4da7;hp=0000000000000000000000000000000000000000;hpb=e5714913b0f4611e4d5a8dd8ed1b4d204ecc81ee;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/supported/MangaLel.java b/src/be/nikiroo/fanfix/supported/MangaLel.java new file mode 100644 index 0000000..43d0b2c --- /dev/null +++ b/src/be/nikiroo/fanfix/supported/MangaLel.java @@ -0,0 +1,240 @@ +package be.nikiroo.fanfix.supported; + +import java.io.IOException; +import java.io.InputStream; +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.helper.DataUtil; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +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; + +class MangaLel extends BasicSupport { + @Override + protected boolean isHtml() { + return true; + } + + @Override + public String getSourceName() { + return "MangaLel.com"; + } + + @Override + protected MetaData getMeta() throws IOException { + MetaData meta = new MetaData(); + + String[] authorDateTag = getAuthorDateTag(); + + meta.setTitle(getTitle()); + meta.setAuthor(authorDateTag[0]); + meta.setDate(authorDateTag[1]); + meta.setTags(explode(authorDateTag[2])); + meta.setSource(getSourceName()); + meta.setUrl(getSource().toString()); + meta.setPublisher(getSourceName()); + meta.setUuid(getSource().toString()); + meta.setLuid(""); + meta.setLang("fr"); + meta.setSubject("manga"); + meta.setType(getType().toString()); + meta.setImageDocument(true); + meta.setCover(getCover()); + + return meta; + } + + private String getTitle() { + Element doc = getSourceNode(); + Element h2 = doc.getElementsByClass("widget-title").first(); + if (h2 != null) { + return StringUtils.unhtml(h2.text()).trim(); + } + + return null; + } + + // 0 = author + // 1 = date + // 2 = tags + private String[] getAuthorDateTag() { + String[] tab = new String[3]; + + Element doc = getSourceNode(); + Element tabEls = doc.getElementsByClass("dl-horizontal").first(); + int prevOk = 0; + for (Element tabEl : tabEls.children()) { + String txt = tabEl.text().trim(); + if (prevOk > 0) { + if (tab[prevOk - 1] == null) { + tab[prevOk - 1] = ""; + } else { + tab[prevOk - 1] += ", "; + } + + tab[prevOk - 1] += txt; + prevOk = 0; + } else { + if (txt.equals("Auteur(s)") || txt.equals("Artist(s)")) { + prevOk = 1; + } else if (txt.equals("Date de sortie")) { + prevOk = 2; + } else if (txt.equals("Type") || txt.equals("Catégories")) { + prevOk = 3; + } else { + prevOk = 0; + } + } + } + + for (int i = 0; i < 3; i++) { + String list = ""; + for (String item : explode(tab[i])) { + if (!list.isEmpty()) { + list = list + ", "; + } + list += item; + } + tab[i] = list; + } + + return tab; + } + + @Override + protected String getDesc() { + String desc = null; + + Element doc = getSourceNode(); + Element title = doc.getElementsByClass("well").first(); + if (title != null) { + desc = StringUtils.unhtml(title.text()).trim(); + if (desc.startsWith("Résumé")) { + desc = desc.substring("Résumé".length()).trim(); + } + } + + return desc; + } + + private Image getCover() { + Element doc = getSourceNode(); + Element cover = doc.getElementsByClass("img-responsive").first(); + + if (cover != null) { + String coverUrl = cover.absUrl("src"); + + InputStream coverIn; + try { + coverIn = Instance.getCache().open(new URL(coverUrl), this, + true); + try { + return new Image(coverIn); + } finally { + coverIn.close(); + } + } catch (IOException e) { + Instance.getTraceHandler().error(e); + } + } + + return null; + } + + @Override + protected List> getChapters(Progress pg) { + List> urls = new ArrayList>(); + + int i = 1; + Element doc = getSourceNode(); + Element chapEls = doc.getElementsByClass("chapters").first(); + for (Element chapEl : chapEls.getElementsByTag("li")) { + Element titleEl = chapEl.getElementsByTag("h5").first(); + String title = StringUtils.unhtml(titleEl.text()).trim(); + title = Integer.toString(i++); // because Atril does not support + // strange file names + + Element linkEl = chapEl.getElementsByTag("h5").first() + .getElementsByTag("a").first(); + String link = linkEl.absUrl("href"); + + try { + urls.add(new AbstractMap.SimpleEntry(title, + new URL(link))); + } catch (MalformedURLException e) { + Instance.getTraceHandler().error(e); + } + } + + Collections.reverse(urls); + return urls; + } + + @Override + protected String getChapterContent(URL chapUrl, int number, Progress pg) + throws IOException { + if (pg == null) { + pg = new Progress(); + } + + StringBuilder builder = new StringBuilder(); + + InputStream in = Instance.getCache().open(chapUrl, this, false); + try { + Element pageDoc = DataUtil.load(in, "UTF-8", chapUrl.toString()); + Elements linkEls = pageDoc.getElementsByClass("img-responsive"); + for (Element linkEl : linkEls) { + if (linkEl.hasAttr("data-src")) { + builder.append("["); + builder.append(linkEl.absUrl("data-src").trim()); + builder.append("]
"); + } + } + + } finally { + in.close(); + } + + return builder.toString(); + } + + /** + * Explode an HTML comma-separated list of values into a non-duplicate text + * {@link List} . + * + * @param values + * the comma-separated values in HTML format + * + * @return the full list with no duplicate in text format + */ + private List explode(String values) { + List list = new ArrayList(); + if (values != null && !values.isEmpty()) { + for (String auth : values.split(",")) { + String a = StringUtils.unhtml(auth).trim(); + if (!a.isEmpty() && !list.contains(a.trim())) { + list.add(a); + } + } + } + + return list; + } + + @Override + protected boolean supports(URL url) { + return "manga-lel.com".equals(url.getHost()) + || "www.manga-lel.com".equals(url.getHost()); + } +}