Fix cbz reader (bad "main" input stream used)
authorNiki Roo <niki@nikiroo.be>
Thu, 29 Mar 2018 06:52:24 +0000 (08:52 +0200)
committerNiki Roo <niki@nikiroo.be>
Thu, 29 Mar 2018 06:52:24 +0000 (08:52 +0200)
src/be/nikiroo/fanfix/supported/Cbz.java
src/be/nikiroo/fanfix/supported/Epub.java
src/be/nikiroo/fanfix/test/ConversionTest.java

index 9d71046e3e8afd69f28da7cded27ae0b61964156..948a2d65ece471813f79af289f59b38a49fb8fec 100644 (file)
@@ -1,7 +1,9 @@
 package be.nikiroo.fanfix.supported;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -18,6 +20,7 @@ import be.nikiroo.fanfix.data.Paragraph;
 import be.nikiroo.fanfix.data.Story;
 import be.nikiroo.utils.IOUtils;
 import be.nikiroo.utils.Image;
+import be.nikiroo.utils.MarkableFileInputStream;
 import be.nikiroo.utils.Progress;
 
 /**
@@ -76,8 +79,12 @@ class Cbz extends Epub {
                String basename = null;
 
                Map<String, Image> images = new HashMap<String, Image>();
+               InputStream cbzIn = null;
+               ZipInputStream zipIn = null;
                try {
-                       ZipInputStream zipIn = new ZipInputStream(getInput());
+                       cbzIn = new MarkableFileInputStream(new FileInputStream(
+                                       getSourceFileOriginal()));
+                       zipIn = new ZipInputStream(cbzIn);
                        for (ZipEntry entry = zipIn.getNextEntry(); entry != null; entry = zipIn
                                        .getNextEntry()) {
                                if (!entry.isDirectory()
@@ -119,23 +126,12 @@ class Cbz extends Epub {
 
                        pg.setProgress(90);
 
-                       File txt = new File(tmpDir, basename + ".txt");
-                       if (!txt.exists()) {
-                               basename = null;
-                       }
-                       if (basename != null) {
-                               try {
-                                       BasicSupport support = BasicSupport.getSupport(txt.toURI()
-                                                       .toURL());
-                                       Story origStory = support.process(null);
-                                       story.setChapters(origStory.getChapters());
-                                       story.setMeta(origStory.getMeta());
-                               } catch (Exception e) {
-                                       basename = null;
-                               }
-                       }
-
-                       if (basename == null) {
+                       // include original story
+                       Story origStory = getStoryFromTxt(tmpDir, basename);
+                       if (origStory != null) {
+                               story.setChapters(origStory.getChapters());
+                               story.setMeta(origStory.getMeta());
+                       } else {
                                story.setChapters(new ArrayList<Chapter>());
                        }
 
@@ -160,9 +156,36 @@ class Cbz extends Epub {
 
                } finally {
                        IOUtils.deltree(tmpDir);
+                       if (zipIn != null) {
+                               zipIn.close();
+                       }
+                       if (cbzIn != null) {
+                               cbzIn.close();
+                       }
                }
 
                pg.setProgress(100);
                return story;
        }
+
+       private Story getStoryFromTxt(File tmpDir, String basename) {
+               Story origStory = null;
+
+               File txt = new File(tmpDir, basename + ".txt");
+               if (!txt.exists()) {
+                       basename = null;
+               }
+               if (basename != null) {
+                       try {
+                               BasicSupport support = BasicSupport.getSupport(txt.toURI()
+                                               .toURL());
+                               origStory = support.process(null);
+                       } catch (Exception e) {
+                               basename = null;
+                       }
+               }
+
+               return origStory;
+
+       }
 }
index 7ac3efc78703f7fb9e4a27fc2668c04c541965ad..5a1fe43ce1e87929ee70e11e43c4d461f4ba3fc1 100644 (file)
@@ -27,8 +27,6 @@ import be.nikiroo.utils.StringUtils;
  * @author niki
  */
 class Epub extends InfoText {
-       private File sourceFileOriginal;
-
        private MetaData meta;
        private File tmpDir;
        private String desc;
@@ -42,7 +40,7 @@ class Epub extends InfoText {
        }
 
        public File getSourceFileOriginal() {
-               return sourceFileOriginal;
+               return super.getSourceFile();
        }
 
        @Override
@@ -61,7 +59,19 @@ class Epub extends InfoText {
 
        @Override
        protected InputStream getInput() {
-               return fakeIn;
+               if (fakeIn != null) {
+                       try {
+                               fakeIn.reset();
+                       } catch (IOException e) {
+                               Instance.getTraceHandler()
+                                               .error(new IOException(
+                                                               "Cannot reset the Epub Text stream", e));
+                       }
+
+                       return fakeIn;
+               }
+
+               return null;
        }
 
        @Override
index 9d9fac366f9a0d8f482bc8897b2acae069b00d62..51b6deb4f817e6a2f451ead2d7b73f554a7795af 100644 (file)
@@ -216,17 +216,6 @@ class ConversionTest extends TestLauncher {
                                                                        .length());
                                }
 
-                               if (expectedLines.size() != resultLines.size()) {
-                                       System.out.println();
-                                       System.out.println("expected: [");
-                                       for (String line : expectedLines)
-                                               System.out.println(line);
-                                       System.out.println("]");
-                                       System.out.println("actual: [");
-                                       for (String line : resultLines)
-                                               System.out.println(line);
-                                       System.out.println("]");
-                               }
                                testCase.assertEquals(errMess + ": " + name
                                                + ": the number of lines is not the same",
                                                expectedLines.size(), resultLines.size());