From 50531c7b3e6836883532dfdab633fb9e8a7e8cea Mon Sep 17 00:00:00 2001 From: Serene-Arc Date: Thu, 11 Mar 2021 11:20:59 +1000 Subject: [PATCH] Switch from argparse to click --- bulkredditdownloader/__main__.py | 143 +++++++++---------------------- 1 file changed, 40 insertions(+), 103 deletions(-) diff --git a/bulkredditdownloader/__main__.py b/bulkredditdownloader/__main__.py index 233d710..3625c88 100644 --- a/bulkredditdownloader/__main__.py +++ b/bulkredditdownloader/__main__.py @@ -1,104 +1,54 @@ #!/usr/bin/env python3 -import argparse import logging import sys +import click + from bulkredditdownloader.configuration import Configuration from bulkredditdownloader.downloader import RedditDownloader from bulkredditdownloader.exceptions import BulkDownloaderException logger = logging.getLogger() -parser = argparse.ArgumentParser(allow_abbrev=False, - description='This program downloads media from reddit posts') -def _add_options(): - parser.add_argument('directory', - help='Specifies the directory where posts will be downloaded to', - metavar='DIRECTORY') - parser.add_argument('--verbose', '-v', - action='count', - default=0, - ) - parser.add_argument('--link', '-l', - help='Get posts from link', - action='append', - default=[], - metavar='link') - parser.add_argument('--submitted', - action='store_true', - help='Gets posts of --user') - parser.add_argument('--saved', - action='store_true', - help='Gets upvoted posts of --user') - parser.add_argument('--upvoted', - action='store_true', - help='Gets upvoted posts of --user') - parser.add_argument('--subreddit', - nargs='+', - help='Triggers subreddit mode and takes subreddit name. use \"frontpage\" for frontpage', - metavar='SUBREDDIT', - type=str) - parser.add_argument('--multireddit', - help='Triggers multireddit mode and takes multireddit name', - metavar='MULTIREDDIT', - action='append', - type=str) - parser.add_argument('--authenticate', - action='store_true') - parser.add_argument('--user', - help='reddit username if needed. use "me" for current user', - required='--multireddit' in sys.argv or '--submitted' in sys.argv, - metavar='redditor', - default=None, - type=str) - parser.add_argument('--search', - help='Searches for given query in given subreddits', - metavar='query', - default=None, - type=str) - parser.add_argument('--sort', - help='Either hot, top, new, controversial, rising or relevance default: hot', - choices=['hot', 'top', 'new', 'controversial', 'rising', 'relevance'], - metavar='SORT TYPE', - default='hot', - type=str) - parser.add_argument('--limit', - help='default: unlimited', - metavar='Limit', - default=None, - type=int) - parser.add_argument('--time', - help='Either hour, day, week, month, year or all. default: all', - choices=['all', 'hour', 'day', 'week', 'month', 'year'], - metavar='TIME_LIMIT', - default='all', - type=str) - parser.add_argument('--skip', - nargs='+', - help='Skip posts with given type', - type=str, - default=[]) - parser.add_argument('--skip-domain', - nargs='+', - help='Skip posts with given domain', - type=str, - default=[]) - parser.add_argument('--set-folder-scheme', - action='store_true', - help='Set custom folderpath', - default='{SUBREDDIT}' - ) - parser.add_argument('--set-file-scheme', - action='store_true', - help='Set custom filename', - default='{REDDITOR}_{TITLE}_{POSTID}' - ) - parser.add_argument('--no-dupes', - action='store_true', - help='Do not download duplicate posts on different subreddits', - ) +@click.group() +def cli(): + pass + + +@cli.command('download') +@click.argument('directory', type=str) +@click.option('-v', '--verbose', default=None, count=True) +@click.option('-l', '--link', multiple=True, default=None, type=str) +@click.option('-s', '--subreddit', multiple=True, default=None, type=str) +@click.option('-m', '--multireddit', multiple=True, default=None, type=str) +@click.option('-L', '--limit', default=None, type=int) +@click.option('--authenticate', is_flag=True, default=None) +@click.option('--submitted', is_flag=True, default=None) +@click.option('--upvoted', is_flag=True, default=None) +@click.option('--saved', is_flag=True, default=None) +@click.option('--search', default=None, type=str) +@click.option('-u', '--user', type=str, default=None) +@click.option('-t', '--time', type=click.Choice(('all', 'hour', 'day', 'week', 'month', 'year')), default=None) +@click.option('-S', '--sort', type=click.Choice(('hot', 'top', 'new', + 'controversial', 'rising', 'relevance')), default=None) +@click.option('--skip', default=None, multiple=True) +@click.option('--skip-domain', default=None, multiple=True) +@click.option('--set-file-scheme', default=None, type=str) +@click.option('--set-folder-scheme', default=None, type=str) +@click.option('--no-dupes', is_flag=True, default=None) +@click.option('--config', type=str, default=None) +@click.pass_context +def cli_download(context: click.Context, **_): + config = Configuration() + config.process_click_arguments(context) + _setup_logging(config.verbose) + try: + reddit_downloader = RedditDownloader(config) + reddit_downloader.download() + except BulkDownloaderException as e: + logger.critical(f'An error occured {e}') def _setup_logging(verbosity: int): @@ -111,23 +61,10 @@ def _setup_logging(verbosity: int): stream.setLevel(logging.INFO) else: stream.setLevel(logging.DEBUG) - logging.getLogger('praw').setLevel(logging.CRITICAL) logging.getLogger('prawcore').setLevel(logging.CRITICAL) logging.getLogger('urllib3').setLevel(logging.CRITICAL) -def main(args: Configuration): - _setup_logging(args.verbose) - try: - reddit_downloader = RedditDownloader(args) - reddit_downloader.download() - except BulkDownloaderException as e: - logger.critical(f'An error occured {e}') - - if __name__ == '__main__': - _add_options() - read_configuration = Configuration() - args = parser.parse_args(namespace=read_configuration) - main(args) + cli()