web lib: getStory
authorNiki Roo <niki@nikiroo.be>
Mon, 11 May 2020 22:59:29 +0000 (00:59 +0200)
committerNiki Roo <niki@nikiroo.be>
Mon, 11 May 2020 22:59:29 +0000 (00:59 +0200)
src/be/nikiroo/fanfix/data/JsonIO.java
src/be/nikiroo/fanfix/data/Paragraph.java
src/be/nikiroo/fanfix/library/WebLibrary.java
src/be/nikiroo/fanfix/library/WebLibraryServer.java

index db81db65a03b93555445a7ac4254b19707aa9c1f..fee60ce23a57b2b754fae7a1d01159af5eafb7d5 100644 (file)
@@ -7,6 +7,8 @@ import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import be.nikiroo.fanfix.data.Paragraph.ParagraphType;
+
 public class JsonIO {
        static public JSONObject toJson(MetaData meta) {
                if (meta == null) {
@@ -35,6 +37,7 @@ public class JsonIO {
        }
 
        /**
+        * // no image
         * 
         * @param json
         * 
@@ -69,14 +72,61 @@ public class JsonIO {
                return meta;
        }
 
+       static public JSONObject toJson(Story story) {
+               if (story == null) {
+                       return null;
+               }
+
+               JSONObject json = new JSONObject();
+               put(json, "", Story.class.getName());
+               put(json, "meta", toJson(story.getMeta()));
+
+               List<JSONObject> chapters = new ArrayList<JSONObject>();
+               for (Chapter chap : story) {
+                       chapters.add(toJson(chap));
+               }
+               put(json, "chapters", new JSONArray(chapters));
+
+               return json;
+       }
+
+       /**
+        * 
+        * @param json
+        * 
+        * @return
+        * 
+        * @throws JSONException
+        *             when it cannot be converted
+        */
+       static public Story toStory(JSONObject json) {
+               if (json == null) {
+                       return null;
+               }
+
+               Story story = new Story();
+               story.setMeta(toMetaData(getJson(json,"meta")));
+               story.setChapters(toListChapter(getJsonArr(json, "chapters")));
+
+               return story;
+       }
+
        static public JSONObject toJson(Chapter chap) {
                if (chap == null) {
                        return null;
                }
 
                JSONObject json = new JSONObject();
+               put(json, "", Chapter.class.getName());
+               put(json, "name", chap.getName());
+               put(json, "number", chap.getNumber());
+               put(json, "words", chap.getWords());
 
-               // TODO
+               List<JSONObject> paragraphs = new ArrayList<JSONObject>();
+               for (Paragraph para : chap) {
+                       paragraphs.add(toJson(para));
+               }
+               put(json, "paragraphs", new JSONArray(paragraphs));
 
                return json;
        }
@@ -95,13 +145,51 @@ public class JsonIO {
                        return null;
                }
 
-               Chapter chap = new Chapter(0, "");
-
-               // TODO
+               Chapter chap = new Chapter(getInt(json, "number", 0),
+                               getString(json, "name"));
+               chap.setWords(getLong(json, "words", 0));
+               chap.setParagraphs(toListParagraph(getJsonArr(json, "paragraphs")));
 
                return chap;
        }
 
+       // no images
+       static public JSONObject toJson(Paragraph para) {
+               if (para == null) {
+                       return null;
+               }
+
+               JSONObject json = new JSONObject();
+               put(json, "", Paragraph.class.getName());
+               put(json, "type", para.getType());
+               put(json, "content", para.getContent());
+               put(json, "words", para.getWords());
+
+               return json;
+       }
+
+       /**
+        * // no images
+        * 
+        * @param json
+        * 
+        * @return
+        * 
+        * @throws JSONException
+        *             when it cannot be converted
+        */
+       static public Paragraph toParagraph(JSONObject json) {
+               if (json == null) {
+                       return null;
+               }
+
+               Paragraph para = new Paragraph(
+                               ParagraphType.valueOf(getString(json, "type")),
+                               getString(json, "content"), getLong(json, "words", 0));
+
+               return para;
+       }
+
        static public List<String> toListString(JSONArray array) {
                if (array != null) {
                        List<String> values = new ArrayList<String>();
@@ -114,6 +202,31 @@ public class JsonIO {
                return null;
        }
 
+       static public List<Paragraph> toListParagraph(JSONArray array) {
+               if (array != null) {
+                       List<Paragraph> values = new ArrayList<Paragraph>();
+                       for (Object value : array.toList()) {
+                               values.add(
+                                               value instanceof Paragraph ? (Paragraph) value : null);
+                       }
+                       return values;
+               }
+
+               return null;
+       }
+
+       private static List<Chapter> toListChapter(JSONArray array) {
+               if (array != null) {
+                       List<Chapter> values = new ArrayList<Chapter>();
+                       for (Object value : array.toList()) {
+                               values.add(value instanceof Chapter ? (Chapter) value : null);
+                       }
+                       return values;
+               }
+
+               return null;
+       }
+
        static private void put(JSONObject json, String key, Object o) {
                json.put(key, o == null ? JSONObject.NULL : o);
        }
@@ -140,6 +253,17 @@ public class JsonIO {
                return def;
        }
 
+       static int getInt(JSONObject json, String key, int def) {
+               if (json.has(key)) {
+                       Object o = json.get(key);
+                       if (o instanceof Integer) {
+                               return (Integer) o;
+                       }
+               }
+
+               return def;
+       }
+
        static JSONObject getJson(JSONObject json, String key) {
                if (json.has(key)) {
                        Object o = json.get(key);
index 9adc51c420e815492858adbcffbd1b606dab7eda..d5a0f1c618ca6327c5602c1a7a1212c22dbfd6f8 100644 (file)
@@ -129,6 +129,16 @@ public class Paragraph implements Cloneable, Serializable {
                return contentImage;
        }
 
+       /**
+        * The content of this {@link Paragraph} if it is an image.
+        * 
+        * @param contentImage
+        *            the content
+        */
+       public void setContentImage(Image contentImage) {
+               this.contentImage = contentImage;
+       }
+       
        /**
         * The number of words (or images) in this {@link Paragraph}.
         * 
index 369eb23491cd6410cf45027f95a8a0612ee324d5..7f775830edf8c7641eeb3303abdddf3fcdb48fbd 100644 (file)
@@ -13,8 +13,11 @@ import org.json.JSONArray;
 import org.json.JSONObject;
 
 import be.nikiroo.fanfix.Instance;
+import be.nikiroo.fanfix.data.Chapter;
 import be.nikiroo.fanfix.data.JsonIO;
 import be.nikiroo.fanfix.data.MetaData;
+import be.nikiroo.fanfix.data.Paragraph;
+import be.nikiroo.fanfix.data.Paragraph.ParagraphType;
 import be.nikiroo.fanfix.data.Story;
 import be.nikiroo.utils.IOUtils;
 import be.nikiroo.utils.Image;
@@ -135,6 +138,18 @@ public class WebLibrary extends BasicLibrary {
                return null;
        }
 
+       @Override
+       public Image getCustomSourceCover(final String source) throws IOException {
+               // TODO maybe global system in BasicLib ?
+               return null;
+       }
+
+       @Override
+       public Image getCustomAuthorCover(final String author) throws IOException {
+               // TODO maybe global system in BasicLib ?
+               return null;
+       }
+
        @Override
        public void setSourceCover(String source, String luid) throws IOException {
                // TODO Auto-generated method stub
@@ -147,6 +162,45 @@ public class WebLibrary extends BasicLibrary {
                throw new IOException("Not implemented yet");
        }
 
+       @Override
+       public synchronized Story getStory(final String luid, Progress pg)
+                       throws IOException {
+
+               // TODO: pg
+
+               Story story;
+               InputStream in = download("/story/" + luid + "/json");
+               try {
+                       JSONObject json = new JSONObject(IOUtils.readSmallStream(in));
+                       story = JsonIO.toStory(json);
+               } finally {
+                       in.close();
+               }
+
+               story.getMeta().setCover(getCover(luid));
+               int chapNum = 1;
+               for (Chapter chap : story) {
+                       int number = 1;
+                       for (Paragraph para : chap) {
+                               if (para.getType() == ParagraphType.IMAGE) {
+                                       InputStream subin = download(
+                                                       "/story/" + luid + "/" + chapNum + "/" + number);
+                                       try {
+                                               para.setContentImage(new Image(subin));
+                                       } finally {
+                                               subin.close();
+                                       }
+                               }
+
+                               number++;
+                       }
+
+                       chapNum++;
+               }
+
+               return story;
+       }
+
        @Override
        protected List<MetaData> getMetas(Progress pg) throws IOException {
                List<MetaData> metas = new ArrayList<MetaData>();
index a59fa3456d3d294b7614db718eaacadadb2d4415..3e2c90605de78b2956290b4b36b56bb8a6a42688 100644 (file)
@@ -655,6 +655,7 @@ public class WebLibraryServer implements Runnable {
        // /story/luid/chapter/para <-- text/image
        // /story/luid/cover <-- image
        // /story/luid/metadata <-- json
+       // /story/luid/json <-- json, whole chapter (no images)
        private Response getStoryPart(String uri, List<String> whitelist) {
                String[] cover = uri.split("/");
                int off = 2;
@@ -671,7 +672,7 @@ public class WebLibraryServer implements Runnable {
                // 1-based (0 = desc)
                int chapter = 0;
                if (chapterStr != null && !"cover".equals(chapterStr)
-                               && !"metadata".equals(chapterStr)) {
+                               && !"metadata".equals(chapterStr) && !"json".equals(chapterStr)) {
                        try {
                                chapter = Integer.parseInt(chapterStr);
                                if (chapter < 0) {
@@ -710,6 +711,11 @@ public class WebLibraryServer implements Runnable {
                                JSONObject json = JsonIO.toJson(meta);
                                mimeType = "application/json";
                                in = new ByteArrayInputStream(json.toString().getBytes());
+                       }  else if ("json".equals(chapterStr)) {
+                               Story story = story(luid, whitelist);
+                               JSONObject json = JsonIO.toJson(story);
+                               mimeType = "application/json";
+                               in = new ByteArrayInputStream(json.toString().getBytes());
                        } else {
                                Story story = story(luid, whitelist);
                                if (story != null) {