active_youtube 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/examples.rb +54 -0
- data/lib/active_youtube.rb +5 -0
- data/lib/activeyoutube.rb +80 -0
- data/lib/patch.rb +36 -0
- data/lib/youtube.rb +35 -0
- data/test/youtube_test.rb +58 -0
- metadata +58 -0
data/examples.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
##### Examples #######
|
2
|
+
|
3
|
+
#### VIDEO
|
4
|
+
## search for videos
|
5
|
+
search = Youtube::Video.find(:first, :params => {:vq => 'ruby', :"max-results" => '5'})
|
6
|
+
puts search.entry.length
|
7
|
+
|
8
|
+
## video information of id = ZTUVgYoeN_o
|
9
|
+
vid = Youtube::Video.find("ZTUVgYoeN_o")
|
10
|
+
puts vid.group.content[0].url
|
11
|
+
|
12
|
+
## video comments
|
13
|
+
comments = Youtube::Video.find_custom("ZTUVgYoeN_o").get(:comments)
|
14
|
+
puts comments.entry[0].link[2].href
|
15
|
+
|
16
|
+
## searching with category/tags
|
17
|
+
results = Youtube::Video.search_by_tags("Comedy")
|
18
|
+
puts results[0].entry[0].title
|
19
|
+
# more examples:
|
20
|
+
# Video.search_by_tags("Comedy", "dog")
|
21
|
+
# Video.search_by_tags("News","Sports","football", :exclude=>["Comedy","soccer"])
|
22
|
+
# Video.search_by_tags("News","Sports","football", :exclude=>"soccer")
|
23
|
+
|
24
|
+
|
25
|
+
#### STANDARDFEED
|
26
|
+
## retrieving standard feeds
|
27
|
+
most_viewed = Youtube::Standardfeed.find(:most_viewed, :params => {:time => 'today'})
|
28
|
+
puts most_viewed.entry[0].group.content[0].url
|
29
|
+
|
30
|
+
#### USER
|
31
|
+
## user's profile - guthrie
|
32
|
+
user_profile = Youtube::User.find("guthrie")
|
33
|
+
puts user_profile.link[1].href
|
34
|
+
|
35
|
+
## user's playlist - john
|
36
|
+
user_playlist = Youtube::User.find_custom("john").get(:playlists)
|
37
|
+
puts user_playlist.link[1].href
|
38
|
+
|
39
|
+
## user's upload or favorites
|
40
|
+
rick_video = Youtube::User.find_custom("rick").get(:uploads)
|
41
|
+
puts rick_video.entry[0].group.content[0].url
|
42
|
+
|
43
|
+
## user's subscription
|
44
|
+
user_subscriptions = Youtube::User.find_custom("guthrie").get(:subscriptions)
|
45
|
+
puts user_subscriptions.to_yaml
|
46
|
+
|
47
|
+
#### PLAYLIST
|
48
|
+
## get playlist - multiple elements in playlist
|
49
|
+
playlist = Youtube::Playlist.find("EBF5D6DC4589D7B7")
|
50
|
+
puts playlist.entry[0].group.content[0].url
|
51
|
+
|
52
|
+
## get playlist - single element in playlist
|
53
|
+
playlist = Youtube::Playlist.find("45C563323B344971")
|
54
|
+
puts playlist.entry[0].group.content[0].url
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'activeresource'
|
3
|
+
|
4
|
+
#module Youtube
|
5
|
+
class ActiveYoutube < ActiveResource::Base
|
6
|
+
class << self
|
7
|
+
## Remove format from the url.
|
8
|
+
def element_path(id, prefix_options = {}, query_options = nil)
|
9
|
+
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
|
10
|
+
"#{prefix(prefix_options)}#{collection_name}/#{id}#{query_string(query_options)}"
|
11
|
+
end
|
12
|
+
|
13
|
+
## Remove format from the url.
|
14
|
+
def collection_path(prefix_options = {}, query_options = nil)
|
15
|
+
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
|
16
|
+
"#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}"
|
17
|
+
end
|
18
|
+
|
19
|
+
## For a collection call, ActiveResource formatting is not
|
20
|
+
## compliant with YouTube's output.
|
21
|
+
def instantiate_collection(collection, prefix_options = {})
|
22
|
+
unless collection.kind_of? Array
|
23
|
+
[instantiate_record(collection, prefix_options)]
|
24
|
+
else
|
25
|
+
collection.collect! { |record| instantiate_record(record, prefix_options) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
## To convert output into proper standard.
|
30
|
+
## If single element is present in output then entry is not an array.
|
31
|
+
## So this method will ensure entry is always an array.
|
32
|
+
alias :old_find :find
|
33
|
+
def find(*args)
|
34
|
+
convert_entry_to_array(old_find(*args))
|
35
|
+
end
|
36
|
+
|
37
|
+
## When using ActiveResource::CustomMethods, ActiveResource first tries to retrieve the id using find()
|
38
|
+
## and then makes a get() call using that id.
|
39
|
+
## But, youtube returns the url of this item as id, which we don't want. This method overrides the behavior.
|
40
|
+
## Example: comments = Video.find_custom("ZTUVgYoeN_o").get(:comments)
|
41
|
+
def find_custom(arg)
|
42
|
+
object = self.new
|
43
|
+
object.id = arg
|
44
|
+
object
|
45
|
+
end
|
46
|
+
|
47
|
+
## Following method from ActiveResource::CustomMethods extends the capabilities of activeresource for non-standard urls ;-)
|
48
|
+
## The objects returned from this method are not automatically converted into ActiveResource instances - they are ordinary Hashes.
|
49
|
+
## Modifications below ensures that you get ActiveResource instances.
|
50
|
+
def get(method_name, options = {})
|
51
|
+
object_array = connection.get(custom_method_collection_url(method_name, options), headers)
|
52
|
+
if object_array.class.to_s=="Array"
|
53
|
+
object_array.collect! {|record| convert_entry_to_array(self.class.new.load(record))}
|
54
|
+
else
|
55
|
+
convert_entry_to_array(self.class.new.load(object_array))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def convert_entry_to_array object
|
60
|
+
if object.respond_to?:entry and !(object.entry.kind_of? Array)
|
61
|
+
object.entry=[object.entry]
|
62
|
+
end
|
63
|
+
object
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
## Instance Methods: (modifying the ActiveRecord::CustomMethods).
|
68
|
+
|
69
|
+
## This modification is same as defined in above method
|
70
|
+
def get(method_name, options = {})
|
71
|
+
self.class.convert_entry_to_array(load(connection.get(custom_method_element_url(method_name, options), self.class.headers)))
|
72
|
+
end
|
73
|
+
|
74
|
+
## Modifying the url formation to make it Youtube API complaint
|
75
|
+
def custom_method_element_url(method_name, options = {})
|
76
|
+
"#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{id}/" +
|
77
|
+
"#{method_name}#{self.class.send!(:query_string, options)}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
#end
|
data/lib/patch.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
##
|
2
|
+
## copied from edge rails code
|
3
|
+
module ActiveResource
|
4
|
+
class Base
|
5
|
+
private
|
6
|
+
# Tries to find a resource in a non empty list of nested modules
|
7
|
+
# Raises a NameError if it was not found in any of the given nested modules
|
8
|
+
def find_resource_in_modules(resource_name, module_names)
|
9
|
+
receiver = Object
|
10
|
+
namespaces = module_names[0, module_names.size-1].map do |module_name|
|
11
|
+
receiver = receiver.const_get(module_name)
|
12
|
+
end
|
13
|
+
if namespace = namespaces.reverse.detect { |ns| ns.const_defined?(resource_name) }
|
14
|
+
return namespace.const_get(resource_name)
|
15
|
+
else
|
16
|
+
raise NameError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Tries to find a resource for a given name; if it fails, then the resource is created
|
21
|
+
def find_or_create_resource_for(name)
|
22
|
+
resource_name = name.to_s.camelize
|
23
|
+
ancestors = self.class.name.split("::")
|
24
|
+
if ancestors.size > 1
|
25
|
+
find_resource_in_modules(resource_name, ancestors)
|
26
|
+
else
|
27
|
+
self.class.const_get(resource_name)
|
28
|
+
end
|
29
|
+
rescue NameError
|
30
|
+
resource = self.class.const_set(resource_name, Class.new(ActiveResource::Base))
|
31
|
+
resource.prefix = self.class.prefix
|
32
|
+
resource.site = self.class.site
|
33
|
+
resource
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/youtube.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#### Create classes for YouTube resources.
|
2
|
+
module Youtube
|
3
|
+
class Video < ActiveYoutube
|
4
|
+
self.site = "http://gdata.youtube.com/feeds/api"
|
5
|
+
|
6
|
+
## To search by categories and tags
|
7
|
+
def self.search_by_tags (*options)
|
8
|
+
from_urls = []
|
9
|
+
if options.last.is_a? Hash
|
10
|
+
excludes = options.slice!(options.length-1)
|
11
|
+
if excludes[:exclude].kind_of? Array
|
12
|
+
from_urls << excludes[:exclude].map{|keyword| "-"+keyword}.join("/")
|
13
|
+
else
|
14
|
+
from_urls << "-"+excludes[:exclude]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
from_urls << options.find_all{|keyword| keyword =~ /^[a-z]/}.join("/")
|
18
|
+
from_urls << options.find_all{|category| category =~ /^[A-Z]/}.join("%7C")
|
19
|
+
from_urls.delete_if {|x| x.empty?}
|
20
|
+
self.find(:all,:from=>"/feeds/api/videos/-/"+from_urls.reverse.join("/"))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class User < ActiveYoutube
|
25
|
+
self.site = "http://gdata.youtube.com/feeds/api"
|
26
|
+
end
|
27
|
+
|
28
|
+
class Standardfeed < ActiveYoutube
|
29
|
+
self.site = "http://gdata.youtube.com/feeds/api"
|
30
|
+
end
|
31
|
+
|
32
|
+
class Playlist < ActiveYoutube
|
33
|
+
self.site = "http://gdata.youtube.com/feeds/api"
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require File.join(File.dirname(__FILE__), "../lib", "active_youtube")
|
3
|
+
|
4
|
+
class YoutubeTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_video
|
7
|
+
## search for video
|
8
|
+
search = Youtube::Video.find(:first, :params => {:vq => 'ruby', :"max-results" => '5'})
|
9
|
+
|
10
|
+
assert_equal(5,search.entry.length)
|
11
|
+
|
12
|
+
## video information of id = ZTUVgYoeN_o
|
13
|
+
vid = Youtube::Video.find("ZTUVgYoeN_o")
|
14
|
+
assert_equal("http://www.youtube.com/v/ZTUVgYoeN_o",vid.group.content[0].url)
|
15
|
+
|
16
|
+
## video comments
|
17
|
+
comments = Youtube::Video.find_custom("ZTUVgYoeN_o").get(:comments)
|
18
|
+
assert_equal("http://www.youtube.com/watch?v=ZTUVgYoeN_o",comments.entry[0].link[2].href)
|
19
|
+
|
20
|
+
## searching with category/tags
|
21
|
+
results = Youtube::Video.search_by_tags("Comedy")
|
22
|
+
assert_equal("Russell Peters",results[0].entry[0].title)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_standardfeed
|
26
|
+
## retrieving standard feeds
|
27
|
+
most_viewed = Youtube::Standardfeed.find(:most_viewed, :params => {:time => 'today'})
|
28
|
+
assert_equal("http://www.youtube.com/v/aiLvLxebfk0",most_viewed.entry[0].group.content[0].url)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_user
|
32
|
+
## user's profile - guthrie
|
33
|
+
user_profile = Youtube::User.find("guthrie")
|
34
|
+
assert_equal("http://www.youtube.com/profile?user=guthrie",user_profile.link[1].href)
|
35
|
+
|
36
|
+
## user's playlist - john
|
37
|
+
user_playlist = Youtube::User.find_custom("john").get(:playlists)
|
38
|
+
assert_equal("http://www.youtube.com/profile_play_list?user=john",user_playlist.link[1].href)
|
39
|
+
|
40
|
+
## user's upload or favorites
|
41
|
+
rick_video = Youtube::User.find_custom("rick").get(:uploads)
|
42
|
+
assert_equal("http://www.youtube.com/v/eNpPK4W0Z3M",rick_video.entry[0].group.content[0].url)
|
43
|
+
|
44
|
+
## user's subscription
|
45
|
+
#user_subscriptions = Youtube::User.find_custom("guthrie").get(:subscriptions)
|
46
|
+
#puts user_subscriptions.to_yaml
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_playlist
|
50
|
+
## get playlist - multiple elements in playlist
|
51
|
+
playlist = Youtube::Playlist.find("EBF5D6DC4589D7B7")
|
52
|
+
assert_equal(playlist.entry[0].group.content[0].url, "http://www.youtube.com/v/eenf1boHATs")
|
53
|
+
|
54
|
+
## get playlist - single element in playlist
|
55
|
+
playlist = Youtube::Playlist.find("45C563323B344971")
|
56
|
+
assert_equal("http://www.youtube.com/v/i2xMvKOLzYM",playlist.entry[0].group.content[0].url)
|
57
|
+
end
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: active_youtube
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.0
|
7
|
+
date: 2008-02-03 00:00:00 +05:30
|
8
|
+
summary: Active Youtube allows consuming YouTube API in your Ruby/Rails project using ActiveResource.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: quarkruby@gmail.com
|
12
|
+
homepage: http://www.quarkruby.com/
|
13
|
+
rubyforge_project:
|
14
|
+
description: Active Youtube allows consuming YouTube API in your Ruby/Rails project using ActiveResource.
|
15
|
+
autorequire: activeresource
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- QuarkRuby
|
31
|
+
files:
|
32
|
+
- lib/active_youtube.rb
|
33
|
+
- lib/patch.rb
|
34
|
+
- lib/activeyoutube.rb
|
35
|
+
- lib/youtube.rb
|
36
|
+
- examples.rb
|
37
|
+
test_files:
|
38
|
+
- test/youtube_test.rb
|
39
|
+
rdoc_options: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
executables: []
|
44
|
+
|
45
|
+
extensions: []
|
46
|
+
|
47
|
+
requirements: []
|
48
|
+
|
49
|
+
dependencies:
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: activeresource
|
52
|
+
version_requirement:
|
53
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 2.0.2
|
58
|
+
version:
|