yt 0.21.0 → 0.22.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/.yardopts +1 -0
- data/CHANGELOG.md +13 -0
- data/README.md +8 -461
- data/lib/yt/actions/base.rb +1 -0
- data/lib/yt/associations/has_attribute.rb +2 -0
- data/lib/yt/associations/has_authentication.rb +2 -0
- data/lib/yt/associations/has_many.rb +1 -0
- data/lib/yt/associations/has_one.rb +1 -0
- data/lib/yt/associations/has_reports.rb +24 -18
- data/lib/yt/collections/authentications.rb +1 -0
- data/lib/yt/collections/content_details.rb +1 -0
- data/lib/yt/collections/content_owner_details.rb +1 -0
- data/lib/yt/collections/file_details.rb +1 -0
- data/lib/yt/collections/ids.rb +1 -0
- data/lib/yt/collections/live_streaming_details.rb +1 -0
- data/lib/yt/collections/players.rb +1 -0
- data/lib/yt/collections/ratings.rb +1 -0
- data/lib/yt/collections/reports.rb +25 -16
- data/lib/yt/collections/resources.rb +1 -0
- data/lib/yt/collections/resumable_sessions.rb +1 -0
- data/lib/yt/collections/snippets.rb +1 -0
- data/lib/yt/collections/statistics_sets.rb +1 -0
- data/lib/yt/collections/statuses.rb +1 -0
- data/lib/yt/collections/subscriptions.rb +1 -0
- data/lib/yt/collections/user_infos.rb +1 -0
- data/lib/yt/models/account.rb +28 -26
- data/lib/yt/models/base.rb +1 -0
- data/lib/yt/models/channel.rb +38 -38
- data/lib/yt/models/content_detail.rb +1 -0
- data/lib/yt/models/content_owner_detail.rb +1 -0
- data/lib/yt/models/device_flow.rb +1 -0
- data/lib/yt/models/file_detail.rb +1 -0
- data/lib/yt/models/iterator.rb +1 -0
- data/lib/yt/models/live_streaming_detail.rb +1 -0
- data/lib/yt/models/player.rb +1 -0
- data/lib/yt/models/playlist.rb +19 -19
- data/lib/yt/models/playlist_item.rb +12 -12
- data/lib/yt/models/rating.rb +1 -0
- data/lib/yt/models/resource.rb +8 -2
- data/lib/yt/models/resumable_session.rb +1 -0
- data/lib/yt/models/snippet.rb +1 -0
- data/lib/yt/models/statistics_set.rb +1 -0
- data/lib/yt/models/status.rb +1 -6
- data/lib/yt/models/subscription.rb +1 -0
- data/lib/yt/models/timestamp.rb +1 -0
- data/lib/yt/models/url.rb +1 -0
- data/lib/yt/models/user_info.rb +1 -0
- data/lib/yt/models/video.rb +70 -70
- data/lib/yt/models/video_category.rb +1 -0
- data/lib/yt/request.rb +1 -0
- data/lib/yt/version.rb +1 -1
- data/spec/collections/reports_spec.rb +1 -1
- data/spec/requests/as_content_owner/channel_spec.rb +210 -14
- data/spec/requests/as_content_owner/playlist_spec.rb +68 -8
- data/spec/requests/as_content_owner/video_spec.rb +213 -16
- data/spec/requests/as_server_app/channel_spec.rb +27 -7
- data/spec/requests/as_server_app/playlist_spec.rb +25 -4
- data/spec/requests/as_server_app/video_spec.rb +26 -5
- metadata +1 -3
- data/spec/requests/as_server_app/resource_spec.rb +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6287e851c03a8285e094efa577c17f0a9ca6204
|
4
|
+
data.tar.gz: 0da6d402a9062dc8cc9e1759636d691f505eae13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f345bff512092cf0ff25bb9223fccbe1555fba58a71bf5711312b870322925a1335c929a88e84d3c2317cd69883fcb50b80d89a102b3b64ffc96475f6064185a
|
7
|
+
data.tar.gz: 9544b7238eca631c1f933a9789ff88480fb57025126048c7e1bc07a5d0427ec191d5bfb3e0064c41c8c7c22a14287012a0acb0e1621cafff10d67bece4d3aa2d
|
data/.yardopts
CHANGED
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,19 @@ 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.22.0 - 2015-04-30
|
10
|
+
|
11
|
+
**How to upgrade**
|
12
|
+
|
13
|
+
If your code expects any of the following method to return Float values, then
|
14
|
+
be aware that they now return Integer. You can still call `to_f` if you do need
|
15
|
+
a Float: views, `comments`, `likes`, `dislikes`, `shares`, `subscribers_gained`,
|
16
|
+
`subscribers_lost`, `favorites_added`, `favorites_removed`, `annotations`,
|
17
|
+
`impressions`, `monetized_plybacks`, `playlist_starts`.
|
18
|
+
|
19
|
+
* [ENHANCEMENT] Return `Integer` values for reports that can never return decimal digits.
|
20
|
+
* [FEATURE] New `by: :range` option for reports, to return a metric without dimensions (that is, for the whole range)
|
21
|
+
|
9
22
|
## 0.21.0 - 2015-04-30
|
10
23
|
|
11
24
|
**How to upgrade**
|
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.22.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*)
|
@@ -54,47 +54,8 @@ Available resources
|
|
54
54
|
Yt::Account
|
55
55
|
-----------
|
56
56
|
|
57
|
-
|
57
|
+
Check [fullscreen.github.io/yt](http://fullscreen.github.io/yt/accounts.html) for the list of methods available for `Yt::Account`.
|
58
58
|
|
59
|
-
* authenticate as a YouTube account
|
60
|
-
* read the attributes of the account
|
61
|
-
* access the channel managed by the account
|
62
|
-
* access the videos uploaded by the account
|
63
|
-
* create playlist
|
64
|
-
* upload a video
|
65
|
-
* list the channels subscribed to an account
|
66
|
-
|
67
|
-
```ruby
|
68
|
-
# Accounts can be initialized with access token, refresh token or an authorization code
|
69
|
-
account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
|
70
|
-
|
71
|
-
account.email #=> .. your e-mail address..
|
72
|
-
account.channel #=> #<Yt::Models::Channel @id=...>
|
73
|
-
|
74
|
-
account.videos.count #=> 12
|
75
|
-
account.videos.first #=> #<Yt::Models::Video @id=...>
|
76
|
-
|
77
|
-
account.upload_video 'my_video.mp4', title: 'My new video', privacy_status: 'private', category_id: '17'
|
78
|
-
account.upload_video 'http://example.com/remote.m4v', title: 'My other video', tags: ['music']
|
79
|
-
|
80
|
-
account.create_playlist title: 'New playlist', privacy_status: 'unlisted' #=> true
|
81
|
-
|
82
|
-
account.subscribers.count #=> 2
|
83
|
-
account.subscribers.first #=> #<Yt::Models::Channel @id=...>
|
84
|
-
account.subscribers.first.title #=> 'Fullscreen'
|
85
|
-
|
86
|
-
```
|
87
|
-
|
88
|
-
*The methods above require to be authenticated as a YouTube account (see below).*
|
89
|
-
|
90
|
-
```ruby
|
91
|
-
account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
|
92
|
-
|
93
|
-
account.content_owners.count #=> 3
|
94
|
-
account.content_owners.first #=> #<Yt::Models::ContentOwner @id=...>
|
95
|
-
```
|
96
|
-
|
97
|
-
*The methods above require to be authenticated as a YouTube Content Partner account (see below).*
|
98
59
|
|
99
60
|
Yt::ContentOwner
|
100
61
|
----------------
|
@@ -138,424 +99,22 @@ content_owner.create_asset type: 'web' #=> #<Yt::Models::Asset @id=...>
|
|
138
99
|
Yt::Channel
|
139
100
|
-----------
|
140
101
|
|
141
|
-
|
142
|
-
|
143
|
-
* read the attributes of a channel
|
144
|
-
* access the videos of a channel
|
145
|
-
* access the playlists of a channel
|
146
|
-
* access the channels that the channel is subscribed to
|
147
|
-
* subscribe to and unsubscribe from a channel
|
148
|
-
* delete playlists from a channel
|
149
|
-
* retrieve the daily earnings, views, comments, likes, dislikes, shares, subscribers gained/lost, annotation clicks, annotation click-through rate, annotation close rate, estimated/average video watch and impressions of a channel by day
|
150
|
-
* retrieve the views and estimated minutes watched by traffic source
|
151
|
-
* retrieve the views and estimated minutes watched by playback location
|
152
|
-
* retrieve the views and estimated minutes watched by embedded player location
|
153
|
-
* retrieve the views and estimated minutes watched by related video
|
154
|
-
* retrieve the views and estimated minutes watched by video
|
155
|
-
* retrieve the views and estimated minutes watched by playlist
|
156
|
-
* retrieve the views and estimated minutes watched by device type
|
157
|
-
* retrieve the viewer percentage of a channel by gender, by age group or by both
|
158
|
-
|
159
|
-
```ruby
|
160
|
-
# Channels can be initialized with ID or URL
|
161
|
-
channel = Yt::Channel.new url: 'youtube.com/fullscreen'
|
162
|
-
|
163
|
-
channel.title #=> "Fullscreen"
|
164
|
-
channel.description #=> "The first media company for the connected generation."
|
165
|
-
channel.description.has_link_to_playlist? #=> false
|
166
|
-
channel.thumbnail_url #=> "https://yt3.ggpht.com/-KMnbKDBl60w/.../photo.jpg"
|
167
|
-
channel.published_at #=> 2006-03-23 06:13:25 UTC
|
168
|
-
channel.public? #=> true
|
169
|
-
|
170
|
-
channel.view_count #=> 421619
|
171
|
-
channel.comment_count #=> 773
|
172
|
-
channel.video_count #=> 12
|
173
|
-
channel.subscriber_count #=> 136925
|
174
|
-
channel.subscriber_count_visible? #=> true
|
175
|
-
|
176
|
-
channel.videos.count #=> 12
|
177
|
-
channel.videos.first #=> #<Yt::Models::Video @id=...>
|
178
|
-
|
179
|
-
channel.playlists.count #=> 2
|
180
|
-
channel.playlists.first #=> #<Yt::Models::Playlist @id=...>
|
181
|
-
|
182
|
-
channel.subscribed_channels.count #=> 132
|
183
|
-
channel.subscribed_channels.first #=> #<Yt::Models::Channel @id=...>
|
184
|
-
```
|
185
|
-
|
186
|
-
*The methods above do not require authentication.*
|
187
|
-
|
188
|
-
```ruby
|
189
|
-
account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
|
190
|
-
channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow', auth: account
|
191
|
-
|
192
|
-
channel.subscribed? #=> false
|
193
|
-
channel.subscribe #=> true
|
194
|
-
```
|
195
|
-
|
196
|
-
*The methods above require to be authenticated as a YouTube account (see below).*
|
197
|
-
|
198
|
-
```ruby
|
199
|
-
account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
|
200
|
-
channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow', auth: account
|
201
|
-
|
202
|
-
channel.delete_playlists title: 'New playlist' #=> [true]
|
203
|
-
|
204
|
-
channel.views since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
205
|
-
channel.comments until: 2.days.ago #=> {Wed, 28 May 2014 => 9.0, Thu, 29 May 2014 => 4.0, …}
|
206
|
-
channel.likes from: 8.days.ago #=> {Tue, 27 May 2014 => 7.0, Wed, 28 May 2014 => 0.0, …}
|
207
|
-
channel.dislikes to: 2.days.ago #=> {Tue, 27 May 2014 => 0.0, Wed, 28 May 2014 => 1.0, …}
|
208
|
-
channel.shares since: 7.days.ago, until: 7.days.ago #=> {Wed, 28 May 2014 => 3.0}
|
209
|
-
channel.subscribers_gained from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>1.0, Sun, 31 Aug 2014=>0.0}
|
210
|
-
channel.subscribers_lost from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>0.0, Sun, 31 Aug 2014=>0.0}
|
211
|
-
channel.favorites_added from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>1.0, Sun, 31 Aug 2014=>0.0}
|
212
|
-
channel.favorites_removed from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>0.0, Sun, 31 Aug 2014=>0.0}
|
213
|
-
channel.estimated_minutes_watched #=> {Sun, 22 Feb 2015=>2433258.0, Mon, 23 Feb 2015=>2634360.0, …}
|
214
|
-
channel.average_view_duration #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
215
|
-
channel.average_view_percentage # {Sun, 22 Feb 2015=>38.858253094977265, Mon, 23 Feb 2015=>37.40014235438217, …}
|
216
|
-
channel.annotation_clicks #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
217
|
-
channel.annotation_click_through_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
218
|
-
channel.annotation_close_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
219
|
-
channel.viewer_percentage #=> {female: {'18-24' => 12.12, '25-34' => 16.16,…}…}
|
220
|
-
|
221
|
-
channel.views since: 7.days.ago, by: :traffic_source #=> {advertising: 10.0, related_video: 20.0, promoted: 5.0, subscriber: 1.0, channel: 3.0, other: 7.0}
|
222
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :traffic_source #=> {annotation: 10.0, external_app: 20.0, external_url: 5.0, embedded: 1.0, search: 3.0}
|
223
|
-
|
224
|
-
channel.views since: 7.days.ago, by: :playback_location #=> {embedded: 34.0, watch: 467.0, channel: 462.0, other: 3.0}
|
225
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :playback_location #=> {embedded: 34.0, watch: 467.0, channel: 462.0, other: 3.0}
|
226
|
-
|
227
|
-
channel.views since: 7.days.ago, by: :embedded_player_location #=> {"fullscreen.net"=>45.0, "linkedin.com"=>5.0, "mashable.com"=>1.0, "unknown"=>1.0}
|
228
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :embedded_player_location #=> {"fullscreen.net"=>45.0, "linkedin.com"=>5.0, "mashable.com"=>1.0, "unknown"=>1.0}
|
229
|
-
|
230
|
-
channel.views since: 7.days.ago, by: :related_video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
231
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :related_video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
232
|
-
|
233
|
-
channel.views since: 7.days.ago, by: :video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
234
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
235
|
-
|
236
|
-
channel.views since: 7.days.ago, by: :playlist #=> {#<Yt::Models::Playlist @id=...>: 10.0, #<Yt::Models::Playlist @id=...>: 20.0, …}
|
237
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :playlist #=> {#<Yt::Models::Playlist @id=...>: 10.0, #<Yt::Models::Playlist @id=...>: 20.0, …}
|
238
|
-
|
239
|
-
channel.views since: 7.days.ago, by: :device_type #=> {mobile: 144473.0, unknown_platform: 840.0, game_console: 4940.0, desktop: 102889.0, tv: 4134.0, tablet: 50189.0}
|
240
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :device_type #=> {mobile: 144473.0, unknown_platform: 840.0, game_console: 4940.0, desktop: 102889.0, tv: 4134.0, tablet: 50189.0}
|
241
|
-
```
|
242
|
-
|
243
|
-
*The methods above require to be authenticated as the channel’s account (see below).*
|
244
|
-
|
245
|
-
```ruby
|
246
|
-
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
|
247
|
-
channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow', auth: content_owner
|
248
|
-
|
249
|
-
channel.earnings_on 5.days.ago #=> 12.23
|
250
|
-
channel.views since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
251
|
-
channel.comments until: 2.days.ago #=> {Wed, 28 May 2014 => 9.0, Thu, 29 May 2014 => 4.0, …}
|
252
|
-
channel.likes from: 8.days.ago #=> {Tue, 27 May 2014 => 7.0, Wed, 28 May 2014 => 0.0, …}
|
253
|
-
channel.dislikes to: 2.days.ago #=> {Tue, 27 May 2014 => 0.0, Wed, 28 May 2014 => 1.0, …}
|
254
|
-
channel.shares since: 7.days.ago, until: 7.days.ago #=> {Wed, 28 May 2014 => 3.0}
|
255
|
-
channel.impressions_on 5.days.ago #=> 157.0
|
256
|
-
channel.subscribers_gained from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>1.0, Sun, 31 Aug 2014=>0.0}
|
257
|
-
channel.subscribers_lost from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>0.0, Sun, 31 Aug 2014=>0.0}
|
258
|
-
channel.estimated_minutes_watched #=> {Sun, 22 Feb 2015=>2433258.0, Mon, 23 Feb 2015=>2634360.0, …}
|
259
|
-
channel.average_view_duration #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
260
|
-
channel.average_view_percentage # {Sun, 22 Feb 2015=>38.858253094977265, Mon, 23 Feb 2015=>37.40014235438217, …}
|
261
|
-
channel.annotation_clicks #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
262
|
-
channel.annotation_click_through_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
263
|
-
channel.annotation_close_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
264
|
-
channel.viewer_percentage since: 7.days.ago #=> {female: {'18-24' => 12.12, '25-34' => 16.16,…}…}
|
265
|
-
|
266
|
-
channel.views since: 7.days.ago, by: :traffic_source #=> {advertising: 10.0, related_video: 20.0, promoted: 5.0, subscriber: 1.0, channel: 3.0, other: 7.0}
|
267
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :traffic_source #=> {annotation: 10.0, external_app: 20.0, external_url: 5.0, embedded: 1.0, search: 3.0}
|
268
|
-
channel.views since: 7.days.ago, by: :playback_location #=> {embedded: 34.0, watch: 467.0, channel: 462.0, other: 3.0}
|
269
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :playback_location #=> {embedded: 34.0, watch: 467.0, channel: 462.0, other: 3.0}
|
270
|
-
channel.views since: 7.days.ago, by: :embedded_player_location #=> {"fullscreen.net"=>45.0, "linkedin.com"=>5.0, "mashable.com"=>1.0, "unknown"=>1.0}
|
271
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :embedded_player_location #=> {"fullscreen.net"=>45.0, "linkedin.com"=>5.0, "mashable.com"=>1.0, "unknown"=>1.0}
|
272
|
-
channel.views since: 7.days.ago, by: :related_video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
273
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :related_video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
274
|
-
channel.views since: 7.days.ago, by: :video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
275
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
276
|
-
channel.views since: 7.days.ago, by: :playlist #=> {#<Yt::Models::Playlist @id=...>: 10.0, #<Yt::Models::Playlist @id=...>: 20.0, …}
|
277
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :playlist #=> {#<Yt::Models::Playlist @id=...>: 10.0, #<Yt::Models::Playlist @id=...>: 20.0, …}
|
278
|
-
channel.views since: 7.days.ago, by: :device_type #=> {mobile: 144473.0, unknown_platform: 840.0, game_console: 4940.0, desktop: 102889.0, tv: 4134.0, tablet: 50189.0}
|
279
|
-
channel.estimated_minutes_watched since: 7.days.ago, by: :device_type #=> {mobile: 144473.0, unknown_platform: 840.0, game_console: 4940.0, desktop: 102889.0, tv: 4134.0, tablet: 50189.0}
|
280
|
-
channel.monetized_playbacks_on 5.days.ago #=> 123.0
|
281
|
-
channel.viewer_percentage since: 7.days.ago, by: :gender #=> {female: 49.12, male: 50.88}
|
282
|
-
channel.viewer_percentage since: 7.days.ago, by: :age_group #=> {'18-24' => 12.12, '25-34' => 16.16,…}
|
283
|
-
|
284
|
-
channel.content_owner #=> 'CMSname'
|
285
|
-
channel.linked_at #=> Wed, 28 May 2014
|
286
|
-
```
|
287
|
-
|
288
|
-
*The methods above require to be authenticated as the channel’s content owner (see below).*
|
102
|
+
Check [fullscreen.github.io/yt](http://fullscreen.github.io/yt/channels.html) for the list of methods available for `Yt::Channel`.
|
289
103
|
|
290
104
|
Yt::Video
|
291
|
-
|
292
|
-
|
293
|
-
Use [Yt::Video](http://www.rubydoc.info/gems/yt/Yt/Models/Video) to:
|
294
|
-
|
295
|
-
* read the attributes of a video
|
296
|
-
* update the attributes of a video
|
297
|
-
* upload a thumbnail for a video
|
298
|
-
* access the annotations of a video
|
299
|
-
* delete a video
|
300
|
-
* like and dislike a video
|
301
|
-
* retrieve the daily earnings, views, comments, likes, dislikes, shares, subscribers gained/lost, impressions, annotation clicks, annotation click-through rate, annotation close rate and monetized playbacks of a video by day
|
302
|
-
* retrieve the views of a video by traffic source
|
303
|
-
* retrieve the views of a video by playback location
|
304
|
-
* retrieve the views of a video by embedded player location
|
305
|
-
* retrieve the views of a video by related video
|
306
|
-
* retrieve the views of a video by device type
|
307
|
-
* retrieve the viewer percentage of a video by gender, by age group or by both
|
308
|
-
* retrieve data about live-streaming videos
|
309
|
-
* retrieve the advertising options of a video
|
310
|
-
* retrieve the HTML code of the video player
|
311
|
-
* retrieve the file details of a video
|
312
|
-
* retrieve the category title of a video
|
313
|
-
|
314
|
-
```ruby
|
315
|
-
# Videos can be initialized with ID or URL
|
316
|
-
video = Yt::Video.new url: 'http://youtu.be/MESycYJytkU'
|
317
|
-
|
318
|
-
video.title #=> "Fullscreen Creator Platform"
|
319
|
-
video.description #=> "The new Fullscreen Creator Platform gives creators and brands a suite..."
|
320
|
-
video.description.has_link_to_channel? #=> true
|
321
|
-
video.thumbnail_url #=> "https://i1.ytimg.com/vi/MESycYJytkU/default.jpg"
|
322
|
-
video.published_at #=> 2013-07-09 16:27:32 UTC
|
323
|
-
video.tags #=> []
|
324
|
-
video.channel_id #=> "UCxO1tY8h1AhOz0T4ENwmpow"
|
325
|
-
video.channel_title #=> "Fullscreen"
|
326
|
-
video.category_id #=> "22"
|
327
|
-
video.live_broadcast_content #=> "none"
|
328
|
-
|
329
|
-
video.public? #=> true
|
330
|
-
video.uploading? #=> false
|
331
|
-
video.rejected? #=> false
|
332
|
-
video.failed? #=> true
|
333
|
-
video.processed? #=> false
|
334
|
-
video.deleted? #=> false
|
335
|
-
video.uses_unsupported_codec? #=> true
|
336
|
-
video.has_failed_conversion? #=> false
|
337
|
-
video.empty? #=> false
|
338
|
-
video.invalid? #=> false
|
339
|
-
video.too_small? #=> false
|
340
|
-
video.aborted? #=> false
|
341
|
-
video.claimed? #=> false
|
342
|
-
video.infringes_copyright? #=> false
|
343
|
-
video.duplicate? #=> false
|
344
|
-
video.inappropriate? #=> false
|
345
|
-
video.too_long? #=> false
|
346
|
-
video.violates_terms_of_use? #=> false
|
347
|
-
video.infringes_trademark? #=> false
|
348
|
-
video.belongs_to_closed_account? #=> false
|
349
|
-
video.belongs_to_suspended_account? #=> false
|
350
|
-
video.scheduled? #=> true
|
351
|
-
video.scheduled_at #=> Tue, 27 May 2014 12:50:00
|
352
|
-
video.licensed_as_creative_commons? #=> true
|
353
|
-
video.licensed_as_standard_youtube? #=> false
|
354
|
-
video.embeddable? #=> false
|
355
|
-
video.has_public_stats_viewable? #=> false
|
356
|
-
|
357
|
-
video.duration #=> 86
|
358
|
-
video.hd? #=> true
|
359
|
-
video.stereoscopic? #=> false
|
360
|
-
video.captioned? #=> true
|
361
|
-
video.licensed? #=> false
|
362
|
-
|
363
|
-
video.actual_start_time #=> Tue, 27 May 2014 12:50:00
|
364
|
-
video.actual_end_time #=> Tue, 27 May 2014 12:54:00
|
365
|
-
video.scheduled_start_time #=> Tue, 27 May 2014 12:49:00
|
366
|
-
video.scheduled_end_time #=> Tue, 27 May 2014 12:55:00
|
367
|
-
video.concurrent_viewers #=> 0
|
368
|
-
|
369
|
-
video.embed_html #=> "<iframe type='text/html' src='http://www.youtube.com/embed/BPNYv0vd78A' width='640' height='360' frameborder='0' allowfullscreen='true'/>"
|
370
|
-
|
371
|
-
video.file_size #=> 8000000
|
372
|
-
video.file_type #=> "video"
|
373
|
-
video.container #=> "mov"
|
374
|
-
|
375
|
-
video.category_title #=> "People & Blogs"
|
376
|
-
|
377
|
-
video.annotations.count #=> 1
|
378
|
-
video.annotations.first #=> #<Yt::Models::Annotation @id=...>
|
379
|
-
```
|
380
|
-
|
381
|
-
*The methods above do not require authentication.*
|
382
|
-
|
383
|
-
```ruby
|
384
|
-
account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
|
385
|
-
video = Yt::Video.new id: 'MESycYJytkU', auth: account
|
386
|
-
|
387
|
-
video.liked? #=> false
|
388
|
-
video.like #=> true
|
389
|
-
```
|
390
|
-
|
391
|
-
*The methods above require to be authenticated as a YouTube account (see below).*
|
392
|
-
|
393
|
-
```ruby
|
394
|
-
account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
|
395
|
-
video = Yt::Video.new id: 'MESycYJytkU', auth: account
|
396
|
-
|
397
|
-
video.update title: 'A title', description: 'A description <with angle brackets>'
|
398
|
-
video.update tags: ['a tag'], categoryId: '21', license: 'creativeCommon'
|
399
|
-
|
400
|
-
video.upload_thumbnail 'my_thumbnail.jpg'
|
401
|
-
video.upload_thumbnail 'http://example.com/remote.png'
|
402
|
-
|
403
|
-
video.views since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
404
|
-
video.comments until: 2.days.ago #=> {Wed, 28 May 2014 => 9.0, Thu, 29 May 2014 => 4.0, …}
|
405
|
-
video.likes from: 8.days.ago #=> {Tue, 27 May 2014 => 7.0, Wed, 28 May 2014 => 0.0, …}
|
406
|
-
video.dislikes to: 2.days.ago #=> {Tue, 27 May 2014 => 0.0, Wed, 28 May 2014 => 1.0, …}
|
407
|
-
video.shares since: 7.days.ago, until: 7.days.ago #=> {Wed, 28 May 2014 => 3.0}
|
408
|
-
video.subscribers_gained from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>1.0, Sun, 31 Aug 2014=>0.0}
|
409
|
-
video.subscribers_lost from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>0.0, Sun, 31 Aug 2014=>0.0}
|
410
|
-
video.favorites_added from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>1.0, Sun, 31 Aug 2014=>0.0}
|
411
|
-
video.favorites_removed from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>0.0, Sun, 31 Aug 2014=>0.0}
|
412
|
-
video.average_view_duration #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
413
|
-
video.average_view_percentage # {Sun, 22 Feb 2015=>38.858253094977265, Mon, 23 Feb 2015=>37.40014235438217, …}
|
414
|
-
video.estimated_minutes_watched #=> {Sun, 22 Feb 2015=>2433258.0, Mon, 23 Feb 2015=>2634360.0, …}
|
415
|
-
video.annotation_clicks #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
416
|
-
video.annotation_click_through_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
417
|
-
video.annotation_close_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
418
|
-
video.viewer_percentage #=> {female: {'18-24' => 12.12, '25-34' => 16.16,…}…}
|
419
|
-
|
420
|
-
video.views since: 7.days.ago, by: :traffic_source #=> {advertising: 10.0, related_video: 20.0, promoted: 5.0, subscriber: 1.0, channel: 3.0, other: 7.0}
|
421
|
-
video.views since: 7.days.ago, by: :playback_location #=> {:embedded=>6.0, :watch=>11.0}
|
422
|
-
video.views since: 7.days.ago, by: :embedded_player_location #=> {"fullscreen.net"=>45.0, "linkedin.com"=>5.0, "mashable.com"=>1.0, "unknown"=>1.0}
|
423
|
-
video.views since: 7.days.ago, by: :related_video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
424
|
-
video.views since: 7.days.ago, by: :device_type #=> {mobile: 144473.0, unknown_platform: 840.0, game_console: 4940.0, desktop: 102889.0, tv: 4134.0, tablet: 50189.0}
|
425
|
-
video.viewer_percentage since: 7.days.ago, by: :gender #=> {female: 49.12, male: 50.88}
|
426
|
-
video.viewer_percentage since: 7.days.ago, by: :age_group #=> {'18-24' => 12.12, '25-34' => 16.16,…}
|
427
|
-
|
428
|
-
video.delete #=> true
|
429
|
-
```
|
430
|
-
|
431
|
-
*The methods above require to be authenticated as the video’s owner (see below).*
|
432
|
-
|
433
|
-
```ruby
|
434
|
-
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
|
435
|
-
video = Yt::Video.new id: 'MESycYJytkU', auth: content_owner
|
436
|
-
|
437
|
-
video.earnings_on 5.days.ago #=> 12.23
|
438
|
-
video.views since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
439
|
-
video.comments until: 2.days.ago #=> {Wed, 28 May 2014 => 9.0, Thu, 29 May 2014 => 4.0, …}
|
440
|
-
video.likes from: 8.days.ago #=> {Tue, 27 May 2014 => 7.0, Wed, 28 May 2014 => 0.0, …}
|
441
|
-
video.dislikes to: 2.days.ago #=> {Tue, 27 May 2014 => 0.0, Wed, 28 May 2014 => 1.0, …}
|
442
|
-
video.shares since: 7.days.ago, until: 7.days.ago #=> {Wed, 28 May 2014 => 3.0}
|
443
|
-
video.subscribers_gained from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>1.0, Sun, 31 Aug 2014=>0.0}
|
444
|
-
video.subscribers_lost from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>0.0, Sun, 31 Aug 2014=>0.0}
|
445
|
-
video.favorites_added from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>1.0, Sun, 31 Aug 2014=>0.0}
|
446
|
-
video.favorites_removed from: '2014-08-30', to: '2014-08-31' #=> {Sat, 30 Aug 2014=>0.0, Sun, 31 Aug 2014=>0.0}
|
447
|
-
video.average_view_duration #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
448
|
-
video.average_view_percentage # {Sun, 22 Feb 2015=>38.858253094977265, Mon, 23 Feb 2015=>37.40014235438217, …}
|
449
|
-
video.estimated_minutes_watched #=> {Sun, 22 Feb 2015=>2433258.0, Mon, 23 Feb 2015=>2634360.0, …}
|
450
|
-
video.impressions_on 5.days.ago #=> 157.0
|
451
|
-
video.monetized_playbacks_on 5.days.ago #=> 123.0
|
452
|
-
video.annotation_clicks #=> {Sun, 22 Feb 2015=>329.0, Mon, 23 Feb 2015=>326.0, …}
|
453
|
-
video.annotation_click_through_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
454
|
-
video.annotation_close_rate #=> {Sun, 22 Feb 2015=>0.02, Mon, 23 Feb 2015=>0.03, …}
|
455
|
-
video.viewer_percentage #=> {female: {'18-24' => 12.12, '25-34' => 16.16,…}…}
|
456
|
-
|
457
|
-
video.views since: 7.days.ago, by: :traffic_source #=> {advertising: 10.0, related_video: 20.0, promoted: 5.0, subscriber: 1.0, channel: 3.0, other: 7.0}
|
458
|
-
video.views since: 7.days.ago, by: :playback_location #=> {:embedded=>6.0, :watch=>11.0}
|
459
|
-
video.views since: 7.days.ago, by: :embedded_player_location #=> {"fullscreen.net"=>45.0, "linkedin.com"=>5.0, "mashable.com"=>1.0, "unknown"=>1.0}
|
460
|
-
video.views since: 7.days.ago, by: :related_video #=> {#<Yt::Models::Video @id=...>: 10.0, #<Yt::Models::Video @id=...>: 20.0, …}
|
461
|
-
video.views since: 7.days.ago, by: :device_type #=> {mobile: 144473.0, unknown_platform: 840.0, game_console: 4940.0, desktop: 102889.0, tv: 4134.0, tablet: 50189.0}
|
462
|
-
video.viewer_percentage since: 7.days.ago, by: :gender #=> {female: 49.12, male: 50.88}
|
463
|
-
video.viewer_percentage since: 7.days.ago, by: :age_group #=> {'18-24' => 12.12, '25-34' => 16.16,…}
|
464
|
-
|
465
|
-
video.ad_formats #=> ["standard_instream", "trueview_instream"]
|
466
|
-
```
|
105
|
+
---------
|
467
106
|
|
468
|
-
|
107
|
+
Check [fullscreen.github.io/yt](http://fullscreen.github.io/yt/videos.html) for the list of methods available for `Yt::Video`.
|
469
108
|
|
470
109
|
Yt::Playlist
|
471
110
|
------------
|
472
111
|
|
473
|
-
|
474
|
-
|
475
|
-
* read the attributes of a playlist
|
476
|
-
* update the attributes of a playlist
|
477
|
-
* access the items of a playlist
|
478
|
-
* add one or multiple videos to a playlist
|
479
|
-
* delete items from a playlist
|
480
|
-
* retrieve the views, playlist starts, average time in playlist and views per playlist start of a playlist by day
|
481
|
-
|
482
|
-
```ruby
|
483
|
-
# Playlists can be initialized with ID or URL
|
484
|
-
playlist = Yt::Playlist.new url: 'youtube.com/playlist?list=PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc'
|
485
|
-
|
486
|
-
playlist.title #=> "Fullscreen Features"
|
487
|
-
playlist.description #=> "You send us your best videos and we feature our favorite ones..."
|
488
|
-
playlist.description.has_link_to_subscribe? #=> false
|
489
|
-
playlist.thumbnail_url #=> "https://i1.ytimg.com/vi/36kL2alg7Jk/default.jpg"
|
490
|
-
playlist.published_at #=> 2012-11-27 21:23:38 UTC
|
491
|
-
playlist.public? #=> true
|
492
|
-
playlist.tags #=> []
|
493
|
-
playlist.channel_id #=> "UCxO1tY8h1AhOz0T4ENwmpow"
|
494
|
-
playlist.channel_title #=> "Fullscreen"
|
495
|
-
|
496
|
-
playlist.playlist_items.count #=> 1
|
497
|
-
playlist.playlist_items.first #=> #<Yt::Models::PlaylistItem @id=...>
|
498
|
-
```
|
499
|
-
|
500
|
-
*The methods above do not require authentication.*
|
501
|
-
|
502
|
-
```ruby
|
503
|
-
playlist.update title: 'A <title> with angle brackets', description: 'desc', tags: ['new tag'], privacy_status: 'private'
|
504
|
-
playlist.add_video 'MESycYJytkU', position: 2
|
505
|
-
playlist.add_videos ['MESycYJytkU', 'MESycYJytkU']
|
506
|
-
playlist.delete_playlist_items title: 'Fullscreen Creator Platform' #=> [true]
|
507
|
-
|
508
|
-
playlist.views_on 5.days.ago #=> 12.0
|
509
|
-
playlist.views since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
510
|
-
|
511
|
-
playlist.playlist_starts_on 5.days.ago #=> 12.0
|
512
|
-
playlist.playlist_starts since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
513
|
-
|
514
|
-
playlist.average_time_in_playlist_on 5.days.ago #=> 12.0
|
515
|
-
playlist.average_time_in_playlist since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
516
|
-
|
517
|
-
playlist.views_per_playlist_start_on 5.days.ago #=> 12.0
|
518
|
-
playlist.views_per_playlist_start since: 7.days.ago #=> {Wed, 28 May 2014 => 12.0, Thu, 29 May 2014 => 3.0, …}
|
519
|
-
|
520
|
-
```
|
521
|
-
|
522
|
-
*The methods above require to be authenticated as the playlist’s owner (see below).*
|
112
|
+
Check [fullscreen.github.io/yt](http://fullscreen.github.io/yt/playlists.html) for the list of methods available for `Yt::Playlist`.
|
523
113
|
|
524
114
|
Yt::PlaylistItem
|
525
115
|
----------------
|
526
116
|
|
527
|
-
|
528
|
-
|
529
|
-
* read the attributes of a playlist item
|
530
|
-
* update the position of an item inside a playlist
|
531
|
-
* delete a playlist item
|
532
|
-
|
533
|
-
```ruby
|
534
|
-
item = Yt::PlaylistItem.new id: 'PLjW_GNR5Ir0GWEP_oveGBNjTvKkYyZfsna1TZDCBP-Z8'
|
535
|
-
|
536
|
-
item.title #=> "Titanium - David Guetta - Space Among Many Cover ft. Evan Chan and Glenna Roberts"
|
537
|
-
item.description #=> "CLICK to tweet this video: [...]"
|
538
|
-
item.description.has_link_to_channel? #=> true
|
539
|
-
item.thumbnail_url #=> "https://i1.ytimg.com/vi/W4GhTprSsOY/default.jpg"
|
540
|
-
item.published_at #=> 2012-12-22 19:38:02 UTC
|
541
|
-
item.public? #=> true
|
542
|
-
item.channel_id #=> "UCxO1tY8h1AhOz0T4ENwmpow"
|
543
|
-
item.channel_title #=> "Fullscreen"
|
544
|
-
item.playlist_id #=> "PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc"
|
545
|
-
item.position #=> 0
|
546
|
-
item.video_id #=> "W4GhTprSsOY"
|
547
|
-
item.video #=> #<Yt::Models::Video @id=...>
|
548
|
-
```
|
549
|
-
|
550
|
-
*The methods above do not require authentication.*
|
551
|
-
|
552
|
-
```ruby
|
553
|
-
item.update position: 3 #=> true
|
554
|
-
item.delete #=> true
|
555
|
-
```
|
556
|
-
|
557
|
-
*The methods above require to be authenticated as the playlist’s owner (see below).*
|
558
|
-
|
117
|
+
Check [fullscreen.github.io/yt](http://fullscreen.github.io/yt/playlist_items.html) for the list of methods available for `Yt::PlaylistItem`.
|
559
118
|
|
560
119
|
Yt::Collections::Videos
|
561
120
|
-----------------------
|
@@ -578,20 +137,8 @@ videos.where(id: 'MESycYJytkU,invalid').map(&:title) #=> ["Fullscreen Creator Pl
|
|
578
137
|
Yt::Annotation
|
579
138
|
--------------
|
580
139
|
|
581
|
-
|
582
|
-
|
583
|
-
* read the attributes of an annotation
|
584
|
-
|
585
|
-
```ruby
|
586
|
-
video = Yt::Video.new id: 'MESycYJytkU'
|
587
|
-
annotation = video.annotations.first
|
588
|
-
|
589
|
-
annotation.below? 70 #=> false
|
590
|
-
annotation.has_link_to_subscribe? #=> false
|
591
|
-
annotation.has_link_to_playlist? #=> true
|
592
|
-
```
|
140
|
+
Check [fullscreen.github.io/yt](http://fullscreen.github.io/yt/annotations.html) for the list of methods available for `Yt::Annotation`.
|
593
141
|
|
594
|
-
*Annotations do not require authentication.*
|
595
142
|
|
596
143
|
Yt::MatchPolicy
|
597
144
|
---------------
|
data/lib/yt/actions/base.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Yt
|
2
2
|
module Associations
|
3
|
+
# @private
|
3
4
|
# Provides authentication methods to YouTube resources, which allows to
|
4
5
|
# access to content detail set-specific methods like `access_token`.
|
5
6
|
#
|
@@ -16,6 +17,7 @@ module Yt
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
20
|
+
# @private
|
19
21
|
module Authenticable
|
20
22
|
delegate :access_token, :refresh_token, :expires_at, to: :authentication
|
21
23
|
|