package be.nikiroo.fanfix.supported;
import java.io.File;
-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;
+import be.nikiroo.utils.Image;
+import be.nikiroo.utils.streams.MarkableFileInputStream;
// not complete: no "description" tag
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());
+
public static MetaData readMeta(File infoFile, boolean withCover)
throws IOException {
if (infoFile == null) {
}
if (infoFile.exists()) {
- InputStream in = new MarkableFileInputStream(new FileInputStream(
- infoFile));
+ InputStream in = new MarkableFileInputStream(infoFile);
try {
return createMeta(infoFile.toURI().toURL(), in, withCover);
} finally {
in.close();
- in = null;
}
}
if (withCover) {
String infoTag = getInfoTag(in, "COVER");
if (infoTag != null && !infoTag.trim().isEmpty()) {
- meta.setCover(BasicSupportHelper.getImage(null, sourceInfoFile,
+ meta.setCover(bsHelper.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));
- }
+ // Second chance: try to check for a cover next to the info file
+ meta.setCover(getCoverByName(sourceInfoFile));
}
}
try {
meta.setFakeCover(Boolean.parseBoolean(getInfoTag(in, "FAKE_COVER")));
if (withCover && meta.getCover() == null) {
- meta.setCover(BasicSupportHelper.getDefaultCover(meta.getSubject()));
+ meta.setCover(bsHelper.getDefaultCover(meta.getSubject()));
}
return meta;
}
+ /**
+ * Return the cover image if it is next to the source file.
+ *
+ * @param sourceInfoFile
+ * the source file
+ *
+ * @return the cover if present, NULL if not
+ */
+ public static Image getCoverByName(URL sourceInfoFile) {
+ Image cover = null;
+
+ File basefile = new File(sourceInfoFile.getFile());
+
+ String ext = "."
+ + Instance.getConfig().getString(Config.FILE_FORMAT_IMAGE_FORMAT_COVER)
+ .toLowerCase();
+
+ // Without removing ext
+ cover = bsHelper.getImage(null, sourceInfoFile,
+ basefile.getAbsolutePath() + ext);
+
+ // Try without ext
+ String name = basefile.getName();
+ int pos = name.lastIndexOf(".");
+ if (cover == null && pos > 0) {
+ name = name.substring(0, pos);
+ basefile = new File(basefile.getParent(), name);
+
+ cover = bsHelper.getImage(null, sourceInfoFile,
+ basefile.getAbsolutePath() + ext);
+ }
+
+ return cover;
+ }
+
private static boolean getInfoTagBoolean(InputStream in, String key,
boolean def) throws IOException {
Boolean value = getInfoTagBoolean(in, key);
if (in != null) {
in.reset();
- String value = BasicSupport_Deprecated.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("'")
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<String> lines = new ArrayList<String>();
+ @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;
+ }
}