yt 0.21.0 → 0.22.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/CHANGELOG.md +13 -0
  4. data/README.md +8 -461
  5. data/lib/yt/actions/base.rb +1 -0
  6. data/lib/yt/associations/has_attribute.rb +2 -0
  7. data/lib/yt/associations/has_authentication.rb +2 -0
  8. data/lib/yt/associations/has_many.rb +1 -0
  9. data/lib/yt/associations/has_one.rb +1 -0
  10. data/lib/yt/associations/has_reports.rb +24 -18
  11. data/lib/yt/collections/authentications.rb +1 -0
  12. data/lib/yt/collections/content_details.rb +1 -0
  13. data/lib/yt/collections/content_owner_details.rb +1 -0
  14. data/lib/yt/collections/file_details.rb +1 -0
  15. data/lib/yt/collections/ids.rb +1 -0
  16. data/lib/yt/collections/live_streaming_details.rb +1 -0
  17. data/lib/yt/collections/players.rb +1 -0
  18. data/lib/yt/collections/ratings.rb +1 -0
  19. data/lib/yt/collections/reports.rb +25 -16
  20. data/lib/yt/collections/resources.rb +1 -0
  21. data/lib/yt/collections/resumable_sessions.rb +1 -0
  22. data/lib/yt/collections/snippets.rb +1 -0
  23. data/lib/yt/collections/statistics_sets.rb +1 -0
  24. data/lib/yt/collections/statuses.rb +1 -0
  25. data/lib/yt/collections/subscriptions.rb +1 -0
  26. data/lib/yt/collections/user_infos.rb +1 -0
  27. data/lib/yt/models/account.rb +28 -26
  28. data/lib/yt/models/base.rb +1 -0
  29. data/lib/yt/models/channel.rb +38 -38
  30. data/lib/yt/models/content_detail.rb +1 -0
  31. data/lib/yt/models/content_owner_detail.rb +1 -0
  32. data/lib/yt/models/device_flow.rb +1 -0
  33. data/lib/yt/models/file_detail.rb +1 -0
  34. data/lib/yt/models/iterator.rb +1 -0
  35. data/lib/yt/models/live_streaming_detail.rb +1 -0
  36. data/lib/yt/models/player.rb +1 -0
  37. data/lib/yt/models/playlist.rb +19 -19
  38. data/lib/yt/models/playlist_item.rb +12 -12
  39. data/lib/yt/models/rating.rb +1 -0
  40. data/lib/yt/models/resource.rb +8 -2
  41. data/lib/yt/models/resumable_session.rb +1 -0
  42. data/lib/yt/models/snippet.rb +1 -0
  43. data/lib/yt/models/statistics_set.rb +1 -0
  44. data/lib/yt/models/status.rb +1 -6
  45. data/lib/yt/models/subscription.rb +1 -0
  46. data/lib/yt/models/timestamp.rb +1 -0
  47. data/lib/yt/models/url.rb +1 -0
  48. data/lib/yt/models/user_info.rb +1 -0
  49. data/lib/yt/models/video.rb +70 -70
  50. data/lib/yt/models/video_category.rb +1 -0
  51. data/lib/yt/request.rb +1 -0
  52. data/lib/yt/version.rb +1 -1
  53. data/spec/collections/reports_spec.rb +1 -1
  54. data/spec/requests/as_content_owner/channel_spec.rb +210 -14
  55. data/spec/requests/as_content_owner/playlist_spec.rb +68 -8
  56. data/spec/requests/as_content_owner/video_spec.rb +213 -16
  57. data/spec/requests/as_server_app/channel_spec.rb +27 -7
  58. data/spec/requests/as_server_app/playlist_spec.rb +25 -4
  59. data/spec/requests/as_server_app/video_spec.rb +26 -5
  60. metadata +1 -3
  61. data/spec/requests/as_server_app/resource_spec.rb +0 -46
@@ -13,11 +13,16 @@ module Yt
13
13
  # Also aliased as +:to+.
14
14
 
15
15
  # @!macro [new] report_with_day
16
- # @return [Hash<Date, Float>] if grouped by day, the $1
16
+ # @return [Hash<Date, $2>] if grouped by day, the $1
17
17
  # for each day in the time-range.
18
18
  # @example Get the $1 for each day of last week:
19
19
  # resource.$1 since: 2.weeks.ago, until: 1.week.ago, by: :day
