yt 0.19.0 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +1 -1
- data/lib/yt/associations/has_reports.rb +80 -44
- data/lib/yt/models/annotation.rb +1 -0
- data/lib/yt/models/asset.rb +0 -2
- data/lib/yt/models/channel.rb +186 -119
- data/lib/yt/models/claim.rb +0 -5
- data/lib/yt/models/content_owner_detail.rb +1 -25
- data/lib/yt/models/id.rb +1 -0
- data/lib/yt/models/playlist.rb +124 -38
- data/lib/yt/models/playlist_item.rb +62 -16
- data/lib/yt/models/reference.rb +0 -6
- data/lib/yt/models/resource.rb +11 -0
- data/lib/yt/models/snippet.rb +6 -96
- data/lib/yt/models/statistics_set.rb +1 -19
- data/lib/yt/models/status.rb +0 -2
- data/lib/yt/models/video.rb +24 -36
- data/lib/yt/version.rb +1 -1
- data/spec/models/channel_spec.rb +107 -0
- data/spec/models/content_owner_detail_spec.rb +0 -24
- data/spec/models/playlist_item_spec.rb +95 -6
- data/spec/models/playlist_spec.rb +87 -0
- data/spec/models/snippet_spec.rb +1 -118
- data/spec/models/statistics_set_spec.rb +1 -64
- data/spec/models/video_spec.rb +112 -0
- data/spec/requests/as_account/channel_spec.rb +1 -1
- data/spec/requests/as_account/playlist_item_spec.rb +1 -1
- data/spec/requests/as_account/playlist_spec.rb +1 -1
- data/spec/requests/as_account/video_spec.rb +2 -2
- data/spec/requests/as_content_owner/content_owner_spec.rb +4 -4
- data/spec/requests/as_content_owner/playlist_spec.rb +259 -0
- data/spec/requests/as_content_owner/video_spec.rb +38 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5fe27d147e90b10dde52f153efedf061043b9788
|
4
|
+
data.tar.gz: fb07f986240215dba34f01d78762503471cf61a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c20df4b1ad2ac9420d3bd183e04892f9cffaaefb3989330794ce8004de7f06c8ce6b52260980582f2cc22e5239871c24aa868156d27bd488465184dd8940da3
|
7
|
+
data.tar.gz: b4ec8a79ced4d3e5535a68daa4ae56f593d70e8bd86d20c0c3ef041ca85c88266b77f2f787a7fe1bf08fd04b61b4738ffc02ab3b93d5cce8699ba60c3c7d701b
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,23 @@ 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.20.0 - 2015-04-29
|
10
|
+
|
11
|
+
**How to upgrade**
|
12
|
+
|
13
|
+
If your code doesn’t use any of the following constants that were public but
|
14
|
+
undocumented, then you are good to go.
|
15
|
+
|
16
|
+
If it does, then you should redefine those constants in your own app, since
|
17
|
+
it’s not Yt’s goal to validate the values posted to YouTube API.
|
18
|
+
|
19
|
+
* [REMOVAL] Remove `Asset#STATUSES` (was `%q(active inactive pending)`).
|
20
|
+
* [REMOVAL] Remove `Claim#STATUSES` (was `%q(active appealed disputed inactive pending potential takedown unknown)`).
|
21
|
+
* [REMOVAL] Remove `Claim#CONTENT_TYPES` (was `%q(audio video audiovisual)`).
|
22
|
+
* [REMOVAL] Remove `Reference#STATUSES` (was `%q(activating active checking computing_fingerprint deleted duplicate_on_hold inactive live_streaming_processing urgent_reference_processing)`).
|
23
|
+
* [REMOVAL] Remove `Reference#CONTENT_TYPES` (was `%q(audio video audiovisual)`).
|
24
|
+
* [REMOVAL] Remove `Status#PRIVACY_STATUSES` (was `%q(private public unlisted)`).
|
25
|
+
|
9
26
|
## 0.19.0 - 2015-04-28
|
10
27
|
|
11
28
|
**How to upgrade**
|
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.
|
44
|
+
gem 'yt', '~> 0.20.0'
|
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*)
|
@@ -1,12 +1,10 @@
|
|
1
1
|
module Yt
|
2
2
|
module Associations
|
3
|
+
# @private
|
3
4
|
# Provides methods to access the analytics reports of a resource.
|
4
|
-
#
|
5
|
-
# YouTube resources with reports are: {Yt::Models::Channel channels} and
|
6
|
-
# {Yt::Models::Channel videos}.
|
7
5
|
module HasReports
|
8
6
|
# @!macro [new] report
|
9
|
-
# Returns the $1
|
7
|
+
# Returns the $1 grouped by the given dimension.
|
10
8
|
# @!method $1(options = {})
|
11
9
|
# @param [Hash] options the time-range and dimensions for the $1.
|
12
10
|
# @option options [#to_date] :since The first day of the time-range.
|
@@ -14,65 +12,103 @@ module Yt
|
|
14
12
|
# @option options [#to_date] :until The last day of the time-range.
|
15
13
|
# Also aliased as +:to+.
|
16
14
|
|
17
|
-
# @!macro [new]
|
18
|
-
# @
|
19
|
-
# Accepted values are: +:day+.
|
20
|
-
# @return [Hash<Date, Float>] if grouped by day, the $1 of the video
|
15
|
+
# @!macro [new] report_with_day
|
16
|
+
# @return [Hash<Date, Float>] if grouped by day, the $1
|
21
17
|
# for each day in the time-range.
|
22
|
-
# @example Get the
|
23
|
-
#
|
18
|
+
# @example Get the $1 for each day of last week:
|
19
|
+
# resource.$1 since: 2.weeks.ago, until: 1.week.ago, by: :day
|
24
20
|
# # => {Wed, 8 May 2014 => 12.0, Thu, 9 May 2014 => 34.2, …}
|
25
21
|
# @macro report
|
26
22
|
|
27
|
-
# @!macro [new]
|
23
|
+
# @!macro [new] report_by_day
|
28
24
|
# @option options [Symbol] :by (:day) The dimension to collect $1 by.
|
29
|
-
# Accepted values are: +:day
|
30
|
-
#
|
31
|
-
|
32
|
-
#
|
33
|
-
# @example Get the video’s $1 for each day of last week:
|
34
|
-
# video.$1 since: 2.weeks.ago, until: 1.week.ago, by: :day
|
35
|
-
# # => {Wed, 8 May 2014 => 12.0, Thu, 9 May 2014 => 34.2, …}
|
36
|
-
# @return [Hash<Symbol, Float>] if grouped by traffic source, the
|
37
|
-
# $1 of the video for each traffic source.
|
38
|
-
# @example Get yesterday’s video’s $1 grouped by traffic source:
|
39
|
-
# video.$1 from: 1.day.ago, to: 1.day.ago, by: :traffic_source
|
40
|
-
# # => {advertising: 53.0, channel: 7.0, …}
|
25
|
+
# Accepted values are: +:day+.
|
26
|
+
# @macro report_with_day
|
27
|
+
|
28
|
+
# @!macro [new] report_with_video_dimensions
|
41
29
|
# @return [Hash<Symbol, Float>] if grouped by playback location, the
|
42
|
-
# $1
|
43
|
-
# @example Get yesterday’s
|
44
|
-
#
|
30
|
+
# $1 for each traffic playback location.
|
31
|
+
# @example Get yesterday’s $1 grouped by playback location:
|
32
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :playback_location
|
45
33
|
# # => {embedded: 53.0, watch: 467.0, …}
|
34
|
+
# @return [Hash<Yt::Video, Float>] if grouped by related video, the
|
35
|
+
# $1 for each related video.
|
36
|
+
# @example Get yesterday’s $1 by related video:
|
37
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :related_video
|
38
|
+
# # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
|
39
|
+
# @return [Hash<Yt::Video, Float>] if grouped by device type, the
|
40
|
+
# $1 for each device type.
|
41
|
+
# @example Get yesterday’s $1 by device type:
|
42
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :device_type
|
43
|
+
# # => {mobile: 133.0, tv: 412.0, …}
|
44
|
+
# @return [Hash<Yt::Video, Float>] if grouped by traffic source, the
|
45
|
+
# $1 for each traffic source.
|
46
|
+
# @example Get yesterday’s $1 by traffic source:
|
47
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :traffic_source
|
48
|
+
# # => {advertising: 543.0, playlist: 92.0, …}
|
49
|
+
# @macro report_with_day
|
50
|
+
|
51
|
+
# @!macro [new] report_by_video_dimensions
|
52
|
+
# @option options [Symbol] :by (:day) The dimension to collect $1 by.
|
53
|
+
# Accepted values are: +:day+, +:traffic_source+,
|
54
|
+
# +:playback_location+, +:related_video+, +:embedded_player_location+.
|
46
55
|
# @return [Hash<Symbol, Float>] if grouped by embedded player location,
|
47
|
-
# the $1
|
48
|
-
# @example Get yesterday’s
|
49
|
-
#
|
56
|
+
# the $1 for each embedded player location.
|
57
|
+
# @example Get yesterday’s $1 by embedded player location:
|
58
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :embedded_player_location
|
50
59
|
# # => {"fullscreen.net" => 92.0, "yahoo.com" => 14.0, …}
|
51
|
-
# @
|
52
|
-
|
53
|
-
#
|
54
|
-
#
|
60
|
+
# @macro report_with_video_dimensions
|
61
|
+
|
62
|
+
# @!macro [new] report_with_channel_dimensions
|
63
|
+
# @return [Hash<Yt::Video, Float>] if grouped by video, the
|
64
|
+
# $1 for each video.
|
65
|
+
# @example Get yesterday’s $1 by video:
|
66
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :video
|
55
67
|
# # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
|
56
|
-
# @
|
68
|
+
# @return [Hash<Yt::Video, Float>] if grouped by playlist, the
|
69
|
+
# $1 for each playlist.
|
70
|
+
# @example Get yesterday’s $1 by playlist:
|
71
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :playlist
|
72
|
+
# # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
|
73
|
+
# @macro report_with_video_dimensions
|
74
|
+
|
75
|
+
# @!macro [new] report_by_channel_dimensions
|
76
|
+
# @option options [Symbol] :by (:day) The dimension to collect $1 by.
|
77
|
+
# Accepted values are: +:day+, +:traffic_source+,
|
78
|
+
# +:playback_location+, +:related_video+, +:video+,
|
79
|
+
# +:playlist+, +:embedded_player_location+.
|
80
|
+
# @return [Hash<Symbol, Float>] if grouped by embedded player location,
|
81
|
+
# the $1 for each embedded player location.
|
82
|
+
# @example Get yesterday’s $1 by embedded player location:
|
83
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :embedded_player_location
|
84
|
+
# # => {"fullscreen.net" => 92.0, "yahoo.com" => 14.0, …}
|
85
|
+
# @macro report_with_channel_dimensions
|
86
|
+
|
87
|
+
# @!macro [new] report_by_playlist_dimensions
|
88
|
+
# @option options [Symbol] :by (:day) The dimension to collect $1 by.
|
89
|
+
# Accepted values are: +:day+, +:traffic_source+,
|
90
|
+
# +:playback_location+, +:related_video+, +:video+,
|
91
|
+
# +:playlist+.
|
92
|
+
# @macro report_with_channel_dimensions
|
57
93
|
|
58
|
-
# @!macro [new]
|
94
|
+
# @!macro [new] report_by_gender_and_age_group
|
59
95
|
# @option options [Symbol] :by (:gender_age_group) The dimension to
|
60
96
|
# show viewer percentage by.
|
61
97
|
# Accepted values are: +:gender+, +:age_group+, +:gender_age_group+.
|
62
|
-
# @return [Hash<Symbol, Float>] if grouped by gender, the
|
98
|
+
# @return [Hash<Symbol, Float>] if grouped by gender, the
|
63
99
|
# viewer percentage by gender.
|
64
|
-
# @example Get yesterday’s
|
65
|
-
#
|
100
|
+
# @example Get yesterday’s viewer percentage by gender:
|
101
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :gender
|
66
102
|
# # => {female: 53.0, male: 47.0}
|
67
|
-
# @return [Hash<String, Float>] if grouped by age group, the
|
103
|
+
# @return [Hash<String, Float>] if grouped by age group, the
|
68
104
|
# viewer percentage by age group.
|
69
|
-
# @example Get yesterday’s
|
70
|
-
#
|
105
|
+
# @example Get yesterday’s $1 grouped by age group:
|
106
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago, by: :age_group
|
71
107
|
# # => {"18-24" => 4.54, "35-24" => 12.31, "45-34" => 8.92, …}
|
72
108
|
# @return [Hash<Symbol, [Hash<String, Float>]>] if grouped by gender
|
73
|
-
# and age group, the
|
74
|
-
# @example Get yesterday’s
|
75
|
-
#
|
109
|
+
# and age group, the viewer percentage by gender/age group.
|
110
|
+
# @example Get yesterday’s $1 by gender and age group:
|
111
|
+
# resource.$1 from: 1.day.ago, to: 1.day.ago
|
76
112
|
# # => {female: {"18-24" => 12.12, "25-34" => 16.16, …}, male:…}
|
77
113
|
# @macro report
|
78
114
|
|
data/lib/yt/models/annotation.rb
CHANGED
data/lib/yt/models/asset.rb
CHANGED
data/lib/yt/models/channel.rb
CHANGED
@@ -2,9 +2,90 @@ require 'yt/models/resource'
|
|
2
2
|
|
3
3
|
module Yt
|
4
4
|
module Models
|
5
|
-
#
|
5
|
+
# Provides methods to interact with YouTube channels.
|
6
6
|
# @see https://developers.google.com/youtube/v3/docs/channels
|
7
7
|
class Channel < Resource
|
8
|
+
|
9
|
+
### SNIPPET ###
|
10
|
+
|
11
|
+
# @!attribute [r] title
|
12
|
+
# @return [String] the channel’s title.
|
13
|
+
delegate :title, to: :snippet
|
14
|
+
|
15
|
+
# @!attribute [r] description
|
16
|
+
# @return [String] the channel’s description.
|
17
|
+
delegate :description, to: :snippet
|
18
|
+
|
19
|
+
# Returns the URL of the channel’s thumbnail.
|
20
|
+
# @!method thumbnail_url(size = :default)
|
21
|
+
# @param [Symbol, String] size The size of the channel’s thumbnail.
|
22
|
+
# @return [String] if +size+ is +default+, the URL of a 88x88px image.
|
23
|
+
# @return [String] if +size+ is +medium+, the URL of a 240x240px image.
|
24
|
+
# @return [String] if +size+ is +high+, the URL of a 800x800px image.
|
25
|
+
# @return [nil] if the +size+ is not +default+, +medium+ or +high+.
|
26
|
+
delegate :thumbnail_url, to: :snippet
|
27
|
+
|
28
|
+
# @!attribute [r] published_at
|
29
|
+
# @return [Time] the date and time that the channel was created.
|
30
|
+
delegate :published_at, to: :snippet
|
31
|
+
|
32
|
+
### SUBSCRIPTION ###
|
33
|
+
|
34
|
+
has_one :subscription
|
35
|
+
|
36
|
+
# @return [Boolean] whether the account is subscribed to the channel.
|
37
|
+
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} is not an
|
38
|
+
# authenticated Yt::Account.
|
39
|
+
def subscribed?
|
40
|
+
sleep [(@subscriptions_updated_at || Time.now) - Time.now, 0].max
|
41
|
+
subscription.exists?
|
42
|
+
rescue Errors::NoItems
|
43
|
+
false
|
44
|
+
end
|
45
|
+
|
46
|
+
# Subscribes the authenticated account to the channel.
|
47
|
+
# Unlike {#subscribe!}, does not raise an error if already subscribed.
|
48
|
+
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} is not an
|
49
|
+
# authenticated Yt::Account.
|
50
|
+
def subscribe
|
51
|
+
subscriptions.insert(ignore_errors: true).tap do |subscription|
|
52
|
+
throttle_subscriptions
|
53
|
+
@subscription = subscription
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Subscribes the authenticated account to the channel.
|
58
|
+
# Unlike {#subscribe}, raises an error if already subscribed.
|
59
|
+
# @raise [Yt::Errors::RequestError] if already subscribed.
|
60
|
+
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} is not an
|
61
|
+
# authenticated Yt::Account.
|
62
|
+
def subscribe!
|
63
|
+
subscriptions.insert.tap do |subscription|
|
64
|
+
throttle_subscriptions
|
65
|
+
@subscription = subscription
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Unsubscribes the authenticated account from the channel.
|
70
|
+
# Unlike {#unsubscribe!}, does not raise an error if already unsubscribed.
|
71
|
+
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} is not an
|
72
|
+
# authenticated Yt::Account.
|
73
|
+
def unsubscribe
|
74
|
+
unsubscribe! if subscribed?
|
75
|
+
end
|
76
|
+
|
77
|
+
# Unsubscribes the authenticated account from the channel.
|
78
|
+
# Unlike {#unsubscribe}, raises an error if already unsubscribed.
|
79
|
+
#
|
80
|
+
# @raise [Yt::Errors::RequestError] if already unsubscribed.
|
81
|
+
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} is not an
|
82
|
+
# authenticated Yt::Account.
|
83
|
+
def unsubscribe!
|
84
|
+
subscription.delete.tap{ throttle_subscriptions }
|
85
|
+
end
|
86
|
+
|
87
|
+
### ASSOCIATIONS ###
|
88
|
+
|
8
89
|
# @!attribute [r] videos
|
9
90
|
# @return [Yt::Collections::Videos] the channel’s videos.
|
10
91
|
has_many :videos
|
@@ -13,168 +94,154 @@ module Yt
|
|
13
94
|
# @return [Yt::Collections::Playlists] the channel’s playlists.
|
14
95
|
has_many :playlists
|
15
96
|
|
16
|
-
#
|
17
|
-
|
97
|
+
# @!attribute [r] subscribed_channels
|
98
|
+
# @return [Yt::Collections::SubscribedChannels] the channels that this
|
99
|
+
# channel is subscribed to.
|
100
|
+
# @raise [Yt::Errors::Forbidden] if the owner of the channel has
|
101
|
+
# explicitly select the option to keep all subscriptions private.
|
102
|
+
has_many :subscribed_channels
|
103
|
+
|
104
|
+
### ANALYTICS ###
|
18
105
|
|
19
|
-
# @macro
|
106
|
+
# @macro report_by_channel_dimensions
|
20
107
|
has_report :views
|
21
108
|
|
22
|
-
# @macro
|
109
|
+
# @macro report_by_channel_dimensions
|
110
|
+
has_report :estimated_minutes_watched
|
111
|
+
|
112
|
+
# @macro report_by_gender_and_age_group
|
113
|
+
has_report :viewer_percentage
|
114
|
+
|
115
|
+
# @macro report_by_day
|
23
116
|
has_report :comments
|
24
117
|
|
25
|
-
# @macro
|
118
|
+
# @macro report_by_day
|
26
119
|
has_report :likes
|
27
120
|
|
28
|
-
# @macro
|
121
|
+
# @macro report_by_day
|
29
122
|
has_report :dislikes
|
30
123
|
|
31
|
-
# @macro
|
124
|
+
# @macro report_by_day
|
32
125
|
has_report :shares
|
33
126
|
|
34
|
-
# @macro
|
127
|
+
# @macro report_by_day
|
35
128
|
has_report :subscribers_gained
|
36
129
|
|
37
|
-
# @macro
|
130
|
+
# @macro report_by_day
|
38
131
|
has_report :subscribers_lost
|
39
132
|
|
40
|
-
# @macro
|
133
|
+
# @macro report_by_day
|
41
134
|
has_report :favorites_added
|
42
135
|
|
43
|
-
# @macro
|
136
|
+
# @macro report_by_day
|
44
137
|
has_report :favorites_removed
|
45
138
|
|
46
|
-
# @macro
|
47
|
-
has_report :estimated_minutes_watched
|
48
|
-
|
49
|
-
# @macro has_report
|
139
|
+
# @macro report_by_day
|
50
140
|
has_report :average_view_duration
|
51
141
|
|
52
|
-
# @macro
|
142
|
+
# @macro report_by_day
|
53
143
|
has_report :average_view_percentage
|
54
144
|
|
55
|
-
# @macro
|
56
|
-
has_report :impressions
|
57
|
-
|
58
|
-
# @macro has_report
|
59
|
-
has_report :monetized_playbacks
|
60
|
-
|
61
|
-
# @macro has_report
|
145
|
+
# @macro report_by_day
|
62
146
|
has_report :annotation_clicks
|
63
147
|
|
64
|
-
# @macro
|
148
|
+
# @macro report_by_day
|
65
149
|
has_report :annotation_click_through_rate
|
66
150
|
|
67
|
-
# @macro
|
151
|
+
# @macro report_by_day
|
68
152
|
has_report :annotation_close_rate
|
69
153
|
|
70
|
-
# @macro
|
71
|
-
has_report :
|
154
|
+
# @macro report_by_day
|
155
|
+
has_report :earnings
|
156
|
+
|
157
|
+
# @macro report_by_day
|
158
|
+
has_report :impressions
|
159
|
+
|
160
|
+
# @macro report_by_day
|
161
|
+
has_report :monetized_playbacks
|
162
|
+
|
163
|
+
### STATISTICS ###
|
72
164
|
|
73
|
-
# @!attribute [r] statistics_set
|
74
|
-
# @return [Yt::Models::StatisticsSet] the statistics for the video.
|
75
165
|
has_one :statistics_set
|
76
|
-
delegate :view_count, :comment_count, :video_count, :subscriber_count,
|
77
|
-
:subscriber_count_visible?, to: :statistics_set
|
78
166
|
|
79
|
-
# @!attribute [r]
|
80
|
-
#
|
81
|
-
|
82
|
-
has_one :content_owner_detail
|
83
|
-
delegate :content_owner, :linked_at, to: :content_owner_detail
|
167
|
+
# @!attribute [r] view_count
|
168
|
+
# @return [Integer] the number of times the channel has been viewed.
|
169
|
+
delegate :view_count, to: :statistics_set
|
84
170
|
|
85
|
-
# @!attribute [r]
|
86
|
-
#
|
87
|
-
|
88
|
-
# explicitly select the option to keep all subscriptions private.
|
89
|
-
has_many :subscribed_channels
|
171
|
+
# @!attribute [r] comment_count
|
172
|
+
# @return [Integer] the number of comments for the channel.
|
173
|
+
delegate :comment_count, to: :statistics_set
|
90
174
|
|
91
|
-
# @!attribute [r]
|
92
|
-
#
|
93
|
-
|
94
|
-
# subscribed to the channel.
|
95
|
-
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} does not
|
96
|
-
# return an authenticated account.
|
97
|
-
has_one :subscription
|
175
|
+
# @!attribute [r] video_count
|
176
|
+
# @return [Integer] the number of videos uploaded to the channel.
|
177
|
+
delegate :video_count, to: :statistics_set
|
98
178
|
|
99
|
-
#
|
100
|
-
#
|
101
|
-
|
102
|
-
super options
|
103
|
-
if options[:statistics]
|
104
|
-
@statistics_set = StatisticsSet.new data: options[:statistics]
|
105
|
-
end
|
106
|
-
end
|
179
|
+
# @!attribute [r] subscriber_count
|
180
|
+
# @return [Integer] the number of subscriber the channel has.
|
181
|
+
delegate :subscriber_count, to: :statistics_set
|
107
182
|
|
108
|
-
#
|
109
|
-
|
110
|
-
|
111
|
-
# authenticated instance of {Yt::Account}.
|
112
|
-
# @return [Boolean] whether the account is subscribed to the channel.
|
113
|
-
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} does not
|
114
|
-
# return an authenticated account.
|
115
|
-
def subscribed?
|
116
|
-
sleep [(@subscriptions_updated_at || Time.now) - Time.now, 0].max
|
117
|
-
subscription.exists?
|
118
|
-
rescue Errors::NoItems
|
119
|
-
false
|
183
|
+
# @return [Boolean] whether the number of subscribers is publicly visible.
|
184
|
+
def subscriber_count_visible?
|
185
|
+
statistics_set.hidden_subscriber_count == false
|
120
186
|
end
|
121
187
|
|
122
|
-
|
123
|
-
# Raises an error if the account was not subscribed.
|
124
|
-
#
|
125
|
-
# This method requires {Resource#auth auth} to return an
|
126
|
-
# authenticated instance of {Yt::Account}.
|
127
|
-
# @raise [Yt::Errors::RequestError] if {Resource#auth auth} was not
|
128
|
-
# subscribed to the channel.
|
129
|
-
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} does not
|
130
|
-
# return an authenticated account.
|
131
|
-
def unsubscribe!
|
132
|
-
subscription.delete.tap{ throttle_subscriptions }
|
133
|
-
end
|
188
|
+
### CONTENT OWNER DETAILS ###
|
134
189
|
|
135
|
-
|
136
|
-
# Does not raise an error if the account was not subscribed.
|
137
|
-
#
|
138
|
-
# This method requires {Resource#auth auth} to return an
|
139
|
-
# authenticated instance of {Yt::Account}.
|
140
|
-
# @raise [Yt::Errors::Unauthorized] if {Resource#auth auth} does not
|
141
|
-
# return an authenticated account.
|
142
|
-
def unsubscribe
|
143
|
-
unsubscribe! if subscribed?
|
144
|
-
end
|
190
|
+
has_one :content_owner_detail
|
145
191
|
|
146
|
-
#
|
147
|
-
#
|
148
|
-
#
|
149
|
-
#
|
150
|
-
#
|
151
|
-
# @raise [Yt::Errors::
|
152
|
-
#
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
192
|
+
# The name of the content owner linked to the channel.
|
193
|
+
# @!attribute [r] content_owner
|
194
|
+
# @return [String] if the channel is partnered, its content owner’s name.
|
195
|
+
# @return [nil] if the channel is not partnered or if {Resource#auth auth}
|
196
|
+
# is a content owner without permissions to administer the channel.
|
197
|
+
# @raise [Yt::Errors::Forbidden] if {Resource#auth auth} does not
|
198
|
+
# return an authenticated content owner.
|
199
|
+
delegate :content_owner, to: :content_owner_detail
|
200
|
+
|
201
|
+
# Returns the time the channel was partnered to a content owner.
|
202
|
+
# @return [Time] if the channel is partnered, the time when it was linked
|
203
|
+
# to its content owner.
|
204
|
+
# @return [nil] if the channel is not partnered or if {Resource#auth auth}
|
205
|
+
# is a content owner without permissions to administer the channel.
|
206
|
+
# @raise [Yt::Errors::Forbidden] if {Resource#auth auth} does not
|
207
|
+
# return an authenticated content owner.
|
208
|
+
def linked_at
|
209
|
+
content_owner_detail.time_linked
|
160
210
|
end
|
161
211
|
|
162
|
-
|
163
|
-
|
164
|
-
#
|
165
|
-
#
|
166
|
-
#
|
167
|
-
# @raise [Yt::Errors::
|
168
|
-
#
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
212
|
+
### ACTIONS (UPLOAD, UPDATE, DELETE) ###
|
213
|
+
|
214
|
+
# Deletes the channel’s playlists matching all the given attributes.
|
215
|
+
# @return [Array<Boolean>] whether each playlist matching the given
|
216
|
+
# attributes was deleted.
|
217
|
+
# @raise [Yt::Errors::RequestError] if {Resource#auth auth} is not an
|
218
|
+
# authenticated Yt::Account with permissions to update the channel.
|
219
|
+
# @param [Hash] attributes the attributes to match the playlists by.
|
220
|
+
# @option attributes [<String, Regexp>] :title The playlist’s title.
|
221
|
+
# Pass a String for perfect match or a Regexp for advanced match.
|
222
|
+
# @option attributes [<String, Regexp>] :description The playlist’s
|
223
|
+
# description. Pass a String (perfect match) or a Regexp (advanced).
|
224
|
+
# @option attributes [Array<String>] :tags The playlist’s tags.
|
225
|
+
# All tags must match exactly.
|
226
|
+
# @option attributes [String] :privacy_status The playlist’s privacy
|
227
|
+
# status.
|
228
|
+
def delete_playlists(attributes = {})
|
229
|
+
playlists.delete_all attributes
|
174
230
|
end
|
175
231
|
|
176
|
-
|
177
|
-
|
232
|
+
### PRIVATE API ###
|
233
|
+
|
234
|
+
# @private
|
235
|
+
# Override Resource's new to set statistics as well
|
236
|
+
# if the response includes them
|
237
|
+
def initialize(options = {})
|
238
|
+
super options
|
239
|
+
if options[:statistics]
|
240
|
+
@statistics_set = StatisticsSet.new data: options[:statistics]
|
241
|
+
end
|
242
|
+
if options[:content_owner_details]
|
243
|
+
@content_owner_detail = ContentOwnerDetail.new data: options[:content_owner_details]
|
244
|
+
end
|
178
245
|
end
|
179
246
|
|
180
247
|
# @private
|