我正在尝试使用 Youtube_it gem 来提取视频列表并存储 url,但内置对象每次最多只能给我 25 个项目。有谁知道如何使用这个宝石来做到这一点?
代码如下所示:
playlist = client.playlist(playlist_id)
playlist.videos
puts playlist.videos.length
同时,我认为我需要进行自定义搜索才能完成此操作。欢迎任何其他对我有用的建议和/或宝石。谢谢!
我正在尝试使用 Youtube_it gem 来提取视频列表并存储 url,但内置对象每次最多只能给我 25 个项目。有谁知道如何使用这个宝石来做到这一点?
代码如下所示:
playlist = client.playlist(playlist_id)
playlist.videos
puts playlist.videos.length
同时,我认为我需要进行自定义搜索才能完成此操作。欢迎任何其他对我有用的建议和/或宝石。谢谢!
我对 youtube_it 不太熟悉,但听起来您返回 25 个结果的原因是,这是可以在结果集中返回的默认最大结果。根据youtube_it 的帮助页面,您是否尝试过设置参数 max-results...
$ client.videos_by(:query => "penguin", :max_results => 50)
请注意,max_results 的数量有时会受到 YouTube API 本身的限制。
好吧,我很确定你不再遇到这个问题,但我找到了解决方案,我只想分享它。
如果您有播放列表的 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
有一个小错误,由于某种原因 unique_id 属性为空,但您可以通过以下方式获取它:
str1_markerstring = "/v/"
str2_markerstring = "&"
@result.each do |video|
unique_id = video.embed_url[/#{str1_markerstring}(.*?)#{str2_markerstring}/m, 1]
end
我希望这可以帮助与我有同样问题的其他人。
基于 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 次获取来获取所有视频。
在 GitHub 上的 youtube_it 问题中心找到了这个解决方案:
playlists_first_page = @client.playlists('sbnation', {'start-index' => 1, 'max-results' => 25})
playlists_second_page = @client.playlists('sbnation', {'start-index' => 26, 'max-results' => 25})