X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FFimfiction.java;fp=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FFimfiction.java;h=61f61d2f5856c4732c87f27df1f00b96e7f6f0f2;hb=08fe2e33007063e30fe22dc1d290f8afaa18eb1d;hp=0000000000000000000000000000000000000000;hpb=ed48062ebfb0d611b74834e313bfb0a2b81416e6;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/supported/Fimfiction.java b/src/be/nikiroo/fanfix/supported/Fimfiction.java new file mode 100644 index 0000000..61f61d2 --- /dev/null +++ b/src/be/nikiroo/fanfix/supported/Fimfiction.java @@ -0,0 +1,236 @@ +package be.nikiroo.fanfix.supported; + +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Scanner; + +import be.nikiroo.fanfix.Instance; + +/** + * Support class for FimFiction.net + * stories, a website dedicated to My Little Pony. + * + * @author niki + */ +class Fimfiction extends BasicSupport { + @Override + protected boolean isHtml() { + return true; + } + + @Override + public String getSourceName() { + return "FimFiction.net"; + } + + @Override + protected String getSubject(URL source, InputStream in) { + return "MLP"; + } + + @Override + public Map getCookies() { + Map cookies = new HashMap(); + cookies.put("view_mature", "true"); + return cookies; + } + + @Override + protected List getTags(URL source, InputStream in) { + List tags = new ArrayList(); + tags.add("MLP"); + + @SuppressWarnings("resource") + Scanner scan = new Scanner(in, "UTF-8"); + scan.useDelimiter("\\n"); + while (scan.hasNext()) { + String line = scan.next(); + if (line.contains("story_category") && !line.contains("title=")) { + int pos = line.indexOf('>'); + if (pos >= 0) { + line = line.substring(pos + 1); + pos = line.indexOf('<'); + if (pos >= 0) { + line = line.substring(0, pos); + } + } + + line = line.trim(); + if (!tags.contains(line)) { + tags.add(line); + } + } + } + + return tags; + } + + @Override + protected String getTitle(URL source, 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; + } + + @Override + protected String getAuthor(URL source, InputStream in) { + String line = getLine(in, " href=\"/user/", 0); + if (line != null) { + int pos = line.indexOf('"'); + if (pos >= 0) { + line = line.substring(pos + 1); + pos = line.indexOf('"'); + if (pos >= 0) { + line = line.substring(0, pos); + pos = line.lastIndexOf('/'); + if (pos >= 0) { + line = line.substring(pos + 1); + return line.replace('+', ' '); + } + } + } + } + + return null; + } + + @Override + protected String getDate(URL source, InputStream in) { + String line = getLine(in, "", 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).trim(); + } + } + } + + return null; + } + + @Override + protected String getDesc(URL source, InputStream in) { + // the og: meta version is the SHORT resume, this is the LONG resume + return getLine(in, "class=\"more_button hidden\"", -1); + } + + @Override + protected URL getCover(URL url, InputStream in) { + // Note: the 'og:image' is the SMALL cover, not the full version + String cover = getLine(in, "
", 1); + if (cover != null) { + int pos = cover.indexOf('"'); + if (pos >= 0) { + cover = cover.substring(pos + 1); + pos = cover.indexOf('"'); + if (pos >= 0) { + cover = cover.substring(0, pos); + } + } + } + + if (cover != null) { + try { + return new URL(cover); + } catch (MalformedURLException e) { + Instance.syserr(e); + } + } + + return null; + } + + @Override + protected List> getChapters(URL source, InputStream in) { + List> urls = new ArrayList>(); + @SuppressWarnings("resource") + Scanner scan = new Scanner(in, "UTF-8"); + scan.useDelimiter("\\n"); + while (scan.hasNext()) { + String line = scan.next(); + if (line.contains("class=\"chapter_link\"") + || line.contains("class='chapter_link'")) { + // Chapter name + String name = line; + int pos = name.indexOf('>'); + if (pos >= 0) { + name = name.substring(pos + 1); + pos = name.indexOf('<'); + if (pos >= 0) { + name = name.substring(0, pos); + } + } + // Chapter content + pos = line.indexOf('/'); + if (pos >= 0) { + line = line.substring(pos); // we take the /, not +1 + pos = line.indexOf('"'); + if (pos >= 0) { + line = line.substring(0, pos); + } + } + + try { + final String key = name; + final URL value = new URL("http://www.fimfiction.net" + + line); + urls.add(new Entry() { + public URL setValue(URL value) { + return null; + } + + public String getKey() { + return key; + } + + public URL getValue() { + return value; + } + }); + } catch (MalformedURLException e) { + Instance.syserr(e); + } + } + } + + return urls; + } + + @Override + protected String getChapterContent(URL source, InputStream in, int number) { + return getLine(in, "
", 1); + } + + @Override + protected boolean supports(URL url) { + return "fimfiction.net".equals(url.getHost()) + || "www.fimfiction.net".equals(url.getHost()); + } +}