Merge branch 'master' into subtree
[nikiroo-utils.git] / supported / Epub.java
index 82af11855fdc299226fe2f52ca536f17a07d1d00..783d724e36aaa84e822f1fb5f4c6590371a4a8fd 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;
 
@@ -42,10 +44,8 @@ class Epub extends InfoText {
                try {
                        return new File(fakeSource.toURI());
                } catch (URISyntaxException e) {
-                       Instance.getTraceHandler()
-                                       .error(new IOException(
-                                                       "Cannot get the source file from the info-text URL",
-                                                       e));
+                       Instance.getInstance().getTraceHandler().error(new IOException(
+                                       "Cannot get the source file from the info-text URL", e));
                }
 
                return null;
@@ -57,9 +57,8 @@ class Epub extends InfoText {
                        try {
                                fakeIn.reset();
                        } catch (IOException e) {
-                               Instance.getTraceHandler()
-                                               .error(new IOException(
-                                                               "Cannot reset the Epub Text stream", e));
+                               Instance.getInstance().getTraceHandler().error(new IOException(
+                                               "Cannot reset the Epub Text stream", e));
                        }
 
                        return fakeIn;
@@ -87,8 +86,8 @@ class Epub extends InfoText {
                ZipInputStream zipIn = null;
                try {
                        zipIn = new ZipInputStream(in);
-                       tmpDir = Instance.getTempFiles().createTempDir(
-                                       "fanfic-reader-parser");
+                       tmpDir = Instance.getInstance().getTempFiles()
+                                       .createTempDir("fanfic-reader-parser");
                        File tmp = new File(tmpDir, "file.txt");
                        File tmpInfo = new File(tmpDir, "file.info");
 
@@ -104,11 +103,13 @@ class Epub extends InfoText {
                        String title = null;
                        String author = null;
 
-                       for (ZipEntry entry = zipIn.getNextEntry(); entry != null; entry = zipIn
-                                       .getNextEntry()) {
+                       for (ZipEntry entry = zipIn
+                                       .getNextEntry(); entry != null; entry = zipIn
+                                                       .getNextEntry()) {
                                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)) {
@@ -117,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")) {
@@ -125,22 +126,33 @@ class Epub extends InfoText {
                                                IOUtils.write(zipIn, tmpInfo);
                                        } else if (imageEntry) {
                                                // Cover
-                                               if (getCover()) {
+                                               if (getCover() && cover == null) {
                                                        try {
-                                                               cover = new Image(zipIn);
+                                                               Image img = new Image(zipIn);
+                                                               if (img.getSize() == 0) {
+                                                                       img.close();
+                                                                       throw new IOException(
+                                                                                       "Empty image not accepted");
+                                                               }
+                                                               cover = img;
                                                        } catch (Exception e) {
-                                                               Instance.getTraceHandler().error(e);
+                                                               Instance.getInstance().getTraceHandler()
+                                                                               .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().equals(
-                                                       getDataPrefix() + "SUMMARY")) {
+                                       } else if (entryLName.endsWith(".desc")) {
+                                               // // For old files
+                                               // if (this.desc != null) {
+                                               // this.desc = IOUtils.readSmallStream(zipIn).trim();
+                                               // }
+                                       } else if (entryLName.equals("summary")) {
                                                String[] descArray = StringUtils
                                                                .unhtml(IOUtils.readSmallStream(zipIn)).trim()
                                                                .split("\n");
@@ -154,12 +166,12 @@ class Epub extends InfoText {
                                                                skip = 2;
                                                        }
                                                }
-                                               this.desc = "";
-                                               for (int i = skip; i < descArray.length; i++) {
-                                                       this.desc += descArray[i].trim() + "\n";
-                                               }
-
-                                               this.desc = this.desc.trim();
+                                               // this.desc = "";
+                                               // for (int i = skip; i < descArray.length; i++) {
+                                               // this.desc += descArray[i].trim() + "\n";
+                                               // }
+                                               //
+                                               // this.desc = this.desc.trim();
                                        } else {
                                                // Hopefully the data file
                                                IOUtils.write(zipIn, tmp);
@@ -167,7 +179,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)");
                        }
@@ -182,30 +194,35 @@ 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) {
                                if (cover != null) {
                                        meta.setCover(cover);
                                } else {
-                                       meta.setCover(InfoReader
-                                                       .getCoverByName(getSourceFileOriginal().toURI()
-                                                                       .toURL()));
+                                       meta.setCover(InfoReader.getCoverByName(
+                                                       getSourceFileOriginal().toURI().toURL()));
                                }
                        }
                } finally {