__main__.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import os
  2. import asyncio
  3. import logging
  4. from argparse import Namespace
  5. from .manga_translator import (
  6. MangaTranslator,
  7. MangaTranslatorWeb,
  8. MangaTranslatorWS,
  9. MangaTranslatorAPI,
  10. set_main_logger,
  11. )
  12. from .args import parser
  13. from .utils import (
  14. BASE_PATH,
  15. init_logging,
  16. get_logger,
  17. set_log_level,
  18. natural_sort,
  19. )
  20. # TODO: Dynamic imports to reduce ram usage in web(-server) mode. Will require dealing with args.py imports.
  21. async def dispatch(args: Namespace):
  22. args_dict = vars(args)
  23. logger.info(f'Running in {args.mode} mode')
  24. if args.mode in ('demo', 'batch'):
  25. if not args.input:
  26. raise Exception('No input image was supplied. Use -i <image_path>')
  27. translator = MangaTranslator(args_dict)
  28. if args.mode == 'demo':
  29. if len(args.input) != 1 or not os.path.isfile(args.input[0]):
  30. raise FileNotFoundError(f'Invalid single image file path for demo mode: "{" ".join(args.input)}". Use `-m batch`.')
  31. dest = os.path.join(BASE_PATH, 'result/final.png')
  32. args.overwrite = True # Do overwrite result/final.png file
  33. await translator.translate_path(args.input[0], dest, args_dict)
  34. else: # batch
  35. dest = args.dest
  36. for path in natural_sort(args.input):
  37. await translator.translate_path(path, dest, args_dict)
  38. elif args.mode == 'web':
  39. from .server.web_main import dispatch
  40. await dispatch(args.host, args.port, translation_params=args_dict)
  41. elif args.mode == 'web_client':
  42. translator = MangaTranslatorWeb(args_dict)
  43. await translator.listen(args_dict)
  44. elif args.mode == 'ws':
  45. translator = MangaTranslatorWS(args_dict)
  46. await translator.listen(args_dict)
  47. elif args.mode == 'api':
  48. translator = MangaTranslatorAPI(args_dict)
  49. await translator.listen(args_dict)
  50. if __name__ == '__main__':
  51. args = None
  52. init_logging()
  53. try:
  54. args = parser.parse_args()
  55. set_log_level(level=logging.DEBUG if args.verbose else logging.INFO)
  56. logger = get_logger(args.mode)
  57. set_main_logger(logger)
  58. if args.mode != 'web':
  59. logger.debug(args)
  60. loop = asyncio.new_event_loop()
  61. asyncio.set_event_loop(loop)
  62. loop.run_until_complete(dispatch(args))
  63. except KeyboardInterrupt:
  64. if not args or args.mode != 'web':
  65. print()
  66. except Exception as e:
  67. logger.error(f'{e.__class__.__name__}: {e}',
  68. exc_info=e if args and args.verbose else None)