Merge branch 'subtree'
[nikiroo-utils.git] / src / be / nikiroo / fanfix / supported / Epub.java
index 7ac3efc78703f7fb9e4a27fc2668c04c541965ad..90a9f458e4fd3ce9c0f8ad331bc407a27dc760ca 100644 (file)
@@ -1,7 +1,6 @@
 package be.nikiroo.fanfix.supported;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URISyntaxException;
@@ -17,8 +16,8 @@ import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.utils.IOUtils;
 import be.nikiroo.utils.Image;
-import be.nikiroo.utils.MarkableFileInputStream;
 import be.nikiroo.utils.StringUtils;
+import be.nikiroo.utils.streams.MarkableFileInputStream;
 
 /**
  * Support class for EPUB files created with this program (as we need some
@@ -27,8 +26,6 @@ import be.nikiroo.utils.StringUtils;
  * @author niki
  */
 class Epub extends InfoText {
-       private File sourceFileOriginal;
-
        private MetaData meta;
        private File tmpDir;
        private String desc;
@@ -36,13 +33,8 @@ class Epub extends InfoText {
        private URL fakeSource;
        private InputStream fakeIn;
 
-       @Override
-       public String getSourceName() {
-               return "epub";
-       }
-
        public File getSourceFileOriginal() {
-               return sourceFileOriginal;
+               return super.getSourceFile();
        }
 
        @Override
@@ -50,10 +42,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;
@@ -61,7 +51,18 @@ class Epub extends InfoText {
 
        @Override
        protected InputStream getInput() {
-               return fakeIn;
+               if (fakeIn != null) {
+                       try {
+                               fakeIn.reset();
+                       } catch (IOException e) {
+                               Instance.getInstance().getTraceHandler().error(new IOException(
+                                               "Cannot reset the Epub Text stream", e));
+                       }
+
+                       return fakeIn;
+               }
+
+               return null;
        }
 
        @Override
@@ -83,8 +84,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");
 
@@ -100,14 +101,15 @@ 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();
 
                                        boolean imageEntry = false;
-                                       for (String ext : BasicSupportImages.getImageExt(false)) {
+                                       for (String ext : bsImages.getImageExt(false)) {
                                                if (entryLName.endsWith(ext)) {
                                                        imageEntry = true;
                                                }
@@ -125,18 +127,25 @@ class Epub extends InfoText {
                                                        try {
                                                                cover = new Image(zipIn);
                                                        } catch (Exception e) {
-                                                               Instance.getTraceHandler().error(e);
+                                                               Instance.getInstance().getTraceHandler()
+                                                                               .error(e);
                                                        }
                                                }
-                                       } else if (entry.getName().equals(getDataPrefix() + "URL")) {
+                                       } else if (entry.getName()
+                                                       .equals(getDataPrefix() + "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 (entry.getName().endsWith(".desc")) {
+                                               // // For old files
+                                               // if (this.desc != null) {
+                                               // this.desc = IOUtils.readSmallStream(zipIn).trim();
+                                               // }
+                                       } else if (entry.getName()
+                                                       .equals(getDataPrefix() + "SUMMARY")) {
                                                String[] descArray = StringUtils
                                                                .unhtml(IOUtils.readSmallStream(zipIn)).trim()
                                                                .split("\n");
@@ -150,12 +159,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);
@@ -169,15 +178,11 @@ class Epub extends InfoText {
                        }
 
                        if (tmp.exists()) {
-                               this.fakeIn = new MarkableFileInputStream(new FileInputStream(
-                                               tmp));
+                               this.fakeIn = new MarkableFileInputStream(tmp);
                        }
 
                        if (tmpInfo.exists()) {
                                meta = InfoReader.readMeta(tmpInfo, true);
-                               if (cover != null) {
-                                       meta.setCover(cover);
-                               }
                                tmpInfo.delete();
                        } else {
                                if (title == null || title.isEmpty()) {
@@ -191,13 +196,22 @@ class Epub extends InfoText {
                                meta = new MetaData();
                                meta.setLang("en");
                                meta.setTags(new ArrayList<String>());
-                               meta.setSource(getSourceName());
+                               meta.setSource(getType().getSourceName());
                                meta.setUuid(url);
                                meta.setUrl(url);
                                meta.setTitle(title);
                                meta.setAuthor(author);
                                meta.setImageDocument(isImagesDocumentByDefault());
                        }
+
+                       if (meta.getCover() == null) {
+                               if (cover != null) {
+                                       meta.setCover(cover);
+                               } else {
+                                       meta.setCover(InfoReader.getCoverByName(
+                                                       getSourceFileOriginal().toURI().toURL()));
+                               }
+                       }
                } finally {
                        if (zipIn != null) {
                                zipIn.close();