tests: fix NPE, add BasicSupportUtilities tests
[nikiroo-utils.git] / src / be / nikiroo / fanfix / supported / Cbz.java
index ca0f48d2df6a0fc75d93b2bbf0fb705799420877..c7475fa775640e39f57aa8b1d218ab3cd51841b8 100644 (file)
@@ -2,6 +2,7 @@ package be.nikiroo.fanfix.supported;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -15,10 +16,12 @@ import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.data.Chapter;
 import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.fanfix.data.Paragraph;
+import be.nikiroo.fanfix.data.Paragraph.ParagraphType;
 import be.nikiroo.fanfix.data.Story;
 import be.nikiroo.utils.IOUtils;
 import be.nikiroo.utils.Image;
 import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.streams.MarkableFileInputStream;
 
 /**
  * Support class for CBZ files (works better with CBZ created with this program,
@@ -32,11 +35,6 @@ class Cbz extends Epub {
                return url.toString().toLowerCase().endsWith(".cbz");
        }
 
-       @Override
-       public String getSourceName() {
-               return "cbz";
-       }
-
        @Override
        protected String getDataPrefix() {
                return "";
@@ -58,7 +56,7 @@ class Cbz extends Epub {
        }
 
        @Override
-       public Story process(Progress pg) throws IOException {
+       public Story doProcess(Progress pg) throws IOException {
                if (pg == null) {
                        pg = new Progress();
                } else {
@@ -76,15 +74,18 @@ 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(getSourceFileOriginal());
+                       zipIn = new ZipInputStream(cbzIn);
                        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;
                                                }
@@ -119,24 +120,39 @@ 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;
+                       // only the description is kept
+                       Story origStory = getStoryFromTxt(tmpDir, basename);
+                       if (origStory != null) {
+                               if (origStory.getMeta().getCover() == null) {
+                                       origStory.getMeta().setCover(story.getMeta().getCover());
                                }
+                               story.setMeta(origStory.getMeta());
                        }
+                       story.setChapters(new ArrayList<Chapter>());
+
+                       // Check if we can find non-images chapters, for hybrid-cbz support
+                       if (origStory != null) {
+                               for (Chapter chap : origStory) {
+                                       Boolean isImages = null;
+                                       for (Paragraph para : chap) {
+                                               ParagraphType t = para.getType();
+                                               if (isImages == null && !t.isText(true)) {
+                                                       isImages = true;
+                                               }
+                                               if (t.isText(false)) {
+                                                       String line = para.getContent();
+                                                       // Images are saved in text mode as "[image-link]"
+                                                       if (!(line.startsWith("[") && line.endsWith("]"))) {
+                                                               isImages = false;
+                                                       }
+                                               }
+                                       }
 
-                       if (basename == null) {
-                               story.setChapters(new ArrayList<Chapter>());
+                                       if (isImages != null && !isImages) {
+                                               story.getChapters().add(chap);
+                                               chap.setNumber(story.getChapters().size());
+                                       }
+                               }
                        }
 
                        if (!imagesList.isEmpty()) {
@@ -157,12 +173,38 @@ class Cbz extends Epub {
                                meta.setCover(images.get(imagesList.get(0)));
                                meta.setFakeCover(true);
                        }
-
                } 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;
+
+       }
 }