如何使用youtube_it gem在播放列表中获得超过25个项目

时间:2012-07-28 22:09:14

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

我正在尝试使用Youtube_it gem来提取视频列表并存储网址,但内置对象每次只给我25个项目。有没有人知道如何使用这个宝石来做到这一点?

代码如下所示:

playlist = client.playlist(playlist_id)
playlist.videos
puts playlist.videos.length

与此同时,我认为我需要进行自定义搜索才能完成此任务。我欢迎任何其他有用的建议和/或宝石。谢谢!

4 个答案:

答案 0 :(得分:2)

我对youtube_it不太熟悉,但听起来你回来的原因是结果是default maximum results可以在结果集中返回。基于help page of youtube_it,您是否尝试过设置参数max-results ...

$ client.videos_by(:query => "penguin", :max_results => 50)

请注意,max_results的数量在某些时候受到YouTube API本身的限制。

答案 1 :(得分:1)

好吧,我很确定你不再遇到这个问题,但我找到了解决办法,我只想分享它。

如果您拥有播放列表的ID,则可以执行以下操作

@xml = open("http://gdata.youtube.com/feeds/api/playlists/#{playlist_id}?max-results=50&start-index=1")
    @result = YouTubeIt::Parser::VideosFeedParser.new(@xml).parse_videos

在这个例子中,我只是检索了最多50个视频,但正如您所看到的,它很容易调整。

现在,@ result将成为一个包含视频对象的数组,因此您可以通过以下方式进行操作:

@result.each do |video|
end

有一个小bug,由于某种原因,unique_id属性是空的,但你可以得到它:

str1_markerstring = "/v/"
str2_markerstring = "&"
@result.each do |video|
   unique_id = video.embed_url[/#{str1_markerstring}(.*?)#{str2_markerstring}/m, 1]
end

我希望这可以帮助其他人解决与我相同的问题。

答案 2 :(得分:1)

在Uriel的回答基础上,我写了一个有用的方法fetch_all_videos_from_playlist

def fetch_videos_from_playlist(playlist_id, start_index = 1)
  xml = open("http://gdata.youtube.com/feeds/api/playlists/#{playlist_id}?max-results=50&start-index=#{start_index}")
  YouTubeIt::Parser::VideosFeedParser.new(xml).parse_videos
end

def fetch_all_videos_from_playlist(playlist_id)
  all_videos = []
  offset = 1
  while (videos = fetch_videos_from_playlist(playlist_id, offset)).length > 0
    all_videos += videos
    offset += videos.length
  end
  all_videos
end

它一次可以获取50个视频,这似乎是YouTube目前最大的支持。显然,播放列表最多可以容纳200个视频。因此,该方法最多可以进行4次抓取以获取所有视频。

答案 3 :(得分:0)

在youtube_it上找到此解决方案,在GitHub上发布:

playlists_first_page = @client.playlists('sbnation', {'start-index' => 1, 'max-results' => 25})
playlists_second_page = @client.playlists('sbnation', {'start-index' => 26, 'max-results' => 25})

来源:https://github.com/kylejginavan/youtube_it/issues/111