X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=nhentai%2Fcmdline.py;h=3085f2aa8c6b23db90447f0728fbf59250714d64;hb=6519e6f221a36982d1cc728f3eef7719649c52a8;hp=10f5ecd307fab12e581128cb4a95f27f035cb377;hpb=ab2dff48592bfc910d81c84f4a4855a1a886280d;p=nhentai.git diff --git a/nhentai/cmdline.py b/nhentai/cmdline.py index 10f5ecd..3085f2a 100644 --- a/nhentai/cmdline.py +++ b/nhentai/cmdline.py @@ -1,8 +1,10 @@ # coding: utf-8 -from __future__ import print_function + import os import sys +import json from optparse import OptionParser + try: from itertools import ifilter as filter except ImportError: @@ -10,20 +12,9 @@ except ImportError: import nhentai.constant as constant from nhentai import __version__ -from nhentai.utils import urlparse, generate_html, generate_main_html +from nhentai.utils import urlparse, generate_html, generate_main_html, DB from nhentai.logger import logger -try: - if sys.version_info < (3, 0, 0): - import codecs - import locale - sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout) - sys.stderr = codecs.getwriter(locale.getpreferredencoding())(sys.stderr) - -except NameError: - # python3 - pass - def banner(): logger.info(u'''nHentai ver %s: あなたも変態。 いいね? @@ -35,10 +26,32 @@ def banner(): ''' % __version__) +def load_config(): + if not os.path.exists(constant.NHENTAI_CONFIG_FILE): + return + + try: + with open(constant.NHENTAI_CONFIG_FILE, 'r') as f: + constant.CONFIG.update(json.load(f)) + except json.JSONDecodeError: + logger.error('Failed to load config file.') + write_config() + + +def write_config(): + if not os.path.exists(constant.NHENTAI_HOME): + os.mkdir(constant.NHENTAI_HOME) + + with open(constant.NHENTAI_CONFIG_FILE, 'w') as f: + f.write(json.dumps(constant.CONFIG)) + + def cmd_parser(): + load_config() + parser = OptionParser('\n nhentai --search [keyword] --download' '\n NHENTAI=http://h.loli.club nhentai --id [ID ...]' - '\n nhentai --file [filename]' + '\n nhentai --file [filename]' '\n\nEnvironment Variable:\n' ' NHENTAI nhentai mirror url') # operation options @@ -50,24 +63,20 @@ def cmd_parser(): parser.add_option('--id', type='string', dest='id', action='store', help='doujinshi ids set, e.g. 1,2,3') parser.add_option('--search', '-s', type='string', dest='keyword', action='store', help='search doujinshi by keyword') - parser.add_option('--tag', type='string', dest='tag', action='store', help='download doujinshi by tag') - parser.add_option('--artist', type='string', dest='artist', action='store', help='download doujinshi by artist') - parser.add_option('--character', type='string', dest='character', action='store', help='download doujinshi by character') - parser.add_option('--parody', type='string', dest='parody', action='store', help='download doujinshi by parody') - parser.add_option('--group', type='string', dest='group', action='store', help='download doujinshi by group') parser.add_option('--favorites', '-F', action='store_true', dest='favorites', help='list or download your favorites.') # page options - parser.add_option('--page', type='int', dest='page', action='store', default=1, - help='page number of search results') - parser.add_option('--max-page', type='int', dest='max_page', action='store', default=1, - help='The max page when recursive download tagged doujinshi') - parser.add_option('--sorting', dest='sorting', action='store', default='date', - help='sorting of doujinshi (date / popular)', choices=['date', 'popular']) + parser.add_option('--page-all', dest='page_all', action='store_true', default=False, + help='all search results') + parser.add_option('--page', '--page-range', type='string', dest='page', action='store', default='', + help='page number of search results. e.g. 1,2-5,14') + parser.add_option('--sorting', dest='sorting', action='store', default='recent', + help='sorting of doujinshi (recent / popular / popular-[today|week])', + choices=['recent', 'popular', 'popular-today', 'popular-week']) # download options - parser.add_option('--output', '-o', type='string', dest='output_dir', action='store', default='', + parser.add_option('--output', '-o', type='string', dest='output_dir', action='store', default='./', help='output dir') parser.add_option('--threads', '-t', type='int', dest='threads', action='store', default=5, help='thread count for downloading doujinshi') @@ -75,11 +84,12 @@ def cmd_parser(): help='timeout for downloading doujinshi') parser.add_option('--delay', '-d', type='int', dest='delay', action='store', default=0, help='slow down between downloading every doujinshi') - parser.add_option('--proxy', '-p', type='string', dest='proxy', action='store', default='', + parser.add_option('--proxy', type='string', dest='proxy', action='store', help='store a proxy, for example: -p \'http://127.0.0.1:1080\'') - parser.add_option('--file', '-f', type='string', dest='file', action='store', help='read gallery IDs from file.') + parser.add_option('--file', '-f', type='string', dest='file', action='store', help='read gallery IDs from file.') parser.add_option('--format', type='string', dest='name_format', action='store', help='format the saved folder name', default='[%i][%a][%t]') + parser.add_option('--dry-run', '-r', action='store_true', dest='dryrun', help='Dry run, skip file download.') # generate options parser.add_option('--html', dest='html_viewer', action='store_true', @@ -90,16 +100,29 @@ def cmd_parser(): help='generate a main viewer contain all the doujin in the folder') parser.add_option('--cbz', '-C', dest='is_cbz', action='store_true', help='generate Comic Book CBZ File') + parser.add_option('--pdf', '-P', dest='is_pdf', action='store_true', + help='generate PDF file') parser.add_option('--rm-origin-dir', dest='rm_origin_dir', action='store_true', default=False, - help='remove downloaded doujinshi dir when generated CBZ file.') + help='remove downloaded doujinshi dir when generated CBZ or PDF file.') + parser.add_option('--meta', dest='generate_metadata', action='store_true', + help='generate a metadata file in doujinshi format') # nhentai options parser.add_option('--cookie', type='str', dest='cookie', action='store', help='set cookie of nhentai to bypass Google recaptcha') + parser.add_option('--language', type='str', dest='language', action='store', + help='set default language to parse doujinshis') + parser.add_option('--clean-language', dest='clean_language', action='store_true', default=False, + help='set DEFAULT as language to parse doujinshis') + parser.add_option('--save-download-history', dest='is_save_download_history', action='store_true', + default=False, help='save downloaded doujinshis, whose will be skipped if you re-download them') + parser.add_option('--clean-download-history', action='store_true', default=False, dest='clean_download_history', + help='clean download history') + parser.add_option('--template', dest='viewer_template', action='store', + help='set viewer template', default='') try: sys.argv = [unicode(i.decode(sys.stdin.encoding)) for i in sys.argv] - print() except (NameError, TypeError): pass except UnicodeDecodeError: @@ -111,55 +134,61 @@ def cmd_parser(): generate_html() exit(0) - if args.main_viewer and not args.id and not args.keyword and \ - not args.tag and not args.artist and not args.character and \ - not args.parody and not args.group and not args.favorites: + if args.main_viewer and not args.id and not args.keyword and not args.favorites: generate_main_html() exit(0) - if os.path.exists(os.path.join(constant.NHENTAI_HOME, 'cookie')): - with open(os.path.join(constant.NHENTAI_HOME, 'cookie'), 'r') as f: - constant.COOKIE = f.read() + if args.clean_download_history: + with DB() as db: + db.clean_all() - if args.cookie: - try: - if not os.path.exists(constant.NHENTAI_HOME): - os.mkdir(constant.NHENTAI_HOME) - - with open(os.path.join(constant.NHENTAI_HOME, 'cookie'), 'w') as f: - f.write(args.cookie) - except Exception as e: - logger.error('Cannot create NHENTAI_HOME: {}'.format(str(e))) - exit(1) + logger.info('Download history cleaned.') + exit(0) + # --- set config --- + if args.cookie is not None: + constant.CONFIG['cookie'] = args.cookie logger.info('Cookie saved.') + write_config() exit(0) - if os.path.exists(os.path.join(constant.NHENTAI_HOME, 'proxy')): - with open(os.path.join(constant.NHENTAI_HOME, 'proxy'), 'r') as f: - link = f.read() - constant.PROXY = {'http': link, 'https': link} - - if args.proxy: - try: - if not os.path.exists(constant.NHENTAI_HOME): - os.mkdir(constant.NHENTAI_HOME) - - proxy_url = urlparse(args.proxy) - if proxy_url.scheme not in ('http', 'https'): - logger.error('Invalid protocol \'{0}\' of proxy, ignored'.format(proxy_url.scheme)) - else: - with open(os.path.join(constant.NHENTAI_HOME, 'proxy'), 'w') as f: - f.write(args.proxy) - except Exception as e: - logger.error('Cannot create NHENTAI_HOME: {}'.format(str(e))) + if args.language is not None: + constant.CONFIG['language'] = args.language + logger.info('Default language now set to \'{0}\''.format(args.language)) + write_config() + exit(0) + # TODO: search without language + + if args.proxy is not None: + proxy_url = urlparse(args.proxy) + if not args.proxy == '' and proxy_url.scheme not in ('http', 'https'): + logger.error('Invalid protocol \'{0}\' of proxy, ignored'.format(proxy_url.scheme)) + exit(0) + else: + constant.CONFIG['proxy'] = { + 'http': args.proxy, + 'https': args.proxy, + } + logger.info('Proxy now set to \'{0}\'.'.format(args.proxy)) + write_config() + exit(0) + + if args.viewer_template is not None: + if not args.viewer_template: + args.viewer_template = 'default' + + if not os.path.exists(os.path.join(os.path.dirname(__file__), + 'viewer/{}/index.html'.format(args.viewer_template))): + logger.error('Template \'{}\' does not exists'.format(args.viewer_template)) exit(1) + else: + constant.CONFIG['template'] = args.viewer_template + write_config() - logger.info('Proxy \'{0}\' saved.'.format(args.proxy)) - exit(0) + # --- end set config --- if args.favorites: - if not constant.COOKIE: + if not constant.CONFIG['cookie']: logger.warning('Cookie has not been set, please use `nhentai --cookie \'COOKIE\'` to set it.') exit(1) @@ -172,15 +201,12 @@ def cmd_parser(): _ = [i.strip() for i in f.readlines()] args.id = set(int(i) for i in _ if i.isdigit()) - if (args.is_download or args.is_show) and not args.id and not args.keyword and \ - not args.tag and not args.artist and not args.character and \ - not args.parody and not args.group and not args.favorites: + if (args.is_download or args.is_show) and not args.id and not args.keyword and not args.favorites: logger.critical('Doujinshi id(s) are required for downloading') parser.print_help() exit(1) - if not args.keyword and not args.id and not args.tag and not args.artist and \ - not args.character and not args.parody and not args.group and not args.favorites: + if not args.keyword and not args.id and not args.favorites: parser.print_help() exit(1) @@ -191,4 +217,8 @@ def cmd_parser(): logger.critical('Maximum number of used threads is 15') exit(1) + if args.dryrun and (args.is_cbz or args.is_pdf): + logger.critical('Cannot generate PDF or CBZ during dry-run') + exit(1) + return args