X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FLocalLibrary.java;h=11c36630adcef96ea73d17c8712d84495260299a;hb=085a2f9a3a811a910de7c3011eb6f5ef2ab18aa0;hp=e4dc5e98bce53547c4c7d5ad2cee833e0e95bee0;hpb=e42573a004fac26378c693ce9ef0d6319713c682;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/library/LocalLibrary.java b/src/be/nikiroo/fanfix/library/LocalLibrary.java index e4dc5e9..11c3663 100644 --- a/src/be/nikiroo/fanfix/library/LocalLibrary.java +++ b/src/be/nikiroo/fanfix/library/LocalLibrary.java @@ -3,12 +3,16 @@ package be.nikiroo.fanfix.library; 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; @@ -18,6 +22,8 @@ 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.MarkableFileInputStream; import be.nikiroo.utils.Progress; /** @@ -28,20 +34,54 @@ import be.nikiroo.utils.Progress; public class LocalLibrary extends BasicLibrary { private int lastId; private Map stories; // Files: [ infoFile, TargetFile ] + 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; @@ -50,6 +90,7 @@ public class LocalLibrary extends BasicLibrary { this.lastId = 0; this.stories = null; + this.sourceCovers = new HashMap(); baseDir.mkdirs(); } @@ -60,8 +101,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]; } @@ -92,10 +133,12 @@ public class LocalLibrary extends BasicLibrary { @Override protected void clearCache() { stories = null; + sourceCovers = new HashMap(); } @Override protected synchronized int getNextId() { + getStories(null); // make sure lastId is set return ++lastId; } @@ -150,6 +193,85 @@ public class LocalLibrary extends BasicLibrary { 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 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 = otherLocalLibrary.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)) { + target.getParentFile().mkdirs(); + 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); + + clearCache(); + } + /** * Return the {@link OutputType} for this {@link Story}. * @@ -161,9 +283,9 @@ public class LocalLibrary extends BasicLibrary { private OutputType getOutputType(MetaData meta) { if (meta != null && meta.isImageDocument()) { return image; - } else { - return text; } + + return text; } /** @@ -209,14 +331,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); } /** @@ -238,39 +360,39 @@ public class LocalLibrary extends BasicLibrary { 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; @@ -301,6 +423,7 @@ public class LocalLibrary extends BasicLibrary { lastId = 0; File[] dirs = baseDir.listFiles(new FileFilter() { + @Override public boolean accept(File file) { return file != null && file.isDirectory(); } @@ -311,6 +434,7 @@ public class LocalLibrary extends BasicLibrary { for (File dir : dirs) { File[] infoFiles = dir.listFiles(new FileFilter() { + @Override public boolean accept(File file) { return file != null && file.getPath().toLowerCase() @@ -322,10 +446,12 @@ public class LocalLibrary extends BasicLibrary { 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) { @@ -352,6 +478,21 @@ public class LocalLibrary extends BasicLibrary { 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); } @@ -360,4 +501,23 @@ public class LocalLibrary extends BasicLibrary { 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, BufferedImage coverImage) { + sourceCovers.put(source, coverImage); + 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); + } + } }