问题描述
我正在使用YouTube数据的Search API v3提取视频。我可以使用下面提到的HTTPS GET
请求正确提取视频。但是,该API也会列出付费视频,例如ID为FKUvkKsTzV8
的视频。我想从获取中跳过。
我已经阅读过Search api文档,但无法识别仅获取免费视频(而非付费视频)的过滤器。
请建议我使用过滤器,以仅从Search API中获取免费视频(如果有)。
这是我的HTTPS GET
请求的网址:
https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=5&q=frozen&key=[My api key]&type=video&order=relevance
编辑了更多信息:
给定的视频是一个示例,仅在某些区域播放。因此,添加一些类似于上述视频的内容。我想从搜索结果中跳过这类视频。
https://www.youtube.com/watch?v=ZMWjixQbqXY
https://www.youtube.com/watch?v=Zat88Rsxp94
https://www.youtube.com/watch?v=2YQ9W0BP2Gw
下面提供了免费播放的视频
https://www.youtube.com/watch?v=7TavVZMewpY
解决方法
通过查看问题中提到的ID的视频附带的Videos resource
元数据,我们可以推断出您的问题可以按如下方式重新编写:
请使用
Search.list
API端点来搜索视频(根据需要使用参数q
),但请从端点提供的结果集中排除不允许在某些(给定)区域观看。
每个视频所附的Videos resource
确实包含指定上述特定条件的信息,即属性:
contentDetails.regionRestriction(对象)
regionRestriction
对象包含有关可观看(或不可观看)视频的国家/地区的信息。该对象将包含contentDetails.regionRestriction.allowed
属性或contentDetails.regionRestriction.blocked
属性。contentDetails.regionRestriction.allowed[](列表)
区域代码列表,用于标识可观看视频的国家/地区。如果存在此属性,但未在其值中列出一个国家/地区,则该视频将无法在该国家/地区播放。如果该属性存在并且包含一个空列表,那么该视频将在所有国家/地区被屏蔽。contentDetails.regionRestriction.blocked[](列表)
区域代码列表,用于标识视频被阻止的国家/地区。如果存在此媒体资源,但未在其值中列出一个国家/地区,则该视频可以在该国家/地区观看。如果该属性存在并且包含一个空列表,则该视频在所有国家/地区都可以观看。
不幸的是,一个无法为Search.list
端点明确指定 基于这些属性的过滤器。
尽管如此,您可以从Search.list
保留尽可能多的ID,然后查询Videos.list
API端点以获取这些属性的确切含义,目的是以编程方式过滤掉在您感兴趣的区域。
将调用Videos.list
端点的URL如下:
https://www.googleapis.com/youtube/v3/videos?key=$APP_KEY&id=$VIDEO_IDS&part=contentDetails,id&fields=items(id,contentDetails(regionRestriction))&maxResults=$VIDEO_COUNT
其中$APP_KEY
是您的API密钥,$VIDEO_IDS
是逗号分隔的视频ID列表,$VIDEO_COUNT
是$VIDEO_IDS
包含的视频ID数量。 (请注意,$VIDEO_COUNT
不能超过50
。)
请注意,以上URL使用参数fields
用于从端点仅获取实际使用的属性。 (最好只从API询问真正需要的信息。)
将$VIDEO_COUNT
设置为5
并将$VIDEO_IDS
设置为
FKUvkKsTzV8,ZMWjixQbqXY,Zat88Rsxp94,2YQ9W0BP2Gw,7TavVZMewpY
在上面的URL中,Videos.list
返回以下JSON文本:
{
"items": [
{
"id": "FKUvkKsTzV8","contentDetails": {
"regionRestriction": {
"allowed": [
"BE","NL"
]
}
}
},{
"id": "ZMWjixQbqXY","contentDetails": {
"regionRestriction": {
"allowed": [
"NL"
]
}
}
},{
"id": "Zat88Rsxp94",{
"id": "2YQ9W0BP2Gw","contentDetails": {
"regionRestriction": {
"allowed": [
"PE","KG","PA","PL","PH","TZ","TW","TH","TJ","TM","PY","KZ","GR","CY","GT","CZ","CV","CR","GA","CL","CO","CI","SN","SI","SK","SE","NP","KH","NI","ID","NO","NL","NA","NE","PT","BZ","BY","BW","BO","BJ","BF","BE","ZW","MU","MT","VE","EE","EC","IS","MD","RW","ML","AZ","ZM","LV","AR","AO","AM","TG","SG","DK","LT","UZ","UY","DO","HU","LA","HN","UG","LK","UA","FI","SV"
]
}
}
},{
"id": "7TavVZMewpY","contentDetails": {}
}
]
}
此响应表明,FKUvkKsTzV8
所标识的视频仅在NL
和BE
区域中可见,而7TavVZMewpY
所标识的视频根本没有区域限制(即可以在任何地方自由观看)。
现在,访问对象items[].contantDetails.regionRestriction
下的属性非常简单,以从过滤的结果集中中排除您感兴趣的区域内看不到的那些视频ID。
附录
不确定下面的内容会有所帮助,但是,尽管如此,我不得不提及Search.list
端点确实具有以下参数:
regionCode(字符串)
regionCode
参数指示API返回可以在指定国家/地区观看的视频的搜索结果。参数值为ISO 3166-1 alpha-2国家/地区代码。
以上官方规范并未指明regionCode
是否允许指定一组区域 ,否则,如何指定regionCode
该区域组所有地区。