20
20
  # # => {Wed, 8 May 2014 => 12.0, Thu, 9 May 2014 => 34.2, …}
21
+ # @return [Hash<Symbol, $2>] if grouped by range, the $1
22
+ # for the entire time-range (under the key +:total+).
23
+ # @example Get the $1 for the whole last week:
24
+ # resource.$1 since: 2.weeks.ago, until: 1.week.ago, by: :range
25
+ # # => {Wed, 8 May 2014..Tue, 14 May 2014 => 564.0,}
21
26
  # @macro report
22
27
 
23
28
  # @!macro [new] report_by_day
@@ -26,22 +31,22 @@ module Yt
26
31
  # @macro report_with_day
27
32
 
28
33
  # @!macro [new] report_with_video_dimensions
29
- # @return [Hash<Symbol, Float>] if grouped by playback location, the
34
+ # @return [Hash<Symbol, $2>] if grouped by playback location, the
30
35
  # $1 for each traffic playback location.
31
36
  # @example Get yesterday’s $1 grouped by playback location:
32
37
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :playback_location
33
38
  # # => {embedded: 53.0, watch: 467.0, …}
34
- # @return [Hash<Yt::Video, Float>] if grouped by related video, the
39
+ # @return [Hash<Yt::Video, $2>] if grouped by related video, the
35
40
  # $1 for each related video.
36
41
  # @example Get yesterday’s $1 by related video:
37
42
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :related_video
38
43
  # # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
39
- # @return [Hash<Yt::Video, Float>] if grouped by device type, the
44
+ # @return [Hash<Yt::Video, $2>] if grouped by device type, the
40
45
  # $1 for each device type.
41
46
  # @example Get yesterday’s $1 by device type:
42
47
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :device_type
43
48
  # # => {mobile: 133.0, tv: 412.0, …}
44
- # @return [Hash<Yt::Video, Float>] if grouped by traffic source, the
49
+ # @return [Hash<Yt::Video, $2>] if grouped by traffic source, the
45
50
  # $1 for each traffic source.
46
51
  # @example Get yesterday’s $1 by traffic source:
47
52
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :traffic_source
@@ -52,7 +57,7 @@ module Yt
52
57
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
53
58
  # Accepted values are: +:day+, +:traffic_source+,
54
59
  # +:playback_location+, +:related_video+, +:embedded_player_location+.
55
- # @return [Hash<Symbol, Float>] if grouped by embedded player location,
60
+ # @return [Hash<Symbol, $2>] if grouped by embedded player location,
56
61
  # the $1 for each embedded player location.
57
62
  # @example Get yesterday’s $1 by embedded player location:
58
63
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :embedded_player_location
@@ -60,12 +65,12 @@ module Yt
60
65
  # @macro report_with_video_dimensions
61
66
 
62
67
  # @!macro [new] report_with_channel_dimensions
63
- # @return [Hash<Yt::Video, Float>] if grouped by video, the
68
+ # @return [Hash<Yt::Video, $2>] if grouped by video, the
64
69
  # $1 for each video.
65
70
  # @example Get yesterday’s $1 by video:
66
71
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :video
67
72
  # # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
68
- # @return [Hash<Yt::Video, Float>] if grouped by playlist, the
73
+ # @return [Hash<Yt::Video, $2>] if grouped by playlist, the
69
74
  # $1 for each playlist.
70
75
  # @example Get yesterday’s $1 by playlist:
71
76
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :playlist
@@ -77,7 +82,7 @@ module Yt
77
82
  # Accepted values are: +:day+, +:traffic_source+,
78
83
  # +:playback_location+, +:related_video+, +:video+,
79
84
  # +:playlist+, +:embedded_player_location+.
80
- # @return [Hash<Symbol, Float>] if grouped by embedded player location,
85
+ # @return [Hash<Symbol, $2>] if grouped by embedded player location,
81
86
  # the $1 for each embedded player location.
82
87
  # @example Get yesterday’s $1 by embedded player location:
83
88
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :embedded_player_location
@@ -95,17 +100,17 @@ module Yt
95
100
  # @option options [Symbol] :by (:gender_age_group) The dimension to
96
101
  # show viewer percentage by.
97
102
  # Accepted values are: +:gender+, +:age_group+, +:gender_age_group+.
