Better URL entries + fix for FimFicAPI:
[fanfix.git] / src / be / nikiroo / fanfix / supported / FimfictionApi.java
index b2d75df98b9c06437c21bf776843f32ad75b2675..52678e402a2e1c98b65560b12a0a8df825424252 100644 (file)
@@ -3,11 +3,13 @@ package be.nikiroo.fanfix.supported;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.TreeMap;
 
 import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.bundles.Config;
@@ -23,7 +25,7 @@ import be.nikiroo.utils.Progress;
  * 
  * @author niki
  */
-class FimfictionApi extends BasicSupport {
+class FimfictionApi extends BasicSupport_Deprecated {
        private String oauth;
        private String storyId;
        private String json;
@@ -87,19 +89,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"
@@ -132,12 +130,16 @@ class FimfictionApi extends BasicSupport {
                meta.setPublisher(getSourceName());
                meta.setUuid(source.toString());
                meta.setLuid("");
-               meta.setLang("EN");
+               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")));
+
+               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 +152,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());
                        }
                }
 
@@ -166,10 +168,8 @@ class FimfictionApi extends BasicSupport {
        @Override
        protected List<Entry<String, URL>> getChapters(URL source, InputStream in,
                        Progress pg) {
-               List<Entry<String, URL>> urls = new ArrayList<Entry<String, URL>>();
-
-               chapterNames = new HashMap<Integer, String>();
-               chapterContents = new HashMap<Integer, String>();
+               chapterNames = new TreeMap<Integer, String>();
+               chapterContents = new TreeMap<Integer, String>();
 
                int pos = 0;
                while (pos >= 0) {
@@ -180,32 +180,23 @@ 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);
-
-                               urls.add(new Entry<String, URL>() {
-                                       @Override
-                                       public URL setValue(URL value) {
-                                               return null;
-                                       }
-
-                                       @Override
-                                       public String getKey() {
-                                               return title;
-                                       }
-
-                                       @Override
-                                       public URL getValue() {
-                                               return null;
-                                       }
-                               });
+                               chapterContents.put(number, content + notes);
                        }
                }
 
+               List<Entry<String, URL>> urls = new ArrayList<Entry<String, URL>>();
+               for (String title : chapterNames.values()) {
+                       urls.add(new AbstractMap.SimpleEntry(title, null));
+               }
+
                return urls;
        }
 
@@ -250,6 +241,7 @@ class FimfictionApi extends BasicSupport {
                                null, null);
 
                String jsonToken = IOUtils.readSmallStream(in);
+               in.close();
 
                // Extract token type and token from: {
                // token_type = "Bearer",
@@ -287,15 +279,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);
@@ -307,6 +299,8 @@ class FimfictionApi extends BasicSupport {
                        }
                }
 
+               result = result.replace("\\t", "\t").replace("\\\"", "\"");
+
                return result;
        }