yt 0.0.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +24 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +10 -0
  5. data/.yardopts +1 -0
  6. data/Gemfile +9 -0
  7. data/Gemfile.lock +78 -0
  8. data/HISTORY.md +37 -0
  9. data/MIT-LICENSE +20 -0
  10. data/README.md +325 -0
  11. data/Rakefile +1 -0
  12. data/TODO.md +11 -0
  13. data/bin/yt +31 -0
  14. data/lib/yt.rb +2 -0
  15. data/lib/yt/actions/delete.rb +27 -0
  16. data/lib/yt/actions/delete_all.rb +28 -0
  17. data/lib/yt/actions/insert.rb +29 -0
  18. data/lib/yt/actions/list.rb +65 -0
  19. data/lib/yt/actions/update.rb +25 -0
  20. data/lib/yt/associations.rb +33 -0
  21. data/lib/yt/associations/annotations.rb +15 -0
  22. data/lib/yt/associations/channels.rb +20 -0
  23. data/lib/yt/associations/details_sets.rb +20 -0
  24. data/lib/yt/associations/playlist_items.rb +26 -0
  25. data/lib/yt/associations/playlists.rb +22 -0
  26. data/lib/yt/associations/ratings.rb +39 -0
  27. data/lib/yt/associations/snippets.rb +20 -0
  28. data/lib/yt/associations/statuses.rb +14 -0
  29. data/lib/yt/associations/subscriptions.rb +38 -0
  30. data/lib/yt/associations/user_infos.rb +21 -0
  31. data/lib/yt/associations/videos.rb +14 -0
  32. data/lib/yt/collections/annotations.rb +43 -0
  33. data/lib/yt/collections/base.rb +13 -0
  34. data/lib/yt/collections/channels.rb +32 -0
  35. data/lib/yt/collections/details_sets.rb +32 -0
  36. data/lib/yt/collections/playlist_items.rb +50 -0
  37. data/lib/yt/collections/playlists.rb +56 -0
  38. data/lib/yt/collections/ratings.rb +32 -0
  39. data/lib/yt/collections/snippets.rb +38 -0
  40. data/lib/yt/collections/subscriptions.rb +67 -0
  41. data/lib/yt/collections/user_infos.rb +41 -0
  42. data/lib/yt/collections/videos.rb +32 -0
  43. data/lib/yt/config.rb +55 -0
  44. data/lib/yt/models/account.rb +68 -0
  45. data/lib/yt/models/annotation.rb +137 -0
  46. data/lib/yt/models/base.rb +11 -0
  47. data/lib/yt/models/channel.rb +17 -0
  48. data/lib/yt/models/configuration.rb +29 -0
  49. data/lib/yt/models/description.rb +98 -0
  50. data/lib/yt/models/details_set.rb +31 -0
  51. data/lib/yt/models/playlist.rb +65 -0
  52. data/lib/yt/models/playlist_item.rb +42 -0
  53. data/lib/yt/models/rating.rb +28 -0
  54. data/lib/yt/models/snippet.rb +48 -0
  55. data/lib/yt/models/status.rb +26 -0
  56. data/lib/yt/models/subscription.rb +35 -0
  57. data/lib/yt/models/user_info.rb +66 -0
  58. data/lib/yt/models/video.rb +16 -0
  59. data/lib/yt/utils/request.rb +85 -0
  60. data/lib/yt/version.rb +3 -0
  61. data/spec/associations/device_auth/channels_spec.rb +10 -0
  62. data/spec/associations/device_auth/details_sets_spec.rb +19 -0
  63. data/spec/associations/device_auth/playlist_items_spec.rb +42 -0
  64. data/spec/associations/device_auth/playlists_spec.rb +42 -0
  65. data/spec/associations/device_auth/ratings_spec.rb +30 -0
  66. data/spec/associations/device_auth/snippets_spec.rb +30 -0
  67. data/spec/associations/device_auth/subscriptions_spec.rb +27 -0
  68. data/spec/associations/device_auth/user_infos_spec.rb +10 -0
  69. data/spec/associations/device_auth/videos_spec.rb +22 -0
  70. data/spec/associations/no_auth/annotations_spec.rb +15 -0
  71. data/spec/associations/server_auth/channels_spec.rb +2 -0
  72. data/spec/associations/server_auth/details_sets_spec.rb +18 -0
  73. data/spec/associations/server_auth/playlist_items_spec.rb +17 -0
  74. data/spec/associations/server_auth/playlists_spec.rb +17 -0
  75. data/spec/associations/server_auth/ratings_spec.rb +2 -0
  76. data/spec/associations/server_auth/snippets_spec.rb +28 -0
  77. data/spec/associations/server_auth/subscriptions_spec.rb +2 -0
  78. data/spec/associations/server_auth/user_infos_spec.rb +2 -0
  79. data/spec/associations/server_auth/videos_spec.rb +20 -0
  80. data/spec/collections/annotations_spec.rb +6 -0
  81. data/spec/collections/channels_spec.rb +6 -0
  82. data/spec/collections/details_sets_spec.rb +6 -0
  83. data/spec/collections/playlist_items_spec.rb +23 -0
  84. data/spec/collections/playlists_spec.rb +26 -0
  85. data/spec/collections/ratings_spec.rb +6 -0
  86. data/spec/collections/snippets_spec.rb +6 -0
  87. data/spec/collections/subscriptions_spec.rb +30 -0
  88. data/spec/collections/user_infos_spec.rb +6 -0
  89. data/spec/collections/videos_spec.rb +6 -0
  90. data/spec/models/annotation_spec.rb +131 -0
  91. data/spec/models/channel_spec.rb +13 -0
  92. data/spec/models/description_spec.rb +94 -0
  93. data/spec/models/details_set_spec.rb +23 -0
  94. data/spec/models/playlist_item_spec.rb +32 -0
  95. data/spec/models/playlist_spec.rb +52 -0
  96. data/spec/models/rating_spec.rb +13 -0
  97. data/spec/models/snippet_spec.rb +66 -0
  98. data/spec/models/status_spec.rb +42 -0
  99. data/spec/models/subscription_spec.rb +37 -0
  100. data/spec/models/user_info_spec.rb +69 -0
  101. data/spec/models/video_spec.rb +13 -0
  102. data/spec/spec_helper.rb +15 -0
  103. data/spec/support/device_app.rb +16 -0
  104. data/spec/support/server_app.rb +10 -0
  105. data/yt.gemspec +30 -0
  106. metadata +209 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36146da0ad2ff44d4eb98e9d50cbcdfd0a607b88
