yt-core 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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