import os
import yt_dlp
def remove_playlist_title_from_filename(d):
if d['status'] == 'finished':
filename = d['filename']
playlist_title = d.get('info_dict', {}).get('playlist_title', '')
if playlist_title and filename:
basename = os.path.basename(filename)
dirname = os.path.dirname(filename)
if basename.startswith(playlist_title + ' - '):
new_basename = basename[len(playlist_title) + 3:]
new_filename = os.path.join(dirname, new_basename)
os.rename(filename, new_filename)
print(f"已重命名: {filename} -> {new_filename}")
def download_bilibili(url, output_dir="downloads"):
ydl_opts = {
'outtmpl': os.path.join(output_dir, '%(playlist_title)s', '%(title)s.%(ext)s'),
'format': 'bestvideo+bestaudio/best',
'merge_output_format': 'mp4',
'noplaylist': False,
'concurrent_fragment_downloads': 4,
'continue_dl': True,
'progress_hooks': [remove_playlist_title_from_filename],
}
os.makedirs(output_dir, exist_ok=True)
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
if __name__ == "__main__":
url = input("请输入哔哩哔哩视频或合集链接:")
download_bilibili(url)
print("下载完成!")