FimFictionApi: fix for \t and \"
[fanfix.git] / src / be / nikiroo / fanfix / supported / FimfictionApi.java
index 1594d5e18f365d14bfeb227e057bdec07c528bbf..3319bbeed3a93e0076747adf50607c0447a863a0 100644 (file)
@@ -87,19 +87,15 @@ class FimfictionApi extends BasicSupport {
                // 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 chapterContent = "fields[chapter]=chapter_number,title,content_html,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,//
+                               storyContent, authorContent, chapterContent,//
                                includes);
 
                // URL params must be URL-encoded: "[ ]" <-> "%5B %5D"
@@ -136,8 +132,12 @@ class FimfictionApi extends BasicSupport {
                meta.setSubject("MLP");
                meta.setType(getType().toString());
                meta.setImageDocument(false);
-               meta.setCover(getImage(this, null,
-                               getKeyJson(json, 0, "type", "story", "cover_image", "full")));
+               
+               String coverImageLink = 
+                               getKeyJson(json, 0, "type", "story", "cover_image", "full");
+               if (!coverImageLink.trim().isEmpty()) {
+                       meta.setCover(getImage(this, null, coverImageLink.trim()));
+               }
 
                return meta;
        }
@@ -150,7 +150,7 @@ class FimfictionApi extends BasicSupport {
                while (pos >= 0) {
                        pos = indexOfJsonAfter(json, pos, "type", "story_tag");
                        if (pos >= 0) {
-                               tags.add(getKeyJson(json, pos, "name"));
+                               tags.add(getKeyJson(json, pos, "name").trim());
                        }
                }
 
@@ -159,7 +159,8 @@ class FimfictionApi extends BasicSupport {
 
        @Override
        protected String getDesc(URL source, InputStream in) {
-               return getKeyJson(json, 0, "type", "story", "description");
+               String desc = getKeyJson(json, 0, "type", "story", "description");
+               return unbbcode(desc);
        }
 
        @Override
@@ -179,12 +180,16 @@ class FimfictionApi extends BasicSupport {
                                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");
-
+                               String notes = getKeyJson(json, pos, "authors_note_html");
+                               String content = getKeyJson(json, pos, "content_html");
+                               
+                               if (!notes.trim().isEmpty()) {
+                                       notes = "<br/>* * *<br/>" + notes;
+                               }
+                               
                                chapterNames.put(number, title);
                                chapterContents
-                                               .put(number, content + "<br/>* * *<br/>" + notes);
+                                               .put(number, content + notes);
 
                                urls.add(new Entry<String, URL>() {
                                        @Override
@@ -220,6 +225,24 @@ class FimfictionApi extends BasicSupport {
                                || "www.fimfiction.net".equals(url.getHost());
        }
 
+       /**
+        * Generate a new token from the client ID and secret.
+        * <p>
+        * Note that those tokens are long-lived, and it would be badly seen to
+        * create a lot of them without due cause.
+        * <p>
+        * So, please cache and re-use them.
+        * 
+        * @param clientId
+        *            the client ID offered on FimFiction
+        * @param clientSecret
+        *            the client secret that goes with it
+        * 
+        * @return a new generated token linked to that client ID
+        * 
+        * @throws IOException
+        *             in case of I/O errors
+        */
        static private String generateOAuth(String clientId, String clientSecret)
                        throws IOException {
                URL url = new URL("https://www.fimfiction.net/api/v2/token");
@@ -233,18 +256,13 @@ class FimfictionApi extends BasicSupport {
                String jsonToken = IOUtils.readSmallStream(in);
 
                // Extract token type and token from: {
-               // token_type = "bearer",
+               // 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;
        }
 
@@ -273,15 +291,15 @@ class FimfictionApi extends BasicSupport {
        }
 
        // afters: [name, value] pairs (or "" for any of them), can end without
-       // value
+       // value but will then be empty, not NULL
        static private String getKeyJson(String json, int startAt,
                        String... afterKeys) {
                int pos = indexOfJsonAfter(json, startAt, afterKeys);
                if (pos < 0) {
-                       return null;
+                       return "";
                }
 
-               String result = null;
+               String result = "";
                String wip = json.substring(pos);
 
                pos = nextUnescapedQuote(wip, 0);
@@ -292,7 +310,10 @@ class FimfictionApi extends BasicSupport {
                                result = wip.substring(0, pos);
                        }
                }
-
+               
+               result = result.replace("\\t", "\t")
+                       .replace("\\\"", "\"");
+               
                return result;
        }
 
@@ -311,4 +332,13 @@ class FimfictionApi extends BasicSupport {
 
                return pos;
        }
+
+       // quick & dirty filter
+       static private String unbbcode(String bbcode) {
+               String text = bbcode.replace("\\r\\n", "<br/>") //
+                               .replace("[i]", "_").replace("[/i]", "_") //
+                               .replace("[b]", "*").replace("[/b]", "*") //
+                               .replaceAll("\\[[^\\]]*\\]", "");
+               return text;
+       }
 }