vodpod 0.0.1
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/LICENSE +25 -0
- data/README +77 -0
- data/example/test.rb +14 -0
- data/lib/vodpod.rb +44 -0
- data/lib/vodpod/connection.rb +95 -0
- data/lib/vodpod/error.rb +2 -0
- data/lib/vodpod/pod.rb +119 -0
- data/lib/vodpod/record.rb +34 -0
- data/lib/vodpod/tag.rb +13 -0
- data/lib/vodpod/user.rb +22 -0
- data/lib/vodpod/version.rb +8 -0
- data/lib/vodpod/video.rb +34 -0
- metadata +74 -0
data/LICENSE
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Copyright (c) 2009 Kyle Kingsbury <aphyr@aphyr.com>
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
* Neither the name of this project nor the names of its contributors may be
|
13
|
+
used to endorse or promote products derived from this software without
|
14
|
+
specific prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
Vodpod - Ruby bindings for the Vodpod API.
|
2
|
+
==========================================
|
3
|
+
|
4
|
+
Vodpod is a web site that allows you to collect videos. This library lets you
|
5
|
+
interact with those collections and videos over their REST-style API, using
|
6
|
+
clean Ruby. Typically one interacts with the Vodpod API through javascript, but
|
7
|
+
maybe you've got bigger plans. Maybe you want to integrate with a content
|
8
|
+
management system, or copy videos automatically from a social bookmarking site.
|
9
|
+
Be creative. :-)
|
10
|
+
|
11
|
+
Right now you can search for videos across the site and in a specific pod,
|
12
|
+
retrieve details on videos and pods, and page through videos in a pod. You can
|
13
|
+
also post new videos to a pod, and update video attributes. Error handling is
|
14
|
+
spotty thus far.
|
15
|
+
|
16
|
+
Examples
|
17
|
+
--------
|
18
|
+
|
19
|
+
Vodpod.start(:api_key => '...', :auth => '...') do |v|
|
20
|
+
# Get a pod
|
21
|
+
pod = v.pod('aphyr')
|
22
|
+
|
23
|
+
# Basic information about a pod is loaded by default
|
24
|
+
pod.name # => "aphyr's videos"
|
25
|
+
pod.stats # => {"total_views"=>23, "weekly_pod_views"=>2, ...}
|
26
|
+
|
27
|
+
# Retrieve tags (also works on videos)
|
28
|
+
pod.tags # => [<Vodpod::Tag neotokyo (1)>, <Vodpod::Tag game (1)>, ...]
|
29
|
+
|
30
|
+
# Look at who's following this pod
|
31
|
+
pod.followers # => [<Vodpod::User foo>, <Vodpod::User bar>, ...]
|
32
|
+
|
33
|
+
# Get a full dump of an object's contents (works on Tags, Users, Videos, ...)
|
34
|
+
pod.store # => {"name"=>"aphyr's videos", "created_at" => ...}
|
35
|
+
|
36
|
+
# List some videos
|
37
|
+
pod.videos.map { |video| video.title }
|
38
|
+
# => ["Official Neotokyo Trailer", "Kittens Attack!"]
|
39
|
+
|
40
|
+
# You can page through results and filter by tags
|
41
|
+
pod.videos(:tags => 'music', :page => 2, :per_page => 16)
|
42
|
+
# => [<Vodpod::Video ...>, <Vodpod::Video ...>, ...]
|
43
|
+
|
44
|
+
# Find videos by searching (Also works on pods)
|
45
|
+
v.search('obama', :per_page => 48)
|
46
|
+
# => [<Vodpod::Video ...>, <Vodpod::Video ...>, ...]
|
47
|
+
|
48
|
+
# Get a specific video by ID
|
49
|
+
vid = v.video(1063027) # => <Vodpod::Video ...>
|
50
|
+
|
51
|
+
# Show the associated user
|
52
|
+
vid.user # => <Vodpod::User scarrfase>
|
53
|
+
|
54
|
+
# Post a new video to a pod. Returns the new video.
|
55
|
+
pod.post('http://www.youtube.com/watch?v=E0ewUBTSlvQ',
|
56
|
+
:title => 'Neotokyo Recon Demo',
|
57
|
+
:description => 'Demo footage of the in-development Neotokyo mod',
|
58
|
+
:tags => ['game', 'neotokyo', 'trailer']
|
59
|
+
)
|
60
|
+
# => <Vodpod::Video ...>
|
61
|
+
|
62
|
+
# Add a tag "sports" to every video in a pod about frisbee.
|
63
|
+
pod.search('frisbee').each do |video|
|
64
|
+
tags = "#{video.tags} sports"
|
65
|
+
video.update(:tags => tags)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
Roadmap
|
70
|
+
-------
|
71
|
+
|
72
|
+
- Posting videos seems to work--the URL is correct in the returned video JSON,
|
73
|
+
but visiting the page doesn't seem to load. Perhaps a caching issue on
|
74
|
+
Vodpod's end?
|
75
|
+
- Automatic casting for datetimes.
|
76
|
+
- Better error handling
|
77
|
+
- Iterators for acting on all results without thinking about pagination
|
data/example/test.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require '../lib/vodpod'
|
4
|
+
require 'pp'
|
5
|
+
|
6
|
+
api_key = '5c87948ac1979401'
|
7
|
+
auth = '5c91b8b53586434c'
|
8
|
+
|
9
|
+
Vodpod.start(:api_key => api_key, :auth => auth) do |v|
|
10
|
+
# pp v.pod('aphyr').post('http://www.youtube.com/watch?v=E0ewUBTSlvQ', :title => "Neotokyo Recon Demo", :description => "Excitement!")
|
11
|
+
# pp v.video(2465983).update(:title => 'Official Neotokyo Trailer')
|
12
|
+
#
|
13
|
+
pp v.pod('aphyr').videos(:tags => 'neotokyo')
|
14
|
+
end
|
data/lib/vodpod.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# Vodpod API bindings for Ruby
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'json'
|
7
|
+
require 'uri'
|
8
|
+
require 'net/http'
|
9
|
+
|
10
|
+
module Vodpod
|
11
|
+
BASE_URI = 'http://api.vodpod.com/api/'
|
12
|
+
ROOT = File.dirname(__FILE__)
|
13
|
+
|
14
|
+
# Load library
|
15
|
+
require "#{ROOT}/vodpod/version"
|
16
|
+
require "#{ROOT}/vodpod/error"
|
17
|
+
require "#{ROOT}/vodpod/connection"
|
18
|
+
require "#{ROOT}/vodpod/record"
|
19
|
+
require "#{ROOT}/vodpod/user"
|
20
|
+
require "#{ROOT}/vodpod/tag"
|
21
|
+
require "#{ROOT}/vodpod/pod"
|
22
|
+
require "#{ROOT}/vodpod/video"
|
23
|
+
|
24
|
+
# Performs URI escaping so that you can construct proper
|
25
|
+
# query strings faster. Use this rather than the cgi.rb
|
26
|
+
# version since it's faster. (Stolen from Camping).
|
27
|
+
def escape(s)
|
28
|
+
s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
|
29
|
+
'%'+$1.unpack('H2'*$1.size).join('%').upcase
|
30
|
+
}.tr(' ', '+')
|
31
|
+
end
|
32
|
+
module_function :escape
|
33
|
+
|
34
|
+
# Creates a connection with the provided parameter hash, and yields it in a
|
35
|
+
# block. Example:
|
36
|
+
#
|
37
|
+
# Vodpod.start(:api_key => api_key, :auth => auth) do |v|
|
38
|
+
# pod = v.pod('aphyr')
|
39
|
+
# p pod.created_at
|
40
|
+
# end
|
41
|
+
def self.start(params)
|
42
|
+
yield Connection.new(params)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Vodpod
|
2
|
+
# Connection to vodpod.com; retreives JSON data and handles API key/auth.
|
3
|
+
class Connection
|
4
|
+
|
5
|
+
attr_accessor :api
|
6
|
+
attr_accessor :auth
|
7
|
+
|
8
|
+
# Creates a new connection. Parameters:
|
9
|
+
#
|
10
|
+
# :api_key => API key
|
11
|
+
# :auth => Auth key
|
12
|
+
def initialize(params = {})
|
13
|
+
@api_key = params[:api_key]
|
14
|
+
@auth = params[:auth]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Request via GET
|
18
|
+
def get(path, params = {})
|
19
|
+
request :get, path, params
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns a pod by ID.
|
23
|
+
def pod(id)
|
24
|
+
Pod.load(self, 'pod_id' => id)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Request via POST
|
28
|
+
def post(path, params = {})
|
29
|
+
request :post, path, params
|
30
|
+
end
|
31
|
+
|
32
|
+
# Perform a JSON request to the Vodpod API for a given path and parameter
|
33
|
+
# hash. Returns a parsed JSON document. Automatically provides api_key and
|
34
|
+
# auth params if you do not specify them. Method should be one of :get or
|
35
|
+
# :post--you should use the #get or #post methods for convenience.
|
36
|
+
def request(method, path, params = {})
|
37
|
+
defaults = {
|
38
|
+
:api_key => @api_key,
|
39
|
+
:auth => @auth
|
40
|
+
}
|
41
|
+
|
42
|
+
# Construct query fragment
|
43
|
+
query = defaults.merge(params).inject('?') { |s, (k, v)|
|
44
|
+
s << "#{Vodpod::escape(k)}=#{Vodpod::escape(v)}&"
|
45
|
+
}[0..-2]
|
46
|
+
|
47
|
+
begin
|
48
|
+
# Get URI
|
49
|
+
case method
|
50
|
+
when :get
|
51
|
+
# GET request
|
52
|
+
uri = URI.parse(Vodpod::BASE_URI + path + '.js' + query)
|
53
|
+
JSON.parse Net::HTTP.get(uri)
|
54
|
+
when :post
|
55
|
+
# POST request
|
56
|
+
uri = URI.parse(Vodpod::BASE_URI + path + '.js')
|
57
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
58
|
+
http.post(uri.path, query[1..-1])
|
59
|
+
end
|
60
|
+
JSON.parse res.body
|
61
|
+
else
|
62
|
+
# Don't know how to do that kind of request
|
63
|
+
raise Error.new("Unsupported request method #{method.inspect}; should be one of :get, :post.")
|
64
|
+
end
|
65
|
+
rescue => e
|
66
|
+
# Error somewhere in the request/parse process.
|
67
|
+
raise Error.new("Error retrieving #{uri.path}#{query}: #{e.message}")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Searches for videos. Optionally specify :per_page and :page.
|
72
|
+
def search(query, params = {})
|
73
|
+
list = get('video/search', params.merge(:query => query))['videos']['items']
|
74
|
+
return [] unless list
|
75
|
+
|
76
|
+
# Map results to Videos
|
77
|
+
list.map do |item|
|
78
|
+
# These results use Video.1234... as the ID, so we need to strip.
|
79
|
+
store = item['video']
|
80
|
+
store['video_id'] = store['video_id'].sub(/^Video\./, '').to_i
|
81
|
+
Video.new(self, store)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a user by ID.
|
86
|
+
def user(id)
|
87
|
+
User.new(self, 'user_id' => id)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns a video by ID.
|
91
|
+
def video(id)
|
92
|
+
Video.load(self, 'video_id' => id)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/vodpod/error.rb
ADDED
data/lib/vodpod/pod.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
module Vodpod
|
2
|
+
# Represents a pod.
|
3
|
+
class Pod < Record
|
4
|
+
# Administrative users
|
5
|
+
def admins
|
6
|
+
if items = @store['users']['admins']
|
7
|
+
case items
|
8
|
+
when {}
|
9
|
+
# No results
|
10
|
+
[]
|
11
|
+
when Array
|
12
|
+
# More than one result
|
13
|
+
items.map do |item|
|
14
|
+
User.new(@connection, item['user'])
|
15
|
+
end
|
16
|
+
else
|
17
|
+
# One result
|
18
|
+
[User.new(@connection, items['user'])]
|
19
|
+
end
|
20
|
+
else
|
21
|
+
[]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Following users
|
26
|
+
def followers
|
27
|
+
if items = @store['users']['followers']
|
28
|
+
case items
|
29
|
+
when {}
|
30
|
+
# No results
|
31
|
+
[]
|
32
|
+
when Array
|
33
|
+
# More than one result
|
34
|
+
items.map do |item|
|
35
|
+
User.new(@connection, item['user'])
|
36
|
+
end
|
37
|
+
else
|
38
|
+
# One result
|
39
|
+
[User.new(@connection, items['user'])]
|
40
|
+
end
|
41
|
+
else
|
42
|
+
[]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Loads information for this pod from the API.
|
47
|
+
def load!
|
48
|
+
if pod_id
|
49
|
+
@store.merge! @connection.get('pod/details', :pod_id => pod_id)["pod"]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Posts a new video to a pod. Returns the video posted.
|
54
|
+
#
|
55
|
+
# Optional parameters:
|
56
|
+
# :title => 'Cats with captions!'
|
57
|
+
# :description => 'Ahh the internet...'
|
58
|
+
# :tags => 'foo bar baz' or ['foo', 'bar', 'baz']
|
59
|
+
def post(url, params = {})
|
60
|
+
new_params = params.merge(
|
61
|
+
:pod_id => @store['pod_id'],
|
62
|
+
:url => url
|
63
|
+
)
|
64
|
+
# Convert tags to string if necessary
|
65
|
+
if new_params[:tags].kind_of? Array
|
66
|
+
new_params[:tags] = new_params[:tags].join(' ')
|
67
|
+
end
|
68
|
+
|
69
|
+
# Post
|
70
|
+
Video.new(@connection.post('video/post', new_params)['video'])
|
71
|
+
end
|
72
|
+
|
73
|
+
# Searches for videos. Optionally specify :per_page and :page.
|
74
|
+
def search(query, params = {})
|
75
|
+
# Get list of videos
|
76
|
+
params = params.merge(:pod_id => @store['pod_id'], :query => query)
|
77
|
+
list = @connection.get('pod/search', params)['videos']['items']
|
78
|
+
|
79
|
+
return [] unless list
|
80
|
+
|
81
|
+
# Map results to Videos
|
82
|
+
list.map do |item|
|
83
|
+
store = item['video']
|
84
|
+
#store['video_id'].sub!(/^Video\./, '')
|
85
|
+
Video.new(@connection, store)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns an array of Tags associated with this pod, by frequency of use.
|
90
|
+
def tags
|
91
|
+
list = @connection.get('pod/tags', :pod_id => pod_id)['tags']['items']
|
92
|
+
list.map do |item|
|
93
|
+
Tag.new(@connection, item['t'])
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Returns the associated user for this pod.
|
98
|
+
def user
|
99
|
+
return nil unless @store['user']
|
100
|
+
|
101
|
+
User.new(@connection, @store['user'])
|
102
|
+
end
|
103
|
+
|
104
|
+
# Videos in a pod. You can use :sort, :per_page, :page, and :tag_id to
|
105
|
+
# paginate and filter.
|
106
|
+
def videos(params = {})
|
107
|
+
# Get list of videos
|
108
|
+
params = params.merge(:pod_id => @store['pod_id'])
|
109
|
+
list = @connection.get('pod/videos', params)['videos']['items']
|
110
|
+
|
111
|
+
return [] unless list
|
112
|
+
|
113
|
+
# Map to objects
|
114
|
+
list.map do |item|
|
115
|
+
Video.new(@connection, item['video'])
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Vodpod
|
2
|
+
# Represents a generic Vodpod API record.
|
3
|
+
#
|
4
|
+
# Vodpod objects like Video, Pod, and Tag inherit from this class. It wraps a
|
5
|
+
# store (usually the deserialized JSON hash from an API call) with automatic
|
6
|
+
# accessors, so you can call video.title instead of video.store['title'].
|
7
|
+
# Records are instantiated with a connection object and a default store of an
|
8
|
+
# empty hash.
|
9
|
+
class Record
|
10
|
+
attr_accessor :store
|
11
|
+
|
12
|
+
# Like Record.new, but also calls load!
|
13
|
+
def self.load(*params)
|
14
|
+
record = new(*params)
|
15
|
+
record.load! if record.respond_to? :load!
|
16
|
+
record
|
17
|
+
end
|
18
|
+
|
19
|
+
# Create a new Record. Takes two parameters: a Connection object so the
|
20
|
+
# record can perform further requests, and an optional default value for
|
21
|
+
# the store.
|
22
|
+
def initialize(connection, store = {})
|
23
|
+
@connection = connection
|
24
|
+
@store = store
|
25
|
+
end
|
26
|
+
|
27
|
+
# Pass requests to store by default.
|
28
|
+
def method_missing(meth, *args)
|
29
|
+
if @store.include? meth.to_s
|
30
|
+
@store[meth.to_s]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/vodpod/tag.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Vodpod
|
2
|
+
# A Tag, attached to a video. There isn't a way yet to go from tags to videos
|
3
|
+
# that I'm aware of, but it might happen in the future.
|
4
|
+
class Tag < Record
|
5
|
+
def inspect
|
6
|
+
"<Vodpod::Tag #{@store['_value']} (#{count})>"
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
@store['_value']
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/vodpod/user.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Vodpod
|
2
|
+
# A Vodpod user, associated with a pod and with videos.
|
3
|
+
class User < Record
|
4
|
+
# Returns recent activity by people related to this user. Not working
|
5
|
+
# yet--maybe a Vodpod bug?
|
6
|
+
def network_activity
|
7
|
+
@connection.get('user/network_activity', :user_id => user_id)
|
8
|
+
end
|
9
|
+
|
10
|
+
def inspect
|
11
|
+
if @store
|
12
|
+
"<Vodpod::User #{@store['username']}>"
|
13
|
+
else
|
14
|
+
"<Vodpod::User>"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
@store['username']
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module Vodpod
|
2
|
+
APP_NAME = 'Vodpod'
|
3
|
+
APP_VERSION = '0.0.1'
|
4
|
+
APP_AUTHOR = 'Kyle Kingsbury'
|
5
|
+
APP_EMAIL = 'aphyr@aphyr.com'
|
6
|
+
APP_URL = 'http://aphyr.com/projects/ruby-vodpod'
|
7
|
+
APP_COPYRIGHT = 'Copyright (c) 2009 Kyle Kingsbury <aphyr@aphyr.com>. All rights reserved.'
|
8
|
+
end
|
data/lib/vodpod/video.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module Vodpod
|
2
|
+
# A video.
|
3
|
+
class Video < Record
|
4
|
+
# Loads information on this video by video_id
|
5
|
+
def load!
|
6
|
+
if video_id
|
7
|
+
@store.merge! @connection.get('video/details', :video_id => video_id)["video"]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
@store['title']
|
13
|
+
end
|
14
|
+
|
15
|
+
# Update the title, description, and/or tags for this video. Returns
|
16
|
+
# the updated video. Seems to create video records okay, but they aren't
|
17
|
+
# viewable and don't appear in collections for editing immediately.
|
18
|
+
def update(params)
|
19
|
+
new_params = params.merge(
|
20
|
+
:video_id => @store['video_id']
|
21
|
+
)
|
22
|
+
|
23
|
+
# Post
|
24
|
+
Video.new(@connection.post('video/update', new_params)['video'])
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the User for this video.
|
28
|
+
def user
|
29
|
+
return nil unless @store['user']
|
30
|
+
|
31
|
+
User.new(@connection, @store['user'])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vodpod
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kyle Kingsbury
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-08 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.1.4
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: aphyr@aphyr.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- lib/vodpod.rb
|
35
|
+
- lib/vodpod
|
36
|
+
- lib/vodpod/record.rb
|
37
|
+
- lib/vodpod/tag.rb
|
38
|
+
- lib/vodpod/pod.rb
|
39
|
+
- lib/vodpod/version.rb
|
40
|
+
- lib/vodpod/user.rb
|
41
|
+
- lib/vodpod/video.rb
|
42
|
+
- lib/vodpod/error.rb
|
43
|
+
- lib/vodpod/connection.rb
|
44
|
+
- example/test.rb
|
45
|
+
- LICENSE
|
46
|
+
- README
|
47
|
+
has_rdoc: true
|
48
|
+
homepage: http://aphyr.com/projects/ruby-vodpod
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 1.8.5
|
59
|
+
version:
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
version:
|
66
|
+
requirements: []
|
67
|
+
|
68
|
+
rubyforge_project: vodpod
|
69
|
+
rubygems_version: 1.3.1
|
70
|
+
signing_key:
|
71
|
+
specification_version: 2
|
72
|
+
summary: Ruby bindings for the Vodpod API.
|
73
|
+
test_files: []
|
74
|
+
|