2021-02-22 21:28:30 +13:00
|
|
|
#!/usr/bin/env python3
|
2020-06-02 00:05:02 +12:00
|
|
|
|
2021-02-11 12:10:40 +13:00
|
|
|
import argparse
|
2020-06-02 00:05:02 +12:00
|
|
|
import logging
|
|
|
|
import sys
|
|
|
|
|
2021-02-11 12:10:40 +13:00
|
|
|
from bulkredditdownloader.downloader import RedditDownloader
|
2021-03-05 16:32:24 +13:00
|
|
|
from bulkredditdownloader.exceptions import BulkDownloaderException
|
2021-02-11 12:10:40 +13:00
|
|
|
|
|
|
|
logger = logging.getLogger()
|
|
|
|
parser = argparse.ArgumentParser(allow_abbrev=False,
|
2021-03-08 15:09:39 +13:00
|
|
|
description='This program downloads media from reddit posts')
|
2021-02-11 12:10:40 +13:00
|
|
|
|
|
|
|
|
|
|
|
def _add_options():
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('directory',
|
|
|
|
help='Specifies the directory where posts will be downloaded to',
|
|
|
|
metavar='DIRECTORY')
|
|
|
|
parser.add_argument('--verbose', '-v',
|
2021-03-08 15:32:08 +13:00
|
|
|
action='count',
|
|
|
|
default=0,
|
|
|
|
)
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--link', '-l',
|
|
|
|
help='Get posts from link',
|
2021-02-15 21:05:04 +13:00
|
|
|
action='append',
|
2021-03-08 15:09:39 +13:00
|
|
|
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',
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str)
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--multireddit',
|
|
|
|
help='Triggers multireddit mode and takes multireddit name',
|
|
|
|
metavar='MULTIREDDIT',
|
2021-03-01 19:41:31 +13:00
|
|
|
action='append',
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str)
|
2021-03-08 15:09:39 +13:00
|
|
|
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',
|
2021-03-01 19:41:31 +13:00
|
|
|
default=None,
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str)
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--search',
|
|
|
|
help='Searches for given query in given subreddits',
|
|
|
|
metavar='query',
|
2021-03-01 19:41:31 +13:00
|
|
|
default=None,
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str)
|
2021-03-08 15:09:39 +13:00
|
|
|
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',
|
2021-03-01 19:41:31 +13:00
|
|
|
default='hot',
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str)
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--limit',
|
|
|
|
help='default: unlimited',
|
|
|
|
metavar='Limit',
|
2021-02-15 16:55:33 +13:00
|
|
|
default=None,
|
2021-02-11 12:10:40 +13:00
|
|
|
type=int)
|
2021-03-08 15:09:39 +13:00
|
|
|
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',
|
2021-03-01 19:41:31 +13:00
|
|
|
default='all',
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str)
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--skip',
|
|
|
|
nargs='+',
|
|
|
|
help='Skip posts with given type',
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str,
|
|
|
|
default=[])
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--skip-domain',
|
|
|
|
nargs='+',
|
|
|
|
help='Skip posts with given domain',
|
2021-02-11 12:10:40 +13:00
|
|
|
type=str,
|
|
|
|
default=[])
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--set-folder-scheme',
|
|
|
|
action='store_true',
|
|
|
|
help='Set custom folderpath',
|
2021-02-11 12:10:40 +13:00
|
|
|
default='{SUBREDDIT}'
|
|
|
|
)
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--set-file-scheme',
|
|
|
|
action='store_true',
|
|
|
|
help='Set custom filename',
|
2021-02-11 12:10:40 +13:00
|
|
|
default='{REDDITOR}_{TITLE}_{POSTID}'
|
|
|
|
)
|
2021-03-08 15:09:39 +13:00
|
|
|
parser.add_argument('--no-dupes',
|
|
|
|
action='store_true',
|
|
|
|
help='Do not download duplicate posts on different subreddits',
|
2021-02-11 12:10:40 +13:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def _setup_logging(verbosity: int):
|
|
|
|
logger.setLevel(1)
|
|
|
|
stream = logging.StreamHandler(sys.stdout)
|
|
|
|
formatter = logging.Formatter('[%(asctime)s - %(name)s - %(levelname)s] - %(message)s')
|
|
|
|
stream.setFormatter(formatter)
|
|
|
|
logger.addHandler(stream)
|
|
|
|
if verbosity < 0:
|
|
|
|
stream.setLevel(logging.INFO)
|
2020-06-02 00:05:02 +12:00
|
|
|
else:
|
2021-02-11 12:10:40 +13:00
|
|
|
stream.setLevel(logging.DEBUG)
|
2020-06-02 00:05:02 +12:00
|
|
|
|
2021-02-11 12:10:40 +13:00
|
|
|
logging.getLogger('praw').setLevel(logging.CRITICAL)
|
|
|
|
logging.getLogger('prawcore').setLevel(logging.CRITICAL)
|
|
|
|
logging.getLogger('urllib3').setLevel(logging.CRITICAL)
|
2021-02-25 22:32:06 +13:00
|
|
|
|
2020-06-02 00:05:02 +12:00
|
|
|
|
2021-02-11 12:10:40 +13:00
|
|
|
def main(args: argparse.Namespace):
|
|
|
|
_setup_logging(args.verbose)
|
2020-06-02 00:05:02 +12:00
|
|
|
try:
|
2021-02-11 12:10:40 +13:00
|
|
|
reddit_downloader = RedditDownloader(args)
|
|
|
|
reddit_downloader.download()
|
|
|
|
except BulkDownloaderException as e:
|
|
|
|
logger.critical(f'An error occured {e}')
|
2021-02-25 22:32:06 +13:00
|
|
|
|
2020-06-02 00:05:02 +12:00
|
|
|
|
2021-02-11 12:10:40 +13:00
|
|
|
if __name__ == '__main__':
|
|
|
|
_add_options()
|
|
|
|
args = parser.parse_args()
|
|
|
|
main(args)
|