yt-core 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2faf158ad48511fe585519deb4cd053f41bd2ffe
4
- data.tar.gz: 3bb7780ffa69dedefc4094be10a43af205c868b8
3
+ metadata.gz: 368c82a9dfd70ec0b355a4d1789e30ea9092c178
4
+ data.tar.gz: 274884baeadb9e15cc58acf719bee6712a24bec4
5
5
  SHA512:
6
- metadata.gz: f3445d6fa3b8836a51dfb02a25399780d58e705101c609a07be0d4fa94b9be0acbef06b320af917cc69d42dc8224275217da5700643f3b6b0c66d9f2e0077e4c
7
- data.tar.gz: 99bb22df52a1a9895f40b6e52b8f4ae956b0bf556887acbbb42e4324cdf7487351db7ecb177e16b40564d7293080da1e5d27b6585160e6bafa2cfcf3f45d7907
6
+ metadata.gz: fc56f8e8ecac5151fedf2082584cf02e6eaee572adbe461801a5a2372c4ea84dd3250300bbf392dce0101eb654f18fb522771325e0bd10e3df7af4d5fef8e791
7
+ data.tar.gz: 5f56a363ea52f728a7a1ca0f5f0a568f793961f918f712fe23e049c9075981858a49232ad8ed0563ac4a00e0beb544844597511d029bd9aa05518cfa63bb1a41
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --format documentation
2
2
  --color
3
- --fail-fast
data/.travis.yml CHANGED
@@ -1,6 +1,4 @@
1
1
  language: ruby
2
- notifications:
3
- email: false
4
2
  rvm:
5
3
  - 2.2.2
6
4
  script:
data/CHANGELOG.md CHANGED
@@ -6,6 +6,11 @@ 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.1.3 - 2017-05-23
10
+
11
+ * [FEATURE] Add Comment and CommentThread
12
+ * [FEATURE] Add Channel#featured_channels_title and Channel#featured_channels_urls
13
+
9
14
  ## 0.1.2 - 2017-04-06
10
15
 
11
16
  * [BUGFIX] Fix cases like `channel.select(:snippet).view_count` where attribute does not belong to any selected part.
