yt 0.22.1 → 0.22.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5756c73d548ca942b1ea77046632204c4bd571c0
4
- data.tar.gz: 3dc5604dc683f5207397a8438a89753e11f77104
3
+ metadata.gz: 2e80b3bef680e2c1352adc07802719b9721cb49b
4
+ data.tar.gz: 794761dff30b57acb13261d180e68c61a52792e6
5
5
  SHA512:
6
- metadata.gz: 6db2497ab1f4e7fa497d1dcaa5ec259a8623e09b03758ad1db84009a06a7c40bf27e1abcb70118cf5e6e475b63e4004883bde843fd09539f48ddad79b55e1481
7
- data.tar.gz: 4f559c21aa27f9feb93ccfa2eaefc05530c5dc0956c3b7b52eae95cfb09296e4f1eba4585bc9d4f54c92bfdf16db97d74cce7c305fec6cd62c595aa5eba9a7a5
6
+ metadata.gz: c5b1dc5b9561f1f3645f762ae0a532f38606f6fcff7d989465a6f0eef11a253ad268f573285b5491f45d84de67309f081ca393fc55b24b67549a9913624521ee
7
+ data.tar.gz: 26d7305449a311a6ca0e04b62d33be2c6d114879dab273b995db20e34d1e52c1621f2d255b6d495f4d94c7e32d406a0dc7fc3a32f229b437f1f2f2eb36418403
@@ -6,6 +6,12 @@ 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.22.2 - 2015-05-15
10
+
11
+ * [FEATURE] New `by: :search_term` option for reports.
12
+ * [FEATURE] New `in: {state: 'XX'}` option to limit reports to a US state
13
+ * [FEATURE] New `uniques by: :day` report
14
+
9
15
  ## 0.22.1 - 2015-05-13
10
16
 
11
17
  * [FEATURE] New `by: :country` option for channel, video and playlist reports
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.22.1'
44
+ gem 'yt', '~> 0.22.2'
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*)
@@ -17,84 +17,129 @@ module Yt
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
- # # => {Wed, 8 May 2014 => 12.0, Thu, 9 May 2014 => 34.2, …}
20
+ # # => {Wed, 8 May 2014 => 12.0, Thu, 9 May 2014 => 34.0, …}
21
+ # @macro report
22
+
23
+ # @!macro [new] report_with_range
21
24
  # @return [Hash<Symbol, $2>] if grouped by range, the $1
22
25
  # for the entire time-range (under the key +:total+).
23
26
  # @example Get the $1 for the whole last week:
24
27
  # resource.$1 since: 2.weeks.ago, until: 1.week.ago, by: :range
25
28
  # # => {total: 564.0}
26
- # @macro report
29
+
30
+ # @!macro [new] report_with_country
31
+ # @option options [<String, Hash>] :in The country to limit the $1
32
+ # to. Can either be the two-letter ISO-3166-1 code of a country, such
33
+ # as +"US"+, or a Hash with the code in the +:country+ key, such
34
+ # as +{country: "US"}+.
35
+ # @example Get the $1 for the whole last week in France only:
36
+ # resource.$1 since: 2.weeks.ago, until: 1.week.ago, by: :range, in: 'FR'
37
+ # # => {total: 44.0}
38
+
39
+ # @!macro [new] report_with_country_and_state
40
+ # @option options [<String, Hash>] :in The location to limit the $1
41
+ # to. Can either be the two-letter ISO-3166-1 code of a country, such
42
+ # as +"US"+, or a Hash that either contains the +:country+ key, such
43
+ # as +{country: "US"}+ or the +:state+ key, such as +{state: "TX"}+.
44
+ # Note that YouTube API only provides data for US states.
45
+ # @example Get the $1 for the whole last week in Texas only:
46
+ # resource.$1 since: 2.weeks.ago, until: 1.week.ago, by: :range, in: {state: 'TX'}
47
+ # # => {total: 19.0}
27
48
 
28
49
  # @!macro [new] report_by_day
29
50
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
30
51
  # Accepted values are: +:day+.
31
52
  # @macro report_with_day
32
53
 
