ChatGPT中输入提示:
你是一个Python编程专家,写一个脚本,具体任务步骤如下:
循环接受用户输入的YouTube视频地址;
获取用户输入的YouTube视频地址(用户一次可能输入一个URL,也可能一次输入多个,确保能自动识别出多个不同的http地址);
如果这是单个视频,那么用yt-dlp库下载视频中的音频流,保存到文件夹:"F:\aivideo",格式为MP3;
如果这是一个列表,那么用yt-dlp库下载列表中所有视频的音频流(格式为MP3),保存到文件夹:"F:\aivideo"的子文件夹,子文件夹名称为列表名;
注意:
每一步都要输出信息到屏幕上;
Mp3的文件名在保存前要进行处理,去掉和Windows系统中符合命名规范的特殊字符;
ChatGPT给出的源代码:
import os
import re
import yt_dlp
# 定义保存目录
SAVE_DIR = "F:\\aivideo"
# 处理文件名中不允许的特殊字符
def sanitize_filename(filename):
return re.sub(r'[\\/*?:"<>|]', "", filename)
# 下载单个视频音频
def download_single_video(url):
try:
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': os.path.join(SAVE_DIR, '%(title)s.%(ext)s'),
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
'noplaylist': True
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=False)
video_title = sanitize_filename(info_dict.get('title', 'unknown'))
ydl_opts['outtmpl'] = os.path.join(SAVE_DIR, f'{video_title}.mp3')
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
print(f"正在下载单个视频音频: {video_title}")
ydl.download([url])
print(f"下载完成: {video_title}.mp3")
except Exception as e:
print(f"下载失败: {str(e)}")
# 下载播放列表中的音频
def download_playlist(url):
try:
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}]
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=False)
playlist_title = sanitize_filename(info_dict.get('title', 'unknown_playlist'))
playlist_dir = os.path.join(SAVE_DIR, playlist_title)
if not os.path.exists(playlist_dir):
os.makedirs(playlist_dir)
ydl_opts['outtmpl'] = os.path.join(playlist_dir, '%(title)s.%(ext)s')
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
print(f"正在下载播放列表: {playlist_title}")
ydl.download([url])
print(f"下载完成,音频保存在: {playlist_dir}")
except Exception as e:
print(f"下载失败: {str(e)}")
# 检测输入中的多个URL
def extract_urls(input_string):
# 正则表达式匹配URL
url_pattern = re.compile(r'https?://[^\s]+')
return url_pattern.findall(input_string)
# 循环接受用户输入
while True:
input_urls = input("请输入YouTube视频或播放列表地址(输入 'q' 退出):")
if input_urls.lower() == 'q':
break
urls = extract_urls(input_urls)