From 6393c9e187a05dced1ed2dec9df10341da6dc226 Mon Sep 17 00:00:00 2001 From: daviddoji Date: Thu, 25 Jan 2024 21:15:30 +0100 Subject: [PATCH] Refactoring --- youtube_api.py | 106 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/youtube_api.py b/youtube_api.py index b8932ff..de72f0d 100644 --- a/youtube_api.py +++ b/youtube_api.py @@ -6,6 +6,7 @@ import argparse import os +import re from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow @@ -29,27 +30,80 @@ def get_playlist_length(youtube, playlist_id): return playlist_info['items'][0]['contentDetails']['itemCount'] +def list_songs(youtube, channel_id): + max_results = 50 + request = youtube.playlistItems().list( + part="snippet,contentDetails", + maxResults=max_results, + playlistId=channel_id + ) + response = request.execute() + print() + + # Process the first page of results + for idx, item in enumerate(response['items'], start=1): + title = item['snippet']['title'] + print(f"{idx:02d} - {title}") + + # Continue making requests for additional pages using pageToken + new_starting = 51 + while 'nextPageToken' in response: + request = youtube.playlistItems().list( + part='snippet', + playlistId=channel_id, + maxResults=max_results, + pageToken=response['nextPageToken'] + ) + response = request.execute() + # Process the results for the additional pages + for idx, item in enumerate(response['items'], start=new_starting): + title = item['snippet']['title'] + print(f"{idx:02d} - {title}") + new_starting += 50 + +def add_song(youtube, channel_id, song): + pos = get_playlist_length(youtube, channel_id) + + request = youtube.playlistItems().insert( + part="snippet", + body={ + "snippet": { + "playlistId": channel_id, + "position": pos, + "resourceId": { + "kind": "youtube#video", + "videoId": song + } + } + } + ) + response = request.execute() + print("\nSong added successfully!") + + def main(): - import re - parser = argparse.ArgumentParser(description="Add a song to a YouTube playlist.") + parser = argparse.ArgumentParser(description="Manage YouTube playlist songs.") parser.add_argument("channel_name", help="Name of the YouTube channel") - parser.add_argument("song", help="Name of the song to be added") + parser.add_argument( + "--list", + action="store_true", + help="List all songs in the playlist" + ) + parser.add_argument( + "--add", + nargs=2, + metavar=("channel", "song"), + help="Add to the playlist a song" + ) args = parser.parse_args() - channel_name = args.channel_name - song = args.song - # this assumes a song is passed as in either of the following ways - # https://youtu.be/eEnyi9L6KP4 --> split by "/" - # https://youtube.com/watch?v=Ez-gizOF0Wo --> split by "=" - song = re.split(r"/|=", song)[-1] + channel_id = channels.get(channel_name) - if channel_name not in channels: + if not channel_id: print(f"Error: Channel '{channel_name}' not found.") return - channel_id = channels[channel_name] - # Disable OAuthlib's HTTPS verification when running locally. # *DO NOT* leave this option enabled in production. os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" @@ -66,23 +120,17 @@ def main(): api_service_name, api_version, credentials=credentials) - pos = get_playlist_length(youtube, channel_id) - - request = youtube.playlistItems().insert( - part="snippet", - body={ - "snippet": { - "playlistId": channel_id, - "position": pos, - "resourceId": { - "kind": "youtube#video", - "videoId": song - } - } - } - ) - response = request.execute() - print("Song added successfully!") + if args.list: + list_songs(youtube, channel_id) + elif args.add: + target_channel, song = args.add + # # this assumes a song is passed as in either of the following ways + # # https://youtu.be/eEnyi9L6KP4 --> split by "/" + # # https://youtube.com/watch?v=Ez-gizOF0Wo --> split by "=" + song = re.split(r"/|=", song)[-1] + add_song(youtube, channels.get(target_channel), song) + else: + print("Invalid command. Use --list or --add.") if __name__ == "__main__": main()