diff --git a/get_channels.py b/get_channels.py index efb452a..51c7e41 100644 --- a/get_channels.py +++ b/get_channels.py @@ -34,6 +34,7 @@ https://developers.google.com/api-client-library/python/guide/aaa_client_secrets """.format(os.path.abspath(os.path.join(os.path.dirname(__file__), CLIENT_SECRETS_FILE))) + def retrieve_youtube_subscriptions(): # In order to retrieve the YouTube subscriptions for the current user, # the user needs to authenticate and authorize access to their YouTube @@ -45,24 +46,27 @@ def retrieve_youtube_subscriptions(): all_channels = [] next_page_token = '' - subscriptions_response = youtube_subscriptions(youtube_authorization, next_page_token) + subscriptions_response = youtube_subscriptions( + youtube_authorization, next_page_token) total_results = subscriptions_response['pageInfo']['totalResults'] results_per_page = subscriptions_response['pageInfo']['resultsPerPage'] total_iterations = math.ceil(total_results / results_per_page) for _ in track(range(total_iterations), description='Fetching subscriptions'): # retrieve the YouTube subscriptions for the authorized user - subscriptions_response = youtube_subscriptions(youtube_authorization, next_page_token) + subscriptions_response = youtube_subscriptions( + youtube_authorization, next_page_token) next_page_token = get_next_page(subscriptions_response) # extract the required subscription information channels = parse_youtube_subscriptions(subscriptions_response) # add the channels relieved to the main channel list all_channels.extend(channels) - + return all_channels except HttpError as err: - print("An HTTP error {} occurred:\n{}".format(err.resp.status, err.content)) + print("An HTTP error {} occurred:\n{}".format( + err.resp.status, err.content)) def get_authenticated_service(): @@ -92,8 +96,6 @@ def get_authenticated_service(): http=credentials.authorize(httplib2.Http())) -# Call youtube.subscriptions.list method -# to list the channels subscribed to. def youtube_subscriptions(youtube, next_page_token): subscriptions_response = youtube.subscriptions().list( part='snippet', @@ -120,8 +122,6 @@ def parse_youtube_subscriptions(subscriptions_response): # Add each result to the appropriate list for subscriptions_result in subscriptions_response.get("items", []): if subscriptions_result["snippet"]["resourceId"]["kind"] == "youtube#channel": - #channels.append("{} ({})".format(subscriptions_result["snippet"]["title"], - # subscriptions_result["snippet"]["resourceId"]["channelId"])) channels.append({ 'title': subscriptions_result["snippet"]["title"], 'id': subscriptions_result["snippet"]["resourceId"]["channelId"] diff --git a/main.py b/main.py index b131dcd..3a241ea 100644 --- a/main.py +++ b/main.py @@ -10,33 +10,35 @@ from get_channels import retrieve_youtube_subscriptions from print_logo import print_logo if platform.system() == 'Windows': - import msvcrt - def uni_getch(): - char = str(msvcrt.getch()) - if char == "b'y'": - return True - elif char == "b'n'": - return False - else: - return None + import msvcrt + + def uni_getch(): + char = str(msvcrt.getch()) + if char == "b'y'": + return True + elif char == "b'n'": + return False + else: + return None else: - from getch import getch - def uni_getch(): - char = getch() - if char == "y": - return True - elif char == "n": - return False - else: - return None + from getch import getch + + def uni_getch(): + char = getch() + if char == "y": + return True + elif char == "n": + return False + else: + return None parser = argparse.ArgumentParser() -parser.add_argument('-i', '--input', action='store', type=str, - help='Path to json file generated by previously running this program.') -parser.add_argument('-o', '--output', action='store', type=str, - help='Output folder.') -parser.add_argument('-a', '--all', action='store_true', - help='Download all subscriptions.') +parser.add_argument('-i', '--input', action='store', type=str, + help='Path to json file generated by previously running this program.') +parser.add_argument('-o', '--output', action='store', type=str, + help='Output folder.') +parser.add_argument('-a', '--all', action='store_true', + help='Download all subscriptions.') args = parser.parse_args() @@ -46,45 +48,50 @@ download_all = args.all c = Console() ydl_opts = { - 'format': 'best' + 'format': 'best' } print_logo() if json_input: - f = open(json_input, "r", encoding='utf-8') - all_channels = json.loads(f.read()) - f.close() + f = open(json_input, "r", encoding='utf-8') + all_channels = json.loads(f.read()) + f.close() else: - all_channels = retrieve_youtube_subscriptions() - curr_channel = 0 - c.print(f'You will be prompted if you want to download a channel for each of your subscriptions. (total {len(all_channels)})', style='bold') - for ch in all_channels: - if download_all: - ch['download'] = True - else: - curr_channel += 1 - c.print(f'[dim][{curr_channel}/{len(all_channels)}]:[/dim] {ch["title"]} [cyan]\[y/n]') - while True: - key = uni_getch() - if key == True: - ch['download'] = True - break - elif key == False: - ch['download'] = False - break - else: - c.print('Press "y" or "n"', style='yellow') + all_channels = retrieve_youtube_subscriptions() + curr_channel = 0 + c.print( + f'You will be prompted if you want to download a channel for each of your subscriptions. (total {len(all_channels)})', style='bold') + for ch in all_channels: + if download_all: + ch['download'] = True + else: + curr_channel += 1 + c.print( + f'[dim][{curr_channel}/{len(all_channels)}]:[/dim] {ch["title"]} [cyan]\[y/n]') + while True: + key = uni_getch() + if key == True: + ch['download'] = True + break + elif key == False: + ch['download'] = False + break + else: + c.print('Press "y" or "n"', style='yellow') - c.print('All done! 🎉') - c.print('Saving to download_list.json...', style='italic') - f = open("download_list.json", "w", encoding='utf-8') - f.write(json.dumps(all_channels)) - f.close() + c.print('All done! 🎉') + c.print('Saving to download_list.json...', style='italic') + f = open("download_list.json", "w", encoding='utf-8') + f.write(json.dumps(all_channels)) + f.close() for ch in all_channels: - if ch['download']: - ydl_opts['outtmpl'] = '{}/{}/%(title)s.%(ext)s'.format(output_dir, ch['title']) - with youtube_dl.YoutubeDL(ydl_opts) as ydl: - Path(os.path.join(output_dir, ch['title'])).mkdir(parents=True, exist_ok=True) - ydl.download(['https://www.youtube.com/channel/{}'.format(ch["id"])]) + if ch['download']: + ydl_opts['outtmpl'] = '{}/{}/%(title)s.%(ext)s'.format( + output_dir, ch['title']) + with youtube_dl.YoutubeDL(ydl_opts) as ydl: + Path(os.path.join(output_dir, ch['title'])).mkdir( + parents=True, exist_ok=True) + ydl.download( + ['https://www.youtube.com/channel/{}'.format(ch["id"])]) diff --git a/print_logo.py b/print_logo.py index a172ae0..23035be 100644 --- a/print_logo.py +++ b/print_logo.py @@ -1,11 +1,12 @@ from rich.console import Console c = Console() + def print_logo(): - c.print("""\ + c.print("""\ __ ______ __ __________ ______ ______ __________ __ \ \/ / __ \/ / / /_ __/ / / / __ )/ ____/ / ____/ __ \/ / \ / / / / / / / / / / / / / __ / __/______/ / / / / / / / / /_/ / /_/ / / / / /_/ / /_/ / /__/_____/ /___/ /_/ / /___ /_/\____/\____/ /_/ \____/_____/_____/ \____/_____/_____/ -""", style='magenta') \ No newline at end of file +""", style='magenta')