data/README.md CHANGED
@@ -10,7 +10,7 @@ The **source code** is available on [GitHub](https://github.com/fullscreen/yt-co
10
10
  [![Dependency Status](http://img.shields.io/gemnasium/Fullscreen/yt-core.svg)](https://gemnasium.com/Fullscreen/yt-core)
11
11
  [![Code Climate](http://img.shields.io/codeclimate/github/Fullscreen/yt-core.svg)](https://codeclimate.com/github/Fullscreen/yt-core)
12
12
  [![Online docs](http://img.shields.io/badge/docs-✓-green.svg)](http://www.rubydoc.info/gems/yt-core/frames)
13
- [![Gem Version](http://img.shields.io/gem/v/yt.svg)](http://rubygems.org/gems/yt-core)
13
+ [![Gem Version](http://img.shields.io/gem/v/yt-core.svg)](http://rubygems.org/gems/yt-core)
14
14
 
15
15
  After [registering your app](https://fullscreen.github.io/yt-core/), you can run commands like:
16
16
 
@@ -33,6 +33,11 @@
33
33
  {% else %}
34
34
  <li><a href="{{ site.baseurl }}/playlist_items.html">Playlist Items</a></li>
35
35
  {% endif %}
36
+ {% if page.url == '/comments.html' %}
37
+ <li><a href="{{ site.baseurl }}/comments.html" class="active">Comments</a></li>
38
+ {% else %}
39
+ <li><a href="{{ site.baseurl }}/comments.html">Comments</a></li>
40
+ {% endif %}
36
41
  {% if page.url == '/errors.html' %}
37
42
  <li><a href="{{ site.baseurl }}/errors.html" class="active">Errors</a></li>
38
43
  {% else %}
data/docs/channels.html CHANGED
@@ -66,7 +66,9 @@ channel.title # => "Yt Test"
66
66
  <dd><a class="anchor" id="branding_settings"></a><div class="highlight"><pre>
67
67
  {% include doc.html instance="Channel#banner_image_url" %}{% include example.html object='channel' method='banner_image_url' result='"https://yt3.ggpht.com/9dh4rj-k-no"' %}
68
68
  {% include doc.html instance="Channel#keywords" %}{% include example.html object='channel' method='keywords' result='["Some", "tag"]' %}
69
- {% include doc.html instance="Channel#unsubscribed_trailer" %}{% include example.html object='channel' method='unsubscribed_trailer' result='"gknzFj_0vvY"' %}</pre>
69
+ {% include doc.html instance="Channel#unsubscribed_trailer" %}{% include example.html object='channel' method='unsubscribed_trailer' result='"gknzFj_0vvY"' %}
70
+ {% include doc.html instance="Channel#featured_channels_title" %}{% include example.html object='channel' method='featured_channels_title' result='"Featured channels"' %}
71
+ {% include doc.html instance="Channel#featured_channels_urls" %}{% include example.html object='channel' method='featured_channels_urls' result='["UCxO1tY8h1AhOz0T4ENwmpow"]' %}</pre>
70
72
  </div></dd>
71
73
  </dl>
72
74
  <p>
@@ -0,0 +1,57 @@
1
+ ---
2
+ title: "Yt::CommentThread and Yt::Comment"
3
+ h2: "Comments"
4
+ ---
5
+
6
+ <p>
7
+ <code>Yt::CommentThread</code> represents a <a href="https://developers.google.com/youtube/v3/docs/commentThread">YouTube comment thread</a>.
8
+ Initialize using its YouTube ID:
9
+ </p>
10
+
11
+ <dl>
12
+ <dd><a class="anchor" id="new"></a><div class="highlight"><pre>
13
+ {% include doc.html instance="CommentThread#initialize" %}{% include example.html object='thread = <span class="no">Yt</span><span class="o">::</span><span class="no">CommentThread</span>' method='new' params=' <span class="ss">id:</span> <span class="s1">"z121srzx5oqiyrbce23nevcwrpqfenix004"</span>' %}
14
+ {% include example.html result='#&lt;Yt::CommentThread @id=z121srzx5oqiyrbce23nevcwrpqfenix004&gt;' %}
15
+ {% include doc.html instance="CommentThread#canonical_url" %}{% include example.html object='thread' method='top_level_comment.text_display' %}
16
+ {% include example.html result='"A public comment"' %}</pre>
17
+ </div></dd>
18
+ </dl>
19
+
20
+ <hr />
21
+ <h4>Authentication</h4>
22
+
23
+ <p>
24
+ Most methods of <code>Yt::CommentThread</code> <strong>retrieve public data</strong> from YouTube (e.g.: the top level comment).<br />
25
+ To use these methods (marked with <span class="label label-success">&nbsp;</span> below), you only need to <a href="{{ site.baseurl }}/#api_key">generate an API key</a> and configure:
26
+ </p>
27
+
28
+ {% highlight ruby %}
29
+ Yt.configuration.api_key = "<your api key>" ## use your API key
30
+
31
+ thread = Yt::CommentThread.new id: 'z121srzx5oqiyrbce23nevcwrpqfenix004' ## use any ID
32
+ thread.top_level_comment.text_display # => "A public comment"
33
+ {% endhighlight %}
34
+
35
+ <hr />
36
+ <h4>List of <code>Yt::CommentThread</code> data methods</h4>
37
+ <dl>
38
+ {% include dt.html title="CommentThread’s snippet" label="success" auth="any authentication works" %}
39
+ <dd><a class="anchor" id="snippet"></a><div class="highlight"><pre>
40
+ {% include doc.html instance="CommentThread#id" %}{% include example.html object='thread' method='id' result='"z121srzx5oqiyrbce23nevcwrpqfenix004"' %}
41
+ {% include doc.html instance="CommentThread#channel_id" %}{% include example.html object='thread' method='channel_id' result='nil' %}
42
+ {% include doc.html instance="CommentThread#video_id" %}{% include example.html object='thread' method='video_id' result='"gknzFj_0vvY"' %}
43
+ {% include doc.html instance="CommentThread#top_level_comment" %}{% include example.html object='thread' method='top_level_comment' result='&lt;Yt::Comment @id=z121srzx5...&gt;' %}</pre>
44
+ </div></dd>
45
+
46
+ <hr />
47
+ <h4>List of <code>Yt::Comment</code> data methods</h4>
48
+ <dl>
49
+ {% include dt.html title="Comment’s snippet" label="success" auth="any authentication works" %}
50
+ <dd><a class="anchor" id="snippet"></a><div class="highlight"><pre>
51
+ {% include doc.html instance="Comment#id" %}{% include example.html object='comment' method='id' result='"z121srzx5oqiyrbce23nevcwrpqfenix004"' %}
52
+ {% include doc.html instance="Comment#text_display" %}{% include example.html object='comment' method='text_display' result='"A public comment"' %}
53
+ {% include doc.html instance="Comment#author_display_name" %}{% include example.html object='comment' method='author_display_name' result='"Yt Test"' %}
54
+ {% include doc.html instance="Comment#author_profile_image_url" %}{% include example.html object='comment' method='author_profile_image_url' result='"https://yt3.ggpht.com/-lC#w"' %}
55
+ {% include doc.html instance="Comment#author_channel_url" %}{% include example.html object='comment' method='author_channel_url' result='"http://www.youtube.com/channel/UCwCnUcLc..."' %}
56
+ {% include doc.html instance="Comment#author_channel_id" %}{% include example.html object='comment' method='author_channel_id' result='"UCwCnUcLcb9-eSrHa_RQGkQQ"' %}</pre>
57
+ </div></dd>
data/docs/videos.html CHANGED
@@ -102,3 +102,39 @@ video.title # => "First public video"
102
102
  {% include example.html result='#&lt;Yt::Channel @id=UCwCnUcLcb9-eSrHa_RQGkQQ&gt;' %}</pre>
103
103
  </div></dd>
104
104
  </dl>
105
+
106
+
107
+ <dl>
108
+ {% include dt.html title="Video’s comment threads" label="success" auth="any authentication works" %}
109
+ <dd><a class="anchor" id="threads"></a><div class="highlight"><pre>
110
+ {% include doc.html instance="Video#threads" %}{% include example.html object='video' method='threads' %}
111
+ {% include example.html result='#&lt;Yt::Relation [#&lt;Yt::Thread @id=z119d45&gt;, #&lt;Yt::Thread @id=z120d734&gt;, ...]&gt;' %}</pre>
112
+ </div></dd>
113
+ </dl>
114
+ <p>
115
+ Before iterating through threads, use <code>select</code> to specify which <a href="https://developers.google.com/youtube/v3/docs/commentThreads/list#part">parts</a> to load:
116
+ </p>
117
+ <dl>
118
+ <dd><a class="anchor" id="select"></a><div class="highlight"><pre>
119
+ {% include doc.html instance="Relation#select" %}{% include example.html object='threads = video.threads' method='select' params=' <span class="ss">:id</span>, <span class="ss">:snippet</span>' %}
120
+ {% include example.html object='threads' method='map <span class="ss">&amp;:id</span>' result='["z119d45", ...]' %}
121
+ {% include example.html object='threads' method='map <span class="ss">&amp;:top_level_comment</span>' result='[#&lt;Yt::Comment @id=z119d45&gt;, ...]' %}</pre>
122
+ </div></dd>
123
+ </dl>
124
+ <p>
125
+ You can also use <code>limit</code> to only fetch a certain number of threads:
126
+ </p>
127
+ <dl>
128
+ <dd><a class="anchor" id="limit"></a><div class="highlight"><pre>
129
+ {% include doc.html instance="Relation#limit" %}{% include example.html object='threads = video.threads' method='limit' params=' <span class="mi">2</span>' %}
130
+ {% include example.html object='threads' method='map <span class="ss">&amp;:id</span>' result='["z119d45", "z120d734"]' %}</pre>
131
+ </div></dd>
132
+ </dl>
133
+ <p>
134
+ You can also use <code>size</code> to quickly obtain the estimated number of threads:
135
+ </p>
136
+ <dl>
137
+ <dd><a class="anchor" id="size"></a><div class="highlight"><pre>
138
+ {% include doc.html instance="Relation#size" %}{% include example.html object='video.threads' method='size' result='63' %}</pre>
139
+ </div></dd>
140
+ </dl>
data/lib/yt/channel.rb CHANGED
@@ -81,6 +81,16 @@ module Yt
81
81
  # in the channel page’s browse view for unsubscribed viewers.
82
82
  has_attribute :unsubscribed_trailer, in: %i(branding_settings channel)
83
83
 
84
+ # @!attribute [r] featured_channels_title
85
+ # @return [<String, nil>] the title that displays above the featured
86
+ # channels module. The title has a maximum length of 30 characters.
87
+ has_attribute :featured_channels_title, in: %i(branding_settings channel)
88
+
89
+ # @!attribute [r] featured_channels_title
90
+ # @return [Array<String>] the IDs of the channels linked in the featured
91
+ # channels module.
92
+ has_attribute :featured_channels_urls, in: %i(branding_settings channel), default: []
93
+
84
94
  # @return [String] the canonical form of the channel’s URL.
85
95
  def canonical_url
86
96
  "https://www.youtube.com/channel/#{id}"
data/lib/yt/comment.rb ADDED
@@ -0,0 +1,27 @@
1
+ module Yt
2
+ # Provides methods to interact with YouTube comments.
3
+ # @see https://developers.google.com/youtube/v3/docs/comments
4
+ class Comment < Resource
5
+ # @!attribute [r] author_channel_id
6
+ # @return [String] the comment’s text.
7
+ has_attribute :text_display, in: :snippet
8
+
9
+ # @!attribute [r] author_display_name
10
+ # @return [String] the display name of the user who posted the comment.
11
+ has_attribute :author_display_name, in: :snippet
12
+
13
+ # @!attribute [r] author_profile_image_url
14
+ # @return [String] the URL of the avatar of the user who posted the comment.
15
+ has_attribute :author_profile_image_url, in: :snippet
16
+
17
+ # @!attribute [r] author_channel_url
18
+ # @return [String] the URL of the comment author’s YouTube channel.
19
+ has_attribute :author_channel_url, in: :snippet
20
+
21
+ # @!attribute [r] author_channel_id
22
+ # @return [String] the ID of the comment author’s YouTube channel.
23
+ has_attribute :author_channel_id, in: :snippet do |author_channel_id|
24
+ author_channel_id['value']
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module Yt
2
+ # Provides methods to interact with YouTube comment threads.
3
+ # @see https://developers.google.com/youtube/v3/docs/commentThreads
4
+ class CommentThread < Resource
5
+ # @!attribute [r] channel_id
6
+ # @return [String] the ID of the channel that the comments refer to.
7
+ # @return [nil] if the comment does not refer to a channel.
8
+ has_attribute :channel_id, in: :snippet
9
+
10
+ # @!attribute [r] video_id
11
+ # @return [String] the ID of the video that the comments refer to.
12
+ # @return [nil] if the comment refers to the channel itself.
13
+ has_attribute :video_id, in: :snippet
14
+
15
+ # @!attribute [r] top_level_comment
16
+ # @return [Comment] the thread's top-level comment.
17
+ has_attribute :top_level_comment, in: :snippet, type: Comment
18
+ end
19
+ end
data/lib/yt/core.rb CHANGED
@@ -12,6 +12,9 @@ require 'yt/playlist'
12
12
  require 'yt/playlist_item'
13
13
  require 'yt/video'
14
14
 
15
+ require 'yt/comment'
16
+ require 'yt/comment_thread'
17
+
15
18
  # An object-oriented Ruby client for YouTube.
16
19
  # @see http://www.rubydoc.info/gems/yt/
17
20
  module Yt
@@ -3,6 +3,6 @@ module Yt
3
3
  module Core
4
4
  # @return [String] the SemVer-compatible gem version.
5
5
  # @see http://semver.org
6
- VERSION = '0.1.2'
6
+ VERSION = '0.1.3'
7
7
  end
8
8
  end
data/lib/yt/resource.rb CHANGED
@@ -80,6 +80,8 @@ module Yt
80
80
  Time.parse value
81
81
  when [Integer]
82
82
  value.to_i
83
+ when [Comment]
84
+ Comment.new id: value['id'], snippet: value['snippet']
83
85
  else
84
86
  value
85
87
  end
data/lib/yt/response.rb CHANGED
@@ -40,6 +40,10 @@ module Yt
40
40
  default_params(options).merge playlist_id: options[:playlist_id]
41
41
  end
42
42
 
43
+ def video_threads_params(options)
44
+ default_params(options).merge video_id: options[:video_id]
45
+ end
46
+
43
47
  def resource_params(options)
44
48
  default_params(options).merge id: options[:ids].join(',')
45
49
  end
data/lib/yt/video.rb CHANGED
@@ -180,6 +180,13 @@ module Yt
180
180
  @channel ||= Channel.new id: channel_id
181
181
  end
182
182
 
183
+ # @return [Yt::Relation<Yt::CommentThread>] the threads of the video.
184
+ def threads
185
+ @threads ||= Relation.new(CommentThread, video_id: id) do |options|
186
+ fetch '/youtube/v3/commentThreads', video_threads_params(options)
187
+ end
188
+ end
189
+
183
190
  private
184
191
 
185
192
  # @return [Integer] the duration of the resource as reported by YouTube.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yt-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-06 00:00:00.000000000 Z
11
+ date: 2017-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yt-support
@@ -150,6 +150,7 @@ files:
150
150
  - docs/_layouts/default.html
151
151
  - docs/apple-touch-icon-precomposed.png
152
152
  - docs/channels.html
153
+ - docs/comments.html
153
154
  - docs/css/yt.css
154
155
  - docs/errors.html
155
156
  - docs/favicon.ico
@@ -179,6 +180,8 @@ files:
179
180
  - docs/urls.html
180
181
  - docs/videos.html
181
182
  - lib/yt/channel.rb
183
+ - lib/yt/comment.rb
184
+ - lib/yt/comment_thread.rb
182
185
  - lib/yt/core.rb
183
186
  - lib/yt/core/version.rb
184
187
  - lib/yt/no_items_error.rb