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 java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
-import javax.imageio.ImageIO;
-
import be.nikiroo.fanfix.Instance;
-import be.nikiroo.fanfix.bundles.Config;
+import be.nikiroo.fanfix.data.MetaData;
import be.nikiroo.utils.IOUtils;
+import be.nikiroo.utils.ImageUtils;
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 BasicSupport {
- private InfoText base;
- private URL fakeSource;
-
- private File tmpCover;
- private File tmpInfo;
+class Epub extends InfoText {
+ protected MetaData meta;
private File tmp;
+ private String desc;
- /** Only used by {@link Epub#getInput()} so it is always reset. */
- private InputStream in;
+ private URL fakeSource;
+ private InputStream fakeIn;
@Override
public String getSourceName() {
}
@Override
- protected boolean isHtml() {
- if (tmpInfo.exists()) {
- return base.isHtml();
- }
-
- return false;
- }
-
- @Override
- protected String getTitle(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getTitle(fakeSource, getFakeInput());
- }
-
- return source.toString();
- }
-
- @Override
- protected String getAuthor(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getAuthor(fakeSource, getFakeInput());
- }
-
- return null;
- }
-
- @Override
- protected String getDate(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getDate(fakeSource, getFakeInput());
- }
-
- return null;
- }
-
- @Override
- protected String getSubject(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getSubject(fakeSource, getFakeInput());
- }
-
- return null;
+ protected MetaData getMeta(URL source, InputStream in) throws IOException {
+ return meta;
}
@Override
protected String getDesc(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getDesc(fakeSource, getFakeInput());
+ if (desc != null) {
+ return desc;
}
- return null;
- }
-
- @Override
- protected URL getCover(URL source, InputStream in) throws IOException {
- if (tmpCover.exists()) {
- return tmpCover.toURI().toURL();
+ if (fakeIn != null) {
+ fakeIn.reset();
+ return super.getDesc(fakeSource, fakeIn);
}
return null;
}
@Override
- protected List<Entry<String, URL>> getChapters(URL source, InputStream in)
- throws IOException {
- if (tmpInfo.exists()) {
- return base.getChapters(fakeSource, getFakeInput());
+ protected List<Entry<String, URL>> getChapters(URL source, InputStream in,
+ Progress pg) throws IOException {
+ if (fakeIn != null) {
+ fakeIn.reset();
+ return super.getChapters(fakeSource, fakeIn, pg);
}
return null;
}
@Override
- protected String getChapterContent(URL source, InputStream in, int number)
- throws IOException {
- if (tmpInfo.exists()) {
- return base.getChapterContent(fakeSource, getFakeInput(), number);
+ protected String getChapterContent(URL source, InputStream in, int number,
+ Progress pg) throws IOException {
+ if (fakeIn != null) {
+ fakeIn.reset();
+ return super.getChapterContent(fakeSource, fakeIn, number, pg);
}
return null;
}
@Override
- protected String getLang(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getLang(fakeSource, getFakeInput());
- }
-
- return super.getLang(source, in);
- }
-
- @Override
- protected String getPublisher(URL source, InputStream in)
- throws IOException {
- if (tmpInfo.exists()) {
- return base.getPublisher(fakeSource, getFakeInput());
- }
-
- return super.getPublisher(source, in);
- }
-
- @Override
- protected List<String> getTags(URL source, InputStream in)
- throws IOException {
- if (tmpInfo.exists()) {
- return base.getTags(fakeSource, getFakeInput());
- }
-
- return super.getTags(source, in);
- }
-
- @Override
- protected String getUuid(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getUuid(fakeSource, getFakeInput());
- }
-
- return super.getUuid(source, in);
- }
-
- @Override
- protected String getLuid(URL source, InputStream in) throws IOException {
- if (tmpInfo.exists()) {
- return base.getLuid(fakeSource, getFakeInput());
- }
-
- return super.getLuid(source, in);
- }
-
- @Override
- protected void preprocess(InputStream in) throws IOException {
+ protected void preprocess(URL source, InputStream in) throws IOException {
// Note: do NOT close this stream, as it would also close "in"
ZipInputStream zipIn = new ZipInputStream(in);
tmp = File.createTempFile("fanfic-reader-parser_", ".tmp");
- tmpInfo = new File(tmp + ".info");
- tmpCover = File.createTempFile("fanfic-reader-parser_", ".tmp");
-
- base = new InfoText();
+ File tmpInfo = new File(tmp + ".info");
fakeSource = tmp.toURI().toURL();
+ BufferedImage 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 {
- BufferedImage image = ImageIO.read(zipIn);
- ImageIO.write(image, Instance.getConfig()
- .getString(Config.IMAGE_FORMAT_COVER)
- .toLowerCase(), tmpCover);
+ cover = ImageUtils.fromStream(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 (tmp.exists()) {
- this.in = new MarkableFileInputStream(new FileInputStream(tmp));
+ this.fakeIn = new MarkableFileInputStream(new FileInputStream(tmp));
+ }
+
+ if (tmpInfo.exists()) {
+ 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.setLang("EN");
+ meta.setTags(new ArrayList<String>());
+ meta.setSource(getSourceName());
+ meta.setUuid(url);
+ meta.setUrl(url);
+ meta.setTitle(title);
+ meta.setAuthor(author);
}
}
@Override
protected void close() throws IOException {
- for (File file : new File[] { tmp, tmpInfo, tmpCover }) {
- if (file != null && file.exists()) {
- if (!file.delete()) {
- file.deleteOnExit();
- }
+ if (tmp != null && tmp.exists()) {
+ if (!tmp.delete()) {
+ tmp.deleteOnExit();
}
}
tmp = null;
- tmpInfo = null;
- tmpCover = null;
- fakeSource = null;
- try {
- if (in != null) {
- in.close();
- }
- } finally {
- in = null;
- base.close();
+ if (fakeIn != null) {
+ fakeIn.close();
}
+
+ super.close();
}
protected String getDataPrefix() {
protected boolean getCover() {
return true;
}
-
- /**
- * Reset then return {@link Epub#in}.
- *
- * @return {@link Epub#in}
- *
- * @throws IOException
- * in case of I/O error
- */
- private InputStream getFakeInput() throws IOException {
- in.reset();
- return in;
- }
}