54
+ # @!macro [new] report_by_day_and_country
55
+ # @option options [Symbol] :by (:day) The dimension to collect $1 by.
56
+ # Accepted values are: +:day+, :+range+.
57
+ # @macro report_with_day
58
+ # @macro report_with_range
59
+ # @macro report_with_country
60
+
61
+ # @!macro [new] report_by_day_and_state
62
+ # @option options [Symbol] :by (:day) The dimension to collect $1 by.
63
+ # Accepted values are: +:day+, :+range+.
64
+ # @macro report_with_day
65
+ # @macro report_with_range
66
+ # @macro report_with_country_and_state
67
+
33
68
  # @!macro [new] report_with_video_dimensions
34
69
  # @return [Hash<Symbol, $2>] if grouped by playback location, the
35
70
  # $1 for each traffic playback location.
36
71
  # @example Get yesterday’s $1 grouped by playback location:
37
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :playback_location
72
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :playback_location
38
73
  # # => {embedded: 53.0, watch: 467.0, …}
39
74
  # @return [Hash<Yt::Video, $2>] if grouped by related video, the
40
75
  # $1 for each related video.
41
76
  # @example Get yesterday’s $1 by related video:
42
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :related_video
77
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :related_video
43
78
  # # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
44
79
  # @return [Hash<Yt::Video, $2>] if grouped by device type, the
45
80
  # $1 for each device type.
81
+ # @example Get yesterday’s $1 by search term:
82
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :search_term
83
+ # # => {"fullscreen" => 33.0, "good music" => 12.0, …}
84
+ # @return [Hash<String, $2>] if grouped by search term, the
85
+ # $1 for each search term that led viewers to the content.
46
86
  # @example Get yesterday’s $1 by device type:
47
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :device_type
87
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :device_type
48
88
  # # => {mobile: 133.0, tv: 412.0, …}
49
89
  # @return [Hash<Yt::Video, $2>] if grouped by traffic source, the
50
90
  # $1 for each traffic source.
51
91
  # @example Get yesterday’s $1 by traffic source:
52
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :traffic_source
92
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :traffic_source
53
93
  # # => {advertising: 543.0, playlist: 92.0, …}
54
94
  # @macro report_with_day
95
+ # @macro report_with_range
55
96
 
56
97
  # @!macro [new] report_by_video_dimensions
57
98
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
58
- # Accepted values are: +:day+, +:traffic_source+,
59
- # +:playback_location+, +:related_video+, +:embedded_player_location+.
99
+ # Accepted values are: +:day+, +:range+, +:traffic_source+,
100
+ # +:search_term+, +:playback_location+, +:related_video+,
101
+ # +:embedded_player_location+.
60
102
  # @return [Hash<Symbol, $2>] if grouped by embedded player location,
61
103
  # the $1 for each embedded player location.
62
104
  # @example Get yesterday’s $1 by embedded player location:
63
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :embedded_player_location
105
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :embedded_player_location
64
106
  # # => {"fullscreen.net" => 92.0, "yahoo.com" => 14.0, …}
65
107
  # @macro report_with_video_dimensions
108
+ # @macro report_with_country_and_state
66
109
 
67
110
  # @!macro [new] report_with_channel_dimensions
68
111
  # @return [Hash<Yt::Video, $2>] if grouped by video, the
69
112
  # $1 for each video.
70
113
  # @example Get yesterday’s $1 by video:
71
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :video
114
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :video
72
115
  # # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
73
116
  # @return [Hash<Yt::Video, $2>] if grouped by playlist, the
74
117
  # $1 for each playlist.
75
118
  # @example Get yesterday’s $1 by playlist:
76
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :playlist
119
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :playlist
77
120
  # # => {#<Yt::Video @id=…> => 33.0, #<Yt::Video @id=…> => 12.0, …}
78
121
  # @macro report_with_video_dimensions
79
122
 
80
123
  # @!macro [new] report_by_channel_dimensions
81
124
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
82
- # Accepted values are: +:day+, +:traffic_source+,
83
- # +:playback_location+, +:related_video+, +:video+,
125
+ # Accepted values are: +:day+, +:range+, +:traffic_source+,
126
+ # +:search_term+, +:playback_location+, +:related_video+, +:video+,
84
127
  # +:playlist+, +:embedded_player_location+.
