yt-core 0.0.1 → 0.1.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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -22
  3. data/.rspec +3 -0
  4. data/.travis.yml +8 -0
  5. data/.yardopts +3 -0
  6. data/CHANGELOG.md +11 -0
  7. data/Gemfile +2 -1
  8. data/LICENSE.txt +17 -18
  9. data/README.md +81 -17
  10. data/Rakefile +8 -1
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/docs/_config.yml +10 -0
  14. data/docs/_includes/doc.html +1 -0
  15. data/docs/_includes/dt.html +4 -0
  16. data/docs/_includes/example.html +1 -0
  17. data/docs/_includes/footer.html +3 -0
  18. data/docs/_includes/head.html +21 -0
  19. data/docs/_includes/header.html +57 -0
  20. data/docs/_layouts/default.html +58 -0
  21. data/docs/apple-touch-icon-precomposed.png +0 -0
  22. data/docs/channels.html +142 -0
  23. data/docs/css/yt.css +40 -0
  24. data/docs/errors.html +28 -0
  25. data/docs/favicon.ico +0 -0
  26. data/docs/fonts/SecondaRound-Bold.eot +0 -0
  27. data/docs/fonts/SecondaRound-Bold.svg +2160 -0
  28. data/docs/fonts/SecondaRound-Bold.ttf +0 -0
  29. data/docs/fonts/SecondaRound-Bold.woff +0 -0
  30. data/docs/fonts/SecondaRound-Bold.woff2 +0 -0
  31. data/docs/fonts/SecondaRound-Regular.eot +0 -0
  32. data/docs/fonts/SecondaRound-Regular.svg +1873 -0
  33. data/docs/fonts/SecondaRound-Regular.ttf +0 -0
  34. data/docs/fonts/SecondaRound-Regular.woff +0 -0
  35. data/docs/fonts/SecondaRound-Regular.woff2 +0 -0
  36. data/docs/images/console-01.png +0 -0
  37. data/docs/images/console-02.png +0 -0
  38. data/docs/images/console-03.png +0 -0
  39. data/docs/images/console-04.png +0 -0
  40. data/docs/images/console-05.png +0 -0
  41. data/docs/images/console-06.png +0 -0
  42. data/docs/images/console-07.png +0 -0
  43. data/docs/images/logo.png +0 -0
  44. data/docs/images/robot.png +0 -0
  45. data/docs/images/robots.png +0 -0
  46. data/docs/index.html +37 -0
  47. data/docs/playlist_items.html +65 -0
  48. data/docs/playlists.html +114 -0
  49. data/docs/urls.html +52 -0
  50. data/docs/videos.html +104 -0
  51. data/lib/yt/channel.rb +127 -0
  52. data/lib/yt/core/version.rb +8 -0
  53. data/lib/yt/core.rb +18 -0
  54. data/lib/yt/no_items_error.rb +8 -0
  55. data/lib/yt/playlist.rb +75 -0
  56. data/lib/yt/playlist_item.rb +59 -0
  57. data/lib/yt/relation.rb +100 -0
  58. data/lib/yt/resource.rb +85 -0
  59. data/lib/yt/response.rb +91 -0
  60. data/lib/yt/video.rb +216 -0
  61. data/yt-core.gemspec +27 -15
  62. metadata +155 -19
  63. data/lib/yt-core/version.rb +0 -3
  64. data/lib/yt-core.rb +0 -5
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/docs/index.html ADDED
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: "Installing Yt"
3
+ h2: "Installing Yt"
4
+ ---
5
+
6
+ <p>Add Yt to any bundled Ruby project by adding the line <code>gem 'yt', '~> {{ page.version }}'</code> to its Gemfile.</p>
7
+ <p>You can also install Yt in your system by opening the Terminal and typing <code>gem install yt</code>.</p>
8
+ <p>If you need to update version, type <code>gem update yt</code>, or run <code>bundle update</code> if inside a Ruby project.</p>
9
+
10
+ <hr />
11
+ <h4>Configuring your app</h4>
12
+
13
+ <p>
14
+ In order to use the gem, you must register your app in the Google Developers Console.
15
+ </p>
16
+
17
+ <dl>
18
+ <dt>Create a project</dt>
19
+ <dd>
20
+ Browse to the <a href="https://console.developers.google.com">Google Developers Console</a> and select “Create Project”:
21
+ <img src="{{ site.baseurl }}/images/console-01.png" width="600" height="420" style="display: block" />
22
+ From the menu select “API Manager”, then “Credentials”:
23
+ <img src="{{ site.baseurl }}/images/console-02.png" width="600" height="420" style="display: block" />
24
+ </dd>
25
+ <dt><a class="anchor" id="api_key"></a>Generate an API key</dt>
26
+ <dd>
27
+ If you are building an app that only retrieves public data from YouTube, all you need is an API key:
28
+ <img src="{{ site.baseurl }}/images/console-03.png" width="600" height="420" style="display: block" />
29
+ Once you have generated an API key, you can use it to configure your app:
30
+ <img src="{{ site.baseurl }}/images/console-04.png" width="600" height="420" style="display: block" />
31
+ {% highlight ruby %}
32
+ # run this block before using any method of the gem (replace with your key)
33
+ Yt.configure do |config|
34
+ config.api_key = 'AIzaSyAkHdn_oBEjZIEBlpMiGZP-3Y05NXtrzqY'
35
+ end{% endhighlight %}
36
+ </dd>
37
+ </dl>
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: "Yt::PlaylistItem"
3
+ h2: "Playlist items"
4
+ ---
5
+
6
+ <p>
7
+ <code>Yt::PlaylistItem</code> represents a <a href="https://developers.google.com/youtube/v3/docs/playlistItems">YouTube playlist item</a>.
8
+ Initialize using its YouTube ID:
9
+ </p>
10
+
11
+ {% highlight ruby %}
12
+ item = Yt::PlaylistItem.new id: 'UEwtTGVUdXRjOUdSS0Qze'
13
+ # => #<Yt::PlaylistItem:0x... @id=UEwtTGVUdXRjOUdSS0Qze>
14
+ {% endhighlight %}
15
+
16
+ <hr />
17
+ <h4>Authentication</h4>
18
+
19
+ <p>
20
+ Most methods of <code>Yt::PlaylistItem</code> <strong>retrieve public data</strong> from YouTube (e.g.: fetch an item’s position).<br />
21
+ 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:
22
+ </p>
23
+
24
+ {% highlight ruby %}
25
+ Yt.configuration.api_key = "<your api key>" ## use your API key
26
+ item = Yt::PlaylistItem.new id: 'UEwtTGVUdXRjOUdSS0Qze' ## use any playlist item ID
27
+ item.position # => 0
28
+ {% endhighlight %}
29
+
30
+ <hr />
31
+ <h4>List of <code>Yt::PlaylistItem</code> data methods</h4>
32
+ <dl>
33
+ {% include dt.html title="Playlist item’s snippet" label="success" auth="any authentication works" %}
34
+ <dd><a class="anchor" id="snippet"></a><div class="highlight"><pre>
35
+ {% include doc.html instance="PlaylistItem#id" %}{% include example.html object='item' method='id' result='"UEwtTGVUdXRjOUdSS0Qze"' %}
36
+ {% include doc.html instance="PlaylistItem#title" %}{% include example.html object='item' method='title' result='"First public video"' %}
37
+ {% include doc.html instance="PlaylistItem#description" %}{% include example.html object='item' method='description' result='"A YouTube video to test the yt gem."' %}
38
+ {% include doc.html instance="PlaylistItem#published_at" %}{% include example.html object='item' method='published_at' result='2016-11-18 23:40:55 UTC' %}
39
+ {% include doc.html instance="PlaylistItem#thumbnail_url" %}{% include example.html object='item' method='thumbnail_url' result='"https://i.ytimg.com/vi/gknzFj_0vvY/default.jpg"' %}
40
+ {% include doc.html instance="PlaylistItem#channel_id" %}{% include example.html object='item' method='channel_id' result='"UCwCnUcLcb9-eSrHa_RQGkQQ"' %}
41
+ {% include doc.html instance="PlaylistItem#channel_title" %}{% include example.html object='item' method='channel_title' result='"Yt Test"' %}
42
+ {% include doc.html instance="PlaylistItem#playlist_id" %}{% include example.html object='item' method='playlist_id' result='"PL-LeTutc9GRKD3yBDhnRF_yE8UTaQI5Jf"' %}
43
+ {% include doc.html instance="PlaylistItem#position" %}{% include example.html object='item' method='position' result='0' %}
44
+ {% include doc.html instance="PlaylistItem#video_id" %}{% include example.html object='item' method='video_id' result='"gknzFj_0vvY"' %}</pre>
45
+ </div></dd>
46
+
47
+ {% include dt.html title="Playlist item’s status" label="success" auth="any authentication works" %}
48
+ <dd><a class="anchor" id="status"></a><div class="highlight"><pre>
49
+ {% include doc.html instance="PlaylistItem#privacy_status" %}{% include example.html object='item' method='privacy_status' result='"public"' %}</pre>
50
+ </div></dd>
51
+ </dl>
52
+ <p>
53
+ To limit the number of HTTP requests, use <code>select</code> to specify which <a href="https://developers.google.com/youtube/v3/docs/playlistItems/list#part">parts</a> of the item’s data to load:
54
+ </p>
55
+ <dl>
56
+ <dd><a class="anchor" id="select"></a><div class="highlight"><pre>
57
+ {% include example.html object='slow = item' result='without select: 2 HTTP requests' %}
58
+ {% include example.html object='slow' method='title' result='one HTTP request to fetch the item’s snippet' %}
59
+ {% include example.html object='slow' method='privacy_status' result='=> another HTTP request to fetch the item’s status' %}
60
+
61
+ {% include doc.html instance="PlaylistItem#select" %}{% include example.html object='fast = item' method='select' params=' <span class="ss">:snippet</span><span class="p">,</span> <span class="ss">:status</span>' result='with select: 1 HTTP request' %}
62
+ {% include example.html object='fast' method='title' result='one HTTP request to fetch both the item’s snippet and status' %}
63
+ {% include example.html object='fast' method='privacy_status' result='=> no extra HTTP requests' %}</pre>
64
+ </div></dd>
65
+ </dl>
@@ -0,0 +1,114 @@
1
+ ---
2
+ title: "Yt::Playlist"
3
+ h2: "Playlists"
4
+ ---
5
+
6
+ <p>
7
+ <code>Yt::Playlist</code> represents a <a href="https://developers.google.com/youtube/v3/docs/playlists">YouTube playlist</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="Playlist#initialize" %}{% include example.html object='playlist = <span class="no">Yt</span><span class="o">::</span><span class="no">Playlist</span>' method='new' params=' <span class="ss">id:</span> <span class="s1">"PL-LeTutc9GRKD3yBDhnRF_yE8UTaQI5Jf"</span>' %}
14
+ {% include example.html result='#&lt;Yt::Playlist @id=PL-LeTutc9GRKD3yBDhnRF_yE8UTaQI5Jf&gt;' %}
15
+ {% include doc.html instance="Playlist#canonical_url" %}{% include example.html object='playlist' method='canonical_url' %}
16
+ {% include example.html result='"https://www.youtube.com/playlist?list=PL-LeTutc9GRKD3yBDhnRF_yE8UTaQI5Jf"' %}</pre>
17
+ </div></dd>
18
+ </dl>
19
+
20
+ <hr />
21
+ <h4>Authentication</h4>
22
+
23
+ <p>
24
+ Most methods of <code>Yt::Playlist</code> <strong>retrieve public data</strong> from YouTube (e.g.: fetch a playlist’s title).<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
+ playlist = Yt::Playlist.new id: 'PL-LeTutc9GRKD3yBDhnRF_yE8UTa' ## use any playlist ID
31
+ playlist.title # => "First public playlist"
32
+ {% endhighlight %}
33
+
34
+ <hr />
35
+ <h4>List of <code>Yt::Playlist</code> data methods</h4>
36
+ <dl>
37
+ {% include dt.html title="Playlist’s snippet" label="success" auth="any authentication works" %}
38
+ <dd><a class="anchor" id="snippet"></a><div class="highlight"><pre>
39
+ {% include doc.html instance="Playlist#id" %}{% include example.html object='playlist' method='id' result='"PL-LeTutc9GRKD3yBDhnRF_yE8UTaQI5Jf"' %}
40
+ {% include doc.html instance="Playlist#title" %}{% include example.html object='playlist' method='title' result='"First public playlist"' %}
41
+ {% include doc.html instance="Playlist#description" %}{% include example.html object='playlist' method='description' result='"A YouTube playlist to test the yt gem."' %}
42
+ {% include doc.html instance="Playlist#published_at" %}{% include example.html object='playlist' method='published_at' result='2016-11-18 00:40:02 UTC' %}
43
+ {% include doc.html instance="Playlist#thumbnail_url" %}{% include example.html object='playlist' method='thumbnail_url' result='"https://i.ytimg.com/vi/gknzFj_0vvY/default.jpg"' %}
44
+ {% include doc.html instance="Playlist#channel_id" %}{% include example.html object='playlist' method='channel_id' result='"UCwCnUcLcb9-eSrHa_RQGkQQ"' %}
45
+ {% include doc.html instance="Playlist#channel_title" %}{% include example.html object='playlist' method='channel_title' result='"Yt Test"' %}</pre>
46
+ </div></dd>
47
+
48
+ {% include dt.html title="Playlist’s status" label="success" auth="any authentication works" %}
49
+ <dd><a class="anchor" id="status"></a><div class="highlight"><pre>
50
+ {% include doc.html instance="Playlist#privacy_status" %}{% include example.html object='playlist' method='privacy_status' result='"public"' %}</pre>
51
+ </div></dd>
52
+
53
+ {% include dt.html title="Playlist’s content details" label="success" auth="any authentication works" %}
54
+ <dd><a class="anchor" id="content_details"></a><div class="highlight"><pre>
55
+ {% include doc.html instance="Playlist#item_count" %}{% include example.html object='playlist' method='item_count' result='2' %}</pre>
56
+ </div></dd>
57
+
58
+ </dl>
59
+ <p>
60
+ To limit the number of HTTP requests, use <code>select</code> to specify which <a href="https://developers.google.com/youtube/v3/docs/playlists/list#part">parts</a> of the playlist’s data to load:
61
+ </p>
62
+ <dl>
63
+ <dd><a class="anchor" id="select"></a><div class="highlight"><pre>
64
+ {% include example.html object='slow = playlist' result='without select: 2 HTTP requests' %}
65
+ {% include example.html object='slow' method='title' result='one HTTP request to fetch the playlist’s snippet' %}
66
+ {% include example.html object='slow' method='privacy_status' result='=> another HTTP request to fetch the playlist’s status' %}
67
+
68
+ {% include doc.html instance="Playlist#select" %}{% include example.html object='fast = playlist' method='select' params=' <span class="ss">:snippet</span><span class="p">,</span> <span class="ss">:status</span>' result='with select: 1 HTTP request' %}
69
+ {% include example.html object='fast' method='title' result='one HTTP request to fetch both the playlist’s snippet and status' %}
70
+ {% include example.html object='fast' method='privacy_status' result='=> no extra HTTP requests' %}</pre>
71
+ </div></dd>
72
+ </dl>
73
+
74
+ <dl>
75
+ {% include dt.html title="Playlist’s items" label="success" auth="any authentication works" %}
76
+ <dd><a class="anchor" id="items"></a><div class="highlight"><pre>
77
+ {% include doc.html instance="Playlist#items" %}{% include example.html object='playlist' method='items' %}
78
+ {% include example.html result='#&lt;Yt::Relation [#&lt;Yt::PlaylistItem @id=U...&gt;, #&lt;Yt::PlaylistItem @id=T...&gt;, ...]&gt;' %}</pre>
79
+ </div></dd>
80
+ </dl>
81
+ <dl>
82
+ {% include dt.html title="Playlist’s videos" label="success" auth="any authentication works" %}
83
+ <dd><a class="anchor" id="videos"></a><div class="highlight"><pre>
84
+ {% include doc.html instance="Playlist#videos" %}{% include example.html object='playlist' method='videos' %}
85
+ {% include example.html result='#&lt;Yt::Relation [#&lt;Yt::Video @id=gknz...&gt;, #&lt;Yt::Video @id=32Gc...&gt;, ...]&gt;' %}</pre>
86
+ </div></dd>
87
+ </dl>
88
+ <p>
89
+ Before iterating through items or videos, use <code>select</code> to specify which <a href="https://developers.google.com/youtube/v3/docs/videos/list#part">parts</a> to load:
90
+ </p>
91
+ <dl>
92
+ <dd><a class="anchor" id="select"></a><div class="highlight"><pre>
93
+ {% include doc.html instance="Relation#select" %}{% include example.html object='items = playlist.items' method='select' params=' <span class="ss">:snippet</span>, <span class="ss">:status</span>' %}
94
+ {% include example.html object='items' method='map <span class="ss">&amp;:title</span>' result='["First public video", "Second public video", ...]' %}
95
+ {% include example.html object='items' method='map <span class="ss">&amp;:privacy_status</span>' result='["public", "public", ...]' %}</pre>
96
+ </div></dd>
97
+ </dl>
98
+ <p>
99
+ You can also use <code>limit</code> to only fetch a certain number of items or videos:
100
+ </p>
101
+ <dl>
102
+ <dd><a class="anchor" id="limit"></a><div class="highlight"><pre>
103
+ {% include doc.html instance="Relation#limit" %}{% include example.html object='videos = playlist.videos' method='limit' params=' <span class="mi">2</span>' %}
104
+ {% include example.html object='videos' method='map <span class="ss">&amp;:id</span>' result='["gknzFj_0vvY", "oO6WawhsxTA"]' %}</pre>
105
+ </div></dd>
106
+ </dl>
107
+ <p>
108
+ You can also use <code>size</code> to quickly obtain the estimated number of items or videos:
109
+ </p>
110
+ <dl>
111
+ <dd><a class="anchor" id="size"></a><div class="highlight"><pre>
112
+ {% include doc.html instance="Relation#size" %}{% include example.html object='playlist.items' method='size' result='63' %}</pre>
113
+ </div></dd>
114
+ </dl>
data/docs/urls.html ADDED
@@ -0,0 +1,52 @@
1
+ ---
2
+ title: "Yt::URL"
3
+ h2: "URLs"
4
+ ---
5
+
6
+ <p>
7
+ <code>Yt::URL</code> is a convenience class to identify YouTube resources based on their URL patterns:
8
+ </p>
9
+
10
+ <dl>
11
+ <dd><a class="anchor" id="snippet"></a><div class="highlight"><pre>
12
+ {% include doc.html library="yt-url" instance="URL#initialize" %}{% include example.html object='url = <span class="no">Yt</span><span class="o">::</span><span class="no">URL</span>' method='new' params=' <span class="s1">"youtu.be/gknzFj_0vvY"</span>' %}
13
+ {% include doc.html library="yt-url" instance="URL#kind" %}{% include example.html object='url' method='kind' result=':video' %}
14
+ {% include doc.html library="yt-url" instance="URL#id" %}{% include example.html object='url' method='id' result='"gknzFj_0vvY"' %}
15
+ {% include doc.html library="yt-url" instance="URL#resource" %}{% include example.html object='url' method='resource' result='#&lt;Yt::Video @id=gknzFj_0vvY&gt;' %}</pre>
16
+ </div></dd>
17
+ </dl>
18
+
19
+ <hr />
20
+ <h4>Configuration</h4>
21
+
22
+ <p>
23
+ <code>Yt::URL</code> <strong>is not part of the <code>yt</code> library</strong>, but comes from the <a href="https://github.com/claudiob/yt-url">yt-url</a> extension.
24
+ </p>
25
+ <p>
26
+ To use in any bundled Ruby project, remember to add the line <code>gem 'yt-url', '~> 0.0.0'</code> to its Gemfile.
27
+ </p>
28
+
29
+ <hr />
30
+ <h4>Authentication</h4>
31
+
32
+ <p>
33
+ Using <code>Yt::URL</code> does not require authentication since it is based on matching a set of hard-coded patterns:
34
+ </p>
35
+
36
+ {% highlight ruby %}
37
+ Yt::URL::PLAYLIST_PATTERNS # => [
38
+ # %r{^(?:https?://)?(?:www\.)?youtube\.com/playlist/?\?list=(?<id>[a-zA-Z0-9_-]+)},
39
+ # ]
40
+
41
+ Yt::URL::VIDEO_PATTERNS # => [
42
+ # %r{^(?:https?://)?(?:www\.)?youtube\.com/watch\?v=(?<id>[a-zA-Z0-9_-]{11})},
43
+ # %r{^(?:https?://)?(?:www\.)?youtu\.be/(?<id>[a-zA-Z0-9_-]{11})},
44
+ # %r{^(?:https?://)?(?:www\.)?youtube\.com/embed/(?<id>[a-zA-Z0-9_-]{11})},
45
+ # %r{^(?:https?://)?(?:www\.)?youtube\.com/v/(?<id>[a-zA-Z0-9_-]{11})},
46
+ # ]
47
+
48
+ Yt::URL::CHANNEL_PATTERNS # => [
49
+ # %r{^(?:https?://)?(?:www\.)?youtube\.com/channel/(?<id>UC[a-zA-Z0-9_-]{22})},
50
+ # %r{^(?:https?://)?(?:www\.)?youtube\.com/(?<format>c/|user/)?(?<name>[a-zA-Z0-9_-]+)}
51
+ # ]
52
+ {% endhighlight %}
data/docs/videos.html ADDED
@@ -0,0 +1,104 @@
1
+ ---
2
+ title: "Yt::Video"
3
+ h2: "Videos"
4
+ ---
5
+
6
+ <p>
7
+ <code>Yt::Video</code> represents a <a href="https://developers.google.com/youtube/v3/docs/videos">YouTube video</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="Video#initialize" %}{% include example.html object='video = <span class="no">Yt</span><span class="o">::</span><span class="no">Video</span>' method='new' params=' <span class="ss">id:</span> <span class="s1">"gknzFj_0vvY"</span>' %}
14
+ {% include example.html result='#&lt;Yt::Video @id=gknzFj_0vvY&gt;' %}
15
+ {% include doc.html instance="Video#canonical_url" %}{% include example.html object='video' method='canonical_url' %}
16
+ {% include example.html result='"https://www.youtube.com/watch?v=gknzFj_0vvY"' %}</pre>
17
+ </div></dd>
18
+ </dl>
19
+
20
+ <hr />
21
+ <h4>Authentication</h4>
22
+
23
+ <p>
24
+ Most methods of <code>Yt::Video</code> <strong>retrieve public data</strong> from YouTube (e.g.: fetch a video’s title).<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
+ video = Yt::Video.new id: 'gknzFj_0vvY' ## use any video ID
32
+ video.title # => "First public video"
33
+ {% endhighlight %}
34
+
35
+ <hr />
36
+ <h4>List of <code>Yt::Video</code> data methods</h4>
37
+ <dl>
38
+ {% include dt.html title="Video’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="Video#id" %}{% include example.html object='video' method='id' result='"gknzFj_0vvY"' %}
41
+ {% include doc.html instance="Video#title" %}{% include example.html object='video' method='title' result='"First public video"' %}
42
+ {% include doc.html instance="Video#description" %}{% include example.html object='video' method='description' result='"A YouTube video to test the yt gem."' %}
43
+ {% include doc.html instance="Video#published_at" %}{% include example.html object='video' method='published_at' result='2016-10-20 02:19:05 UTC' %}
44
+ {% include doc.html instance="Video#thumbnail_url" %}{% include example.html object='video' method='thumbnail_url' result='"https://i.ytimg.com/vi/gknzFj_0vvY/default.jpg"' %}
45
+ {% include doc.html instance="Video#channel_id" %}{% include example.html object='video' method='channel_id' result='"UCwCnUcLcb9-eSrHa_RQGkQQ"' %}
46
+ {% include doc.html instance="Video#channel_title" %}{% include example.html object='video' method='channel_title' result='"Yt Test"' %}
47
+ {% include doc.html instance="Video#tags" %}{% include example.html object='video' method='tags' result='["yt", "test", "tag"]' %}
48
+ {% include doc.html instance="Video#category_id" %}{% include example.html object='video' method='category_id' result='22' %}
49
+ {% include doc.html instance="Video#category_title" %}{% include example.html object='video' method='category_title' result='"People & Blogs"' %}
50
+ {% include doc.html instance="Video#live_broadcast_content" %}{% include example.html object='video' method='live_broadcast_content' result='"none"' %}</pre>
51
+ </div></dd>
52
+
53
+ {% include dt.html title="Video’s status" label="success" auth="any authentication works" %}
54
+ <dd><a class="anchor" id="status"></a><div class="highlight"><pre>
55
+ {% include doc.html instance="Video#privacy_status" %}{% include example.html object='video' method='privacy_status' result='"public"' %}
56
+ {% include doc.html instance="Video#upload_status" %}{% include example.html object='video' method='upload_status' result='"processed"' %}
57
+ {% include doc.html instance="Video#license" %}{% include example.html object='video' method='license' result='"creative_common"' %}
58
+ {% include doc.html instance="Video#embeddable" %}{% include example.html object='video' method='embeddable' result='true' %}
59
+ {% include doc.html instance="Video#public_stats_viewable" %}{% include example.html object='video' method='public_stats_viewable' result='false' %}</pre>
60
+ </div></dd>
61
+
62
+ {% include dt.html title="Video’s statistics" label="success" auth="any authentication works" %}
63
+ <dd><a class="anchor" id="statistics"></a><div class="highlight"><pre>
64
+ {% include doc.html instance="Video#view_count" %}{% include example.html object='video' method='view_count' result='123' %}
65
+ {% include doc.html instance="Video#like_count" %}{% include example.html object='video' method='like_count' result='93' %}
66
+ {% include doc.html instance="Video#dislike_count" %}{% include example.html object='video' method='dislike_count' result='42' %}
67
+ {% include doc.html instance="Video#comment_count" %}{% include example.html object='video' method='comment_count' result='62' %}</pre>
68
+ </div></dd>
69
+
70
+ {% include dt.html title="Video’s content details" label="success" auth="any authentication works" %}
71
+ <dd><a class="anchor" id="content_details"></a><div class="highlight"><pre>
72
+ {% include doc.html instance="Video#duration" %}{% include example.html object='video' method='duration' result='"PT2S"' %}
73
+ {% include doc.html instance="Video#seconds" %}{% include example.html object='video' method='seconds' result='2' %}
74
+ {% include doc.html instance="Video#length" %}{% include example.html object='video' method='length' result='"00:00:02"' %}
75
+ {% include doc.html instance="Video#dimension" %}{% include example.html object='video' method='dimension' result='"2d"' %}
76
+ {% include doc.html instance="Video#definition" %}{% include example.html object='video' method='definition' result='"sd"' %}
77
+ {% include doc.html instance="Video#caption" %}{% include example.html object='video' method='caption' result='false' %}
78
+ {% include doc.html instance="Video#licensed_content" %}{% include example.html object='video' method='licensed_content' result='false' %}
79
+ {% include doc.html instance="Video#projection" %}{% include example.html object='video' method='projection' result='"rectangular"' %}</pre>
80
+ </div></dd>
81
+
82
+ </dl>
83
+ <p>
84
+ To limit the number of HTTP requests, use <code>select</code> to specify which <a href="https://developers.google.com/youtube/v3/docs/videos/list#part">parts</a> of the video’s data to load:
85
+ </p>
86
+ <dl>
87
+ <dd><a class="anchor" id="select"></a><div class="highlight"><pre>
88
+ {% include example.html object='slow = video' result='without select: 2 HTTP requests' %}
89
+ {% include example.html object='slow' method='title' result='one HTTP request to fetch the video’s snippet' %}
90
+ {% include example.html object='slow' method='privacy_status' result='=> another HTTP request to fetch the video’s status' %}
91
+
92
+ {% include doc.html instance="Video#select" %}{% include example.html object='fast = video' method='select' params=' <span class="ss">:snippet</span><span class="p">,</span> <span class="ss">:status</span>' result='with select: 1 HTTP request' %}
93
+ {% include example.html object='fast' method='title' result='one HTTP request to fetch both the video’s snippet and status' %}
94
+ {% include example.html object='fast' method='privacy_status' result='=> no extra HTTP requests' %}</pre>
95
+ </div></dd>
96
+ </dl>
97
+
98
+ <dl>
99
+ {% include dt.html title="Video’s channel" label="success" auth="any authentication works" %}
100
+ <dd><a class="anchor" id="channel"></a><div class="highlight"><pre>
101
+ {% include doc.html instance="Video#channel" %}{% include example.html object='video' method='channel' %}
102
+ {% include example.html result='#&lt;Yt::Channel @id=UCwCnUcLcb9-eSrHa_RQGkQQ&gt;' %}</pre>
103
+ </div></dd>
104
+ </dl>
data/lib/yt/channel.rb ADDED
@@ -0,0 +1,127 @@
1
+ module Yt
2
+ # Provides methods to interact with YouTube channels.
3
+ # @see https://developers.google.com/youtube/v3/docs/channels
4
+ class Channel < Resource
5
+ # @!attribute [r] title
6
+ # @return [String] the channel’s title.
7
+ has_attribute :title, in: :snippet
8
+
9
+ # @!attribute [r] description
10
+ # @return [String] the channel’s description.
11
+ has_attribute :description, in: :snippet
12
+
13
+ # @!attribute [r] published_at
14
+ # @return [Time] the date and time that the channel was created.
15
+ has_attribute :published_at, in: :snippet, type: Time
16
+
17
+ # @!attribute [r] thumbnails
18
+ # @return [Hash<String, Hash>] the thumbnails associated with the video.
19
+ has_attribute :thumbnails, in: :snippet
20
+
21
+ # @!attribute [r] custom_url
22
+ # @return [<String, nil>] the path component of the channel’s custom URL.
23
+ has_attribute :custom_url, in: :snippet
24
+
25
+ # has_attribute :default_language, in: :snippet not sure how to set to test
26
+ # has_attribute :localized, in: :snippet not yet implemented
27
+ # has_attribute :country, in: :snippet not sure how to set to test
28
+
29
+ # @!attribute [r] privacy_status
30
+ # @return [String] the privacy status of the channel. Valid values are:
31
+ # +"private"+, +"public"+, +"unlisted"+.
32
+ has_attribute :privacy_status, in: :status
33
+
34
+ # @!attribute [r] is_linked
35
+ # @return [Boolean] whether the channel data identifies a user that is
36
+ # already linked to either a YouTube username or a Google+ account.
37
+ has_attribute :is_linked, in: :status
38
+
39
+ # @!attribute [r] long_uploads_status
40
+ # @return [String] whether the channel is eligible to upload videos that
41
+ # are more than 15 minutes long. Valid values are: +"allowed"+,
42
+ # +"disallowed"+, +"eligible"+, +"longUploadsUnspecified"+.
43
+ # @note +"longUploadsUnspecified"+ is not documented by the YouTube API.
44
+ has_attribute :long_uploads_status, in: :status
45
+
46
+ # @!attribute [r] view_count
47
+ # @return [<Integer>] the number of times the channel has been viewed.
48
+ has_attribute :view_count, in: :statistics, type: Integer
49
+
50
+ # @!attribute [r] comment_count
51
+ # @return [<Integer>] the number of comments for the channel.
52
+ has_attribute :comment_count, in: :statistics, type: Integer
53
+
54
+ # @!attribute [r] subscriber_count
55
+ # @return [<Integer>] the number of subscribers that the channel has.
56
+ has_attribute :subscriber_count, in: :statistics, type: Integer
57
+
58
+ # @!attribute [r] hidden_subscriber_count
59
+ # @return [<Boolean>] whether the channel’s subscriber count is publicly
60
+ # visible.
61
+ has_attribute :hidden_subscriber_count, in: :statistics
62
+
63
+ # @!attribute [r] video_count
64
+ # @return [<Integer>] the number of videos uploaded to the channel.
65
+ has_attribute :video_count, in: :statistics, type: Integer
66
+
67
+ # @!attribute [r] banner_image_url
68
+ # @return [String] the URL for the banner image shown on the channel page
69
+ # on the YouTube website. The image is 1060px by 175px.
70
+ has_attribute :banner_image_url, in: %i(branding_settings image)
71
+
72
+ # @!attribute [r] keywords
73
+ # @return [Array<String>] the keywords associated with the channel.
74
+ has_attribute :keywords, in: %i(branding_settings channel) do |keywords|
75
+ (keywords || '').split ' '
76
+ end
77
+
78
+ # @!attribute [r] unsubscribed_trailer
79
+ # @return [<String, nil>] if specified, the ID of a public or unlisted video
80
+ # owned by the channel owner that should play in the featured video module
81
+ # in the channel page’s browse view for unsubscribed viewers.
82
+ has_attribute :unsubscribed_trailer, in: %i(branding_settings channel)
83
+
84
+ # @return [String] the canonical form of the channel’s URL.
85
+ def canonical_url
86
+ "https://www.youtube.com/channel/#{id}"
87
+ end
88
+
89
+ # @return [<String] the full channel’s URL (custom or canonical).
90
+ # @see https://support.google.com/youtube/answer/2657968
91
+ def vanity_url
92
+ if custom_url
93
+ "https://www.youtube.com/#{custom_url}"
94
+ else
95
+ canonical_url
96
+ end
97
+ end
98
+
99
+ # Returns the URL of one of the channel’s thumbnail.
100
+ # @param [Symbol, String] size The size of the channel’s thumbnail.
101
+ # @return [String] if +size+ is +:default+, the URL of a 88x88px image.
102
+ # @return [String] if +size+ is +:medium+, the URL of a 240x240px image.
103
+ # @return [String] if +size+ is +:high+, the URL of a 800x800px image.
104
+ # @return [nil] if the +size+ is none of the above.
105
+ def thumbnail_url(size = :default)
106
+ thumbnails.fetch(size.to_s, {})['url']
107
+ end
108
+
109
+ # @return [Yt::Relation<Yt::Video>] the public videos of the channel.
110
+ # @note For unauthenticated channels, results are constrained to a maximum
111
+ # of 500 videos.
112
+ # @see https://developers.google.com/youtube/v3/docs/search/list#channelId
113
+ def videos
114
+ @videos ||= Relation.new(Video, channel_id: id, limit: 500) do |options|
115
+ items = fetch '/youtube/v3/search', channel_videos_params(options)
116
+ videos_for items, 'id', options
117
+ end
118
+ end
119
+
120
+ # @return [Yt::Relation<Yt::Playlist>] the public playlists of the channel.
121
+ def playlists
122
+ @playlists ||= Relation.new(Playlist, channel_id: id) do |options|
123
+ fetch '/youtube/v3/playlists', channel_playlists_params(options)
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,8 @@
1
+ module Yt
2
+ # Provides basic functionality to connect to the YouTube API.
3
+ module Core
4
+ # @return [String] the SemVer-compatible gem version.
5
+ # @see http://semver.org
6
+ VERSION = '0.1.0'
7
+ end
8
+ end
data/lib/yt/core.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'json' # for JSON.parse
2
+
3
+ require 'yt/config'
4
+ require 'yt/no_items_error'
5
+ require 'yt/http_request'
6
+ require 'yt/relation'
7
+ require 'yt/resource'
8
+ require 'yt/response'
9
+
10
+ require 'yt/channel'
11
+ require 'yt/playlist'
12
+ require 'yt/playlist_item'
13
+ require 'yt/video'
14
+
15
+ # An object-oriented Ruby client for YouTube.
16
+ # @see http://www.rubydoc.info/gems/yt/
17
+ module Yt
18
+ end
@@ -0,0 +1,8 @@
1
+ module Yt
2
+ # Raised when items are expected from YouTube but none are returned.
3
+ # @example Fetch the title of a channel with an unknown ID.
4
+ # Yt::Channel.new(id: 'unknown-id').title
5
+ # # => raise Yt::NoItemsError
6
+ class NoItemsError < StandardError
7
+ end
8
+ end