From 31e27ee3108543141f9bfd2efce8c0fa024460a1 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Mon, 27 Apr 2020 15:24:12 +0200 Subject: [PATCH] fix missing values for some old files --- supported/InfoReader.java | 101 +++++++++++++++++++++++++++++++++++--- supported/InfoText.java | 25 +--------- supported/Text.java | 14 +++--- 3 files changed, 102 insertions(+), 38 deletions(-) diff --git a/supported/InfoReader.java b/supported/InfoReader.java index 220350e..15a4f5c 100644 --- a/supported/InfoReader.java +++ b/supported/InfoReader.java @@ -9,6 +9,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import org.jsoup.nodes.Document; + import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.bundles.Config; import be.nikiroo.fanfix.data.MetaData; @@ -19,7 +21,8 @@ import be.nikiroo.utils.streams.MarkableFileInputStream; public class InfoReader { static protected BasicSupportHelper bsHelper = new BasicSupportHelper(); // static protected BasicSupportImages bsImages = new BasicSupportImages(); - // static protected BasicSupportPara bsPara = new BasicSupportPara(new BasicSupportHelper(), new BasicSupportImages()); + // static protected BasicSupportPara bsPara = new BasicSupportPara(new + // BasicSupportHelper(), new BasicSupportImages()); public static MetaData readMeta(File infoFile, boolean withCover) throws IOException { @@ -30,7 +33,72 @@ public class InfoReader { if (infoFile.exists()) { InputStream in = new MarkableFileInputStream(infoFile); try { - return createMeta(infoFile.toURI().toURL(), in, withCover); + MetaData meta = createMeta(infoFile.toURI().toURL(), in, + withCover); + + // Some old .info files don't have those now required fields... + // So we check if we can find the info in another way (many + // formats have a copy of the original text file) + if (!hasIt(meta.getTitle(), meta.getAuthor(), meta.getDate(), + meta.getUrl())) { + + // TODO: not nice, would be better to do it properly... + + String base = infoFile.getPath(); + if (base.endsWith(".info")) { + base = base.substring(0, + base.length() - ".info".length()); + } + File textFile = new File(base); + if (!textFile.exists()) { + textFile = new File(base + ".txt"); + } + if (!textFile.exists()) { + 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()); + } + } + } + + return meta; } finally { in.close(); } @@ -41,6 +109,24 @@ public class InfoReader { + infoFile.getAbsolutePath()); } + /** + * Check if we have non-empty values for all the given {@link String}s. + * + * @param values + * the values to check + * + * @return TRUE if none of them was NULL or empty + */ + static private boolean hasIt(String... values) { + for (String value : values) { + if (value == null || value.trim().isEmpty()) { + return false; + } + } + + return true; + } + private static MetaData createMeta(URL sourceInfoFile, InputStream in, boolean withCover) throws IOException { MetaData meta = new MetaData(); @@ -61,8 +147,7 @@ public class InfoReader { if (withCover) { String infoTag = getInfoTag(in, "COVER"); if (infoTag != null && !infoTag.trim().isEmpty()) { - meta.setCover(bsHelper.getImage(null, sourceInfoFile, - infoTag)); + meta.setCover(bsHelper.getImage(null, sourceInfoFile, infoTag)); } if (meta.getCover() == null) { // Second chance: try to check for a cover next to the info file @@ -97,8 +182,8 @@ public class InfoReader { File basefile = new File(sourceInfoFile.getFile()); - String ext = "." - + Instance.getInstance().getConfig().getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER).toLowerCase(); + String ext = "." + Instance.getInstance().getConfig() + .getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER).toLowerCase(); // Without removing ext cover = bsHelper.getImage(null, sourceInfoFile, @@ -235,8 +320,8 @@ public class InfoReader { if (index == -1) { if (needle.startsWith("^")) { - if (lines.get(lines.size() - 1).startsWith( - needle.substring(1))) { + if (lines.get(lines.size() - 1) + .startsWith(needle.substring(1))) { index = lines.size() - 1; } diff --git a/supported/InfoText.java b/supported/InfoText.java index 42e2c13..2af8c7e 100644 --- a/supported/InfoText.java +++ b/supported/InfoText.java @@ -22,30 +22,7 @@ class InfoText extends Text { @Override protected MetaData getMeta() throws IOException { - MetaData meta = InfoReader.readMeta(getInfoFile(), true); - - // Some old .info files don't have those now required fields... - String test = meta.getTitle() == null ? "" : meta.getTitle(); - test += meta.getAuthor() == null ? "" : meta.getAuthor(); - test += meta.getDate() == null ? "" : meta.getDate(); - test += meta.getUrl() == null ? "" : meta.getUrl(); - if (test.isEmpty()) { - MetaData superMeta = super.getMeta(); - if (meta.getTitle() == null || meta.getTitle().isEmpty()) { - meta.setTitle(superMeta.getTitle()); - } - if (meta.getAuthor() == null || meta.getAuthor().isEmpty()) { - meta.setAuthor(superMeta.getAuthor()); - } - if (meta.getDate() == null || meta.getDate().isEmpty()) { - meta.setDate(superMeta.getDate()); - } - if (meta.getUrl() == null || meta.getUrl().isEmpty()) { - meta.setUrl(superMeta.getUrl()); - } - } - - return meta; + return InfoReader.readMeta(getInfoFile(), true); } @Override diff --git a/supported/Text.java b/supported/Text.java index c54b6a5..e082a73 100644 --- a/supported/Text.java +++ b/supported/Text.java @@ -97,7 +97,7 @@ class Text extends BasicSupport { meta.setType(getType().toString()); meta.setImageDocument(false); meta.setCover(getCover(getSourceFile())); - + return meta; } @@ -188,7 +188,7 @@ class Text extends BasicSupport { return content; } - private Image getCover(File sourceFile) { + protected Image getCover(File sourceFile) { String path = sourceFile.getName(); for (String ext : new String[] { ".txt", ".text", ".story" }) { @@ -317,7 +317,7 @@ class Text extends BasicSupport { } /** - * Remove the ".txt" extension if it is present. + * Remove the ".txt" (or ".text") extension if it is present. * * @param file * the file to process @@ -326,9 +326,11 @@ class Text extends BasicSupport { * was present */ protected File assureNoTxt(File file) { - if (file.getName().endsWith(".txt")) { - file = new File(file.getPath().substring(0, - file.getPath().length() - 4)); + for (String ext : new String[] { ".txt", ".text" }) { + if (file.getName().endsWith(ext)) { + file = new File(file.getPath().substring(0, + file.getPath().length() - ext.length())); + } } return file; -- 2.27.0