98
- # @return [Hash<Symbol, Float>] if grouped by gender, the
103
+ # @return [Hash<Symbol, $2>] if grouped by gender, the
99
104
  # viewer percentage by gender.
100
105
  # @example Get yesterday’s viewer percentage by gender:
101
106
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :gender
102
107
  # # => {female: 53.0, male: 47.0}
103
- # @return [Hash<String, Float>] if grouped by age group, the
108
+ # @return [Hash<String, $2>] if grouped by age group, the
104
109
  # viewer percentage by age group.
105
110
  # @example Get yesterday’s $1 grouped by age group:
106
111
  # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :age_group
107
112
  # # => {"18-24" => 4.54, "35-24" => 12.31, "45-34" => 8.92, …}
108
- # @return [Hash<Symbol, [Hash<String, Float>]>] if grouped by gender
113
+ # @return [Hash<Symbol, [Hash<String, $2>]>] if grouped by gender
109
114
  # and age group, the viewer percentage by gender/age group.
110
115
  # @example Get yesterday’s $1 by gender and age group:
111
116
  # resource.$1 from: 1.day.ago, to: 1.day.ago
@@ -115,16 +120,17 @@ module Yt
115
120
  # Defines two public instance methods to access the reports of a
116
121
  # resource for a specific metric.
117
122
  # @param [Symbol] metric the metric to access the reports of.
118
- # @example Adds +earnings+ and +earnings_on+ on a Channel resource.
123
+ # @param [Class] type The class to cast the returned values to.
124
+ # @example Adds +comments+ and +comments_on+ on a Channel resource.
119
125
  # class Channel < Resource
120
- # has_report :earnings
126
+ # has_report :comments, Integer
121
127
  # end
122
- def has_report(metric)
128
+ def has_report(metric, type)
123
129
  require 'yt/collections/reports'
124
130
 
125
131
  define_metric_on_method metric
126
132
  define_metric_method metric
127
- define_range_metric_method metric
133
+ define_range_metric_method metric, type
128
134
  define_all_metric_method metric
129
135
  end
130
136
 
@@ -157,11 +163,11 @@ module Yt
157
163
  end
158
164
  end
159
165
 
160
- def define_range_metric_method(metric)
166
+ def define_range_metric_method(metric, type)
161
167
  define_method "range_#{metric}" do |date_range, dimension|
162
168
  ivar = instance_variable_get "@range_#{metric}_#{dimension}"
163
169
  instance_variable_set "@range_#{metric}_#{dimension}", ivar || {}
164
- instance_variable_get("@range_#{metric}_#{dimension}")[date_range] ||= send("all_#{metric}").within date_range, dimension
170
+ instance_variable_get("@range_#{metric}_#{dimension}")[date_range] ||= send("all_#{metric}").within date_range, dimension, type
165
171
  end
166
172
  private "range_#{metric}"
167
173
  end
@@ -3,6 +3,7 @@ require 'yt/models/authentication'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Authentications < Base
7
8
  attr_accessor :auth_params
8
9
 
@@ -3,6 +3,7 @@ require 'yt/models/content_detail'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class ContentDetails < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/content_owner_detail'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class ContentOwnerDetails < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/file_detail'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class FileDetails < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/id'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Ids < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/live_streaming_detail'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class LiveStreamingDetails < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/player'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Players < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/rating'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Ratings < Base
7
8
 
8
9
  private
@@ -2,18 +2,20 @@ require 'yt/collections/base'
2
2
 
3
3
  module Yt
4
4
  module Collections
5
+ # @private
5
6
  class Reports < Base
