You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:修改代码实现多站点(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:29:32