85
128
  # @return [Hash<Symbol, $2>] if grouped by embedded player location,
86
129
  # the $1 for each embedded player location.
87
130
  # @example Get yesterday’s $1 by embedded player location:
88
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :embedded_player_location
131
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :embedded_player_location
89
132
  # # => {"fullscreen.net" => 92.0, "yahoo.com" => 14.0, …}
90
133
  # @macro report_with_channel_dimensions
134
+ # @macro report_with_country_and_state
91
135
 
92
136
  # @!macro [new] report_by_playlist_dimensions
93
137
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
94
- # Accepted values are: +:day+, +:traffic_source+,
138
+ # Accepted values are: +:day+, +:range+, +:traffic_source+,
95
139
  # +:playback_location+, +:related_video+, +:video+,
96
140
  # +:playlist+.
97
141
  # @macro report_with_channel_dimensions
142
+ # @macro report_with_country_and_state
98
143
 
99
144
  # @!macro [new] report_by_gender_and_age_group
100
145
  # @option options [Symbol] :by (:gender_age_group) The dimension to
@@ -103,19 +148,23 @@ module Yt
103
148
  # @return [Hash<Symbol, $2>] if grouped by gender, the
104
149
  # viewer percentage by gender.
105
150
  # @example Get yesterday’s viewer percentage by gender:
106
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :gender
151
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :gender
107
152
  # # => {female: 53.0, male: 47.0}
108
153
  # @return [Hash<String, $2>] if grouped by age group, the
109
154
  # viewer percentage by age group.
110
155
  # @example Get yesterday’s $1 grouped by age group:
111
- # resource.$1 from: 1.day.ago, to: 1.day.ago, by: :age_group
156
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, by: :age_group
112
157
  # # => {"18-24" => 4.54, "35-24" => 12.31, "45-34" => 8.92, …}
113
158
  # @return [Hash<Symbol, [Hash<String, $2>]>] if grouped by gender
114
159
  # and age group, the viewer percentage by gender/age group.
115
160
  # @example Get yesterday’s $1 by gender and age group:
116
- # resource.$1 from: 1.day.ago, to: 1.day.ago
161
+ # resource.$1 since: 1.day.ago, until: 1.day.ago
117
162
  # # => {female: {"18-24" => 12.12, "25-34" => 16.16, …}, male:…}
163
+ # @example Get yesterday’s $1 by gender and age group in France only:
164
+ # resource.$1 since: 1.day.ago, until: 1.day.ago, in: 'FR'
165
+ # # => {female: {"18-24" => 16.12, "25-34" => 13.16, …}, male:…}
118
166
  # @macro report
167
+ # @macro report_with_country_and_state
119
168
 
120
169
  # Defines two public instance methods to access the reports of a
121
170
  # resource for a specific metric.
@@ -148,29 +197,30 @@ module Yt
148
197
  to = options[:until] || options[:to] || (metric == :viewer_percentage ? Date.today : 1.day.ago)
149
198
  location = options[:in]
150
199
  country = location.is_a?(Hash) ? location[:country] : location
200
+ state = location[:state] if location.is_a?(Hash)
151
201
 
152
202
  range = Range.new *[from, to].map(&:to_date)
153
203
  dimension = options[:by] || (metric == :viewer_percentage ? :gender_age_group : :day)
154
204
 
155
- ivar = instance_variable_get "@#{metric}_#{dimension}_#{country}"
156
- instance_variable_set "@#{metric}_#{dimension}_#{country}", ivar || {}
205
+ ivar = instance_variable_get "@#{metric}_#{dimension}_#{country}_#{state}"
206
+ instance_variable_set "@#{metric}_#{dimension}_#{country}_#{state}", ivar || {}
157
207
 
158
208
  case dimension
159
209
  when :day
160
210
  Hash[*range.flat_map do |date|
161
- [date, instance_variable_get("@#{metric}_#{dimension}_#{country}")[date] ||= send("range_#{metric}", range, dimension, country)[date]]
211
+ [date, instance_variable_get("@#{metric}_#{dimension}_#{country}_#{state}")[date] ||= send("range_#{metric}", range, dimension, country, state)[date]]
162
212
  end]
163
213
  else
