youtube_it 2.1.13 → 2.2.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/README.rdoc +17 -3
- data/lib/youtube_it.rb +1 -0
- data/lib/youtube_it/client.rb +33 -10
- data/lib/youtube_it/middleware/faraday_authheader.rb +1 -1
- data/lib/youtube_it/model/video.rb +8 -2
- data/lib/youtube_it/parser.rb +23 -3
- data/lib/youtube_it/request/standard_search.rb +1 -1
- data/lib/youtube_it/request/user_search.rb +1 -1
- data/lib/youtube_it/request/video_search.rb +2 -2
- data/lib/youtube_it/request/video_upload.rb +111 -15
- data/lib/youtube_it/version.rb +1 -1
- metadata +133 -156
data/README.rdoc
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
will be destined to the Tuquito Libre Foundation(http://fundacion.tuquito.org.ar) for developing
|
8
8
|
technology projects intended to close the digital gap in Latin America.
|
9
9
|
|
10
|
-
{<img src=
|
10
|
+
{<img src=http://www.pledgie.com/campaigns/16746.png?skin_name=chrome>}[http://www.pledgie.com/campaigns/16746]
|
11
11
|
|
12
12
|
== DESCRIPTION
|
13
13
|
|
@@ -91,7 +91,7 @@ Standard Queries:
|
|
91
91
|
$ client.videos_by(:most_viewed)
|
92
92
|
$ client.videos_by(:most_linked, :page => 3)
|
93
93
|
$ client.videos_by(:top_rated, :time => :today)
|
94
|
-
|
94
|
+
$ client.get_all_videos(:top_rated, :time => :today)
|
95
95
|
Advanced Queries (with boolean operators OR (either), AND (include), NOT (exclude)):
|
96
96
|
$ client.videos_by(:categories => { :either => [:news, :sports], :exclude => [:comedy] }, :tags => { :include => ['football'], :exclude => ['soccer'] })
|
97
97
|
|
@@ -213,11 +213,14 @@ Delete Playlist:
|
|
213
213
|
$ client.delete_playlist(playlist_id)
|
214
214
|
|
215
215
|
Add Video To Playlist:
|
216
|
-
$ client.add_video_to_playlist(playlist_id, video_id)
|
216
|
+
$ client.add_video_to_playlist(playlist_id, video_id, position)
|
217
217
|
|
218
218
|
Remove Video From Playlist:
|
219
219
|
$ client.delete_video_from_playlist(playlist_id, playlist_entry_id)
|
220
220
|
|
221
|
+
Update Position Video From Playlist:
|
222
|
+
$ client.update_position_video_from_playlist(playlist_id, playlist_entry_id, position)
|
223
|
+
|
221
224
|
Select All Videos From your Watch Later Playlist:
|
222
225
|
$ watcher_later = client.watcherlater(user) #default: current user
|
223
226
|
$ watcher_later.videos
|
@@ -244,6 +247,12 @@ List Response Videos
|
|
244
247
|
$ video.responses.videos
|
245
248
|
|
246
249
|
|
250
|
+
== BATCH VIDEOS
|
251
|
+
you can list many videos at the same time
|
252
|
+
|
253
|
+
$ client.videos(['video_id_1', 'video_id_2',...])
|
254
|
+
|
255
|
+
|
247
256
|
== ACCESS CONTROL LIST
|
248
257
|
|
249
258
|
You can give permissions in your videos, for example denied comments, rate, etc...
|
@@ -263,6 +272,11 @@ List Response Videos
|
|
263
272
|
|
264
273
|
client.video_upload(File.open("test.mov"), :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test], :comment => "denied")
|
265
274
|
|
275
|
+
== Partial Updates
|
276
|
+
You can send a single PATCH request to add, replace and/or delete specific fields for a particular resource.
|
277
|
+
|
278
|
+
client.video_partial_update(video.unique_id, :list => 'denied', :embed => 'allowed')
|
279
|
+
|
266
280
|
== User Activity
|
267
281
|
You can get user activity with the followings params:
|
268
282
|
|
data/lib/youtube_it.rb
CHANGED
data/lib/youtube_it/client.rb
CHANGED
@@ -91,17 +91,28 @@ class YouTubeIt
|
|
91
91
|
else
|
92
92
|
vid = video
|
93
93
|
end
|
94
|
-
video_id ="http://gdata.youtube.com/feeds/api/videos/#{vid}?v
|
94
|
+
video_id ="http://gdata.youtube.com/feeds/api/videos/#{vid}?v=#{YouTubeIt::API_VERSION}#{@dev_key ? '&key='+@dev_key : ''}"
|
95
95
|
parser = YouTubeIt::Parser::VideoFeedParser.new(video_id)
|
96
96
|
parser.parse
|
97
97
|
end
|
98
98
|
|
99
99
|
def video_by_user(user, vid)
|
100
|
-
video_id = "http://gdata.youtube.com/feeds/api/users/#{user}/uploads/#{vid}?v
|
100
|
+
video_id = "http://gdata.youtube.com/feeds/api/users/#{user}/uploads/#{vid}?v=#{YouTubeIt::API_VERSION}#{@dev_key ? '&key='+@dev_key : ''}"
|
101
101
|
parser = YouTubeIt::Parser::VideoFeedParser.new(video_id)
|
102
102
|
parser.parse
|
103
103
|
end
|
104
104
|
|
105
|
+
def get_all_videos(opts)
|
106
|
+
page = videos_by(opts.merge({:page => 1}))
|
107
|
+
videos = page.videos
|
108
|
+
|
109
|
+
while page.next_page && (page = videos_by(opts.merge({:page => page.next_page})) || true)
|
110
|
+
videos += page.videos
|
111
|
+
end
|
112
|
+
|
113
|
+
videos
|
114
|
+
end
|
115
|
+
|
105
116
|
def video_upload(data, opts = {})
|
106
117
|
client.upload(data, opts)
|
107
118
|
end
|
@@ -110,6 +121,10 @@ class YouTubeIt
|
|
110
121
|
client.update(video_id, opts)
|
111
122
|
end
|
112
123
|
|
124
|
+
def video_partial_update(video_id, opts = {})
|
125
|
+
client.partial_update(video_id, opts)
|
126
|
+
end
|
127
|
+
|
113
128
|
def captions_update(video_id, data, opts = {})
|
114
129
|
client.captions_update(video_id, data, opts)
|
115
130
|
end
|
@@ -160,6 +175,10 @@ class YouTubeIt
|
|
160
175
|
def profiles(*users)
|
161
176
|
client.profiles(*users)
|
162
177
|
end
|
178
|
+
|
179
|
+
def videos(*idxes)
|
180
|
+
client.videos(*idxes)
|
181
|
+
end
|
163
182
|
|
164
183
|
# Fetches a user's activity feed.
|
165
184
|
def activity(user = nil, opts = {})
|
@@ -178,8 +197,8 @@ class YouTubeIt
|
|
178
197
|
client.delete_video_from_watchlater(video_id)
|
179
198
|
end
|
180
199
|
|
181
|
-
def playlist(playlist_id,
|
182
|
-
client.playlist(playlist_id,
|
200
|
+
def playlist(playlist_id, opts = {})
|
201
|
+
client.playlist(playlist_id, opts)
|
183
202
|
end
|
184
203
|
|
185
204
|
def playlists(user = nil, opts = nil)
|
@@ -210,8 +229,12 @@ class YouTubeIt
|
|
210
229
|
client.update_playlist(playlist_id, options)
|
211
230
|
end
|
212
231
|
|
213
|
-
def add_video_to_playlist(playlist_id, video_id)
|
214
|
-
client.add_video_to_playlist(playlist_id, video_id)
|
232
|
+
def add_video_to_playlist(playlist_id, video_id, position = nil)
|
233
|
+
client.add_video_to_playlist(playlist_id, video_id, position)
|
234
|
+
end
|
235
|
+
|
236
|
+
def update_position_video_from_playlist(playlist_id, playlist_entry_id, position = nil)
|
237
|
+
client.update_position_video_from_playlist(playlist_id, playlist_entry_id, position)
|
215
238
|
end
|
216
239
|
|
217
240
|
def delete_video_from_playlist(playlist_id, playlist_entry_id)
|
@@ -263,12 +286,12 @@ class YouTubeIt
|
|
263
286
|
client.get_my_video(video_id)
|
264
287
|
end
|
265
288
|
|
266
|
-
# Gets all videos
|
289
|
+
# Gets all videos
|
267
290
|
def my_videos(opts = {})
|
268
291
|
client.get_my_videos(opts)
|
269
292
|
end
|
270
293
|
|
271
|
-
# Gets all of the user's contacts/friends.
|
294
|
+
# Gets all of the user's contacts/friends.
|
272
295
|
def my_contacts(opts = {})
|
273
296
|
client.get_my_contacts(opts)
|
274
297
|
end
|
@@ -278,7 +301,7 @@ class YouTubeIt
|
|
278
301
|
client.send_message(opts)
|
279
302
|
end
|
280
303
|
|
281
|
-
# Gets all of the user's messages/inbox.
|
304
|
+
# Gets all of the user's messages/inbox.
|
282
305
|
def my_messages(opts = {})
|
283
306
|
client.get_my_messages(opts)
|
284
307
|
end
|
@@ -490,7 +513,7 @@ class YouTubeIt
|
|
490
513
|
end
|
491
514
|
@access_token
|
492
515
|
end
|
493
|
-
|
516
|
+
|
494
517
|
def session_token_info
|
495
518
|
response = Faraday.get("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=#{@client_access_token}")
|
496
519
|
{:code => response.status, :body => response.body }
|
@@ -5,7 +5,7 @@ module FaradayMiddleware
|
|
5
5
|
req_headers = env[:request_headers]
|
6
6
|
req_headers.merge!(@headers)
|
7
7
|
unless req_headers.include?("GData-Version")
|
8
|
-
req_headers.merge!("GData-Version" => "2")
|
8
|
+
req_headers.merge!("GData-Version" => "2.1")
|
9
9
|
end
|
10
10
|
unless req_headers.include?("Content-Type")
|
11
11
|
req_headers.merge!("Content-Type" => "application/atom+xml; charset=UTF-8")
|
@@ -100,6 +100,9 @@ class YouTubeIt
|
|
100
100
|
# *String*:: Description of the video.
|
101
101
|
attr_reader :html_content
|
102
102
|
|
103
|
+
# *String*:: Description of the video.
|
104
|
+
attr_reader :raw_content
|
105
|
+
|
103
106
|
# YouTubeIt::Model::Author:: Information about the YouTube user who owns a piece of video content.
|
104
107
|
attr_reader :author
|
105
108
|
|
@@ -141,19 +144,22 @@ class YouTubeIt
|
|
141
144
|
attr_reader :latitude
|
142
145
|
attr_reader :longitude
|
143
146
|
|
147
|
+
# Playlist position
|
148
|
+
attr_reader :video_position
|
149
|
+
|
144
150
|
# Videos related to the current video.
|
145
151
|
#
|
146
152
|
# === Returns
|
147
153
|
# YouTubeIt::Response::VideoSearch
|
148
154
|
def related
|
149
|
-
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/related?v
|
155
|
+
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/related?v=#{YouTubeIt::API_VERSION}").parse
|
150
156
|
end
|
151
157
|
# Video responses to the current video.
|
152
158
|
#
|
153
159
|
# === Returns
|
154
160
|
# YouTubeIt::Response::VideoSearch
|
155
161
|
def responses
|
156
|
-
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/responses?v
|
162
|
+
YouTubeIt::Parser::VideosFeedParser.new("http://gdata.youtube.com/feeds/api/videos/#{unique_id}/responses?v=#{YouTubeIt::API_VERSION}").parse
|
157
163
|
end
|
158
164
|
|
159
165
|
|
data/lib/youtube_it/parser.rb
CHANGED
@@ -340,7 +340,7 @@ class YouTubeIt
|
|
340
340
|
end.reduce({},:merge)
|
341
341
|
end
|
342
342
|
end
|
343
|
-
|
343
|
+
|
344
344
|
class SubscriptionFeedParser < FeedParser #:nodoc:
|
345
345
|
|
346
346
|
def parse_content(content)
|
@@ -474,11 +474,14 @@ class YouTubeIt
|
|
474
474
|
:height => thumb_element["height"].to_i,
|
475
475
|
:width => thumb_element["width"].to_i,
|
476
476
|
:time => thumb_element["time"],
|
477
|
-
:name => thumb_element["name"])
|
477
|
+
:name => thumb_element["yt:name"])
|
478
478
|
end
|
479
479
|
|
480
480
|
rating_element = entry.at_xpath("gd:rating") rescue nil
|
481
481
|
extended_rating_element = entry.at_xpath("yt:rating") rescue nil
|
482
|
+
unless entry.at_xpath("yt:position").nil?
|
483
|
+
video_position = entry.at_xpath("yt:position").text
|
484
|
+
end
|
482
485
|
|
483
486
|
rating = nil
|
484
487
|
if rating_element
|
@@ -544,7 +547,6 @@ class YouTubeIt
|
|
544
547
|
:categories => categories,
|
545
548
|
:keywords => keywords,
|
546
549
|
:title => title,
|
547
|
-
:html_content => html_content,
|
548
550
|
:author => author,
|
549
551
|
:description => description,
|
550
552
|
:duration => duration,
|
@@ -560,11 +562,13 @@ class YouTubeIt
|
|
560
562
|
:noembed => noembed,
|
561
563
|
:safe_search => safe_search,
|
562
564
|
:position => position,
|
565
|
+
:video_position => video_position,
|
563
566
|
:latitude => latitude,
|
564
567
|
:longitude => longitude,
|
565
568
|
:state => state,
|
566
569
|
:insight_uri => insight_uri,
|
567
570
|
:unique_id => ytid,
|
571
|
+
:raw_content => entry,
|
568
572
|
:perm_private => perm_private)
|
569
573
|
end
|
570
574
|
|
@@ -585,6 +589,22 @@ class YouTubeIt
|
|
585
589
|
end
|
586
590
|
end
|
587
591
|
|
592
|
+
class BatchVideoFeedParser < VideoFeedParser
|
593
|
+
def parse_content(content)
|
594
|
+
Nokogiri::XML(content.body).xpath("//xmlns:entry").map do |entry|
|
595
|
+
entry.namespaces.each {|name, url| entry.document.root.add_namespace name, url }
|
596
|
+
username = entry.at_xpath('batch:id', entry.namespaces).text
|
597
|
+
result = catch(:result) do
|
598
|
+
case entry.at_xpath('batch:status', entry.namespaces)['code'].to_i
|
599
|
+
when 200...300 then parse_entry(entry)
|
600
|
+
else nil
|
601
|
+
end
|
602
|
+
end
|
603
|
+
{ username => result }
|
604
|
+
end.reduce({},:merge)
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
588
608
|
class VideosFeedParser < VideoFeedParser #:nodoc:
|
589
609
|
|
590
610
|
private
|
@@ -42,7 +42,7 @@ class YouTubeIt
|
|
42
42
|
@dev_key = params[:dev_key] if params[:dev_key]
|
43
43
|
|
44
44
|
# Return a single video (base_url + /T7YazwP8GtY)
|
45
|
-
return @url << "/" << params[:video_id] << "?v
|
45
|
+
return @url << "/" << params[:video_id] << "?v=#{YouTubeIt::API_VERSION}" if params[:video_id]
|
46
46
|
|
47
47
|
@url << "/-/" if (params[:categories] || params[:tags])
|
48
48
|
@url << categories_to_params(params.delete(:categories)) if params[:categories]
|
@@ -69,7 +69,7 @@ class YouTubeIt
|
|
69
69
|
'max-results' => @max_results,
|
70
70
|
'orderby' => @order_by,
|
71
71
|
'start-index' => @offset,
|
72
|
-
'v' =>
|
72
|
+
'v' => YouTubeIt::API_VERSION,
|
73
73
|
'q' => @query,
|
74
74
|
'alt' => @response_format,
|
75
75
|
'format' => @video_format,
|
@@ -115,6 +115,15 @@ class YouTubeIt
|
|
115
115
|
return YouTubeIt::Parser::VideoFeedParser.new(response.body).parse rescue nil
|
116
116
|
end
|
117
117
|
|
118
|
+
# Partial updates to a video.
|
119
|
+
def partial_update(video_id, options)
|
120
|
+
update_body = partial_video_xml(options)
|
121
|
+
update_url = "/feeds/api/users/default/uploads/%s" % video_id
|
122
|
+
update_header = { "Content-Type" => "application/xml" }
|
123
|
+
response = yt_session.patch(update_url, update_body, update_header)
|
124
|
+
|
125
|
+
return YouTubeIt::Parser::VideoFeedParser.new(response.body).parse rescue nil
|
126
|
+
end
|
118
127
|
|
119
128
|
def captions_update(video_id, data, options)
|
120
129
|
@opts = {
|
@@ -136,7 +145,7 @@ class YouTubeIt
|
|
136
145
|
# Fetches the currently authenticated user's contacts (i.e. friends).
|
137
146
|
# When the authentication credentials are incorrect, an AuthenticationError will be raised.
|
138
147
|
def get_my_contacts(opts)
|
139
|
-
contacts_url = "/feeds/api/users/default/contacts?v
|
148
|
+
contacts_url = "/feeds/api/users/default/contacts?v=#{YouTubeIt::API_VERSION}"
|
140
149
|
contacts_url << opts.collect { |k,p| [k,p].join '=' }.join('&')
|
141
150
|
response = yt_session.get(contacts_url)
|
142
151
|
|
@@ -253,10 +262,39 @@ class YouTubeIt
|
|
253
262
|
return YouTubeIt::Parser::ProfileFeedParser.new(response).parse
|
254
263
|
end
|
255
264
|
|
265
|
+
def videos(idxes_to_fetch)
|
266
|
+
idxes_to_fetch.each_slice(50).map do |idxes|
|
267
|
+
post = Nokogiri::XML <<-BATCH
|
268
|
+
<feed
|
269
|
+
xmlns='http://www.w3.org/2005/Atom'
|
270
|
+
xmlns:media='http://search.yahoo.com/mrss/'
|
271
|
+
xmlns:batch='http://schemas.google.com/gdata/batch'
|
272
|
+
xmlns:yt='http://gdata.youtube.com/schemas/2007'>
|
273
|
+
</feed>
|
274
|
+
BATCH
|
275
|
+
idxes.each do |idx|
|
276
|
+
post.at('feed').add_child <<-ENTRY
|
277
|
+
<entry>
|
278
|
+
<batch:operation type="query" />
|
279
|
+
<id>/feeds/api/videos/#{idx}?v=#{YouTubeIt::API_VERSION}</id>
|
280
|
+
<batch:id>#{idx}</batch:id>
|
281
|
+
</entry>
|
282
|
+
ENTRY
|
283
|
+
end
|
284
|
+
|
285
|
+
post_body = StringIO.new('')
|
286
|
+
post.write_to( post_body, :indent => 2 )
|
287
|
+
post_body_io = StringIO.new(post_body.string)
|
288
|
+
|
289
|
+
response = yt_session.post('feeds/api/videos/batch', post_body_io )
|
290
|
+
YouTubeIt::Parser::BatchVideoFeedParser.new(response).parse
|
291
|
+
end.reduce({},:merge)
|
292
|
+
end
|
293
|
+
|
256
294
|
def profiles(usernames_to_fetch)
|
257
295
|
usernames_to_fetch.each_slice(50).map do |usernames|
|
258
296
|
post = Nokogiri::XML <<-BATCH
|
259
|
-
<feed
|
297
|
+
<feed
|
260
298
|
xmlns='http://www.w3.org/2005/Atom'
|
261
299
|
xmlns:media='http://search.yahoo.com/mrss/'
|
262
300
|
xmlns:batch='http://schemas.google.com/gdata/batch'
|
@@ -283,12 +321,12 @@ class YouTubeIt
|
|
283
321
|
end
|
284
322
|
|
285
323
|
def profile_url(user=nil)
|
286
|
-
"/feeds/api/users/%s?v
|
324
|
+
"/feeds/api/users/%s?v=#{YouTubeIt::API_VERSION}" % (user || "default")
|
287
325
|
end
|
288
326
|
|
289
327
|
# Return's a user's activity feed.
|
290
328
|
def get_activity(user, opts)
|
291
|
-
activity_url = "/feeds/api/events?author=%s&v
|
329
|
+
activity_url = "/feeds/api/events?author=%s&v=#{YouTubeIt::API_VERSION}&" % (user ? user : "default")
|
292
330
|
activity_url << opts.collect { |k,p| [k,p].join '=' }.join('&')
|
293
331
|
response = yt_session.get(activity_url)
|
294
332
|
|
@@ -296,7 +334,7 @@ class YouTubeIt
|
|
296
334
|
end
|
297
335
|
|
298
336
|
def watchlater(user)
|
299
|
-
watchlater_url = "/feeds/api/users/%s/watch_later?v
|
337
|
+
watchlater_url = "/feeds/api/users/%s/watch_later?v=#{YouTubeIt::API_VERSION}" % (user ? user : "default")
|
300
338
|
response = yt_session.get(watchlater_url)
|
301
339
|
|
302
340
|
return YouTubeIt::Parser::PlaylistFeedParser.new(response).parse
|
@@ -317,9 +355,12 @@ class YouTubeIt
|
|
317
355
|
return true
|
318
356
|
end
|
319
357
|
|
320
|
-
def playlist(playlist_id,
|
321
|
-
playlist_url = "/feeds/api/playlists/%s
|
322
|
-
|
358
|
+
def playlist(playlist_id, opts = {})
|
359
|
+
playlist_url = "/feeds/api/playlists/%s" % playlist_id
|
360
|
+
params = {'v' => 2, 'orderby' => 'position'}
|
361
|
+
params.merge!(opts) if opts
|
362
|
+
playlist_url << "?#{params.collect { |k,v| [k,v].join '=' }.join('&')}"
|
363
|
+
response = yt_session.get(playlist_url)
|
323
364
|
|
324
365
|
return YouTubeIt::Parser::PlaylistFeedParser.new(response).parse
|
325
366
|
end
|
@@ -334,7 +375,7 @@ class YouTubeIt
|
|
334
375
|
# max-results - maximum number of playlists to fetch, up to 25 (default is 25)
|
335
376
|
def playlists(user, opts={})
|
336
377
|
playlist_url = "/feeds/api/users/%s/playlists" % (user ? user : "default")
|
337
|
-
params = {'v' =>
|
378
|
+
params = {'v' => YouTubeIt::API_VERSION}
|
338
379
|
params.merge!(opts) if opts
|
339
380
|
playlist_url << "?#{params.collect { |k,v| [k,v].join '=' }.join('&')}"
|
340
381
|
response = yt_session.get(playlist_url)
|
@@ -350,14 +391,22 @@ class YouTubeIt
|
|
350
391
|
return YouTubeIt::Parser::PlaylistFeedParser.new(response).parse
|
351
392
|
end
|
352
393
|
|
353
|
-
def add_video_to_playlist(playlist_id, video_id)
|
354
|
-
playlist_body = video_xml_for(:playlist => video_id)
|
394
|
+
def add_video_to_playlist(playlist_id, video_id, position)
|
395
|
+
playlist_body = video_xml_for(:playlist => video_id, :position => position)
|
355
396
|
playlist_url = "/feeds/api/playlists/%s" % playlist_id
|
356
397
|
response = yt_session.post(playlist_url, playlist_body)
|
357
398
|
|
358
399
|
return {:code => response.status, :body => response.body, :playlist_entry_id => get_entry_id(response.body)}
|
359
400
|
end
|
360
401
|
|
402
|
+
def update_position_video_from_playlist(playlist_id, playlist_entry_id, position)
|
403
|
+
playlist_body = video_xml_for(:position => position)
|
404
|
+
playlist_url = "/feeds/api/playlists/%s/%s" % [playlist_id, playlist_entry_id]
|
405
|
+
response = yt_session.put(playlist_url, playlist_body)
|
406
|
+
|
407
|
+
return {:code => response.status, :body => response.body, :playlist_entry_id => get_entry_id(response.body)}
|
408
|
+
end
|
409
|
+
|
361
410
|
def update_playlist(playlist_id, options)
|
362
411
|
playlist_body = video_xml_for_playlist(options)
|
363
412
|
playlist_url = "/feeds/api/users/default/playlists/%s" % playlist_id
|
@@ -389,7 +438,7 @@ class YouTubeIt
|
|
389
438
|
end
|
390
439
|
|
391
440
|
def subscriptions(user)
|
392
|
-
subscription_url = "/feeds/api/users/%s/subscriptions?v
|
441
|
+
subscription_url = "/feeds/api/users/%s/subscriptions?v=#{YouTubeIt::API_VERSION}" % (user ? user : "default")
|
393
442
|
response = yt_session.get(subscription_url)
|
394
443
|
|
395
444
|
return YouTubeIt::Parser::SubscriptionFeedParser.new(response).parse
|
@@ -440,14 +489,14 @@ class YouTubeIt
|
|
440
489
|
end
|
441
490
|
|
442
491
|
def get_watch_history
|
443
|
-
watch_history_url = "/feeds/api/users/default/watch_history?v
|
492
|
+
watch_history_url = "/feeds/api/users/default/watch_history?v=#{YouTubeIt::API_VERSION}"
|
444
493
|
response = yt_session.get(watch_history_url)
|
445
494
|
|
446
495
|
return YouTubeIt::Parser::VideosFeedParser.new(response.body).parse
|
447
496
|
end
|
448
497
|
|
449
498
|
def new_subscription_videos(user)
|
450
|
-
subscription_url = "/feeds/api/users/%s/newsubscriptionvideos?v
|
499
|
+
subscription_url = "/feeds/api/users/%s/newsubscriptionvideos?v=#{YouTubeIt::API_VERSION}" % (user ? user : "default")
|
451
500
|
response = yt_session.get(subscription_url)
|
452
501
|
|
453
502
|
return YouTubeIt::Parser::VideosFeedParser.new(response.body).parse
|
@@ -525,7 +574,7 @@ class YouTubeIt
|
|
525
574
|
@auth_token ||= begin
|
526
575
|
http = Faraday.new("https://www.google.com", :ssl => {:verify => false})
|
527
576
|
body = "Email=#{YouTubeIt.esc @user}&Passwd=#{YouTubeIt.esc @password}&service=youtube&source=#{YouTubeIt.esc @client_id}"
|
528
|
-
response = http.post("/
|
577
|
+
response = http.post("/accounts/ClientLogin", body, "Content-Type" => "application/x-www-form-urlencoded")
|
529
578
|
raise ::AuthenticationError.new(response.body[/Error=(.+)/,1], response.status.to_i) if response.status.to_i != 200
|
530
579
|
@auth_token = response.body[/Auth=(.+)/, 1]
|
531
580
|
end
|
@@ -565,12 +614,59 @@ class YouTubeIt
|
|
565
614
|
end.to_s
|
566
615
|
end
|
567
616
|
|
617
|
+
def partial_video_xml(opts)
|
618
|
+
perms = [ :rate, :comment, :commentVote, :videoRespond, :list, :embed, :syndicate ]
|
619
|
+
delete_attrs = []
|
620
|
+
perms.each do |perm|
|
621
|
+
delete_attrs << "@action='#{perm}'" if opts[perm]
|
622
|
+
end
|
623
|
+
|
624
|
+
entry_attrs = {
|
625
|
+
:xmlns => "http://www.w3.org/2005/Atom",
|
626
|
+
'xmlns:media' => "http://search.yahoo.com/mrss/",
|
627
|
+
'xmlns:gd' => "http://schemas.google.com/g/2005",
|
628
|
+
'xmlns:yt' => "http://gdata.youtube.com/schemas/2007",
|
629
|
+
'xmlns:gml' => 'http://www.opengis.net/gml',
|
630
|
+
'xmlns:georss' => 'http://www.georss.org/georss' }
|
631
|
+
|
632
|
+
if !delete_attrs.empty?
|
633
|
+
entry_attrs['gd:fields'] = "yt:accessControl[#{delete_attrs.join(' or ')}]"
|
634
|
+
end
|
635
|
+
|
636
|
+
b = Builder::XmlMarkup.new
|
637
|
+
b.instruct!
|
638
|
+
b.entry(entry_attrs) do | m |
|
639
|
+
|
640
|
+
m.tag!("media:group") do | mg |
|
641
|
+
mg.tag!("media:title", opts[:title], :type => "plain") if opts[:title]
|
642
|
+
mg.tag!("media:description", opts[:description], :type => "plain") if opts[:description]
|
643
|
+
mg.tag!("media:keywords", opts[:keywords].join(",")) if opts[:keywords]
|
644
|
+
mg.tag!('media:category', opts[:category], :scheme => "http://gdata.youtube.com/schemas/2007/categories.cat") if opts[:category]
|
645
|
+
mg.tag!('yt:private') if opts[:private]
|
646
|
+
mg.tag!('media:category', opts[:dev_tag], :scheme => "http://gdata.youtube.com/schemas/2007/developertags.cat") if opts[:dev_tag]
|
647
|
+
end
|
648
|
+
|
649
|
+
perms.each do |perm|
|
650
|
+
m.tag!("yt:accessControl", :action => perm.to_s, :permission => opts[perm]) if opts[perm]
|
651
|
+
end
|
652
|
+
|
653
|
+
if opts[:latitude] and opts[:longitude]
|
654
|
+
m.tag!("georss:where") do |geo|
|
655
|
+
geo.tag!("gml:Point") do |point|
|
656
|
+
point.tag!("gml:pos", opts.values_at(:latitude, :longitude).join(' '))
|
657
|
+
end
|
658
|
+
end
|
659
|
+
end
|
660
|
+
end.to_s
|
661
|
+
end
|
662
|
+
|
568
663
|
def video_xml_for(data)
|
569
664
|
b = Builder::XmlMarkup.new
|
570
665
|
b.instruct!
|
571
666
|
b.entry(:xmlns => "http://www.w3.org/2005/Atom", 'xmlns:yt' => "http://gdata.youtube.com/schemas/2007") do | m |
|
572
667
|
m.id(data[:favorite] || data[:playlist] || data[:response]) if data[:favorite] || data[:playlist] || data[:response]
|
573
668
|
m.tag!("yt:rating", :value => data[:rating]) if data[:rating]
|
669
|
+
m.tag!("yt:position", data[:position]) if data[:position]
|
574
670
|
if(data[:subscribe])
|
575
671
|
m.category(:scheme => "http://gdata.youtube.com/schemas/2007/subscriptiontypes.cat", :term => "channel")
|
576
672
|
m.tag!("yt:username", data[:subscribe])
|
data/lib/youtube_it/version.rb
CHANGED
metadata
CHANGED
@@ -1,177 +1,154 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: youtube_it
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.13
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 2.2.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
- kylejginavan
|
9
|
-
- chebyte
|
7
|
+
authors:
|
8
|
+
- kylejginavan
|
9
|
+
- chebyte
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
none: false
|
83
|
-
requirements:
|
84
|
-
- - ~>
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: '0.8'
|
87
|
-
type: :runtime
|
88
|
-
prerelease: false
|
89
|
-
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
|
-
requirements:
|
92
|
-
- - ~>
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: '0.8'
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: builder
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
|
-
requirements:
|
100
|
-
- - ! '>='
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
|
-
type: :runtime
|
104
|
-
prerelease: false
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
|
-
requirements:
|
108
|
-
- - ! '>='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
13
|
+
|
14
|
+
date: 2013-04-25 00:00:00 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: nokogiri
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.5.2
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: oauth
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 0.4.4
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: oauth2
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0.6"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: simple_oauth
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.1.5
|
58
|
+
type: :runtime
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: faraday
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0.8"
|
69
|
+
type: :runtime
|
70
|
+
version_requirements: *id005
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: builder
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
type: :runtime
|
81
|
+
version_requirements: *id006
|
111
82
|
description: Upload, delete, update, comment on youtube videos all from one gem.
|
112
|
-
email:
|
113
|
-
- kylejginavan@gmail.com
|
114
|
-
- maurotorres@gmail.com
|
83
|
+
email:
|
84
|
+
- kylejginavan@gmail.com
|
85
|
+
- maurotorres@gmail.com
|
115
86
|
executables: []
|
87
|
+
|
116
88
|
extensions: []
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
- lib/youtube_it
|
122
|
-
- lib/youtube_it/
|
123
|
-
- lib/youtube_it/
|
124
|
-
- lib/youtube_it/
|
125
|
-
- lib/youtube_it/
|
126
|
-
- lib/youtube_it/
|
127
|
-
- lib/youtube_it/
|
128
|
-
- lib/youtube_it/
|
129
|
-
- lib/youtube_it/
|
130
|
-
- lib/youtube_it/
|
131
|
-
- lib/youtube_it/model/
|
132
|
-
- lib/youtube_it/model/
|
133
|
-
- lib/youtube_it/model/
|
134
|
-
- lib/youtube_it/model/
|
135
|
-
- lib/youtube_it/model/
|
136
|
-
- lib/youtube_it/model/
|
137
|
-
- lib/youtube_it/model/
|
138
|
-
- lib/youtube_it/model/
|
139
|
-
- lib/youtube_it/model/
|
140
|
-
- lib/youtube_it/
|
141
|
-
- lib/youtube_it/
|
142
|
-
- lib/youtube_it/
|
143
|
-
- lib/youtube_it/
|
144
|
-
- lib/youtube_it/
|
145
|
-
- lib/youtube_it/request/
|
146
|
-
- lib/youtube_it/request/
|
147
|
-
- lib/youtube_it/request/
|
148
|
-
- lib/youtube_it/
|
149
|
-
- lib/youtube_it/
|
150
|
-
- lib/youtube_it.rb
|
151
|
-
-
|
152
|
-
-
|
89
|
+
|
90
|
+
extra_rdoc_files:
|
91
|
+
- README.rdoc
|
92
|
+
files:
|
93
|
+
- lib/youtube_it.rb
|
94
|
+
- lib/youtube_it/chain_io.rb
|
95
|
+
- lib/youtube_it/client.rb
|
96
|
+
- lib/youtube_it/parser.rb
|
97
|
+
- lib/youtube_it/record.rb
|
98
|
+
- lib/youtube_it/version.rb
|
99
|
+
- lib/youtube_it/middleware/faraday_authheader.rb
|
100
|
+
- lib/youtube_it/middleware/faraday_oauth.rb
|
101
|
+
- lib/youtube_it/middleware/faraday_oauth2.rb
|
102
|
+
- lib/youtube_it/middleware/faraday_youtubeit.rb
|
103
|
+
- lib/youtube_it/model/activity.rb
|
104
|
+
- lib/youtube_it/model/author.rb
|
105
|
+
- lib/youtube_it/model/caption.rb
|
106
|
+
- lib/youtube_it/model/category.rb
|
107
|
+
- lib/youtube_it/model/comment.rb
|
108
|
+
- lib/youtube_it/model/contact.rb
|
109
|
+
- lib/youtube_it/model/content.rb
|
110
|
+
- lib/youtube_it/model/message.rb
|
111
|
+
- lib/youtube_it/model/playlist.rb
|
112
|
+
- lib/youtube_it/model/rating.rb
|
113
|
+
- lib/youtube_it/model/subscription.rb
|
114
|
+
- lib/youtube_it/model/thumbnail.rb
|
115
|
+
- lib/youtube_it/model/user.rb
|
116
|
+
- lib/youtube_it/model/video.rb
|
117
|
+
- lib/youtube_it/request/base_search.rb
|
118
|
+
- lib/youtube_it/request/error.rb
|
119
|
+
- lib/youtube_it/request/standard_search.rb
|
120
|
+
- lib/youtube_it/request/user_search.rb
|
121
|
+
- lib/youtube_it/request/video_search.rb
|
122
|
+
- lib/youtube_it/request/video_upload.rb
|
123
|
+
- lib/youtube_it/response/video_search.rb
|
124
|
+
- README.rdoc
|
125
|
+
- youtube_it.gemspec
|
153
126
|
homepage: http://github.com/kylejginavan/youtube_it
|
154
127
|
licenses: []
|
128
|
+
|
155
129
|
post_install_message:
|
156
130
|
rdoc_options: []
|
157
|
-
|
158
|
-
|
159
|
-
|
131
|
+
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
160
135
|
none: false
|
161
|
-
requirements:
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: "0"
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
141
|
none: false
|
167
|
-
requirements:
|
168
|
-
|
169
|
-
|
170
|
-
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: "0"
|
171
146
|
requirements: []
|
147
|
+
|
172
148
|
rubyforge_project:
|
173
|
-
rubygems_version: 1.8.
|
149
|
+
rubygems_version: 1.8.15
|
174
150
|
signing_key:
|
175
151
|
specification_version: 3
|
176
152
|
summary: The most complete Ruby wrapper for youtube api's
|
177
153
|
test_files: []
|
154
|
+
|