我需要从我自己的youtube频道获取所有视频的id和标题。有些视频未列出,但我也想得到他们。我使用此版本的客户端库:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-youtube</artifactId>
<version>v3-rev222-1.25.0</version>
</dependency>
根据文档,我使用以下java代码:
YouTube.Search.List request = youtubeService.search()
.list("id,snippet");
SearchListResponse response = request.setChannelId(channelId)
.setForMine(true)
.setMaxResults(50L)
.setType("video")
.execute();
但有个例外:
400 Bad Request
GET https://www.googleapis.com/youtube/v3/search?channelId=channelId&forMine=true&maxResults=50&part=id,snippet&type=video
{
"code" : 400,
"errors" : [ {
"domain" : "youtube.search",
"location" : "parameters.",
"locationType" : "other",
"message" : "The request contains an invalid combination of search filters and/or restrictions. Note that you must set the <code>type</code> parameter to <code>video</code> if you set either the <code>forContentOwner</code> or <code>forMine</code> parameters to <code>true</code>. You must also set the <code>type</code> parameter to <code>video</code> if you set a value for the <code>eventType</code>, <code>videoCaption</code>, <code>videoCategoryId</code>, <code>videoDefinition</code>, <code>videoDimension</code>, <code>videoDuration</code>, <code>videoEmbeddable</code>, <code>videoLicense</code>, <code>videoSyndicated</code>, or <code>videoType</code> parameters.",
"reason" : "invalidSearchFilter"
} ],
"message" : "The request contains an invalid combination of search filters and/or restrictions. Note that you must set the <code>type</code> parameter to <code>video</code> if you set either the <code>forContentOwner</code> or <code>forMine</code> parameters to <code>true</code>. You must also set the <code>type</code> parameter to <code>video</code> if you set a value for the <code>eventType</code>, <code>videoCaption</code>, <code>videoCategoryId</code>, <code>videoDefinition</code>, <code>videoDimension</code>, <code>videoDuration</code>, <code>videoEmbeddable</code>, <code>videoLicense</code>, <code>videoSyndicated</code>, or <code>videoType</code> parameters."
}
此外,我在本页使用交互式工具时也遇到了同样的错误: https://developers.google.com/youtube/v3/docs/search/list?apix=true
.
如果我移除 .setForMine(true)
它工作正常,但不会给我未列出的视频(只给我公开视频)。
有没有可能通过api从我自己的频道获取所有视频的id和标题(包括未列出的视频)?
1条答案
按热度按时间x4shl7ld1#
对您的问题的简短回答是:确实,有一个api将提供您频道的所有视频元数据,包括未列出视频的元数据。
对于更长远的答案,请耐心听我说:
首先,请注意给定的视频具有以下类型的隐私状态:
status.privacyStatus
(字符串)视频的隐私状态。此属性的有效值为:
私有的
公众的
未上市
对于要获取由您的频道上载的所有视频的ID,无论其隐私状态如何,您都必须调用
PlaylistItems.list
使用参数查询的api终结点playlistId
设置为频道上传播放列表的id,同时发出oauth授权请求(即:向api传递有效的访问令牌;仅使用api密钥将使端点仅返回公共视频):现在
Videos.list
api端点将为您提供视频的所有元数据,这些视频的id由videoIdList
.注意,如果
videoIdList
大小不一N
在上面循环的开始处——因为id
的Videos.list
端点可以指定为以逗号分隔的视频ID列表--,循环代码减少了对Videos.list
终结点自N
至Math.floor(N / 50) + (N % 50 ? 1 : 0)
适当利用id
刚才提到的。上载播放列表id--
uploadsPlaylistId
--通过调用Channels.list
使用参数查询的终结点id
设置为频道的id,否则,使用参数查询mine
设置为true
:注意,上面我使用了
fields
参数,以便仅从api获取所需的信息。uploads playlist id将作为属性值在端点的json响应中找到:
items[0].contentDetails.relatedPlaylists.uploads
.转换为java后,这个属性路径将成为下面的getter链,以
getUploads
:channelResult.getItems().get(0).getContentDetails().getRelatedPlaylists().getUploads()
.请注意,对于给定的频道,您只需获取一次uploads playlist id,然后根据需要多次使用它。通常,频道id和它对应的上传播放列表id是通过
s/^UC([0-9a-zA-Z_-]{22})$/UU\1/
.对于上述api调用的几乎完整的实现(不包括填充列表的循环)
videoList
),我建议使用以下来自google的示例程序:MyUploads.java
. 构造列表的循环videoList
类似于GeolocationSearch.java
. 方法的实现Auth.authorize
将在Auth.java
.