Merge branch 'master' into subtree
[nikiroo-utils.git] / supported / BasicSupport.java
index 7dbd1365aa1970f2b08000420728f85b65e7c1a8..bcfcca1bdbb16cfd3bd8849e8fdb2bfb55a22de0 100644 (file)
@@ -2,14 +2,18 @@ package be.nikiroo.fanfix.supported;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Scanner;
 import java.util.Map.Entry;
 
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.jsoup.helper.DataUtil;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -268,9 +272,16 @@ public abstract class BasicSupport {
                pg.setProgress(30);
 
                Story story = new Story();
+               
                MetaData meta = getMeta();
-               if (meta.getCreationDate() == null || meta.getCreationDate().isEmpty()) {
-                       meta.setCreationDate(StringUtils.fromTime(new Date().getTime()));
+               meta.setType(getType().toString());
+               meta.setSource(getType().getSourceName());
+               meta.setPublisher(getType().getSourceName());
+               
+               if (meta.getCreationDate() == null
+                               || meta.getCreationDate().trim().isEmpty()) {
+                       meta.setCreationDate(bsHelper
+                                       .formatDate(StringUtils.fromTime(new Date().getTime())));
                }
                story.setMeta(meta);
                pg.put("meta", meta);
@@ -293,6 +304,65 @@ public abstract class BasicSupport {
                return story;
        }
 
+       /**
+        * Utility method to convert the given URL into a JSON object.
+        * <p>
+        * Note that this method expects small JSON files (everything is copied into
+        * memory at least twice).
+        * 
+        * @param url
+        *            the URL to parse
+        * @param stable
+        *            TRUE for more stable resources, FALSE when they often change
+        * 
+        * @return the JSON object
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       protected JSONObject getJson(String url, boolean stable)
+                       throws IOException {
+               try {
+                       return getJson(new URL(url), stable);
+               } catch (MalformedURLException e) {
+                       throw new IOException("Malformed URL: " + url, e);
+               }
+       }
+
+       /**
+        * Utility method to convert the given URL into a JSON object.
+        * <p>
+        * Note that this method expects small JSON files (everything is copied into
+        * memory at least twice).
+        * 
+        * @param url
+        *            the URL to parse
+        * @param stable
+        *            TRUE for more stable resources, FALSE when they often change
+        * 
+        * @return the JSON object
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       protected JSONObject getJson(URL url, boolean stable) throws IOException {
+               InputStream in = Instance.getInstance().getCache().open(url, null,
+                               stable);
+               try {
+                       Scanner scan = new Scanner(in);
+                       scan.useDelimiter("\0");
+                       try {
+                               return new JSONObject(scan.next());
+                       } catch (JSONException e) {
+                               throw new IOException(e);
+                       } finally {
+                               scan.close();
+                       }
+               } finally {
+                       in.close();
+               }
+       }
+
        /**
         * Process the given story resource into a fully filled {@link Story}
         * object.
@@ -312,7 +382,25 @@ public abstract class BasicSupport {
                sourceNode = loadDocument(source);
 
                try {
-                       return doProcess(pg);
+                       Story story = doProcess(pg);
+                       
+                       // Check for "no chapters" stories
+                       if (story.getChapters().isEmpty()
+                                       && story.getMeta().getResume() != null
+                                       && !story.getMeta().getResume().getParagraphs().isEmpty()) {
+                               Chapter resume = story.getMeta().getResume();
+                               resume.setName("");
+                               resume.setNumber(1);
+                               story.getChapters().add(resume);
+                               story.getMeta().setWords(resume.getWords());
+
+                               String descChapterName = Instance.getInstance().getTrans()
+                                               .getString(StringId.DESCRIPTION);
+                               resume = new Chapter(0, descChapterName);
+                               story.getMeta().setResume(resume);
+                       }
+                       
+                       return story;
                } finally {
                        close();
                }
@@ -347,14 +435,12 @@ public abstract class BasicSupport {
                pgMeta.done(); // 10%
                pg.put("meta", story.getMeta());
 
-               pg.setName(story.getMeta().getTitle());
-
                Progress pgGetChapters = new Progress();
                pg.addProgress(pgGetChapters, 10);
                story.setChapters(new ArrayList<Chapter>());
                List<Entry<String, URL>> chapters = getChapters(pgGetChapters);
                pgGetChapters.done(); // 20%
-
+               
                if (chapters != null) {
                        Progress pgChaps = new Progress("Extracting chapters", 0,
                                        chapters.size() * 300);
@@ -385,16 +471,16 @@ public abstract class BasicSupport {
 
                                words += cc.getWords();
                                story.getChapters().add(cc);
-                               story.getMeta().setWords(words);
 
                                i++;
                        }
+                       
+                       story.getMeta().setWords(words);
 
                        pgChaps.setName("Extracting chapters");
                        pgChaps.done();
                }
 
-               pg.setName(story.getMeta().getTitle());
                pg.done();
 
                return story;
@@ -412,7 +498,8 @@ public abstract class BasicSupport {
         *            the chapter name
         * @param content
         *            the content of the chapter
-        * @return the {@link Chapter}
+        *            
+        * @return the {@link Chapter}, never NULL
         * 
         * @throws IOException
         *             in case of I/O error