Example #1
0
def login():
	global _user, _logged_in
	if not settings.get('auth.refresh_token'):
		raise ConnectionError('Missing the Refresh Token from Reddit! Cannot auth.')
	stringutil.print_color('yellow', "Authenticating via OAuth...")
	_user = _reddit.user.me()
	stringutil.print_color('yellow', "Authenticated as [%s]\n" % _user.name)
	_logged_in = True
Example #2
0
def prompt_list(prompt, options, allow_none=False):
    """ Prompts for the user to select an option from the list, and returns the index.
	 	If *options* is an array of tuples, they are prompted with [1], and [0] is returned.
	"""
    if len(options) == 0:
        return None
    stringutil.print_color('cyan', prompt)
    is_tuple = isinstance(options[0], tuple)
    if not is_tuple:
        options = [(o, o) for o in options]
    if allow_none:
        options.append(('Cancel', None))
    for idx, opt in enumerate(options):
        print("\t%s: %s" % (idx + 1, opt[1]))
    select = number("Choose an option", 1, len(options), round_val=True) - 1
    return options[select][0]
Example #3
0
def run():
	logging.basicConfig(level=logging.WARN, format='%(levelname)-5.5s [%(name)s] %(message)s', datefmt='%H:%M:%S')
	su.print_color('green', "\r\n" +
		'====================================\r\n' +
		('   Reddit Media Downloader %s\r\n' % meta.current_version) +
		'====================================\r\n' +
		'    (By ShadowMoose @ Github)\r\n')
	if args.version:
		sys.exit(0)

	if args.run_tests:
		error_count = tests.runner.run_tests(test_subdir=args.run_tests)
		sys.exit(error_count)

	if args.list_settings:
		print('All valid overridable settings:')
		for _s in settings.get_all():
			if _s.public:
				print("%s.%s" % (_s.category, _s.name))
				print('\tDescription: %s' % _s.description)
				if not _s.opts:
					print('\tValid value: \n\t\tAny %s' % _s.type)
				else:
					print('\tValid values:')
					for o in _s.opts:
						print('\t\t"%s": %s' % o)
				print()
		sys.exit()

	settings_file = args.settings or fs.find_file('settings.json')
	_loaded = settings.load(settings_file)
	for ua in unknown_args:
		if '=' not in ua or '/comments/' in ua:
			if '/comments/' in ua:
				direct_sources.append(DirectURLSource(url=ua))
				continue
			elif 'r/' or 'u/' in ua:
				direct_sources.append(DirectInputSource(txt=ua, args={'limit': args.limit}))
				continue
			else:
				su.error("ERROR: Unkown argument: %s" % ua)
				sys.exit(1)
		k = ua.split('=')[0].strip('- ')
		v = ua.split('=', 2)[1].strip()
		try:
			settings.put(k, v, save_after=False)
		except KeyError:
			print('Unknown setting: %s' % k)
			sys.exit(50)

	if args.source:
		matched_sources = set()
		for s in args.source:
			for stt in settings.get_sources():
				if re.match(s, stt.get_alias()):
					matched_sources.add(stt)
		direct_sources.extend(matched_sources)

	first_time_auth = False

	if not _loaded and not direct_sources:  # First-time configuration.
		su.error('Could not find an existing settings file. A new one will be generated!')
		if not console.confirm('Would you like to start the WebUI to help set things up?', True):
			su.print_color('red', "If you don't open the webUI now, you'll need to edit the settings file yourself.")
			if console.confirm("Are you sure you'd like to edit settings without the UI (if 'yes', these prompts will not show again)?"):
				settings.put('interface.start_server', False, save_after=True)  # Creates a save.
				print('A settings file has been created for you, at "%s". Please customize it.' % settings_file)
				first_time_auth = True
			else:
				print('Please re-run RMD to configure again.')
				sys.exit(1)
		else:
			mode = console.prompt_list('How would you like to open the UI?',
									   settings.get('interface.browser', full_obj=True).opts)
			settings.put('interface.browser', mode, save_after=False)
			settings.put('interface.start_server', True)

	if args.authorize or first_time_auth:  # In-console oAuth authentication flow
		from static import praw_wrapper
		from urllib.parse import urlparse, parse_qs
		url = praw_wrapper.get_reddit_token_url()
		su.print_color('green', '\nTo manually authorize your account, visit the below URL.')
		su.print_color('yellow', 'Once there, authorize RMD, then copy the URL it redirects you to.')
		su.print_color('yellow', 'NOTE: The redirect page will likely not load, and that is ok.')
		su.print_color('cyan', '\n%s\n' % url)
		token_url = console.col_input('Paste the URL you are redirected to here: ')
		if token_url.strip():
			qs = parse_qs(urlparse(token_url).query)
			if 'state' not in qs or 'code' not in qs:
				su.error('The url provided was not a valid reddit redirect. Please make sure you copied it right!')
			elif qs['state'][0].strip() != settings.get('auth.oauth_key').strip():
				su.error('Invalid reddit redirect state. Please restart and try again.')
			else:
				code = qs['code'][0]
				su.print_color('green', 'Got code. Authorizing account...')
				refresh = praw_wrapper.get_refresh_token(code)
				if refresh:
					settings.put('auth.refresh_token', refresh)
					usr = praw_wrapper.get_current_username()
					su.print_color('cyan', 'Authorized to view account: %s' % usr)
					su.print_color('green', 'Saved authorization token! Please restart RMD to begin downloading!')
				else:
					su.error('Failed to gain an account access token from Reddit with that code. Please try again.')
		sys.exit(0)

	if not ffmpeg_download.install_local():
		print("RMD was unable to locate (or download) a working FFmpeg binary.")
		print("For downloading and post-processing, this is a required tool.")
		print("Please Install FFmpeg manually, or download it from here: https://rmd.page.link/ffmpeg")
		sys.exit(15)

	# Initialize Database
	sql.init_from_settings()
	print('Using manifest file [%s].' % sql.get_file_location())

	if direct_sources:
		settings.disable_saving()
		settings.put('processing.retry_failed', False)
		for s in settings.get_sources():
			settings.remove_source(s, save_after=False)
		for d in direct_sources:
			settings.add_source(d, prevent_duplicate=False, save_after=False)

	if settings.get('interface.start_server') and not direct_sources:
		print("Starting WebUI...")
		ui = WebUI()
	else:
		ui = TerminalUI()
	ui.display()
