X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FEpub.java;h=9b06f202f965e82782f3acf98607d9bf6c37ac65;hb=0ffa47548f474c1330d8d723300d9aa7a4894736;hp=32349a89072a76b1cda38f6b9f7e73de2b247e22;hpb=68686a37a591a767f6d1af428ea0d5f3d3a1ddc1;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/supported/Epub.java b/src/be/nikiroo/fanfix/supported/Epub.java index 32349a8..9b06f20 100644 --- a/src/be/nikiroo/fanfix/supported/Epub.java +++ b/src/be/nikiroo/fanfix/supported/Epub.java @@ -1,23 +1,24 @@ 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; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import javax.imageio.ImageIO; - import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.utils.IOUtils; +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,9 @@ import be.nikiroo.utils.MarkableFileInputStream; * @author niki */ class Epub extends InfoText { - private File tmp; protected MetaData meta; + private File tmp; + private String desc; private URL fakeSource; private InputStream fakeIn; @@ -53,6 +55,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); @@ -62,22 +68,22 @@ class Epub extends InfoText { } @Override - protected List> getChapters(URL source, InputStream in) - throws IOException { + protected List> getChapters(URL source, InputStream in, + Progress pg) throws IOException { if (fakeIn != null) { fakeIn.reset(); - return super.getChapters(fakeSource, fakeIn); + return super.getChapters(fakeSource, fakeIn, pg); } return null; } @Override - protected String getChapterContent(URL source, InputStream in, int number) - throws IOException { + protected String getChapterContent(URL source, InputStream in, int number, + Progress pg) throws IOException { if (fakeIn != null) { fakeIn.reset(); - return super.getChapterContent(fakeSource, fakeIn, number); + return super.getChapterContent(fakeSource, fakeIn, number, pg); } return null; @@ -90,7 +96,11 @@ class Epub extends InfoText { tmp = File.createTempFile("fanfic-reader-parser_", ".tmp"); File tmpInfo = new File(tmp + ".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 +125,38 @@ class Epub extends InfoText { // Cover if (getCover()) { try { - cover = ImageIO.read(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); @@ -141,22 +174,33 @@ class Epub extends InfoText { } if (tmpInfo.exists()) { - meta = InfoReader.readMeta(tmpInfo); + meta = InfoReader.readMeta(tmpInfo, true); if (cover != null) { meta.setCover(cover); } 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.setTags(new ArrayList()); meta.setSource(getSourceName()); + meta.setUuid(url); + meta.setUrl(url); + meta.setTitle(title); + meta.setAuthor(author); } } @Override - protected void close() throws IOException { + protected void close() { if (tmp != null && tmp.exists()) { if (!tmp.delete()) { tmp.deleteOnExit(); @@ -165,7 +209,14 @@ class Epub extends InfoText { tmp = null; - fakeIn.close(); + if (fakeIn != null) { + try { + fakeIn.close(); + } catch (Exception e) { + Instance.getTraceHandler().error(e); + } + } + super.close(); }