164
- instance_variable_get("@#{metric}_#{dimension}_#{country}")[range] ||= send("range_#{metric}", range, dimension, country)
214
+ instance_variable_get("@#{metric}_#{dimension}_#{country}_#{state}")[range] ||= send("range_#{metric}", range, dimension, country, state)
165
215
  end
166
216
  end
167
217
  end
168
218
 
169
219
  def define_range_metric_method(metric, type)
170
- define_method "range_#{metric}" do |date_range, dimension, country|
171
- ivar = instance_variable_get "@range_#{metric}_#{dimension}_#{country}"
172
- instance_variable_set "@range_#{metric}_#{dimension}_#{country}", ivar || {}
173
- instance_variable_get("@range_#{metric}_#{dimension}_#{country}")[date_range] ||= send("all_#{metric}").within date_range, country, dimension, type
220
+ define_method "range_#{metric}" do |date_range, dimension, country, state|
221
+ ivar = instance_variable_get "@range_#{metric}_#{dimension}_#{country}_#{state}"
222
+ instance_variable_set "@range_#{metric}_#{dimension}_#{country}_#{state}", ivar || {}
223
+ instance_variable_get("@range_#{metric}_#{dimension}_#{country}_#{state}")[date_range] ||= send("all_#{metric}").within date_range, country, state, dimension, type
174
224
  end
175
225
  private "range_#{metric}"
176
226
  end
@@ -10,6 +10,7 @@ module Yt
10
10
  hash[:playback_location] = {name: 'insightPlaybackLocationType', parse: ->(location, value) {[PLAYBACK_LOCATIONS.key(location), value]} }
11
11
  hash[:embedded_player_location] = {name: 'insightPlaybackLocationDetail', parse: ->(url, value) {[url, value]} }
12
12
  hash[:related_video] = {name: 'insightTrafficSourceDetail', parse: ->(video_id, value) { [Yt::Video.new(id: video_id, auth: @auth), value] } }
13
+ hash[:search_term] = {name: 'insightTrafficSourceDetail', parse: ->(search_term, value) { [search_term, value] } }
13
14
  hash[:video] = {name: 'video', parse: ->(video_id, value) { [Yt::Video.new(id: video_id, auth: @auth), value] } }
14
15
  hash[:playlist] = {name: 'playlist', parse: ->(playlist_id, value) { [Yt::Playlist.new(id: playlist_id, auth: @auth), value] } }
15
16
  hash[:device_type] = {name: 'deviceType', parse: ->(type, value) { [type.downcase.to_sym, value] } }
@@ -50,10 +51,11 @@ module Yt
50
51
 
51
52
  attr_writer :metric
52
53
 
53
- def within(days_range, country, dimension, type, try_again = true)
54
+ def within(days_range, country, state, dimension, type, try_again = true)
54
55
  @days_range = days_range
55
56
  @dimension = dimension
56
57
  @country = country
58
+ @state = state
57
59
  if dimension == :gender_age_group # array of array
58
60
  Hash.new{|h,k| h[k] = Hash.new 0.0}.tap do |hash|
59
61
  each{|gender, age_group, value| hash[gender][age_group[3..-1]] = value}
@@ -68,7 +70,7 @@ module Yt
68
70
  # same query is a workaround that works and can hardly cause any damage.
69
71
  # Similarly, once in while YouTube responds with a random 503 error.
70
72
  rescue Yt::Error => e
71
- try_again && rescue?(e) ? sleep(3) && within(days_range, dimension, type, false) : raise
73
+ try_again && rescue?(e) ? sleep(3) && within(days_range, country, state, dimension, type, false) : raise
72
74
  end
73
75
 
74
76
  private
@@ -101,14 +103,15 @@ module Yt
101
103
  params['dimensions'] = DIMENSIONS[@dimension][:name] unless @dimension == :range
102
104
  params['max-results'] = 10 if @dimension == :video
103
105
  params['max-results'] = 200 if @dimension == :playlist
