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;
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 {
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();
}
+ 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();
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
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,
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;
}
@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
meta.setType(getType().toString());
meta.setImageDocument(false);
meta.setCover(getCover(getSourceFile()));
-
+
return meta;
}
return content;
}
- private Image getCover(File sourceFile) {
+ protected Image getCover(File sourceFile) {
String path = sourceFile.getName();
for (String ext : new String[] { ".txt", ".text", ".story" }) {
}
/**
- * Remove the ".txt" extension if it is present.
+ * Remove the ".txt" (or ".text") extension if it is present.
*
* @param file
* the file to process
* 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;