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®ionCode=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.list
的channelId
请求参数的如下规范:
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 个元素。
今天我有一个(我认为)简单的问题。
我想从我的 YouTube 数据 API Search.list
结果集中排除 YouTube 直播。
我怎样才能做到这一点?我在 API.
那是我试过的:
https://www.googleapis.com/youtube/v3/search?channelId=UCZMsvbAhhRblVGXmEXW8TSA&part=snippet,id&order=viewCount&maxResults=1®ionCode=DE&eventType=completed&type=video&publishedAfter=2021-02-05T00:00:00Z&key={KEY}
但这包括直播,我想将它们从搜索中删除。直播视频标题中总是 LIVE
,也许这有帮助。我也尝试使用 q
,但我总是得到 0 个搜索结果。
简短的回答如下:您必须手动过滤掉从 Search.list
API 端点获得的每个结果集中的直播视频。
较长的答案如下:
当且仅当该视频附加了 属性 liveStreamingDetails
.
我强烈建议阅读最近的一篇 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
orchannel
resource has live broadcast content. Valid property values areupcoming
,live
, andnone
.For a
video
resource, a value ofupcoming
indicates that the video is a live broadcast that has not yet started, while a value oflive
indicates that the video is an active live broadcast. For achannel
resource, a value ofupcoming
indicates that the channel has a scheduled broadcast that has not yet started, while a value oflive
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.list
的channelId
请求参数的如下规范:
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 thetype
parameter value tovideo
, but it does not also set one of theforContentOwner
,forDeveloper
, orforMine
filters.
因此,上面的分页循环在 Search.list
提供的结果集上将导致 videos
列表最多包含 500 个元素。