youtube_it 2.1.4 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +57 -5
- data/lib/youtube_it.rb +3 -3
- data/lib/youtube_it/chain_io.rb +1 -1
- data/lib/youtube_it/client.rb +48 -11
- data/lib/youtube_it/model/comment.rb +3 -3
- data/lib/youtube_it/model/playlist.rb +1 -1
- data/lib/youtube_it/model/user.rb +7 -0
- data/lib/youtube_it/model/video.rb +37 -4
- data/lib/youtube_it/parser.rb +269 -218
- data/lib/youtube_it/request/base_search.rb +4 -0
- data/lib/youtube_it/request/video_search.rb +20 -4
- data/lib/youtube_it/request/video_upload.rb +166 -70
- data/lib/youtube_it/version.rb +1 -1
- data/youtube_it.gemspec +20 -91
- metadata +72 -134
- data/Gemfile +0 -12
- data/Gemfile.lock +0 -43
- data/Manifest.txt +0 -37
- data/Rakefile +0 -58
- data/VERSION +0 -1
- data/test/files/recorded_response.xml +0 -1
- data/test/files/youtube_video_response.xml +0 -53
- data/test/helper.rb +0 -9
- data/test/test.mov +0 -0
- data/test/test_chain_io.rb +0 -63
- data/test/test_client.rb +0 -454
- data/test/test_field_search.rb +0 -48
- data/test/test_video.rb +0 -48
- data/test/test_video_feed_parser.rb +0 -271
- data/test/test_video_search.rb +0 -147
@@ -52,6 +52,10 @@ class YouTubeIt
|
|
52
52
|
if fields[:view_count]
|
53
53
|
fields_param << "entry[yt:statistics/@viewCount > #{fields[:view_count]}]"
|
54
54
|
end
|
55
|
+
|
56
|
+
if fields[:entry]
|
57
|
+
fields_param << "entry[#{fields[:entry]}]"
|
58
|
+
end
|
55
59
|
|
56
60
|
|
57
61
|
return "&fields=#{URI.escape(fields_param.join(","))}"
|
@@ -14,10 +14,17 @@ class YouTubeIt
|
|
14
14
|
attr_reader :tags # /-/tag1/tag2
|
15
15
|
attr_reader :categories # /-/Category1/Category2
|
16
16
|
attr_reader :video_format # format (1=mobile devices)
|
17
|
-
attr_reader :
|
17
|
+
attr_reader :safe_search # safeSearch (none, [moderate], strict)
|
18
18
|
attr_reader :author
|
19
19
|
attr_reader :lang # lt
|
20
20
|
attr_reader :restriction
|
21
|
+
attr_reader :duration
|
22
|
+
attr_reader :time
|
23
|
+
attr_reader :hd
|
24
|
+
attr_reader :caption
|
25
|
+
attr_reader :uploader
|
26
|
+
attr_reader :region
|
27
|
+
attr_reader :paid_content
|
21
28
|
|
22
29
|
|
23
30
|
def initialize(params={})
|
@@ -26,7 +33,9 @@ class YouTubeIt
|
|
26
33
|
@max_results, @order_by,
|
27
34
|
@offset, @query,
|
28
35
|
@response_format, @video_format,
|
29
|
-
@
|
36
|
+
@safe_search, @author, @lang,
|
37
|
+
@duration, @time, @hd, @caption,
|
38
|
+
@uploader, @region, @paid_content = nil
|
30
39
|
@url = base_url
|
31
40
|
@dev_key = params[:dev_key] if params[:dev_key]
|
32
41
|
|
@@ -62,10 +71,17 @@ class YouTubeIt
|
|
62
71
|
'q' => @query,
|
63
72
|
'alt' => @response_format,
|
64
73
|
'format' => @video_format,
|
65
|
-
'
|
74
|
+
'safeSearch' => @safe_search,
|
66
75
|
'author' => @author,
|
67
76
|
'restriction' => @restriction,
|
68
|
-
'lr' => @lang
|
77
|
+
'lr' => @lang,
|
78
|
+
'duration' => @duration,
|
79
|
+
'time' => @time,
|
80
|
+
'hd' => @hd,
|
81
|
+
'caption' => @caption,
|
82
|
+
'region' => @region,
|
83
|
+
'paid-content' => @paid_content,
|
84
|
+
'uploader' => @uploader
|
69
85
|
}
|
70
86
|
end
|
71
87
|
|
@@ -107,39 +107,39 @@ class YouTubeIt
|
|
107
107
|
:description => '',
|
108
108
|
:category => 'People',
|
109
109
|
:keywords => [] }.merge(options)
|
110
|
-
|
110
|
+
|
111
111
|
update_body = video_xml
|
112
112
|
update_url = "/feeds/api/users/default/uploads/%s" % video_id
|
113
113
|
response = yt_session.put(update_url, update_body)
|
114
|
-
|
114
|
+
|
115
115
|
return YouTubeIt::Parser::VideoFeedParser.new(response.body).parse
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
# Fetches the currently authenticated user's contacts (i.e. friends).
|
119
119
|
# When the authentication credentials are incorrect, an AuthenticationError will be raised.
|
120
120
|
def get_my_contacts(opts)
|
121
121
|
contacts_url = "/feeds/api/users/default/contacts?v=2"
|
122
122
|
contacts_url << opts.collect { |k,p| [k,p].join '=' }.join('&')
|
123
123
|
response = yt_session.get(contacts_url)
|
124
|
-
|
124
|
+
|
125
125
|
return YouTubeIt::Parser::ContactsParser.new(response).parse
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
def send_message(opts)
|
129
129
|
message_body = message_xml_for(opts)
|
130
130
|
message_url = "/feeds/api/users/%s/inbox" % opts[:recipient_id]
|
131
131
|
response = yt_session.post(message_url, message_body)
|
132
|
-
|
132
|
+
|
133
133
|
return {:code => response.status, :body => response.body}
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
# Fetches the currently authenticated user's messages (i.e. inbox).
|
137
137
|
# When the authentication credentials are incorrect, an AuthenticationError will be raised.
|
138
138
|
def get_my_messages(opts)
|
139
139
|
messages_url = "/feeds/api/users/default/inbox"
|
140
140
|
messages_url << opts.collect { |k,p| [k,p].join '=' }.join('&')
|
141
141
|
response = yt_session.get(messages_url)
|
142
|
-
|
142
|
+
|
143
143
|
return YouTubeIt::Parser::MessagesParser.new(response).parse
|
144
144
|
end
|
145
145
|
|
@@ -148,11 +148,11 @@ class YouTubeIt
|
|
148
148
|
def get_my_video(video_id)
|
149
149
|
get_url = "/feeds/api/users/default/uploads/%s" % video_id
|
150
150
|
response = yt_session.get(get_url)
|
151
|
-
|
151
|
+
|
152
152
|
return YouTubeIt::Parser::VideoFeedParser.new(response.body).parse
|
153
153
|
end
|
154
154
|
|
155
|
-
# Fetches the data of the videos of the current user, which may be private.
|
155
|
+
# Fetches the data of the videos of the current user, which may be private.
|
156
156
|
# When the authentication credentials are incorrect, an AuthenticationError will be raised.
|
157
157
|
def get_my_videos(opts)
|
158
158
|
max_results = opts[:per_page] || 50
|
@@ -170,7 +170,7 @@ class YouTubeIt
|
|
170
170
|
|
171
171
|
return true
|
172
172
|
end
|
173
|
-
|
173
|
+
|
174
174
|
# Delete a video message
|
175
175
|
def delete_message(message_id)
|
176
176
|
delete_url = "/feeds/api/users/default/inbox/%s" % message_id
|
@@ -184,19 +184,29 @@ class YouTubeIt
|
|
184
184
|
token_body = video_xml
|
185
185
|
token_url = "/action/GetUploadToken"
|
186
186
|
response = yt_session.post(token_url, token_body)
|
187
|
-
|
187
|
+
|
188
188
|
return {:url => "#{response.body[/<url>(.+)<\/url>/, 1]}?nexturl=#{nexturl}",
|
189
189
|
:token => response.body[/<token>(.+)<\/token>/, 1]}
|
190
190
|
end
|
191
191
|
|
192
|
-
def add_comment(video_id, comment)
|
193
|
-
|
192
|
+
def add_comment(video_id, comment, opts = {})
|
193
|
+
reply_to = opts.delete :reply_to
|
194
|
+
reply_to = reply_to.unique_id if reply_to.is_a? YouTubeIt::Model::Comment
|
195
|
+
comment_body = comment_xml_for(:comment => comment, :reply_to => reply_to_url(video_id, reply_to))
|
194
196
|
comment_url = "/feeds/api/videos/%s/comments" % video_id
|
195
197
|
response = yt_session.post(comment_url, comment_body)
|
196
|
-
|
198
|
+
|
197
199
|
return {:code => response.status, :body => response.body}
|
198
200
|
end
|
199
201
|
|
202
|
+
def delete_comment(video_id, comment_id)
|
203
|
+
comment_id = comment_id.unique_id if comment_id.is_a? YouTubeIt::Model::Comment
|
204
|
+
url = "/feeds/api/videos/%s/comments/%s" % [video_id, comment_id]
|
205
|
+
response = yt_session.delete(url)
|
206
|
+
|
207
|
+
return response.status == 200
|
208
|
+
end
|
209
|
+
|
200
210
|
def comments(video_id, opts = {})
|
201
211
|
comment_url = "/feeds/api/videos/%s/comments?" % video_id
|
202
212
|
comment_url << opts.collect { |k,p| [k,p].join '=' }.join('&')
|
@@ -208,55 +218,106 @@ class YouTubeIt
|
|
208
218
|
favorite_body = video_xml_for(:favorite => video_id)
|
209
219
|
favorite_url = "/feeds/api/users/default/favorites"
|
210
220
|
response = yt_session.post(favorite_url, favorite_body)
|
211
|
-
|
212
|
-
return {:code => response.status, :body => response.body}
|
221
|
+
|
222
|
+
return {:code => response.status, :body => response.body, :favorite_entry_id => get_entry_id(response.body)}
|
213
223
|
end
|
214
224
|
|
215
225
|
def delete_favorite(video_id)
|
216
|
-
favorite_header = {
|
217
|
-
"GData-Version" => "1",
|
218
|
-
}
|
219
226
|
favorite_url = "/feeds/api/users/default/favorites/%s" % video_id
|
220
|
-
response = yt_session.delete(favorite_url
|
221
|
-
|
227
|
+
response = yt_session.delete(favorite_url)
|
228
|
+
|
222
229
|
return true
|
223
230
|
end
|
224
231
|
|
225
|
-
def profile(user)
|
226
|
-
|
227
|
-
response = yt_session.get(profile_url)
|
232
|
+
def profile(user=nil)
|
233
|
+
response = yt_session.get(profile_url(user))
|
228
234
|
|
229
235
|
return YouTubeIt::Parser::ProfileFeedParser.new(response).parse
|
230
236
|
end
|
231
|
-
|
237
|
+
|
238
|
+
def profiles(usernames_to_fetch)
|
239
|
+
usernames_to_fetch.each_slice(50).map do |usernames|
|
240
|
+
post = Nokogiri::XML <<-BATCH
|
241
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
242
|
+
<feed xmlns='http://www.w3.org/2005/Atom'
|
243
|
+
xmlns:media='http://search.yahoo.com/mrss/'
|
244
|
+
xmlns:batch='http://schemas.google.com/gdata/batch'
|
245
|
+
xmlns:yt='http://gdata.youtube.com/schemas/2007'>
|
246
|
+
<batch:operation type="query" />
|
247
|
+
</feed>
|
248
|
+
BATCH
|
249
|
+
usernames.each do |username|
|
250
|
+
post.at('feed').add_child <<-ENTRY
|
251
|
+
<entry xmlns:batch='http://schemas.google.com/gdata/batch'>
|
252
|
+
<id>#{profile_url(username)}</id>
|
253
|
+
<batch:id>#{username}</batch:id>
|
254
|
+
</entry>
|
255
|
+
ENTRY
|
256
|
+
end
|
257
|
+
|
258
|
+
post_body = ''
|
259
|
+
post.write_to( post_body, :indent => 2 )
|
260
|
+
post_body_io = StringIO.new(post_body)
|
261
|
+
|
262
|
+
response = yt_session.post('feeds/api/users/batch', post_body_io )
|
263
|
+
YouTubeIt::Parser::BatchProfileFeedParser.new(response).parse
|
264
|
+
end.reduce({},:merge)
|
265
|
+
end
|
266
|
+
|
267
|
+
def profile_url(user=nil)
|
268
|
+
"/feeds/api/users/%s?v=2" % (user || "default")
|
269
|
+
end
|
270
|
+
|
232
271
|
# Return's a user's activity feed.
|
233
272
|
def get_activity(user, opts)
|
234
273
|
activity_url = "/feeds/api/events?author=%s&v=2&" % (user ? user : "default")
|
235
274
|
activity_url << opts.collect { |k,p| [k,p].join '=' }.join('&')
|
236
275
|
response = yt_session.get(activity_url)
|
237
|
-
|
276
|
+
|
238
277
|
return YouTubeIt::Parser::ActivityParser.new(response).parse
|
239
278
|
end
|
240
279
|
|
241
|
-
def
|
242
|
-
|
280
|
+
def watchlater(user)
|
281
|
+
watchlater_url = "/feeds/api/users/%s/watch_later?v=2" % (user ? user : "default")
|
282
|
+
response = yt_session.get(watchlater_url)
|
283
|
+
|
284
|
+
return YouTubeIt::Parser::PlaylistFeedParser.new(response).parse
|
285
|
+
end
|
286
|
+
|
287
|
+
def add_video_to_watchlater(video_id)
|
288
|
+
playlist_body = video_xml_for(:playlist => video_id)
|
289
|
+
playlist_url = "/feeds/api/users/default/watch_later"
|
290
|
+
response = yt_session.post(playlist_url, playlist_body)
|
291
|
+
|
292
|
+
return {:code => response.status, :body => response.body, :watchlater_entry_id => get_entry_id(response.body)}
|
293
|
+
end
|
294
|
+
|
295
|
+
def delete_video_from_watchlater(video_id)
|
296
|
+
playlist_url = "/feeds/api/users/default/watch_later/%s" % video_id
|
297
|
+
response = yt_session.delete(playlist_url)
|
298
|
+
|
299
|
+
return true
|
300
|
+
end
|
301
|
+
|
302
|
+
def playlist(playlist_id, order_by = :position)
|
303
|
+
playlist_url = "/feeds/api/playlists/%s?v=2&orderby=%s" % [playlist_id, order_by]
|
243
304
|
response = yt_session.get(playlist_url)
|
244
|
-
|
305
|
+
|
245
306
|
return YouTubeIt::Parser::PlaylistFeedParser.new(response).parse
|
246
307
|
end
|
247
308
|
|
248
309
|
def playlists(user)
|
249
310
|
playlist_url = "/feeds/api/users/%s/playlists?v=2" % (user ? user : "default")
|
250
311
|
response = yt_session.get(playlist_url)
|
251
|
-
|
312
|
+
|
252
313
|
return YouTubeIt::Parser::PlaylistsFeedParser.new(response).parse
|
253
314
|
end
|
254
|
-
|
315
|
+
|
255
316
|
def add_playlist(options)
|
256
317
|
playlist_body = video_xml_for_playlist(options)
|
257
318
|
playlist_url = "/feeds/api/users/default/playlists"
|
258
319
|
response = yt_session.post(playlist_url, playlist_body)
|
259
|
-
|
320
|
+
|
260
321
|
return YouTubeIt::Parser::PlaylistFeedParser.new(response).parse
|
261
322
|
end
|
262
323
|
|
@@ -264,29 +325,29 @@ class YouTubeIt
|
|
264
325
|
playlist_body = video_xml_for(:playlist => video_id)
|
265
326
|
playlist_url = "/feeds/api/playlists/%s" % playlist_id
|
266
327
|
response = yt_session.post(playlist_url, playlist_body)
|
267
|
-
|
268
|
-
return {:code => response.status, :body => response.body, :playlist_entry_id =>
|
328
|
+
|
329
|
+
return {:code => response.status, :body => response.body, :playlist_entry_id => get_entry_id(response.body)}
|
269
330
|
end
|
270
331
|
|
271
332
|
def update_playlist(playlist_id, options)
|
272
333
|
playlist_body = video_xml_for_playlist(options)
|
273
334
|
playlist_url = "/feeds/api/users/default/playlists/%s" % playlist_id
|
274
335
|
response = yt_session.put(playlist_url, playlist_body)
|
275
|
-
|
336
|
+
|
276
337
|
return YouTubeIt::Parser::PlaylistFeedParser.new(response).parse
|
277
338
|
end
|
278
339
|
|
279
340
|
def delete_video_from_playlist(playlist_id, playlist_entry_id)
|
280
341
|
playlist_url = "/feeds/api/playlists/%s/%s" % [playlist_id, playlist_entry_id]
|
281
342
|
response = yt_session.delete(playlist_url)
|
282
|
-
|
343
|
+
|
283
344
|
return true
|
284
345
|
end
|
285
346
|
|
286
347
|
def delete_playlist(playlist_id)
|
287
348
|
playlist_url = "/feeds/api/users/default/playlists/%s" % playlist_id
|
288
349
|
response = yt_session.delete(playlist_url)
|
289
|
-
|
350
|
+
|
290
351
|
return true
|
291
352
|
end
|
292
353
|
|
@@ -294,32 +355,32 @@ class YouTubeIt
|
|
294
355
|
rating_body = video_xml_for(:rating => rating)
|
295
356
|
rating_url = "/feeds/api/videos/#{video_id}/ratings"
|
296
357
|
response = yt_session.post(rating_url, rating_body)
|
297
|
-
|
358
|
+
|
298
359
|
return {:code => response.status, :body => response.body}
|
299
360
|
end
|
300
|
-
|
361
|
+
|
301
362
|
def subscriptions(user)
|
302
363
|
subscription_url = "/feeds/api/users/%s/subscriptions?v=2" % (user ? user : "default")
|
303
364
|
response = yt_session.get(subscription_url)
|
304
|
-
|
365
|
+
|
305
366
|
return YouTubeIt::Parser::SubscriptionFeedParser.new(response).parse
|
306
367
|
end
|
307
|
-
|
368
|
+
|
308
369
|
def subscribe_channel(channel_name)
|
309
370
|
subscribe_body = video_xml_for(:subscribe => channel_name)
|
310
371
|
subscribe_url = "/feeds/api/users/default/subscriptions"
|
311
372
|
response = yt_session.post(subscribe_url, subscribe_body)
|
312
|
-
|
373
|
+
|
313
374
|
return {:code => response.status, :body => response.body}
|
314
375
|
end
|
315
|
-
|
376
|
+
|
316
377
|
def unsubscribe_channel(subscription_id)
|
317
378
|
unsubscribe_url = "/feeds/api/users/default/subscriptions/%s" % subscription_id
|
318
379
|
response = yt_session.delete(unsubscribe_url)
|
319
|
-
|
380
|
+
|
320
381
|
return {:code => response.status, :body => response.body}
|
321
382
|
end
|
322
|
-
|
383
|
+
|
323
384
|
def favorites(user, opts = {})
|
324
385
|
favorite_url = "/feeds/api/users/%s/favorites#{opts.empty? ? '' : '?#{opts.to_param}'}" % (user ? user : "default")
|
325
386
|
response = yt_session.get(favorite_url)
|
@@ -331,24 +392,37 @@ class YouTubeIt
|
|
331
392
|
current_user_url = "/feeds/api/users/default"
|
332
393
|
response = yt_session.get(current_user_url)
|
333
394
|
|
334
|
-
return
|
395
|
+
return Nokogiri::XML(response.body).at("entry/author/name").text
|
335
396
|
end
|
336
|
-
|
397
|
+
|
337
398
|
def add_response(original_video_id, response_video_id)
|
338
399
|
response_body = video_xml_for(:response => response_video_id)
|
339
400
|
response_url = "/feeds/api/videos/%s/responses" % original_video_id
|
340
401
|
response = yt_session.post(response_url, response_body)
|
341
|
-
|
402
|
+
|
342
403
|
return {:code => response.status, :body => response.body}
|
343
404
|
end
|
344
405
|
|
345
406
|
def delete_response(original_video_id, response_video_id)
|
346
407
|
response_url = "/feeds/api/videos/%s/responses/%s" % [original_video_id, response_video_id]
|
347
408
|
response = yt_session.delete(response_url)
|
348
|
-
|
409
|
+
|
349
410
|
return {:code => response.status, :body => response.body}
|
350
411
|
end
|
351
412
|
|
413
|
+
def get_watch_history
|
414
|
+
watch_history_url = "/feeds/api/users/default/watch_history?v=2"
|
415
|
+
response = yt_session.get(watch_history_url)
|
416
|
+
|
417
|
+
return YouTubeIt::Parser::VideosFeedParser.new(response.body).parse
|
418
|
+
end
|
419
|
+
|
420
|
+
def new_subscription_videos(user)
|
421
|
+
subscription_url = "/feeds/api/users/%s/newsubscriptionvideos?v=2" % (user ? user : "default")
|
422
|
+
response = yt_session.get(subscription_url)
|
423
|
+
|
424
|
+
return YouTubeIt::Parser::VideosFeedParser.new(response.body).parse
|
425
|
+
end
|
352
426
|
|
353
427
|
private
|
354
428
|
|
@@ -377,15 +451,15 @@ class YouTubeIt
|
|
377
451
|
|
378
452
|
def parse_upload_error_from(string)
|
379
453
|
begin
|
380
|
-
|
381
|
-
if error.
|
382
|
-
msg_error = error.
|
383
|
-
elsif error.
|
384
|
-
msg_error = error.
|
454
|
+
Nokogiri::XML(string).xpath("//errors").inject('') do | all_faults, error|
|
455
|
+
if error.at("internalReason")
|
456
|
+
msg_error = error.at("internalReason").text
|
457
|
+
elsif error.at("location")
|
458
|
+
msg_error = error.at("location").text[/media:group\/media:(.*)\/text\(\)/,1]
|
385
459
|
else
|
386
460
|
msg_error = "Unspecified error"
|
387
461
|
end
|
388
|
-
code = error.
|
462
|
+
code = error.at("code").text if error.at("code")
|
389
463
|
all_faults + sprintf("%s: %s\n", msg_error, code)
|
390
464
|
end
|
391
465
|
rescue
|
@@ -406,14 +480,13 @@ class YouTubeIt
|
|
406
480
|
end
|
407
481
|
|
408
482
|
def uploaded_video_id_from(string)
|
409
|
-
xml =
|
410
|
-
xml.
|
483
|
+
xml = Nokogiri::XML(string)
|
484
|
+
xml.at("id").text[/videos\/(.+)/, 1]
|
411
485
|
end
|
412
486
|
|
413
487
|
def playlist_id_from(string)
|
414
|
-
xml =
|
415
|
-
|
416
|
-
entry.elements["id"].text[/playlist([^<]+)/, 1].sub(':','')
|
488
|
+
xml = Nokogiri::XML(string)
|
489
|
+
xml.at("entry/id").text[/playlist([^<]+)/, 1].sub(':','')
|
417
490
|
end
|
418
491
|
|
419
492
|
# If data can be read, use the first 1024 bytes as filename. If data
|
@@ -444,7 +517,11 @@ class YouTubeIt
|
|
444
517
|
def video_xml
|
445
518
|
b = Builder::XmlMarkup.new
|
446
519
|
b.instruct!
|
447
|
-
b.entry(:xmlns => "http://www.w3.org/2005/Atom",
|
520
|
+
b.entry(:xmlns => "http://www.w3.org/2005/Atom",
|
521
|
+
'xmlns:media' => "http://search.yahoo.com/mrss/",
|
522
|
+
'xmlns:yt' => "http://gdata.youtube.com/schemas/2007",
|
523
|
+
'xmlns:gml' => 'http://www.opengis.net/gml',
|
524
|
+
'xmlns:georss' => 'http://www.georss.org/georss') do | m |
|
448
525
|
m.tag!("media:group") do | mg |
|
449
526
|
mg.tag!("media:title", @opts[:title], :type => "plain")
|
450
527
|
mg.tag!("media:description", @opts[:description], :type => "plain")
|
@@ -460,6 +537,13 @@ class YouTubeIt
|
|
460
537
|
m.tag!("yt:accessControl", :action => "list", :permission => @opts[:list]) if @opts[:list]
|
461
538
|
m.tag!("yt:accessControl", :action => "embed", :permission => @opts[:embed]) if @opts[:embed]
|
462
539
|
m.tag!("yt:accessControl", :action => "syndicate", :permission => @opts[:syndicate]) if @opts[:syndicate]
|
540
|
+
if @opts[:latitude] and @opts[:longitude]
|
541
|
+
m.tag!("georss:where") do |geo|
|
542
|
+
geo.tag!("gml:Point") do |point|
|
543
|
+
point.tag!("gml:pos", @opts.values_at(:latitude, :longitude).join(' '))
|
544
|
+
end
|
545
|
+
end
|
546
|
+
end
|
463
547
|
end.to_s
|
464
548
|
end
|
465
549
|
|
@@ -467,7 +551,6 @@ class YouTubeIt
|
|
467
551
|
b = Builder::XmlMarkup.new
|
468
552
|
b.instruct!
|
469
553
|
b.entry(:xmlns => "http://www.w3.org/2005/Atom", 'xmlns:yt' => "http://gdata.youtube.com/schemas/2007") do | m |
|
470
|
-
m.content(data[:comment]) if data[:comment]
|
471
554
|
m.id(data[:favorite] || data[:playlist] || data[:response]) if data[:favorite] || data[:playlist] || data[:response]
|
472
555
|
m.tag!("yt:rating", :value => data[:rating]) if data[:rating]
|
473
556
|
if(data[:subscribe])
|
@@ -476,7 +559,20 @@ class YouTubeIt
|
|
476
559
|
end
|
477
560
|
end.to_s
|
478
561
|
end
|
479
|
-
|
562
|
+
|
563
|
+
def reply_to_url video_id, reply_to
|
564
|
+
'https://gdata.youtube.com/feeds/api/videos/%s/comments/%s' % [video_id, reply_to] if reply_to
|
565
|
+
end
|
566
|
+
|
567
|
+
def comment_xml_for(data)
|
568
|
+
b = Builder::XmlMarkup.new
|
569
|
+
b.instruct!
|
570
|
+
b.entry(:xmlns => "http://www.w3.org/2005/Atom", 'xmlns:yt' => "http://gdata.youtube.com/schemas/2007") do | m |
|
571
|
+
m.link(:rel => 'http://gdata.youtube.com/schemas/2007#in-reply-to', :type => 'application/atom+xml', :href => data[:reply_to]) if data[:reply_to]
|
572
|
+
m.content(data[:comment]) if data[:comment]
|
573
|
+
end.to_s
|
574
|
+
end
|
575
|
+
|
480
576
|
def message_xml_for(data)
|
481
577
|
b = Builder::XmlMarkup.new
|
482
578
|
b.instruct!
|
@@ -512,10 +608,10 @@ class YouTubeIt
|
|
512
608
|
YouTubeIt::GreedyChainIO.new(post_body)
|
513
609
|
end
|
514
610
|
|
515
|
-
def
|
516
|
-
|
517
|
-
|
518
|
-
return item.
|
611
|
+
def get_entry_id(string)
|
612
|
+
entry_xml = Nokogiri::XML(string)
|
613
|
+
entry_xml.css("entry").each do |item|
|
614
|
+
return item.at("id").text[/^.*:([^:]+)$/,1]
|
519
615
|
end
|
520
616
|
end
|
521
617
|
|
@@ -529,9 +625,9 @@ class YouTubeIt
|
|
529
625
|
end
|
530
626
|
end
|
531
627
|
builder.use Faraday::Request::AuthHeader, authorization_headers
|
532
|
-
builder.use Faraday::Response::YouTubeIt
|
628
|
+
builder.use Faraday::Response::YouTubeIt
|
533
629
|
builder.adapter YouTubeIt.adapter
|
534
|
-
|
630
|
+
|
535
631
|
end
|
536
632
|
end
|
537
633
|
end
|