From: Niki Roo Date: Sun, 3 May 2020 12:29:53 +0000 (+0200) Subject: cbz/epub read support: be more permissive X-Git-Url: http://git.nikiroo.be/?p=nikiroo-utils.git;a=commitdiff_plain;h=15da4d0add653ff0be6cd4f6d49f4786234114fc cbz/epub read support: be more permissive --- diff --git a/supported/Epub.java b/supported/Epub.java index 90a9f45..965a27a 100644 --- a/supported/Epub.java +++ b/supported/Epub.java @@ -7,6 +7,8 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -107,6 +109,7 @@ class Epub extends InfoText { if (!entry.isDirectory() && entry.getName().startsWith(getDataPrefix())) { String entryLName = entry.getName().toLowerCase(); + entryLName = entryLName.substring(getDataPrefix().length()); boolean imageEntry = false; for (String ext : bsImages.getImageExt(false)) { @@ -115,7 +118,7 @@ class Epub extends InfoText { } } - if (entry.getName().equals(getDataPrefix() + "version")) { + if (entryLName.equals("version")) { // Nothing to do for now ("first" // version is 3.0) } else if (entryLName.endsWith(".info")) { @@ -123,7 +126,7 @@ class Epub extends InfoText { IOUtils.write(zipIn, tmpInfo); } else if (imageEntry) { // Cover - if (getCover()) { + if (getCover() && cover == null) { try { cover = new Image(zipIn); } catch (Exception e) { @@ -131,21 +134,19 @@ class Epub extends InfoText { .error(e); } } - } else if (entry.getName() - .equals(getDataPrefix() + "URL")) { + } else if (entryLName.equals("url")) { String[] descArray = StringUtils .unhtml(IOUtils.readSmallStream(zipIn)).trim() .split("\n"); if (descArray.length > 0) { url = descArray[0].trim(); } - } else if (entry.getName().endsWith(".desc")) { + } else if (entryLName.endsWith(".desc")) { // // For old files // if (this.desc != null) { // this.desc = IOUtils.readSmallStream(zipIn).trim(); // } - } else if (entry.getName() - .equals(getDataPrefix() + "SUMMARY")) { + } else if (entryLName.equals("summary")) { String[] descArray = StringUtils .unhtml(IOUtils.readSmallStream(zipIn)).trim() .split("\n"); @@ -172,7 +173,7 @@ class Epub extends InfoText { } } - if (requireInfo() && (!tmp.exists() || !tmpInfo.exists())) { + if (requireInfo() && !tmp.exists()) { throw new IOException( "file not supported (maybe not created with this program or corrupt)"); } @@ -187,21 +188,27 @@ class Epub extends InfoText { } else { if (title == null || title.isEmpty()) { title = getSourceFileOriginal().getName(); - if (title.toLowerCase().endsWith(".cbz")) { - title = title.substring(0, title.length() - 4); + String exts[] = new String[] {".epub", ".cbz"}; + for (String ext : exts) { + if (title.toLowerCase().endsWith(ext)) { + title = title.substring(0, + title.length() - ext.length()); + } } title = URLDecoder.decode(title, "UTF-8").trim(); } meta = new MetaData(); meta.setLang("en"); - meta.setTags(new ArrayList()); + meta.setTags(Arrays.asList("[no_info]")); meta.setSource(getType().getSourceName()); meta.setUuid(url); meta.setUrl(url); meta.setTitle(title); meta.setAuthor(author); meta.setImageDocument(isImagesDocumentByDefault()); + + InfoReader.completeMeta(tmp, meta); } if (meta.getCover() == null) { diff --git a/supported/InfoReader.java b/supported/InfoReader.java index 206464f..d5eeeb1 100644 --- a/supported/InfoReader.java +++ b/supported/InfoReader.java @@ -48,7 +48,6 @@ public class InfoReader { meta.getUrl())) { // TODO: not nice, would be better to do it properly... - String base = infoFile.getPath(); if (base.endsWith(".info")) { base = base.substring(0, @@ -62,45 +61,8 @@ public class InfoReader { textFile = new File(base + ".text"); } - if (textFile.exists()) { - final URL source = textFile.toURI().toURL(); - final MetaData[] superMetaA = new MetaData[1]; - @SuppressWarnings("unused") - Text unused = new Text() { - private boolean loaded = loadDocument(); - - @Override - public SupportType getType() { - return SupportType.TEXT; - } - - protected boolean loadDocument() - throws IOException { - loadDocument(source); - superMetaA[0] = getMeta(); - return true; - } - - @Override - protected Image getCover(File sourceFile) { - return null; - } - }; - - MetaData superMeta = superMetaA[0]; - if (!hasIt(meta.getTitle())) { - meta.setTitle(superMeta.getTitle()); - } - if (!hasIt(meta.getAuthor())) { - meta.setAuthor(superMeta.getAuthor()); - } - if (!hasIt(meta.getDate())) { - meta.setDate(superMeta.getDate()); - } - if (!hasIt(meta.getUrl())) { - meta.setUrl(superMeta.getUrl()); - } - } + completeMeta(textFile, meta); + // } return meta; @@ -113,6 +75,60 @@ public class InfoReader { "File given as argument does not exists: " + infoFile.getAbsolutePath()); } + + /** + * Complete the given {@link MetaData} with the original text file if needed + * and possible. + * + * @param textFile + * the original text file + * @param meta + * the {@link MetaData} to complete if needed and possible + * + * @throws IOException + * in case of I/O errors + */ + static public void completeMeta(File textFile, + MetaData meta) throws IOException { + if (textFile != null && textFile.exists()) { + final URL source = textFile.toURI().toURL(); + final MetaData[] superMetaA = new MetaData[1]; + @SuppressWarnings("unused") + Text unused = new Text() { + private boolean loaded = loadDocument(); + + @Override + public SupportType getType() { + return SupportType.TEXT; + } + + protected boolean loadDocument() throws IOException { + loadDocument(source); + superMetaA[0] = getMeta(); + return true; + } + + @Override + protected Image getCover(File sourceFile) { + return null; + } + }; + + MetaData superMeta = superMetaA[0]; + if (!hasIt(meta.getTitle())) { + meta.setTitle(superMeta.getTitle()); + } + if (!hasIt(meta.getAuthor())) { + meta.setAuthor(superMeta.getAuthor()); + } + if (!hasIt(meta.getDate())) { + meta.setDate(superMeta.getDate()); + } + if (!hasIt(meta.getUrl())) { + meta.setUrl(superMeta.getUrl()); + } + } + } /** * Check if we have non-empty values for all the given {@link String}s.