我知道如果直接获取特定视频,它可以获得持续时间 如果是搜索结果怎么办?
我很确定它会为我们提供视频标题,唯一ID和发布日期。
在我的下面的代码中,除非我将 contentDetails 放入第4行,否则不会发生任何错误。
当部分区域中有两个以上时,似乎会发生错误
如果我将其保留为:part => 'snippet',,一切正常。
但是我必须添加contentDetails以获取有关Youtube上视频持续时间的信息。
我怎样才能实现它?
videos_controller.rb
@search_response = client.execute!(
:api_method => youtube.search.list,
:parameters => {
:part => 'snippet, contentDetails',
:q => 'cats',
:maxResults => 20,
:order => 'date',
:pageToken => pageToken
}
)
错误
ActionView::Template::Error (undefined method `prev_page_token' for nil:NilClass):
1:
2: <% if !@search_response.prev_page_token.nil? %>
答案 0 :(得分:1)
问题是Search:list请求的part参数不占用contentDetails
。 Search:list请求中part参数的文档解释如下:
part参数指定一个或多个逗号分隔的列表 搜索API响应将包含的资源属性。设置 参数值为摘录。
请注意:
一个或多个搜索资源属性
但搜索资源不包含contentDetails
属性。所以我认为您可能会收到badRequest (400)
回复。
但您确实在视频资源的contentDetails
属性中获得了视频的持续时间。
<强>更新强>
好的,如果你决定使用Videos: list API,这样你就可以通过一个请求获得搜索结果中所有视频的contentDetails
,这是一种方法(I我假设请求得到了成功的回复:
# Get the search result like you did.
@search_response = client.execute!(
:api_method => youtube.search.list,
:parameters => {
:part => 'id',
:q => 'cats',
:maxResults => 20,
:order => 'date',
:pageToken => pageToken
}
)
# Extract the ids of only the videos in the search result and make
# a comma separated list. Note if there aren't any videos in the search
# result the ids will contain an empty string.
ids = @search_response.items.select do |item|
# You only want the 'videos'.
item.id.kind == 'youtube#video'
end.map do |video|
# Gets the video's id.
video.id.videoId
end.join(',')
# Now use it to get the list of videos with content details from
# Videos: list.
@videos = client.execute!(
:api_method => youtube.video.list,
:parameters => {
# Whatever you want from a Video resource.
:part => 'snippet, contentDetails',
:id => ids
}
)
请注意,这些视频对应于您在一次搜索中获得的视频(您在上面执行的视频),我不确定结果的顺序是否与搜索结果相同。我认为您现在可以使用@videos
来获取视频的详细信息,而不是使用@search_response
,但您必须依赖@search_response
来控制搜索参数,例如查询和分页。< / p>