package be.nikiroo.fanfix.library;
-import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
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.Image;
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 Map<String, Image> sourceCovers;
private File baseDir;
private OutputType text;
private OutputType image;
+ /**
+ * Create a new {@link LocalLibrary} with the given back-end directory.
+ *
+ * @param baseDir
+ * the directory where to find the {@link Story} objects
+ */
+ public LocalLibrary(File baseDir) {
+ this(baseDir, Instance.getConfig().getString(
+ Config.NON_IMAGES_DOCUMENT_TYPE), Instance.getConfig()
+ .getString(Config.IMAGES_DOCUMENT_TYPE), false);
+ }
+
/**
* Create a new {@link LocalLibrary} with the given back-end directory.
*
* @param baseDir
* the directory where to find the {@link Story} objects
* @param text
- * the {@link OutputType} to save the text-focused stories into
+ * the {@link OutputType} to use for non-image documents
* @param image
- * the {@link OutputType} to save the images-focused stories into
+ * the {@link OutputType} to use for image documents
+ * @param defaultIsHtml
+ * if the given text or image is invalid, use HTML by default (if
+ * not, it will be INFO_TEXT/CBZ by default)
+ */
+ public LocalLibrary(File baseDir, String text, String image,
+ boolean defaultIsHtml) {
+ this(baseDir, OutputType.valueOfAllOkUC(text,
+ defaultIsHtml ? OutputType.HTML : OutputType.INFO_TEXT),
+ OutputType.valueOfAllOkUC(image,
+ defaultIsHtml ? OutputType.HTML : OutputType.CBZ));
+ }
+
+ /**
+ * Create a new {@link LocalLibrary} with the given back-end directory.
+ *
+ * @param baseDir
+ * the directory where to find the {@link Story} objects
+ * @param text
+ * the {@link OutputType} to use for non-image documents
+ * @param image
+ * the {@link OutputType} to use for image documents
*/
public LocalLibrary(File baseDir, OutputType text, OutputType image) {
this.baseDir = baseDir;
this.lastId = 0;
this.stories = null;
- this.sourceCovers = new HashMap<String, BufferedImage>();
+ this.sourceCovers = new HashMap<String, Image>();
baseDir.mkdirs();
}
}
@Override
- public File getFile(String luid) {
- File[] files = getStories(null).get(getInfo(luid));
+ public File getFile(String luid, Progress pg) {
+ File[] files = getStories(pg).get(getInfo(luid));
if (files != null) {
return files[1];
}
}
@Override
- public BufferedImage getCover(String luid) {
+ public Image getCover(String luid) {
MetaData meta = getInfo(luid);
if (meta != null) {
File[] files = getStories(null).get(meta);
meta = InfoReader.readMeta(infoFile, true);
return meta.getCover();
} catch (IOException e) {
- Instance.syserr(e);
+ Instance.getTraceHandler().error(e);
}
}
}
}
@Override
- protected void clearCache() {
+ protected void invalidateInfo(String luid) {
stories = null;
- sourceCovers = new HashMap<String, BufferedImage>();
+ sourceCovers = new HashMap<String, Image>();
}
@Override
for (File file : getRelatedFiles(luid)) {
// TODO: throw an IOException if we cannot delete the files?
IOUtils.deltree(file);
+ file.getParentFile().delete();
}
}
File expectedTarget = getExpectedFile(meta);
expectedTarget.getParentFile().mkdirs();
- BasicOutput it = BasicOutput.getOutput(getOutputType(meta), true);
+ BasicOutput it = BasicOutput.getOutput(getOutputType(meta), true, true);
it.process(story, expectedTarget.getPath(), pg);
return story;
"\\.info$", "");
InfoCover.writeInfo(newDir, name, meta);
relatedFile.delete();
+ relatedFile.getParentFile().delete();
} catch (IOException e) {
- Instance.syserr(e);
+ Instance.getTraceHandler().error(e);
}
} else {
relatedFile.renameTo(new File(newDir, relatedFile.getName()));
+ relatedFile.getParentFile().delete();
}
}
- clearCache();
+ invalidateInfo();
}
@Override
- public BufferedImage getSourceCover(String source) {
+ public Image getSourceCover(String source) {
if (!sourceCovers.containsKey(source)) {
sourceCovers.put(source, super.getSourceCover(source));
}
sourceCovers.put(source, getCover(luid));
File cover = new File(getExpectedDir(source), ".cover.png");
try {
- ImageIO.write(sourceCovers.get(source), "png", cover);
+ Instance.getCache().saveAsImage(sourceCovers.get(source), cover,
+ true);
} catch (IOException e) {
- Instance.syserr(e);
+ Instance.getTraceHandler().error(e);
sourceCovers.remove(source);
}
}
// 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());
+ LocalLibrary otherLocalLibrary = (LocalLibrary) other;
+
+ MetaData meta = otherLocalLibrary.getInfo(luid);
+ String expectedType = ""
+ + (meta != null && meta.isImageDocument() ? image : text);
+ if (meta != null && meta.getType().equals(expectedType)) {
+ File from = otherLocalLibrary.getExpectedDir(meta.getSource());
File to = this.getExpectedDir(meta.getSource());
- List<File> sources = otherLibrary.getRelatedFiles(luid);
+ List<File> sources = otherLocalLibrary.getRelatedFiles(luid);
if (!sources.isEmpty()) {
pg.setMinMax(0, sources.size());
}
File target = new File(source.getAbsolutePath().replace(
from.getAbsolutePath(), to.getAbsolutePath()));
if (!source.equals(target)) {
+ target.getParentFile().mkdirs();
InputStream in = null;
try {
in = new FileInputStream(source);
pg.add(1);
}
- clearCache();
+ invalidateInfo();
pg.done();
return;
}
}
super.imprt(other, luid, pg);
+
+ invalidateInfo();
}
/**
* The directory (full path) where the new {@link Story} related to this
* {@link MetaData} should be located on disk.
*
- * @param type
+ * @param source
* the type (source)
*
* @return the target directory
*/
- private File getExpectedDir(String type) {
- String source = type.replaceAll("[^a-zA-Z0-9._+-]", "_");
- return new File(baseDir, source);
+ private File getExpectedDir(String source) {
+ String sanitizedSource = source.replaceAll("[^a-zA-Z0-9._+-]", "_");
+ return new File(baseDir, sanitizedSource);
}
/**
}
String coverExt = "."
- + Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER);
+ + Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER)
+ .toLowerCase();
File coverFile = new File(path + coverExt);
if (!coverFile.exists()) {
coverFile = new File(path.substring(0,
* {@link LocalLibrary#baseDir}.
* <p>
* Will use a cached list when possible (see
- * {@link BasicLibrary#clearCache()}).
+ * {@link BasicLibrary#invalidateInfo()}).
*
* @param pg
* the optional {@link Progress}
} catch (IOException e) {
// We should not have not-supported files in the
// library
- Instance.syserr(new IOException(
- "Cannot load file from library: " + infoFile, e));
+ Instance.getTraceHandler().error(
+ new IOException(
+ "Cannot load file from library: "
+ + infoFile, e));
}
pgFiles.add(1);
}
File cover = new File(dir, ".cover.png");
if (cover.exists()) {
try {
- InputStream in = new MarkableFileInputStream(
- new FileInputStream(cover));
+ InputStream in = new FileInputStream(cover);
try {
- sourceCovers.put(source, ImageUtils.fromStream(in));
+ sourceCovers.put(source, new Image(in));
} finally {
in.close();
}
} catch (IOException e) {
- Instance.syserr(e);
+ Instance.getTraceHandler().error(e);
}
}
return stories;
}
+
+ /**
+ * Fix the source cover to the given story cover.
+ *
+ * @param source
+ * the source to change
+ * @param coverImage
+ * the cover image
+ */
+ void setSourceCover(String source, Image coverImage) {
+ sourceCovers.put(source, coverImage);
+ File cover = new File(getExpectedDir(source), ".cover.png");
+ try {
+ Instance.getCache().saveAsImage(sourceCovers.get(source), cover,
+ true);
+ } catch (IOException e) {
+ Instance.getTraceHandler().error(e);
+ sourceCovers.remove(source);
+ }
+ }
}