X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2FLibrary.java;h=03b584cf760849ec9fcaccc84529db806318ce87;hp=a120df1a09c850bab29338736b587ffac9a5767b;hb=92fb0719f84f5b6734b51e528332546d78e9ccec;hpb=fe999aa400c2627291325558f1ae8c734da7900c diff --git a/src/be/nikiroo/fanfix/Library.java b/src/be/nikiroo/fanfix/Library.java index a120df1..03b584c 100644 --- a/src/be/nikiroo/fanfix/Library.java +++ b/src/be/nikiroo/fanfix/Library.java @@ -9,13 +9,14 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import be.nikiroo.fanfix.bundles.Config; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.output.BasicOutput; import be.nikiroo.fanfix.output.BasicOutput.OutputType; import be.nikiroo.fanfix.supported.BasicSupport; +import be.nikiroo.utils.ui.Progress; import be.nikiroo.fanfix.supported.BasicSupport.SupportType; +import be.nikiroo.fanfix.supported.InfoReader; /** * Manage a library of Stories: import, export, list. @@ -29,21 +30,46 @@ public class Library { private File baseDir; private Map stories; private int lastId; + private OutputType text; + private OutputType image; /** * Create a new {@link Library} with the given backend directory. * * @param dir - * the directoy where to find the {@link Story} objects + * the directory where to find the {@link Story} objects + * @param text + * the {@link OutputType} to save the text-focused stories into + * @param image + * the {@link OutputType} to save the images-focused stories into */ - public Library(File dir) { + public Library(File dir, OutputType text, OutputType image) { this.baseDir = dir; this.stories = new HashMap(); this.lastId = 0; + this.text = text; + this.image = image; dir.mkdirs(); } + /** + * List all the known types of stories. + * + * @return the types + */ + public List getTypes() { + List list = new ArrayList(); + for (Entry entry : getStories().entrySet()) { + String storyType = entry.getValue().getParentFile().getName(); + if (!list.contains(storyType)) { + list.add(storyType); + } + } + + return list; + } + /** * List all the stories of the given source type in the {@link Library}, or * all the stories if NULL is passed as a type. @@ -53,13 +79,11 @@ public class Library { * * @return the stories */ - public List getList(SupportType type) { - String typeString = type == null ? null : type.getSourceName(); - + public List getList(String type) { List list = new ArrayList(); for (Entry entry : getStories().entrySet()) { String storyType = entry.getValue().getParentFile().getName(); - if (typeString == null || typeString.equalsIgnoreCase(storyType)) { + if (type == null || type.equalsIgnoreCase(storyType)) { list.add(entry.getKey()); } } @@ -68,14 +92,56 @@ public class Library { } /** - * Retrieve a specific {@link Story}. + * Retrieve a {@link File} corresponding to the given {@link Story}. * * @param luid * the Library UID of the story * * @return the corresponding {@link Story} */ - public Story getStory(String luid) { + public MetaData getInfo(String luid) { + if (luid != null) { + for (Entry entry : getStories().entrySet()) { + if (luid.equals(entry.getKey().getLuid())) { + return entry.getKey(); + } + } + } + + return null; + } + + /** + * Retrieve a {@link File} corresponding to the given {@link Story}. + * + * @param luid + * the Library UID of the story + * + * @return the corresponding {@link Story} + */ + public File getFile(String luid) { + if (luid != null) { + for (Entry entry : getStories().entrySet()) { + if (luid.equals(entry.getKey().getLuid())) { + return entry.getValue(); + } + } + } + + return null; + } + + /** + * Retrieve a specific {@link Story}. + * + * @param luid + * the Library UID of the story + * @param pg + * the optional progress reporter + * + * @return the corresponding {@link Story} or NULL if not found + */ + public Story getStory(String luid, Progress pg) { if (luid != null) { for (Entry entry : getStories().entrySet()) { if (luid.equals(entry.getKey().getLuid())) { @@ -84,7 +150,8 @@ public class Library { .getKey().getType()); URL url = entry.getValue().toURI().toURL(); if (type != null) { - return BasicSupport.getSupport(type).process(url); + return BasicSupport.getSupport(type).process(url, + pg); } else { throw new IOException("Unknown type: " + entry.getKey().getType()); @@ -100,6 +167,11 @@ public class Library { } } + if (pg != null) { + pg.setMinMax(0, 1); + pg.setProgress(1); + } + return null; } @@ -109,24 +181,21 @@ public class Library { * * @param url * the {@link URL} to import + * @param pg + * the optional progress reporter * * @return the imported {@link Story} * * @throws IOException * in case of I/O error */ - public Story imprt(URL url) throws IOException { + public Story imprt(URL url, Progress pg) throws IOException { BasicSupport support = BasicSupport.getSupport(url); if (support == null) { throw new IOException("URL not supported: " + url.toString()); } - getStories(); // refresh lastId - Story story = support.process(url); - story.getMeta().setLuid(String.format("%03d", (++lastId))); - save(story); - - return story; + return save(support.process(url, pg), null); } /** @@ -138,34 +207,69 @@ public class Library { * the {@link OutputType} to transform it to * @param target * the target to save to + * @param pg + * the optional progress reporter * * @return the saved resource (the main saved {@link File}) * * @throws IOException * in case of I/O error */ - public File export(String luid, OutputType type, String target) + public File export(String luid, OutputType type, String target, Progress pg) throws IOException { BasicOutput out = BasicOutput.getOutput(type, true); if (out == null) { throw new IOException("Output type not supported: " + type); } - return out.process(getStory(luid), target); + Story story = getStory(luid, pg); + if (story == null) { + throw new IOException("Cannot find story to export: " + luid); + } + + return out.process(story, target); } /** - * Save a story as-is to the {@link Library} -- the LUID must be - * correct. + * Save a {@link Story} to the {@link Library}. * * @param story * the {@link Story} to save * + * @return the same {@link Story}, whose LUID may have changed + * * @throws IOException * in case of I/O error */ - private void save(Story story) throws IOException { - MetaData key = story.getMeta(); + public Story save(Story story) throws IOException { + return save(story, null); + } + + /** + * Save a {@link Story} to the {@link Library} -- the LUID must be + * correct, or NULL to get the next free one. + * + * @param story + * the {@link Story} to save + * @param luid + * the correct LUID or NULL to get the next free one + * + * @return the same {@link Story}, whose LUID may have changed + * + * @throws IOException + * in case of I/O error + */ + public Story save(Story story, String luid) throws IOException { + // Do not change the original metadata, but change the original story + MetaData key = story.getMeta().clone(); + story.setMeta(key); + + if (luid == null || luid.isEmpty()) { + getStories(); // refresh lastId if needed + key.setLuid(String.format("%03d", (++lastId))); + } else { + key.setLuid(luid); + } getDir(key).mkdirs(); if (!getDir(key).exists()) { @@ -173,19 +277,17 @@ public class Library { } OutputType out; - SupportType in; if (key != null && key.isImageDocument()) { - in = SupportType.CBZ; - out = OutputType.CBZ; + out = image; } else { - in = SupportType.INFO_TEXT; - out = OutputType.INFO_TEXT; + out = text; } + BasicOutput it = BasicOutput.getOutput(out, true); File file = it.process(story, getFile(key).getPath()); - getStories().put( - BasicSupport.getSupport(in).processMeta(file.toURI().toURL()) - .getMeta(), file); + getStories().put(story.getMeta(), file); + + return story; } /** @@ -224,46 +326,39 @@ public class Library { private Map getStories() { if (stories.isEmpty()) { lastId = 0; - String format = "." - + Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER) - .toLowerCase(); + + String ext = ".info"; for (File dir : baseDir.listFiles()) { if (dir.isDirectory()) { for (File file : dir.listFiles()) { try { - String path = file.getPath().toLowerCase(); - if (!path.endsWith(".info") - && !path.endsWith(format)) { - // TODO: export .info reading to a class and use - // it here - SupportType type = SupportType.INFO_TEXT; - if (path.toLowerCase().endsWith(".cbz")) { - type = SupportType.CBZ; - } - BasicSupport support = BasicSupport - .getSupport(type); - MetaData meta = support.processMeta( - file.toURI().toURL()).getMeta(); - if (meta != null) { - stories.put(meta, file); - try { - int id = Integer.parseInt(meta - .getLuid()); - if (id > lastId) { - lastId = id; - } - } catch (Exception e) { - // not normal!! - Instance.syserr(new IOException( - "Cannot understand the LUID of " - + file.getPath() + ": " - + meta.getLuid(), e)); + if (file.getPath().toLowerCase().endsWith(ext)) { + MetaData meta = InfoReader.readMeta(file); + try { + int id = Integer.parseInt(meta.getLuid()); + if (id > lastId) { + lastId = id; } - } else { + + // Replace .info with whatever is needed: + String path = file.getPath(); + path = path.substring(0, path.length() + - ext.length()); + + String newExt = getOutputType(meta) + .getDefaultExtension(); + + file = new File(path + newExt); + // + + stories.put(meta, file); + + } catch (Exception e) { // not normal!! Instance.syserr(new IOException( - "Cannot get metadata for: " - + file.getPath())); + "Cannot understand the LUID of " + + file.getPath() + ": " + + meta.getLuid(), e)); } } } catch (IOException e) { @@ -280,4 +375,20 @@ public class Library { return stories; } + + /** + * Return the {@link OutputType} for this {@link Story}. + * + * @param meta + * the {@link Story} {@link MetaData} + * + * @return the type + */ + private OutputType getOutputType(MetaData meta) { + if (meta != null && meta.isImageDocument()) { + return image; + } else { + return text; + } + } }