Small fixes:
[nikiroo-utils.git] / src / be / nikiroo / fanfix / supported / Epub.java
index 0bd09bdc4f24e7560fda61e40ef4e82c0e5c227c..794998e0d75c24ed36288aec9dcb7c846ecd93fd 100644 (file)
@@ -1,11 +1,11 @@
 package be.nikiroo.fanfix.supported;
 
-import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
@@ -15,9 +15,10 @@ import java.util.zip.ZipInputStream;
 import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.utils.IOUtils;
-import be.nikiroo.utils.ImageUtils;
+import be.nikiroo.utils.Image;
 import be.nikiroo.utils.MarkableFileInputStream;
 import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.StringUtils;
 
 /**
  * Support class for EPUB files created with this program (as we need some
@@ -26,8 +27,10 @@ import be.nikiroo.utils.Progress;
  * @author niki
  */
 class Epub extends InfoText {
-       private File tmp;
        protected MetaData meta;
+       private File tmpDir;
+       private File tmp;
+       private String desc;
 
        private URL fakeSource;
        private InputStream fakeIn;
@@ -53,6 +56,10 @@ class Epub extends InfoText {
 
        @Override
        protected String getDesc(URL source, InputStream in) throws IOException {
+               if (desc != null) {
+                       return desc;
+               }
+
                if (fakeIn != null) {
                        fakeIn.reset();
                        return super.getDesc(fakeSource, fakeIn);
@@ -87,10 +94,15 @@ class Epub extends InfoText {
        protected void preprocess(URL source, InputStream in) throws IOException {
                // Note: do NOT close this stream, as it would also close "in"
                ZipInputStream zipIn = new ZipInputStream(in);
-               tmp = File.createTempFile("fanfic-reader-parser_", ".tmp");
-               File tmpInfo = new File(tmp + ".info");
+               tmpDir = Instance.getTempFiles().createTempDir("fanfic-reader-parser");
+               tmp = new File(tmpDir, "file.txt");
+               File tmpInfo = new File(tmpDir, "file.info");
                fakeSource = tmp.toURI().toURL();
-               BufferedImage cover = null;
+               Image cover = null;
+
+               String url = source.toString();
+               String title = null;
+               String author = null;
 
                for (ZipEntry entry = zipIn.getNextEntry(); entry != null; entry = zipIn
                                .getNextEntry()) {
@@ -115,15 +127,38 @@ class Epub extends InfoText {
                                        // Cover
                                        if (getCover()) {
                                                try {
-                                                       cover = ImageUtils.fromStream(zipIn);
+                                                       cover = new Image(zipIn);
                                                } catch (Exception e) {
-                                                       Instance.syserr(e);
+                                                       Instance.getTraceHandler().error(e);
                                                }
                                        }
                                } else if (entry.getName().equals(getDataPrefix() + "URL")) {
-                                       // Do nothing
+                                       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")) {
-                                       // Do nothing
+                                       String[] descArray = StringUtils
+                                                       .unhtml(IOUtils.readSmallStream(zipIn)).trim()
+                                                       .split("\n");
+                                       int skip = 0;
+                                       if (descArray.length > 1) {
+                                               title = descArray[0].trim();
+                                               skip = 1;
+                                               if (descArray.length > 2
+                                                               && descArray[1].startsWith("©")) {
+                                                       author = descArray[1].substring(1).trim();
+                                                       skip = 2;
+                                               }
+                                       }
+                                       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);
@@ -147,26 +182,43 @@ class Epub extends InfoText {
                        }
                        tmpInfo.delete();
                } else {
+                       if (title == null || title.isEmpty()) {
+                               title = new File(source.getPath()).getName();
+                               if (title.toLowerCase().endsWith(".cbz")) {
+                                       title = title.substring(0, title.length() - 4);
+                               }
+                               title = URLDecoder.decode(title, "UTF-8").trim();
+                       }
+
                        meta = new MetaData();
-                       meta.setUuid(source.toString());
-                       meta.setLang("EN");
+                       meta.setLang("en");
                        meta.setTags(new ArrayList<String>());
                        meta.setSource(getSourceName());
-                       meta.setUrl(source.toString());
+                       meta.setUuid(url);
+                       meta.setUrl(url);
+                       meta.setTitle(title);
+                       meta.setAuthor(author);
+                       meta.setImageDocument(isImagesDocumentByDefault());
                }
        }
 
        @Override
-       protected void close() throws IOException {
-               if (tmp != null && tmp.exists()) {
-                       if (!tmp.delete()) {
-                               tmp.deleteOnExit();
-                       }
+       protected void close() {
+               if (tmpDir != null) {
+                       IOUtils.deltree(tmpDir);
                }
 
+               tmpDir = null;
                tmp = null;
 
-               fakeIn.close();
+               if (fakeIn != null) {
+                       try {
+                               fakeIn.close();
+                       } catch (Exception e) {
+                               Instance.getTraceHandler().error(e);
+                       }
+               }
+
                super.close();
        }
 
@@ -181,4 +233,8 @@ class Epub extends InfoText {
        protected boolean getCover() {
                return true;
        }
+
+       protected boolean isImagesDocumentByDefault() {
+               return false;
+       }
 }