【问题标题】:YouTube Data API: Exclude livestreams from Search.list result setYouTube 数据 API:从 Search.list 结果集中排除直播
【发布时间】:2021-05-10 03:03:13
【问题描述】:

今天我有一个(我认为)简单的问题。 我想从我的 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 个搜索结果。

【问题讨论】:

    标签: google-api youtube-api youtube-data-api google-api-python-client


    【解决方案1】:

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

    更长的答案如下:

    当且仅当该视频附加了属性liveStreamingDetails时,该视频才是实时流。

    我强烈建议您阅读最近的 answer of mine,其中详细介绍了针对此问题的 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 返回最多包含 50 个项目的分页结果集。)


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

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

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

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

    snippet.liveBroadcastContent(字符串)

    videochannel 资源是否具有直播内容的指示。有效的属性值为upcominglivenone

    对于video资源,upcoming的值表示该视频是尚未开始的直播,而live的值表示该视频是一个活跃的直播。对于channel资源,upcoming的值表示该频道有一个尚未开始的预定广播,而live的值表示该频道有一个活跃的直播。

    因此,您可以手动从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(字符串)

    channelId 参数表示 API 响应应该只包含通道创建的资源。

    注意:如果您的请求指定了 channelId 参数的值并将 type 参数值设置为 video,则搜索结果将被限制为最多 500 个视频,但确实如此不要同时设置forContentOwnerforDeveloperforMine 过滤器之一。

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

    【讨论】:

      猜你喜欢
      • 2020-01-15
      • 2016-07-30
      • 2019-07-13
      • 2014-03-28
      • 2014-05-18
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多