X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2FMain.java;h=bbb335e97afb9395b8cabb7196e5f1845ca0fcf7;hp=6a8a4a5af7542dccb07e8ffd5ba97dccd1abb05a;hb=91b82a5cbd8a9c90798d1bd49bfa9a061e652a6a;hpb=5e848e6a19a87f4e14b13147f628667376503d74 diff --git a/src/be/nikiroo/fanfix/Main.java b/src/be/nikiroo/fanfix/Main.java index 6a8a4a5..bbb335e 100644 --- a/src/be/nikiroo/fanfix/Main.java +++ b/src/be/nikiroo/fanfix/Main.java @@ -4,9 +4,12 @@ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import be.nikiroo.fanfix.bundles.StringId; import be.nikiroo.fanfix.data.Chapter; +import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.library.BasicLibrary; import be.nikiroo.fanfix.library.CacheLibrary; @@ -18,12 +21,12 @@ import be.nikiroo.fanfix.output.BasicOutput.OutputType; import be.nikiroo.fanfix.reader.BasicReader; import be.nikiroo.fanfix.reader.Reader; import be.nikiroo.fanfix.reader.Reader.ReaderType; +import be.nikiroo.fanfix.searchable.BasicSearchable; import be.nikiroo.fanfix.supported.BasicSupport; -import be.nikiroo.fanfix.supported.BasicSupport.SupportType; +import be.nikiroo.fanfix.supported.SupportType; import be.nikiroo.utils.Progress; import be.nikiroo.utils.Version; -import be.nikiroo.utils.serial.ConnectActionClient; -import be.nikiroo.utils.serial.Server; +import be.nikiroo.utils.serial.server.ServerObject; /** * Main program entry point. @@ -32,7 +35,7 @@ import be.nikiroo.utils.serial.Server; */ public class Main { private enum MainAction { - IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER, START, VERSION, SERVER, STOP_SERVER, REMOTE, + IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER, START, VERSION, SERVER, STOP_SERVER, REMOTE, SET_SOURCE, SET_TITLE, SET_AUTHOR, SEARCH, SEARCH_TAG } /** @@ -58,13 +61,22 @@ public class Main { * *
  • --read-url [URL] ([chapter number]): convert on the fly and read the * story, without saving it
  • + *
  • --search WEBSITE [free text] ([page] ([item])): search for the given terms, + * show the given page (page 0 means "how many page do we have", starts at page 1)
  • + *
  • --search-tag WEBSITE ([tag 1] [tag2...] ([page] ([item]))): list the known + * tags or search the stories for the given tag(s), show the given page of results + * (page 0 means "how many page do we have", starts at page 1)
  • *
  • --list ([type]): list the stories present in the library
  • + *
  • --set-source [id] [new source]: change the source of the given story
  • + *
  • --set-title [id] [new title]: change the title of the given story
  • + *
  • --set-author [id] [new author]: change the author of the given story
  • *
  • --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
  • - *
  • --stop-server [port]: stop the running server on this port if any
  • - *
  • --remote [host] [port]: use a the given remote library
  • + *
  • --server [key] [port]: start a server on this port
  • + *
  • --stop-server [key] [port]: stop the running server on this port if + * any
  • + *
  • --remote [key] [host] [port]: use a the given remote library
  • * * * @param args @@ -74,12 +86,20 @@ public class Main { String urlString = null; String luid = null; String sourceString = null; + String titleString = null; + String authorString = null; String chapString = null; String target = null; + String key = null; MainAction action = MainAction.START; Boolean plusInfo = null; String host = null; Integer port = null; + SupportType searchOn = null; + String search = null; + List tags = new ArrayList(); + Integer page = null; + Integer item = null; boolean noMoreActions = false; @@ -94,8 +114,9 @@ public class Main { action = MainAction.valueOf(args[i].substring(2) .toUpperCase().replace("-", "_")); } catch (Exception e) { - Instance.syserr(new IllegalArgumentException( - "Unknown action: " + args[i], e)); + Instance.getTraceHandler().error( + new IllegalArgumentException("Unknown action: " + + args[i], e)); exitCode = 255; } } @@ -146,6 +167,33 @@ public class Main { exitCode = 255; } break; + case SET_SOURCE: + if (luid == null) { + luid = args[i]; + } else if (sourceString == null) { + sourceString = args[i]; + } else { + exitCode = 255; + } + break; + case SET_TITLE: + if (luid == null) { + luid = args[i]; + } else if (sourceString == null) { + titleString = args[i]; + } else { + exitCode = 255; + } + break; + case SET_AUTHOR: + if (luid == null) { + luid = args[i]; + } else if (sourceString == null) { + authorString = args[i]; + } else { + exitCode = 255; + } + break; case READ: if (luid == null) { luid = args[i]; @@ -164,6 +212,64 @@ public class Main { exitCode = 255; } break; + case SEARCH: + if (searchOn == null) { + searchOn = SupportType.valueOfAllOkUC(args[i]); + + if (searchOn == null) { + Instance.getTraceHandler().error( + "Website not known: <" + args[i] + ">"); + exitCode = 255; + } + + if (BasicSearchable.getSearchable(searchOn) == null) { + Instance.getTraceHandler().error( + "Website not supported: " + searchOn); + exitCode = 255; + } + } else if (search == null) { + search = args[i]; + } else if (page == null) { + try { + page = Integer.parseInt(args[i]); + } catch (NumberFormatException e) { + Instance.getTraceHandler().error( + new Exception("Incorrect page number: <" + + args[i] + ">", e)); + exitCode = 255; + } + } else if (item == null) { + try { + item = Integer.parseInt(args[i]); + } catch (NumberFormatException e) { + Instance.getTraceHandler().error( + new Exception("Incorrect item number: <" + + args[i] + ">", e)); + exitCode = 255; + } + } else { + exitCode = 255; + } + break; + case SEARCH_TAG: + if (searchOn == null) { + searchOn = SupportType.valueOfAllOkUC(args[i]); + + if (searchOn == null) { + Instance.getTraceHandler().error( + "Website not known: <" + args[i] + ">"); + exitCode = 255; + } + + if (BasicSearchable.getSearchable(searchOn) == null) { + Instance.getTraceHandler().error( + "Website not supported: " + searchOn); + exitCode = 255; + } + } else { + tags.add(args[i]); + } + break; case HELP: exitCode = 255; break; @@ -179,21 +285,24 @@ public class Main { break; case SERVER: case STOP_SERVER: - if (port == null) { + if (key == null) { + key = args[i]; + } else if (port == null) { port = Integer.parseInt(args[i]); } else { exitCode = 255; } break; case REMOTE: - if (host == null) { + if (key == null) { + key = args[i]; + } else if (host == null) { host = args[i]; } else if (port == null) { port = Integer.parseInt(args[i]); - File remoteCacheDir = Instance.getRemoteDir(host); - BasicLibrary lib = new RemoteLibrary(host, port); - lib = new CacheLibrary(remoteCacheDir, lib); + BasicLibrary lib = new RemoteLibrary(key, host, port); + lib = new CacheLibrary(Instance.getRemoteDir(host), lib); BasicReader.setDefaultLibrary(lib); @@ -214,6 +323,9 @@ public class Main { int diff = progress.getProgress() - current; current += diff; + if (diff <= 0) + return; + StringBuilder builder = new StringBuilder(); for (int i = 0; i < diff; i++) { builder.append('.'); @@ -240,8 +352,8 @@ public class Main { System.err.println("\tVersion " + v); System.err.println("\t-------------"); System.err.println(""); - for (String item : updates.getChanges().get(v)) { - System.err.println("\t- " + item); + for (String it : updates.getChanges().get(v)) { + System.err.println("\t- " + it); } System.err.println(""); } @@ -264,17 +376,43 @@ public class Main { break; case LIST: if (BasicReader.getReader() == null) { - Instance.syserr(new Exception( - "No reader type has been configured")); + Instance.getTraceHandler() + .error(new Exception( + "No reader type has been configured")); exitCode = 10; break; } exitCode = list(sourceString); break; + case SET_SOURCE: + try { + Instance.getLibrary().changeSource(luid, sourceString, pg); + } catch (IOException e1) { + Instance.getTraceHandler().error(e1); + exitCode = 21; + } + break; + case SET_TITLE: + try { + Instance.getLibrary().changeTitle(luid, titleString, pg); + } catch (IOException e1) { + Instance.getTraceHandler().error(e1); + exitCode = 22; + } + break; + case SET_AUTHOR: + try { + Instance.getLibrary().changeAuthor(luid, authorString, pg); + } catch (IOException e1) { + Instance.getTraceHandler().error(e1); + exitCode = 23; + } + break; case READ: if (BasicReader.getReader() == null) { - Instance.syserr(new Exception( - "No reader type has been configured")); + Instance.getTraceHandler() + .error(new Exception( + "No reader type has been configured")); exitCode = 10; break; } @@ -282,12 +420,80 @@ public class Main { break; case READ_URL: if (BasicReader.getReader() == null) { - Instance.syserr(new Exception( - "No reader type has been configured")); + Instance.getTraceHandler() + .error(new Exception( + "No reader type has been configured")); exitCode = 10; break; } exitCode = read(urlString, chapString, false); + break; + case SEARCH: + if (searchOn == null || search == null) { + exitCode = 255; + break; + } + + if (page == null) { + page = 1; + } + if (item == null) { + item = 0; + } + + if (BasicReader.getReader() == null) { + Instance.getTraceHandler() + .error(new Exception( + "No reader type has been configured")); + exitCode = 10; + break; + } + + try { + BasicReader.getReader().search(searchOn, search, page, item); + } catch (IOException e1) { + Instance.getTraceHandler().error(e1); + } + + break; + case SEARCH_TAG: + if (searchOn == null) { + exitCode = 255; + break; + } + + item = 0; + page = 1; + + try { + item = Integer.parseInt(tags.get(tags.size()-1)); + tags.remove(tags.size() - 1); + + try { + int tmp = Integer.parseInt(tags.get(tags.size()-1)); + tags.remove(tags.size() - 1); + + page = item; + item = tmp; + } catch (Exception e) { + } + } catch (Exception e) { + } + + if (BasicReader.getReader() == null) { + Instance.getTraceHandler() + .error(new Exception( + "No reader type has been configured")); + exitCode = 10; + break; + } + + try { + BasicReader.getReader().searchTag(searchOn, page, item, tags.toArray(new String[]{})); + } catch (IOException e1) { + Instance.getTraceHandler().error(e1); + } + break; case HELP: syntax(true); @@ -299,15 +505,16 @@ public class Main { case VERSION: System.out .println(String.format("Fanfix version %s" - + "\nhttps://github.com/nikiroo/fanfix/" - + "\n\tWritten by Nikiroo", + + "%nhttps://github.com/nikiroo/fanfix/" + + "%n\tWritten by Nikiroo", Version.getCurrentVersion())); updates.ok(); // we consider it read break; case START: if (BasicReader.getReader() == null) { - Instance.syserr(new Exception( - "No reader type has been configured")); + Instance.getTraceHandler() + .error(new Exception( + "No reader type has been configured")); exitCode = 10; break; } @@ -319,11 +526,11 @@ public class Main { break; } try { - Server server = new RemoteLibraryServer(port); - server.start(); - System.out.println("Remote server started on: " + port); + ServerObject server = new RemoteLibraryServer(key, port); + server.setTraceHandler(Instance.getTraceHandler()); + server.run(); } catch (IOException e) { - Instance.syserr(e); + Instance.getTraceHandler().error(e); } return; case STOP_SERVER: @@ -332,21 +539,7 @@ public class Main { break; } - try { - new ConnectActionClient(host, port, true) { - @Override - public void action(Version serverVersion) - throws Exception { - try { - send(new Object[] { "EXIT" }); - } catch (Exception e) { - Instance.syserr(e); - } - } - }.connect(); - } catch (IOException e) { - Instance.syserr(e); - } + new RemoteLibrary(key, host, port).exit(); break; case REMOTE: exitCode = 255; // should not be reachable (REMOTE -> START) @@ -354,13 +547,19 @@ public class Main { } } + try { + Instance.getTempFiles().close(); + } catch (IOException e) { + Instance.getTraceHandler() + .error(new IOException( + "Cannot dispose of the temporary files", e)); + } + if (exitCode == 255) { syntax(false); } - if (exitCode != 0) { - System.exit(exitCode); - } + System.exit(exitCode); } /** @@ -380,7 +579,7 @@ public class Main { System.out.println(story.getMeta().getLuid() + ": \"" + story.getMeta().getTitle() + "\" imported."); } catch (IOException e) { - Instance.syserr(e); + Instance.getTraceHandler().error(e); return 1; } @@ -406,15 +605,15 @@ public class Main { Progress pg) { OutputType type = OutputType.valueOfNullOkUC(typeString, null); if (type == null) { - Instance.syserr(new Exception(trans(StringId.OUTPUT_DESC, - typeString))); + Instance.getTraceHandler().error( + new Exception(trans(StringId.OUTPUT_DESC, typeString))); return 1; } try { Instance.getLibrary().export(luid, type, target, pg); } catch (IOException e) { - Instance.syserr(e); + Instance.getTraceHandler().error(e); return 4; } @@ -432,12 +631,23 @@ public class Main { * @return the exit return code (0 = success) */ private static int list(String source) { - BasicReader.getReader().browse(source); + List stories; + stories = BasicReader.getReader().getLibrary().getListBySource(source); + + for (MetaData story : stories) { + String author = ""; + if (story.getAuthor() != null && !story.getAuthor().isEmpty()) { + author = " (" + story.getAuthor() + ")"; + } + + System.out.println(story.getLuid() + ": " + story.getTitle() + + author); + } return 0; } /** - * Start the CLI reader for this {@link Story}. + * Start the current reader for this {@link Story}. * * @param story * the LUID of the {@link Story} in the {@link LocalLibrary} @@ -463,17 +673,18 @@ public class Main { if (chapString != null) { try { reader.setChapter(Integer.parseInt(chapString)); - reader.read(); + reader.read(true); } catch (NumberFormatException e) { - Instance.syserr(new IOException( - "Chapter number cannot be parsed: " + chapString, e)); + Instance.getTraceHandler().error( + new IOException("Chapter number cannot be parsed: " + + chapString, e)); return 2; } } else { - reader.read(); + reader.read(true); } } catch (IOException e) { - Instance.syserr(e); + Instance.getTraceHandler().error(e); return 1; } @@ -497,10 +708,11 @@ public class Main { * * @return the exit return code (0 = success) */ - private static int convert(String urlString, String typeString, + public static int convert(String urlString, String typeString, String target, boolean infoCover, Progress pg) { int exitCode = 0; + Instance.getTraceHandler().trace("Convert: " + urlString); String sourceName = urlString; try { URL source = BasicReader.getUrl(urlString); @@ -511,8 +723,9 @@ public class Main { OutputType type = OutputType.valueOfAllOkUC(typeString, null); if (type == null) { - Instance.syserr(new IOException(trans( - StringId.ERR_BAD_OUTPUT_TYPE, typeString))); + Instance.getTraceHandler().error( + new IOException(trans(StringId.ERR_BAD_OUTPUT_TYPE, + typeString))); exitCode = 2; } else { @@ -520,6 +733,8 @@ public class Main { BasicSupport support = BasicSupport.getSupport(source); if (support != null) { + Instance.getTraceHandler().trace( + "Support found: " + support.getClass()); Progress pgIn = new Progress(); Progress pgOut = new Progress(); if (pg != null) { @@ -528,31 +743,35 @@ public class Main { pg.addProgress(pgOut, 1); } - Story story = support.process(source, pgIn); + Story story = support.process(pgIn); try { target = new File(target).getAbsolutePath(); - BasicOutput.getOutput(type, infoCover).process( - story, target, pgOut); + BasicOutput.getOutput(type, infoCover, infoCover) + .process(story, target, pgOut); } catch (IOException e) { - Instance.syserr(new IOException(trans( - StringId.ERR_SAVING, target), e)); + Instance.getTraceHandler().error( + new IOException(trans(StringId.ERR_SAVING, + target), e)); exitCode = 5; } } else { - Instance.syserr(new IOException(trans( - StringId.ERR_NOT_SUPPORTED, source))); + Instance.getTraceHandler().error( + new IOException(trans( + StringId.ERR_NOT_SUPPORTED, source))); exitCode = 4; } } catch (IOException e) { - Instance.syserr(new IOException(trans(StringId.ERR_LOADING, - sourceName), e)); + Instance.getTraceHandler().error( + new IOException(trans(StringId.ERR_LOADING, + sourceName), e)); exitCode = 3; } } } catch (MalformedURLException e) { - Instance.syserr(new IOException(trans(StringId.ERR_BAD_URL, - sourceName), e)); + Instance.getTraceHandler() + .error(new IOException(trans(StringId.ERR_BAD_URL, + sourceName), e)); exitCode = 1; } @@ -618,8 +837,9 @@ public class Main { BasicReader.setDefaultReaderType(readerType); return 0; } catch (IllegalArgumentException e) { - Instance.syserr(new IOException("Unknown reader type: " - + readerTypeString, e)); + Instance.getTraceHandler().error( + new IOException("Unknown reader type: " + readerTypeString, + e)); return 1; } }