首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YouTube数据API:从Search.list结果集中排除livestreams

YouTube数据API:从Search.list结果集中排除livestreams
EN

Stack Overflow用户
提问于 2021-02-05 18:46:40
回答 2查看 555关注 0票数 1

今天我有一个(我认为)简单的问题。我希望将YouTube活动流排除在我的YouTube数据API Search.list结果集中。我怎么能这么做?我在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总是有LIVE的,也许这会有所帮助。我也尝试过使用q,但是我总是得到0的搜索结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-05 21:25:59

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

较长的答案如下:

给定的视频是一个活动流当且仅当该视频附加了属性liveStreamingDetails

我强烈建议阅读一个最新的answer of mine,它详细介绍了一个解决这个问题的解决方案,即函数get_non_livestream_videos

代码语言:javascript
复制
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))

如果您有一个视频If列表( video_ids ),则此函数调用Videos.list API端点来确定每个视频的属性liveStreamingDetails是否存在。任何具有这样一个属性的视频都会从视频ID的结果列表中过滤掉。

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

还请注意,使用get_non_livestream_videos的先决条件是它的list参数video_ids最多为50个元素。

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

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

注意,与已完成的实况广播相对应的视频也被排除在外。

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

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

(字符串)

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

对于video资源,值upcoming表示视频是尚未启动的实况广播,而live值表示视频是活动直播。对于channel资源,值upcoming表示频道的预定广播尚未启动,而live值表示频道具有活动直播。

因此,您可以手动地从Search.list中筛选出具有与none值不同的snippet.liveBroadcastContent的视频,如下所示:

代码语言:javascript
复制
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)

一个重要的注意事项:上面的解决方案很简单,但受到以下channelId请求参数Search.list的限制

(字符串)

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2022-06-10 01:55:56

我遇到了同样的问题,却找不到一个参数来过滤掉直播节目。

我在响应中只使用了duration属性。似乎广播持续时间具有const值P0D,而不是实际持续时间。我用它过滤掉我不想要的视频。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66068899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档