6
- DIMENSIONS = Hash.new({name: 'day', parse: ->(day) {Date.iso8601 day} }).tap do |hash|
7
- hash[:traffic_source] = {name: 'insightTrafficSourceType', parse: ->(type) {TRAFFIC_SOURCES.key type} }
8
- hash[:playback_location] = {name: 'insightPlaybackLocationType', parse: ->(type) {PLAYBACK_LOCATIONS.key type} }
9
- hash[:embedded_player_location] = {name: 'insightPlaybackLocationDetail', parse: ->(url) {url} }
10
- hash[:related_video] = {name: 'insightTrafficSourceDetail', parse: ->(video_id) { Yt::Video.new id: video_id, auth: @auth } }
11
- hash[:video] = {name: 'video', parse: ->(video_id) { Yt::Video.new id: video_id, auth: @auth } }
12
- hash[:playlist] = {name: 'playlist', parse: ->(playlist_id) { Yt::Playlist.new id: playlist_id, auth: @auth } }
13
- hash[:device_type] = {name: 'deviceType', parse: ->(type) { type.downcase.to_sym } }
14
- hash[:gender_age_group] = {name: 'gender,ageGroup', parse: ->(gender) { gender.downcase.to_sym }}
15
- hash[:gender] = {name: 'gender', parse: ->(gender) { gender.downcase.to_sym } }
16
- hash[:age_group] = {name: 'ageGroup', parse: ->(age_group) { age_group[3..-1] } }
7
+ DIMENSIONS = Hash.new({name: 'day', parse: ->(day, *values) {[Date.iso8601(day), values.last]} }).tap do |hash|
8
+ hash[:range] = {parse: ->(*values) { [:total, values.last]} }
9
+ hash[:traffic_source] = {name: 'insightTrafficSourceType', parse: ->(source, value) {[TRAFFIC_SOURCES.key(source), value]} }
10
+ hash[:playback_location] = {name: 'insightPlaybackLocationType', parse: ->(location, value) {[PLAYBACK_LOCATIONS.key(location), value]} }
11
+ hash[:embedded_player_location] = {name: 'insightPlaybackLocationDetail', parse: ->(url, value) {[url, value]} }
12
+ hash[:related_video] = {name: 'insightTrafficSourceDetail', parse: ->(video_id, value) { [Yt::Video.new(id: video_id, auth: @auth), value] } }
13
+ hash[:video] = {name: 'video', parse: ->(video_id, value) { [Yt::Video.new(id: video_id, auth: @auth), value] } }
14
+ hash[:playlist] = {name: 'playlist', parse: ->(playlist_id, value) { [Yt::Playlist.new(id: playlist_id, auth: @auth), value] } }
15
+ hash[:device_type] = {name: 'deviceType', parse: ->(type, value) { [type.downcase.to_sym, value] } }
16
+ hash[:gender_age_group] = {name: 'gender,ageGroup', parse: ->(gender, *values) { [gender.downcase.to_sym, *values] }}
17
+ hash[:gender] = {name: 'gender', parse: ->(gender, value) { [gender.downcase.to_sym, value] } }
18
+ hash[:age_group] = {name: 'ageGroup', parse: ->(age_group, value) { [age_group[3..-1], value] } }
17
19
  end
18
20
 
19
21
  # @see https://developers.google.com/youtube/analytics/v1/dimsmets/dims#Traffic_Source_Dimensions
@@ -46,7 +48,7 @@ module Yt
46
48
 
47
49
  attr_writer :metric
48
50
 
49
- def within(days_range, dimension, try_again = true)
51
+ def within(days_range, dimension, type, try_again = true)
50
52
  @days_range = days_range
51
53
  @dimension = dimension
52
54
  if dimension == :gender_age_group # array of array
@@ -54,7 +56,7 @@ module Yt
54
56
  each{|gender, age_group, value| hash[gender][age_group[3..-1]] = value}
55
57
  end
56
58
  else
57
- Hash[*flat_map{|value| [value.first, value.last]}]
59
+ Hash[*flat_map{|value| [value.first, type_cast(value.last, type)]}]
58
60
  end
59
61
  # NOTE: Once in a while, YouTube responds with 400 Error and the message
60
62
  # "Invalid query. Query did not conform to the expectations."; in this
@@ -63,13 +65,20 @@ module Yt
63
65
  # same query is a workaround that works and can hardly cause any damage.
64
66
  # Similarly, once in while YouTube responds with a random 503 error.
65
67
  rescue Yt::Error => e
66
- try_again && rescue?(e) ? sleep(3) && within(days_range, dimension, false) : raise
68
+ try_again && rescue?(e) ? sleep(3) && within(days_range, dimension, type, false) : raise
67
69
  end
68
70
 
69
71
  private
70
72
 
73
+ def type_cast(value, type)
74
+ case [type]
75
+ when [Integer] then value.to_i if value
76
+ when [Float] then value.to_f if value
77
+ end
78
+ end
79
+
71
80
  def new_item(data)
72
- [instance_exec(data.first, &DIMENSIONS[@dimension][:parse]), *data[1..-1]]
81
+ instance_exec *data, &DIMENSIONS[@dimension][:parse]
73
82
  end
74
83
 
