X-Git-Url: http://git.nikiroo.be/?p=nikiroo-utils.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FLocalLibrary.java;h=5e0ad40097f8add91f78d73cf1cf61b3334c53e7;hp=ab5a82b58b48a51ed4b1abc085118e986184f4fd;hb=9fe3f17729759e933d7687cc2838f7255f2c9283;hpb=b89dfb6ece936486563734818ed62488a59e5897 diff --git a/src/be/nikiroo/fanfix/library/LocalLibrary.java b/src/be/nikiroo/fanfix/library/LocalLibrary.java index ab5a82b..5e0ad40 100644 --- a/src/be/nikiroo/fanfix/library/LocalLibrary.java +++ b/src/be/nikiroo/fanfix/library/LocalLibrary.java @@ -1,6 +1,5 @@ package be.nikiroo.fanfix.library; -import java.awt.image.BufferedImage; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; @@ -11,8 +10,6 @@ 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; @@ -22,7 +19,7 @@ import be.nikiroo.fanfix.output.BasicOutput.OutputType; 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; @@ -34,21 +31,54 @@ import be.nikiroo.utils.Progress; public class LocalLibrary extends BasicLibrary { private int lastId; private Map stories; // Files: [ infoFile, TargetFile ] - private Map sourceCovers; + private Map 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 use for non-image documents + * @param image + * 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 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 */ public LocalLibrary(File baseDir, OutputType text, OutputType image) { this.baseDir = baseDir; @@ -57,7 +87,7 @@ public class LocalLibrary extends BasicLibrary { this.lastId = 0; this.stories = null; - this.sourceCovers = new HashMap(); + this.sourceCovers = new HashMap(); baseDir.mkdirs(); } @@ -68,8 +98,8 @@ public class LocalLibrary extends BasicLibrary { } @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]; } @@ -78,7 +108,7 @@ public class LocalLibrary extends BasicLibrary { } @Override - public BufferedImage getCover(String luid) { + public Image getCover(String luid) { MetaData meta = getInfo(luid); if (meta != null) { File[] files = getStories(null).get(meta); @@ -89,7 +119,7 @@ public class LocalLibrary extends BasicLibrary { meta = InfoReader.readMeta(infoFile, true); return meta.getCover(); } catch (IOException e) { - Instance.syserr(e); + Instance.getTraceHandler().error(e); } } } @@ -98,9 +128,9 @@ public class LocalLibrary extends BasicLibrary { } @Override - protected void clearCache() { + protected synchronized void invalidateInfo(String luid) { stories = null; - sourceCovers = new HashMap(); + sourceCovers = new HashMap(); } @Override @@ -114,6 +144,7 @@ public class LocalLibrary extends BasicLibrary { for (File file : getRelatedFiles(luid)) { // TODO: throw an IOException if we cannot delete the files? IOUtils.deltree(file); + file.getParentFile().delete(); } } @@ -124,7 +155,7 @@ public class LocalLibrary extends BasicLibrary { 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; @@ -149,19 +180,21 @@ public class LocalLibrary extends BasicLibrary { "\\.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)); } @@ -174,9 +207,10 @@ public class LocalLibrary extends BasicLibrary { 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); } } @@ -190,13 +224,15 @@ public class LocalLibrary extends BasicLibrary { // 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 sources = otherLibrary.getRelatedFiles(luid); + List sources = otherLocalLibrary.getRelatedFiles(luid); if (!sources.isEmpty()) { pg.setMinMax(0, sources.size()); } @@ -205,6 +241,7 @@ public class LocalLibrary extends BasicLibrary { 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); @@ -225,13 +262,15 @@ public class LocalLibrary extends BasicLibrary { pg.add(1); } - clearCache(); + invalidateInfo(); pg.done(); return; } } super.imprt(other, luid, pg); + + invalidateInfo(); } /** @@ -293,14 +332,14 @@ public class LocalLibrary extends BasicLibrary { * 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); } /** @@ -345,7 +384,8 @@ public class LocalLibrary extends BasicLibrary { } 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, @@ -365,7 +405,7 @@ public class LocalLibrary extends BasicLibrary { * {@link LocalLibrary#baseDir}. *

* Will use a cached list when possible (see - * {@link BasicLibrary#clearCache()}). + * {@link BasicLibrary#invalidateInfo()}). * * @param pg * the optional {@link Progress} @@ -391,76 +431,101 @@ public class LocalLibrary extends BasicLibrary { } }); - Progress pgDirs = new Progress(0, 100 * dirs.length); - pg.addProgress(pgDirs, 100); + if (dirs != null) { + Progress pgDirs = new Progress(0, 100 * dirs.length); + pg.addProgress(pgDirs, 100); + + for (File dir : dirs) { + File[] infoFiles = dir.listFiles(new FileFilter() { + @Override + public boolean accept(File file) { + return file != null + && file.getPath().toLowerCase() + .endsWith(".info"); + } + }); - for (File dir : dirs) { - File[] infoFiles = dir.listFiles(new FileFilter() { - @Override - public boolean accept(File file) { - return file != null - && file.getPath().toLowerCase() - .endsWith(".info"); - } - }); - - Progress pgFiles = new Progress(0, infoFiles.length); - 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(); + Progress pgFiles = new Progress(0, infoFiles.length); + pgDirs.addProgress(pgFiles, 100); + pgDirs.setName("Loading from: " + dir.getName()); + + String source = null; + for (File infoFile : infoFiles) { + pgFiles.setName(infoFile.getName()); try { - int id = Integer.parseInt(meta.getLuid()); - if (id > lastId) { - lastId = id; - } + MetaData meta = InfoReader + .readMeta(infoFile, false); + source = meta.getSource(); + try { + int id = Integer.parseInt(meta.getLuid()); + if (id > lastId) { + lastId = id; + } - stories.put(meta, new File[] { infoFile, - getTargetFile(meta, infoFile) }); - } catch (Exception e) { - // not normal!! - throw new IOException( - "Cannot understand the LUID of " - + infoFile - + ": " - + (meta == null ? "[meta is NULL]" - : meta.getLuid()), e); + stories.put(meta, new File[] { infoFile, + getTargetFile(meta, infoFile) }); + } catch (Exception e) { + // not normal!! + throw new IOException( + "Cannot understand the LUID of " + + infoFile + + ": " + + (meta == null ? "[meta is NULL]" + : meta.getLuid()), e); + } + } catch (IOException e) { + // We should not have not-supported files in the + // library + Instance.getTraceHandler().error( + new IOException( + "Cannot load file from library: " + + infoFile, e)); } - } catch (IOException e) { - // We should not have not-supported files in the - // library - Instance.syserr(new IOException( - "Cannot load file from library: " + infoFile, e)); + pgFiles.add(1); } - pgFiles.add(1); - } - File cover = new File(dir, ".cover.png"); - if (cover.exists()) { - try { - InputStream in = new MarkableFileInputStream( - new FileInputStream(cover)); + File cover = new File(dir, ".cover.png"); + if (cover.exists()) { try { - sourceCovers.put(source, ImageUtils.fromStream(in)); - } finally { - in.close(); + InputStream in = new FileInputStream(cover); + try { + sourceCovers.put(source, new Image(in)); + } finally { + in.close(); + } + } catch (IOException e) { + Instance.getTraceHandler().error(e); } - } catch (IOException e) { - Instance.syserr(e); } + + pgFiles.setName(null); } - pgFiles.setName(null); + pgDirs.setName("Loading directories"); } - - pgDirs.setName("Loading directories"); } + pg.done(); 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); + } + } }