yt 0.12.2 → 0.13.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +10 -6
- data/YOUTUBE_IT.md +867 -0
- data/lib/yt/actions/delete_all.rb +1 -1
- data/lib/yt/actions/insert.rb +11 -3
- data/lib/yt/actions/list.rb +18 -10
- data/lib/yt/actions/modify.rb +11 -3
- data/lib/yt/associations/has_authentication.rb +1 -1
- data/lib/yt/collections/annotations.rb +4 -2
- data/lib/yt/collections/authentications.rb +4 -2
- data/lib/yt/collections/ownerships.rb +1 -1
- data/lib/yt/collections/reports.rb +13 -1
- data/lib/yt/collections/resumable_sessions.rb +4 -2
- data/lib/yt/collections/user_infos.rb +3 -1
- data/lib/yt/models/account.rb +9 -1
- data/lib/yt/models/channel.rb +0 -4
- data/lib/yt/models/resource.rb +1 -1
- data/lib/yt/models/resumable_session.rb +1 -1
- data/lib/yt/request.rb +267 -0
- data/lib/yt/version.rb +1 -1
- data/spec/collections/reports_spec.rb +30 -0
- data/spec/models/request_spec.rb +1 -23
- data/spec/requests/as_account/account_spec.rb +8 -1
- data/spec/requests/as_account/authentications_spec.rb +1 -1
- data/spec/requests/as_account/channel_spec.rb +1 -8
- metadata +6 -4
- data/TODO.md +0 -58
- data/lib/yt/models/request.rb +0 -223
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 820fa9ccb5406a4e131d08a7ac9a25a49d46bbd1
|
4
|
+
data.tar.gz: 4ef554de94ae9f8fcbaf1162cabc4cb2f2e1f5b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7eef44a502dd74725b4cd9755a89a532ae4352b608c0a92e876370841162b135d7e1031597cf1edd8d60fdf33f399e303b19341b8d57ebf6e3f46a00b51cd085
|
7
|
+
data.tar.gz: 7881bc55e5a89efc27125e186d07e03eed78c30ddf745c7937efd7b7bfe5ed41e6f58da0e985ed9fed61957e2a55d00d56f19bc90a04e671857b25ecc462e751
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,20 @@ For more information about changelogs, check
|
|
6
6
|
[Keep a Changelog](http://keepachangelog.com) and
|
7
7
|
[Vandamme](http://tech-angels.github.io/vandamme).
|
8
8
|
|
9
|
+
## 0.13.0 - 2014-09-11
|
10
|
+
|
11
|
+
**How to upgrade**
|
12
|
+
|
13
|
+
If your code never calls the `create_playlist` on a Channel object, then you
|
14
|
+
are good to go.
|
15
|
+
|
16
|
+
If it does, then replace your calls to `channel.create_playlist` with
|
17
|
+
`account.create_playlist`, that is, call `create_playlist` on the channel’s
|
18
|
+
account instead.
|
19
|
+
|
20
|
+
* [ENHANCEMENT] Remove `create_playlist` from Channel (still exists on Account)
|
21
|
+
* [ENHANCEMENT] Accept `category_id` in `upload_video`.
|
22
|
+
|
9
23
|
## 0.12.2 - 2014-09-09
|
10
24
|
|
11
25
|
* [ENHANCEMENT] Accept `part` in the `where` clause of Videos, so statistics and content details can be eagerly loaded.
|
data/README.md
CHANGED
@@ -41,7 +41,7 @@ To install on your system, run
|
|
41
41
|
|
42
42
|
To use inside a bundled Ruby project, add this line to the Gemfile:
|
43
43
|
|
44
|
-
gem 'yt', '~> 0.
|
44
|
+
gem 'yt', '~> 0.13.0'
|
45
45
|
|
46
46
|
Since the gem follows [Semantic Versioning](http://semver.org),
|
47
47
|
indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
|
@@ -60,6 +60,7 @@ Use [Yt::Account](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Acco
|
|
60
60
|
* read the attributes of the account
|
61
61
|
* access the channel managed by the account
|
62
62
|
* access the videos uploaded by the account
|
63
|
+
* create playlist
|
63
64
|
* upload a video
|
64
65
|
* list the channels subscribed to an account
|
65
66
|
|
@@ -73,9 +74,11 @@ account.channel #=> #<Yt::Models::Channel @id=...>
|
|
73
74
|
account.videos.count #=> 12
|
74
75
|
account.videos.first #=> #<Yt::Models::Video @id=...>
|
75
76
|
|
76
|
-
account.upload_video 'my_video.mp4', title: 'My new video', privacy_status: 'private'
|
77
|
+
account.upload_video 'my_video.mp4', title: 'My new video', privacy_status: 'private', category_id: 17
|
77
78
|
account.upload_video 'http://example.com/remote.m4v', title: 'My other video', tags: ['music']
|
78
79
|
|
80
|
+
account.create_playlist title: 'New playlist', privacy_status: 'unlisted' #=> true
|
81
|
+
|
79
82
|
account.subscribers.count #=> 2
|
80
83
|
account.subscribers.first #=> #<Yt::Models::Channel @id=...>
|
81
84
|
account.subscribers.first.title #=> 'Fullscreen'
|
@@ -141,7 +144,7 @@ Use [Yt::Channel](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Chan
|
|
141
144
|
* access the playlists of a channel
|
142
145
|
* access the channels that the channel is subscribed to
|
143
146
|
* subscribe to and unsubscribe from a channel
|
144
|
-
*
|
147
|
+
* delete playlists from a channel
|
145
148
|
* retrieve the daily earnings, views, comments, likes, dislikes, shares and impressions of a channel
|
146
149
|
* retrieve the viewer percentage of a channel by gender and age group
|
147
150
|
|
@@ -188,7 +191,6 @@ channel.subscribe #=> true
|
|
188
191
|
account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
|
189
192
|
channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow', auth: account
|
190
193
|
|
191
|
-
channel.create_playlist title: 'New playlist' #=> true
|
192
194
|
channel.delete_playlists title: 'New playlist' #=> [true]
|
193
195
|
|
194
196
|
channel.views since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
@@ -688,8 +690,10 @@ Why you should use Yt…
|
|
688
690
|
======================
|
689
691
|
|
690
692
|
… and not [youtube_it](https://github.com/kylejginavan/youtube_it)?
|
691
|
-
Because youtube_it does not support
|
692
|
-
|
693
|
+
Because youtube_it does not support YouTube API V3, and the YouTube API V2 has
|
694
|
+
been [officially deprecated as of March 4, 2014](https://developers.google.com/youtube/2.0/developers_guide_protocol_audience).
|
695
|
+
If you need help upgrading your code, check [YOUTUBE_IT.md](https://github.com/Fullscreen/yt/blob/master/YOUTUBE_IT.md),
|
696
|
+
a step-by-step comparison between youtube_it and Yt to make upgrade easier.
|
693
697
|
|
694
698
|
… and not [Google Api Client](https://github.com/google/google-api-ruby-client)?
|
695
699
|
Because Google Api Client is poorly coded, poorly documented and adds many
|
data/YOUTUBE_IT.md
ADDED
@@ -0,0 +1,867 @@
|
|
1
|
+
How to migrate from youtube_it
|
2
|
+
==============================
|
3
|
+
|
4
|
+
If you are used to access the YouTube API with [youtube_it](https://github.com/kylejginavan/youtube_it),
|
5
|
+
this guide will help you translate your code to use Yt instead.
|
6
|
+
|
7
|
+
This guide follows [youtube_it README.rdoc](https://github.com/kylejginavan/youtube_it/blob/f61ed0b00905e048dcbed12457d02f52ddbae45d/README.rdoc)
|
8
|
+
listing the original `youtube_it` commands and their equivalent `Yt` versions.
|
9
|
+
|
10
|
+
Establishing a client
|
11
|
+
---------------------
|
12
|
+
|
13
|
+
While `youtube_it` supports authentication with developer key, AuthSub and
|
14
|
+
OAuth, `Yt` only supports OAuth 2.0, because this is the only process that has
|
15
|
+
not been deprecated by YouTube Data API V3.
|
16
|
+
|
17
|
+
Another difference is that `youtube_it` authentication methods are invoked on
|
18
|
+
a generic `Client` class, while with `Yt` you can specify whether you want to
|
19
|
+
authenticate as a YouTube `Account` or as a `ContentOwner`.
|
20
|
+
Content owners are special [CMS accounts](https://cms.youtube.com) that can
|
21
|
+
manage multiple YouTube accounts at once.
|
22
|
+
|
23
|
+
Creating a client:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# with youtube_it
|
27
|
+
client = YouTubeIt::Client.new
|
28
|
+
# with yt
|
29
|
+
account = Yt::Account.new # or Yt::ContentOwner.new
|
30
|
+
```
|
31
|
+
|
32
|
+
Client with developer key:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
# with youtube_it
|
36
|
+
client = YouTubeIt::Client.new(:dev_key => "developer_key")
|
37
|
+
# with yt: not supported (must use OAuth 2.0)
|
38
|
+
```
|
39
|
+
|
40
|
+
Client with youtube account and developer key:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
# with youtube_it
|
44
|
+
client = YouTubeIt::Client.new(:username => "youtube_username", :password => "youtube_passwd", :dev_key => "developer_key")
|
45
|
+
# with yt: not supported (must use OAuth 2.0)
|
46
|
+
```
|
47
|
+
|
48
|
+
Client with AuthSub:
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
# with youtube_it
|
52
|
+
client = YouTubeIt::AuthSubClient.new(:token => "token" , :dev_key => "developer_key")
|
53
|
+
# with yt: not supported (must use OAuth 2.0)
|
54
|
+
```
|
55
|
+
|
56
|
+
Client with OAuth:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
# with youtube_it
|
60
|
+
client = YouTubeIt::OAuthClient.new("consumer_key", "consumer_secret", "youtube_username", "developer_key")
|
61
|
+
client.authorize_from_access("access_token", "access_secret")
|
62
|
+
# with yt: not supported (must use OAuth 2.0)
|
63
|
+
```
|
64
|
+
|
65
|
+
Client with OAuth2:
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
# with youtube_it
|
69
|
+
client = YouTubeIt::OAuth2Client.new(client_access_token: "access_token", client_refresh_token: "refresh_token", client_id: "client_id", client_secret: "client_secret", dev_key: "dev_key", expires_at: "expiration time")
|
70
|
+
client.refresh_access_token!
|
71
|
+
# with yt
|
72
|
+
Yt.configure do |config|
|
73
|
+
config.client_id = 'client_id'
|
74
|
+
config.client_secret = 'client_secret'
|
75
|
+
end
|
76
|
+
account = Yt::Account.new access_token: 'access_token', refresh_token: 'refresh_token'
|
77
|
+
```
|
78
|
+
|
79
|
+
Profiles
|
80
|
+
--------
|
81
|
+
|
82
|
+
With `youtube_it`, you can use multiple profiles in the same account:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
profiles = client.profiles(['username1','username2'])
|
86
|
+
profiles['username1'].username, "username1"
|
87
|
+
```
|
88
|
+
|
89
|
+
With `yt`, you can access all the channels managed by the same YouTube account:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
first_channel = Yt::Channel.new id: 'UCx12345', auth: account
|
93
|
+
second_channel = Yt::Channel.new id: 'UCy45678', auth: account
|
94
|
+
first_channel.title
|
95
|
+
```
|
96
|
+
|
97
|
+
Video queries
|
98
|
+
-------------
|
99
|
+
|
100
|
+
List videos by keyword:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# with youtube_it
|
104
|
+
client = YouTubeIt::Client.new
|
105
|
+
client.videos_by(:query => "penguin")
|
106
|
+
# with yt
|
107
|
+
videos = Yt::Collections::Videos.new
|
108
|
+
videos.where(q: 'penguin')
|
109
|
+
```
|
110
|
+
|
111
|
+
List videos by page:
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
# with youtube_it
|
115
|
+
client = YouTubeIt::Client.new
|
116
|
+
client.videos_by(:query => "penguin", :page => 2, :per_page => 15)
|
117
|
+
# with yt: pagination is automatically supported by collection, which iterates
|
118
|
+
# though all the pages, not just the first one
|
119
|
+
videos = Yt::Collections::Videos.new
|
120
|
+
videos.where(q: 'penguin')
|
121
|
+
```
|
122
|
+
|
123
|
+
List videos by region:
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
# with youtube_it
|
127
|
+
client = YouTubeIt::Client.new
|
128
|
+
client.videos_by(:query => "penguin", :restriction => "DE")
|
129
|
+
# with yt
|
130
|
+
# Note that some users report that regionCode does not work in YouTube API V3
|
131
|
+
# See https://code.google.com/p/gdata-issues/issues/detail?id=4110
|
132
|
+
videos = Yt::Collections::Videos.new
|
133
|
+
videos.where(q: 'penguin', region_code: 'DE')
|
134
|
+
```
|
135
|
+
|
136
|
+
List videos by author:
|
137
|
+
|
138
|
+
```ruby
|
139
|
+
# with youtube_it
|
140
|
+
client = YouTubeIt::Client.new
|
141
|
+
client.videos_by(:query => "penguin", :author => "liz")
|
142
|
+
# with yt: the 'author' filter was removed from YouTube API V3, so the
|
143
|
+
# request must be done using the channel of the requested author
|
144
|
+
channel = Yt::Channel.new url: 'youtube.com/liz'
|
145
|
+
channel.videos.where(q: 'penguin')
|
146
|
+
```
|
147
|
+
|
148
|
+
List videos by categories:
|
149
|
+
|
150
|
+
```ruby
|
151
|
+
# with youtube_it
|
152
|
+
client = YouTubeIt::Client.new
|
153
|
+
client.videos_by(:categories => [:news, :sports])
|
154
|
+
# with yt: the 'categories' filter was removed from YouTube API V3, so the
|
155
|
+
# request must be done using one category_id at the time
|
156
|
+
videos = Yt::Collections::Videos.new
|
157
|
+
videos.where(video_category_id: 25) #=> News
|
158
|
+
videos.where(video_category_id: 17) #=> Sports
|
159
|
+
```
|
160
|
+
|
161
|
+
List videos by tags:
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
# with youtube_it
|
165
|
+
client = YouTubeIt::Client.new
|
166
|
+
client.videos_by(:tags => ['tiger', 'leopard'])
|
167
|
+
client.videos_by(:categories => [:news, :sports], :tags => ['soccer', 'football'])
|
168
|
+
# with yt: not supported (was removed from YouTube API V3)
|
169
|
+
```
|
170
|
+
|
171
|
+
List videos by user:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
# with youtube_it
|
175
|
+
client = YouTubeIt::Client.new
|
176
|
+
client.videos_by(:user => 'liz')
|
177
|
+
# with yt: the 'author' filter was removed from YouTube API V3, so the
|
178
|
+
# request must be done using the channel of the requested author
|
179
|
+
channel = Yt::Channel.new url: 'youtube.com/liz'
|
180
|
+
channel.videos.where(q: 'penguin')
|
181
|
+
```
|
182
|
+
|
183
|
+
<!--
|
184
|
+
|
185
|
+
TODO: Although FAVORITE is somehow deprecated, it can still be retrieved with
|
186
|
+
V3. First, get the contentDetails of the account's channel and you'll get
|
187
|
+
|
188
|
+
{"relatedPlaylists"=>
|
189
|
+
{"likes"=>"LLrWYT-_Xncr1BLPfPNr50sQ",
|
190
|
+
"favorites"=>"FLrWYT-_Xncr1BLPfPNr50sQ",
|
191
|
+
"uploads"=>"UUrWYT-_Xncr1BLPfPNr50sQ",
|
192
|
+
"watchHistory"=>"HLrWYT-_Xncr1BLPfPNr50sQ",
|
193
|
+
"watchLater"=>"WLrWYT-_Xncr1BLPfPNr50sQ"},
|
194
|
+
|
195
|
+
Then you can list the videos of the "favorites" playlist. That playlist does
|
196
|
+
not exist for new YouTube account, but you can still add a video to it, and
|
197
|
+
it will magically appear (and also, DELETE PLAYLIST will be disabled)
|
198
|
+
|
199
|
+
List videos favorited by user:
|
200
|
+
|
201
|
+
```ruby
|
202
|
+
# with youtube_it
|
203
|
+
client = YouTubeIt::Client.new
|
204
|
+
client.videos_by(:favorites, :user => 'liz')
|
205
|
+
# with yt: not supported (was removed from YouTube API V3)
|
206
|
+
|
207
|
+
or maybe add .liked_videos and .disliked_videos here !!!!!
|
208
|
+
|
209
|
+
```
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
-->
|
214
|
+
|
215
|
+
Retrieve video by ID:
|
216
|
+
|
217
|
+
```ruby
|
218
|
+
# with youtube_it
|
219
|
+
client = YouTubeIt::Client.new
|
220
|
+
client.video_by("FQK1URcxmb4")
|
221
|
+
# with yt
|
222
|
+
Yt::Video.new id: 'FQK1URcxmb4'
|
223
|
+
```
|
224
|
+
|
225
|
+
Retrieve video by URL:
|
226
|
+
|
227
|
+
```ruby
|
228
|
+
# with youtube_it
|
229
|
+
client = YouTubeIt::Client.new
|
230
|
+
client.video_by("https://www.youtube.com/watch?v=QsbmrCtiEUU")
|
231
|
+
# with yt
|
232
|
+
Yt::Video.new url: 'https://www.youtube.com/watch?v=QsbmrCtiEUU'
|
233
|
+
```
|
234
|
+
|
235
|
+
Retrieve video of a user by ID:
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
# with youtube_it
|
239
|
+
client = YouTubeIt::Client.new
|
240
|
+
client.video_by_user("chebyte","FQK1URcxmb4")
|
241
|
+
# with yt
|
242
|
+
Yt::Video.new id: 'FQK1URcxmb4'
|
243
|
+
```
|
244
|
+
|
245
|
+
List most viewed videos:
|
246
|
+
|
247
|
+
```ruby
|
248
|
+
# with youtube_it
|
249
|
+
client = YouTubeIt::Client.new
|
250
|
+
client.videos_by(:most_viewed)
|
251
|
+
# with yt
|
252
|
+
videos = Yt::Collections::Videos.new
|
253
|
+
videos.where(order: 'viewCount')
|
254
|
+
```
|
255
|
+
|
256
|
+
List most linked videos:
|
257
|
+
|
258
|
+
```ruby
|
259
|
+
# with youtube_it
|
260
|
+
client = YouTubeIt::Client.new
|
261
|
+
client.videos_by(:most_linked, :page => 3)
|
262
|
+
# with yt: not supported (was removed from YouTube API V3)
|
263
|
+
```
|
264
|
+
|
265
|
+
List most popular video:
|
266
|
+
|
267
|
+
```ruby
|
268
|
+
# with youtube_it
|
269
|
+
client = YouTubeIt::Client.new
|
270
|
+
client.videos_by(:top_rated, :time => :today).first
|
271
|
+
# with yt
|
272
|
+
videos = Yt::Collections::Videos.new
|
273
|
+
videos.where(chart: 'mostPopular').first
|
274
|
+
```
|
275
|
+
|
276
|
+
List *all* most popular videos:
|
277
|
+
|
278
|
+
```ruby
|
279
|
+
# with youtube_it
|
280
|
+
client = YouTubeIt::Client.new
|
281
|
+
client.videos_by(:top_rated, :time => :today)
|
282
|
+
# with yt: YouTube API V3 only returns the top 50
|
283
|
+
videos = Yt::Collections::Videos.new
|
284
|
+
videos.where(chart: 'mostPopular')
|
285
|
+
```
|
286
|
+
|
287
|
+
List most popular video by region and category:
|
288
|
+
|
289
|
+
```ruby
|
290
|
+
# with youtube_it
|
291
|
+
client = YouTubeIt::Client.new
|
292
|
+
client.videos_by(:top_rated, :region => "RU", :category => "News").first
|
293
|
+
# with yt
|
294
|
+
videos = Yt::Collections::Videos.new
|
295
|
+
videos.where(chart: 'mostPopular', region_code: 'RU', video_category_id: 25).first
|
296
|
+
```
|
297
|
+
|
298
|
+
Advanced Queries (with boolean operators OR (either), AND (include), NOT (exclude)):
|
299
|
+
|
300
|
+
```ruby
|
301
|
+
# with youtube_it
|
302
|
+
client = YouTubeIt::Client.new
|
303
|
+
client.videos_by(:categories => { :either => [:news, :sports], :exclude => [:comedy] }, :tags => { :include => ['football'], :exclude => ['soccer'] })
|
304
|
+
# with yt: not supported (was removed from YouTube API V3)
|
305
|
+
```
|
306
|
+
|
307
|
+
Custom Query Params:
|
308
|
+
|
309
|
+
```ruby
|
310
|
+
# with youtube_it
|
311
|
+
client = YouTubeIt::Client.new
|
312
|
+
client.videos_by(:query => "penguin", :safe_search => "strict")
|
313
|
+
client.videos_by(:query => "penguin", :duration => "long")
|
314
|
+
client.videos_by(:query => "penguin", :hd => "true")
|
315
|
+
client.videos_by(:query => "penguin", :region => "AR")
|
316
|
+
# with yt
|
317
|
+
videos = Yt::Collections::Videos.new
|
318
|
+
videos.where(q: 'penguin', safe_search: 'strict')
|
319
|
+
videos.where(q: 'penguin', duration: 'long')
|
320
|
+
videos.where(q: 'penguin', video_definition: 'high')
|
321
|
+
videos.where(q: 'penguin', region_code: 'AR')
|
322
|
+
```
|
323
|
+
|
324
|
+
Return videos with more than 1,000 views:
|
325
|
+
|
326
|
+
```ruby
|
327
|
+
# with youtube_it
|
328
|
+
client = YouTubeIt::Client.new
|
329
|
+
client.videos_by(:fields => {:view_count => "1000"})
|
330
|
+
# with yt: the most similar method in YouTube API V3 is to return the results by view count
|
331
|
+
videos = Yt::Collections::Videos.new
|
332
|
+
videos.where(order: 'viewCount')
|
333
|
+
```
|
334
|
+
|
335
|
+
Filter by date (also with range):
|
336
|
+
|
337
|
+
```ruby
|
338
|
+
# with youtube_it
|
339
|
+
client = YouTubeIt::Client.new
|
340
|
+
client.videos_by(:fields => {:published => (Date.today)})
|
341
|
+
client.videos_by(:fields => {:recorded => (Date.today)})
|
342
|
+
client.videos_by(:fields => {:published => ((Date.today - 30)..(Date.today))})
|
343
|
+
client.videos_by(:fields => {:recorded => ((Date.today - 30)..(Date.today))})
|
344
|
+
# with yt (only published is available in YouTube API V3, not recorded date)
|
345
|
+
videos = Yt::Collections::Videos.new
|
346
|
+
videos.where(published_before: 0.days.ago.utc.iso8601(0), published_after: 30.day.ago.utc.iso8601(0))
|
347
|
+
```
|
348
|
+
|
349
|
+
Filter including private videos:
|
350
|
+
|
351
|
+
```ruby
|
352
|
+
# with youtube_it
|
353
|
+
client = # new client initialized with either OAuth or AuthSub
|
354
|
+
client.my_video("FQK1URcxmb4")
|
355
|
+
client.my_videos(:query => "penguin")
|
356
|
+
# with yt
|
357
|
+
account = Yt::Account.new access_token: 'access_token'
|
358
|
+
video = Yt::Video.new id: 'FQK1URcxmb4', auth: account
|
359
|
+
account.videos.where(q: 'penguin')
|
360
|
+
```
|
361
|
+
|
362
|
+
Video management
|
363
|
+
----------------
|
364
|
+
|
365
|
+
Upload video:
|
366
|
+
|
367
|
+
```ruby
|
368
|
+
# with youtube_it
|
369
|
+
client = # new client initialized with either OAuth or AuthSub
|
370
|
+
client.video_upload(File.open("test.mov"), :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test])
|
371
|
+
# with yt
|
372
|
+
account = Yt::Account.new access_token: 'access_token'
|
373
|
+
account.upload_video 'test.mov', title: 'test', description: 'some description', category_id: 22, tags: %w(cool blah test)
|
374
|
+
```
|
375
|
+
|
376
|
+
Upload remote video:
|
377
|
+
|
378
|
+
```ruby
|
379
|
+
# with youtube_it
|
380
|
+
client = # new client initialized with either OAuth or AuthSub
|
381
|
+
client.video_upload("http://url/myvideo.mp4", :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test])
|
382
|
+
# with yt
|
383
|
+
account = Yt::Account.new access_token: 'access_token'
|
384
|
+
account.upload_video 'http://url/myvideo.mp4', title: 'test', description: 'some description', category_id: 22, tags: %w(cool blah test)
|
385
|
+
```
|
386
|
+
|
387
|
+
Upload video with a developer tag:
|
388
|
+
|
389
|
+
```ruby
|
390
|
+
# with youtube_it
|
391
|
+
client = # new client initialized with either OAuth or AuthSub
|
392
|
+
client.video_upload(File.open("test.mov"), :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test], :dev_tag => 'tagdev')
|
393
|
+
# with yt: not supported (was removed from YouTube API V3)
|
394
|
+
```
|
395
|
+
|
396
|
+
Upload video from URL:
|
397
|
+
|
398
|
+
```ruby
|
399
|
+
# with youtube_it
|
400
|
+
client = # new client initialized with either OAuth or AuthSub
|
401
|
+
client.video_upload("http://media.railscasts.com/assets/episodes/videos/412-fast-rails-commands.mp4", :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test])
|
402
|
+
# with yt
|
403
|
+
account = Yt::Account.new access_token: 'access_token'
|
404
|
+
account.upload_video 'http://media.railscasts.com/assets/episodes/videos/412-fast-rails-commands.mp4', title: 'test', description: 'some description', category_id: 22, tags: %w(cool blah test)
|
405
|
+
```
|
406
|
+
|
407
|
+
Upload private video:
|
408
|
+
|
409
|
+
```ruby
|
410
|
+
# with youtube_it
|
411
|
+
client = # new client initialized with either OAuth or AuthSub
|
412
|
+
client.video_upload(File.open("test.mov"), :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test], :private => true)
|
413
|
+
# with yt
|
414
|
+
account = Yt::Account.new access_token: 'access_token'
|
415
|
+
account.upload_video 'test.mov', privacy_status: :private, title: 'test', description: 'some description', category_id: 22, tags: %w(cool blah test)
|
416
|
+
```
|
417
|
+
|
418
|
+
Update video:
|
419
|
+
|
420
|
+
```ruby
|
421
|
+
# with youtube_it
|
422
|
+
client = # new client initialized with either OAuth or AuthSub
|
423
|
+
client.video_update("FQK1URcxmb4", :title => "new test",:description => 'new description', :category => 'People',:keywords => %w[cool blah test])
|
424
|
+
# with yt: only provides the values that need to be updated; the remaining ones
|
425
|
+
# will automatically be kept as they are
|
426
|
+
account = Yt::Account.new access_token: 'access_token'
|
427
|
+
video = Yt::Video.new id: 'FQK1URcxmb4', auth: account
|
428
|
+
video.update title: 'new test', description: 'new description'
|
429
|
+
```
|
430
|
+
|
431
|
+
Delete video:
|
432
|
+
|
433
|
+
```ruby
|
434
|
+
# with youtube_it
|
435
|
+
client = # new client initialized with either OAuth or AuthSub
|
436
|
+
client.video_delete("FQK1URcxmb4")
|
437
|
+
# with yt
|
438
|
+
account = Yt::Account.new access_token: 'access_token'
|
439
|
+
video = Yt::Video.new id: 'FQK1URcxmb4'
|
440
|
+
video.delete
|
441
|
+
```
|
442
|
+
|
443
|
+
My videos:
|
444
|
+
|
445
|
+
```ruby
|
446
|
+
# with youtube_it
|
447
|
+
client = # new client initialized with either OAuth or AuthSub
|
448
|
+
client.my_videos
|
449
|
+
# with yt
|
450
|
+
account = Yt::Account.new access_token: 'access_token'
|
451
|
+
account.videos
|
452
|
+
```
|
453
|
+
|
454
|
+
My video:
|
455
|
+
|
456
|
+
```ruby
|
457
|
+
# with youtube_it
|
458
|
+
client = # new client initialized with either OAuth or AuthSub
|
459
|
+
client.my_video(video_id)
|
460
|
+
# with yt
|
461
|
+
account = Yt::Account.new access_token: 'access_token'
|
462
|
+
Yt::Video.new id: video_id, auth: account
|
463
|
+
```
|
464
|
+
|
465
|
+
Profile details:
|
466
|
+
|
467
|
+
```ruby
|
468
|
+
# with youtube_it
|
469
|
+
client = # new client initialized with either OAuth or AuthSub
|
470
|
+
client.profile(user)
|
471
|
+
# with yt
|
472
|
+
account = Yt::Account.new access_token: 'access_token'
|
473
|
+
account.user_info
|
474
|
+
```
|
475
|
+
|
476
|
+
List comments:
|
477
|
+
|
478
|
+
```ruby
|
479
|
+
# with youtube_it
|
480
|
+
client = YouTubeIt::Client.new
|
481
|
+
client.comments(video_id)
|
482
|
+
# with yt: not supported (was removed from YouTube API V3)
|
483
|
+
```
|
484
|
+
|
485
|
+
Add a comment:
|
486
|
+
|
487
|
+
```ruby
|
488
|
+
# with youtube_it
|
489
|
+
client = # new client initialized with either OAuth or AuthSub
|
490
|
+
client.add_comment(video_id, "test comment!")
|
491
|
+
# with yt: not supported (was removed from YouTube API V3)
|
492
|
+
```
|
493
|
+
|
494
|
+
Add a reply comment:
|
495
|
+
|
496
|
+
```ruby
|
497
|
+
# with youtube_it
|
498
|
+
client = # new client initialized with either OAuth or AuthSub
|
499
|
+
client.add_comment(video_id, "test reply!", :reply_to => another_comment)
|
500
|
+
# with yt: not supported (was removed from YouTube API V3)
|
501
|
+
```
|
502
|
+
|
503
|
+
Delete a comment:
|
504
|
+
|
505
|
+
```ruby
|
506
|
+
# with youtube_it
|
507
|
+
client = # new client initialized with either OAuth or AuthSub
|
508
|
+
client.delete_comment(video_id, comment_id)
|
509
|
+
# with yt: not supported (was removed from YouTube API V3)
|
510
|
+
```
|
511
|
+
|
512
|
+
<!--
|
513
|
+
List Favorites:
|
514
|
+
|
515
|
+
|
516
|
+
TODO: Although FAVORITE is somehow deprecated, it can still be retrieved with
|
517
|
+
V3. First, get the contentDetails of the account's channel and you'll get
|
518
|
+
|
519
|
+
{"relatedPlaylists"=>
|
520
|
+
{"likes"=>"LLrWYT-_Xncr1BLPfPNr50sQ",
|
521
|
+
"favorites"=>"FLrWYT-_Xncr1BLPfPNr50sQ",
|
522
|
+
"uploads"=>"UUrWYT-_Xncr1BLPfPNr50sQ",
|
523
|
+
"watchHistory"=>"HLrWYT-_Xncr1BLPfPNr50sQ",
|
524
|
+
"watchLater"=>"WLrWYT-_Xncr1BLPfPNr50sQ"},
|
525
|
+
|
526
|
+
Then you can list the videos of the "favorites" playlist. That playlist does
|
527
|
+
not exist for new YouTube account, but you can still add a video to it, and
|
528
|
+
it will magically appear (and also, DELETE PLAYLIST will be disabled)
|
529
|
+
|
530
|
+
|
531
|
+
```ruby
|
532
|
+
# with youtube_it
|
533
|
+
client = # new client initialized with either OAuth or AuthSub
|
534
|
+
client.favorites(user) # default: current user
|
535
|
+
# with yt
|
536
|
+
|
537
|
+
# TODO: ADD account.liked_videos and .disliked_videos
|
538
|
+
```
|
539
|
+
|
540
|
+
Add Favorite:
|
541
|
+
|
542
|
+
```ruby
|
543
|
+
# with youtube_it
|
544
|
+
client = # new client initialized with either OAuth or AuthSub
|
545
|
+
client.add_favorite(video_id)
|
546
|
+
# with yt: "like" a video to mark as favorite with YouTube API V3
|
547
|
+
account = Yt::Account.new access_token: 'access_token'
|
548
|
+
video = Yt::Video.new id: video_id, auth: account
|
549
|
+
video.like
|
550
|
+
```
|
551
|
+
|
552
|
+
Delete Favorite:
|
553
|
+
|
554
|
+
```ruby
|
555
|
+
# with youtube_it
|
556
|
+
client = # new client initialized with either OAuth or AuthSub
|
557
|
+
client.delete_favorite(favorite_entry_id)
|
558
|
+
# with yt: "unlike" a video to remove from favorites with YouTube API V3
|
559
|
+
account = Yt::Account.new access_token: 'access_token'
|
560
|
+
video = Yt::Video.new id: video_id, auth: account
|
561
|
+
video.unlike
|
562
|
+
```
|
563
|
+
|
564
|
+
-->
|
565
|
+
|
566
|
+
Like a video:
|
567
|
+
|
568
|
+
```ruby
|
569
|
+
# with youtube_it
|
570
|
+
client = # new client initialized with either OAuth or AuthSub
|
571
|
+
client.like_video(video_id)
|
572
|
+
# with yt
|
573
|
+
account = Yt::Account.new access_token: 'access_token'
|
574
|
+
video = Yt::Video.new id: video_id, auth: account
|
575
|
+
video.like
|
576
|
+
```
|
577
|
+
|
578
|
+
Dislike a video:
|
579
|
+
|
580
|
+
```ruby
|
581
|
+
# with youtube_it
|
582
|
+
client = # new client initialized with either OAuth or AuthSub
|
583
|
+
client.dislike_video(video_id)
|
584
|
+
# with yt
|
585
|
+
account = Yt::Account.new access_token: 'access_token'
|
586
|
+
video = Yt::Video.new id: video_id, auth: account
|
587
|
+
video.dislike
|
588
|
+
```
|
589
|
+
|
590
|
+
List Subscriptions (channels an account is subscribed to):
|
591
|
+
|
592
|
+
```ruby
|
593
|
+
# with youtube_it
|
594
|
+
client = # new client initialized with either OAuth or AuthSub
|
595
|
+
client.subscriptions(user) # default: current user
|
596
|
+
# with yt
|
597
|
+
account = Yt::Account.new access_token: 'access_token'
|
598
|
+
account.subscribed_channels
|
599
|
+
```
|
600
|
+
|
601
|
+
Subscribe to a channel:
|
602
|
+
|
603
|
+
```ruby
|
604
|
+
# with youtube_it
|
605
|
+
client = # new client initialized with either OAuth or AuthSub
|
606
|
+
client.subscribe_channel(channel_name)
|
607
|
+
# with yt
|
608
|
+
account = Yt::Account.new access_token: 'access_token'
|
609
|
+
channel = Yt::Channel.new id: channel_id, auth: account
|
610
|
+
channel.subscribe
|
611
|
+
```
|
612
|
+
|
613
|
+
Unsubscribe from a channel:
|
614
|
+
|
615
|
+
```ruby
|
616
|
+
# with youtube_it
|
617
|
+
client = # new client initialized with either OAuth or AuthSub
|
618
|
+
client.unsubscribe_channel(subscription_id)
|
619
|
+
# with yt
|
620
|
+
account = Yt::Account.new access_token: 'access_token'
|
621
|
+
channel = Yt::Channel.new id: channel_id, auth: account
|
622
|
+
channel.unsubscribe
|
623
|
+
```
|
624
|
+
|
625
|
+
List New Subscription Videos:
|
626
|
+
|
627
|
+
|
628
|
+
```ruby
|
629
|
+
# with youtube_it
|
630
|
+
client = # new client initialized with either OAuth or AuthSub
|
631
|
+
client.new_subscription_videos(user) # default: current user
|
632
|
+
# with yt: not supported (was removed from YouTube API V3)
|
633
|
+
```
|
634
|
+
|
635
|
+
List Playlists:
|
636
|
+
|
637
|
+
```ruby
|
638
|
+
# with youtube_it
|
639
|
+
client = # new client initialized with either OAuth or AuthSub
|
640
|
+
client.playlists(user) # default order, by position
|
641
|
+
client.playlists(user, "title") # order by title
|
642
|
+
# with yt: available without order; ordering was removed from YouTube API V3
|
643
|
+
account = Yt::Account.new access_token: 'access_token'
|
644
|
+
account.playlists
|
645
|
+
```
|
646
|
+
|
647
|
+
Select Playlist:
|
648
|
+
|
649
|
+
```ruby
|
650
|
+
# with youtube_it
|
651
|
+
client.playlist(playlist_id)
|
652
|
+
# with yt
|
653
|
+
Yt::Playlist.new id: playlist_id
|
654
|
+
```
|
655
|
+
|
656
|
+
Select All Videos From A Playlist:
|
657
|
+
|
658
|
+
```ruby
|
659
|
+
# with youtube_it
|
660
|
+
playlist = client.playlist(playlist_id)
|
661
|
+
playlist.videos
|
662
|
+
# with yt
|
663
|
+
playlist = Yt::Playlist.new id: playlist_id
|
664
|
+
playlist.playlist_items.map &:video
|
665
|
+
```
|
666
|
+
|
667
|
+
Create Playlist:
|
668
|
+
|
669
|
+
```ruby
|
670
|
+
# with youtube_it
|
671
|
+
client = # new client initialized with either OAuth or AuthSub
|
672
|
+
playlist = client.add_playlist(:title => "new playlist", :description => "playlist description")
|
673
|
+
# with yt
|
674
|
+
account = Yt::Account.new access_token: 'access_token'
|
675
|
+
account.create_playlist title: 'new playlist', description: 'playlist description'
|
676
|
+
```
|
677
|
+
|
678
|
+
Delete Playlist:
|
679
|
+
|
680
|
+
```ruby
|
681
|
+
# with youtube_it
|
682
|
+
client = # new client initialized with either OAuth or AuthSub
|
683
|
+
client.delete_playlist(playlist_id)
|
684
|
+
# with yt
|
685
|
+
account = Yt::Account.new access_token: 'access_token'
|
686
|
+
playlist = Yt::Playlist.new id: playlist_id, auth: account
|
687
|
+
playlist.delete
|
688
|
+
```
|
689
|
+
|
690
|
+
Add Video To Playlist:
|
691
|
+
|
692
|
+
```ruby
|
693
|
+
# with youtube_it
|
694
|
+
client = # new client initialized with either OAuth or AuthSub
|
695
|
+
client.add_video_to_playlist(playlist_id, video_id, position)
|
696
|
+
# with yt
|
697
|
+
account = Yt::Account.new access_token: 'access_token'
|
698
|
+
playlist = Yt::Playlist.new id: playlist_id, auth: account
|
699
|
+
playlist.add_video video_id, position: position
|
700
|
+
```
|
701
|
+
|
702
|
+
Remove Video From Playlist:
|
703
|
+
|
704
|
+
```ruby
|
705
|
+
# with youtube_it
|
706
|
+
client = # new client initialized with either OAuth or AuthSub
|
707
|
+
client.delete_video_from_playlist(playlist_id, playlist_entry_id)
|
708
|
+
# with yt
|
709
|
+
account = Yt::Account.new access_token: 'access_token'
|
710
|
+
playlist_item = Yt::PlaylistItem.new id: playlist_entry_id, auth: account
|
711
|
+
playlist_item.delete
|
712
|
+
```
|
713
|
+
|
714
|
+
Update Position Video From Playlist:
|
715
|
+
|
716
|
+
```ruby
|
717
|
+
# with youtube_it
|
718
|
+
client = # new client initialized with either OAuth or AuthSub
|
719
|
+
client.update_position_video_from_playlist(playlist_id, playlist_entry_id, position)
|
720
|
+
# with yt
|
721
|
+
account = Yt::Account.new access_token: 'access_token'
|
722
|
+
playlist_item = Yt::PlaylistItem.new id: playlist_entry_id, auth: account
|
723
|
+
playlist_item.update position: position
|
724
|
+
```
|
725
|
+
|
726
|
+
<!--
|
727
|
+
|
728
|
+
|
729
|
+
TODO: Although WATCHLATER is somehow deprecated, it can still be retrieved with
|
730
|
+
V3. First, get the contentDetails of the account's channel and you'll get
|
731
|
+
|
732
|
+
{"relatedPlaylists"=>
|
733
|
+
{"likes"=>"LLrWYT-_Xncr1BLPfPNr50sQ",
|
734
|
+
"favorites"=>"FLrWYT-_Xncr1BLPfPNr50sQ",
|
735
|
+
"uploads"=>"UUrWYT-_Xncr1BLPfPNr50sQ",
|
736
|
+
"watchHistory"=>"HLrWYT-_Xncr1BLPfPNr50sQ",
|
737
|
+
"watchLater"=>"WLrWYT-_Xncr1BLPfPNr50sQ"},
|
738
|
+
|
739
|
+
Then you can list the videos of the "watch later" playlist. That playlist does
|
740
|
+
not exist for new YouTube account, but you can still add a video to it, and
|
741
|
+
it will magically appear (and also, DELETE PLAYLIST will be disabled)
|
742
|
+
|
743
|
+
|
744
|
+
Select All Videos From your Watch Later Playlist:
|
745
|
+
$ watcher_later = client.watcherlater(user) #default: current user
|
746
|
+
$ watcher_later.videos
|
747
|
+
|
748
|
+
Add Video To Watcher Later Playlist:
|
749
|
+
$ client.add_video_to_watchlater(video_id)
|
750
|
+
|
751
|
+
Remove Video From Watch Later Playlist:
|
752
|
+
$ client.delete_video_from_watchlater(watchlater_entry_id)
|
753
|
+
|
754
|
+
-->
|
755
|
+
|
756
|
+
|
757
|
+
<!-- TODO: Add using https://developers.google.com/youtube/v3/docs/search/list#relatedToVideoId
|
758
|
+
|
759
|
+
List Related Videos:
|
760
|
+
|
761
|
+
```ruby
|
762
|
+
# with youtube_it
|
763
|
+
client = # new client initialized with either OAuth or AuthSub
|
764
|
+
video = client.video_by("https://www.youtube.com/watch?v=QsbmrCtiEUU&feature=player_embedded")
|
765
|
+
video.related.videos
|
766
|
+
# with yt:
|
767
|
+
```
|
768
|
+
|
769
|
+
-->
|
770
|
+
|
771
|
+
Add Response Video:
|
772
|
+
|
773
|
+
```ruby
|
774
|
+
# with youtube_it
|
775
|
+
client = # new client initialized with either OAuth or AuthSub
|
776
|
+
video.add_response(original_video_id, response_video_id)
|
777
|
+
# with yt: not supported (was removed from YouTube API V3)
|
778
|
+
```
|
779
|
+
|
780
|
+
Delete Response Video:
|
781
|
+
|
782
|
+
```ruby
|
783
|
+
# with youtube_it
|
784
|
+
client = # new client initialized with either OAuth or AuthSub
|
785
|
+
video.delete_response(original_video_id, response_video_id)
|
786
|
+
# with yt: not supported (was removed from YouTube API V3)
|
787
|
+
```
|
788
|
+
|
789
|
+
List Response Videos:
|
790
|
+
|
791
|
+
```ruby
|
792
|
+
# with youtube_it
|
793
|
+
client = # new client initialized with either OAuth or AuthSub
|
794
|
+
video = client.video_by("https://www.youtube.com/watch?v=QsbmrCtiEUU&feature=player_embedded")
|
795
|
+
video.responses.videos
|
796
|
+
# with yt: not supported (was removed from YouTube API V3)
|
797
|
+
```
|
798
|
+
|
799
|
+
Batch videos (list multiple videos):
|
800
|
+
|
801
|
+
```ruby
|
802
|
+
# with youtube_it
|
803
|
+
client = # new client initialized with either OAuth or AuthSub
|
804
|
+
client.videos(['video_id_1', 'video_id_2',...])
|
805
|
+
# with yt
|
806
|
+
Yt::Collections::Videos.new.where(id: 'video_id_1,video_id_2')
|
807
|
+
```
|
808
|
+
|
809
|
+
Access control list
|
810
|
+
-------------------
|
811
|
+
|
812
|
+
While `youtube_it` allows users to give and revoke permissions to rate, comment,
|
813
|
+
respond, list, embed and syndicate uploaded videos, `Yt` does not.
|
814
|
+
|
815
|
+
The reason is that most of these permissions have been deprecated in YouTube
|
816
|
+
Data API V3. The only parameter that can still be passed when updating a
|
817
|
+
video is 'embeddable'; however many users have reported that updating this
|
818
|
+
setting through the API simply does not work.
|
819
|
+
See https://code.google.com/p/gdata-issues/issues/detail?id=4861
|
820
|
+
|
821
|
+
Block users from commenting on a video:
|
822
|
+
|
823
|
+
```ruby
|
824
|
+
# with youtube_it
|
825
|
+
client = YouTubeIt::Client.new(:username => "youtube_username", :password => "youtube_passwd", :dev_key => "developer_key")
|
826
|
+
client.video_upload(File.open("test.mov"), :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test], :comment => "denied")
|
827
|
+
# with yt: not supported (was removed from YouTube API V3; only the embeddable setting can be specified)
|
828
|
+
```
|
829
|
+
|
830
|
+
Block users from embedding a video:
|
831
|
+
|
832
|
+
```ruby
|
833
|
+
# with youtube_it
|
834
|
+
client = YouTubeIt::Client.new(:username => "youtube_username", :password => "youtube_passwd", :dev_key => "developer_key")
|
835
|
+
client.video_upload(File.open("test.mov"), :title => "test",:description => 'some description', :category => 'People',:keywords => %w[cool blah test], :embed => "denied")
|
836
|
+
# with yt: not supported (it is documented in YouTube API V3 but looks like it is not working)
|
837
|
+
```
|
838
|
+
|
839
|
+
Partial updates
|
840
|
+
---------------
|
841
|
+
|
842
|
+
While `youtube_it` uses a separate method to specify that an UPDATE request
|
843
|
+
should not modify any field that has not been explicitly specified, `Yt`
|
844
|
+
applies this behavior by default
|
845
|
+
|
846
|
+
Change the title of a video, but not its privacy status or its description:
|
847
|
+
|
848
|
+
```ruby
|
849
|
+
# with youtube_it
|
850
|
+
client = # new client initialized with either OAuth or AuthSub
|
851
|
+
client.video_partial_update(video_id, :title => 'new title')
|
852
|
+
# with yt
|
853
|
+
account = Yt::Account.new access_token: 'access_token'
|
854
|
+
video = Yt::Video.new id: video_id, auth: account
|
855
|
+
video.update title: 'new title'
|
856
|
+
```
|
857
|
+
|
858
|
+
<!--
|
859
|
+
|
860
|
+
TODO
|
861
|
+
|
862
|
+
== User Activity
|
863
|
+
You can get user activity with the followings params:
|
864
|
+
|
865
|
+
$ client.activity(user) #default current user
|
866
|
+
|
867
|
+
-->
|