YouTube 数据 API:从 Search.list 结果集中排除直播

YouTube Data API: Exclude livestreams from Search.list result set

今天我有一个(我认为)简单的问题。 我想从我的 YouTube 数据 API Search.list 结果集中排除 YouTube 直播。 我怎样才能做到这一点?我在 API.

的文档中找不到执行该操作的函数

那是我试过的:

https://www.googleapis.com/youtube/v3/search?channelId=UCZMsvbAhhRblVGXmEXW8TSA&part=snippet,id&order=viewCount&maxResults=1&regionCode=DE&eventType=completed&type=video&publishedAfter=2021-02-05T00:00:00Z&key={KEY}

但这包括直播,我想将它们从搜索中删除。直播视频标题中总是 LIVE,也许这有帮助。我也尝试使用 q,但我总是得到 0 个搜索结果。

简短的回答如下:您必须手动过滤掉从 Search.list API 端点获得的每个结果集中的直播视频。

较长的答案如下:

当且仅当该视频附加了 属性 liveStreamingDetails.

时,给定视频才是直播流

我强烈建议阅读最近的一篇 ,其中详细介绍了针对此问题的 Python 解决方案,函数 get_non_livestream_videos:

def get_non_livestream_videos(youtube, video_ids):
    assert len(video_ids) <= 50
    if not video_ids: return []

    response = youtube.videos().list(
        fields = 'items(id,liveStreamingDetails)',
        part = 'id,liveStreamingDetails',
        maxResults = len(video_ids),
        id = ','.join(video_ids),
    ).execute()

    items = response.get('items', [])
    assert len(items) <= len(video_ids)

    not_live = lambda video: \
        not video.get('liveStreamingDetails')
    video_id = lambda video: video['id']

    return map(video_id, filter(not_live, items))

如果您有视频 ID 列表 video_ids,则此函数调用 Videos.list API 端点以确定 属性 liveStreamingDetails 的存在] 对于每个相应的视频。任何具有此类 属性 的视频都会从生成的视频 ID 列表中过滤掉。

请注意,上面我使用 fields 请求参数从 API 中仅获取实际需要的信息。

另请注意,使用 get_non_livestream_videos 的前提条件是其列表参数 video_ids 最多包含 50 个元素。

这并不是使用此函数时的实际限制,因为它应该用于从分页 API 结果集中获得的视频 ID 列表。 (Search.list returns 最多 50 个项目的分页结果集。)


上述解决方案从视频 ID 列表中排除了所有即将上映直播已完成直播 次广播。

请注意,已完成的直播对应的视频也被排除在外。

现在,如果您不希望将这些类型的视频从您的结果集中排除(即您需要排除仅与即将播出或当前直播对应的视频),那么有一个更简单的解决方案您的查询:

Search.list 端点返回的 Search resource 对象提供以下 属性:

snippet.liveBroadcastContent (string)

An indication of whether a video or channel resource has live broadcast content. Valid property values are upcoming, live, and none.

For a video resource, a value of upcoming indicates that the video is a live broadcast that has not yet started, while a value of live indicates that the video is an active live broadcast. For a channel resource, a value of upcoming indicates that the channel has a scheduled broadcast that has not yet started, while a value of live indicates that the channel has an active live broadcast.

因此,您可以从 Search.list 查询中手动过滤出 snippet.liveBroadcastContent 值不同于 none 的视频,如下所示:

not_live = lambda item: \
    item['snippet']['liveBroadcastContent'] == 'none'

request = youtube.search().list(
    fields = 'nextPageToken,items(id,snippet)',
    publishedAfter = '2021-02-05T00:00:00Z',
    channelId = 'UCZMsvbAhhRblVGXmEXW8TSA',
    part = 'id,snippet',
    order = 'viewCount',
    regionCode = 'DE',
    maxResults = 50,
    type = 'video'
)
videos = []

while request:
    response = request.execute()
    items = response.get('items', [])
    videos.extend(filter(not_live, items))
    request = youtube.search().list_next(
        request, response)

重要说明:上面的解决方案很简单,但是受限于Search.listchannelId请求参数的如下规范:

channelId (string)

The channelId parameter indicates that the API response should only contain resources created by the channel.

Note: Search results are constrained to a maximum of 500 videos if your request specifies a value for the channelId parameter and sets the type parameter value to video, but it does not also set one of the forContentOwner, forDeveloper, or forMine filters.

因此,上面的分页循环在 Search.list 提供的结果集上将导致 videos 列表最多包含 500 个元素。