From 315f14ae3752d90c683a07fa20f1aa53f6010d6d Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Wed, 12 Jul 2017 21:52:17 +0200 Subject: [PATCH] New FimFiction.net API downloading: - the new class FimfictionApi can download stories from the new API - it will only do so if a token (or a client key/pass) is conigured - Cache was adapted to use directories (shorter filenames) - Cache now supports GET/POST parameters - Cache now supports OAuth2 (enough for Fimfiction new API) - Debug mode will now output cache hit/miss on stderr --- changelog.md | 2 + ...es.jar => nikiroo-utils-2.1.0-sources.jar} | Bin 254448 -> 254684 bytes src/be/nikiroo/fanfix/Cache.java | 197 ++++++++---- src/be/nikiroo/fanfix/Instance.java | 9 + src/be/nikiroo/fanfix/bundles/Config.java | 10 +- .../nikiroo/fanfix/bundles/config.properties | 6 + .../fanfix/supported/BasicSupport.java | 184 ++++++++--- .../fanfix/supported/FimfictionApi.java | 286 ++++++++++++++++++ src/be/nikiroo/fanfix/supported/YiffStar.java | 2 +- 9 files changed, 598 insertions(+), 98 deletions(-) rename libs/{nikiroo-utils-2.0.0-sources.jar => nikiroo-utils-2.1.0-sources.jar} (76%) create mode 100644 src/be/nikiroo/fanfix/supported/FimfictionApi.java diff --git a/changelog.md b/changelog.md index cfcfb82..3747022 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,8 @@ - A server option to offer stories on the network - A remote library to get said stories from the network - Update to latest version of nikiroo-utils +- New option to download from FimFiction via the new beta API +- Cache update (you may want to clear your current cache) ## Version 1.5.3 diff --git a/libs/nikiroo-utils-2.0.0-sources.jar b/libs/nikiroo-utils-2.1.0-sources.jar similarity index 76% rename from libs/nikiroo-utils-2.0.0-sources.jar rename to libs/nikiroo-utils-2.1.0-sources.jar index 26cad686d38e5fc964c55cf896bcea20a91b9fc0..b6143e85a7855a7e99385038ae2c53ee048d4a25 100644 GIT binary patch delta 53243 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 a{+po9D=unc34jH=hX5R3UIk=DnEwI%>LP*w delta 53037 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 WtAO!pv1)Xx7)8_GSX~a)2KOIge# postParams) throws IOException { - return openNoCache(url, support, url, postParams); + Map postParams, Map getParams, + String oauth) throws IOException { + return openNoCache(url, support, url, postParams, getParams, oauth); } /** @@ -212,40 +223,75 @@ public class Cache { * the original {@link URL} before any redirection occurs * @param postParams * the POST parameters - * + * @param getParams + * the GET parameters (priority over POST) + * @param oauth + * OAuth authorization (aka, "bearer XXXXXXX") * @return the {@link InputStream} of the opened page * * @throws IOException * in case of I/O error */ private InputStream openNoCache(URL url, BasicSupport support, - final URL originalUrl, Map postParams) - throws IOException { + final URL originalUrl, Map postParams, + Map getParams, String oauth) throws IOException { + + if (Instance.isDebug()) { + System.err.println("Open no cache: " + url); + } URLConnection conn = openConnectionWithCookies(url, support); - if (postParams != null && conn instanceof HttpURLConnection) { - StringBuilder postData = new StringBuilder(); - for (Map.Entry param : postParams.entrySet()) { - if (postData.length() != 0) - postData.append('&'); - postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); - postData.append('='); - postData.append(URLEncoder.encode( - String.valueOf(param.getValue()), "UTF-8")); + if (support != null) { + // priority: arguments + if (oauth == null) { + oauth = support.getOAuth(); + } + } + + // Priority: GET over POST + Map params = getParams; + if (getParams == null) { + params = postParams; + } + + if ((params != null || oauth != null) + && conn instanceof HttpURLConnection) { + StringBuilder requestData = null; + if (params != null) { + requestData = new StringBuilder(); + for (Map.Entry param : params.entrySet()) { + if (requestData.length() != 0) + requestData.append('&'); + requestData.append(URLEncoder.encode(param.getKey(), + "UTF-8")); + requestData.append('='); + requestData.append(URLEncoder.encode( + String.valueOf(param.getValue()), "UTF-8")); + } + + conn.setDoOutput(true); + + if (getParams == null && postParams != null) { + ((HttpURLConnection) conn).setRequestMethod("POST"); + } + + conn.setRequestProperty("Content-Type", + "application/x-www-form-urlencoded"); + conn.setRequestProperty("charset", "utf-8"); } - conn.setDoOutput(true); - ((HttpURLConnection) conn).setRequestMethod("POST"); - conn.setRequestProperty("Content-Type", - "application/x-www-form-urlencoded"); - conn.setRequestProperty("charset", "utf-8"); + if (oauth != null) { + conn.setRequestProperty("Authorization", oauth); + } - OutputStreamWriter writer = new OutputStreamWriter( - conn.getOutputStream()); + if (requestData != null) { + OutputStreamWriter writer = new OutputStreamWriter( + conn.getOutputStream()); - writer.write(postData.toString()); - writer.flush(); - writer.close(); + writer.write(requestData.toString()); + writer.flush(); + writer.close(); + } } conn.connect(); @@ -255,7 +301,7 @@ public class Cache { && ((HttpURLConnection) conn).getResponseCode() / 100 == 3) { String newUrl = conn.getHeaderField("Location"); return openNoCache(new URL(newUrl), support, originalUrl, - postParams); + postParams, getParams, oauth); } InputStream in = conn.getInputStream(); @@ -343,6 +389,9 @@ public class Cache { */ public File addToCache(InputStream in, String uniqueID) throws IOException { File file = getCached(uniqueID); + File subdir = new File(file.getParentFile(), "_"); + file = new File(subdir, file.getName()); + subdir.mkdir(); IOUtils.write(in, file); return file; } @@ -358,6 +407,8 @@ public class Cache { */ public InputStream getFromCache(String uniqueID) { File file = getCached(uniqueID); + File subdir = new File(file.getParentFile(), "_"); + file = new File(subdir, file.getName()); if (file.exists()) { try { return new MarkableFileInputStream(new FileInputStream(file)); @@ -377,17 +428,36 @@ public class Cache { * @return the number of cleaned items */ public int cleanCache(boolean onlyOld) { + return cleanCache(onlyOld, dir); + } + + /** + * Clean the cache (delete the cached items) in the given cache directory. + * + * @param onlyOld + * only clean the files that are considered too old + * @param cacheDir + * the cache directory to clean + * + * @return the number of cleaned items + */ + private int cleanCache(boolean onlyOld, File cacheDir) { int num = 0; - for (File file : dir.listFiles()) { - if (!onlyOld || isOld(file, true)) { - if (file.delete()) { - num++; - } else { - System.err.println("Cannot delete temporary file: " - + file.getAbsolutePath()); + for (File file : cacheDir.listFiles()) { + if (file.isDirectory()) { + num += cleanCache(onlyOld, file); + } else { + if (!onlyOld || isOld(file, true)) { + if (file.delete()) { + num++; + } else { + System.err.println("Cannot delete temporary file: " + + file.getAbsolutePath()); + } } } } + return num; } @@ -432,7 +502,8 @@ public class Cache { */ private void save(URL url, BasicSupport support, URL originalUrl) throws IOException { - InputStream in = openNoCache(url, support, originalUrl, null); + InputStream in = openNoCache(url, support, originalUrl, null, null, + null); try { File cached = getCached(originalUrl); BufferedOutputStream out = new BufferedOutputStream( @@ -513,28 +584,39 @@ public class Cache { } /** - * Get the cache resource from the cache if it is present for this - * {@link URL}. + * Return the associated cache {@link File} from this {@link URL}. * * @param url * the url * - * @return the cached version if present, NULL if not + * @return the cached {@link File} version of this {@link URL} */ private File getCached(URL url) { + File subdir = null; + String name = url.getHost(); if (name == null || name.isEmpty()) { name = url.getFile(); } else { - name = url.toString(); + File cacheDir = getCached(".").getParentFile(); + File subsubDir = new File(cacheDir, allowedChars(url.getHost())); + subdir = new File(subsubDir, "_" + allowedChars(url.getPath())); + name = allowedChars("_" + url.getQuery()); } - return getCached(name); + File cacheFile = getCached(name); + if (subdir != null) { + cacheFile = new File(subdir, cacheFile.getName()); + subdir.mkdirs(); + } + + return cacheFile; } /** - * Get the cache resource from the cache if it is present for this unique - * ID. + * Get the basic cache resource file corresponding to this unique ID. + *

