do not allow empty cover images
[fanfix.git] / src / be / nikiroo / fanfix / supported / Cbz.java
index 3aaa355b7b0827015e8334af7362f56c2bdc966d..a5391d07575e9f6102ab531e4a756c1be718f711 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.URL;
@@ -14,14 +13,16 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
 import be.nikiroo.fanfix.Instance;
+import be.nikiroo.fanfix.bundles.Config;
 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.MarkableFileInputStream;
 import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.streams.MarkableFileInputStream;
 
 /**
  * Support class for CBZ files (works better with CBZ created with this program,
@@ -35,11 +36,6 @@ class Cbz extends Epub {
                return url.toString().toLowerCase().endsWith(".cbz");
        }
 
-       @Override
-       public String getSourceName() {
-               return "cbz";
-       }
-
        @Override
        protected String getDataPrefix() {
                return "";
@@ -67,6 +63,8 @@ class Cbz extends Epub {
                } else {
                        pg.setMinMax(0, 100);
                }
+               
+               pg.setName("Initialising");
 
                Progress pgMeta = new Progress();
                pg.addProgress(pgMeta, 10);
@@ -74,16 +72,15 @@ class Cbz extends Epub {
                MetaData meta = story.getMeta();
 
                pgMeta.done(); // 10%
-
-               File tmpDir = Instance.getTempFiles().createTempDir("info-text");
+               
+               File tmpDir = Instance.getInstance().getTempFiles().createTempDir("info-text");
                String basename = null;
 
                Map<String, Image> images = new HashMap<String, Image>();
                InputStream cbzIn = null;
                ZipInputStream zipIn = null;
                try {
-                       cbzIn = new MarkableFileInputStream(new FileInputStream(
-                                       getSourceFileOriginal()));
+                       cbzIn = new MarkableFileInputStream(getSourceFileOriginal());
                        zipIn = new ZipInputStream(cbzIn);
                        for (ZipEntry entry = zipIn.getNextEntry(); entry != null; entry = zipIn
                                        .getNextEntry()) {
@@ -91,18 +88,24 @@ class Cbz extends Epub {
                                                && 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;
                                                }
                                        }
-
+                                       
                                        if (imageEntry) {
                                                String uuid = meta.getUuid() + "_" + entry.getName();
                                                try {
-                                                       images.put(uuid, new Image(zipIn));
+                                                       Image img = new Image(zipIn);
+                                                       if (img.getSize() == 0) {
+                                                               img.close();
+                                                               throw new IOException(
+                                                                               "Empty image not accepted");
+                                                       }
+                                                       images.put(uuid, img);
                                                } catch (Exception e) {
-                                                       Instance.getTraceHandler().error(e);
+                                                       Instance.getInstance().getTraceHandler().error(e);
                                                }
 
                                                if (pg.getProgress() < 85) {
@@ -117,6 +120,12 @@ class Cbz extends Epub {
                                        }
                                }
                        }
+                       
+                       String ext = "."
+                                       + Instance.getInstance().getConfig().getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER).toLowerCase();
+                       String coverName = meta.getUuid() + "_" + basename + ext;
+                       Image cover = images.get(coverName);
+                       images.remove(coverName);
 
                        pg.setProgress(85);
 
@@ -126,7 +135,7 @@ class Cbz extends Epub {
 
                        pg.setProgress(90);
 
-                       // only the description is kept, we do not support hybrid CBZ
+                       // only the description/cover is kept
                        Story origStory = getStoryFromTxt(tmpDir, basename);
                        if (origStory != null) {
                                if (origStory.getMeta().getCover() == null) {
@@ -134,10 +143,38 @@ class Cbz extends Epub {
                                }
                                story.setMeta(origStory.getMeta());
                        }
+                       if (story.getMeta().getCover() == null) {
+                               story.getMeta().setCover(cover);
+                       }
                        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 (isImages != null && !isImages) {
+                                               story.getChapters().add(chap);
+                                               chap.setNumber(story.getChapters().size());
+                                       }
+                               }
+                       }
+
                        if (!imagesList.isEmpty()) {
-                               Chapter chap = new Chapter(story.getChapters().size() + 1, null);
+                               Chapter chap = new Chapter(story.getChapters().size() + 1, "");
                                story.getChapters().add(chap);
 
                                for (String uuid : imagesList) {
@@ -145,7 +182,7 @@ class Cbz extends Epub {
                                                chap.getParagraphs().add(
                                                                new Paragraph(images.get(uuid)));
                                        } catch (Exception e) {
-                                               Instance.getTraceHandler().error(e);
+                                               Instance.getInstance().getTraceHandler().error(e);
                                        }
                                }
                        }
@@ -164,7 +201,7 @@ class Cbz extends Epub {
                        }
                }
 
-               pg.setProgress(100);
+               pg.done();
                return story;
        }