import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.imageio.ImageIO;
+
import be.nikiroo.fanfix.Instance;
import be.nikiroo.fanfix.bundles.Config;
import be.nikiroo.fanfix.data.MetaData;
import be.nikiroo.fanfix.output.InfoCover;
import be.nikiroo.fanfix.supported.InfoReader;
import be.nikiroo.utils.IOUtils;
+import be.nikiroo.utils.ImageUtils;
+import be.nikiroo.utils.MarkableFileInputStream;
import be.nikiroo.utils.Progress;
/**
public class LocalLibrary extends BasicLibrary {
private int lastId;
private Map<MetaData, File[]> stories; // Files: [ infoFile, TargetFile ]
+ private Map<String, BufferedImage> sourceCovers;
private File baseDir;
private OutputType text;
this.lastId = 0;
this.stories = null;
+ this.sourceCovers = new HashMap<String, BufferedImage>();
baseDir.mkdirs();
}
@Override
protected void clearCache() {
stories = null;
+ sourceCovers = new HashMap<String, BufferedImage>();
}
@Override
protected synchronized int getNextId() {
+ getStories(null); // make sure lastId is set
return ++lastId;
}
clearCache();
}
+ @Override
+ public BufferedImage getSourceCover(String source) {
+ if (!sourceCovers.containsKey(source)) {
+ sourceCovers.put(source, super.getSourceCover(source));
+ }
+
+ return sourceCovers.get(source);
+ }
+
+ @Override
+ public void setSourceCover(String source, String luid) {
+ sourceCovers.put(source, getCover(luid));
+ File cover = new File(getExpectedDir(source), ".cover.png");
+ try {
+ ImageIO.write(sourceCovers.get(source), "png", cover);
+ } catch (IOException e) {
+ Instance.syserr(e);
+ sourceCovers.remove(source);
+ }
+ }
+
+ @Override
+ public void imprt(BasicLibrary other, String luid, Progress pg)
+ throws IOException {
+ if (pg == null) {
+ pg = new Progress();
+ }
+
+ // Check if we can simply copy the files instead of the whole process
+ if (other instanceof LocalLibrary) {
+ LocalLibrary otherLibrary = (LocalLibrary) other;
+ MetaData meta = otherLibrary.getInfo(luid);
+ String expectedType = "" + (meta.isImageDocument() ? image : text);
+ if (meta.getType().equals(expectedType)) {
+ File from = otherLibrary.getExpectedDir(meta.getSource());
+ File to = this.getExpectedDir(meta.getSource());
+ List<File> sources = otherLibrary.getRelatedFiles(luid);
+ if (!sources.isEmpty()) {
+ pg.setMinMax(0, sources.size());
+ }
+
+ for (File source : sources) {
+ File target = new File(source.getAbsolutePath().replace(
+ from.getAbsolutePath(), to.getAbsolutePath()));
+ if (!source.equals(target)) {
+ InputStream in = null;
+ try {
+ in = new FileInputStream(source);
+ IOUtils.write(in, target);
+ } catch (IOException e) {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (Exception ee) {
+ }
+ }
+
+ pg.done();
+ throw e;
+ }
+ }
+
+ pg.add(1);
+ }
+
+ clearCache();
+ pg.done();
+ return;
+ }
+ }
+
+ super.imprt(other, luid, pg);
+ }
+
/**
* Return the {@link OutputType} for this {@link Story}.
*
private OutputType getOutputType(MetaData meta) {
if (meta != null && meta.isImageDocument()) {
return image;
- } else {
- return text;
}
+
+ return text;
}
/**
MetaData meta = getInfo(luid);
if (meta == null) {
throw new IOException("Story not found: " + luid);
- } else {
- File infoFile = getStories(null).get(meta)[0];
- File targetFile = getStories(null).get(meta)[1];
+ }
- files.add(infoFile);
- files.add(targetFile);
+ File infoFile = getStories(null).get(meta)[0];
+ File targetFile = getStories(null).get(meta)[1];
- String readerExt = getOutputType(meta).getDefaultExtension(true);
- String fileExt = getOutputType(meta).getDefaultExtension(false);
+ files.add(infoFile);
+ files.add(targetFile);
- String path = targetFile.getAbsolutePath();
- if (readerExt != null && !readerExt.equals(fileExt)) {
- path = path.substring(0, path.length() - readerExt.length())
- + fileExt;
- File relatedFile = new File(path);
+ String readerExt = getOutputType(meta).getDefaultExtension(true);
+ String fileExt = getOutputType(meta).getDefaultExtension(false);
- if (relatedFile.exists()) {
- files.add(relatedFile);
- }
- }
+ String path = targetFile.getAbsolutePath();
+ if (readerExt != null && !readerExt.equals(fileExt)) {
+ path = path.substring(0, path.length() - readerExt.length())
+ + fileExt;
+ File relatedFile = new File(path);
- String coverExt = "."
- + Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER);
- File coverFile = new File(path + coverExt);
- if (!coverFile.exists()) {
- coverFile = new File(path.substring(0,
- path.length() - fileExt.length())
- + coverExt);
+ if (relatedFile.exists()) {
+ files.add(relatedFile);
}
+ }
- if (coverFile.exists()) {
- files.add(coverFile);
- }
+ String coverExt = "."
+ + Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER);
+ File coverFile = new File(path + coverExt);
+ if (!coverFile.exists()) {
+ coverFile = new File(path.substring(0,
+ path.length() - fileExt.length())
+ + coverExt);
+ }
+
+ if (coverFile.exists()) {
+ files.add(coverFile);
}
return files;
lastId = 0;
File[] dirs = baseDir.listFiles(new FileFilter() {
+ @Override
public boolean accept(File file) {
return file != null && file.isDirectory();
}
for (File dir : dirs) {
File[] infoFiles = dir.listFiles(new FileFilter() {
+ @Override
public boolean accept(File file) {
return file != null
&& file.getPath().toLowerCase()
pgDirs.addProgress(pgFiles, 100);
pgDirs.setName("Loading from: " + dir.getName());
+ String source = null;
for (File infoFile : infoFiles) {
pgFiles.setName(infoFile.getName());
try {
MetaData meta = InfoReader.readMeta(infoFile, false);
+ source = meta.getSource();
try {
int id = Integer.parseInt(meta.getLuid());
if (id > lastId) {
pgFiles.add(1);
}
+ File cover = new File(dir, ".cover.png");
+ if (cover.exists()) {
+ try {
+ InputStream in = new MarkableFileInputStream(
+ new FileInputStream(cover));
+ try {
+ sourceCovers.put(source, ImageUtils.fromStream(in));
+ } finally {
+ in.close();
+ }
+ } catch (IOException e) {
+ Instance.syserr(e);
+ }
+ }
+
pgFiles.setName(null);
}