X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FInfoText.java;fp=src%2Fbe%2Fnikiroo%2Ffanfix%2Fsupported%2FInfoText.java;h=a627714a057eadf781c52558f249664756360912;hp=0000000000000000000000000000000000000000;hb=08fe2e33007063e30fe22dc1d290f8afaa18eb1d;hpb=ed48062ebfb0d611b74834e313bfb0a2b81416e6 diff --git a/src/be/nikiroo/fanfix/supported/InfoText.java b/src/be/nikiroo/fanfix/supported/InfoText.java new file mode 100644 index 0000000..a627714 --- /dev/null +++ b/src/be/nikiroo/fanfix/supported/InfoText.java @@ -0,0 +1,248 @@ +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 .info text files ({@link Text} files with a + * .info metadata file next to them). + *

+ * The .info 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 getTags(URL source, InputStream in) + throws IOException { + List 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 .info 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; + } +}