youtube_it 2.0.1 → 2.1.0
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 +11 -0
- data/Gemfile.lock +29 -0
- data/README.rdoc +26 -8
- data/VERSION +1 -1
- data/lib/youtube_it/client.rb +26 -9
- data/lib/youtube_it/model/video.rb +2 -4
- data/lib/youtube_it/parser.rb +3 -3
- data/lib/youtube_it/request/video_upload.rb +72 -7
- data/lib/youtube_it.rb +16 -11
- data/test/test_client.rb +19 -2
- data/test/test_video.rb +3 -3
- data/youtube_it.gemspec +22 -14
- metadata +123 -26
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.2.6)
|
5
|
+
builder (3.0.0)
|
6
|
+
crack (0.3.1)
|
7
|
+
faraday (0.7.5)
|
8
|
+
addressable (~> 2.2.6)
|
9
|
+
multipart-post (~> 1.1.3)
|
10
|
+
rack (>= 1.1.0, < 2)
|
11
|
+
multipart-post (1.1.4)
|
12
|
+
nokogiri (1.5.0)
|
13
|
+
oauth (0.4.5)
|
14
|
+
rack (1.3.5)
|
15
|
+
simple_oauth (0.1.5)
|
16
|
+
webmock (1.7.7)
|
17
|
+
addressable (~> 2.2, > 2.2.5)
|
18
|
+
crack (>= 0.1.7)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
builder
|
25
|
+
faraday
|
26
|
+
nokogiri
|
27
|
+
oauth
|
28
|
+
simple_oauth
|
29
|
+
webmock
|
data/README.rdoc
CHANGED
@@ -15,6 +15,14 @@
|
|
15
15
|
|
16
16
|
Note: youtube_it supports ClientLogin(YouTube account), OAuth or AuthSub authentication methods.
|
17
17
|
|
18
|
+
== Example Rails 3 App
|
19
|
+
|
20
|
+
You can get an example how you can use youtube_it with Rails 3 here: http://github.com/chebyte/youtube_it_rails_app_example
|
21
|
+
|
22
|
+
== DEMO
|
23
|
+
|
24
|
+
You can see to youtube_it in action here: http://youtube-it.heroku.com
|
25
|
+
|
18
26
|
== ESTABLISHING A CLIENT
|
19
27
|
|
20
28
|
Creating a client:
|
@@ -47,6 +55,7 @@ Basic Queries:
|
|
47
55
|
$ client.videos_by(:user => 'liz')
|
48
56
|
$ client.videos_by(:favorites, :user => 'liz')
|
49
57
|
$ client.video_by("FQK1URcxmb4")
|
58
|
+
$ client.video_by("https://www.youtube.com/watch?v=QsbmrCtiEUU")
|
50
59
|
$ client.video_by_user("chebyte","FQK1URcxmb4")
|
51
60
|
|
52
61
|
Standard Queries:
|
@@ -146,6 +155,21 @@ Add Video To Playlist:
|
|
146
155
|
|
147
156
|
Remove Video From Playlist:
|
148
157
|
$ client.remove_video_from_playlist(playlist_id, playlist_entry_id)
|
158
|
+
|
159
|
+
List Related Videos
|
160
|
+
$ video = client.video_by("https://www.youtube.com/watch?v=QsbmrCtiEUU&feature=player_embedded")
|
161
|
+
$ video.related.videos
|
162
|
+
|
163
|
+
Add Response Video
|
164
|
+
$ video.add_response(original_video_id, response_video_id)
|
165
|
+
|
166
|
+
Delete Response Video
|
167
|
+
$ video.delete_response(original_video_id, response_video_id)
|
168
|
+
|
169
|
+
List Response Videos
|
170
|
+
$ video = client.video_by("https://www.youtube.com/watch?v=QsbmrCtiEUU&feature=player_embedded")
|
171
|
+
$ video.responses.videos
|
172
|
+
|
149
173
|
|
150
174
|
== ACCESS CONTROL LIST
|
151
175
|
|
@@ -212,19 +236,13 @@ YouTubeIt passes all logs through the logger variable on the class itself. In Ra
|
|
212
236
|
$ YouTubeIt.logger = RAILS_DEFAULT_LOGGER
|
213
237
|
$ RAILS_DEFAULT_LOGGER.level = Logger::DEBUG
|
214
238
|
|
215
|
-
== Example Rails 3 App
|
216
|
-
|
217
|
-
You can get an example how you can use youtube_it with Rails 3 here: http://github.com/chebyte/youtube_it_rails_app_example
|
218
|
-
|
219
|
-
== DEMO
|
220
|
-
|
221
|
-
You can see to youtube_it in action here: http://youtube-it.heroku.com
|
222
|
-
|
223
239
|
== CONTRIBUTORS:
|
224
240
|
|
225
241
|
* Kyle J. Ginavan.
|
226
242
|
* Mauro Torres - http://github.com/chebyte
|
227
243
|
* Marko Seppa - https://github.com/mseppae
|
244
|
+
* Walter Korman - https://github.com/shaper
|
245
|
+
* Shane Vitarana - https://github.com/shanev
|
228
246
|
|
229
247
|
== LICENSE:
|
230
248
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0
|
1
|
+
2.1.0
|
data/lib/youtube_it/client.rb
CHANGED
@@ -83,8 +83,15 @@ class YouTubeIt
|
|
83
83
|
#
|
84
84
|
# === Returns
|
85
85
|
# YouTubeIt::Model::Video
|
86
|
-
def video_by(
|
87
|
-
|
86
|
+
def video_by(video)
|
87
|
+
vid = nil
|
88
|
+
vid_regex = /(?:youtube.com|youtu.be).*(?:\/|v=)(\w+)/
|
89
|
+
if video =~ vid_regex
|
90
|
+
vid = $1
|
91
|
+
else
|
92
|
+
vid = video
|
93
|
+
end
|
94
|
+
video_id ="http://gdata.youtube.com/feeds/api/videos/#{vid}?v=2#{@dev_key ? '&key='+@dev_key : ''}"
|
88
95
|
parser = YouTubeIt::Parser::VideoFeedParser.new(video_id)
|
89
96
|
parser.parse
|
90
97
|
end
|
@@ -194,6 +201,14 @@ class YouTubeIt
|
|
194
201
|
def enable_http_debugging
|
195
202
|
client.enable_http_debugging
|
196
203
|
end
|
204
|
+
|
205
|
+
def add_response(original_video_id, response_video_id)
|
206
|
+
client.add_response(original_video_id, response_video_id)
|
207
|
+
end
|
208
|
+
|
209
|
+
def delete_response(original_video_id, response_video_id)
|
210
|
+
client.delete_response(original_video_id, response_video_id)
|
211
|
+
end
|
197
212
|
|
198
213
|
def current_user
|
199
214
|
client.get_current_user
|
@@ -355,14 +370,16 @@ class YouTubeIt
|
|
355
370
|
end
|
356
371
|
|
357
372
|
def current_user
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
373
|
+
profile = access_token.get("http://gdata.youtube.com/feeds/api/users/default")
|
374
|
+
response_code = profile.code.to_i
|
375
|
+
|
376
|
+
if response_code/10 == 20 # success
|
377
|
+
REXML::Document.new(profile.body).elements["entry"].elements['author'].elements['name'].text
|
378
|
+
elsif response_code == 403 || response_code == 401 # auth failure
|
379
|
+
raise YouTubeIt::Upload::AuthenticationError.new(profile.inspect, response_code)
|
380
|
+
else
|
381
|
+
raise YouTubeIt::Upload::UploadError.new(profile.inspect, response_code)
|
362
382
|
end
|
363
|
-
|
364
|
-
body = yt_session.get("/feeds/api/users/default").body
|
365
|
-
REXML::Document.new(body).elements["entry"].elements['author'].elements['name'].text
|
366
383
|
end
|
367
384
|
|
368
385
|
private
|
@@ -130,17 +130,15 @@ class YouTubeIt
|
|
130
130
|
# === Returns
|
131
131
|
# YouTubeIt::Response::VideoSearch
|
132
132
|
def related
|
133
|
-
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/related").parse
|
133
|
+
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/related?v=2").parse
|
134
134
|
end
|
135
|
-
|
136
135
|
# Video responses to the current video.
|
137
136
|
#
|
138
137
|
# === Returns
|
139
138
|
# YouTubeIt::Response::VideoSearch
|
140
139
|
def responses
|
141
|
-
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/responses").parse
|
140
|
+
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/responses?v=2").parse
|
142
141
|
end
|
143
|
-
|
144
142
|
# The ID of the video, useful for searching for the video again without having to store it anywhere.
|
145
143
|
# A regular query search, with this id will return the same video.
|
146
144
|
#
|
data/lib/youtube_it/parser.rb
CHANGED
@@ -2,7 +2,7 @@ class YouTubeIt
|
|
2
2
|
module Parser #:nodoc:
|
3
3
|
class FeedParser #:nodoc:
|
4
4
|
def initialize(content)
|
5
|
-
@content = open(content).read
|
5
|
+
@content = (content =~ URI::regexp(%w(http https)) ? open(content).read : content)
|
6
6
|
|
7
7
|
rescue OpenURI::HTTPError => e
|
8
8
|
raise OpenURI::HTTPError.new(e.io.status[0],e)
|
@@ -41,8 +41,8 @@ class YouTubeIt
|
|
41
41
|
protected
|
42
42
|
def parse_entry(entry)
|
43
43
|
author = YouTubeIt::Model::Author.new(
|
44
|
-
:name => entry.elements["author"].elements["name"].text,
|
45
|
-
:uri => entry.elements["author"].elements["uri"].text
|
44
|
+
:name => (entry.elements["author"].elements["name"].text rescue nil),
|
45
|
+
:uri => (entry.elements["author"].elements["uri"].text rescue nil)
|
46
46
|
)
|
47
47
|
YouTubeIt::Model::Comment.new(
|
48
48
|
:author => author,
|
@@ -1,5 +1,20 @@
|
|
1
1
|
class YouTubeIt
|
2
2
|
module Upload
|
3
|
+
|
4
|
+
class UploadError < YouTubeIt::Error; end
|
5
|
+
|
6
|
+
class AuthenticationError < YouTubeIt::Error; end
|
7
|
+
|
8
|
+
# Implements video uploads/updates/deletions
|
9
|
+
#
|
10
|
+
# require 'youtube_it'
|
11
|
+
#
|
12
|
+
# uploader = YouTubeIt::Upload::VideoUpload.new("user", "pass", "dev-key")
|
13
|
+
# uploader.upload File.open("test.m4v"), :title => 'test',
|
14
|
+
# :description => 'cool vid d00d',
|
15
|
+
# :category => 'People',
|
16
|
+
# :keywords => %w[cool blah test]
|
17
|
+
#
|
3
18
|
class VideoUpload
|
4
19
|
include YouTubeIt::Logging
|
5
20
|
|
@@ -60,7 +75,7 @@ class YouTubeIt
|
|
60
75
|
@opts = { :mime_type => 'video/mp4',
|
61
76
|
:title => '',
|
62
77
|
:description => '',
|
63
|
-
:category => '',
|
78
|
+
:category => 'People',
|
64
79
|
:keywords => [] }.merge(opts)
|
65
80
|
|
66
81
|
@opts[:filename] ||= generate_uniq_filename_from(data)
|
@@ -88,7 +103,11 @@ class YouTubeIt
|
|
88
103
|
# :private
|
89
104
|
# When the authentication credentials are incorrect, an AuthenticationError will be raised.
|
90
105
|
def update(video_id, options)
|
91
|
-
@opts
|
106
|
+
@opts = { :title => '',
|
107
|
+
:description => '',
|
108
|
+
:category => 'People',
|
109
|
+
:keywords => [] }.merge(options)
|
110
|
+
|
92
111
|
update_body = video_xml
|
93
112
|
update_url = "/feeds/api/users/default/uploads/%s" % video_id
|
94
113
|
response = yt_session.put(update_url, update_body)
|
@@ -156,7 +175,6 @@ class YouTubeIt
|
|
156
175
|
comment_url = "/feeds/api/videos/%s/comments?" % video_id
|
157
176
|
comment_url << opts.collect { |k,p| [k,p].join '=' }.join('&')
|
158
177
|
response = yt_session.get(comment_url)
|
159
|
-
|
160
178
|
return YouTubeIt::Parser::CommentsFeedParser.new(response).parse
|
161
179
|
end
|
162
180
|
|
@@ -289,6 +307,22 @@ class YouTubeIt
|
|
289
307
|
|
290
308
|
return REXML::Document.new(response.body).elements["entry"].elements['author'].elements['name'].text
|
291
309
|
end
|
310
|
+
|
311
|
+
def add_response(original_video_id, response_video_id)
|
312
|
+
response_body = video_xml_for(:response => response_video_id)
|
313
|
+
response_url = "/feeds/api/videos/%s/responses" % original_video_id
|
314
|
+
response = yt_session.post(response_url, response_body)
|
315
|
+
|
316
|
+
return {:code => response.status, :body => response.body}
|
317
|
+
end
|
318
|
+
|
319
|
+
def delete_response(original_video_id, response_video_id)
|
320
|
+
response_url = "/feeds/api/videos/%s/responses/%s" % [original_video_id, response_video_id]
|
321
|
+
response = yt_session.delete(response_url)
|
322
|
+
|
323
|
+
return {:code => response.status, :body => response.body}
|
324
|
+
end
|
325
|
+
|
292
326
|
|
293
327
|
private
|
294
328
|
|
@@ -315,6 +349,36 @@ class YouTubeIt
|
|
315
349
|
header
|
316
350
|
end
|
317
351
|
|
352
|
+
def parse_upload_error_from(string)
|
353
|
+
begin
|
354
|
+
REXML::Document.new(string).elements["//errors"].inject('') do | all_faults, error|
|
355
|
+
if error.elements["internalReason"]
|
356
|
+
msg_error = error.elements["internalReason"].text
|
357
|
+
elsif error.elements["location"]
|
358
|
+
msg_error = error.elements["location"].text[/media:group\/media:(.*)\/text\(\)/,1]
|
359
|
+
else
|
360
|
+
msg_error = "Unspecified error"
|
361
|
+
end
|
362
|
+
code = error.elements["code"].text if error.elements["code"]
|
363
|
+
all_faults + sprintf("%s: %s\n", msg_error, code)
|
364
|
+
end
|
365
|
+
rescue
|
366
|
+
string[/<TITLE>(.+)<\/TITLE>/, 1] || string
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
def raise_on_faulty_response(response)
|
371
|
+
response_code = response.code.to_i
|
372
|
+
msg = parse_upload_error_from(response.body.gsub(/\n/, ''))
|
373
|
+
|
374
|
+
if response_code == 403 || response_code == 401
|
375
|
+
#if response_code / 10 == 40
|
376
|
+
raise AuthenticationError.new(msg, response_code)
|
377
|
+
elsif response_code / 10 != 20 # Response in 20x means success
|
378
|
+
raise UploadError.new(msg, response_code)
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
318
382
|
def uploaded_video_id_from(string)
|
319
383
|
xml = REXML::Document.new(string)
|
320
384
|
xml.elements["//id"].text[/videos\/(.+)/, 1]
|
@@ -342,7 +406,7 @@ class YouTubeIt
|
|
342
406
|
|
343
407
|
def auth_token
|
344
408
|
@auth_token ||= begin
|
345
|
-
http = Faraday.new("https://www.google.com")
|
409
|
+
http = Faraday.new("https://www.google.com", :ssl => {:verify => false})
|
346
410
|
body = "Email=#{YouTubeIt.esc @user}&Passwd=#{YouTubeIt.esc @password}&service=youtube&source=#{YouTubeIt.esc @client_id}"
|
347
411
|
response = http.post("/youtube/accounts/ClientLogin", body, "Content-Type" => "application/x-www-form-urlencoded")
|
348
412
|
raise ::AuthenticationError.new(response.body[/Error=(.+)/,1], response.status.to_i) if response.status.to_i != 200
|
@@ -378,7 +442,7 @@ class YouTubeIt
|
|
378
442
|
b.instruct!
|
379
443
|
b.entry(:xmlns => "http://www.w3.org/2005/Atom", 'xmlns:yt' => "http://gdata.youtube.com/schemas/2007") do | m |
|
380
444
|
m.content(data[:comment]) if data[:comment]
|
381
|
-
m.id(data[:favorite] || data[:playlist]) if data[:favorite] || data[:playlist]
|
445
|
+
m.id(data[:favorite] || data[:playlist] || data[:response]) if data[:favorite] || data[:playlist] || data[:response]
|
382
446
|
m.tag!("yt:rating", :value => data[:rating]) if data[:rating]
|
383
447
|
if(data[:subscribe])
|
384
448
|
m.category(:scheme => "http://gdata.youtube.com/schemas/2007/subscriptiontypes.cat", :term => "channel")
|
@@ -420,11 +484,12 @@ class YouTubeIt
|
|
420
484
|
end
|
421
485
|
|
422
486
|
def yt_session(url = nil)
|
423
|
-
Faraday.new(:url => url ? url : base_url) do |builder|
|
487
|
+
Faraday.new(:url => (url ? url : base_url), :ssl => {:verify => false}) do |builder|
|
424
488
|
builder.use Faraday::Request::OAuth, @config_token if @config_token
|
425
489
|
builder.use Faraday::Request::AuthHeader, authorization_headers
|
426
490
|
builder.use Faraday::Response::YouTubeIt
|
427
|
-
builder.adapter Faraday.default_adapter
|
491
|
+
builder.adapter Faraday.default_adapter
|
492
|
+
|
428
493
|
end
|
429
494
|
end
|
430
495
|
end
|
data/lib/youtube_it.rb
CHANGED
@@ -8,16 +8,21 @@ require 'oauth'
|
|
8
8
|
require 'faraday'
|
9
9
|
|
10
10
|
class YouTubeIt
|
11
|
-
|
11
|
+
|
12
12
|
# Base error class for the extension
|
13
13
|
class Error < RuntimeError
|
14
|
+
attr_reader :code
|
15
|
+
def initialize(msg, code = 0)
|
16
|
+
super(msg)
|
17
|
+
@code = code
|
18
|
+
end
|
14
19
|
end
|
15
|
-
|
16
|
-
# URL-escape a string. Stolen from Camping (wonder how many Ruby libs in the wild can say the same)
|
20
|
+
|
17
21
|
def self.esc(s) #:nodoc:
|
18
|
-
|
22
|
+
# URI encodes correctly Unicode characters
|
23
|
+
URI.encode(s.to_s.tr(' ','+'))
|
19
24
|
end
|
20
|
-
|
25
|
+
|
21
26
|
# Set the logger for the library
|
22
27
|
def self.logger=(any_logger)
|
23
28
|
@logger = any_logger
|
@@ -27,16 +32,16 @@ class YouTubeIt
|
|
27
32
|
def self.logger
|
28
33
|
@logger ||= create_default_logger
|
29
34
|
end
|
30
|
-
|
35
|
+
|
31
36
|
# Gets mixed into the classes to provide the logger method
|
32
37
|
module Logging #:nodoc:
|
33
|
-
|
38
|
+
|
34
39
|
# Return the base logger set for the library
|
35
40
|
def logger
|
36
41
|
YouTubeIt.logger
|
37
42
|
end
|
38
43
|
end
|
39
|
-
|
44
|
+
|
40
45
|
private
|
41
46
|
def self.create_default_logger
|
42
47
|
logger = Logger.new(STDOUT)
|
@@ -45,7 +50,7 @@ class YouTubeIt
|
|
45
50
|
end
|
46
51
|
end
|
47
52
|
|
48
|
-
%w(
|
53
|
+
%w(
|
49
54
|
version
|
50
55
|
client
|
51
56
|
record
|
@@ -69,8 +74,8 @@ end
|
|
69
74
|
request/video_upload
|
70
75
|
request/video_search
|
71
76
|
response/video_search
|
72
|
-
middleware/faraday_authheader.rb
|
73
|
-
middleware/faraday_oauth.rb
|
77
|
+
middleware/faraday_authheader.rb
|
78
|
+
middleware/faraday_oauth.rb
|
74
79
|
middleware/faraday_youtubeit.rb
|
75
80
|
chain_io
|
76
81
|
).each{|m| require File.dirname(__FILE__) + '/youtube_it/' + m }
|
data/test/test_client.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
1
3
|
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
4
|
|
3
5
|
class TestClient < Test::Unit::TestCase
|
@@ -233,13 +235,13 @@ class TestClient < Test::Unit::TestCase
|
|
233
235
|
assert video.noembed
|
234
236
|
@client.video_delete(video.unique_id)
|
235
237
|
end
|
236
|
-
|
238
|
+
|
237
239
|
|
238
240
|
def test_should_add_new_comment
|
239
241
|
video = @client.video_upload(File.open("test/test.mov"), OPTIONS)
|
240
242
|
@client.add_comment(video.unique_id, "test comment")
|
241
243
|
comment = @client.comments(video.unique_id).first.content
|
242
|
-
assert comment
|
244
|
+
assert comment, "test comment"
|
243
245
|
@client.video_delete(video.unique_id)
|
244
246
|
end
|
245
247
|
|
@@ -342,6 +344,21 @@ class TestClient < Test::Unit::TestCase
|
|
342
344
|
sleep 4
|
343
345
|
assert @client.delete_favorite(video_id)
|
344
346
|
end
|
347
|
+
|
348
|
+
def test_esc
|
349
|
+
result = YouTubeIt.esc("спят усталые игрушки")
|
350
|
+
assert result, "спят+усталые+игрушки"
|
351
|
+
end
|
352
|
+
|
353
|
+
def test_unicode_query
|
354
|
+
videos = @client.videos_by(:query => 'спят усталые игрушки').videos
|
355
|
+
assert videos.map(&:unique_id).include?("w-7BT2CFYNU")
|
356
|
+
end
|
357
|
+
|
358
|
+
def test_return_video_by_url
|
359
|
+
video = @client.video_by("https://www.youtube.com/watch?v=EkF4JD2rO3Q")
|
360
|
+
assert_valid_video video
|
361
|
+
end
|
345
362
|
|
346
363
|
private
|
347
364
|
|
data/test/test_video.rb
CHANGED
@@ -15,9 +15,9 @@ class TestVideo < Test::Unit::TestCase
|
|
15
15
|
video = YouTubeIt::Model::Video.new(:video_id => "tag:youtube.com,2008:video:BDqs-OZWw9o")
|
16
16
|
response = video.related
|
17
17
|
|
18
|
-
assert_equal "
|
18
|
+
assert_equal "tag:youtube.com,2008:video:BDqs-OZWw9o:related", response.feed_id
|
19
19
|
assert_equal 25, response.max_result_count
|
20
|
-
assert_equal
|
20
|
+
assert_equal 23, response.videos.length
|
21
21
|
assert_equal 1, response.offset
|
22
22
|
assert(response.total_result_count > 0)
|
23
23
|
assert_instance_of Time, response.updated_at
|
@@ -27,7 +27,7 @@ class TestVideo < Test::Unit::TestCase
|
|
27
27
|
video = YouTubeIt::Model::Video.new(:video_id => "tag:youtube.com,2008:video:BDqs-OZWw9o")
|
28
28
|
response = video.responses
|
29
29
|
|
30
|
-
assert_equal "
|
30
|
+
assert_equal "tag:youtube.com,2008:video:BDqs-OZWw9o:responses", response.feed_id
|
31
31
|
assert_equal 25, response.max_result_count
|
32
32
|
assert_equal 25, response.videos.length
|
33
33
|
assert_equal 1, response.offset
|
data/youtube_it.gemspec
CHANGED
@@ -5,17 +5,19 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{youtube_it}
|
8
|
-
s.version = "2.0
|
8
|
+
s.version = "2.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date = %q{2011-
|
11
|
+
s.authors = ["kylejginavan", "chebyte", "mseppae"]
|
12
|
+
s.date = %q{2011-12-16}
|
13
13
|
s.description = %q{Upload, delete, update, comment on youtube videos all from one gem.}
|
14
14
|
s.email = %q{kylejginavan@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README.rdoc"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
|
+
"Gemfile",
|
20
|
+
"Gemfile.lock",
|
19
21
|
"Manifest.txt",
|
20
22
|
"README.rdoc",
|
21
23
|
"Rakefile",
|
@@ -61,34 +63,40 @@ Gem::Specification.new do |s|
|
|
61
63
|
"youtube_it.gemspec"
|
62
64
|
]
|
63
65
|
s.homepage = %q{http://github.com/kylejginavan/youtube_it}
|
64
|
-
s.require_paths = [
|
65
|
-
s.rubygems_version = %q{1.
|
66
|
+
s.require_paths = ["lib"]
|
67
|
+
s.rubygems_version = %q{1.5.2}
|
66
68
|
s.summary = %q{The most complete Ruby wrapper for youtube api's}
|
67
|
-
s.test_files = [
|
68
|
-
"test/helper.rb",
|
69
|
-
"test/test_chain_io.rb",
|
70
|
-
"test/test_client.rb",
|
71
|
-
"test/test_field_search.rb",
|
72
|
-
"test/test_video.rb",
|
73
|
-
"test/test_video_feed_parser.rb",
|
74
|
-
"test/test_video_search.rb"
|
75
|
-
]
|
76
69
|
|
77
70
|
if s.respond_to? :specification_version then
|
78
71
|
s.specification_version = 3
|
79
72
|
|
80
73
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
74
|
+
s.add_runtime_dependency(%q<oauth>, [">= 0"])
|
75
|
+
s.add_runtime_dependency(%q<simple_oauth>, [">= 0"])
|
76
|
+
s.add_runtime_dependency(%q<builder>, [">= 0"])
|
77
|
+
s.add_runtime_dependency(%q<faraday>, [">= 0"])
|
78
|
+
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
81
79
|
s.add_runtime_dependency(%q<oauth>, [">= 0.4.4"])
|
82
80
|
s.add_runtime_dependency(%q<simple_oauth>, [">= 0.1.5"])
|
83
81
|
s.add_runtime_dependency(%q<faraday>, [">= 0.7.3"])
|
84
82
|
s.add_runtime_dependency(%q<builder>, [">= 0"])
|
85
83
|
else
|
84
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
85
|
+
s.add_dependency(%q<simple_oauth>, [">= 0"])
|
86
|
+
s.add_dependency(%q<builder>, [">= 0"])
|
87
|
+
s.add_dependency(%q<faraday>, [">= 0"])
|
88
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
86
89
|
s.add_dependency(%q<oauth>, [">= 0.4.4"])
|
87
90
|
s.add_dependency(%q<simple_oauth>, [">= 0.1.5"])
|
88
91
|
s.add_dependency(%q<faraday>, [">= 0.7.3"])
|
89
92
|
s.add_dependency(%q<builder>, [">= 0"])
|
90
93
|
end
|
91
94
|
else
|
95
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
96
|
+
s.add_dependency(%q<simple_oauth>, [">= 0"])
|
97
|
+
s.add_dependency(%q<builder>, [">= 0"])
|
98
|
+
s.add_dependency(%q<faraday>, [">= 0"])
|
99
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
92
100
|
s.add_dependency(%q<oauth>, [">= 0.4.4"])
|
93
101
|
s.add_dependency(%q<simple_oauth>, [">= 0.1.5"])
|
94
102
|
s.add_dependency(%q<faraday>, [">= 0.7.3"])
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: youtube_it
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 11
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 2.1.0
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- kylejginavan
|
@@ -12,52 +17,141 @@ autorequire:
|
|
12
17
|
bindir: bin
|
13
18
|
cert_chain: []
|
14
19
|
|
15
|
-
date: 2011-
|
20
|
+
date: 2011-12-16 00:00:00 -06:00
|
21
|
+
default_executable:
|
16
22
|
dependencies:
|
17
23
|
- !ruby/object:Gem::Dependency
|
18
|
-
|
19
|
-
prerelease: false
|
24
|
+
type: :runtime
|
20
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
21
26
|
none: false
|
22
27
|
requirements:
|
23
28
|
- - ">="
|
24
29
|
- !ruby/object:Gem::Version
|
25
|
-
|
26
|
-
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
34
|
+
name: oauth
|
27
35
|
version_requirements: *id001
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: simple_oauth
|
30
36
|
prerelease: false
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
type: :runtime
|
31
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
32
40
|
none: false
|
33
41
|
requirements:
|
34
42
|
- - ">="
|
35
43
|
- !ruby/object:Gem::Version
|
36
|
-
|
37
|
-
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
name: simple_oauth
|
38
49
|
version_requirements: *id002
|
39
|
-
- !ruby/object:Gem::Dependency
|
40
|
-
name: faraday
|
41
50
|
prerelease: false
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
type: :runtime
|
42
53
|
requirement: &id003 !ruby/object:Gem::Requirement
|
43
54
|
none: false
|
44
55
|
requirements:
|
45
56
|
- - ">="
|
46
57
|
- !ruby/object:Gem::Version
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
51
62
|
name: builder
|
63
|
+
version_requirements: *id003
|
52
64
|
prerelease: false
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
type: :runtime
|
53
67
|
requirement: &id004 !ruby/object:Gem::Requirement
|
54
68
|
none: false
|
55
69
|
requirements:
|
56
70
|
- - ">="
|
57
71
|
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
58
75
|
version: "0"
|
59
|
-
|
76
|
+
name: faraday
|
60
77
|
version_requirements: *id004
|
78
|
+
prerelease: false
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
type: :runtime
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
name: nokogiri
|
91
|
+
version_requirements: *id005
|
92
|
+
prerelease: false
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
type: :runtime
|
95
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 7
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
- 4
|
104
|
+
- 4
|
105
|
+
version: 0.4.4
|
106
|
+
name: oauth
|
107
|
+
version_requirements: *id006
|
108
|
+
prerelease: false
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
type: :runtime
|
111
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
hash: 17
|
117
|
+
segments:
|
118
|
+
- 0
|
119
|
+
- 1
|
120
|
+
- 5
|
121
|
+
version: 0.1.5
|
122
|
+
name: simple_oauth
|
123
|
+
version_requirements: *id007
|
124
|
+
prerelease: false
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
type: :runtime
|
127
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
hash: 5
|
133
|
+
segments:
|
134
|
+
- 0
|
135
|
+
- 7
|
136
|
+
- 3
|
137
|
+
version: 0.7.3
|
138
|
+
name: faraday
|
139
|
+
version_requirements: *id008
|
140
|
+
prerelease: false
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
type: :runtime
|
143
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
hash: 3
|
149
|
+
segments:
|
150
|
+
- 0
|
151
|
+
version: "0"
|
152
|
+
name: builder
|
153
|
+
version_requirements: *id009
|
154
|
+
prerelease: false
|
61
155
|
description: Upload, delete, update, comment on youtube videos all from one gem.
|
62
156
|
email: kylejginavan@gmail.com
|
63
157
|
executables: []
|
@@ -67,6 +161,8 @@ extensions: []
|
|
67
161
|
extra_rdoc_files:
|
68
162
|
- README.rdoc
|
69
163
|
files:
|
164
|
+
- Gemfile
|
165
|
+
- Gemfile.lock
|
70
166
|
- Manifest.txt
|
71
167
|
- README.rdoc
|
72
168
|
- Rakefile
|
@@ -110,6 +206,7 @@ files:
|
|
110
206
|
- test/test_video_feed_parser.rb
|
111
207
|
- test/test_video_search.rb
|
112
208
|
- youtube_it.gemspec
|
209
|
+
has_rdoc: true
|
113
210
|
homepage: http://github.com/kylejginavan/youtube_it
|
114
211
|
licenses: []
|
115
212
|
|
@@ -123,25 +220,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
220
|
requirements:
|
124
221
|
- - ">="
|
125
222
|
- !ruby/object:Gem::Version
|
223
|
+
hash: 3
|
224
|
+
segments:
|
225
|
+
- 0
|
126
226
|
version: "0"
|
127
227
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
228
|
none: false
|
129
229
|
requirements:
|
130
230
|
- - ">="
|
131
231
|
- !ruby/object:Gem::Version
|
232
|
+
hash: 3
|
233
|
+
segments:
|
234
|
+
- 0
|
132
235
|
version: "0"
|
133
236
|
requirements: []
|
134
237
|
|
135
238
|
rubyforge_project:
|
136
|
-
rubygems_version: 1.
|
239
|
+
rubygems_version: 1.5.2
|
137
240
|
signing_key:
|
138
241
|
specification_version: 3
|
139
242
|
summary: The most complete Ruby wrapper for youtube api's
|
140
|
-
test_files:
|
141
|
-
|
142
|
-
- test/test_chain_io.rb
|
143
|
-
- test/test_client.rb
|
144
|
-
- test/test_field_search.rb
|
145
|
-
- test/test_video.rb
|
146
|
-
- test/test_video_feed_parser.rb
|
147
|
-
- test/test_video_search.rb
|
243
|
+
test_files: []
|
244
|
+
|