--- /dev/null
+package be.nikiroo.fanfix.supported;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.List;
+
+import be.nikiroo.fanfix.Instance;
+
+/**
+ * Support class for <tt>.info</tt> text files ({@link Text} files with a
+ * <tt>.info</tt> metadata file next to them).
+ * <p>
+ * The <tt>.info</tt> file is supposed to be written by this program, or
+ * compatible.
+ *
+ * @author niki
+ */
+class InfoText extends Text {
+ @Override
+ public String getSourceName() {
+ return "info-text";
+ }
+
+ @Override
+ protected String getTitle(URL source, InputStream in) throws IOException {
+ String tag = getInfoTag(source, "TITLE");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getTitle(source, in);
+ }
+
+ @Override
+ protected String getAuthor(URL source, InputStream in) throws IOException {
+ String tag = getInfoTag(source, "AUTHOR");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getAuthor(source, in);
+ }
+
+ @Override
+ protected String getDate(URL source, InputStream in) throws IOException {
+ String tag = getInfoTag(source, "DATE");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getDate(source, in);
+ }
+
+ @Override
+ protected String getSubject(URL source, InputStream in) throws IOException {
+ String tag = getInfoTag(source, "SUBJECT");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getSubject(source, in);
+ }
+
+ @Override
+ protected String getLang(URL source, InputStream in) throws IOException {
+ String tag = getInfoTag(source, "LANG");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getLang(source, in);
+ }
+
+ @Override
+ protected String getPublisher(URL source, InputStream in)
+ throws IOException {
+ String tag = getInfoTag(source, "PUBLISHER");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getPublisher(source, in);
+ }
+
+ @Override
+ protected String getUuid(URL source, InputStream in) throws IOException {
+ String tag = getInfoTag(source, "UUID");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getUuid(source, in);
+ }
+
+ @Override
+ protected String getLuid(URL source, InputStream in) throws IOException {
+ String tag = getInfoTag(source, "LUID");
+ if (tag != null) {
+ return tag;
+ }
+
+ return super.getLuid(source, in);
+ }
+
+ @Override
+ protected List<String> getTags(URL source, InputStream in)
+ throws IOException {
+ List<String> tags = super.getTags(source, in);
+
+ String tt = getInfoTag(source, "TAGS");
+ if (tt != null) {
+ for (String tag : tt.split(",")) {
+ tags.add(tag.trim());
+ }
+ }
+
+ return tags;
+ }
+
+ @Override
+ public boolean isImageDocument(URL source, InputStream in)
+ throws IOException {
+ String tag = getInfoTag(source, "IMAGES_DOCUMENT");
+ if (tag != null) {
+ return tag.trim().toLowerCase().equals("true");
+ }
+
+ return super.isImageDocument(source, in);
+ }
+
+ @Override
+ protected URL getCover(URL source, InputStream in) {
+ File file;
+ try {
+ file = new File(source.toURI());
+ file = new File(file.getPath() + ".info");
+ } catch (URISyntaxException e) {
+ Instance.syserr(e);
+ file = null;
+ }
+
+ String path = null;
+ if (file != null && file.exists()) {
+ try {
+ InputStream infoIn = new FileInputStream(file);
+ try {
+ String key = "COVER=";
+ String tt = getLine(infoIn, key, 0);
+ if (tt != null && !tt.isEmpty()) {
+ tt = tt.substring(key.length()).trim();
+ if (tt.startsWith("'") && tt.endsWith("'")) {
+ tt = tt.substring(1, tt.length() - 1).trim();
+ }
+
+ URL cover = getImage(source, tt);
+ if (cover != null) {
+ path = cover.getFile();
+ }
+ }
+ } finally {
+ infoIn.close();
+ }
+ } catch (MalformedURLException e) {
+ Instance.syserr(e);
+ } catch (IOException e) {
+ Instance.syserr(e);
+ }
+ }
+
+ if (path != null) {
+ try {
+ return new File(path).toURI().toURL();
+ } catch (MalformedURLException e) {
+ Instance.syserr(e);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ protected boolean supports(URL url) {
+ if ("file".equals(url.getProtocol())) {
+ File file;
+ try {
+ file = new File(url.toURI());
+ file = new File(file.getPath() + ".info");
+ } catch (URISyntaxException e) {
+ Instance.syserr(e);
+ file = null;
+ }
+
+ return file != null && file.exists();
+ }
+
+ return false;
+ }
+
+ /**
+ * Return the value of the given tag in the <tt>.info</tt> file if present.
+ *
+ * @param source
+ * the source story {@link URL}
+ * @param key
+ * the tag key
+ *
+ * @return the value or NULL
+ *
+ * @throws IOException
+ * in case of I/O error
+ */
+ private String getInfoTag(URL source, String key) throws IOException {
+ key += "=";
+
+ File file;
+ try {
+ file = new File(source.toURI());
+ file = new File(file.getPath() + ".info");
+ } catch (URISyntaxException e) {
+ throw new IOException(e);
+ }
+
+ if (file.exists()) {
+ InputStream infoIn = new FileInputStream(file);
+ try {
+ String value = getLine(infoIn, key, 0);
+ if (value != null && !value.isEmpty()) {
+ value = value.trim().substring(key.length()).trim();
+ if (value.startsWith("'") && value.endsWith("'")
+ || value.startsWith("\"") && value.endsWith("\"")) {
+ value = value.substring(1, value.length() - 1).trim();
+ }
+
+ return value;
+ }
+ } finally {
+ infoIn.close();
+ }
+ }
+
+ return null;
+ }
+}