如何通过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)
说明
- 改用列表存储数据,避免循环中频繁拼接DataFrame的性能损耗
- 修复了原代码中视频详情请求URL的错误
- 通过
liveStreamingDetails的具体字段,精准区分直播的不同状态 - 加入时间判断,细化预约直播的状态分类
内容的提问来源于stack exchange,提问作者Aaron Philipp
相关产品推荐
相关产品推荐