104
- params['max-results'] = 25 if @dimension == :embedded_player_location
105
- params['max-results'] = 25 if @dimension == :related_video
106
- params['sort'] = "-#{@metric.to_s.camelize(:lower)}" if @dimension.in? [:video, :playlist, :embedded_player_location, :related_video]
107
- params[:filters] = ((params[:filters] || '').split(';') + ["country==US"]).compact.uniq.join(';') if @dimension == :state
108
- params[:filters] = ((params[:filters] || '').split(';') + ["country==#{@country}"]).compact.uniq.join(';') if @country
106
+ params['max-results'] = 25 if @dimension.in? [:embedded_player_location, :related_video, :search_term]
107
+ params['sort'] = "-#{@metric.to_s.camelize(:lower)}" if @dimension.in? [:video, :playlist, :embedded_player_location, :related_video, :search_term]
108
+ params[:filters] = ((params[:filters] || '').split(';') + ["country==US"]).compact.uniq.join(';') if @dimension == :state && !@state
109
+ params[:filters] = ((params[:filters] || '').split(';') + ["country==#{@country}"]).compact.uniq.join(';') if @country && !@state
110
+ params[:filters] = ((params[:filters] || '').split(';') + ["province==US-#{@state}"]).compact.uniq.join(';') if @state
109
111
  params[:filters] = ((params[:filters] || '').split(';') + ['isCurated==1']).compact.uniq.join(';') if @dimension == :playlist
110
112
  params[:filters] = ((params[:filters] || '').split(';') + ['insightPlaybackLocationType==EMBEDDED']).compact.uniq.join(';') if @dimension == :embedded_player_location
111
113
  params[:filters] = ((params[:filters] || '').split(';') + ['insightTrafficSourceType==RELATED_VIDEO']).compact.uniq.join(';') if @dimension == :related_video
114
+ params[:filters] = ((params[:filters] || '').split(';') + ['insightTrafficSourceType==YT_SEARCH']).compact.uniq.join(';') if @dimension == :search_term
112
115
  end
113
116
  end
114
117
 
@@ -106,58 +106,61 @@ module Yt
106
106
  # @macro report_by_channel_dimensions
107
107
  has_report :views, Integer
108
108
 
109
+ # @macro report_by_day
110
+ has_report :uniques, Integer
111
+
109
112
  # @macro report_by_channel_dimensions
110
113
  has_report :estimated_minutes_watched, Float
111
114
 
112
115
  # @macro report_by_gender_and_age_group
113
116
  has_report :viewer_percentage, Float
114
117
 
115
- # @macro report_by_day
118
+ # @macro report_by_day_and_country
116
119
  has_report :comments, Integer
117
120
 
118
- # @macro report_by_day
121
+ # @macro report_by_day_and_country
119
122
  has_report :likes, Integer
120
123
 
121
- # @macro report_by_day
124
+ # @macro report_by_day_and_country
122
125
  has_report :dislikes, Integer
123
126
 
124
- # @macro report_by_day
127
+ # @macro report_by_day_and_country
125
128
  has_report :shares, Integer
126
129
 
127
- # @macro report_by_day
130
+ # @macro report_by_day_and_country
128
131
  has_report :subscribers_gained, Integer
129
132
 
130
- # @macro report_by_day
133
+ # @macro report_by_day_and_country
131
134
  has_report :subscribers_lost, Integer
132
135
 
133
- # @macro report_by_day
136
+ # @macro report_by_day_and_country
134
137
  has_report :favorites_added, Integer
135
138
 
136
- # @macro report_by_day
139
+ # @macro report_by_day_and_country
137
140
  has_report :favorites_removed, Integer
138
141
 
139
- # @macro report_by_day
142
+ # @macro report_by_day_and_state
140
143
  has_report :average_view_duration, Float
141
144
 
142
- # @macro report_by_day
145
+ # @macro report_by_day_and_state
143
146
  has_report :average_view_percentage, Float
144
147
 
145
- # @macro report_by_day
148
+ # @macro report_by_day_and_state
146
149
  has_report :annotation_clicks, Integer
147
150
 
148
- # @macro report_by_day
151
+ # @macro report_by_day_and_state
149
152
  has_report :annotation_click_through_rate, Float
150
153
 
151
- # @macro report_by_day
154
+ # @macro report_by_day_and_state
152
155
  has_report :annotation_close_rate, Float
153
156
 
154
- # @macro report_by_day
157
+ # @macro report_by_day_and_country
155
158
  has_report :earnings, Float