+ * Note that you may need to add a sub-directory in some cases. * * @param uniqueID * the id @@ -542,10 +624,19 @@ public class Cache { * @return the cached version if present, NULL if not */ private File getCached(String uniqueID) { - uniqueID = uniqueID.replace('/', '_').replace(':', '_') - .replace("\\", "_"); + return new File(dir, allowedChars(uniqueID)); + } - return new File(dir, uniqueID); + /** + * Replace not allowed chars (in a {@link File}) by "_". + * + * @param raw + * the raw {@link String} + * + * @return the sanitised {@link String} + */ + private String allowedChars(String raw) { + return raw.replace('/', '_').replace(':', '_').replace("\\", "_"); } /** @@ -566,18 +657,14 @@ public class Cache { } if (support != null) { - try { - for (Map.Entry set : support.getCookies() - .entrySet()) { - if (builder.length() > 0) { - builder.append(';'); - } - builder.append(set.getKey()); - builder.append('='); - builder.append(set.getValue()); + for (Map.Entry set : support.getCookies() + .entrySet()) { + if (builder.length() > 0) { + builder.append(';'); } - } catch (IOException e) { - Instance.syserr(e); + builder.append(set.getKey()); + builder.append('='); + builder.append(set.getValue()); } } diff --git a/src/be/nikiroo/fanfix/Instance.java b/src/be/nikiroo/fanfix/Instance.java index 2231414..9b6448e 100644 --- a/src/be/nikiroo/fanfix/Instance.java +++ b/src/be/nikiroo/fanfix/Instance.java @@ -262,6 +262,15 @@ public class Instance { } } + /** + * The program is in DEBUG mode (more verbose). + * + * @return TRUE if it is + */ + public static boolean isDebug() { + return debug; + } + /** * Return a path, but support the special $HOME variable. * diff --git a/src/be/nikiroo/fanfix/bundles/Config.java b/src/be/nikiroo/fanfix/bundles/Config.java index 63e6465..ae60b75 100644 --- a/src/be/nikiroo/fanfix/bundles/Config.java +++ b/src/be/nikiroo/fanfix/bundles/Config.java @@ -54,5 +54,13 @@ public enum Config { @Meta(description = "Login information (password) for YiffStar to have access to all the stories (should not be necessary anymore)", format = Format.PASSWORD) LOGIN_YIFFSTAR_PASS, // @Meta(description = "If the last update check was done at least that many days, check for updates at startup (-1 for 'no checks' -- default is 1 day)", format = Format.INT) - UPDATE_INTERVAL, + UPDATE_INTERVAL, // + @Meta(description = "An API key required to create a token from FimFiction", format = Format.STRING) + LOGIN_FIMFICTION_APIKEY_CLIENT_ID, // + @Meta(description = "An API key required to create a token from FimFiction", format = Format.PASSWORD) + LOGIN_FIMFICTION_APIKEY_CLIENT_SECRET, // + @Meta(description = "Do not use the new API, even if we have a token, and force HTML scraping", format = Format.BOOLEAN) + LOGIN_FIMFICTION_APIKEY_FORCE_HTML, // + @Meta(description = "A token is required to use the beta APIv2 from FimFiction (see APIKEY_CLIENT_*)", format = Format.PASSWORD) + LOGIN_FIMFICTION_APIKEY_TOKEN, // } diff --git a/src/be/nikiroo/fanfix/bundles/config.properties b/src/be/nikiroo/fanfix/bundles/config.properties index 061b0fb..937c421 100644 --- a/src/be/nikiroo/fanfix/bundles/config.properties +++ b/src/be/nikiroo/fanfix/bundles/config.properties @@ -65,3 +65,9 @@ LOGIN_YIFFSTAR_PASS = # If the last update check was done at least that many days, check for updates at startup (-1 for 'no checks' -- default is 1 day) # (FORMAT: INT) UPDATE_INTERVAL = +# An API key required to use the beta APIv2 from FimFiction +# (FORMAT: PASSWORD) +LOGIN_FIMFICTION_APIKEY = +# Do not use the new API, even if we have an API key, and force HTML scraping +# (FORMAT: BOOLEAN) +LOGIN_FIMFICTION_FORCE_HTML = diff --git a/src/be/nikiroo/fanfix/supported/BasicSupport.java b/src/be/nikiroo/fanfix/supported/BasicSupport.java index d56e52d..e6089eb 100644 --- a/src/be/nikiroo/fanfix/supported/BasicSupport.java +++ b/src/be/nikiroo/fanfix/supported/BasicSupport.java @@ -271,8 +271,8 @@ public abstract class BasicSupport { * @throws IOException * in case of I/O error */ + @SuppressWarnings("unused") public void login() throws IOException { - } /** @@ -283,14 +283,20 @@ public abstract class BasicSupport { * it. * * @return the cookies - * - * @throws IOException - * in case of I/O error */ - public Map getCookies() throws IOException { + public Map getCookies() { return new HashMap(); } + /** + * OAuth authorisation (aka, "bearer XXXXXXX"). + * + * @return the OAuth string + */ + public String getOAuth() { + return null; + } + /** * Return the canonical form of the main {@link URL}. * @@ -302,6 +308,7 @@ public abstract class BasicSupport { * @throws IOException * in case of I/O error */ + @SuppressWarnings("unused") public URL getCanonicalUrl(URL source) throws IOException { return source; } @@ -355,11 +362,7 @@ public abstract class BasicSupport { setCurrentReferer(url); - in = openInput(url); - if (in == null) { - return null; - } - + in = openInput(url); // NULL allowed here try { preprocess(url, getInput()); pg.setProgress(30); @@ -465,9 +468,12 @@ public abstract class BasicSupport { int i = 1; for (Entry chap : chapters) { pgChaps.setName("Extracting chapter " + i); - setCurrentReferer(chap.getValue()); - InputStream chapIn = Instance.getCache().open( - chap.getValue(), this, true); + InputStream chapIn = null; + if (chap.getValue() != null) { + setCurrentReferer(chap.getValue()); + chapIn = Instance.getCache().open(chap.getValue(), + this, true); + } pgChaps.setProgress(i * 100); try { Progress pgGetChapterContent = new Progress(); @@ -494,7 +500,9 @@ public abstract class BasicSupport { story.getMeta().setWords(words); } } finally { - chapIn.close(); + if (chapIn != null) { + chapIn.close(); + } } i++; @@ -586,6 +594,7 @@ public abstract class BasicSupport { * @throws IOException * on I/O error */ + @SuppressWarnings("unused") protected void close() throws IOException { } @@ -972,6 +981,9 @@ public abstract class BasicSupport { /** * Open the input file that will be used through the support. + *

+ * Can return NULL, in which case you are supposed to work without an + * {@link InputStream}. * * @param source * the source {@link URL} @@ -985,22 +997,6 @@ public abstract class BasicSupport { return Instance.getCache().open(source, this, false); } - /** - * Reset the given {@link InputStream} and return it. - * - * @param in - * the {@link InputStream} to reset - * - * @return the same {@link InputStream} after reset - */ - protected InputStream reset(InputStream in) { - try { - in.reset(); - } catch (IOException e) { - } - return in; - } - /** * Reset then return {@link BasicSupport#in}. * @@ -1400,7 +1396,12 @@ public abstract class BasicSupport { case INFO_TEXT: return new InfoText().setType(type); case FIMFICTION: - return new Fimfiction().setType(type); + try { + // Can fail if no client key or NO in options + return new FimfictionApi().setType(type); + } catch (IOException e) { + return new Fimfiction().setType(type); + } case FANFICTION: return new Fanfiction().setType(type); case TEXT: @@ -1422,6 +1423,25 @@ public abstract class BasicSupport { return null; } + /** + * Reset the given {@link InputStream} and return it. + * + * @param in + * the {@link InputStream} to reset + * + * @return the same {@link InputStream} after reset + */ + static protected InputStream reset(InputStream in) { + try { + if (in != null) { + in.reset(); + } + } catch (IOException e) { + } + + return in; + } + /** * Return the first line from the given input which correspond to the given * selectors. @@ -1438,7 +1458,8 @@ public abstract class BasicSupport { * * @return the line */ - static String getLine(InputStream in, String needle, int relativeLine) { + static protected String getLine(InputStream in, String needle, + int relativeLine) { return getLine(in, needle, relativeLine, true); } @@ -1461,15 +1482,11 @@ public abstract class BasicSupport { * * @return the line */ - static String getLine(InputStream in, String needle, int relativeLine, - boolean first) { + static protected String getLine(InputStream in, String needle, + int relativeLine, boolean first) { String rep = null; - try { - in.reset(); - } catch (IOException e) { - Instance.syserr(e); - } + reset(in); List lines = new ArrayList(); @SuppressWarnings("resource") @@ -1524,11 +1541,32 @@ public abstract class BasicSupport { * the end key or NULL for "up to the end" * @return the text or NULL if not found */ - static String getKeyLine(InputStream in, String key, String subKey, + static protected String getKeyLine(InputStream in, String key, + String subKey, String endKey) { + return getKeyText(getLine(in, key, 0), key, subKey, endKey); + } + + /** + * Return the text between the key and the endKey (and optional subKey can + * be passed, in this case we will look for the key first, then take the + * text between the subKey and the endKey). + * + * @param in + * the input + * @param key + * the key to match (also supports "^" at start to say + * "only if it starts with" the key) + * @param subKey + * the sub key or NULL if none + * @param endKey + * the end key or NULL for "up to the end" + * @return the text or NULL if not found + */ + static protected String getKeyText(String in, String key, String subKey, String endKey) { String result = null; - String line = getLine(in, key, 0); + String line = in; if (line != null && line.contains(key)) { line = line.substring(line.indexOf(key) + key.length()); if (subKey == null || subKey.isEmpty() || line.contains(subKey)) { @@ -1547,4 +1585,68 @@ public abstract class BasicSupport { return result; } + + /** + * Return the text between the key and the endKey (optional subKeys can be + * passed, in this case we will look for the subKeys first, then take the + * text between the key and the endKey). + * + * @param in + * the input + * @param key + * the key to match + * @param endKey + * the end key or NULL for "up to the end" + * @param afters + * the sub-keys to find before checking for key/endKey + * + * @return the text or NULL if not found + */ + static protected String getKeyTextAfter(String in, String key, + String endKey, String... afters) { + + if (in != null && !in.isEmpty()) { + int pos = indexOfAfter(in, 0, afters); + if (pos < 0) { + return null; + } + + in = in.substring(pos); + } + + return getKeyText(in, key, null, endKey); + } + + /** + * Return the first index after all the given "afters" have been found in + * the {@link String}, or -1 if it was not possible. + * + * @param in + * the input + * @param startAt + * start at this position in the string + * @param afters + * the sub-keys to find before checking for key/endKey + * + * @return the text or NULL if not found + */ + static protected int indexOfAfter(String in, int startAt, String... afters) { + int pos = -1; + if (in != null && !in.isEmpty()) { + pos = startAt; + if (afters != null) { + for (int i = 0; pos >= 0 && i < afters.length; i++) { + String subKey = afters[i]; + if (!subKey.isEmpty()) { + pos = in.indexOf(subKey, pos); + if (pos >= 0) { + pos += subKey.length(); + } + } + } + } + } + + return pos; + } } diff --git a/src/be/nikiroo/fanfix/supported/FimfictionApi.java b/src/be/nikiroo/fanfix/supported/FimfictionApi.java new file mode 100644 index 0000000..591bbb0 --- /dev/null +++ b/src/be/nikiroo/fanfix/supported/FimfictionApi.java @@ -0,0 +1,286 @@ +package be.nikiroo.fanfix.supported; + +import java.io.IOException; +import java.io.InputStream; +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 be.nikiroo.fanfix.Instance; +import be.nikiroo.fanfix.bundles.Config; +import be.nikiroo.fanfix.data.MetaData; +import be.nikiroo.utils.IOUtils; +import be.nikiroo.utils.Progress; + +/** + * Support class for FimFiction.net + * stories, a website dedicated to My Little Pony. + *

+ * This version uses the new, official API of FimFiction. + * + * @author niki + */ +class FimfictionApi extends BasicSupport { + private String oauth; + private String storyId; + private String json; + + private Map chapterNames; + private Map chapterContents; + + public FimfictionApi() throws IOException { + if (Instance.getConfig().getBoolean( + Config.LOGIN_FIMFICTION_APIKEY_FORCE_HTML, false)) { + throw new IOException( + "Configuration is set to force HTML scrapping"); + } + + String oauth = Instance.getConfig().getString( + Config.LOGIN_FIMFICTION_APIKEY_TOKEN); + + if (oauth == null || oauth.isEmpty()) { + String clientId = Instance.getConfig().getString( + Config.LOGIN_FIMFICTION_APIKEY_CLIENT_ID) + + ""; + String clientSecret = Instance.getConfig().getString( + Config.LOGIN_FIMFICTION_APIKEY_CLIENT_SECRET) + + ""; + + if (clientId.trim().isEmpty() || clientSecret.trim().isEmpty()) { + throw new IOException("API key required for the beta API v2"); + } + + oauth = generateOAuth(clientId, clientSecret); + + Instance.getConfig().setString( + Config.LOGIN_FIMFICTION_APIKEY_TOKEN, oauth); + Instance.getConfig().updateFile(); + } + + this.oauth = oauth; + } + + @Override + public String getOAuth() { + return oauth; + } + + @Override + protected boolean isHtml() { + return true; + } + + @Override + public String getSourceName() { + return "FimFiction.net"; + } + + @Override + protected void preprocess(URL source, InputStream in) throws IOException { + // extract the ID from: + // https://www.fimfiction.net/story/123456/name-of-story + storyId = getKeyText(source.toString(), "/story/", null, "/"); + + // Selectors, so to download all I need and only what I need + String storyContent = "fields[story]=title,description,date_published,cover_image"; + String authorContent = "fields[author]=name"; + String chapterContent = "fields[chapter]=chapter_number,title,content,authors_note"; + String contentContent = "fields[content]=html"; + String authorsNoteContent = "fields[authors_note]=html"; + String includes = "author,chapters,tags"; + + String urlString = String.format( + "https://www.fimfiction.net/api/v2/stories/%s?" // + + "%s&%s&"// + + "%s&%s&%s&" // + + "include=%s", // + storyId, // + storyContent, authorContent, // + chapterContent, contentContent, authorsNoteContent,// + includes); + + // URL params must be URL-encoded: "[ ]" <-> "%5B %5D" + urlString = urlString.replace("[", "%5B").replace("]", "%5D"); + + URL url = new URL(urlString); + InputStream jsonIn = Instance.getCache().open(url, this, false); + try { + json = IOUtils.readSmallStream(jsonIn); + } finally { + jsonIn.close(); + } + } + + @Override + protected InputStream openInput(URL source) throws IOException { + return null; + } + + @Override + protected MetaData getMeta(URL source, InputStream in) throws IOException { + MetaData meta = new MetaData(); + + meta.setTitle(getKeyJson(json, 0, "type", "story", "title")); + meta.setAuthor(getKeyJson(json, 0, "type", "user", "name")); + meta.setDate(getKeyJson(json, 0, "type", "story", "date_published")); + meta.setTags(getTags()); + meta.setSource(getSourceName()); + meta.setUrl(source.toString()); + meta.setPublisher(getSourceName()); + meta.setUuid(source.toString()); + meta.setLuid(""); + meta.setLang("EN"); + meta.setSubject("MLP"); + meta.setType(getType().toString()); + meta.setImageDocument(false); + meta.setCover(getImage(this, null, + getKeyJson(json, 0, "type", "story", "cover_image", "full"))); + + return meta; + } + + private List getTags() { + List tags = new ArrayList(); + tags.add("MLP"); + + int pos = 0; + while (pos >= 0) { + pos = indexOfJsonAfter(json, pos, "type", "story_tag"); + if (pos >= 0) { + tags.add(getKeyJson(json, pos, "name")); + } + } + + return tags; + } + + @Override + protected String getDesc(URL source, InputStream in) { + return getKeyJson(json, 0, "type", "story", "description"); + } + + @Override + protected List> getChapters(URL source, InputStream in, + Progress pg) { + List> urls = new ArrayList>(); + + chapterNames = new HashMap(); + chapterContents = new HashMap(); + + int pos = 0; + while (pos >= 0) { + pos = indexOfJsonAfter(json, pos, "type", "chapter"); + if (pos >= 0) { + int posNumber = indexOfJsonAfter(json, pos, "chapter_number"); + int posComa = json.indexOf(",", posNumber); + final int number = Integer.parseInt(json.substring(posNumber, + posComa).trim()); + final String title = getKeyJson(json, pos, "title"); + String notes = getKeyJson(json, pos, "authors_note", "html"); + String content = getKeyJson(json, pos, "content", "html"); + + chapterNames.put(number, title); + chapterContents + .put(number, content + "
* * *
" + notes); + + urls.add(new Entry() { + @Override + public URL setValue(URL value) { + return null; + } + + @Override + public String getKey() { + return title; + } + + @Override + public URL getValue() { + return null; + } + }); + } + } + + return urls; + } + + @Override + protected String getChapterContent(URL source, InputStream in, int number, + Progress pg) { + return chapterContents.get(number); + } + + @Override + protected boolean supports(URL url) { + return "fimfiction.net".equals(url.getHost()) + || "www.fimfiction.net".equals(url.getHost()); + } + + static private String generateOAuth(String clientId, String clientSecret) + throws IOException { + URL url = new URL("https://www.fimfiction.net/api/v2/token"); + Map params = new HashMap(); + params.put("client_id", clientId); + params.put("client_secret", clientSecret); + params.put("grant_type", "client_credentials"); + InputStream in = Instance.getCache().openNoCache(url, null, params, + null, null); + + String jsonToken = IOUtils.readSmallStream(in); + + // Extract token type and token from: { + // token_type = "bearer", + // access_token = "xxxxxxxxxxxxxx" + // } + + String token = getKeyText(jsonToken, "\"access_token\"", "\"", "\""); + String tokenType = getKeyText(jsonToken, "\"token_type\"", "\"", "\""); + + // TODO: remove this once the bug is fixed on the server side + if ("bearer".equals(tokenType)) { + tokenType = "Bearer"; + } + + return tokenType + " " + token; + } + + // afters: [name, value] pairs (or "" for any of them), can end without + // value + static private int indexOfJsonAfter(String json, int startAt, + String... afterKeys) { + ArrayList afters = new ArrayList(); + boolean name = true; + for (String key : afterKeys) { + if (key != null && !key.isEmpty()) { + afters.add("\"" + key + "\""); + } else { + afters.add("\""); + afters.add("\""); + } + + if (name) { + afters.add(":"); + } + + name = !name; + } + + return indexOfAfter(json, startAt, afters.toArray(new String[] {})); + } + + // afters: [name, value] pairs (or "" for any of them), can end without + // value + static private String getKeyJson(String json, int startAt, + String... afterKeys) { + int pos = indexOfJsonAfter(json, startAt, afterKeys); + if (pos < 0) { + return null; + } + + return getKeyText(json.substring(pos), "\"", null, "\""); + } +} diff --git a/src/be/nikiroo/fanfix/supported/YiffStar.java b/src/be/nikiroo/fanfix/supported/YiffStar.java index ba24e50..94c310d 100644 --- a/src/be/nikiroo/fanfix/supported/YiffStar.java +++ b/src/be/nikiroo/fanfix/supported/YiffStar.java @@ -88,7 +88,7 @@ class YiffStar extends BasicSupport { // logged in Instance.getCache() .openNoCache(new URL("https://www.sofurry.com/user/login"), - this, post).close(); + this, post, null, null).close(); } } -- 2.27.0