Stop using plitem object in add/remove playlist items functions
This commit is contained in:
parent
739338e2d8
commit
e3c51daa10
69
main.py
69
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__':
|
||||
|
||||
Loading…
Reference in New Issue
Block a user