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 were using UUID for URL...
+ if (!hasIt(meta.getUrl()) && meta.getUuid() != null
+ && (meta.getUuid().startsWith("http://")
+ || meta.getUuid().startsWith("https://"))) {
+ meta.setUrl(meta.getUuid());
+ }
+
+ // 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");
+ }
+
+ completeMeta(textFile, meta);
+ //
+ }
+
+ return meta;
} finally {
in.close();
}
"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.
+ *
+ * @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 {
meta.setTitle(getInfoTag(in, "TITLE"));
meta.setAuthor(getInfoTag(in, "AUTHOR"));
- meta.setDate(getInfoTag(in, "DATE"));
+ meta.setDate(bsHelper.formatDate(getInfoTag(in, "DATE")));
meta.setTags(getInfoTagList(in, "TAGS", ","));
meta.setSource(getInfoTag(in, "SOURCE"));
meta.setUrl(getInfoTag(in, "URL"));
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
} catch (NumberFormatException e) {
meta.setWords(0);
}
- meta.setCreationDate(getInfoTag(in, "CREATION_DATE"));
+ meta.setCreationDate(
+ bsHelper.formatDate(getInfoTag(in, "CREATION_DATE")));
meta.setFakeCover(Boolean.parseBoolean(getInfoTag(in, "FAKE_COVER")));
if (withCover && meta.getCover() == null) {
File basefile = new File(sourceInfoFile.getFile());
- String ext = "."
- + Instance.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,
String value = getLine(in, key, 0);
if (value != null && !value.isEmpty()) {
value = value.trim().substring(key.length() - 1).trim();
- if (value.startsWith("'") && value.endsWith("'")
- || value.startsWith("\"") && value.endsWith("\"")) {
+ if (value.length() > 1 && //
+ (value.startsWith("'") && value.endsWith("'")
+ || value.startsWith("\"")
+ && value.endsWith("\""))) {
value = value.substring(1, value.length() - 1).trim();
}
+ // Some old files ended up with TITLE="'xxxxx'"
+ if ("^TITLE=".equals(key)) {
+ if (value.startsWith("'") && value.endsWith("'")
+ && value.length() > 1) {
+ value = value.substring(1, value.length() - 1).trim();
+ }
+ }
+
return value;
}
}
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;
}