X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FEpub.java;fp=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FEpub.java;h=7ac3efc78703f7fb9e4a27fc2668c04c541965ad;hp=794998e0d75c24ed36288aec9dcb7c846ecd93fd;hb=7445f8565be9e9237ffb3e16fd4dcb61f8c36cd5;hpb=fd25eddc49559d6b0edcc4e2ed5b9bf7869978da diff --git a/src/be/nikiroo/fanfix/supported/Epub.java b/src/be/nikiroo/fanfix/supported/Epub.java index 794998e..7ac3efc 100644 --- a/src/be/nikiroo/fanfix/supported/Epub.java +++ b/src/be/nikiroo/fanfix/supported/Epub.java @@ -4,20 +4,20 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URISyntaxException; 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 org.jsoup.nodes.Document; + 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; /** @@ -27,9 +27,10 @@ import be.nikiroo.utils.StringUtils; * @author niki */ class Epub extends InfoText { - protected MetaData meta; + private File sourceFileOriginal; + + private MetaData meta; private File tmpDir; - private File tmp; private String desc; private URL fakeSource; @@ -40,166 +41,173 @@ class Epub extends InfoText { return "epub"; } - @Override - protected boolean supports(URL url) { - if (url.getPath().toLowerCase().endsWith(".epub")) { - return true; - } - - return false; + public File getSourceFileOriginal() { + return sourceFileOriginal; } @Override - protected MetaData getMeta(URL source, InputStream in) throws IOException { - return meta; - } - - @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); + protected File getSourceFile() { + try { + return new File(fakeSource.toURI()); + } catch (URISyntaxException e) { + Instance.getTraceHandler() + .error(new IOException( + "Cannot get the source file from the info-text URL", + e)); } return null; } @Override - protected List> getChapters(URL source, InputStream in, - Progress pg) throws IOException { - if (fakeIn != null) { - fakeIn.reset(); - return super.getChapters(fakeSource, fakeIn, pg); - } - - return null; + protected InputStream getInput() { + return fakeIn; } @Override - protected String getChapterContent(URL source, InputStream in, int number, - Progress pg) throws IOException { - if (fakeIn != null) { - fakeIn.reset(); - return super.getChapterContent(fakeSource, fakeIn, number, pg); - } + protected boolean supports(URL url) { + return url.getPath().toLowerCase().endsWith(".epub"); + } - return null; + @Override + protected MetaData getMeta() throws IOException { + return meta; } @Override - protected void preprocess(URL source, InputStream in) throws IOException { - // Note: do NOT close this stream, as it would also close "in" - ZipInputStream zipIn = new ZipInputStream(in); - tmpDir = Instance.getTempFiles().createTempDir("fanfic-reader-parser"); - tmp = new File(tmpDir, "file.txt"); - File tmpInfo = new File(tmpDir, "file.info"); - fakeSource = tmp.toURI().toURL(); - Image cover = null; - - String url = source.toString(); - String title = null; - String author = null; - - 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; + protected Document loadDocument(URL source) throws IOException { + super.loadDocument(source); // prepares super.getSourceFile() and + // super.getInput() + + InputStream in = super.getInput(); + ZipInputStream zipIn = null; + try { + zipIn = new ZipInputStream(in); + tmpDir = Instance.getTempFiles().createTempDir( + "fanfic-reader-parser"); + File tmp = new File(tmpDir, "file.txt"); + File tmpInfo = new File(tmpDir, "file.info"); + + fakeSource = tmp.toURI().toURL(); + Image cover = null; + + String url; + try { + url = getSource().toURI().toURL().toString(); + } catch (URISyntaxException e1) { + url = getSource().toString(); + } + String title = null; + String author = null; + + 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)) { + if (entryLName.endsWith(ext)) { + imageEntry = true; + } } - } - if (entry.getName().equals(getDataPrefix() + "version")) { - // Nothing to do for now ("first" - // version is 3.0) - } else if (entryLName.endsWith(".info")) { - // Info file - IOUtils.write(zipIn, tmpInfo); - } else if (imageEntry) { - // Cover - if (getCover()) { - try { - cover = new Image(zipIn); - } catch (Exception e) { - Instance.getTraceHandler().error(e); + if (entry.getName().equals(getDataPrefix() + "version")) { + // Nothing to do for now ("first" + // version is 3.0) + } else if (entryLName.endsWith(".info")) { + // Info file + IOUtils.write(zipIn, tmpInfo); + } else if (imageEntry) { + // Cover + if (getCover()) { + try { + cover = new Image(zipIn); + } catch (Exception e) { + Instance.getTraceHandler().error(e); + } } - } - } else if (entry.getName().equals(getDataPrefix() + "URL")) { - 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")) { - 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; + } else if (entry.getName().equals(getDataPrefix() + "URL")) { + 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")) { + 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 = ""; - 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); + this.desc = this.desc.trim(); + } else { + // Hopefully the data file + IOUtils.write(zipIn, tmp); + } } } - } - - if (requireInfo() && (!tmp.exists() || !tmpInfo.exists())) { - throw new IOException( - "file not supported (maybe not created with this program or corrupt)"); - } - if (tmp.exists()) { - this.fakeIn = new MarkableFileInputStream(new FileInputStream(tmp)); - } + if (requireInfo() && (!tmp.exists() || !tmpInfo.exists())) { + throw new IOException( + "file not supported (maybe not created with this program or corrupt)"); + } - if (tmpInfo.exists()) { - meta = InfoReader.readMeta(tmpInfo, true); - if (cover != null) { - meta.setCover(cover); + if (tmp.exists()) { + this.fakeIn = new MarkableFileInputStream(new FileInputStream( + tmp)); } - 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); + + if (tmpInfo.exists()) { + meta = InfoReader.readMeta(tmpInfo, true); + if (cover != null) { + meta.setCover(cover); + } + tmpInfo.delete(); + } else { + if (title == null || title.isEmpty()) { + title = getSourceFileOriginal().getName(); + if (title.toLowerCase().endsWith(".cbz")) { + title = title.substring(0, title.length() - 4); + } + title = URLDecoder.decode(title, "UTF-8").trim(); } - title = URLDecoder.decode(title, "UTF-8").trim(); - } - meta = new MetaData(); - meta.setLang("en"); - meta.setTags(new ArrayList()); - meta.setSource(getSourceName()); - meta.setUuid(url); - meta.setUrl(url); - meta.setTitle(title); - meta.setAuthor(author); - meta.setImageDocument(isImagesDocumentByDefault()); + meta = new MetaData(); + meta.setLang("en"); + meta.setTags(new ArrayList()); + meta.setSource(getSourceName()); + meta.setUuid(url); + meta.setUrl(url); + meta.setTitle(title); + meta.setAuthor(author); + meta.setImageDocument(isImagesDocumentByDefault()); + } + } finally { + if (zipIn != null) { + zipIn.close(); + } + if (in != null) { + in.close(); + } } + + return null; } @Override @@ -209,15 +217,6 @@ class Epub extends InfoText { } tmpDir = null; - tmp = null; - - if (fakeIn != null) { - try { - fakeIn.close(); - } catch (Exception e) { - Instance.getTraceHandler().error(e); - } - } super.close(); }