X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FLocalLibrary.java;h=1752dc7f3e253e57586fdc0e675d380700bc31ee;hp=e9c67f3866d41bca6487b36b2e5db20be163dc97;hb=3989dfc5ced262e3c8d07fc796ec06ce5513c6b8;hpb=116904b8f8386091f978c0c678343c2f1cc80356 diff --git a/src/be/nikiroo/fanfix/library/LocalLibrary.java b/src/be/nikiroo/fanfix/library/LocalLibrary.java index e9c67f3..1752dc7 100644 --- a/src/be/nikiroo/fanfix/library/LocalLibrary.java +++ b/src/be/nikiroo/fanfix/library/LocalLibrary.java @@ -22,6 +22,7 @@ import be.nikiroo.fanfix.supported.InfoReader; import be.nikiroo.utils.IOUtils; import be.nikiroo.utils.Image; import be.nikiroo.utils.Progress; +import be.nikiroo.utils.StringUtils; /** * This {@link BasicLibrary} will store the stories locally on disk. @@ -32,6 +33,7 @@ public class LocalLibrary extends BasicLibrary { private int lastId; private Map stories; // Files: [ infoFile, TargetFile ] private Map sourceCovers; + private Map authorCovers; private File baseDir; private OutputType text; @@ -251,13 +253,43 @@ public class LocalLibrary extends BasicLibrary { return sourceCovers.get(source); } + @Override + public synchronized Image getCustomAuthorCover(String author) { + File cover = getAuthorCoverFile(author); + if (cover.exists()) { + InputStream in; + try { + in = new FileInputStream(cover); + try { + authorCovers.put(author, new Image(in)); + } finally { + in.close(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + Instance.getTraceHandler().error( + new IOException( + "Cannot load the existing custom author cover: " + + cover, e)); + } + } + + return authorCovers.get(author); + } + @Override public void setSourceCover(String source, String luid) { setSourceCover(source, getCover(luid)); } + @Override + public void setAuthorCover(String author, String luid) { + setAuthorCover(author, getCover(luid)); + } + /** - * Fix the source cover to the given story cover. + * Set the source cover to the given story cover. * * @param source * the source to change @@ -278,6 +310,27 @@ public class LocalLibrary extends BasicLibrary { } } + /** + * Set the author cover to the given story cover. + * + * @param author + * the author to change + * @param coverImage + * the cover image + */ + synchronized void setAuthorCover(String author, Image coverImage) { + File cover = getAuthorCoverFile(author); + cover.getParentFile().mkdirs(); + try { + Instance.getCache().saveAsImage(coverImage, cover, true); + if (authorCovers != null) { + authorCovers.put(author, coverImage); + } + } catch (IOException e) { + Instance.getTraceHandler().error(e); + } + } + @Override public void imprt(BasicLibrary other, String luid, Progress pg) throws IOException { @@ -387,6 +440,9 @@ public class LocalLibrary extends BasicLibrary { title = ""; } title = title.replaceAll("[^a-zA-Z0-9._+-]", "_"); + if (title.length() > 40) { + title = title.substring(0, 40); + } return new File(getExpectedDir(key.getSource()), key.getLuid() + "_" + title); } @@ -403,7 +459,8 @@ public class LocalLibrary extends BasicLibrary { private File getExpectedDir(String source) { String sanitizedSource = source.replaceAll("[^a-zA-Z0-9._+/-]", "_"); - while (sanitizedSource.startsWith("/")) { + while (sanitizedSource.startsWith("/") + || sanitizedSource.startsWith("_")) { if (sanitizedSource.length() > 1) { sanitizedSource = sanitizedSource.substring(1); } else { @@ -414,12 +471,30 @@ public class LocalLibrary extends BasicLibrary { sanitizedSource = sanitizedSource.replace("/", File.separator); if (sanitizedSource.isEmpty()) { - sanitizedSource = "EMPTY"; + sanitizedSource = "_EMPTY"; } return new File(baseDir, sanitizedSource); } + /** + * Return the full path to the file to use for the custom cover of this + * author. + *

+ * One or more of the parent directories MAY not exist. + * + * @param author + * the author + * + * @return the custom cover file + */ + private File getAuthorCoverFile(String author) { + File aDir = new File(baseDir, "_AUTHORS"); + String hash = StringUtils.getMd5Hash(author); + String ext = Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER); + return new File(aDir, hash + "." + ext.toLowerCase()); + } + /** * Return the list of files/directories on disk for this {@link Story}. *