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 = "^" + 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() - 1).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;
}
}