75
84
  # @see https://developers.google.com/youtube/analytics/v1/content_owner_reports
@@ -86,7 +95,7 @@ module Yt
86
95
  params['start-date'] = @days_range.begin
87
96
  params['end-date'] = @days_range.end
88
97
  params['metrics'] = @metric.to_s.camelize(:lower)
89
- params['dimensions'] = DIMENSIONS[@dimension][:name]
98
+ params['dimensions'] = DIMENSIONS[@dimension][:name] unless @dimension == :range
90
99
  params['max-results'] = 10 if @dimension == :video
91
100
  params['max-results'] = 200 if @dimension == :playlist
92
101
  params['max-results'] = 25 if @dimension == :embedded_player_location
@@ -3,6 +3,7 @@ require 'yt/collections/base'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Resources < Base
7
8
  def delete_all(params = {})
8
9
  do_delete_all params
@@ -3,6 +3,7 @@ require 'yt/models/resumable_session'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  # Provides methods to upload videos with the resumable upload protocol.
7
8
  #
8
9
  # Resources with resumable sessions are: {Yt::Models::Account accounts}.
@@ -3,6 +3,7 @@ require 'yt/models/snippet'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Snippets < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/statistics_set'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class StatisticsSets < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/status'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Statuses < Base
7
8
 
8
9
  private
@@ -3,6 +3,7 @@ require 'yt/models/subscription'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class Subscriptions < Base
7
8
 
8
9
  def insert(options = {})
@@ -3,6 +3,7 @@ require 'yt/models/user_info'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
+ # @private
6
7
  class UserInfos < Base
7
8
 
8
9
  private
@@ -12,11 +12,11 @@ module Yt
12
12
  has_one :user_info
13
13
 
14
14
  # @!attribute [r] id
15
- # @return [String] the (Google+) account’s ID.
15
+ # @return [String] the (Google+) account’s ID.
16
16
  delegate :id, to: :user_info
17
17
 
18
18
  # @!attribute [r] email
19
- # @return [String] the account’s email address.
19
+ # @return [String] the account’s email address.
20
20
  delegate :email, to: :user_info
21
21
 
22
22
  # @return [Boolean] whether the email address is verified.
@@ -25,15 +25,15 @@ module Yt
25
25
  end
26
26
 
27
27
  # @!attribute [r] name
28
- # @return [String] the account’s full name.
28
+ # @return [String] the account’s full name.
29
29
  delegate :name, to: :user_info
30
30
 
31
31
  # @!attribute [r] given_name
32
- # @return [String] the user’s given (first) name.
32
+ # @return [String] the user’s given (first) name.
33
33
  delegate :given_name, to: :user_info
34
34
 
35
35
  # @!attribute [r] family_name
36
- # @return [String] the user’s family (last) name.
36
+ # @return [String] the user’s family (last) name.
37
37
  delegate :family_name, to: :user_info
38
38
 
39
39
  # @return [String] the URL of the account’s (Google +) profile page.
@@ -97,27 +97,29 @@ module Yt
97
97
  playlists.insert params
98
98
  end
99
99
 
100
- # Deletes the account’s playlists matching all the given attributes.
101
- # @return [Array<Boolean>] whether each playlist matching the given
102
- # attributes was deleted.
103
- # @param [Hash] attributes the attributes to match the playlists by.
104
- # @option attributes [<String, Regexp>] :title The playlist’s title.
105
- # Pass a String for perfect match or a Regexp for advanced match.
106
- # @option attributes [<String, Regexp>] :description The playlist’s
107
- # description. Pass a String (perfect match) or a Regexp (advanced).
108
- # @option attributes [Array<String>] :tags The playlist’s tags.
109
- # All tags must match exactly.
110
- # @option attributes [String] :privacy_status The playlist’s privacy
111
- # status.
100
+ # @!method delete_playlists(attributes = {})
101
+ # Deletes the account’s playlists matching all the given attributes.
102
+ # @return [Array<Boolean>] whether each playlist matching the given
103
+ # attributes was deleted.
104
+ # @param [Hash] attributes the attributes to match the playlists by.
105
+ # @option attributes [<String, Regexp>] :title The playlist’s title.
106
+ # Pass a String for perfect match or a Regexp for advanced match.
107
+ # @option attributes [<String, Regexp>] :description The playlist’s
108
+ # description. Pass a String (perfect match) or a Regexp (advanced).
109
+ # @option attributes [Array<String>] :tags The playlist’s tags.
110
+ # All tags must match exactly.
111
+ # @option attributes [String] :privacy_status The playlist’s privacy
112
+ # status.
112
113
  delegate :delete_playlists, to: :channel