4
- data.tar.gz: b8f821d810f1d979e33d7f2945862b2f7b88b0b0
3
+ metadata.gz: 267ed97d1f7857b28aa9577a8e5b06f30beb6d49
4
+ data.tar.gz: 7ebaddc635450434a4087c1bff77c25b5721c1ae
5
5
  SHA512:
6
- metadata.gz: b321488f8ad80489cf8b32af60e1e2e8fa10da37cb2b62a9e8a7bdbdd1ca3cbe9922f0850e57f07cb1ea67bb7fbd21075cb2befeccaf25ec87771b3a95338b1e
7
- data.tar.gz: d50ba00dca5c3007b2d7b691105325c161db30089bd9020338cb0a6b5f1ca9c44c5fd036037ba35b0bfc9ada7f30f4efe91daf02ec9e7f4fbd95f09f98425908
6
+ metadata.gz: d5e4615ed9ec50327686a37c2a4f1c8b4cd1646666e841d0d2e1ebaf0aece040fe2da04793642a010d0293996e2c960cd284711e214a76f1d912b2ac8fdd22a4
7
+ data.tar.gz: d7694945db65f5cf0a5287473c1a18184cdec831fca1714bba6b286fef841acf766134108fb7cc724ad4170d696d82eaf3fa184d0a802aec50c25cf79774163f
@@ -0,0 +1,24 @@
1
+ # See http://help.github.com/ignore-files/ for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore the default SQLite database.
11
+ /db/*.sqlite3
12
+ /db/*.sqlite3-journal
13
+
14
+ coverage/
15
+
16
+ # Ignore all logfiles and tempfiles.
17
+ /log/*.log
18
+ /tmp
19
+ **/tmp
20
+ *.gem
21
+ *.sqlite3
22
+
23
+ doc/
24
+ .yardoc/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ notifications:
5
+ email: false
6
+ env:
7
+ global:
8
+ secure: FC19i/qIjqV7dzd8bZS+yc5HC3XbssU/lBn7+pNsfhsXZp2FpZ4u3v2HPCRZPZ7IsCpsLtUraq6rub290dXecEr1gzSwmaMdfvJz8f2lr1YR58BF9xnTwBUinZOcv9auhWHwCzYRQMHyILUa2NvmVqq0QzYbWVa9X1gwejqyoaQ=
9
+ matrix:
10
+ secure: EX0FinqK+va3hTUWNVk7HeFIZqwC0OFlmvW7GX+vJ//vs1Bvsqxqbo1bdqwieMVYxcRwt9cOZU8QapPPc4+v7Awo7ASCgNUo4Y7yrIkjfQdY6b2UyPo6yJw7+Mcyj9gej5hD0mBm+E/KCvvirVfDXfWedPy3Z1FovK1sVW9RqPs=
@@ -0,0 +1 @@
1
+ --no-private
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Add 'binding.pry'_remote to debug your code, then use 'next', 'continue', ...
4
+ gem 'pry', require: 'pry'
5
+ gem 'pry-nav'
6
+ gem 'pry-remote'
7
+
8
+ # Specify your gem's dependencies in yt.gemspec
9
+ gemspec
@@ -0,0 +1,78 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ yt (0.4.0)
5
+ activesupport
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activesupport (4.1.0)
11
+ i18n (~> 0.6, >= 0.6.9)
12
+ json (~> 1.7, >= 1.7.7)
13
+ minitest (~> 5.1)
14
+ thread_safe (~> 0.1)
15
+ tzinfo (~> 1.1)
16
+ coderay (1.1.0)
17
+ coveralls (0.7.0)
18
+ multi_json (~> 1.3)
19
+ rest-client
20
+ simplecov (>= 0.7)
21
+ term-ansicolor
22
+ thor
23
+ diff-lcs (1.2.5)
24
+ docile (1.1.3)
25
+ i18n (0.6.9)
26
+ json (1.8.1)
27
+ method_source (0.8.2)
28
+ mime-types (2.2)
29
+ minitest (5.3.3)
30
+ multi_json (1.9.2)
31
+ pry (0.9.12.6)
32
+ coderay (~> 1.0)
33
+ method_source (~> 0.8)
34
+ slop (~> 3.4)
35
+ pry-nav (0.2.3)
36
+ pry (~> 0.9.10)
37
+ pry-remote (0.1.8)
38
+ pry (~> 0.9)
39
+ slop (~> 3.0)
40
+ rake (10.3.1)
41
+ rest-client (1.6.7)
42
+ mime-types (>= 1.16)
43
+ rspec (2.14.1)
44
+ rspec-core (~> 2.14.0)
45
+ rspec-expectations (~> 2.14.0)
46
+ rspec-mocks (~> 2.14.0)
47
+ rspec-core (2.14.8)
48
+ rspec-expectations (2.14.5)
49
+ diff-lcs (>= 1.1.3, < 2.0)
50
+ rspec-mocks (2.14.6)
51
+ simplecov (0.8.2)
52
+ docile (~> 1.1.0)
53
+ multi_json
54
+ simplecov-html (~> 0.8.0)
55
+ simplecov-html (0.8.0)
56
+ slop (3.5.0)
57
+ term-ansicolor (1.3.0)
58
+ tins (~> 1.0)
59
+ thor (0.19.1)
60
+ thread_safe (0.3.3)
61
+ tins (1.1.0)
62
+ tzinfo (1.1.0)
63
+ thread_safe (~> 0.1)
64
+ yard (0.8.7.4)
65
+
66
+ PLATFORMS
67
+ ruby
68
+
69
+ DEPENDENCIES
70
+ bundler (~> 1.3)
71
+ coveralls
72
+ pry
73
+ pry-nav
74
+ pry-remote
75
+ rake
76
+ rspec
77
+ yard
78
+ yt!
@@ -0,0 +1,37 @@
1
+ v0.4.0 - 2014/05/09
2
+ --------------------
3
+
4
+ * Complete rewrite, using ActiveSupport and separating models and collections
5
+ * New methods to handle annotations, details sets
6
+
7
+ v0.3.0 - 2014/04/16
8
+ --------------------
9
+
10
+ * New and improved methods to handle subscriptions, playlists, playlist items
11
+ * `find_or_create_playlist_by` does not yield a block anymore
12
+ * `account.subscribe_to!` raises error in case of duplicate subscription, but `account.subscribe_to` does not
13
+
14
+ v0.2.1 - 2014/04/10
15
+ --------------------
16
+
17
+ * `account.subscribe_to!` does not raise error in case of duplicate subscription
18
+ * Accountable objects can be initialized with the OAuth access token if there's no need to get a fresh one with a refresh token
19
+
20
+ v0.2.0 - 2014/04/09
21
+ --------------------
22
+
23
+ * Replaced `account.perform!` with `account.like!`, `account.subscribe_to!`
24
+ * Added `account.add_to!` to add a video to an account’s playlist
25
+ * Added `account.find_or_create_playlist_by` to find or create an account’s playlist
26
+
27
+ v0.1.1 - 2014/04/09
28
+ --------------------
29
+
30
+ * Added support for Ruby 2.0.0
31
+
32
+ v0.1.0 - 2014/04/08
33
+ --------------------
34
+
35
+ * Support for authenticated resources: Youtube accounts and Google accounts
36
+ * Support for public Youtube resources: channels and videos
37
+ * Available actions for authenticated Youtube accounts: like a video, subscribe to a channel
@@ -0,0 +1,20 @@
1
+ Copyright 2014 Fullscreen, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,325 @@
1
+ Yt
2
+ ==
3
+
4
+ Yt helps you write apps that need to interact with the YouTube API V3.
5
+
6
+ [![Gem Version](https://badge.fury.io/rb/yt.svg)](http://badge.fury.io/rb/yt)
7
+ [![Dependency Status](https://gemnasium.com/fullscreeninc/yt.png)](https://gemnasium.com/fullscreeninc/yt)
8
+ [![Build Status](https://travis-ci.org/fullscreeninc/yt.png?branch=master)](https://travis-ci.org/fullscreeninc/yt)
9
+ [![Coverage Status](https://coveralls.io/repos/fullscreeninc/yt/badge.png)](https://coveralls.io/r/fullscreeninc/yt)
10
+ [![Code Climate](https://codeclimate.com/github/fullscreeninc/yt.png)](https://codeclimate.com/github/fullscreeninc/yt)
11
+
12
+ After [registering your app], you can run commands like:
13
+
14
+ ```ruby
15
+ channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow'
16
+ channel.title #=> "Fullscreen"
17
+ channel.description #=> "The first media company for the connected generation."
18
+ channel.videos.count #=> 12
19
+ ```
20
+
21
+ ```ruby
22
+ video = Yt::Video.new id: 'MESycYJytkU'
23
+ video.title #=> "Fullscreen Creator Platform"
24
+ video.duration #=> 86
25
+ video.annotations.count #=> 1
26
+ ```
27
+
28
+ The **full documentation** is available at [rubydoc.info](http://rubydoc.info/github/fullscreeninc/yt/master/frames).
29
+
30
+ Available resources
31
+ ===================
32
+
33
+ Yt::Account
34
+ -----------
35
+
36
+ Use [Yt::Account](link to doc) to:
37
+
38
+ * authenticate as a YouTube account
39
+ * read attributes of the account
40
+ * access the YouTube channel of the account
41
+
42
+ ```ruby
43
+ account = Yt::Account.new
44
+
45
+ # An OAuth2 prompt will appear before the following commands
46
+ account.email #=> .. your e-mail address..
47
+ account.channel #=> #<Yt::Channel @id=...>
48
+ ```
49
+
50
+ *All the above methods require authentication (see below).*
51
+
52
+ Yt::Channel
53
+ -----------
54
+
55
+ Use [Yt::Channel](link to doc) to:
56
+
57
+ * read attributes of a channel
58
+ * access the videos of a channel
59
+ * access the playlists of a channel
60
+ * subscribe to and unsubscribe from a channel
61
+ * create and delete playlists from a channel
62
+
63
+ ```ruby
64
+ channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow'
65
+ channel.title #=> "Fullscreen"
66
+ channel.description.has_link_to_playlist? #=> false
67
+
68
+ channel.videos.count #=> 12
69
+ channel.videos.first #=> #<Yt::Video @id=...>
70
+
71
+ channel.playlists.count #=> 2
72
+ channel.playlists.first #=> #<Yt::Playlist @id=...>
73
+
74
+ # An OAuth2 prompt will appear before the following commands
75
+ channel.subscribed? #=> false
76
+ channel.subscribe #=> true
77
+
78
+ channel.create_playlist title: 'New playlist' #=> true
79
+ channel.delete_playlists title: 'New playlist' #=> [true]
80
+
81
+ ```
82
+
83
+ *Subscribing to and unsubscribing from a channel requires authentication (see below).*
84
+
85
+ Yt::Video
86
+ -----------
87
+
88
+ Use [Yt::Video](link to doc) to:
89
+
90
+ * read attributes of a video
91
+ * access the annotations of a video
92
+ * like and dislike a video
93
+
94
+ ```ruby
95
+ video = Yt::Video.new id: 'MESycYJytkU'
96
+ video.title #=> "Fullscreen Creator Platform"
97
+ video.duration #=> 63
98
+ video.description.has_link_to_subscribe? #=> false
99
+
100
+ video.annotations.count #=> 1
101
+ video.annotations.first #=> #<Yt::Annotation @id=...>
102
+
103
+ # An OAuth2 prompt will appear before the following commands
104
+ video.liked? #=> false
105
+ video.like #=> true
106
+ ```
107
+
108
+ *Liking and disliking a video requires authentication (see below).*
109
+
110
+ Yt::Playlist
111
+ ------------
112
+
113
+ Use [Yt::Playlist](link to doc) to:
114
+
115
+ * read attributes of a playlist
116
+ * access the items of a playlist
117
+ * add one or multiple videos to a playlist
118
+ * delete items from a playlist
119
+
120
+ ```ruby
121
+ playlist = Yt::Playlist.new id: 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc'
122
+ playlist.title #=> "Fullscreen Features"
123
+ playlist.public? #=> true
124
+
125
+ playlist.playlist_items.count #=> 1
126
+ playlist.playlist_items.first #=> #<Yt::PlaylistItem @id=...>
127
+ playlist.playlist_items.first.position #=> 0
128
+ playlist.playlist_items.first.video.title #=> "Fullscreen Creator Platform"
129
+ playlist.delete_playlist_items title: 'Fullscreen Creator Platform' #=> [true]
130
+
131
+ # An OAuth2 prompt will appear before the following commands
132
+ playlist.add_video 'MESycYJytkU'
133
+ playlist.add_videos ['MESycYJytkU', 'MESycYJytkU']
134
+ ```
135
+
136
+ *Adding videos requires authentication (see below).*
137
+
138
+
139
+ Yt::Annotation
140
+ --------------
141
+
142
+ Use [Yt::Annotation](link to doc) to:
143
+
144
+ * read attributes of an annotation
145
+
146
+ ```ruby
147
+ video = Yt::Video.new id: 'MESycYJytkU'
148
+ annotation = video.annotations.first
149
+
150
+ annotation.below? 70 #=> false
151
+ annotation.has_link_to_subscribe? #=> false
152
+ annotation.has_link_to_playlist? #=> true
153
+ ```
154
+
155
+ *Annotations do not require authentication.*
156
+
157
+ Registering your app
158
+ ====================
159
+
160
+ In order to use Yt you must register your app in the [Google Developers Console](https://console.developers.google.com).
161
+ Depending on the nature of your app, you should pick one of the following strategies.
162
+
163
+ Apps that do not require user interactions
164
+ ------------------------------------------
165
+
166
+ If you are building a read-only app that fetches public data from YouTube, then
167
+ generate a **Public API access** key in the Google Console, then add the following
168
+ snippet of code to the initializer of your app:
169
+
170
+ ```ruby
171
+ Yt.configure do |config|
172
+ config.scenario = :server_app
173
+ config.api_key = '123456789012345678901234567890'
174
+ end
175
+ ```
176
+
177
+ replacing the value above with your own key for server application.
178
+
179
+ Remember: this kind of app is not allowed to perform any destructive operation,
180
+ so you won’t be able to like a video, subscribe to a channel or delete a
181
+ playlist from a specific account. You will only be able to retrieve read-only
182
+ data.
183
+
184
+ Web apps that do require user interactions
185
+ ------------------------------------------
186
+
187
+ If you are building a web app that manages YouTube accounts, you need the
188
+ owner of each account to authorize your app. There are three scenarios:
189
+
190
+ Scenario 1. If you already have the account’s **access token**, then you are ready to go.
191
+ Just pass that access token to the account initializer, such as:
192
+
193
+ ```ruby
194
+ account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
195
+ account.email #=> (retrieves the account’s e-mail address)
196
+ account.playlists.first.add_video 'MESycYJytkU' #=> (adds a video to an account’s playlist)
197
+ ```
198
+
199
+ Scenario 2. If you don’t have the account’s access token, but you have the
200
+ **refresh token**, then it’s almost as easy.
201
+ Open the [Google Developers Console](https://console.developers.google.com),
202
+ find the client ID and client secret of the **web application** that you used to obtain the
203
+ refresh token, then add the following snippet of code to the initializer of your app:
204
+
205
+ ```ruby
206
+ Yt.configure do |config|
207
+ config.client_id = '1234567890.apps.googleusercontent.com
208
+ config.client_secret = '1234567890'
209
+ end
210
+ ```
211
+
212
+ replacing the values above with the client ID and secret for web application.
213
+ Then you can manage a YouTube account by passing the refresh token to the
214
+ account initializer, such as:
215
+
216
+ ```ruby
217
+ account = Yt::Account.new refresh_token: '1/1234567890'
218
+ account.email #=> (retrieves the account’s e-mail address)
219
+ account.playlists.first.add_video 'MESycYJytkU' #=> (adds a video to an account’s playlist)
220
+ ```
221
+
222
+ Scenario 3. If you don’t have the account’s refresh token, then [..TODO..]
223
+
224
+
225
+ Device apps that do require user interactions
226
+ ---------------------------------------------
227
+
228
+ These apps are equivalent to web apps. The only difference is the interface
229
+ that Google uses to ask people to authenticate.
230
+
231
+
232
+ Scenario 1. If you already have the account’s **access token**, then you are ready to go.
233
+ Just pass that access token to the account initializer, such as:
234
+
235
+ ```ruby
236
+ account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
237
+ account.email #=> (retrieves the account’s e-mail address)
238
+ account.playlists.first.add_video 'MESycYJytkU' #=> (adds a video to an account’s playlist)
239
+ ```
240
+
241
+ Scenario 2. If you don’t have the account’s access token, but you have the
242
+ **refresh token**, then it’s almost as easy.
243
+ Open the [Google Developers Console](https://console.developers.google.com),
244
+ find the client ID and client secret of the **native application** that you used to obtain the
245
+ refresh token, then add the following snippet of code to the initializer of your app:
246
+
247
+ ```ruby
248
+ Yt.configure do |config|
249
+ config.scenario = :device_app
250
+ config.client_id = '1234567890.apps.googleusercontent.com
251
+ config.client_secret = '1234567890'
252
+ end
253
+ ```
254
+
255
+ replacing the values above with the client ID and secret for web application.
256
+ Then you can manage a YouTube account by passing the refresh token to the
257
+ account initializer, such as:
258
+
259
+ ```ruby
260
+ account = Yt::Account.new refresh_token: '1/1234567890'
261
+ account.email #=> (retrieves the account’s e-mail address)
262
+ account.playlists.first.add_video 'MESycYJytkU' #=> (adds a video to an account’s playlist)
263
+ ```
264
+
265
+ Scenario 3. If you don’t have the account’s refresh token, then [..TODO..]
266
+
267
+
268
+
269
+
270
+ How to install
271
+ ==============
272
+
273
+ To install on your system, run
274
+
275
+ gem install yt
276
+
277
+ To use inside a bundled Ruby project, add this line to the Gemfile:
278
+
279
+ gem 'yt', '~> 0.4.0'
280
+
281
+ Since the gem follows [Semantic Versioning](http://semver.org),
282
+ indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
283
+ guarantees that your project won’t occur in any error when you `bundle update`
284
+ and a new version of Yt is released.
285
+
286
+ Why you should use Yt…
287
+ -----------------------
288
+
289
+ … and not [youtube_it](https://github.com/kylejginavan/youtube_it)?
290
+ Because youtube_it does not support Google API V3 and the previous version
291
+ has already been deprecated by Google and will soon be dropped.
292
+
293
+ … and not [Google Api Client](https://github.com/google/google-api-ruby-client)?
294
+ Because Google Api Client is poorly coded, poorly documented and adds many
295
+ dependencies, bloating the size of your project.
296
+
297
+ … and not your own code? Because Yt is fully tested, well documented,
298
+ has few dependencies and helps you forget about the burden of dealing with
299
+ Google API!
300
+
301
+ How to test
302
+ ===========
303
+
304
+ [ TO DO ]
305
+
306
+
307
+ How to contribute
308
+ =================
309
+
310
+ Before you submit a pull request, make sure all the tests are passing and the
311
+ code is fully test-covered.
312
+
313
+ To release an updated version of the gem to Rubygems, run:
314
+
315
+ rake release
316
+
317
+ Remember to *bump the version* before running the command, and to document
318
+ your changes in HISTORY.md and README.md if required.
319
+
320
+ The yt gem follows [Semantic Versioning](http://semver.org).
321
+ Any new release that is fully backward-compatible should bump the *patch* version (0.0.x).
322
+ Any new version that breaks compatibility should bump the *minor* version (0.x.0)
323
+
324
+ Don’t hesitate to send code comments, issues or pull requests through GitHub!
325
+ All feedback is appreciated. A [googol](http://en.wikipedia.org/wiki/Googol) of thanks! :)