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

如何通过YouTube Data API区分视频与离线直播内容?

区分YouTube普通视频与离线直播的方法

用Upload Playlist获取的条目里,resourceId.kind确实都会显示为youtube#video,要区分类型必须调用videos.list接口,通过返回的liveStreamingDetails和contentDetails字段判断:

  • 如果返回结果中存在liveStreamingDetails字段,说明该内容是直播相关:
    • 若包含actualEndTime,则是已结束的离线直播回放
    • 若只有actualStartTime无actualEndTime,是正在进行的直播
    • 若只有scheduledStartTime,结合时间判断:早于当前时间是已错过的预约直播,晚于当前时间是待开始的预约直播
  • 没有liveStreamingDetails字段的,就是普通视频

另外可以辅助查看contentDetails.duration:直播回放时长通常较长,但这不是绝对标准,优先以liveStreamingDetails为准。

修正后的Python代码

你的代码里存在请求URL的错误(视频详情请求用了播放列表的URL),以下是修复并添加类型判断的版本:

import pandas as pd
import requests
from datetime import datetime

channel = 'UC192SEGl9dAng9GwredMSww'
api_key = '...'
# 用列表存储数据,比循环调用pd.concat效率更高
video_data = []

playlist_id = channel[:1] + 'U' + channel[2:]

# 请求播放列表条目
playlist_url = f'https://youtube.googleapis.com/youtube/v3/playlistItems?part=snippet,status&playlistId={playlist_id}&maxResults=50&key={api_key}'
playlist_response = requests.get(playlist_url).json()

for item in playlist_response['items']:
    channel_id = item['snippet']['channelId']
    video_id = item['snippet']['resourceId']['videoId']
    published_date = item['snippet']['publishedAt']
    video_title = item['snippet']['title']
    
    # 请求视频详情,只获取需要的字段减少数据量
    video_url = f'https://youtube.googleapis.com/youtube/v3/videos?part=status,contentDetails,liveStreamingDetails&id={video_id}&key={api_key}'
    video_response = requests.get(video_url).json()
    
    # 判断视频类型
    vid_type = '普通视频'
    video_info = video_response['items'][0]
    if 'liveStreamingDetails' in video_info:
        live_details = video_info['liveStreamingDetails']
        if 'actualEndTime' in live_details:
            vid_type = '离线直播回放'
        elif 'actualStartTime' in live_details:
            vid_type = '正在直播'
        elif 'scheduledStartTime' in live_details:
            scheduled_time = datetime.fromisoformat(live_details['scheduledStartTime'].replace('Z', '+00:00'))
            vid_type = '已错过的预约直播' if scheduled_time <= datetime.utcnow() else '预约直播'
    
    video_data.append({
        'channel_id': channel_id,
        'video_id': video_id,
        'video_title': video_title,
        'published_date': published_date,
        'type': vid_type
    })

# 转换为DataFrame
df = pd.DataFrame(video_data)
print(df)

说明

  1. 改用列表存储数据,避免循环中频繁拼接DataFrame的性能损耗
  2. 修复了原代码中视频详情请求URL的错误
  3. 通过liveStreamingDetails的具体字段,精准区分直播的不同状态
  4. 加入时间判断,细化预约直播的状态分类

内容的提问来源于stack exchange,提问作者Aaron Philipp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:25:23