From e3c51daa10356eacd6c4b5651ae0a6429208b757 Mon Sep 17 00:00:00 2001 From: Maks Snegov Date: Sat, 3 Feb 2024 12:52:40 -0800 Subject: [PATCH] Stop using plitem object in add/remove playlist items functions --- main.py | 69 +++++++++++++++++++++++++-------------------------------- 1 file changed, 30 insertions(+), 39 deletions(-) diff --git a/main.py b/main.py index 300abb1..a9ae88f 100755 --- a/main.py +++ b/main.py @@ -86,7 +86,7 @@ def get_playlist_name(playlist_id: str) -> str: if plid == playlist_id), playlist_id) -def list_playlist(yt_api, playlist_id): +def list_playlist(yt_api, playlist_id: str): playlist_name = get_playlist_name(playlist_id) videos = [] fetched = 0 @@ -114,14 +114,12 @@ def list_playlist(yt_api, playlist_id): return videos -def add_video_to_playlist(yt_api, video, playlist_id, +def add_video_to_playlist(yt_api, video_id: str, playlist_id: str, dry_run: bool = False) -> bool: playlist_name = get_playlist_name(playlist_id) - video_id = video['snippet']['resourceId']['videoId'] - video_title = _truncate_title(video['snippet']['title']) try: if dry_run: - print(f"Would add video '{video_title}' [{video_id}] to playlist {playlist_name}") + print(f"Would add video {video_id} to playlist {playlist_name}") return True yt_api.playlistItems().insert( part='snippet', @@ -135,33 +133,29 @@ def add_video_to_playlist(yt_api, video, playlist_id, } } ).execute() - print(f"Added video '{video_title}' [{video_id}] to playlist {playlist_name}") + print(f"Added video {video_id} to playlist {playlist_name}") return True except HttpError as e: exit_on_exceeded_quota(e) - print(f"Error adding video '{video_title}' [{video_id}] to playlist {playlist_name}: {e}") + print(f"Error adding video {video_id} to playlist {playlist_name}: {e}") return False -def remove_video_from_playlist(yt_api, video, playlist_id, +def remove_video_from_playlist(yt_api, plitem_id: str, playlist_id: str, dry_run: bool = False) -> bool: playlist_name = get_playlist_name(playlist_id) - video_id = video['snippet']['resourceId']['videoId'] - video_title = _truncate_title(video['snippet']['title']) try: if dry_run: - print(f"Would remove video '{video_title}' [{video_id}]" + print(f"Would remove playlist item {plitem_id}]" f" from playlist {playlist_name}") return True - yt_api.playlistItems().delete( - id=video['id'] - ).execute() - print(f"Removed video '{video_title}' [{video_id}]" + yt_api.playlistItems().delete(id=plitem_id).execute() + print(f"Removed playlist item {plitem_id}" f" from playlist {playlist_name}") return True except HttpError as e: exit_on_exceeded_quota(e) - print(f"Error removing video '{video_title}' [{video_id}]" + print(f"Error removing playlist item {plitem_id}" f" from playlist {playlist_name}: {e}") return False @@ -172,21 +166,21 @@ def copy_playlist_items(yt_api, delete_from_src: bool = False, limit: int = -1, dry_run: bool = False): - src_videos = list_playlist(yt_api, src_playlist) - dst_videos = list_playlist(yt_api, dst_playlist) + src_playlist_items = list_playlist(yt_api, src_playlist) + dst_playlist_items = list_playlist(yt_api, dst_playlist) if limit < 0: - limit = len(src_videos) + limit = len(src_playlist_items) - dst_video_map = {video['snippet']['resourceId']['videoId']: video['id'] - for video in dst_videos} + dst_videos = {pl_item['snippet']['resourceId']['videoId'] + for pl_item in dst_playlist_items} - for src_video in src_videos[:limit]: - video_id = src_video['snippet']['resourceId']['videoId'] - if video_id not in dst_video_map: - add_video_to_playlist(yt_api, src_video, dst_playlist, dry_run) + for src_pl_item in src_playlist_items[:limit]: + video_id = src_pl_item['snippet']['resourceId']['videoId'] + if video_id not in dst_videos: + add_video_to_playlist(yt_api, video_id, dst_playlist, dry_run) if delete_from_src: - remove_video_from_playlist(yt_api, src_video, src_playlist, dry_run) + remove_video_from_playlist(yt_api, src_pl_item["id"], src_playlist, dry_run) def get_video_info(youtube, video_id: str): @@ -265,21 +259,18 @@ def main(): if video_id in pl_videos: print(f'Video {video_id} already in playlist {args.playlist}') continue - video = get_video_info(youtube, video_id) - if video is None: - continue - add_video_to_playlist(youtube, video, playlist, args.dry_run) + add_video_to_playlist(youtube, video_id, playlist, args.dry_run) - elif args.command == 'dups': - playlist = get_playlist_id(args.playlist) - videos = list_playlist(youtube, playlist) - video_map = {} - for video in videos[:args.limit]: - video_id = video['snippet']['resourceId']['videoId'] - if video_id in video_map: - remove_video_from_playlist(youtube, video, playlist, args.dry_run) + elif args.command == "dups": + playlist_id = get_playlist_id(args.playlist) + plitems = list_playlist(youtube, playlist_id) + plitems_processed = set() + for plitem in plitems[:args.limit]: + video_id = plitem["snippet"]["resourceId"]["videoId"] + if video_id in plitems_processed: + remove_video_from_playlist(youtube, plitem["id"], playlist_id, args.dry_run) else: - video_map[video_id] = video + plitems_processed.add(video_id) if __name__ == '__main__':