Example #4
0
def run():
    su.print_color(
        'green', "\r\n" + '====================================\r\n' +
        ('   Reddit Media Downloader %s\r\n' % meta.current_version) +
        '====================================\r\n' +
        '    (By ShadowMoose @ Github)\r\n')
    if args.version:
        sys.exit(0)

    if args.run_tests:
        error_count = tests.runner.run_tests(test_subdir=args.run_tests)
        sys.exit(error_count)

    if args.list_settings:
        print('All valid overridable settings:')
        for _s in settings.get_all():
            if _s.public:
                print("%s.%s" % (_s.category, _s.name))
                print('\tDescription: %s' % _s.description)
                if not _s.opts:
                    print('\tValid value: \n\t\tAny %s' % _s.type)
                else:
                    print('\tValid values:')
                    for o in _s.opts:
                        print('\t\t"%s": %s' % o)
                print()
        sys.exit()

    settings_file = args.settings or fs.find_file('settings.json')
    _loaded = settings.load(settings_file)
    for ua in unknown_args:
        if '=' not in ua:
            if 'r/' or 'u/' in ua:
                direct_sources.append(
                    DirectInputSource(txt=ua, args={'limit': args.limit}))
                continue
            else:
                su.error("ERROR: Unkown argument: %s" % ua)
                sys.exit(1)
        k = ua.split('=')[0].strip('- ')
        v = ua.split('=', 2)[1].strip()
        try:
            settings.put(k, v, save_after=False)
        except KeyError:
            print('Unknown setting: %s' % k)
            sys.exit(50)

    if args.source:
        matched_sources = set()
        for s in args.source:
            for stt in settings.get_sources():
                if re.match(s, stt.get_alias()):
                    matched_sources.add(stt)
        direct_sources.extend(matched_sources)

    if not ffmpeg_download.install_local():
        print(
            "RMD was unable to locate (or download) a working FFmpeg binary.")
        print("For downloading and post-processing, this is a required tool.")
        print(
            "Please Install FFmpeg manually, or download it from here: https://rmd.page.link/ffmpeg"
        )
        sys.exit(15)

    if not _loaded and not direct_sources:
        # First-time configuration.
        su.error(
            'Could not find an existing settings file. A new one will be generated!'
        )
        if not console.confirm(
                'Would you like to start the WebUI to help set things up?',
                True):
            su.print_color(
                'red',
                "If you don't open the webUI now, you'll need to edit the settings file yourself."
            )
            if console.confirm(
                    "Are you sure you'd like to edit settings without the UI (if 'yes', these prompts will not show again)?"
            ):
                settings.put('interface.start_server',
                             False)  # Creates a save.
                print(
                    'A settings file has been created for you, at "%s". Please customize it.'
                    % settings_file)
            else:
                print('Please re-run RMD to configure again.')
            sys.exit(1)
        else:
            mode = console.prompt_list(
                'How would you like to open the UI?',
                settings.get('interface.browser', full_obj=True).opts)
            settings.put('interface.browser', mode, save_after=False)
            settings.put('interface.start_server', True)

    # Initialize Database
    sql.init_from_settings()

    if direct_sources:
        settings.disable_saving()
        for s in settings.get_sources():
            settings.remove_source(s, save_after=False)
        for d in direct_sources:
            settings.add_source(d, prevent_duplicate=False, save_after=False)

    ui = None
    if settings.get('interface.start_server') and not direct_sources:
        print("Starting WebUI...")
        ui = WebUI()
    else:
        ui = TerminalUI()
    ui.display()
                    action="store_true")
