update from master
[fanfix.git] / supported / InfoReader.java
index 15a4f5c4e7bc1234e45d157411fb6279eb7b9ac5..22afc92f8d3521bfc16ba05e38461ac2f4ef77a9 100644 (file)
@@ -9,41 +9,46 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Scanner;
 
-import org.jsoup.nodes.Document;
-
 import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.bundles.Config;
+import be.nikiroo.fanfix.data.Chapter;
 import be.nikiroo.fanfix.data.MetaData;
+import be.nikiroo.utils.IOUtils;
 import be.nikiroo.utils.Image;
 import be.nikiroo.utils.streams.MarkableFileInputStream;
 
-// not complete: no "description" tag
 public class InfoReader {
        static protected BasicSupportHelper bsHelper = new BasicSupportHelper();
-       // static protected BasicSupportImages bsImages = new BasicSupportImages();
-       // static protected BasicSupportPara bsPara = new BasicSupportPara(new
-       // BasicSupportHelper(), new BasicSupportImages());
+       static protected BasicSupportImages bsImages = new BasicSupportImages();
+       static protected BasicSupportPara bsPara = new BasicSupportPara(
+                       new BasicSupportHelper(), new BasicSupportImages());
 
        public static MetaData readMeta(File infoFile, boolean withCover)
                        throws IOException {
                if (infoFile == null) {
                        throw new IOException("File is null");
                }
+               
+               MetaData meta = null;
 
                if (infoFile.exists()) {
                        InputStream in = new MarkableFileInputStream(infoFile);
                        try {
-                               MetaData meta = createMeta(infoFile.toURI().toURL(), in,
+                               meta = createMeta(infoFile.toURI().toURL(), in,
                                                withCover);
 
+                               // Some old .info files were using UUID for URL...
+                               if (!hasIt(meta.getUrl()) && meta.getUuid() != null
+                                               && (meta.getUuid().startsWith("http://")
+                                                               || meta.getUuid().startsWith("https://"))) {
+                                       meta.setUrl(meta.getUuid());
+                               }
+
                                // Some old .info files don't have those now required fields...
                                // So we check if we can find the info in another way (many
                                // formats have a copy of the original text file)
                                if (!hasIt(meta.getTitle(), meta.getAuthor(), meta.getDate(),
                                                meta.getUrl())) {
-
-                                       // TODO: not nice, would be better to do it properly...
-
                                        String base = infoFile.getPath();
                                        if (base.endsWith(".info")) {
                                                base = base.substring(0,
@@ -57,57 +62,94 @@ public class InfoReader {
                                                textFile = new File(base + ".text");
                                        }
 
-                                       if (textFile.exists()) {
-                                               final URL source = textFile.toURI().toURL();
-                                               final MetaData[] superMetaA = new MetaData[1];
-                                               @SuppressWarnings("unused")
-                                               Text unused = new Text() {
-                                                       private boolean loaded = loadDocument();
-
-                                                       @Override
-                                                       public SupportType getType() {
-                                                               return SupportType.TEXT;
-                                                       }
-
-                                                       protected boolean loadDocument()
-                                                                       throws IOException {
-                                                               loadDocument(source);
-                                                               superMetaA[0] = getMeta();
-                                                               return true;
-                                                       }
-
-                                                       @Override
-                                                       protected Image getCover(File sourceFile) {
-                                                               return null;
-                                                       }
-                                               };
-
-                                               MetaData superMeta = superMetaA[0];
-                                               if (!hasIt(meta.getTitle())) {
-                                                       meta.setTitle(superMeta.getTitle());
-                                               }
-                                               if (!hasIt(meta.getAuthor())) {
-                                                       meta.setAuthor(superMeta.getAuthor());
-                                               }
-                                               if (!hasIt(meta.getDate())) {
-                                                       meta.setDate(superMeta.getDate());
-                                               }
-                                               if (!hasIt(meta.getUrl())) {
-                                                       meta.setUrl(superMeta.getUrl());
-                                               }
-                                       }
+                                       completeMeta(textFile, meta);
                                }
 
-                               return meta;
+                               
                        } finally {
                                in.close();
                        }
                }
 
+               if (meta != null) {
+                       try {
+                               File summaryFile = new File(infoFile.getAbsolutePath()
+                                               .replaceFirst("\\.info$", ".summary"));
+                               InputStream in = new MarkableFileInputStream(summaryFile);
+                               try {
+                                       String content = IOUtils.readSmallStream(in);
+                                       Chapter desc = bsPara.makeChapter(null, null, 0,
+                                                       "Description", content, false, null);
+                                       meta.setResume(desc);
+                               } finally {
+                                       in.close();
+                               }
+                       } catch (IOException e) {
+                               // ignore absent or bad summary
+                       }
+                       
+                       return meta;
+               }
+
                throw new FileNotFoundException(
                                "File given as argument does not exists: "
                                                + infoFile.getAbsolutePath());
        }
+       
+       /**
+        * Complete the given {@link MetaData} with the original text file if needed
+        * and possible.
+        * 
+        * @param textFile
+        *            the original text file
+        * @param meta
+        *            the {@link MetaData} to complete if needed and possible
+        * 
+        * @throws IOException
+        *             in case of I/O errors
+        */
+       static public void completeMeta(File textFile,
+                       MetaData meta)  throws IOException {
+               // TODO: not nice, would be better to do it properly...
+               if (textFile != null && textFile.exists()) {
+                       final URL source = textFile.toURI().toURL();
+                       final MetaData[] superMetaA = new MetaData[1];
+                       @SuppressWarnings("unused")
+                       Text unused = new Text() {
+                               private boolean loaded = loadDocument();
+
+                               @Override
+                               public SupportType getType() {
+                                       return SupportType.TEXT;
+                               }
+
+                               protected boolean loadDocument() throws IOException {
+                                       loadDocument(source);
+                                       superMetaA[0] = getMeta();
+                                       return true;
+                               }
+
+                               @Override
+                               protected Image getCover(File sourceFile) {
+                                       return null;
+                               }
+                       };
+
+                       MetaData superMeta = superMetaA[0];
+                       if (!hasIt(meta.getTitle())) {
+                               meta.setTitle(superMeta.getTitle());
+                       }
+                       if (!hasIt(meta.getAuthor())) {
+                               meta.setAuthor(superMeta.getAuthor());
+                       }
+                       if (!hasIt(meta.getDate())) {
+                               meta.setDate(superMeta.getDate());
+                       }
+                       if (!hasIt(meta.getUrl())) {
+                               meta.setUrl(superMeta.getUrl());
+                       }
+               }
+       }
 
        /**
         * Check if we have non-empty values for all the given {@link String}s.
@@ -133,7 +175,7 @@ public class InfoReader {
 
                meta.setTitle(getInfoTag(in, "TITLE"));
                meta.setAuthor(getInfoTag(in, "AUTHOR"));
-               meta.setDate(getInfoTag(in, "DATE"));
+               meta.setDate(bsHelper.formatDate(getInfoTag(in, "DATE")));
                meta.setTags(getInfoTagList(in, "TAGS", ","));
                meta.setSource(getInfoTag(in, "SOURCE"));
                meta.setUrl(getInfoTag(in, "URL"));
@@ -159,7 +201,8 @@ public class InfoReader {
                } catch (NumberFormatException e) {
                        meta.setWords(0);
                }
-               meta.setCreationDate(getInfoTag(in, "CREATION_DATE"));
+               meta.setCreationDate(
+                               bsHelper.formatDate(getInfoTag(in, "CREATION_DATE")));
                meta.setFakeCover(Boolean.parseBoolean(getInfoTag(in, "FAKE_COVER")));
 
                if (withCover && meta.getCover() == null) {
@@ -254,11 +297,21 @@ public class InfoReader {
                        String value = getLine(in, key, 0);
                        if (value != null && !value.isEmpty()) {
                                value = value.trim().substring(key.length() - 1).trim();
-                               if (value.startsWith("'") && value.endsWith("'")
-                                               || value.startsWith("\"") && value.endsWith("\"")) {
+                               if (value.length() > 1 && //
+                                               (value.startsWith("'") && value.endsWith("'")
+                                                               || value.startsWith("\"")
+                                                                               && value.endsWith("\""))) {
                                        value = value.substring(1, value.length() - 1).trim();
                                }
 
+                               // Some old files ended up with TITLE="'xxxxx'"
+                               if ("^TITLE=".equals(key)) {
+                                       if (value.startsWith("'") && value.endsWith("'")
+                                                       && value.length() > 1) {
+                                               value = value.substring(1, value.length() - 1).trim();
+                                       }
+                               }
+
                                return value;
                        }
                }