156
159
 
157
- # @macro report_by_day
160
+ # @macro report_by_day_and_country
158
161
  has_report :impressions, Integer
159
162
 
160
- # @macro report_by_day
163
+ # @macro report_by_day_and_country
161
164
  has_report :monetized_playbacks, Integer
162
165
 
163
166
  ### STATISTICS ###
@@ -160,16 +160,16 @@ module Yt
160
160
  # @macro report_by_gender_and_age_group
161
161
  has_report :viewer_percentage, Float
162
162
 
163
- # @macro report_by_day
163
+ # @macro report_by_day_and_state
164
164
  has_report :average_view_duration, Float
165
165
 
166
- # @macro report_by_day
166
+ # @macro report_by_day_and_state
167
167
  has_report :playlist_starts, Integer
168
168
 
169
- # @macro report_by_day
169
+ # @macro report_by_day_and_state
170
170
  has_report :average_time_in_playlist, Float
171
171
 
172
- # @macro report_by_day
172
+ # @macro report_by_day_and_state
173
173
  has_report :views_per_playlist_start, Float
174
174
 
175
175
  ### PRIVATE API ###
@@ -375,62 +375,65 @@ module Yt
375
375
  # @macro report_by_video_dimensions
376
376
  has_report :views, Integer
377
377
 
378
+ # @macro report_by_day
379
+ has_report :uniques, Integer
380
+
378
381
  # @macro report_by_video_dimensions
379
382
  has_report :estimated_minutes_watched, Float
380
383
 
381
384
  # @macro report_by_gender_and_age_group
382
385
  has_report :viewer_percentage, Float
383
386
 
384
- # @macro report_by_day
387
+ # @macro report_by_day_and_country
385
388
  has_report :comments, Integer
386
389
 
387
- # @macro report_by_day
390
+ # @macro report_by_day_and_country
388
391
  has_report :likes, Integer
389
392
 
390
- # @macro report_by_day
393
+ # @macro report_by_day_and_country
391
394
  has_report :dislikes, Integer
392
395
 
393
- # @macro report_by_day
396
+ # @macro report_by_day_and_country
394
397
  has_report :shares, Integer
395
398
 
396
399
  # @note This is not the total number of subscribers gained by the video’s
397
400
  # channel, but the subscribers gained *from* the video’s page.
398
- # @macro report_by_day
401
+ # @macro report_by_day_and_country
399
402
  has_report :subscribers_gained, Integer
400
403
 
401
404
  # @note This is not the total number of subscribers lost by the video’s
402
405
  # channel, but the subscribers lost *from* the video’s page.
403
- # @macro report_by_day
406
+ # @macro report_by_day_and_country
404
407
  has_report :subscribers_lost, Integer
405
408
 
406
- # @macro report_by_day
409
+ # @macro report_by_day_and_country
407
410
  has_report :favorites_added, Integer
408
411
 
409
- # @macro report_by_day
412
+ # @macro report_by_day_and_country
410
413
  has_report :favorites_removed, Integer
411
414
 
412
- # @macro report_by_day
415
+ # @macro report_by_day_and_state
413
416
  has_report :average_view_duration, Float
414
417
 
415
- # @macro report_by_day
418
+ # @macro report_by_day_and_state
416
419
  has_report :average_view_percentage, Float
417
420
 
418
- # @macro report_by_day
421
+ # @macro report_by_day_and_state
419
422
  has_report :annotation_clicks, Integer
420
423
 
421
- # @macro report_by_day
424
+ # @macro report_by_day_and_state
422
425
  has_report :annotation_click_through_rate, Float
423
426
 
424
- # @macro report_by_day
427
+ # @macro report_by_day_and_state
425
428
  has_report :annotation_close_rate, Float
426
429
 
427
- # @macro report_by_day
430
+ # @macro report_by_day_and_country
428
431
  has_report :earnings, Float
429
432
 
430
- # @macro report_by_day
433
+ # @macro report_by_day_and_country
431
434
  has_report :impressions, Integer
432
435
 
433
- # @macro report_by_day
436
+ # @macro report_by_day_and_country
434
437
  has_report :monetized_playbacks, Integer
435
438
 
436
439
  ### STATISTICS ###