yt 0.32.4 → 0.33.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.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -4
  3. data/CHANGELOG.md +43 -2
  4. data/README.md +22 -33
  5. data/YOUTUBE_IT.md +4 -4
  6. data/bin/yt +2 -9
  7. data/lib/yt.rb +0 -1
  8. data/lib/yt/actions/list.rb +1 -1
  9. data/lib/yt/associations/has_reports.rb +9 -14
  10. data/lib/yt/collections/playlist_items.rb +10 -1
  11. data/lib/yt/collections/reports.rb +5 -7
  12. data/lib/yt/models/account.rb +21 -1
  13. data/lib/yt/models/asset.rb +10 -1
  14. data/lib/yt/models/channel.rb +2 -5
  15. data/lib/yt/models/content_owner.rb +20 -0
  16. data/lib/yt/models/match_policy.rb +4 -6
  17. data/lib/yt/models/playlist.rb +12 -2
  18. data/lib/yt/models/playlist_item.rb +8 -1
  19. data/lib/yt/models/resource.rb +69 -3
  20. data/lib/yt/models/statistics_set.rb +2 -1
  21. data/lib/yt/models/url.rb +2 -60
  22. data/lib/yt/models/video.rb +16 -3
  23. data/lib/yt/request.rb +6 -2
  24. data/lib/yt/version.rb +1 -1
  25. data/yt.gemspec +5 -2
  26. metadata +31 -169
  27. data/spec/collections/claims_spec.rb +0 -62
  28. data/spec/collections/comment_threads_spec.rb +0 -46
  29. data/spec/collections/playlist_items_spec.rb +0 -44
  30. data/spec/collections/playlists_spec.rb +0 -27
  31. data/spec/collections/policies_spec.rb +0 -30
  32. data/spec/collections/references_spec.rb +0 -30
  33. data/spec/collections/reports_spec.rb +0 -30
  34. data/spec/collections/subscriptions_spec.rb +0 -25
  35. data/spec/collections/videos_spec.rb +0 -43
  36. data/spec/constants/geography_spec.rb +0 -16
  37. data/spec/errors/forbidden_spec.rb +0 -10
  38. data/spec/errors/missing_auth_spec.rb +0 -24
  39. data/spec/errors/no_items_spec.rb +0 -10
  40. data/spec/errors/request_error_spec.rb +0 -44
  41. data/spec/errors/server_error_spec.rb +0 -10
  42. data/spec/errors/unauthorized_spec.rb +0 -10
  43. data/spec/models/account_spec.rb +0 -138
  44. data/spec/models/annotation_spec.rb +0 -180
  45. data/spec/models/asset_spec.rb +0 -32
  46. data/spec/models/channel_spec.rb +0 -127
  47. data/spec/models/claim_event_spec.rb +0 -62
  48. data/spec/models/claim_history_spec.rb +0 -27
  49. data/spec/models/claim_spec.rb +0 -223
  50. data/spec/models/comment_spec.rb +0 -40
  51. data/spec/models/comment_thread_spec.rb +0 -93
  52. data/spec/models/configuration_spec.rb +0 -44
  53. data/spec/models/content_detail_spec.rb +0 -52
  54. data/spec/models/content_owner_detail_spec.rb +0 -6
  55. data/spec/models/file_detail_spec.rb +0 -13
  56. data/spec/models/live_streaming_detail_spec.rb +0 -6
  57. data/spec/models/ownership_spec.rb +0 -59
  58. data/spec/models/player_spec.rb +0 -13
  59. data/spec/models/playlist_item_spec.rb +0 -120
  60. data/spec/models/playlist_spec.rb +0 -138
  61. data/spec/models/policy_rule_spec.rb +0 -63
  62. data/spec/models/policy_spec.rb +0 -41
  63. data/spec/models/rating_spec.rb +0 -12
  64. data/spec/models/reference_spec.rb +0 -249
  65. data/spec/models/request_spec.rb +0 -204
  66. data/spec/models/resource_spec.rb +0 -42
  67. data/spec/models/right_owner_spec.rb +0 -71
  68. data/spec/models/snippet_spec.rb +0 -13
  69. data/spec/models/statistics_set_spec.rb +0 -13
  70. data/spec/models/status_spec.rb +0 -13
  71. data/spec/models/subscription_spec.rb +0 -30
  72. data/spec/models/url_spec.rb +0 -78
  73. data/spec/models/video_category_spec.rb +0 -21
  74. data/spec/models/video_spec.rb +0 -669
  75. data/spec/requests/as_account/account_spec.rb +0 -143
  76. data/spec/requests/as_account/authentications_spec.rb +0 -127
  77. data/spec/requests/as_account/channel_spec.rb +0 -246
  78. data/spec/requests/as_account/channels_spec.rb +0 -18
  79. data/spec/requests/as_account/playlist_item_spec.rb +0 -55
  80. data/spec/requests/as_account/playlist_spec.rb +0 -218
  81. data/spec/requests/as_account/thumbnail.jpg +0 -0
  82. data/spec/requests/as_account/video.mp4 +0 -0
  83. data/spec/requests/as_account/video_spec.rb +0 -408
  84. data/spec/requests/as_content_owner/account_spec.rb +0 -29
  85. data/spec/requests/as_content_owner/advertising_options_set_spec.rb +0 -15
  86. data/spec/requests/as_content_owner/asset_spec.rb +0 -31
  87. data/spec/requests/as_content_owner/bulk_report_job_spec.rb +0 -19
  88. data/spec/requests/as_content_owner/channel_spec.rb +0 -1836
  89. data/spec/requests/as_content_owner/claim_history_spec.rb +0 -20
  90. data/spec/requests/as_content_owner/claim_spec.rb +0 -17
  91. data/spec/requests/as_content_owner/content_owner_spec.rb +0 -370
  92. data/spec/requests/as_content_owner/match_policy_spec.rb +0 -17
  93. data/spec/requests/as_content_owner/ownership_spec.rb +0 -25
  94. data/spec/requests/as_content_owner/playlist_spec.rb +0 -767
  95. data/spec/requests/as_content_owner/video_group_spec.rb +0 -112
  96. data/spec/requests/as_content_owner/video_spec.rb +0 -1211
  97. data/spec/requests/as_server_app/channel_spec.rb +0 -54
  98. data/spec/requests/as_server_app/comment_spec.rb +0 -22
  99. data/spec/requests/as_server_app/comment_thread_spec.rb +0 -27
  100. data/spec/requests/as_server_app/comment_threads_spec.rb +0 -41
  101. data/spec/requests/as_server_app/playlist_item_spec.rb +0 -30
  102. data/spec/requests/as_server_app/playlist_spec.rb +0 -33
  103. data/spec/requests/as_server_app/url_spec.rb +0 -94
  104. data/spec/requests/as_server_app/video_spec.rb +0 -60
  105. data/spec/requests/as_server_app/videos_spec.rb +0 -40
  106. data/spec/requests/unauthenticated/video_spec.rb +0 -14
  107. data/spec/spec_helper.rb +0 -20
  108. data/spec/support/fail_matcher.rb +0 -15
  109. data/spec/support/global_hooks.rb +0 -48
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b60bee886ed9551a6b9590fa99ad1146472dc90d332a50854a0d7ba490b40f93
4
- data.tar.gz: 72e08ae6b64e508e873a1d47f00c71e021d994bfb3bb65b2c1b52e4e6709950a
3
+ metadata.gz: '070338f88a83b93cdef2c6dfb529f06c15da00bbd8c6fba10f1f98689bf40c7c'
4
+ data.tar.gz: 298b85fb4bef72439425838c594ebf546f65cff2070d379a9b6a756ff01155fb
5
5
  SHA512:
6
- metadata.gz: 87f08494b156a1846e63eff41c154cbfc462e1a65c1391bdc530ae1a84ef891150b72b0e604359a2d20d45a5fd0db88a7429c38ffa80b3a2f721b25452ebd119
7
- data.tar.gz: 0453b6e46b53d2c3b2c0ffcdccd0daba325c97f96ebfacb37939172e6137c271236f94ef2fc05d25a6df3b8784c84040ab4b71064ea861b10e90e201a3198128
6
+ metadata.gz: 21fa9971e3d7cb96ecbe373d145c79cd8e665b2ea54acf3869674d0d4745d92e1d0cee7c34fad882670bf229a8833056cfe7bd77da60f1a7cadf4a05281c5af0
7
+ data.tar.gz: a26557d3e1b563f840f17f07ea6a61bb5b5820a018a2a8dcacb205cd00665304b82bce67af495177ef2c19b84734c0c8194cf7c4ae0c37d2afffe440e765d9bf
data/.rspec CHANGED
@@ -1,6 +1,3 @@
1
- --format documentation
2
1
  --color
3
- --tag ~rate_limited
4
- --tag ~flaky
5
- --tag ~extended_permissions
6
2
  --exclude_pattern spec/requests/as_content_owner/*_spec.rb
3
+ --tag=~slow
@@ -6,6 +6,47 @@ 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.33.2 - 2020-11-11
10
+
11
+ * [BUGFIX] No more pages when page token is an empty string, per YouTube change.
12
+
13
+ ## 0.33.1 - 2020-10-19
14
+
15
+ * [BUGFIX] Only retry once when exchanging a refresh token
16
+
17
+ ## 0.33.0 - 2020-04-10
18
+
19
+ If your code calls reports methods such as `views`, `likes`, or `reports`,
20
+ do not include `by: :week` option since `7DayTotals` dimension will no longer be
21
+ supported by YouTube API as of [April 15, 2020](https://developers.google.com/youtube/analytics/revision_history#october-15,-2019).
22
+
23
+ Use `by: :day` option instead and add up the numbers from each day.
24
+
25
+ If you keep using `by: :week` option after this change it will raise an error
26
+ (before the gem upgrade) or it will run with `day` dimension instead (after
27
+ the gem upgrade, like any other random input).
28
+
29
+ * [REMOVAL] Remove `by: :week` option for reports.
30
+ * [FEATURE] Add back the option of initializing a resource by its URL.
31
+ * [BUGFIX] Limit retries on refreshing tokens
32
+
33
+ **Breaking change**
34
+
35
+ If your code is using constant `Yt::URL::CHANNEL_PATTERNS` etc then it's moved to `Yt::Resource::CHANNEL_PATTERNS`, `Yt::Resource::VIDEO_PATTERNS`, and `Yt::Resource::PLAYLIST_PATTERNS`.
36
+
37
+ ## 0.32.6 - 2020-02-07
38
+
39
+ * [FEATURE] Allow partnered channels to delete playlist item.
40
+ * [FEATURE] Allow partnered channels to update video.
41
+ * [FEATURE] Allow partnered channels to update playlist.
42
+ * [FEATURE] Allow partnered channels to upload thumbnail.
43
+ * [FEATURE] Allow partnered channels to create playlist item.
44
+
45
+ ## 0.32.5 - 2019-11-06
46
+
47
+ * [BUGFIX] Fix `MatchPolicy#update` and `Asset#update` by using `PUT` instead of `PATCH`
48
+ * Update `bin/yt` file to keep `yt info` command work
49
+
9
50
  ## 0.32.4 - 2019-06-26
10
51
 
11
52
  * [FEATURE] Add `ownership_effective` method to access asset ownership ("effective") via the asset object.
@@ -457,11 +498,11 @@ If your code expects reports to return results **by day** then you **must** add
457
498
  the `by: :day` option to your report method. The new default is `by: :range`.
458
499
  For instance `channel.views` would return
459
500
 
460
- {Wed, 8 May 2014 => 12.4, Thu, 9 May 2014 => 3.2, Fri, 10 May 2014 => …}
501
+ {Wed, 8 May 2014 => 12.4, Thu, 9 May 2014 => 3.2, Fri, 10 May 2014 => …}
461
502
 
462
503
  and now returns the same as calling `channel.views by: :range`:
463
504
 
464
- {total: 3450}
505
+ {total: 3450}
465
506
 
466
507
  Additionally, if you expect reports **by day** then you **must** specify the
467
508
  `:since` option to your report method. Previously, this value was set to
data/README.md CHANGED
@@ -18,7 +18,6 @@ After [registering your app](#configuring-your-app), you can run commands like:
18
18
  channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow'
19
19
  channel.title #=> "Fullscreen"
20
20
  channel.public? #=> true
21
- channel.comment_count #=> 773
22
21
  channel.videos.count #=> 12
23
22
  ```
24
23
 
@@ -526,44 +525,34 @@ If a variable is set in both places, then `Yt.configure` takes precedence.
526
525
  How to test
527
526
  ===========
528
527
 
529
- Yt comes with two different sets of tests:
530
-
531
- 1. tests in `spec/models`, `spec/collections` and `spec/errors` **do not hit** the YouTube API
532
- 1. tests in `spec/requests` **hit** the YouTube API and require authentication
533
-
534
- To only run tests against models, collections and errors (which do not hit the API), type:
528
+ To run tests:
535
529
 
536
530
  ```bash
537
- rspec spec/models spec/collections spec/errors
531
+ rspec
538
532
  ```
539
533
 
540
- To also run live-tests against the YouTube API, type:
534
+ We recommend RSpec >= 3.8.
541
535
 
542
- ```bash
543
- rspec
544
- ```
536
+ Yt comes with two different sets of tests:
537
+
538
+ 1. Unit tests in `spec/models`, `spec/collections` and `spec/errors`
539
+ 2. Legacy integration tests in `spec/requests`
540
+
541
+ Coming soon will be a new set of high-level integration tests.
542
+
543
+ Integration tests are recorded with VCR. Some of the tests refer to
544
+ fixture data that an arbitrary account may not have access to. If you
545
+ need to modify one of these tests or re-record the cassette, we'd
546
+ suggest working against your own version of the testing setup. Then in
547
+ your pull request, we can help canonize your test/fixtures.
548
+
549
+ Some of the integration tests require authentication. These can be set
550
+ with the following environment variables:
545
551
 
546
- This will fail unless you have set up a test YouTube application and some
547
- tests YouTube accounts (with appropriate fixture data) to hit the API.
548
- Furthermore, tests that require authentication are divided into three
549
- roles, which correspond to each directory in `spec/requests`:
550
-
551
- * Account-based tests, which require a valid refresh token along with
552
- the application-level credentials the refresh token was created with
553
- (`YT_TEST_DEVICE_REFRESH_TOKEN`, `YT_TEST_DEVICE_CLIENT_ID`, and
554
- `YT_TEST_DEVICE_CLIENT_SECRET` respectively).
555
- * Server application tests, which use a server API key
556
- (`YT_TEST_SERVER_API_KEY`).
557
- * Tests that excercise YouTube's partner functionality. This requires an
558
- a partner channel id (`YT_TEST_CONTENT_OWNER_NAME`), a refresh token
559
- that's authenticated with that channel
560
- (`YT_TEST_CONTENT_OWNER_REFRESH_TOKEN`), and the corresponding
561
- application (`YT_TEST_PARTNER_CLIENT_ID` and
562
- (`YT_TEST_PARTNER_CLIENT_SECRET`).
563
-
564
- The refresh tokens need to be generated with the `youtube`,
565
- `yt-analytics` and `userinfo.profile` permissions in order for tests to
566
- pass.
552
+ * `YT_TEST_CLIENT_ID`
553
+ * `YT_TEST_CLIENT_SECRET`
554
+ * `YT_TEST_API_KEY`
555
+ * `YT_TEST_REFRESH_TOKEN`
567
556
 
568
557
  How to release new versions
569
558
  ===========================
@@ -141,7 +141,7 @@ client = YouTubeIt::Client.new
141
141
  client.videos_by(:query => "penguin", :author => "liz")
142
142
  # with yt: the 'author' filter was removed from YouTube API V3, so the
143
143
  # request must be done using the channel of the requested author
144
- channel = Yt::Channel.new id: 'UCxxxxxxxxx'
144
+ channel = Yt::Channel.new url: 'youtube.com/liz'
145
145
  channel.videos.where(q: 'penguin')
146
146
  ```
147
147
 
@@ -176,7 +176,7 @@ client = YouTubeIt::Client.new
176
176
  client.videos_by(:user => 'liz')
177
177
  # with yt: the 'author' filter was removed from YouTube API V3, so the
178
178
  # request must be done using the channel of the requested author
179
- channel = Yt::Channel.new id: 'UCxxxxxxxxx'
179
+ channel = Yt::Channel.new url: 'youtube.com/liz'
180
180
  channel.videos.where(q: 'penguin')
181
181
  ```
182
182
 
@@ -188,7 +188,7 @@ client = YouTubeIt::Client.new
188
188
  client.videos_by(:favorites, :user => 'liz')
189
189
  # with yt: note that only *old* channels have a "Favorites" playlist, since
190
190
  # "Favorites" has been deprecated by YouTube in favor of "Liked Videos".
191
- channel = Yt::Channel.new id: 'UCxxxxxxxxx'
191
+ channel = Yt::Channel.new url: 'youtube.com/liz'
192
192
  channel.related_playlists.find{|p| p.title == 'Favorites'}
193
193
  ```
194
194
 
@@ -832,4 +832,4 @@ TODO
832
832
 
833
833
  $ client.activity(user) #default current user
834
834
 
835
- -->
835
+ -->
data/bin/yt CHANGED
@@ -8,20 +8,13 @@ rescue LoadError
8
8
  end
9
9
 
10
10
  Yt.configuration.log_level = :debug
11
- id = ARGV[1] || 'BPNYv0vd78A'
11
+ id = ARGV[1] || 'rdwz7QiG0lk'
12
12
 
13
13
  case ARGV[0]
14
14
  when 'info'
15
15
  puts "Yt version #{Yt::VERSION}"
16
16
  video = Yt::Video.new id: id
17
- puts video.annotations.first.text
18
- when 'annotations'
19
- video = Yt::Video.new id: id
20
- count = video.annotations.size
21
- puts "Video #{id} has #{count} #{'annotation'.pluralize count}"
22
- video.annotations.each.with_index do |annotation, i|
23
- puts "#{i+1}) #{annotation.text}"
24
- end
17
+ puts video.title
25
18
  when 'video'
26
19
  video = Yt::Video.new id: id
27
20
  views = "#{video.view_count} #{'view'.pluralize video.view_count}"
data/lib/yt.rb CHANGED
@@ -13,7 +13,6 @@ require 'yt/models/video_group'
13
13
  require 'yt/models/comment_thread'
14
14
  require 'yt/models/ownership'
15
15
  require 'yt/models/advertising_options_set'
16
- require 'yt/models/url'
17
16
 
18
17
  # An object-oriented Ruby client for YouTube.
19
18
  # Helps creating applications that need to interact with YouTube objects.
@@ -75,7 +75,7 @@ module Yt
75
75
  end
76
76
 
77
77
  def more_pages?
78
- @last_index.zero? || !@page_token.nil?
78
+ @last_index.zero? || @page_token.present?
79
79
  end
80
80
 
81
81
  def next_page
@@ -10,7 +10,7 @@ module Yt
10
10
  # @option options [Array<Symbol>] :only The metrics to generate reports
11
11
  # for.
12
12
  # @option options [Symbol] :by (:day) The dimension to collect metrics
13
- # by. Accepted values are: +:day+, +:week+, +:month+.
13
+ # by. Accepted values are: +:day+, +:month+.
14
14
  # @option options [#to_date] :since The first day of the time-range.
15
15
  # Also aliased as +:from+.
16
16
  # @option options [#to_date] :until The last day of the time-range.
@@ -40,11 +40,6 @@ module Yt
40
40
  # @example Get the $1 for this and last month:
41
41
  # resource.$1 since: 1.month.ago, by: :month
42
42
  # # => {Wed, 01 Apr 2014..Thu, 30 Apr 2014 => 12.0, Fri, 01 May 2014..Sun, 31 May 2014 => 34.0, …}
43
- # @return [Hash<Range<Date, Date>, $2>] if grouped by week, the $1
44
- # for each week in the time-range.
45
- # @example Get the $1 for this and last week:
46
- # resource.$1 since: 1.week.ago, by: :week
47
- # # => {Wed, 01 Apr 2014..Tue, 07 Apr 2014 => 20.0, Wed, 08 Apr 2014..Tue, 14 Apr 2014 => 13.0, …}
48
43
  # @macro report
49
44
 
50
45
  # @!macro [new] report_with_range
@@ -75,19 +70,19 @@ module Yt
75
70
 
76
71
  # @!macro [new] report_by_day
77
72
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
78
- # Accepted values are: +:day+, +:week+, +:month+.
73
+ # Accepted values are: +:day+, +:month+.
79
74
  # @macro report_with_day
80
75
 
81
76
  # @!macro [new] report_by_day_and_country
82
77
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
83
- # Accepted values are: +:day+, +:week+, +:month+, :+range+.
78
+ # Accepted values are: +:day+, +:month+, :+range+.
84
79
  # @macro report_with_day
85
80
  # @macro report_with_range
86
81
  # @macro report_with_country
87
82
 
88
83
  # @!macro [new] report_by_day_and_state
89
84
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
90
- # Accepted values are: +:day+, +:week+, +:month+, :+range+.
85
+ # Accepted values are: +:day+, +:month+, :+range+.
91
86
  # @macro report_with_day
92
87
  # @macro report_with_range
93
88
  # @macro report_with_country_and_state
@@ -128,7 +123,7 @@ module Yt
128
123
 
129
124
  # @!macro [new] report_by_video_dimensions
130
125
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
131
- # Accepted values are: +:day+, +:week+, +:month+, +:range+,
126
+ # Accepted values are: +:day+, +:month+, +:range+,
132
127
  # +:traffic_source+,+:search_term+, +:playback_location+,
133
128
  # +:related_video+, +:embedded_player_location+.
134
129
  # @option options [Array<Symbol>] :includes ([:id]) if grouped by
@@ -162,7 +157,7 @@ module Yt
162
157
 
163
158
  # @!macro [new] report_by_channel_dimensions
164
159
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
165
- # Accepted values are: +:day+, +:week+, +:month+, +:range+,
160
+ # Accepted values are: +:day+, +:month+, +:range+,
166
161
  # +:traffic_source+, +:search_term+, +:playback_location+, +:video+,
167
162
  # +:related_video+, +:playlist+, +:embedded_player_location+.
168
163
  # @return [Hash<Symbol, $2>] if grouped by embedded player location,
@@ -175,7 +170,7 @@ module Yt
175
170
 
176
171
  # @!macro [new] report_by_playlist_dimensions
177
172
  # @option options [Symbol] :by (:day) The dimension to collect $1 by.
178
- # Accepted values are: +:day+, +:week+, +:month+, +:range+,
173
+ # Accepted values are: +:day+, +:month+, +:range+,
179
174
  # +:traffic_source+, +:playback_location+, +:related_video+, +:video+,
180
175
  # +:playlist+.
181
176
  # @macro report_with_channel_dimensions
@@ -228,7 +223,7 @@ module Yt
228
223
  def define_reports_method(metric, type)
229
224
  (@metrics ||= {})[metric] = type
230
225
  define_method :reports do |options = {}|
231
- from = options[:since] || options[:from] || (options[:by].in?([:day, :week, :month]) ? 5.days.ago : '2005-02-01')
226
+ from = options[:since] || options[:from] || (options[:by].in?([:day, :month]) ? 5.days.ago : '2005-02-01')
232
227
  to = options[:until] || options[:to] || Date.today
233
228
  location = options[:in]
234
229
  country = location.is_a?(Hash) ? location[:country] : location
@@ -252,7 +247,7 @@ module Yt
252
247
 
253
248
  def define_metric_method(metric)
254
249
  define_method metric do |options = {}|
255
- from = options[:since] || options[:from] || (options[:by].in?([:day, :week, :month]) ? 5.days.ago : '2005-02-01')
250
+ from = options[:since] || options[:from] || (options[:by].in?([:day, :month]) ? 5.days.ago : '2005-02-01')
256
251
  to = options[:until] || options[:to] || Date.today
257
252
  location = options[:in]
258
253
  country = location.is_a?(Hash) ? location[:country] : location
@@ -48,6 +48,15 @@ module Yt
48
48
  def insert_parts
49
49
  {snippet: {keys: [:playlist_id, :resource_id, :position]}}
50
50
  end
51
+
52
+ # For inserting a playlist item with content owner auth.
53
+ # @see https://developers.google.com/youtube/v3/docs/playlistItems/insert
54
+ def insert_params
55
+ params = super
56
+ params[:params] ||= {}
57
+ params[:params].merge! @auth.insert_playlist_item_params
58
+ params
59
+ end
51
60
  end
52
61
  end
53
- end
62
+ end
@@ -6,7 +6,6 @@ module Yt
6
6
  class Reports < Base
7
7
  DIMENSIONS = Hash.new({name: 'day', parse: ->(day, *values) { @metrics.keys.zip(values.map{|v| {Date.iso8601(day) => v}}).to_h} }).tap do |hash|
8
8
  hash[:month] = {name: 'month', parse: ->(month, *values) { @metrics.keys.zip(values.map{|v| {Range.new(Date.strptime(month, '%Y-%m').beginning_of_month, Date.strptime(month, '%Y-%m').end_of_month) => v} }).to_h} }
9
- hash[:week] = {name: '7DayTotals', parse: ->(last_day_of_week, *values) { @metrics.keys.zip(values.map{|v| {Range.new(Date.strptime(last_day_of_week) - 6, Date.strptime(last_day_of_week)) => v} }).to_h} }
10
9
  hash[:range] = {parse: ->(*values) { @metrics.keys.zip(values.map{|v| {total: v}}).to_h } }
11
10
  hash[:traffic_source] = {name: 'insightTrafficSourceType', parse: ->(source, *values) { @metrics.keys.zip(values.map{|v| {TRAFFIC_SOURCES.key(source) => v}}).to_h} }
12
11
  hash[:playback_location] = {name: 'insightPlaybackLocationType', parse: ->(location, *values) { @metrics.keys.zip(values.map{|v| {PLAYBACK_LOCATIONS.key(location) => v}}).to_h} }
@@ -140,11 +139,6 @@ module Yt
140
139
  end
141
140
  if dimension == :month
142
141
  hash = hash.transform_values{|h| h.sort_by{|range, v| range.first}.to_h}
143
- elsif dimension == :week
144
- hash = hash.transform_values do |h|
145
- h.select{|range, v| range.last.wday == days_range.last.wday}.
146
- sort_by{|range, v| range.first}.to_h
147
- end
148
142
  elsif dimension == :day
149
143
  hash = hash.transform_values{|h| h.sort_by{|day, v| day}.to_h}
150
144
  elsif dimension.in? [:traffic_source, :country, :state, :playback_location, :device_type, :operating_system, :subscribed_status]
@@ -159,11 +153,15 @@ module Yt
159
153
  # same query is a workaround that works and can hardly cause any damage.
160
154
  # Similarly, once in while YouTube responds with a random 503 error.
161
155
  rescue Yt::Error => e
162
- (max_retries > 0) && rescue?(e) ? sleep(3) && within(days_range, country, state, dimension, videos, historical, max_retries - 1) : raise
156
+ (max_retries > 0) && rescue?(e) ? sleep(retry_time) && within(days_range, country, state, dimension, videos, historical, max_retries - 1) : raise
163
157
  end
164
158
 
165
159
  private
166
160
 
161
+ def retry_time
162
+ 3
163
+ end
164
+
167
165
  def type_cast(value, type)
168
166
  case [type]
169
167
  when [Integer] then value.to_i if value
@@ -65,7 +65,7 @@ module Yt
65
65
  # @param [Hash] params the metadata to add to the uploaded video.
66
66
  # @option params [String] :title The video’s title.
67
67
  # @option params [String] :description The video’s description.
68
- # @option params [Array<String>] :title The video’s tags.
68
+ # @option params [Array<String>] :tags The video’s tags.
69
69
  # @option params [String] :privacy_status The video’s privacy status.
70
70
  # @return [Yt::Models::Video] the newly uploaded video.
71
71
  def upload_video(path_or_url, params = {})
@@ -192,6 +192,10 @@ module Yt
192
192
  {mine: true}
193
193
  end
194
194
 
195
+ def playlist_items_params
196
+ {}
197
+ end
198
+
195
199
  # @private
196
200
  # Tells `has_many :resumable_sessions` what path to hit to upload a file.
197
201
  def upload_path
@@ -223,6 +227,22 @@ module Yt
223
227
  def upload_content_type
224
228
  'video/*'
225
229
  end
230
+
231
+ def update_video_params
232
+ {}
233
+ end
234
+
235
+ def update_playlist_params
236
+ {}
237
+ end
238
+
239
+ def upload_thumbnail_params
240
+ {}
241
+ end
242
+
243
+ def insert_playlist_item_params
244
+ {}
245
+ end
226
246
  end
227
247
  end
228
248
  end
@@ -17,7 +17,7 @@ module Yt
17
17
 
18
18
  def update(attributes = {})
19
19
  underscore_keys! attributes
20
- do_patch body: attributes
20
+ do_update body: attributes
21
21
  true
22
22
  end
23
23
 
@@ -112,6 +112,15 @@ module Yt
112
112
  end
113
113
  end
114
114
 
115
+ # @see https://developers.google.com/youtube/partner/docs/v1/assets/update
116
+ def update_params
117
+ super.tap do |params|
118
+ params[:expected_response] = Net::HTTPOK
119
+ params[:path] = "/youtube/partner/v1/assets/#{@id}"
120
+ params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
121
+ end
122
+ end
123
+
115
124
  # @return [Hash] the parameters to submit to YouTube to get an asset.
116
125
  # @see https://developers.google.com/youtube/partner/docs/v1/assets/get
117
126
  def get_params
@@ -197,10 +197,6 @@ module Yt
197
197
  # @return [Integer] the number of times the channel has been viewed.
198
198
  delegate :view_count, to: :statistics_set
199
199
 
200
- # @!attribute [r] comment_count
201
- # @return [Integer] the number of comments for the channel.
202
- delegate :comment_count, to: :statistics_set
203
-
204
200
  # @!attribute [r] video_count
205
201
  # @return [Integer] the number of videos uploaded to the channel.
206
202
  delegate :video_count, to: :statistics_set
@@ -283,7 +279,8 @@ module Yt
283
279
  # @private
284
280
  # Tells `has_reports` to retrieve the reports from YouTube Analytics API
285
281
  # either as a Channel or as a Content Owner.
286
- # @see https://developers.google.com/youtube/analytics/v1/reports
282
+ # @see https://developers.google.com/youtube/analytics/channel_reports
283
+ # @see https://developers.google.com/youtube/analytics/content_owner_reports
287
284
  def reports_params
288
285
  {}.tap do |params|
289
286
  if auth.owner_name