Small fixes:
[nikiroo-utils.git] / src / be / nikiroo / fanfix / supported / Cbz.java
index 8ab2a5202044ec850bcb29b979bdec0f0483fd17..f635a17867a57695f4db038cfb894cdd0ec45e49 100644 (file)
@@ -1,5 +1,6 @@
 package be.nikiroo.fanfix.supported;
 
+import java.io.File;
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -14,6 +15,7 @@ import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.data.Chapter;
 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.Progress;
 
@@ -67,59 +69,94 @@ class Cbz extends Epub {
                Story story = processMeta(url, false, true, pgMeta);
                pgMeta.done(); // 10%
 
-               story.setChapters(new ArrayList<Chapter>());
-               Chapter chap = new Chapter(1, null);
-               story.getChapters().add(chap);
-
-               ZipInputStream zipIn = new ZipInputStream(getInput());
+               File tmpDir = Instance.getTempFiles().createTempDir("info-text");
+               String basename = null;
 
                Map<String, Image> images = new HashMap<String, Image>();
-               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 : getImageExt(false)) {
-                                       if (entryLName.endsWith(ext)) {
-                                               imageEntry = true;
+               try {
+                       ZipInputStream zipIn = new ZipInputStream(getInput());
+                       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 : getImageExt(false)) {
+                                               if (entryLName.endsWith(ext)) {
+                                                       imageEntry = true;
+                                               }
                                        }
-                               }
 
-                               if (imageEntry) {
-                                       String uuid = meta.getUuid() + "_" + entry.getName();
-                                       try {
-                                               images.put(uuid, new Image(zipIn));
-                                       } catch (Exception e) {
-                                               Instance.getTraceHandler().error(e);
+                                       if (imageEntry) {
+                                               String uuid = meta.getUuid() + "_" + entry.getName();
+                                               try {
+                                                       images.put(uuid, new Image(zipIn));
+                                               } catch (Exception e) {
+                                                       Instance.getTraceHandler().error(e);
+                                               }
+
+                                               if (pg.getProgress() < 85) {
+                                                       pg.add(1);
+                                               }
+                                       } else if (entryLName.endsWith(".info")) {
+                                               basename = entryLName.substring(0, entryLName.length()
+                                                               - ".info".length());
+                                               IOUtils.write(zipIn, new File(tmpDir, entryLName));
+                                       } else if (entryLName.endsWith(".txt")) {
+                                               IOUtils.write(zipIn, new File(tmpDir, entryLName));
                                        }
+                               }
+                       }
 
-                                       if (pg.getProgress() < 85) {
-                                               pg.add(1);
-                                       }
+                       pg.setProgress(85);
+
+                       // ZIP order is not correct for us
+                       List<String> imagesList = new ArrayList<String>(images.keySet());
+                       Collections.sort(imagesList);
+
+                       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;
                                }
                        }
-               }
 
-               pg.setProgress(85);
+                       if (basename == null) {
+                               story.setChapters(new ArrayList<Chapter>());
+                       }
 
-               // ZIP order is not correct for us
-               List<String> imagesList = new ArrayList<String>(images.keySet());
-               Collections.sort(imagesList);
+                       if (!imagesList.isEmpty()) {
+                               Chapter chap = new Chapter(story.getChapters().size() + 1, null);
+                               story.getChapters().add(chap);
 
-               pg.setProgress(90);
+                               for (String uuid : imagesList) {
+                                       try {
+                                               chap.getParagraphs().add(
+                                                               new Paragraph(images.get(uuid)));
+                                       } catch (Exception e) {
+                                               Instance.getTraceHandler().error(e);
+                                       }
+                               }
+                       }
 
-               for (String uuid : imagesList) {
-                       try {
-                               chap.getParagraphs().add(new Paragraph(images.get(uuid)));
-                       } catch (Exception e) {
-                               Instance.getTraceHandler().error(e);
+                       if (meta.getCover() == null && !images.isEmpty()) {
+                               meta.setCover(images.get(imagesList.get(0)));
+                               meta.setFakeCover(true);
                        }
-               }
 
-               if (meta.getCover() == null && !images.isEmpty()) {
-                       meta.setCover(images.get(imagesList.get(0)));
-                       meta.setFakeCover(true);
+               } finally {
+                       IOUtils.deltree(tmpDir);
                }
 
                pg.setProgress(100);