X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FInfoReader.java;h=8e1c385cfa8d115fd9fd6035be77eac10c580611;hb=88664350f0b3849538d4f41f7c3d56d81d03e1a4;hp=1695ebdeadfb9792dcbe73011fb02540692e2fdc;hpb=68686a37a591a767f6d1af428ea0d5f3d3a1ddc1;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/supported/InfoReader.java b/src/be/nikiroo/fanfix/supported/InfoReader.java index 1695ebd..8e1c385 100644 --- a/src/be/nikiroo/fanfix/supported/InfoReader.java +++ b/src/be/nikiroo/fanfix/supported/InfoReader.java @@ -5,15 +5,20 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.Scanner; +import be.nikiroo.fanfix.Instance; +import be.nikiroo.fanfix.bundles.Config; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.utils.MarkableFileInputStream; // not complete: no "description" tag public class InfoReader { - public static MetaData readMeta(File infoFile) throws IOException { + public static MetaData readMeta(File infoFile, boolean withCover) + throws IOException { if (infoFile == null) { throw new IOException("File is null"); } @@ -22,19 +27,19 @@ public class InfoReader { InputStream in = new MarkableFileInputStream(new FileInputStream( infoFile)); try { - return createMeta(in); + return createMeta(infoFile.toURI().toURL(), in, withCover); } finally { in.close(); - in = null; } - } else { - throw new FileNotFoundException( - "File given as argument does not exists: " - + infoFile.getAbsolutePath()); } + + throw new FileNotFoundException( + "File given as argument does not exists: " + + infoFile.getAbsolutePath()); } - private static MetaData createMeta(InputStream in) throws IOException { + private static MetaData createMeta(URL sourceInfoFile, InputStream in, + boolean withCover) throws IOException { MetaData meta = new MetaData(); meta.setTitle(getInfoTag(in, "TITLE")); @@ -42,6 +47,7 @@ public class InfoReader { meta.setDate(getInfoTag(in, "DATE")); meta.setTags(getInfoTagList(in, "TAGS", ",")); meta.setSource(getInfoTag(in, "SOURCE")); + meta.setUrl(getInfoTag(in, "URL")); meta.setPublisher(getInfoTag(in, "PUBLISHER")); meta.setUuid(getInfoTag(in, "UUID")); meta.setLuid(getInfoTag(in, "LUID")); @@ -49,10 +55,36 @@ public class InfoReader { meta.setSubject(getInfoTag(in, "SUBJECT")); meta.setType(getInfoTag(in, "TYPE")); meta.setImageDocument(getInfoTagBoolean(in, "IMAGES_DOCUMENT", false)); - meta.setCover(BasicSupport.getImage(null, getInfoTag(in, "COVER"))); + if (withCover) { + String infoTag = getInfoTag(in, "COVER"); + if (infoTag != null && !infoTag.trim().isEmpty()) { + meta.setCover(BasicSupportHelper.getImage(null, sourceInfoFile, + infoTag)); + } + // Second chance: try to check for a cover next to the info file + if (meta.getCover() == null) { + String info = sourceInfoFile.getFile().toString(); + if (info.endsWith(".info")) { + info = info.substring(0, info.length() - ".info".length()); + String ext = "." + + Instance.getConfig() + .getString(Config.IMAGE_FORMAT_COVER) + .toLowerCase(); + meta.setCover(BasicSupportHelper.getImage(null, + sourceInfoFile, info + ext)); + } + } + } + try { + meta.setWords(Long.parseLong(getInfoTag(in, "WORDCOUNT"))); + } catch (NumberFormatException e) { + meta.setWords(0); + } + meta.setCreationDate(getInfoTag(in, "CREATION_DATE")); + meta.setFakeCover(Boolean.parseBoolean(getInfoTag(in, "FAKE_COVER"))); - if (meta.getCover() == null) { - meta.setCover(BasicSupport.getDefaultCover(meta.getSubject())); + if (withCover && meta.getCover() == null) { + meta.setCover(BasicSupportHelper.getDefaultCover(meta.getSubject())); } return meta; @@ -106,7 +138,7 @@ public class InfoReader { if (in != null) { in.reset(); - String value = BasicSupport.getLine(in, key, 0); + String value = getLine(in, key, 0); if (value != null && !value.isEmpty()) { value = value.trim().substring(key.length() - 1).trim(); if (value.startsWith("'") && value.endsWith("'") @@ -120,4 +152,81 @@ public class InfoReader { return null; } + + /** + * Return the first line from the given input which correspond to the given + * selectors. + * + * @param in + * the input + * @param needle + * a string that must be found inside the target line (also + * supports "^" at start to say "only if it starts with" the + * needle) + * @param relativeLine + * the line to return based upon the target line position (-1 = + * the line before, 0 = the target line...) + * + * @return the line + */ + static private String getLine(InputStream in, String needle, + int relativeLine) { + return getLine(in, needle, relativeLine, true); + } + + /** + * Return a line from the given input which correspond to the given + * selectors. + * + * @param in + * the input + * @param needle + * a string that must be found inside the target line (also + * supports "^" at start to say "only if it starts with" the + * needle) + * @param relativeLine + * the line to return based upon the target line position (-1 = + * the line before, 0 = the target line...) + * @param first + * takes the first result (as opposed to the last one, which will + * also always spend the input) + * + * @return the line + */ + static private String getLine(InputStream in, String needle, + int relativeLine, boolean first) { + String rep = null; + + List lines = new ArrayList(); + @SuppressWarnings("resource") + Scanner scan = new Scanner(in, "UTF-8"); + int index = -1; + scan.useDelimiter("\\n"); + while (scan.hasNext()) { + lines.add(scan.next()); + + if (index == -1) { + if (needle.startsWith("^")) { + if (lines.get(lines.size() - 1).startsWith( + needle.substring(1))) { + index = lines.size() - 1; + } + + } else { + if (lines.get(lines.size() - 1).contains(needle)) { + index = lines.size() - 1; + } + } + } + + if (index >= 0 && index + relativeLine < lines.size()) { + rep = lines.get(index + relativeLine); + if (first) { + break; + } + } + } + + return rep; + } }