youtube_search 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- youtube_search (0.1.6)
4
+ youtube_search (0.1.7)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
- require "bundler"
2
- Bundler::GemHelper.install_tasks
1
+ require "bundler/setup"
2
+ require "bundler/gem_tasks"
3
3
 
4
4
  task :default do
5
5
  sh "rspec spec/"
@@ -32,4 +32,4 @@ task :update_fixtures do
32
32
  id = "5F23DAF4BFE3D14C"
33
33
  xml = open("http://gdata.youtube.com/feeds/api/playlists/#{id}?v=2").read
34
34
  File.open("spec/fixtures/playlist_#{id}.xml","w"){|f| f.write xml }
35
- end
35
+ end
data/Readme.md CHANGED
@@ -22,6 +22,7 @@ Usage
22
22
  "content"=>"Top YouTube Videos on ...",
23
23
  "updated"=>"2011-10-13T20:20:54.000Z",
24
24
  "raw" => <REXML::Element ... >,
25
+ "embeddable" => true,
25
26
  ...
26
27
  }
27
28
 
@@ -39,6 +40,9 @@ and [standard youtube options](http://code.google.com/apis/youtube/2.0/developer
39
40
  id = YoutubeSearch.search('lolcats').first['video_id']
40
41
  %{<iframe src="http://www.youtube.com/embed/#{id}" width=640 height=480 frameborder=0></iframe>}
41
42
 
43
+ ### Searching playlists
44
+ YoutubeSearch.search_playlists('cats').first
45
+
42
46
  ### Retrieve videos by playlist ID
43
47
 
44
48
  videos = YoutubeSearch.playlist_videos('5F23DAF4BFE3D14C')
@@ -3,69 +3,79 @@ require 'cgi'
3
3
  require 'open-uri'
4
4
 
5
5
  module YoutubeSearch
6
- def self.search(query, options={})
7
- options = options_with_per_page_and_page(options)
8
- query = options.merge(:q => query).map{|k,v| "#{CGI.escape k.to_s}=#{CGI.escape v.to_s}" }.join('&')
9
- xml = open("http://gdata.youtube.com/feeds/api/videos?#{query}").read
10
- parse(xml)
11
- end
6
+ class << self
7
+ def search_page(page, query, options={})
8
+ options = options_with_per_page_and_page(options)
9
+ query = options.merge(:q => query).map{|k,v| "#{CGI.escape k.to_s}=#{CGI.escape v.to_s}" }.join('&')
10
+ xml = open("#{page}?#{query}").read
11
+ parse(xml)
12
+ end
12
13
 
13
- def self.playlist_videos(playlist_id)
14
- playlist_id = playlist_id.sub(/^PL/, "")
15
- xml = open("http://gdata.youtube.com/feeds/api/playlists/#{playlist_id}?v=2").read
16
- parse(xml, :type => :playlist)
17
- end
14
+ def search(query, options={})
15
+ search_page("http://gdata.youtube.com/feeds/api/videos", query, options)
16
+ end
18
17
 
19
- def self.parse(xml, options={})
20
- elements_in(xml, 'feed/entry').map do |element|
21
- entry = xml_to_hash(element)
22
- entry['video_id'] = if options[:type] == :playlist
23
- element.elements['*/yt:videoid'].text
24
- else
25
- entry['id'].split('/').last
26
- end
18
+ def search_playlists(query, options={})
19
+ search_page("https://gdata.youtube.com/feeds/api/playlists/snippets", query, options.merge(:v => 2))
20
+ end
27
21
 
28
- duration = element.elements['*/yt:duration']
29
- entry['duration'] = duration.attributes['seconds'] if duration
22
+ def playlist_videos(playlist_id)
23
+ playlist_id = playlist_id.sub(/^PL/, "")
24
+ xml = open("http://gdata.youtube.com/feeds/api/playlists/#{playlist_id}?v=2").read
25
+ parse(xml, :type => :playlist)
26
+ end
30
27
 
31
- no_embed = element.elements['yt:noembed'] || element.elements['yt:private']
32
- entry['embeddable'] = !(no_embed)
28
+ def parse(xml, options={})
29
+ elements_in(xml, 'feed/entry').map do |element|
30
+ entry = xml_to_hash(element)
31
+ entry['video_id'] = if options[:type] == :playlist
32
+ element.elements['*/yt:videoid'].text
33
+ else
34
+ entry['id'].split('/').last
35
+ end
33
36
 
34
- entry['raw'] = element
37
+ duration = element.elements['*/yt:duration']
38
+ entry['duration'] = duration.attributes['seconds'] if duration
35
39
 
36
- entry
37
- end
38
- end
40
+ no_embed = element.elements['yt:noembed'] || element.elements['yt:private']
41
+ entry['embeddable'] = !(no_embed)
39
42
 
40
- private
43
+ entry['raw'] = element
41
44
 
42
- def self.elements_in(xml, selector)
43
- entries = []
44
- doc = REXML::Document.new(xml)
45
- doc.elements.each(selector) do |element|
46
- entries << element
45
+ entry
46
+ end
47
47
  end
48
- entries
49
- end
50
48
 
51
- def self.xml_to_hash(element)
52
- Hash[element.children.map do |child|
53
- [child.name, child.text]
54
- end]
55
- end
49
+ private
56
50
 
57
- def self.options_with_per_page_and_page(options)
58
- options = options.dup
59
- if per_page = options.delete(:per_page)
60
- options['max-results'] = per_page
61
- else
62
- per_page = options['max-results']
51
+ def elements_in(xml, selector)
52
+ entries = []
53
+ doc = REXML::Document.new(xml)
54
+ doc.elements.each(selector) do |element|
55
+ entries << element
56
+ end
57
+ entries
63
58
  end
64
59
 
65
- if per_page and page = options.delete(:page)
66
- options['start-index'] = per_page.to_i * ([page.to_i, 1].max - 1)
60
+ def xml_to_hash(element)
61
+ Hash[element.children.map do |child|
62
+ [child.name, child.text]
63
+ end]
67
64
  end
68
65
 
69
- options
66
+ def options_with_per_page_and_page(options)
67
+ options = options.dup
68
+ if per_page = options.delete(:per_page)
69
+ options['max-results'] = per_page
70
+ else
71
+ per_page = options['max-results']
72
+ end
73
+
74
+ if per_page and page = options.delete(:page)
75
+ options['start-index'] = per_page.to_i * ([page.to_i, 1].max - 1)
76
+ end
77
+
78
+ options
79
+ end
70
80
  end
71
81
  end
@@ -1,3 +1,3 @@
1
1
  module YoutubeSearch
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007' gd:etag='W/&quot;CEIDR3c6fip7I2A9WhNTGUk.&quot;'><id>tag:youtube.com,2008:playlists:snippets</id><updated>2012-10-22T21:49:36.916Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>YouTube Playlists matching query: GoogleDevelopers</title><logo>http://www.youtube.com/img/pic_youtubelogo_123x63.gif</logo><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets?v=2'/><link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/batch?v=2'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets?q=GoogleDevelopers&amp;start-index=11&amp;max-results=10&amp;v=2'/><link rel='service' type='application/atomsvc+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets?alt=atom-service&amp;v=2'/><link rel='previous' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets?q=GoogleDevelopers&amp;start-index=1&amp;max-results=10&amp;v=2'/><link rel='next' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets?q=GoogleDevelopers&amp;start-index=21&amp;max-results=10&amp;v=2'/><author><name>YouTube</name><uri>http://www.youtube.com/</uri></author><generator version='2.1' uri='http://gdata.youtube.com'>YouTube data API</generator><openSearch:totalResults>6416</openSearch:totalResults><openSearch:startIndex>11</openSearch:startIndex><openSearch:itemsPerPage>10</openSearch:itemsPerPage><entry gd:etag='W/&quot;D0UHRn47eCp7I2A9WhJWF08.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PLB09682344C2F233B</id><published>2010-05-21T05:05:09.000Z</published><updated>2012-08-23T12:33:57.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>Google I/O 2010: Google TV Keynote, Day 2</title><summary/><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PLB09682344C2F233B?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/googledevelopers?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PLB09682344C2F233B'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PLB09682344C2F233B?v=2'/><author><name>GoogleDevelopers</name><uri>https://gdata.youtube.com/feeds/api/users/GoogleDevelopers</uri><yt:userId>_x5XG1OV2P6uZZ5FSM9Ttw</yt:userId></author><yt:countHint>10</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/ASZbArr7vdI/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/ASZbArr7vdI/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/ASZbArr7vdI/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PLB09682344C2F233B</yt:playlistId></entry><entry gd:etag='W/&quot;CkMNRX47eCp7I2A9WhNTFEw.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PL25BD62C6275E88F6</id><published>2012-08-23T16:36:50.000Z</published><updated>2012-10-16T18:01:34.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>Google Maps Developers Office Hours</title><summary/><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PL25BD62C6275E88F6?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/googledevelopers?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PL25BD62C6275E88F6'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PL25BD62C6275E88F6?v=2'/><author><name>GoogleDevelopers</name><uri>https://gdata.youtube.com/feeds/api/users/GoogleDevelopers</uri><yt:userId>_x5XG1OV2P6uZZ5FSM9Ttw</yt:userId></author><yt:countHint>19</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/ufOXzbUaUqM/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/ufOXzbUaUqM/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/ufOXzbUaUqM/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PL25BD62C6275E88F6</yt:playlistId></entry><entry gd:etag='W/&quot;D0UHRn47eCp7I2A9WhJWF08.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PL984E049E7F182FCF</id><published>2008-12-09T21:46:18.000Z</published><updated>2012-08-23T12:33:57.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='google'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='web'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='toolkit'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='developers'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='gwt'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='scenechronize'/><title>Google Web Toolkit Developers - Scenechronize</title><summary/><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PL984E049E7F182FCF?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/googledevelopers?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PL984E049E7F182FCF'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PL984E049E7F182FCF?v=2'/><author><name>GoogleDevelopers</name><uri>https://gdata.youtube.com/feeds/api/users/GoogleDevelopers</uri><yt:userId>_x5XG1OV2P6uZZ5FSM9Ttw</yt:userId></author><yt:countHint>3</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/2gqDsi8zRt4/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/2gqDsi8zRt4/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/2gqDsi8zRt4/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PL984E049E7F182FCF</yt:playlistId></entry><entry gd:etag='W/&quot;CkAMRX47eCp7I2A9Wx9SFk0.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PL8DEF2598B15EFB77</id><published>2007-09-14T20:57:44.000Z</published><updated>2010-12-06T01:59:44.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='google'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='developer'/><title>Google Developers' Day</title><summary>Presentations from Googles' Developers Days</summary><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PL8DEF2598B15EFB77?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/bragadocchio?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PL8DEF2598B15EFB77'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PL8DEF2598B15EFB77?v=2'/><author><name>Bill Slawski</name><uri>https://gdata.youtube.com/feeds/api/users/bragadocchio</uri><yt:userId>2yHp3FdmEhUk_FgbpNnfvw</yt:userId></author><yt:countHint>13</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/nU8DcBF-qo4/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/nU8DcBF-qo4/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/nU8DcBF-qo4/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PL8DEF2598B15EFB77</yt:playlistId></entry><entry gd:etag='W/&quot;Dk4NSH47eCp7I2A9WhJSGU0.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PLA48C6EB915B66F8D</id><published>2012-07-10T07:23:16.000Z</published><updated>2012-07-10T07:23:19.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>Google Developers</title><summary>All About Google in the Future</summary><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PLA48C6EB915B66F8D?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/stylishhughes?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PLA48C6EB915B66F8D'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PLA48C6EB915B66F8D?v=2'/><author><name>Samuel Hughes Mensah</name><uri>https://gdata.youtube.com/feeds/api/users/stylishhughes</uri><yt:userId>vMYdnplOpcXhN5MA4ob40A</yt:userId></author><yt:countHint>94</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/lz0o-y-2wT0/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/lz0o-y-2wT0/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/lz0o-y-2wT0/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PLA48C6EB915B66F8D</yt:playlistId></entry><entry gd:etag='W/&quot;CkQGQX47eCp7I2A9WhJTEkk.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PL9B5858F8394F07D0</id><published>2012-05-05T09:33:35.000Z</published><updated>2012-06-21T00:58:40.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>Google Developers</title><summary/><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PL9B5858F8394F07D0?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/ice0812?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PL9B5858F8394F07D0'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PL9B5858F8394F07D0?v=2'/><author><name>joe newlon</name><uri>https://gdata.youtube.com/feeds/api/users/ice0812</uri><yt:userId>9D19bJ-0Xx9_X5uWbMU-mw</yt:userId></author><yt:countHint>72</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/BV1fVSR5J4M/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/BV1fVSR5J4M/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/BV1fVSR5J4M/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PL9B5858F8394F07D0</yt:playlistId></entry><entry gd:etag='W/&quot;AkAHRn47eCp7I2A9WhJbFEQ.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PLs7WEeL7y8wf1W10Im5luCnp64adzM3u-</id><published>2012-09-24T14:58:57.000Z</published><updated>2012-09-24T14:58:57.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>YouTube from GoogleDevelopers</title><summary/><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PLs7WEeL7y8wf1W10Im5luCnp64adzM3u-?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/theblasfable?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PLs7WEeL7y8wf1W10Im5luCnp64adzM3u-'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PLs7WEeL7y8wf1W10Im5luCnp64adzM3u-?v=2'/><author><name>theblasfable</name><uri>https://gdata.youtube.com/feeds/api/users/theblasfable</uri><yt:userId>76IuAeFfArYFZB-nPy92KA</yt:userId></author><yt:countHint>31</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/_UNgokP71tw/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/_UNgokP71tw/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/_UNgokP71tw/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PLs7WEeL7y8wf1W10Im5luCnp64adzM3u-</yt:playlistId></entry><entry gd:etag='W/&quot;A0QCSX47eCp7I2A9WhZXGUo.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PL786D56F1537CB52D</id><published>2007-06-06T21:06:04.000Z</published><updated>2011-05-09T22:16:08.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='Google'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='Developer'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='Day'/><category scheme='http://gdata.youtube.com/schemas/2007/tags.cat' term='US'/><title>Mountain View, California</title><summary>Videos from Google Developer Day US</summary><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PL786D56F1537CB52D?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/googledeveloperday?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PL786D56F1537CB52D'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PL786D56F1537CB52D?v=2'/><author><name>GoogleDeveloperDay</name><uri>https://gdata.youtube.com/feeds/api/users/GoogleDeveloperDay</uri><yt:userId>wPuf8AroS2fpl83oqsfC6A</yt:userId></author><yt:countHint>25</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/the0KZLEacs/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/the0KZLEacs/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/the0KZLEacs/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PL786D56F1537CB52D</yt:playlistId></entry><entry gd:etag='W/&quot;C0YNR347eCp7I2A9Wx5WFUg.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PL50614930B7092B22</id><published>2009-04-10T13:50:48.000Z</published><updated>2010-09-27T01:33:16.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>Google Developers</title><summary>Interesting videos from the Google developers</summary><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PL50614930B7092B22?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/thepoint75?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PL50614930B7092B22'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PL50614930B7092B22?v=2'/><author><name>thepoint75</name><uri>https://gdata.youtube.com/feeds/api/users/thepoint75</uri><yt:userId>OpHdyIJQNyaaKeQ3N8p3Kg</yt:userId></author><yt:countHint>14</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/ZeO_J2OcHYM/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/ZeO_J2OcHYM/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/ZeO_J2OcHYM/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PL50614930B7092B22</yt:playlistId></entry><entry gd:etag='W/&quot;CEIFQ347eCp7I2A9WxJTEks.&quot;'><id>tag:youtube.com,2008:playlist:snippet:PL313DE5487FECDE4C</id><published>2008-03-31T21:54:19.000Z</published><updated>2009-04-20T21:21:52.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#playlistLink'/><title>Google Developers</title><summary>Google Developers</summary><content type='application/atom+xml;type=feed' src='https://gdata.youtube.com/feeds/api/playlists/PL313DE5487FECDE4C?v=2'/><link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/marianarcissa?v=2'/><link rel='alternate' type='text/html' href='https://www.youtube.com/playlist?list=PL313DE5487FECDE4C'/><link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/playlists/snippets/PL313DE5487FECDE4C?v=2'/><author><name>marianarcissa</name><uri>https://gdata.youtube.com/feeds/api/users/marianarcissa</uri><yt:userId>HOnhiK1dj8TQoFIfR1azGQ</yt:userId></author><yt:countHint>3</yt:countHint><media:group><media:thumbnail url='http://i.ytimg.com/vi/kNXdfjUYGAo/default.jpg' height='90' width='120' yt:name='default'/><media:thumbnail url='http://i.ytimg.com/vi/kNXdfjUYGAo/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/><media:thumbnail url='http://i.ytimg.com/vi/kNXdfjUYGAo/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/></media:group><yt:playlistId>PL313DE5487FECDE4C</yt:playlistId></entry></feed>
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,2 @@
1
- $LOAD_PATH.unshift 'lib'
2
1
  require 'youtube_search'
3
2
  require 'youtube_search/version'
@@ -51,6 +51,16 @@ describe YoutubeSearch do
51
51
  video["video_id"].should == "5wU-yHnq7Hs"
52
52
  video["raw"].elements.should_not == nil
53
53
  end
54
+
55
+ it "can parse xml from playlists search" do
56
+ playlists = YoutubeSearch.parse(File.read('spec/fixtures/playlist_search_google_developers.xml'))
57
+ playlists.size.should == 10
58
+ playlists[0]["id"].should == "tag:youtube.com,2008:playlist:snippet:PLB09682344C2F233B"
59
+ playlists[0]["published"].should == "2010-05-21T05:05:09.000Z"
60
+ playlists[0]["updated"].should == "2012-08-23T12:33:57.000Z"
61
+ playlists[0]["title"].should == "Google I/O 2010: Google TV Keynote, Day 2"
62
+ playlists[0]["playlistId"].should == "PLB09682344C2F233B"
63
+ end
54
64
  end
55
65
 
56
66
  describe 'search' do
@@ -71,6 +81,20 @@ describe YoutubeSearch do
71
81
  end
72
82
  end
73
83
 
84
+ describe 'search_playlists' do
85
+ it "can search playlists" do
86
+ YoutubeSearch.search_playlists('GoogleDevelopers').size.should == 25
87
+ end
88
+
89
+ it "can search with options" do
90
+ YoutubeSearch.search_playlists('GoogleDevelopers', 'max-results' => 2).size.should == 2
91
+ end
92
+
93
+ it "can search with :per_page" do
94
+ YoutubeSearch.search('GoogleDevelopers', :per_page => 2).size.should == 2
95
+ end
96
+ end
97
+
74
98
  describe 'playlist_videos' do
75
99
  it "can retrieve videos from a playlist" do
76
100
  YoutubeSearch.playlist_videos('5F23DAF4BFE3D14C').size.should == 6
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youtube_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-28 00:00:00.000000000 Z
12
+ date: 2012-10-23 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email: michael@grosser.it
@@ -25,6 +25,7 @@ files:
25
25
  - lib/youtube_search.rb
26
26
  - lib/youtube_search/version.rb
27
27
  - spec/fixtures/playlist_5F23DAF4BFE3D14C.xml
28
+ - spec/fixtures/playlist_search_google_developers.xml
28
29
  - spec/fixtures/search_boat.xml
29
30
  - spec/spec_helper.rb
30
31
  - spec/youtube_search_spec.rb
@@ -43,7 +44,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
43
44
  version: '0'
44
45
  segments:
45
46
  - 0
46
- hash: -208767601
47
+ hash: 3459774421514102867
47
48
  required_rubygems_version: !ruby/object:Gem::Requirement
48
49
  none: false
49
50
  requirements:
@@ -52,10 +53,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
53
  version: '0'
53
54
  segments:
54
55
  - 0
55
- hash: -208767601
56
+ hash: 3459774421514102867
56
57
  requirements: []
57
58
  rubyforge_project:
58
- rubygems_version: 1.8.10
59
+ rubygems_version: 1.8.24
59
60
  signing_key:
60
61
  specification_version: 3
61
62
  summary: Search youtube via this simple ruby api