X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FE621.java;h=dfa9e5ed6a60e4694fc8494dcf196b4328259ee6;hb=727108fef9dcc661d45fa69ebf8b76f5128a2b6f;hp=f299ee7ff8d14b00df5cd3ca12318237a37d32ef;hpb=ce297a794b1b7d3aa4e9234a6511dd9fe7216656;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/supported/E621.java b/src/be/nikiroo/fanfix/supported/E621.java index f299ee7..dfa9e5e 100644 --- a/src/be/nikiroo/fanfix/supported/E621.java +++ b/src/be/nikiroo/fanfix/supported/E621.java @@ -2,9 +2,14 @@ package be.nikiroo.fanfix.supported; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; import java.net.URL; +import java.net.URLDecoder; import java.util.AbstractMap; import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import java.util.Scanner; @@ -28,11 +33,6 @@ import be.nikiroo.utils.StringUtils; * @author niki */ class E621 extends BasicSupport_Deprecated { - @Override - public String getSourceName() { - return "e621.net"; - } - @Override protected MetaData getMeta(URL source, InputStream in) throws IOException { MetaData meta = new MetaData(); @@ -40,22 +40,58 @@ class E621 extends BasicSupport_Deprecated { meta.setTitle(getTitle(reset(in))); meta.setAuthor(getAuthor(source, reset(in))); meta.setDate(""); - meta.setTags(new ArrayList()); // TODDO ??? - meta.setSource(getSourceName()); + meta.setTags(getTags(source, reset(in), false)); + meta.setSource(getType().getSourceName()); meta.setUrl(source.toString()); - meta.setPublisher(getSourceName()); + meta.setPublisher(getType().getSourceName()); meta.setUuid(source.toString()); meta.setLuid(""); meta.setLang("en"); meta.setSubject("Furry"); meta.setType(getType().toString()); meta.setImageDocument(true); - meta.setCover(getCover(source)); + meta.setCover(getCover(source, reset(in))); meta.setFakeCover(true); return meta; } + private List getTags(URL source, InputStream in, boolean authors) { + List tags = new ArrayList(); + + if (isSearch(source)) { + String tagLine = getLine(in, "id=\"tag-sidebar\"", 1); + if (tagLine != null) { + String key = "href=\""; + for (int pos = tagLine.indexOf(key); pos >= 0; pos = tagLine + .indexOf(key, pos + 1)) { + int end = tagLine.indexOf("\"", pos + key.length()); + if (end >= 0) { + String href = tagLine.substring(pos, end); + String subkey; + if (authors) + subkey = "?name="; + else + subkey = "?title="; + if (href.contains(subkey)) { + String tag = href.substring(href.indexOf(subkey) + + subkey.length()); + try { + tags.add(URLDecoder.decode(tag, "UTF-8")); + } catch (UnsupportedEncodingException e) { + // supported JVMs must have UTF-8 support + e.printStackTrace(); + } + } + } + } + + } + } + + return tags; + } + @Override public Story process(URL url, Progress pg) throws IOException { // There is no chapters on e621, just pagination... @@ -80,7 +116,7 @@ class E621 extends BasicSupport_Deprecated { } return ("e621.net".equals(host) || "e926.net".equals(host)) - && url.getPath().startsWith("/pool/"); + && (isPool(url) || isSearch(url)); } @Override @@ -88,10 +124,13 @@ class E621 extends BasicSupport_Deprecated { return true; } - private Image getCover(URL source) throws IOException { - InputStream in = Instance.getCache().open(source, this, true); - String images = getChapterContent(new URL(source.toString() + "?page=" - + 1), in, 1, null); + private Image getCover(URL source, InputStream in) throws IOException { + URL urlForCover = source; + if (isPool(source)) { + urlForCover = new URL(source.toString() + "?page=1"); + } + + String images = getChapterContent(urlForCover, in, 1, null); if (!images.isEmpty()) { int pos = images.indexOf("
"); if (pos >= 0) { @@ -104,6 +143,17 @@ class E621 extends BasicSupport_Deprecated { } private String getAuthor(URL source, InputStream in) { + if (isSearch(source)) { + StringBuilder builder = new StringBuilder(); + for (String author : getTags(source, in, true)) { + if (builder.length() > 0) + builder.append(", "); + builder.append(author); + } + + return builder.toString(); + } + String author = getLine(in, "href=\"/post/show/", 0); if (author != null) { String key = "href=\""; @@ -194,6 +244,58 @@ class E621 extends BasicSupport_Deprecated { @Override protected List> getChapters(URL source, InputStream in, Progress pg) throws IOException { + if (isPool(source)) { + return getChaptersPool(source, in, pg); + } else if (isSearch(source)) { + return getChaptersSearch(source, in, pg); + } + + return new LinkedList>(); + } + + private List> getChaptersSearch(URL source, + InputStream in, Progress pg) throws IOException { + List> urls = new ArrayList>(); + + String search = source.getPath(); + if (search.endsWith("/")) { + search = search.substring(0, search.length() - 1); + } + + int pos = search.lastIndexOf('/'); + if (pos >= 0) { + search = search.substring(pos + 1); + } + + String baseUrl = "https://e621.net/post/index/"; + if (source.getHost().contains("e926")) { + baseUrl = baseUrl.replace("e621", "e926"); + } + + for (int i = 1; true; i++) { + URL url = new URL(baseUrl + i + "/" + search + "/"); + try { + InputStream pageI = Instance.getCache().open(url, this, false); + try { + if (getLine(pageI, "No posts matched your search.", 0) != null) + break; + urls.add(new AbstractMap.SimpleEntry("Page " + + Integer.toString(i), url)); + } finally { + pageI.close(); + } + } catch (Exception e) { + break; + } + } + + // They are sorted in reverse order on the website + Collections.reverse(urls); + return urls; + } + + private List> getChaptersPool(URL source, + InputStream in, Progress pg) throws IOException { List> urls = new ArrayList>(); int last = 1; // no pool/show when only one page @@ -265,4 +367,43 @@ class E621 extends BasicSupport_Deprecated { return builder.toString(); } + + @Override + protected URL getCanonicalUrl(URL source) { + if (isSearch(source)) { + // /post?tags=tag1+tag2 -> ../post/index/1/tag1%32tag2 + String key = "?tags="; + if (source.toString().contains(key)) { + int pos = source.toString().indexOf(key); + String tags = source.toString().substring(pos + key.length()); + tags = tags.replace("+", "%20"); + + String base = source.toString().substring(0, pos); + if (!base.endsWith("/")) { + base += "/"; + } + if (base.endsWith("/search/")) { + base = base.substring(0, base.indexOf("/search/") + 1); + } + + try { + return new URL(base + "index/1/" + tags); + } catch (MalformedURLException e) { + Instance.getTraceHandler().error(e); + } + } + } + + return super.getCanonicalUrl(source); + } + + private boolean isPool(URL url) { + return url.getPath().startsWith("/pool/"); + } + + private boolean isSearch(URL url) { + return url.getPath().startsWith("/post/index/") + || (url.getPath().equals("/post/search") && url.getQuery() + .startsWith("tags=")); + } }