yt 0.15.2 → 0.15.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +9 -7
- data/lib/yt/collections/file_details.rb +29 -0
- data/lib/yt/collections/video_categories.rb +35 -0
- data/lib/yt/collections/videos.rb +15 -0
- data/lib/yt/models/file_detail.rb +26 -0
- data/lib/yt/models/snippet.rb +3 -3
- data/lib/yt/models/video.rb +31 -1
- data/lib/yt/models/video_category.rb +11 -0
- data/lib/yt/version.rb +1 -1
- data/spec/models/file_detail_spec.rb +34 -0
- data/spec/models/player_spec.rb +1 -1
- data/spec/models/video_category_spec.rb +21 -0
- data/spec/requests/as_account/account_spec.rb +2 -1
- data/spec/requests/as_account/channel_spec.rb +9 -1
- data/spec/requests/as_account/video_spec.rb +22 -2
- metadata +9 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 955b88eeaa4654c03880228bf322546eb0fba3c3
|
4
|
+
data.tar.gz: 8b5bbaf09793909b2230180a49107a58f0f69ed7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6715a5ff1ec202aa3f1d678aea12baa21f87daf15f1234c3b24e4e0be298b62db322ea1c6ea8e948fd4345a49ca15d27aa3b03237f0f8249d0fea67f371cbcc8
|
7
|
+
data.tar.gz: eac8f4472b3c814986f3c41469357043019648e523edfef4aafdf4ef3003a4d4700e5c3b2d6eb17df799ed750ebd0372057ecfa2946b3196e0dc43e1df944b60
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,12 @@ For more information about changelogs, check
|
|
7
7
|
[Vandamme](http://tech-angels.github.io/vandamme).
|
8
8
|
|
9
9
|
|
10
|
+
## 0.15.3 - 2015-04-27
|
11
|
+
|
12
|
+
* [FEATURE] New `file_size`, `file_type`, `container` methods for Yt::Video.
|
13
|
+
* [BUGFIX] Retrieve `category_id` also for videos obtained through a search.
|
14
|
+
* [FEATURE] Add .includes(:category) to .videos in order to eager-load category title and ID of a collection of videos
|
15
|
+
|
10
16
|
## 0.15.2 - 2015-04-27
|
11
17
|
|
12
18
|
* [FEATURE] New `embed_html` method for Yt::Video.
|
data/README.md
CHANGED
@@ -41,7 +41,7 @@ To install on your system, run
|
|
41
41
|
|
42
42
|
To use inside a bundled Ruby project, add this line to the Gemfile:
|
43
43
|
|
44
|
-
gem 'yt', '~> 0.15.
|
44
|
+
gem 'yt', '~> 0.15.3'
|
45
45
|
|
46
46
|
Since the gem follows [Semantic Versioning](http://semver.org),
|
47
47
|
indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
|
@@ -310,6 +310,8 @@ Use [Yt::Video](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Video)
|
|
310
310
|
* retrieve data about live-streaming videos
|
311
311
|
* retrieve the advertising options of a video
|
312
312
|
* retrieve the HTML code of the video player
|
313
|
+
* retrieve the file details of a video
|
314
|
+
* retrieve the category title of a video
|
313
315
|
|
314
316
|
```ruby
|
315
317
|
# Videos can be initialized with ID or URL
|
@@ -368,6 +370,12 @@ video.concurrent_viewers #=> 0
|
|
368
370
|
|
369
371
|
video.embed_html #=> "<iframe type='text/html' src='http://www.youtube.com/embed/BPNYv0vd78A' width='640' height='360' frameborder='0' allowfullscreen='true'/>"
|
370
372
|
|
373
|
+
video.file_size #=> 8000000
|
374
|
+
video.file_type #=> "video"
|
375
|
+
video.container #=> "mov"
|
376
|
+
|
377
|
+
video.category_title #=> "People & Blogs"
|
378
|
+
|
371
379
|
video.annotations.count #=> 1
|
372
380
|
video.annotations.first #=> #<Yt::Models::Annotation @id=...>
|
373
381
|
```
|
@@ -913,9 +921,3 @@ the [YouTube Analytics API](https://developers.google.com/youtube/analytics).
|
|
913
921
|
If you find that a method is missing, fork the project, add the missing code,
|
914
922
|
write the appropriate tests, then submit a pull request, and it will gladly
|
915
923
|
be merged!
|
916
|
-
|
917
|
-
Don’t hesitate to send code comments, issues or pull requests through GitHub
|
918
|
-
and to spread the love on Twitter by following [@ytgem](https://twitter.com/intent/user?screen_name=ytgem) –
|
919
|
-
all feedback is appreciated.
|
920
|
-
|
921
|
-
![yt4](https://cloud.githubusercontent.com/assets/7408595/3638115/0ef9d6bc-1037-11e4-831a-787204e9b979.png)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yt/collections/base'
|
2
|
+
require 'yt/models/file_detail'
|
3
|
+
|
4
|
+
module Yt
|
5
|
+
module Collections
|
6
|
+
class FileDetails < Base
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def attributes_for_new_item(data)
|
11
|
+
{data: data['fileDetails']}
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Hash] the parameters to submit to YouTube to get the
|
15
|
+
# file detail of a video.
|
16
|
+
# @see https://developers.google.com/youtube/v3/docs/videos#fileDetails
|
17
|
+
def list_params
|
18
|
+
super.tap do |params|
|
19
|
+
params[:params] = file_details_params
|
20
|
+
params[:path] = '/youtube/v3/videos'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def file_details_params
|
25
|
+
{max_results: 50, part: 'fileDetails', id: @parent.id}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'yt/collections/base'
|
2
|
+
require 'yt/models/video_category'
|
3
|
+
|
4
|
+
module Yt
|
5
|
+
module Collections
|
6
|
+
class VideoCategories < Base
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def attributes_for_new_item(data)
|
11
|
+
{}.tap do |attributes|
|
12
|
+
attributes[:id] = data['id']
|
13
|
+
attributes[:snippet] = data['snippet']
|
14
|
+
attributes[:auth] = @auth
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Hash] the parameters to submit to YouTube to list video categories.
|
19
|
+
# @see https://developers.google.com/youtube/v3/docs/videoCategories/list
|
20
|
+
def list_params
|
21
|
+
super.tap do |params|
|
22
|
+
params[:params] = video_categories_params
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def video_categories_params
|
27
|
+
{}.tap do |params|
|
28
|
+
params[:part] = 'snippet'
|
29
|
+
params[:id] = @parent.category_id if @parent
|
30
|
+
apply_where_params! params
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -24,12 +24,16 @@ module Yt
|
|
24
24
|
attributes[:status] = data['status']
|
25
25
|
attributes[:content_details] = data['contentDetails']
|
26
26
|
attributes[:statistics] = data['statistics']
|
27
|
+
attributes[:video_category] = data['videoCategory']
|
27
28
|
attributes[:auth] = @auth
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
32
|
def eager_load_items_from(items)
|
32
33
|
if included_relationships.any?
|
34
|
+
include_category = included_relationships.delete(:category)
|
35
|
+
included_relationships.append(:snippet).uniq! if include_category
|
36
|
+
|
33
37
|
ids = items.map{|item| item['id']['videoId']}
|
34
38
|
parts = included_relationships.map{|r| r.to_s.camelize(:lower)}
|
35
39
|
conditions = {id: ids.join(','), part: parts.join(',')}
|
@@ -46,6 +50,17 @@ module Yt
|
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
53
|
+
|
54
|
+
if include_category
|
55
|
+
category_ids = items.map{|item| item['snippet']['categoryId']}.uniq
|
56
|
+
conditions = {id: category_ids.join(',')}
|
57
|
+
video_categories = Collections::VideoCategories.new(auth: @auth).where conditions
|
58
|
+
|
59
|
+
items.each do |item|
|
60
|
+
video_category = video_categories.find{|v| v.id == item['snippet']['categoryId']}
|
61
|
+
item['videoCategory'] = video_category.data
|
62
|
+
end
|
63
|
+
end
|
49
64
|
end
|
50
65
|
super
|
51
66
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'yt/models/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module Models
|
5
|
+
# Encapsulates basic information about the video file itself,
|
6
|
+
# including the file name, size, type, and container.
|
7
|
+
# @see https://developers.google.com/youtube/v3/docs/videos#fileDetails
|
8
|
+
class FileDetail < Base
|
9
|
+
attr_reader :data
|
10
|
+
|
11
|
+
def initialize(options = {})
|
12
|
+
@data = options[:data] || {}
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Integer] the file size of the video (in bytes).
|
16
|
+
has_attribute :file_size, type: Integer
|
17
|
+
|
18
|
+
# @return [String] the file type of the file. May be one of:
|
19
|
+
# archive, audio, document, image, other, project, or video.
|
20
|
+
has_attribute :file_type
|
21
|
+
|
22
|
+
# @return [String] the container of the video (e.g. 'mov').
|
23
|
+
has_attribute :container
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/yt/models/snippet.rb
CHANGED
@@ -147,9 +147,9 @@ module Yt
|
|
147
147
|
end
|
148
148
|
|
149
149
|
# Returns whether YouTube API includes all attributes in this snippet.
|
150
|
-
# For instance, YouTube API only returns tags
|
151
|
-
# Videos#search. And returns position on
|
152
|
-
# PlaylistItems#insert.
|
150
|
+
# For instance, YouTube API only returns tags and categoryId on
|
151
|
+
# Videos#list, not on Videos#search. And returns position on
|
152
|
+
# PlaylistItems#list, not on PlaylistItems#insert.
|
153
153
|
# This method is used to guarantee that, when a video was instantiated
|
154
154
|
# by one of the methods above, an additional call to is made to retrieve
|
155
155
|
# the full snippet in case an attribute is missing.
|
data/lib/yt/models/video.rb
CHANGED
@@ -23,6 +23,11 @@ module Yt
|
|
23
23
|
delegate :duration, :hd?, :stereoscopic?, :captioned?, :licensed?,
|
24
24
|
to: :content_detail
|
25
25
|
|
26
|
+
# @!attribute [r] file_detail
|
27
|
+
# @return [Yt::Models::FileDetail] the video’s file details.
|
28
|
+
has_one :file_detail
|
29
|
+
delegate :file_size, :file_type, :container, to: :file_detail
|
30
|
+
|
26
31
|
has_one :advertising_options_set
|
27
32
|
delegate :ad_formats, to: :advertising_options_set
|
28
33
|
|
@@ -30,6 +35,11 @@ module Yt
|
|
30
35
|
# @return [Yt::Models::Rating] the video’s rating.
|
31
36
|
has_one :rating
|
32
37
|
|
38
|
+
# @!attribute [r] video_category
|
39
|
+
# @return [Yt::Models::VideoCategory] the video’s category.
|
40
|
+
has_one :video_category
|
41
|
+
delegate :title, to: :video_category, prefix: :category
|
42
|
+
|
33
43
|
# @!attribute [r] live_streaming_detail
|
34
44
|
# @return [Yt::Models::LiveStreamingDetail] live streaming detail.
|
35
45
|
has_one :live_streaming_detail
|
@@ -131,6 +141,12 @@ module Yt
|
|
131
141
|
if options[:content_details]
|
132
142
|
@content_detail = ContentDetail.new data: options[:content_details]
|
133
143
|
end
|
144
|
+
if options[:file_details]
|
145
|
+
@file_detail = FileDetail.new data: options[:file_details]
|
146
|
+
end
|
147
|
+
if options[:video_category]
|
148
|
+
@video_category = VideoCategory.new data: options[:video_category]
|
149
|
+
end
|
134
150
|
end
|
135
151
|
|
136
152
|
# Returns the list of keyword tags associated with the video.
|
@@ -148,6 +164,20 @@ module Yt
|
|
148
164
|
snippet.tags
|
149
165
|
end
|
150
166
|
|
167
|
+
# Returns the category ID associated with the video.
|
168
|
+
# Since YouTube API only returns categoryID on Videos#list, the memoized
|
169
|
+
# @snippet is erased if the video was instantiated through Video#search
|
170
|
+
# (e.g., by calling account.videos or channel.videos), so that the full
|
171
|
+
# snippet (with categoryID) is loaded, rather than the partial one.
|
172
|
+
# @see https://developers.google.com/youtube/v3/docs/videos
|
173
|
+
# @return [String] ID of the YouTube category associated with the video.
|
174
|
+
def category_id
|
175
|
+
unless snippet.category_id.present? || snippet.complete?
|
176
|
+
@snippet = nil
|
177
|
+
end
|
178
|
+
snippet.category_id
|
179
|
+
end
|
180
|
+
|
151
181
|
# Deletes the video.
|
152
182
|
#
|
153
183
|
# This method requires {Resource#auth auth} to return an authenticated
|
@@ -273,4 +303,4 @@ module Yt
|
|
273
303
|
end
|
274
304
|
end
|
275
305
|
end
|
276
|
-
end
|
306
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'yt/models/resource'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module Models
|
5
|
+
# Provides methods to interact with YouTube video categories.
|
6
|
+
# @see https://developers.google.com/youtube/v3/docs/videoCategories
|
7
|
+
class VideoCategory < Resource
|
8
|
+
delegate :data, :title, to: :snippet
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/yt/version.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yt/models/file_detail'
|
3
|
+
|
4
|
+
describe Yt::FileDetail do
|
5
|
+
subject(:file_detail) { Yt::FileDetail.new data: data }
|
6
|
+
|
7
|
+
describe '#data' do
|
8
|
+
let(:data) { {"key"=>"value"} }
|
9
|
+
specify 'returns the data the file detail was initialized with' do
|
10
|
+
expect(file_detail.data).to eq data
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#file_size' do
|
15
|
+
context 'given a video with fileSize' do
|
16
|
+
let(:data) { {"fileSize"=>"8000000"} }
|
17
|
+
it { expect(file_detail.file_size).to be 8_000_000 }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#file_type' do
|
22
|
+
context 'given a video with fileType' do
|
23
|
+
let(:data) { {"fileType"=>"video"} }
|
24
|
+
it { expect(file_detail.file_type).to eq 'video' }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#container' do
|
29
|
+
context 'given a video with container' do
|
30
|
+
let(:data) { {"container"=>"mov"} }
|
31
|
+
it { expect(file_detail.container).to eq 'mov' }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/models/player_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe Yt::Player do
|
|
7
7
|
|
8
8
|
describe '#data' do
|
9
9
|
let(:data) { {"key"=>"value"} }
|
10
|
-
specify 'returns the data the
|
10
|
+
specify 'returns the data the player was initialized with' do
|
11
11
|
expect(player.data).to eq data
|
12
12
|
end
|
13
13
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yt/models/video_category'
|
3
|
+
|
4
|
+
describe Yt::VideoCategory do
|
5
|
+
subject(:video_category) { Yt::VideoCategory.new attrs }
|
6
|
+
|
7
|
+
describe '#id' do
|
8
|
+
context 'given fetching a video category returns an id' do
|
9
|
+
let(:attrs) { {id: "22"} }
|
10
|
+
it { expect(video_category.id).to eq '22' }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#snippet' do
|
15
|
+
context 'given fetching a video category returns a snippet' do
|
16
|
+
let(:attrs) { {snippet: {"title": "People & Blogs", "assignable": true}} }
|
17
|
+
|
18
|
+
it { expect(video_category.snippet).to be_a Yt::Snippet }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -21,9 +21,10 @@ describe Yt::Account, :device_app do
|
|
21
21
|
describe '.videos' do
|
22
22
|
let(:video) { $account.videos.where(order: 'viewCount').first }
|
23
23
|
|
24
|
-
specify 'returns the videos uploaded by the account with their tags' do
|
24
|
+
specify 'returns the videos uploaded by the account with their tags and category ID' do
|
25
25
|
expect(video).to be_a Yt::Video
|
26
26
|
expect(video.tags).not_to be_empty
|
27
|
+
expect(video.category_id).not_to be_nil
|
27
28
|
end
|
28
29
|
|
29
30
|
describe '.where(q: query_string)' do
|
@@ -24,7 +24,7 @@ describe Yt::Channel, :device_app do
|
|
24
24
|
describe '.videos' do
|
25
25
|
let(:video) { channel.videos.first }
|
26
26
|
|
27
|
-
specify 'returns the videos in the channel without
|
27
|
+
specify 'returns the videos in the channel without tags or category ID' do
|
28
28
|
expect(video).to be_a Yt::Video
|
29
29
|
expect(video.snippet).not_to be_complete
|
30
30
|
end
|
@@ -62,6 +62,14 @@ describe Yt::Channel, :device_app do
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
describe '.includes(:category)' do
|
66
|
+
let(:video) { channel.videos.includes(:category, :status).first }
|
67
|
+
|
68
|
+
specify 'eager-loads the category (id and title) of each video' do
|
69
|
+
expect(video.instance_variable_defined? :@snippet).to be true
|
70
|
+
expect(video.instance_variable_defined? :@video_category).to be true
|
71
|
+
end
|
72
|
+
end
|
65
73
|
|
66
74
|
describe 'when the channel has more than 500 videos' do
|
67
75
|
let(:id) { 'UCsmvakQZlvGsyjyOhmhvOsw' }
|
@@ -64,6 +64,7 @@ describe Yt::Video, :device_app do
|
|
64
64
|
expect(video.scheduled_end_time).to be_nil
|
65
65
|
expect(video.concurrent_viewers).to be_nil
|
66
66
|
expect(video.embed_html).to be_a String
|
67
|
+
expect(video.category_title).to be_a String
|
67
68
|
end
|
68
69
|
|
69
70
|
it { expect{video.update}.to fail }
|
@@ -119,6 +120,7 @@ describe Yt::Video, :device_app do
|
|
119
120
|
it { expect{video.rating}.to raise_error Yt::Errors::NoItems }
|
120
121
|
it { expect{video.status}.to raise_error Yt::Errors::NoItems }
|
121
122
|
it { expect{video.statistics_set}.to raise_error Yt::Errors::NoItems }
|
123
|
+
it { expect{video.file_detail}.to raise_error Yt::Errors::NoItems }
|
122
124
|
end
|
123
125
|
|
124
126
|
context 'given one of my own videos that I want to delete' do
|
@@ -280,7 +282,7 @@ describe Yt::Video, :device_app do
|
|
280
282
|
|
281
283
|
it 'returns valid reports for video-related metrics' do
|
282
284
|
# Some reports are only available to Content Owners.
|
283
|
-
# See content
|
285
|
+
# See content owner test for more details about what the methods return.
|
284
286
|
expect{video.views}.not_to raise_error
|
285
287
|
expect{video.comments}.not_to raise_error
|
286
288
|
expect{video.likes}.not_to raise_error
|
@@ -389,4 +391,22 @@ describe Yt::Video, :device_app do
|
|
389
391
|
it { expect{update}.to raise_error Yt::Errors::RequestError }
|
390
392
|
end
|
391
393
|
end
|
392
|
-
|
394
|
+
|
395
|
+
# @note: This test is separated from the block above because YouTube only
|
396
|
+
# returns file details for *some videos*: "The fileDetails object will
|
397
|
+
# only be returned if the processingDetails.fileAvailability property
|
398
|
+
# has a value of available.". Therefore, just to test fileDetails, we use a
|
399
|
+
# different video that (for some unknown reason) is marked as 'available'.
|
400
|
+
# Also note that I was not able to find a single video returning fileName,
|
401
|
+
# therefore video.file_name is not returned by Yt, until it can be tested.
|
402
|
+
# @see https://developers.google.com/youtube/v3/docs/videos#processingDetails.fileDetailsAvailability
|
403
|
+
context 'given one of my own *available* videos' do
|
404
|
+
let(:id) { 'yCmaOvUFhlI' }
|
405
|
+
|
406
|
+
it 'returns valid file details' do
|
407
|
+
expect(video.file_size).to be_an Integer
|
408
|
+
expect(video.file_type).to be_a String
|
409
|
+
expect(video.container).to be_a String
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.
|
4
|
+
version: 0.15.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claudio Baccigalupo
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- lib/yt/collections/content_owner_details.rb
|
143
143
|
- lib/yt/collections/content_owners.rb
|
144
144
|
- lib/yt/collections/device_flows.rb
|
145
|
+
- lib/yt/collections/file_details.rb
|
145
146
|
- lib/yt/collections/ids.rb
|
146
147
|
- lib/yt/collections/live_streaming_details.rb
|
147
148
|
- lib/yt/collections/ownerships.rb
|
@@ -162,6 +163,7 @@ files:
|
|
162
163
|
- lib/yt/collections/subscribers.rb
|
163
164
|
- lib/yt/collections/subscriptions.rb
|
164
165
|
- lib/yt/collections/user_infos.rb
|
166
|
+
- lib/yt/collections/video_categories.rb
|
165
167
|
- lib/yt/collections/videos.rb
|
166
168
|
- lib/yt/collections/viewer_percentages.rb
|
167
169
|
- lib/yt/config.rb
|
@@ -189,6 +191,7 @@ files:
|
|
189
191
|
- lib/yt/models/content_owner_detail.rb
|
190
192
|
- lib/yt/models/description.rb
|
191
193
|
- lib/yt/models/device_flow.rb
|
194
|
+
- lib/yt/models/file_detail.rb
|
192
195
|
- lib/yt/models/id.rb
|
193
196
|
- lib/yt/models/iterator.rb
|
194
197
|
- lib/yt/models/live_streaming_detail.rb
|
@@ -212,6 +215,7 @@ files:
|
|
212
215
|
- lib/yt/models/url.rb
|
213
216
|
- lib/yt/models/user_info.rb
|
214
217
|
- lib/yt/models/video.rb
|
218
|
+
- lib/yt/models/video_category.rb
|
215
219
|
- lib/yt/request.rb
|
216
220
|
- lib/yt/version.rb
|
217
221
|
- spec/collections/claims_spec.rb
|
@@ -239,6 +243,7 @@ files:
|
|
239
243
|
- spec/models/content_detail_spec.rb
|
240
244
|
- spec/models/content_owner_detail_spec.rb
|
241
245
|
- spec/models/description_spec.rb
|
246
|
+
- spec/models/file_detail_spec.rb
|
242
247
|
- spec/models/live_streaming_detail_spec.rb
|
243
248
|
- spec/models/ownership_spec.rb
|
244
249
|
- spec/models/player_spec.rb
|
@@ -257,6 +262,7 @@ files:
|
|
257
262
|
- spec/models/subscription_spec.rb
|
258
263
|
- spec/models/url_spec.rb
|
259
264
|
- spec/models/user_info_spec.rb
|
265
|
+
- spec/models/video_category_spec.rb
|
260
266
|
- spec/models/video_spec.rb
|
261
267
|
- spec/requests/as_account/account_spec.rb
|
262
268
|
- spec/requests/as_account/authentications_spec.rb
|
@@ -341,6 +347,7 @@ test_files:
|
|
341
347
|
- spec/models/content_detail_spec.rb
|
342
348
|
- spec/models/content_owner_detail_spec.rb
|
343
349
|
- spec/models/description_spec.rb
|
350
|
+
- spec/models/file_detail_spec.rb
|
344
351
|
- spec/models/live_streaming_detail_spec.rb
|
345
352
|
- spec/models/ownership_spec.rb
|
346
353
|
- spec/models/player_spec.rb
|
@@ -359,6 +366,7 @@ test_files:
|
|
359
366
|
- spec/models/subscription_spec.rb
|
360
367
|
- spec/models/url_spec.rb
|
361
368
|
- spec/models/user_info_spec.rb
|
369
|
+
- spec/models/video_category_spec.rb
|
362
370
|
- spec/models/video_spec.rb
|
363
371
|
- spec/requests/as_account/account_spec.rb
|
364
372
|
- spec/requests/as_account/authentications_spec.rb
|