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.fanfix.supported.BasicSupport.SupportType;
+import be.nikiroo.fanfix.supported.InfoReader;
/**
* Manage a library of Stories: import, export, list.
private File baseDir;
private Map<MetaData, File> 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<MetaData, File>();
this.lastId = 0;
+ this.text = text;
+ this.image = image;
dir.mkdirs();
}
+ /**
+ * List all the known types of stories.
+ *
+ * @return the types
+ */
+ public List<String> getTypes() {
+ List<String> list = new ArrayList<String>();
+ for (Entry<MetaData, File> 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.
*
* @return the stories
*/
- public List<MetaData> getList(SupportType type) {
- String typeString = type == null ? null : type.getSourceName();
-
+ public List<MetaData> getList(String type) {
List<MetaData> list = new ArrayList<MetaData>();
for (Entry<MetaData, File> 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());
}
}
}
/**
- * 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 MetaData getInfo(String luid) {
+ if (luid != null) {
+ for (Entry<MetaData, File> 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<MetaData, File> 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
+ *
+ * @return the corresponding {@link Story} or NULL if not found
+ */
public Story getStory(String luid) {
if (luid != null) {
for (Entry<MetaData, File> entry : getStories().entrySet()) {
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), null);
}
/**
throw new IOException("Output type not supported: " + type);
}
+ Story story = getStory(luid);
+ if (story == null) {
+ throw new IOException("Cannot find story to export: " + luid);
+ }
+
return out.process(getStory(luid), target);
}
/**
- * Save a story as-is to the {@link Library} -- the LUID <b>must</b> 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
+ */
+ public Story save(Story story) throws IOException {
+ return save(story, null);
+ }
+
+ /**
+ * Save a {@link Story} to the {@link Library} -- the LUID <b>must</b> be
+ * correct, or NULL to get the next free one.
*
* @param story
* the {@link Story} to save
+ * @param luid
+ * the <b>correct</b> 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
*/
- private void save(Story story) throws IOException {
- MetaData key = story.getMeta();
+ private 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()) {
}
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;
}
/**
private Map<MetaData, File> 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) {
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;
+ }
+ }
}