fix missing values for some old files
authorNiki Roo <niki@nikiroo.be>
Mon, 27 Apr 2020 13:24:12 +0000 (15:24 +0200)
committerNiki Roo <niki@nikiroo.be>
Mon, 27 Apr 2020 13:24:12 +0000 (15:24 +0200)
supported/InfoReader.java
supported/InfoText.java
supported/Text.java

index 220350e6dc904495de7de918e4843cf3d15dda01..15a4f5c4e7bc1234e45d157411fb6279eb7b9ac5 100644 (file)
@@ -9,6 +9,8 @@ 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.MetaData;
@@ -19,7 +21,8 @@ import be.nikiroo.utils.streams.MarkableFileInputStream;
 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 BasicSupportPara bsPara = new BasicSupportPara(new
+       // BasicSupportHelper(), new BasicSupportImages());
 
        public static MetaData readMeta(File infoFile, boolean withCover)
                        throws IOException {
@@ -30,7 +33,72 @@ public class InfoReader {
                if (infoFile.exists()) {
                        InputStream in = new MarkableFileInputStream(infoFile);
                        try {
-                               return createMeta(infoFile.toURI().toURL(), in, withCover);
+                               MetaData meta = createMeta(infoFile.toURI().toURL(), in,
+                                               withCover);
+
+                               // 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,
+                                                               base.length() - ".info".length());
+                                       }
+                                       File textFile = new File(base);
+                                       if (!textFile.exists()) {
+                                               textFile = new File(base + ".txt");
+                                       }
+                                       if (!textFile.exists()) {
+                                               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());
+                                               }
+                                       }
+                               }
+
+                               return meta;
                        } finally {
                                in.close();
                        }
@@ -41,6 +109,24 @@ public class InfoReader {
                                                + infoFile.getAbsolutePath());
        }
 
+       /**
+        * Check if we have non-empty values for all the given {@link String}s.
+        * 
+        * @param values
+        *            the values to check
+        * 
+        * @return TRUE if none of them was NULL or empty
+        */
+       static private boolean hasIt(String... values) {
+               for (String value : values) {
+                       if (value == null || value.trim().isEmpty()) {
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
        private static MetaData createMeta(URL sourceInfoFile, InputStream in,
                        boolean withCover) throws IOException {
                MetaData meta = new MetaData();
@@ -61,8 +147,7 @@ public class InfoReader {
                if (withCover) {
                        String infoTag = getInfoTag(in, "COVER");
                        if (infoTag != null && !infoTag.trim().isEmpty()) {
-                               meta.setCover(bsHelper.getImage(null, sourceInfoFile,
-                                               infoTag));
+                               meta.setCover(bsHelper.getImage(null, sourceInfoFile, infoTag));
                        }
                        if (meta.getCover() == null) {
                                // Second chance: try to check for a cover next to the info file
@@ -97,8 +182,8 @@ public class InfoReader {
 
                File basefile = new File(sourceInfoFile.getFile());
 
-               String ext = "."
-                               + Instance.getInstance().getConfig().getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER).toLowerCase();
+               String ext = "." + Instance.getInstance().getConfig()
+                               .getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER).toLowerCase();
 
                // Without removing ext
                cover = bsHelper.getImage(null, sourceInfoFile,
@@ -235,8 +320,8 @@ public class InfoReader {
 
                        if (index == -1) {
                                if (needle.startsWith("^")) {
-                                       if (lines.get(lines.size() - 1).startsWith(
-                                                       needle.substring(1))) {
+                                       if (lines.get(lines.size() - 1)
+                                                       .startsWith(needle.substring(1))) {
                                                index = lines.size() - 1;
                                        }
 
index 42e2c13b6f75a1e32afa10f560361c1670ea9572..2af8c7e2f4880139540aa6f7f4e4895fd6e4742d 100644 (file)
@@ -22,30 +22,7 @@ class InfoText extends Text {
 
        @Override
        protected MetaData getMeta() throws IOException {
-               MetaData meta = InfoReader.readMeta(getInfoFile(), true);
-
-               // Some old .info files don't have those now required fields...
-               String test = meta.getTitle() == null ? "" : meta.getTitle();
-               test += meta.getAuthor() == null ? "" : meta.getAuthor();
-               test += meta.getDate() == null ? "" : meta.getDate();
-               test += meta.getUrl() == null ? "" : meta.getUrl();
-               if (test.isEmpty()) {
-                       MetaData superMeta = super.getMeta();
-                       if (meta.getTitle() == null || meta.getTitle().isEmpty()) {
-                               meta.setTitle(superMeta.getTitle());
-                       }
-                       if (meta.getAuthor() == null || meta.getAuthor().isEmpty()) {
-                               meta.setAuthor(superMeta.getAuthor());
-                       }
-                       if (meta.getDate() == null || meta.getDate().isEmpty()) {
-                               meta.setDate(superMeta.getDate());
-                       }
-                       if (meta.getUrl() == null || meta.getUrl().isEmpty()) {
-                               meta.setUrl(superMeta.getUrl());
-                       }
-               }
-
-               return meta;
+               return InfoReader.readMeta(getInfoFile(), true);
        }
 
        @Override
index c54b6a5d44ce0a328d63451420c6a9c00a82bd3c..e082a737f2a7be9c11b9fc133bea0c96f108ae55 100644 (file)
@@ -97,7 +97,7 @@ class Text extends BasicSupport {
                meta.setType(getType().toString());
                meta.setImageDocument(false);
                meta.setCover(getCover(getSourceFile()));
-
+               
                return meta;
        }
 
@@ -188,7 +188,7 @@ class Text extends BasicSupport {
                return content;
        }
 
-       private Image getCover(File sourceFile) {
+       protected Image getCover(File sourceFile) {
                String path = sourceFile.getName();
 
                for (String ext : new String[] { ".txt", ".text", ".story" }) {
@@ -317,7 +317,7 @@ class Text extends BasicSupport {
        }
 
        /**
-        * Remove the ".txt" extension if it is present.
+        * Remove the ".txt" (or ".text") extension if it is present.
         * 
         * @param file
         *            the file to process
@@ -326,9 +326,11 @@ class Text extends BasicSupport {
         *         was present
         */
        protected File assureNoTxt(File file) {
-               if (file.getName().endsWith(".txt")) {
-                       file = new File(file.getPath().substring(0,
-                                       file.getPath().length() - 4));
+               for (String ext : new String[] { ".txt", ".text" }) {
+                       if (file.getName().endsWith(ext)) {
+                               file = new File(file.getPath().substring(0,
+                                               file.getPath().length() - ext.length()));
+                       }
                }
 
                return file;