cbz/epub read support: be more permissive
authorNiki Roo <niki@nikiroo.be>
Sun, 3 May 2020 12:29:53 +0000 (14:29 +0200)
committerNiki Roo <niki@nikiroo.be>
Sun, 3 May 2020 12:29:53 +0000 (14:29 +0200)
supported/Epub.java
supported/InfoReader.java

index 90a9f458e4fd3ce9c0f8ad331bc407a27dc760ca..965a27affda88bfe8919e744b80962f58c3aa465 100644 (file)
@@ -7,6 +7,8 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLDecoder;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
@@ -107,6 +109,7 @@ class Epub extends InfoText {
                                if (!entry.isDirectory()
                                                && entry.getName().startsWith(getDataPrefix())) {
                                        String entryLName = entry.getName().toLowerCase();
+                                       entryLName = entryLName.substring(getDataPrefix().length());
 
                                        boolean imageEntry = false;
                                        for (String ext : bsImages.getImageExt(false)) {
@@ -115,7 +118,7 @@ class Epub extends InfoText {
                                                }
                                        }
 
-                                       if (entry.getName().equals(getDataPrefix() + "version")) {
+                                       if (entryLName.equals("version")) {
                                                // Nothing to do for now ("first"
                                                // version is 3.0)
                                        } else if (entryLName.endsWith(".info")) {
@@ -123,7 +126,7 @@ class Epub extends InfoText {
                                                IOUtils.write(zipIn, tmpInfo);
                                        } else if (imageEntry) {
                                                // Cover
-                                               if (getCover()) {
+                                               if (getCover() && cover == null) {
                                                        try {
                                                                cover = new Image(zipIn);
                                                        } catch (Exception e) {
@@ -131,21 +134,19 @@ class Epub extends InfoText {
                                                                                .error(e);
                                                        }
                                                }
-                                       } else if (entry.getName()
-                                                       .equals(getDataPrefix() + "URL")) {
+                                       } else if (entryLName.equals("url")) {
                                                String[] descArray = StringUtils
                                                                .unhtml(IOUtils.readSmallStream(zipIn)).trim()
                                                                .split("\n");
                                                if (descArray.length > 0) {
                                                        url = descArray[0].trim();
                                                }
-                                       } else if (entry.getName().endsWith(".desc")) {
+                                       } else if (entryLName.endsWith(".desc")) {
                                                // // For old files
                                                // if (this.desc != null) {
                                                // this.desc = IOUtils.readSmallStream(zipIn).trim();
                                                // }
-                                       } else if (entry.getName()
-                                                       .equals(getDataPrefix() + "SUMMARY")) {
+                                       } else if (entryLName.equals("summary")) {
                                                String[] descArray = StringUtils
                                                                .unhtml(IOUtils.readSmallStream(zipIn)).trim()
                                                                .split("\n");
@@ -172,7 +173,7 @@ class Epub extends InfoText {
                                }
                        }
 
-                       if (requireInfo() && (!tmp.exists() || !tmpInfo.exists())) {
+                       if (requireInfo() && !tmp.exists()) {
                                throw new IOException(
                                                "file not supported (maybe not created with this program or corrupt)");
                        }
@@ -187,21 +188,27 @@ class Epub extends InfoText {
                        } else {
                                if (title == null || title.isEmpty()) {
                                        title = getSourceFileOriginal().getName();
-                                       if (title.toLowerCase().endsWith(".cbz")) {
-                                               title = title.substring(0, title.length() - 4);
+                                       String exts[] = new String[] {".epub", ".cbz"};
+                                       for (String ext : exts) {
+                                               if (title.toLowerCase().endsWith(ext)) {
+                                                       title = title.substring(0,
+                                                                       title.length() - ext.length());
+                                               }
                                        }
                                        title = URLDecoder.decode(title, "UTF-8").trim();
                                }
 
                                meta = new MetaData();
                                meta.setLang("en");
-                               meta.setTags(new ArrayList<String>());
+                               meta.setTags(Arrays.asList("[no_info]"));
                                meta.setSource(getType().getSourceName());
                                meta.setUuid(url);
                                meta.setUrl(url);
                                meta.setTitle(title);
                                meta.setAuthor(author);
                                meta.setImageDocument(isImagesDocumentByDefault());
+                               
+                               InfoReader.completeMeta(tmp, meta);
                        }
 
                        if (meta.getCover() == null) {
index 206464f45a0a2e7c989e6fa6719afa22ca61c9cb..d5eeeb1d9190a022db4bf360cb243710decc493e 100644 (file)
@@ -48,7 +48,6 @@ public class InfoReader {
                                                meta.getUrl())) {
 
                                        // TODO: not nice, would be better to do it properly...
-
                                        String base = infoFile.getPath();
                                        if (base.endsWith(".info")) {
                                                base = base.substring(0,
@@ -62,45 +61,8 @@ 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;
@@ -113,6 +75,60 @@ public class InfoReader {
                                "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 {
+               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.