113
114
 
114
115
  ### CONTENT OWNERS ###
115
116
 
116
117
  # @!attribute [r] content_owners
117
- # @return [Yt::Collections::ContentOwners] the content owners that
118
- # the account can manage.
118
+ # @return [Yt::Collections::ContentOwners] the content owners that
119
+ # the account can manage.
119
120
  has_many :content_owners
120
121
 
122
+ # The name of the content owner managing the account.
121
123
  # @return [String] name of the CMS account, if the account is partnered.
122
124
  # @return [nil] if the account is not a partnered content owner.
123
125
  attr_reader :owner_name
@@ -125,16 +127,16 @@ module Yt
125
127
  ### ASSOCIATIONS ###
126
128
 
127
129
  # @!attribute [r] channel
128
- # @return [Yt::Model::Channel] the YouTube channel of the account.
130
+ # @return [Yt::Models::Channel] the YouTube channel of the account.
129
131
  has_one :channel
130
132
 
131
133
  # @!attribute [r] playlists
132
- # @return [Yt::Collections::Playlists] the playlists owned by the account.
134
+ # @return [Yt::Collections::Playlists] the playlists owned by the account.
133
135
  delegate :playlists, to: :channel
134
136
 
135
137
  # @!attribute [r] subscribed_channels
136
- # @return [Yt::Collections::SubscribedChannels] the channels that the
137
- # account is subscribed to.
138
+ # @return [Yt::Collections::SubscribedChannels] the channels that the
139
+ # account is subscribed to.
138
140
  delegate :subscribed_channels, to: :channel
139
141
 
140
142
  # @!attribute [r] videos
@@ -142,12 +144,12 @@ module Yt
142
144
  has_many :videos
143
145
 
144
146
  # @!attribute [r] subscribers
145
- # @return [Yt::Collections::Subscribers] the channels subscribed to
146
- # the account’s channel.
147
+ # @return [Yt::Collections::Subscribers] the channels subscribed to
148
+ # the account’s channel.
147
149
  has_many :subscribers
148
150
 
149
- # @private
150
151
  # @!attribute [r] resumable_sessions
152
+ # @private
151
153
  # @return [Yt::Collections::ResumableSessions] the sessions used to
152
154
  # upload videos using the resumable upload protocol.
153
155
  has_many :resumable_sessions
@@ -12,6 +12,7 @@ require 'yt/errors/request_error'
12
12
 
13
13
  module Yt
14
14
  module Models
15
+ # @private
15
16
  class Base
16
17
  include Actions::Delete
17
18
  include Actions::Update
@@ -9,24 +9,24 @@ module Yt
9
9
  ### SNIPPET ###
10
10
 
11
11
  # @!attribute [r] title
12
- # @return [String] the channel’s title.
12
+ # @return [String] the channel’s title.
13
13
  delegate :title, to: :snippet
14
14
 
15
15
  # @!attribute [r] description
16
- # @return [String] the channel’s description.
16
+ # @return [String] the channel’s description.
17
17
  delegate :description, to: :snippet
18
18
 
19
- # Returns the URL of the channel’s thumbnail.
20
19
  # @!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+.
20
+ # Returns the URL of the channel’s thumbnail.
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
26
  delegate :thumbnail_url, to: :snippet
27
27
 
28
28
  # @!attribute [r] published_at
29
- # @return [Time] the date and time that the channel was created.
29
+ # @return [Time] the date and time that the channel was created.
30
30
  delegate :published_at, to: :snippet
31
31
 
32
32
  ### SUBSCRIPTION ###
@@ -104,80 +104,80 @@ module Yt
104
104
  ### ANALYTICS ###
105
105
 
106
106
  # @macro report_by_channel_dimensions
107
- has_report :views
107
+ has_report :views, Integer
108
108
 
109
109
  # @macro report_by_channel_dimensions
110
- has_report :estimated_minutes_watched
110
+ has_report :estimated_minutes_watched, Float
111
111
 
112
112
  # @macro report_by_gender_and_age_group
113
- has_report :viewer_percentage
113
+ has_report :viewer_percentage, Float
114
114
 