parser.add_argument("--version",
                    '-v',
                    help="Print the current version and exit.",
                    action="store_true")
parser.add_argument("--run_tests",
                    help="Run the given test directory, or * for all.",
                    type=str,
                    metavar='',
                    default="")
args, unknown_args = parser.parse_known_args()

if __name__ == '__main__':
    su.print_color(
        'green', "\r\n" + '====================================\r\n' +
        ('   Reddit Media Downloader %s\r\n' % __version__) +
        '====================================\r\n' +
        '    (By ShadowMoose @ Github)\r\n')
    if args.version:
        sys.exit(0)

    if args.run_tests:
        error_count = tests.runner.run_tests(test_subdir=args.run_tests)
        sys.exit(error_count)

    if args.list_settings:
        print('All valid overridable settings:')
        for _s in settings.get_all():
            if _s.public:
                print("%s.%s" % (_s.category, _s.name))
                print('\tDescription: %s' % _s.description)
Example #6
0
def pause():
    """ Prompts the User to press any button to continue. """
    stringutil.print_color('green', '[Press Enter to continue]')
    input()
Example #7
0
def col_input(prompt, color=stringutil.Fore.LIGHTYELLOW_EX):
    """ Prints a colorized input prompt. """
    stringutil.print_color(color, prompt, end='')
    return input()
Example #8
0
	def test_print_color(self):
		""" All colors should print without throwing """
		for c in su._special_colors.keys():
			su.print_color(c, 'Test Color Print %s' % c)
Example #9
0
def col_input(prompt, color='yellow'):
    """ Prints a colorized input prompt. """
    stringutil.print_color(color, prompt, end='')
    return input()