求助:修改代码实现多站点(YouTube、Vimeo等)视频处理
嘿,我来帮你搞定这个多站点视频处理的需求!既然你不想导入youtube-dl库,咱们可以用Python的subprocess直接调用它的命令行工具,这样既避开了库导入,又能利用它对YouTube、Vimeo等站点的原生支持,还能复用你现有的逻辑。下面是具体的实现方案:
解决方案:通过命令行调用youtube-dl实现多站点视频处理
1. 封装通用的视频信息提取函数
首先咱们写一个可复用的函数,接收视频/频道URL,调用youtube-dl命令并解析结构化的输出——用--dump-json参数能直接拿到JSON格式的视频数据,刚好方便咱们后续处理:
import subprocess import json def extract_video_info(url): """调用youtube-dl提取视频信息,返回精简后的前10条结果""" try: # 执行youtube-dl命令,捕获输出 result = subprocess.run( ["youtube-dl", "--dump-json", url], capture_output=True, text=True, check=True ) # 解析多行JSON(频道/播放列表会返回多条结果) video_infos = [json.loads(line) for line in result.stdout.strip().split('\n') if line] # 复用你现有的shorten_list函数,只保留前10条 return shorten_list(video_infos) except subprocess.CalledProcessError as e: print(f"提取视频信息失败: {e.stderr}") return []
2. 整合到你的现有代码
把上面的函数和你已有的代码结合,在main函数里就可以统一处理不同站点的URL了:
import pymongo import get_media import configparser as ConfigParser import subprocess import json # 你原有的精简列表函数 def shorten_list(mylist): return mylist[:10] # 新增的视频信息提取函数 def extract_video_info(url): try: result = subprocess.run( ["youtube-dl", "--dump-json", url], capture_output=True, text=True, check=True ) video_infos = [json.loads(line) for line in result.stdout.strip().split('\n') if line] return shorten_list(video_infos) except subprocess.CalledProcessError as e: print(f"提取视频信息失败: {e.stderr}") return [] # 新增统一处理视频信息的函数(实现逻辑复用) def process_video_info(video_info): """把不同站点的视频信息转换成标准化结构""" return { "title": video_info.get("title"), "source_url": video_info.get("webpage_url"), "download_link": video_info.get("url"), "duration": video_info.get("duration"), "thumbnail": video_info.get("thumbnail"), "site": video_info.get("extractor") # 标记来源站点(youtube/vimeo等) } def main(): # 示例:处理YouTube和Vimeo频道 youtube_channel_url = "https://www.youtube.com/channel/YOUR_CHANNEL_ID" vimeo_channel_url = "http://vimeo.com/channels/YOUR-CHANNEL" # 提取两个站点的视频信息 youtube_videos = extract_video_info(youtube_channel_url) vimeo_videos = extract_video_info(vimeo_channel_url) # 统一处理成标准化格式(复用逻辑的核心) processed_youtube = [process_video_info(vid) for vid in youtube_videos] processed_vimeo = [process_video_info(vid) for vid in vimeo_videos] # 这里可以添加你原有的逻辑,比如存入MongoDB # client = pymongo.MongoClient() # db = client['video_database'] # db['youtube_videos'].insert_many(processed_youtube) # db['vimeo_videos'].insert_many(processed_vimeo) if __name__ == "__main__": main()
3. 关键思路说明
- 避免库导入:用
subprocess调用命令行,完全符合你不想导入youtube-dl库的要求 - 逻辑复用:youtube-dl返回的JSON结构在不同站点间有大量通用字段(比如标题、链接、时长),通过
process_video_info函数可以统一处理所有站点的结果,不用为每个站点单独写逻辑 - 多站点支持:youtube-dl原生支持上百个视频站点,你只需要传入对应URL,函数就能自动处理,不用额外修改提取逻辑
小提示
- 推荐用
yt-dlp替代youtube-dl(它是youtube-dl的活跃分支,更新更频繁,支持更多站点),命令格式和youtube-dl几乎一致,只需要把命令里的youtube-dl换成yt-dlp即可 - 如果需要下载视频,把命令改成
["youtube-dl", "-o", "保存路径/%(title)s.%(ext)s", url]就行
这样就能完美实现你的需求啦!
内容的提问来源于stack exchange,提问作者dsmith
相关产品推荐
相关产品推荐