115
115
  # @macro report_by_day
116
- has_report :comments
116
+ has_report :comments, Integer
117
117
 
118
118
  # @macro report_by_day
119
- has_report :likes
119
+ has_report :likes, Integer
120
120
 
121
121
  # @macro report_by_day
122
- has_report :dislikes
122
+ has_report :dislikes, Integer
123
123
 
124
124
  # @macro report_by_day
125
- has_report :shares
125
+ has_report :shares, Integer
126
126
 
127
127
  # @macro report_by_day
128
- has_report :subscribers_gained
128
+ has_report :subscribers_gained, Integer
129
129
 
130
130
  # @macro report_by_day
131
- has_report :subscribers_lost
131
+ has_report :subscribers_lost, Integer
132
132
 
133
133
  # @macro report_by_day
134
- has_report :favorites_added
134
+ has_report :favorites_added, Integer
135
135
 
136
136
  # @macro report_by_day
137
- has_report :favorites_removed
137
+ has_report :favorites_removed, Integer
138
138
 
139
139
  # @macro report_by_day
140
- has_report :average_view_duration
140
+ has_report :average_view_duration, Float
141
141
 
142
142
  # @macro report_by_day
143
- has_report :average_view_percentage
143
+ has_report :average_view_percentage, Float
144
144
 
145
145
  # @macro report_by_day
146
- has_report :annotation_clicks
146
+ has_report :annotation_clicks, Integer
147
147
 
148
148
  # @macro report_by_day
149
- has_report :annotation_click_through_rate
149
+ has_report :annotation_click_through_rate, Float
150
150
 
151
151
  # @macro report_by_day
152
- has_report :annotation_close_rate
152
+ has_report :annotation_close_rate, Float
153
153
 
154
154
  # @macro report_by_day
155
- has_report :earnings
155
+ has_report :earnings, Float
156
156
 
157
157
  # @macro report_by_day
158
- has_report :impressions
158
+ has_report :impressions, Integer
159
159
 
160
160
  # @macro report_by_day
161
- has_report :monetized_playbacks
161
+ has_report :monetized_playbacks, Integer
162
162
 
163
163
  ### STATISTICS ###
164
164
 
165
165
  has_one :statistics_set
166
166
 
167
167
  # @!attribute [r] view_count
168
- # @return [Integer] the number of times the channel has been viewed.
168
+ # @return [Integer] the number of times the channel has been viewed.
169
169
  delegate :view_count, to: :statistics_set
170
170
 
171
171
  # @!attribute [r] comment_count
172
- # @return [Integer] the number of comments for the channel.
172
+ # @return [Integer] the number of comments for the channel.
173
173
  delegate :comment_count, to: :statistics_set
174
174
 
175
175
  # @!attribute [r] video_count
176
- # @return [Integer] the number of videos uploaded to the channel.
176
+ # @return [Integer] the number of videos uploaded to the channel.
177
177
  delegate :video_count, to: :statistics_set
178
178
 
179
179
  # @!attribute [r] subscriber_count
180
- # @return [Integer] the number of subscriber the channel has.
180
+ # @return [Integer] the number of subscriber the channel has.
181
181
  delegate :subscriber_count, to: :statistics_set
182
182
 
183
183
  # @return [Boolean] whether the number of subscribers is publicly visible.
@@ -189,13 +189,13 @@ module Yt
189
189
 
190
190
  has_one :content_owner_detail
191
191
 
192
- # The name of the content owner linked to the channel.
193
192
  # @!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.
193
+ # The name of the content owner linked to the channel.
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
199
  delegate :content_owner, to: :content_owner_detail
200
200
 
201
201
  # Returns the time the channel was partnered to a content owner.
@@ -2,6 +2,7 @@ require 'yt/models/base'
2
2
 
3
3
  module Yt
4
4
  module Models
5
+ # @private
5
6
  # Encapsulates information about the video content, including the length
6
7
  # of the video and an indication of whether captions are available.
7
8
  # @see https://developers.google.com/youtube/v3/docs/videos#resource
@@ -2,6 +2,7 @@ require 'yt/models/base'
2
2
 
3
3
  module Yt
4
4
  module Models
5
+ # @private
5
6
  # Encapsulates channel data that is relevant for YouTube Partners linked
6
7
  # with the channel.
7
8
  # @see https://developers.google.com/youtube/v3/docs/channels#contentOwnerDetails