Files
2019-12-14 22:33:14 -05:00

339 lines
8.3 KiB
Python

'''
manga-py module for CLI and its options.
'''
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, RawDescriptionHelpFormatter
from manga_py.meta import __version__
class DescriptionDefaultsHelpFormatter(ArgumentDefaultsHelpFormatter,
RawDescriptionHelpFormatter):
'''
Class to format --help cli option with 2 features to output:
programm's description in a raw mode,
options default values.
'''
def _image_args(args_parser): # pragma: no cover
args = args_parser.add_argument_group('Image options')
args.add_argument(
'-E',
'--not-change-files-extension',
action='store_true',
help=(
'Save downloaded files to archive "as is".'
)
)
args.add_argument(
'-W',
'--no-webp',
action='store_true',
help=(
'Convert `*.webp` images to `*.jpg` format.'
)
)
def _debug_args(args_parser): # pragma: no cover
args = args_parser.add_argument_group('Debug / Simulation options')
args.add_argument(
'-h',
'--help',
action='help',
help=(
'Show this help and exit.'
)
)
args.add_argument(
'-j',
'--print-json',
action='store_true',
help=(
'Print information about the results in the JSON format (after completion).'
)
)
args.add_argument(
'-l',
'--simulate',
action='store_true',
help=(
'Simulate running %(prog)s, where: '
'1) do not download files and, '
'2) do not write anything on disk.'
)
)
args.add_argument(
'-i',
'--show-current-chapter-info',
action='store_true',
help=(
'Show current processing chapter info.'
)
)
args.add_argument(
'-b',
'--debug',
action='store_true',
help=(
'Debug %(prog)s.'
)
)
args.add_argument(
'-q',
'--quiet',
action='store_true',
help=(
'Dont show any messages.'
)
)
def _downloading_args(args_parser): # pragma: no cover
args = args_parser.add_argument_group('Downloading options')
args.add_argument(
'-s',
'--skip-volumes',
metavar='COUNT',
type=int,
help=(
'Skip a total number, i.e. %(metavar)s, of volumes.'
),
default=0
)
args.add_argument(
'-m',
'--max-volumes',
metavar='COUNT',
type=int,
default=0,
help=(
'Download a maximum number, i.e. %(metavar)s, of volumes. '
'E.g.: `--max-volumes 2` will download at most 2 volumes. '
'If %(metavar)s is `0` (zero) then it will download all available volumes.'
)
)
args.add_argument(
'-a',
'--user-agent',
type=str,
help=(
'Set an user-agent. '
'Don\'t work from protected sites.'
)
)
args.add_argument(
'-x',
'--proxy',
type=str,
help=(
'Set a http proxy.'
)
)
args.add_argument(
'-e',
'--reverse-downloading',
action='store_true',
help=(
'Download manga volumes in a reverse order. '
'By default, manga is downloaded in ascendent order '
'(i.e. volume 00, volume 01, volume 02...). '
'If `--reverse-downloading` is actived, then manga is downloaded in descendent order '
'(i.e. volume 99, volume 98, volume 97...).'
)
)
args.add_argument(
'-w',
'--rewrite-exists-archives',
action='store_true',
help=(
'(Re)Download manga volume if it already exists locally in the directory destination. '
'Your manga files can be overwrited, so be careful.'
)
)
args.add_argument(
'-t',
'--max-threads',
type=int,
default=None,
help=(
'Set the maximum number of threads, i.e. MAX_THREADS, to be avaliable to manga-py. '
'Threads run in pseudo-parallel when execute the process to download the manga images.'
)
)
args.add_argument(
'-f',
'--zero-fill',
action='store_true',
help=(
'Pad a `-0` (dash-and-zero) at right for all downloaded manga volume filenames. '
'E.g. from `vol_001.zip` to `vol_001-0.zip`. '
'It is useful to standardize the filenames between: '
'1) normal manga volumes (e.g. vol_006.zip) and, '
'2) abnormal manga volumes (e.g. vol_006-5.zip). '
'An abnormal manga volume is a released volume like: '
'extra chapters, '
'bonuses, '
'updated, '
'typos corrected, '
'spelling errors corrected; '
'and so on.'
)
)
args.add_argument(
'-g',
'--with-manga-name',
action='store_true',
help=(
'Pad the manga name at left for all downloaded manga volumes filenames. '
'E.g. from `vol_001.zip` to `manga_name-vol_001.zip`.'
)
)
args.add_argument(
'-o',
'--override-archive-name',
metavar='ARCHIVE_NAME',
type=str,
default='',
dest='override_archive_name',
help=(
'Pad %(metavar)s at left for all downloaded manga volumes filename. '
'E.g from `vol_001.zip` to `%(metavar)s-vol_001.zip`.'
)
)
args.add_argument(
'-c',
'--min-free-space',
metavar='MB',
type=int,
default=100,
help=(
'Alert when the minimum free disc space, i.e. MB, is reached. '
'Insert it in order of megabytes (Mb).'
)
)
def _reader_args(args_parser): # pragma: no cover
args = args_parser.add_argument_group('Archive options')
args.add_argument(
'-z',
'--cbz',
action='store_true',
help=(
'Make `*.cbz` archives (for reader).'
)
)
args.add_argument(
'-r',
'--rename-pages',
action='store_true',
help=(
'Normalize image filenames. '
'E.g. from `0_page_1.jpg` to `0001.jpg`.'
)
)
def get_cli_arguments() -> ArgumentParser: # pragma: no cover
'''
Method to generate manga-py CLI with its options.
'''
args_parser = ArgumentParser(
add_help=False,
formatter_class=DescriptionDefaultsHelpFormatter,
prog="manga-py",
description=(
'%(prog)s is the universal manga downloader (for your offline reading).\n '
'Site: https://manga-py.com/manga-py/\n '
'Source-code: https://github.com/manga-py/manga-py\n '
'Version: ' + __version__
),
epilog=(
'So, that is how %(prog)s can be executed to download yours favourite mangas.\n'
'Enjoy! 😉'
)
)
args = args_parser.add_argument_group('General options')
args.add_argument(
'url',
metavar='URL',
type=str,
help=(
'%(metavar)s, i.e. link from manga, to be downloaded.'
)
)
args.add_argument(
'-v',
'--version',
action='version',
version=__version__,
help=(
'Show %(prog)s\'s version number and exit.'
)
)
args.add_argument(
'-n',
'--name',
metavar='NAME',
type=str,
default='',
help=(
'Rename manga, i.e. by %(metavar)s, and its folder to where it will be saved locally.'
)
)
args.add_argument(
'-d',
'--destination',
metavar='PATH',
type=str,
default='Manga',
help=(
'Destination folder to where the manga will be saved locally. '
'The path will be `./%(metavar)s/manga_name/`.'
)
)
args.add_argument(
'-P',
'--no-progress',
action='store_true',
help=(
'Don\'t show progress bar.'
)
)
_image_args(args_parser)
_reader_args(args_parser)
_downloading_args(args_parser)
_debug_args(args_parser)
return args_parser