X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FLocalLibrary.java;h=e9c67f3866d41bca6487b36b2e5db20be163dc97;hb=3a0605e6a05e6d9dee6b596d5f9b193408470164;hp=838c97cf3e8b55363ab4683b07596c6857b74ac0;hpb=9b863b20370118c95c6801b73dda951c7e507871;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/library/LocalLibrary.java b/src/be/nikiroo/fanfix/library/LocalLibrary.java index 838c97c..e9c67f3 100644 --- a/src/be/nikiroo/fanfix/library/LocalLibrary.java +++ b/src/be/nikiroo/fanfix/library/LocalLibrary.java @@ -3,6 +3,7 @@ package be.nikiroo.fanfix.library; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -122,6 +123,10 @@ public class LocalLibrary extends BasicLibrary { public Image getCover(String luid) { MetaData meta = getInfo(luid); if (meta != null) { + if (meta.getCover() != null) { + return meta.getCover(); + } + File[] files = getStories(null).get(meta); if (files != null) { File infoFile = files[0]; @@ -140,11 +145,11 @@ public class LocalLibrary extends BasicLibrary { @Override protected synchronized void updateInfo(MetaData meta) { - deleteInfo(); + invalidateInfo(); } @Override - protected void deleteInfo(String luid) { + protected void invalidateInfo(String luid) { stories = null; sourceCovers = null; } @@ -182,7 +187,7 @@ public class LocalLibrary extends BasicLibrary { throws IOException { File newDir = getExpectedDir(meta.getSource()); if (!newDir.exists()) { - newDir.mkdir(); + newDir.mkdirs(); } List relatedFiles = getRelatedFiles(meta.getLuid()); @@ -194,8 +199,8 @@ public class LocalLibrary extends BasicLibrary { try { String name = relatedFile.getName().replaceFirst( "\\.info$", ""); - InfoCover.writeInfo(newDir, name, meta); relatedFile.delete(); + InfoCover.writeInfo(newDir, name, meta); relatedFile.getParentFile().delete(); } catch (IOException e) { Instance.getTraceHandler().error(e); @@ -206,17 +211,41 @@ public class LocalLibrary extends BasicLibrary { } } - deleteInfo(); + invalidateInfo(); } @Override - public Image getSourceCover(String source) { + public synchronized Image getCustomSourceCover(String source) { if (sourceCovers == null) { - getStories(null); + sourceCovers = new HashMap(); } - if (!sourceCovers.containsKey(source)) { - sourceCovers.put(source, super.getSourceCover(source)); + Image img = sourceCovers.get(source); + if (img != null) { + return img; + } + + File coverDir = getExpectedDir(source); + if (coverDir.isDirectory()) { + File cover = new File(coverDir, ".cover.png"); + if (cover.exists()) { + InputStream in; + try { + in = new FileInputStream(cover); + try { + sourceCovers.put(source, new Image(in)); + } finally { + in.close(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + Instance.getTraceHandler().error( + new IOException( + "Cannot load the existing custom source cover: " + + cover, e)); + } + } } return sourceCovers.get(source); @@ -224,18 +253,28 @@ public class LocalLibrary extends BasicLibrary { @Override public void setSourceCover(String source, String luid) { - if (sourceCovers == null) { - getStories(null); - } + setSourceCover(source, getCover(luid)); + } - sourceCovers.put(source, getCover(luid)); - File cover = new File(getExpectedDir(source), ".cover"); + /** + * Fix the source cover to the given story cover. + * + * @param source + * the source to change + * @param coverImage + * the cover image + */ + synchronized void setSourceCover(String source, Image coverImage) { + File dir = getExpectedDir(source); + dir.mkdirs(); + File cover = new File(dir, ".cover"); try { - Instance.getCache().saveAsImage(sourceCovers.get(source), cover, - true); + Instance.getCache().saveAsImage(coverImage, cover, true); + if (sourceCovers != null) { + sourceCovers.put(source, coverImage); + } } catch (IOException e) { Instance.getTraceHandler().error(e); - sourceCovers.remove(source); } } @@ -256,19 +295,21 @@ public class LocalLibrary extends BasicLibrary { 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()); + List relatedFiles = otherLocalLibrary + .getRelatedFiles(luid); + if (!relatedFiles.isEmpty()) { + pg.setMinMax(0, relatedFiles.size()); } - for (File source : sources) { - File target = new File(source.getAbsolutePath().replace( - from.getAbsolutePath(), to.getAbsolutePath())); - if (!source.equals(target)) { + for (File relatedFile : relatedFiles) { + File target = new File(relatedFile.getAbsolutePath() + .replace(from.getAbsolutePath(), + to.getAbsolutePath())); + if (!relatedFile.equals(target)) { target.getParentFile().mkdirs(); InputStream in = null; try { - in = new FileInputStream(source); + in = new FileInputStream(relatedFile); IOUtils.write(in, target); } catch (IOException e) { if (in != null) { @@ -286,7 +327,7 @@ public class LocalLibrary extends BasicLibrary { pg.add(1); } - deleteInfo(); + invalidateInfo(); pg.done(); return; } @@ -360,7 +401,22 @@ public class LocalLibrary extends BasicLibrary { * @return the target directory */ private File getExpectedDir(String source) { - String sanitizedSource = source.replaceAll("[^a-zA-Z0-9._+-]", "_"); + String sanitizedSource = source.replaceAll("[^a-zA-Z0-9._+/-]", "_"); + + while (sanitizedSource.startsWith("/")) { + if (sanitizedSource.length() > 1) { + sanitizedSource = sanitizedSource.substring(1); + } else { + sanitizedSource = ""; + } + } + + sanitizedSource = sanitizedSource.replace("/", File.separator); + + if (sanitizedSource.isEmpty()) { + sanitizedSource = "EMPTY"; + } + return new File(baseDir, sanitizedSource); } @@ -427,7 +483,7 @@ public class LocalLibrary extends BasicLibrary { * {@link LocalLibrary#baseDir}. *

* Will use a cached list when possible (see - * {@link BasicLibrary#deleteInfo()}). + * {@link BasicLibrary#invalidateInfo()}). * * @param pg * the optional {@link Progress} @@ -444,7 +500,6 @@ public class LocalLibrary extends BasicLibrary { if (stories == null) { stories = new HashMap(); - sourceCovers = new HashMap(); lastId = 0; @@ -460,65 +515,11 @@ public class LocalLibrary extends BasicLibrary { 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"); - } - }); - - Progress pgFiles = new Progress(0, infoFiles.length); + Progress pgFiles = new Progress(); 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) { - 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.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)); - } - pgFiles.add(1); - } - - File cover = new File(dir, ".cover.png"); - if (cover.exists()) { - try { - InputStream in = new FileInputStream(cover); - try { - sourceCovers.put(source, new Image(in)); - } finally { - in.close(); - } - } catch (IOException e) { - Instance.getTraceHandler().error(e); - } - } + addToStories(pgFiles, dir); pgFiles.setName(null); } @@ -531,27 +532,57 @@ 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, Image coverImage) { - if (sourceCovers == null) { - getStories(null); + private void addToStories(Progress pgFiles, File dir) { + File[] infoFilesAndSubdirs = dir.listFiles(new FileFilter() { + @Override + public boolean accept(File file) { + boolean info = file != null && file.isFile() + && file.getPath().toLowerCase().endsWith(".info"); + boolean dir = file != null && file.isDirectory(); + return info || dir; + } + }); + + if (pgFiles != null) { + pgFiles.setMinMax(0, infoFilesAndSubdirs.length); } - sourceCovers.put(source, coverImage); - File cover = new File(getExpectedDir(source), ".cover"); - try { - Instance.getCache().saveAsImage(sourceCovers.get(source), cover, - true); - } catch (IOException e) { - Instance.getTraceHandler().error(e); - sourceCovers.remove(source); + for (File infoFileOrSubdir : infoFilesAndSubdirs) { + if (pgFiles != null) { + pgFiles.setName(infoFileOrSubdir.getName()); + } + + if (infoFileOrSubdir.isDirectory()) { + addToStories(null, infoFileOrSubdir); + } else { + try { + MetaData meta = InfoReader + .readMeta(infoFileOrSubdir, false); + try { + int id = Integer.parseInt(meta.getLuid()); + if (id > lastId) { + lastId = id; + } + + stories.put(meta, new File[] { infoFileOrSubdir, + getTargetFile(meta, infoFileOrSubdir) }); + } catch (Exception e) { + // not normal!! + throw new IOException("Cannot understand the LUID of " + + infoFileOrSubdir + ": " + 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: " + + infoFileOrSubdir, e)); + } + } + + if (pgFiles != null) { + pgFiles.add(1); + } } } }