如何仅从YouTube搜索APIV3获取免费视频?

问题描述

我正在使用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所标识的视频仅在NLBE区域中可见,而7TavVZMewpY所标识的视频根本没有区域限制(即可以在任何地方自由观看)。

现在,访问对象items[].contantDetails.regionRestriction下的属性非常简单,以从过滤的结果集中中排除您感兴趣的区域内看不到的那些视频ID。


附录

不确定下面的内容会有所帮助,但是,尽管如此,我不得不提及Search.list端点确实具有以下参数:

regionCode(字符串)
regionCode参数指示API返回可以在指定国家/地区观看的视频的搜索结果。参数值为ISO 3166-1 alpha-2国家/地区代码。

以上官方规范并未指明regionCode是否允许指定一组区域 ,否则,如何指定regionCode该区域组所有地区。