package be.nikiroo.fanfix.supported;
-import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
+import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import be.nikiroo.fanfix.Instance;
import be.nikiroo.fanfix.data.MetaData;
import be.nikiroo.utils.IOUtils;
+import be.nikiroo.utils.Image;
import be.nikiroo.utils.MarkableFileInputStream;
import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.StringUtils;
/**
* Support class for EPUB files created with this program (as we need some
* @author niki
*/
class Epub extends InfoText {
- private File tmp;
protected MetaData meta;
+ private File tmp;
+ private String desc;
private URL fakeSource;
private InputStream fakeIn;
@Override
protected String getDesc(URL source, InputStream in) throws IOException {
+ if (desc != null) {
+ return desc;
+ }
+
if (fakeIn != null) {
fakeIn.reset();
return super.getDesc(fakeSource, fakeIn);
tmp = File.createTempFile("fanfic-reader-parser_", ".tmp");
File tmpInfo = new File(tmp + ".info");
fakeSource = tmp.toURI().toURL();
- BufferedImage cover = null;
+ Image cover = null;
+
+ String url = source.toString();
+ String title = null;
+ String author = null;
for (ZipEntry entry = zipIn.getNextEntry(); entry != null; entry = zipIn
.getNextEntry()) {
// Cover
if (getCover()) {
try {
- cover = IOUtils.toImage(zipIn);
+ cover = new Image(zipIn);
} catch (Exception e) {
- Instance.syserr(e);
+ Instance.getTraceHandler().error(e);
}
}
} else if (entry.getName().equals(getDataPrefix() + "URL")) {
- // Do nothing
+ String[] descArray = StringUtils
+ .unhtml(IOUtils.readSmallStream(zipIn)).trim()
+ .split("\n");
+ if (descArray.length > 0) {
+ url = descArray[0].trim();
+ }
} else if (entry.getName().equals(getDataPrefix() + "SUMMARY")) {
- // Do nothing
+ String[] descArray = StringUtils
+ .unhtml(IOUtils.readSmallStream(zipIn)).trim()
+ .split("\n");
+ int skip = 0;
+ if (descArray.length > 1) {
+ title = descArray[0].trim();
+ skip = 1;
+ if (descArray.length > 2
+ && descArray[1].startsWith("©")) {
+ author = descArray[1].substring(1).trim();
+ skip = 2;
+ }
+ }
+ this.desc = "";
+ for (int i = skip; i < descArray.length; i++) {
+ this.desc += descArray[i].trim() + "\n";
+ }
+
+ this.desc = this.desc.trim();
} else {
// Hopefully the data file
IOUtils.write(zipIn, tmp);
}
if (tmpInfo.exists()) {
- meta = InfoReader.readMeta(tmpInfo);
+ meta = InfoReader.readMeta(tmpInfo, true);
if (cover != null) {
meta.setCover(cover);
}
tmpInfo.delete();
} else {
+ if (title == null || title.isEmpty()) {
+ title = new File(source.getPath()).getName();
+ if (title.toLowerCase().endsWith(".cbz")) {
+ title = title.substring(0, title.length() - 4);
+ }
+ title = URLDecoder.decode(title, "UTF-8").trim();
+ }
+
meta = new MetaData();
- meta.setUuid(source.toString());
meta.setLang("EN");
meta.setTags(new ArrayList<String>());
meta.setSource(getSourceName());
- meta.setUrl(source.toString());
+ meta.setUuid(url);
+ meta.setUrl(url);
+ meta.setTitle(title);
+ meta.setAuthor(author);
+ meta.setImageDocument(isImagesDocumentByDefault());
}
}
@Override
- protected void close() throws IOException {
+ protected void close() {
if (tmp != null && tmp.exists()) {
if (!tmp.delete()) {
tmp.deleteOnExit();
tmp = null;
- fakeIn.close();
+ if (fakeIn != null) {
+ try {
+ fakeIn.close();
+ } catch (Exception e) {
+ Instance.getTraceHandler().error(e);
+ }
+ }
+
super.close();
}
protected boolean getCover() {
return true;
}
+
+ protected boolean isImagesDocumentByDefault() {
+ return false;
+ }
}