【问题标题】:Can I get duration of the videos from YouTuve API3.0 even if it's search result?即使是搜索结果,我也可以从 YouTube API3.0 获取视频的时长吗?
【发布时间】:2015-10-09 01:49:41
【问题描述】:

我知道如果直接获取特定视频,它可以获得持续时间。
如果是搜索结果呢?

我很确定它会为我们提供视频的标题、唯一 ID 和发布日期。

在下面的代码中,除非我将 contentDetails 放入第 4 行,否则不会发生任何错误。

似乎当part section超过两个时会发生错误。
如果我将其保留为 :part => 'sn-p',,则一切正常。
但是,我必须添加 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? %>

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 youtube youtube-api


    【解决方案1】:

    问题是 Search:list 请求的 part 参数不带contentDetails。 Search:list 请求中 part 参数的文档是这样解释的:

    part 参数指定一个或多个逗号分隔的列表 API 响应将包含的搜索资源属性。设置 参数值到sn-p。

    注意上面写着:

    一个或多个搜索资源属性

    但搜索资源不包含contentDetails 属性。所以我想你可能会收到badRequest (400) 的回复。

    但您确实在视频资源的 contentDetails 属性中获得了视频的持续时间。


    更新

    好的,如果您决定使用Videos: list API,那么您可以通过一个请求获得搜索结果中所有视频的contentDetails,这是一种方法(我假设请求获得成功响应):

    # 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 来控制查询和分页等搜索参数。

    【讨论】:

    • 非常感谢。所以我必须为每个视频请求 contentDetails 吗?太痛苦了,他们没有考虑到这种需求:(
    • 没问题:)。据我所知,您必须为每个视频都这样做是正确的。但我对 API 知之甚少,可能还有另一种方法可以做到这一点。我会读一读。或者,也许我认为您可以撤消答案接受并等待另一个答案,该答案也可以获取该答案。
    • @limrkin 谢谢!好的,那么让我们再等 1 天再得到另一个答案,之后我会让你的答案再次正确。还是谢谢你:)
    • 好的。顺便说一句,有这个 API:Video:list,它可以给你一个给定 id 列表的视频列表,它可以包含contentDetails,但它需要配额。它显然不支持搜索查询,但可以帮助你在 1 个请求中检索所有获取的视频的 contentDetails
    • 哦不,我的意思是您必须使用 Search:list 搜索视频,并使用 Videos:list 通过使用单个请求而不是发出请求来获取所有获取的视频的 contentDetails对于使用 Search:list 获取的每个视频。
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 2020-01-05
    • 1970-01-01
    • 2012-09-12
    • 2014-12-17
    • 2011-11-14
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多