Merge branch 'subtree'
[nikiroo-utils.git] / src / be / nikiroo / fanfix / supported / InfoReader.java
index 80f873989ad03b95db685ffa94603fa7f4e4f30f..405b28fb4197be856192e3b8ad31a219f4636cc5 100644 (file)
@@ -1,7 +1,6 @@
 package be.nikiroo.fanfix.supported;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -14,10 +13,15 @@ import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.bundles.Config;
 import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.utils.Image;
-import be.nikiroo.utils.MarkableFileInputStream;
+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());
+
        public static MetaData readMeta(File infoFile, boolean withCover)
                        throws IOException {
                if (infoFile == null) {
@@ -25,10 +29,81 @@ public class InfoReader {
                }
 
                if (infoFile.exists()) {
-                       InputStream in = new MarkableFileInputStream(new FileInputStream(
-                                       infoFile));
+                       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 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,
+                                                               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();
                        }
@@ -39,6 +114,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();
@@ -59,8 +152,7 @@ public class InfoReader {
                if (withCover) {
                        String infoTag = getInfoTag(in, "COVER");
                        if (infoTag != null && !infoTag.trim().isEmpty()) {
-                               meta.setCover(BasicSupportHelper.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
@@ -76,7 +168,7 @@ public class InfoReader {
                meta.setFakeCover(Boolean.parseBoolean(getInfoTag(in, "FAKE_COVER")));
 
                if (withCover && meta.getCover() == null) {
-                       meta.setCover(BasicSupportHelper.getDefaultCover(meta.getSubject()));
+                       meta.setCover(bsHelper.getDefaultCover(meta.getSubject()));
                }
 
                return meta;
@@ -91,17 +183,29 @@ public class InfoReader {
         * @return the cover if present, NULL if not
         */
        public static Image getCoverByName(URL sourceInfoFile) {
-               String info = sourceInfoFile.getFile().toString();
-               if (info.endsWith(".info")) {
-                       info = info.substring(0, info.length() - ".info".length());
-                       String ext = "."
-                                       + Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER)
-                                                       .toLowerCase();
-                       return BasicSupportHelper
-                                       .getImage(null, sourceInfoFile, info + ext);
+               Image cover = null;
+
+               File basefile = new File(sourceInfoFile.getFile());
+
+               String ext = "." + Instance.getInstance().getConfig()
+                               .getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER).toLowerCase();
+
+               // Without removing ext
+               cover = bsHelper.getImage(null, sourceInfoFile,
+                               basefile.getAbsolutePath() + ext);
+
+               // Try without ext
+               String name = basefile.getName();
+               int pos = name.lastIndexOf(".");
+               if (cover == null && pos > 0) {
+                       name = name.substring(0, pos);
+                       basefile = new File(basefile.getParent(), name);
+
+                       cover = bsHelper.getImage(null, sourceInfoFile,
+                                       basefile.getAbsolutePath() + ext);
                }
 
-               return null;
+               return cover;
        }
 
        private static boolean getInfoTagBoolean(InputStream in, String key,
@@ -155,11 +259,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;
                        }
                }
@@ -221,8 +335,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;
                                        }