X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2FMain.java;h=9ac48845ce87d4bc57416bfd2daf7e7f30fa4364;hb=211f7ddb50f68aa8a999023ef6d63d5756bdace6;hp=10bccec650d7e4f9f33073502f553860e5f4229a;hpb=d011400048cae6884f0d94c320498429b45fb48a;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/Main.java b/src/be/nikiroo/fanfix/Main.java index 10bccec..9ac4884 100644 --- a/src/be/nikiroo/fanfix/Main.java +++ b/src/be/nikiroo/fanfix/Main.java @@ -8,12 +8,19 @@ import java.net.URL; import be.nikiroo.fanfix.bundles.StringId; import be.nikiroo.fanfix.data.Chapter; import be.nikiroo.fanfix.data.Story; +import be.nikiroo.fanfix.library.LocalLibrary; +import be.nikiroo.fanfix.library.RemoteLibrary; +import be.nikiroo.fanfix.library.RemoteLibraryServer; import be.nikiroo.fanfix.output.BasicOutput; import be.nikiroo.fanfix.output.BasicOutput.OutputType; import be.nikiroo.fanfix.reader.BasicReader; -import be.nikiroo.fanfix.reader.BasicReader.ReaderType; +import be.nikiroo.fanfix.reader.Reader; +import be.nikiroo.fanfix.reader.Reader.ReaderType; import be.nikiroo.fanfix.supported.BasicSupport; import be.nikiroo.fanfix.supported.BasicSupport.SupportType; +import be.nikiroo.utils.Progress; +import be.nikiroo.utils.Version; +import be.nikiroo.utils.serial.Server; /** * Main program entry point. @@ -22,7 +29,7 @@ import be.nikiroo.fanfix.supported.BasicSupport.SupportType; */ public class Main { private enum MainAction { - IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER + IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER, START, VERSION, SERVER, REMOTE, } /** @@ -33,8 +40,8 @@ public class Main { *
  • NOUTF: if set to 1 or 'true', the program will prefer non-unicode * {@link String}s when possible
  • *
  • CONFIG_DIR: a path where to look for the .properties files - * before taking the included ones; they will also be saved/updated into - * this path when the program starts
  • + * before taking the usual ones; they will also be saved/updated into this + * path when the program starts *
  • DEBUG: if set to 1 or 'true', the program will override the DEBUG_ERR * configuration value with 'true'
  • * @@ -46,11 +53,14 @@ public class Main { * target *
  • --read [id] ([chapter number]): read the given story from the library *
  • - *
  • --read-url [URL] ([cahpter number]): convert on the fly and read the + *
  • --read-url [URL] ([chapter number]): convert on the fly and read the * story, without saving it
  • - *
  • --list: list the stories present in the library
  • - *
  • --set-reader [reader type]: set the reader type to CLI or LOCAL for - * this command
  • + *
  • --list ([type]): list the stories present in the library
  • + *
  • --set-reader [reader type]: set the reader type to CLI, TUI or LOCAL + * for this command
  • + *
  • --version: get the version of the program
  • + *
  • --server [port]: start a server on this port
  • + *
  • --remote [host] [port]: use a the given remote library
  • * * * @param args @@ -59,12 +69,13 @@ public class Main { public static void main(String[] args) { String urlString = null; String luid = null; - String typeString = null; + String sourceString = null; String chapString = null; String target = null; - String readerTypeString = null; - MainAction action = null; + MainAction action = MainAction.START; Boolean plusInfo = null; + String host = null; + Integer port = null; boolean noMoreActions = false; @@ -99,8 +110,8 @@ public class Main { case EXPORT: if (luid == null) { luid = args[i]; - } else if (typeString == null) { - typeString = args[i]; + } else if (sourceString == null) { + sourceString = args[i]; } else if (target == null) { target = args[i]; } else { @@ -110,8 +121,8 @@ public class Main { case CONVERT: if (urlString == null) { urlString = args[i]; - } else if (typeString == null) { - typeString = args[i]; + } else if (sourceString == null) { + sourceString = args[i]; } else if (target == null) { target = args[i]; } else if (plusInfo == null) { @@ -125,8 +136,8 @@ public class Main { } break; case LIST: - if (typeString == null) { - typeString = args[i]; + if (sourceString == null) { + sourceString = args[i]; } else { exitCode = 255; } @@ -153,8 +164,30 @@ public class Main { exitCode = 255; break; case SET_READER: - if (readerTypeString == null) { - readerTypeString = args[i]; + exitCode = setReaderType(args[i]); + action = MainAction.START; + break; + case START: + exitCode = 255; // not supposed to be selected by user + break; + case VERSION: + exitCode = 255; // no arguments for this option + break; + case SERVER: + if (port == null) { + port = Integer.parseInt(args[i]); + } else { + exitCode = 255; + } + break; + case REMOTE: + if (host == null) { + host = args[i]; + } else if (port == null) { + port = Integer.parseInt(args[i]); + BasicReader + .setDefaultLibrary(new RemoteLibrary(host, port)); + action = MainAction.START; } else { exitCode = 255; } @@ -162,20 +195,65 @@ public class Main { } } + final Progress mainProgress = new Progress(0, 80); + mainProgress.addProgressListener(new Progress.ProgressListener() { + private int current = mainProgress.getMin(); + + @Override + public void progress(Progress progress, String name) { + int diff = progress.getProgress() - current; + current += diff; + + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < diff; i++) { + builder.append('.'); + } + + System.err.print(builder.toString()); + + if (progress.isDone()) { + System.err.println(""); + } + } + }); + Progress pg = new Progress(); + mainProgress.addProgress(pg, mainProgress.getMax()); + + VersionCheck updates = VersionCheck.check(); + if (updates.isNewVersionAvailable()) { + // Sent to syserr so not to cause problem if one tries to capture a + // story content in text mode + System.err + .println("A new version of the program is available at https://github.com/nikiroo/fanfix/releases"); + System.err.println(""); + for (Version v : updates.getNewer()) { + System.err.println("\tVersion " + v); + System.err.println("\t-------------"); + System.err.println(""); + for (String item : updates.getChanges().get(v)) { + System.err.println("\t- " + item); + } + System.err.println(""); + } + } + if (exitCode != 255) { switch (action) { case IMPORT: - exitCode = imprt(urlString); + exitCode = imprt(urlString, pg); + updates.ok(); // we consider it read break; case EXPORT: - exitCode = export(urlString, typeString, target); + exitCode = export(luid, sourceString, target, pg); + updates.ok(); // we consider it read break; case CONVERT: - exitCode = convert(urlString, typeString, target, - plusInfo == null ? false : plusInfo); + exitCode = convert(urlString, sourceString, target, + plusInfo == null ? false : plusInfo, pg); + updates.ok(); // we consider it read break; case LIST: - exitCode = list(typeString); + exitCode = list(sourceString); break; case READ: exitCode = read(luid, chapString, true); @@ -188,7 +266,34 @@ public class Main { exitCode = 0; break; case SET_READER: - exitCode = setReaderType(readerTypeString); + exitCode = 255; + break; + case VERSION: + System.out + .println(String.format("Fanfix version %s" + + "\nhttps://github.com/nikiroo/fanfix/" + + "\n\tWritten by Nikiroo", + Version.getCurrentVersion())); + updates.ok(); // we consider it read + break; + case START: + BasicReader.getReader().browse(null); + break; + case SERVER: + if (port == null) { + exitCode = 255; + break; + } + try { + Server server = new RemoteLibraryServer(port); + server.start(); + System.out.println("Remote server started on: " + port); + } catch (IOException e) { + Instance.syserr(e); + } + return; + case REMOTE: + exitCode = 255; break; } } @@ -203,44 +308,19 @@ public class Main { } /** - * Return an {@link URL} from this {@link String}, be it a file path or an - * actual {@link URL}. - * - * @param sourceString - * the source - * - * @return the corresponding {@link URL} - * - * @throws MalformedURLException - * if this is neither a file nor a conventional {@link URL} - */ - private static URL getUrl(String sourceString) throws MalformedURLException { - if (sourceString == null || sourceString.isEmpty()) { - throw new MalformedURLException("Empty url"); - } - - URL source = null; - try { - source = new URL(sourceString); - } catch (MalformedURLException e) { - File sourceFile = new File(sourceString); - source = sourceFile.toURI().toURL(); - } - - return source; - } - - /** - * Import the given resource into the {@link Library}. + * Import the given resource into the {@link LocalLibrary}. * * @param urlString * the resource to import + * @param pg + * the optional progress reporter * * @return the exit return code (0 = success) */ - private static int imprt(String urlString) { + public static int imprt(String urlString, Progress pg) { try { - Story story = Instance.getLibrary().imprt(getUrl(urlString)); + Story story = Instance.getLibrary().imprt( + BasicReader.getUrl(urlString), pg); System.out.println(story.getMeta().getLuid() + ": \"" + story.getMeta().getTitle() + "\" imported."); } catch (IOException e) { @@ -252,18 +332,22 @@ public class Main { } /** - * Export the {@link Story} from the {@link Library} to the given target. + * Export the {@link Story} from the {@link LocalLibrary} to the given + * target. * - * @param urlString + * @param luid * the story LUID * @param typeString * the {@link OutputType} to use * @param target * the target + * @param pg + * the optional progress reporter * * @return the exit return code (0 = success) */ - private static int export(String urlString, String typeString, String target) { + public static int export(String luid, String typeString, String target, + Progress pg) { OutputType type = OutputType.valueOfNullOkUC(typeString); if (type == null) { Instance.syserr(new Exception(trans(StringId.OUTPUT_DESC, @@ -272,9 +356,7 @@ public class Main { } try { - Story story = Instance.getLibrary().imprt(new URL(urlString)); - Instance.getLibrary().export(story.getMeta().getLuid(), type, - target); + Instance.getLibrary().export(luid, type, target, pg); } catch (IOException e) { Instance.syserr(e); return 4; @@ -284,27 +366,17 @@ public class Main { } /** - * List the stories of the given type from the {@link Library} (unless NULL - * is passed, in which case all stories will be listed). + * List the stories of the given source from the {@link LocalLibrary} + * (unless NULL is passed, in which case all stories will be listed). * - * @param typeString - * the {@link SupportType} to list the known stories of, or NULL - * to list all stories + * @param source + * the source to list the known stories of, or NULL to list all + * stories * * @return the exit return code (0 = success) */ - private static int list(String typeString) { - SupportType type = null; - try { - type = SupportType.valueOfNullOkUC(typeString); - } catch (Exception e) { - Instance.syserr(new Exception( - trans(StringId.INPUT_DESC, typeString), e)); - return 1; - } - - BasicReader.getReader().start(type); - + private static int list(String source) { + BasicReader.getReader().browse(source); return 0; } @@ -312,8 +384,8 @@ public class Main { * Start the CLI reader for this {@link Story}. * * @param story - * the LUID of the {@link Story} in the {@link Library} or - * the {@link Story} {@link URL} + * the LUID of the {@link Story} in the {@link LocalLibrary} + * or the {@link Story} {@link URL} * @param chapString * which {@link Chapter} to read (starting at 1), or NULL to get * the {@link Story} description @@ -325,16 +397,17 @@ public class Main { */ private static int read(String story, String chapString, boolean library) { try { - BasicReader reader = BasicReader.getReader(); + Reader reader = BasicReader.getReader(); if (library) { - reader.setStory(story); + reader.setMeta(story); } else { - reader.setStory(getUrl(story)); + reader.setMeta(BasicReader.getUrl(story), null); } if (chapString != null) { try { - reader.read(Integer.parseInt(chapString)); + reader.setChapter(Integer.parseInt(chapString)); + reader.read(); } catch (NumberFormatException e) { Instance.syserr(new IOException( "Chapter number cannot be parsed: " + chapString, e)); @@ -363,16 +436,18 @@ public class Main { * @param infoCover * TRUE to also export the cover and info file, even if the given * {@link OutputType} does not usually save them + * @param pg + * the optional progress reporter * * @return the exit return code (0 = success) */ private static int convert(String urlString, String typeString, - String target, boolean infoCover) { + String target, boolean infoCover, Progress pg) { int exitCode = 0; String sourceName = urlString; try { - URL source = getUrl(urlString); + URL source = BasicReader.getUrl(urlString); sourceName = source.toString(); if (source.toString().startsWith("file://")) { sourceName = sourceName.substring("file://".length()); @@ -387,13 +462,21 @@ public class Main { } else { try { BasicSupport support = BasicSupport.getSupport(source); + if (support != null) { - Story story = support.process(source); + Progress pgIn = new Progress(); + Progress pgOut = new Progress(); + if (pg != null) { + pg.setMax(2); + pg.addProgress(pgIn, 1); + pg.addProgress(pgOut, 1); + } + Story story = support.process(source, pgIn); try { target = new File(target).getAbsolutePath(); BasicOutput.getOutput(type, infoCover).process( - story, target); + story, target, pgOut); } catch (IOException e) { Instance.syserr(new IOException(trans( StringId.ERR_SAVING, target), e)); @@ -453,7 +536,7 @@ public class Main { for (OutputType type : OutputType.values()) { builder.append(trans(StringId.ERR_SYNTAX_TYPE, type.toString(), - type.getDesc())); + type.getDesc(true))); builder.append('\n'); } @@ -474,7 +557,8 @@ public class Main { */ private static int setReaderType(String readerTypeString) { try { - ReaderType readerType = ReaderType.valueOf(readerTypeString); + ReaderType readerType = ReaderType.valueOf(readerTypeString + .toUpperCase()); BasicReader.setDefaultReaderType(readerType); return 0; } catch (IllegalArgumentException e) {