如何通过YouTube Data API排除归档直播,保留频道视频页的首映视频?
如何通过YouTube Data API区分频道Videos页面的首映视频与归档直播?
我需要匹配某频道公开的Videos标签内容,要求排除归档直播,但保留出现在/videos页面里的首映视频。以下两个公开视频可复现当前问题:
- IcZxVrRrzcM:属于/videos页面中的首映视频
- 6-qDqVXDZbY:属于未出现在/videos页面中的归档直播
最小可复现示例(MRE)
import requests YT_API_KEY: str = "" VIDEO_URL = "https://www.googleapis.com/youtube/v3/videos" for video_id in ["IcZxVrRrzcM", "6-qDqVXDZbY"]: resp = requests.get( VIDEO_URL, params={ "part": "snippet,liveStreamingDetails", "id": video_id, "key": YT_API_KEY, }, timeout=30, ).json() video = resp["items"][0] print( video_id, video["snippet"].get("liveBroadcastContent"), "liveStreamingDetails" in video, )
运行后返回结果:
IcZxVrRrzcM none True 6-qDqVXDZbY none True
可以看到,liveBroadcastContent和liveStreamingDetails字段无法区分这两类视频,但通过频道的/videos页面能明确识别它们的归属。
解决方案:利用频道的Upload播放列表匹配Videos页面内容
YouTube Data API v3没有直接标记某视频是否属于/videos页面的字段,但可以通过以下逻辑实现需求:
- 获取频道的Upload播放列表ID:每个频道的/videos页面对应的是该频道的「Upload」播放列表,调用
channels.list接口,指定part=contentDetails,即可拿到contentDetails.relatedPlaylists.uploads的值。 - 遍历Upload播放列表内容:调用
playlistItems.list接口,传入上述播放列表ID,获取的所有视频就是/videos页面展示的内容,自然排除了归档直播(归档直播默认归属于「Live」播放列表)。 - 验证单个视频归属:如果需要判断单个视频是否在/videos页面,可检查该视频ID是否存在于Upload播放列表的返回结果中。
示例代码(获取频道Upload播放列表并验证视频):
import requests YT_API_KEY: str = "" CHANNEL_URL = "https://www.googleapis.com/youtube/v3/channels" PLAYLIST_ITEMS_URL = "https://www.googleapis.com/youtube/v3/playlistItems" # 目标频道ID(从频道URL @LiquidZulu 可获取) CHANNEL_ID = "UCZuluV8rXjK-0h0xX8l7R5g" # 1. 获取频道的Upload播放列表ID resp_channel = requests.get( CHANNEL_URL, params={ "part": "contentDetails", "id": CHANNEL_ID, "key": YT_API_KEY, }, timeout=30 ).json() upload_playlist_id = resp_channel["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"] # 2. 获取Upload播放列表中的视频ID(这里只取前50个,可通过pageToken分页获取全部) resp_playlist = requests.get( PLAYLIST_ITEMS_URL, params={ "part": "contentDetails", "playlistId": upload_playlist_id, "maxResults": 50, "key": YT_API_KEY, }, timeout=30 ).json() uploaded_video_ids = [item["contentDetails"]["videoId"] for item in resp_playlist["items"]] # 3. 验证测试视频是否在/videos页面中 test_video_ids = ["IcZxVrRrzcM", "6-qDqVXDZbY"] for vid in test_video_ids: print(f"{vid}: {'在Videos页面中' if vid in uploaded_video_ids else '不在Videos页面中'}")
说明
首映视频本质是按直播形式发布的预录制内容,直播结束后liveBroadcastContent会变为none,同时保留liveStreamingDetails字段;归档直播结束后同样会有这些字段,因此无法通过单个视频的字段直接区分。而通过频道的Upload播放列表筛选,是最准确匹配/videos页面内容的方式。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

