yt 0.14.2 → 0.14.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +25 -1
- data/lib/yt.rb +1 -0
- data/lib/yt/collections/claim_histories.rb +34 -0
- data/lib/yt/models/claim.rb +7 -0
- data/lib/yt/models/claim_event.rb +67 -0
- data/lib/yt/models/claim_history.rb +29 -0
- data/lib/yt/request.rb +2 -3
- data/lib/yt/version.rb +1 -1
- data/spec/models/claim_event_spec.rb +62 -0
- data/spec/models/claim_history_spec.rb +27 -0
- data/spec/models/request_spec.rb +2 -2
- data/spec/requests/as_content_owner/claim_history_spec.rb +20 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d1eeefafcd75a3c1c5f93117c6f5d08ab882569
|
4
|
+
data.tar.gz: 48aafacb7c44c358ca7e4d32dd3cac022e50835a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff3234ddd12713b1ef8ab0d291cb154be0db0d673272c2aa50f602c358a8c9f0617ca1505b6a11f027f42b06fed5244346e0d85b9c429192d803da8ae49d0da6
|
7
|
+
data.tar.gz: 2cf90341fe38289cbcbabcb1e2543b347bd9ca00e6eed81d49fae81845b457df15e7dc429d89c98ed743de0c5a7b99819f2b4e16ccff1952fb36dab15283e28b
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,10 @@ 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.14.3 - 2015-04-09
|
10
|
+
|
11
|
+
* [BUGFIX] Don't let request errors crash Yt in Ruby 1.9.3.
|
12
|
+
|
9
13
|
## 0.14.2 - 2015-04-08
|
10
14
|
|
11
15
|
* [FEATURE] Make `Annotation#text` a public method.
|
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.14.
|
44
|
+
gem 'yt', '~> 0.14.3'
|
45
45
|
|
46
46
|
Since the gem follows [Semantic Versioning](http://semver.org),
|
47
47
|
indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
|
@@ -568,6 +568,30 @@ asset.ownership.release! #=> true
|
|
568
568
|
asset.update metadata_mine: {notes: 'Some notes'} #=> true
|
569
569
|
```
|
570
570
|
|
571
|
+
Yt::Claim
|
572
|
+
---------
|
573
|
+
|
574
|
+
Use [Yt::Claim](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Claim) to:
|
575
|
+
|
576
|
+
* read the attributes of a claim
|
577
|
+
* view the history of a claim
|
578
|
+
* update the attributes of an claim
|
579
|
+
|
580
|
+
```ruby
|
581
|
+
|
582
|
+
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
|
583
|
+
claim = Yt::Claim.new id: 'ABCD12345678', auth: content_owner
|
584
|
+
claim.video_id #=> 'va141cJga2'
|
585
|
+
claim.asset_id #=> 'A1234'
|
586
|
+
claim.content_type #=> 'audiovisual'
|
587
|
+
claim.active? #=> true
|
588
|
+
|
589
|
+
claim.claim_history #=> #<Yt::Models::ClaimHistory ...>
|
590
|
+
claim.claim_history.events[0].type #=> "claim_create"
|
591
|
+
|
592
|
+
claim.delete #=> true
|
593
|
+
```
|
594
|
+
|
571
595
|
*The methods above require to be authenticated as the video’s content owner (see below).*
|
572
596
|
|
573
597
|
Yt::Ownership
|
data/lib/yt.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'yt/collections/resources'
|
2
|
+
require 'yt/models/claim'
|
3
|
+
|
4
|
+
module Yt
|
5
|
+
module Collections
|
6
|
+
# Provides methods to interact with a the claim history options of a YouTube claim.
|
7
|
+
#
|
8
|
+
# Resources with claim history are: {Yt::Models::Claim claims}.
|
9
|
+
class ClaimHistories < Resources
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def attributes_for_new_item(data)
|
14
|
+
{data: data, id: @parent.id, auth: @auth}
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Hash] the parameters to submit to YouTube to get claim history.
|
18
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/claimHistory/get
|
19
|
+
def list_params
|
20
|
+
super.tap do |params|
|
21
|
+
params[:path] = "/youtube/partner/v1/claimHistory/#{@parent.id}"
|
22
|
+
params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @private
|
27
|
+
# @note ClaimHistories overwrites +fetch_page+ since it’s a get.
|
28
|
+
def fetch_page(params = {})
|
29
|
+
response = list_request(params).run
|
30
|
+
{items: [response.body], token: nil}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/yt/models/claim.rb
CHANGED
@@ -5,12 +5,18 @@ module Yt
|
|
5
5
|
# Provides methods to interact with YouTube ContentID claims.
|
6
6
|
# @see https://developers.google.com/youtube/partner/docs/v1/claims
|
7
7
|
class Claim < Base
|
8
|
+
attr_reader :auth
|
9
|
+
|
8
10
|
def initialize(options = {})
|
9
11
|
@data = options[:data]
|
10
12
|
@id = options[:id]
|
11
13
|
@auth = options[:auth]
|
12
14
|
end
|
13
15
|
|
16
|
+
# @!attribute [r] claim_history
|
17
|
+
# @return [Yt::Collections::ClaimHistories] the claim's history.
|
18
|
+
has_one :claim_history
|
19
|
+
|
14
20
|
# Soft-deletes the claim.
|
15
21
|
# @note YouTube API does not provide a +delete+ method for the Asset
|
16
22
|
# resource, but only an +update+ method. Updating the +status+ of a
|
@@ -137,6 +143,7 @@ module Yt
|
|
137
143
|
(match_info || {})['referenceId']
|
138
144
|
end
|
139
145
|
|
146
|
+
|
140
147
|
private
|
141
148
|
|
142
149
|
# @see https://developers.google.com/youtube/partner/docs/v1/claims/update
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'yt/models/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module Models
|
5
|
+
class ClaimEvent < Base
|
6
|
+
def initialize(options = {})
|
7
|
+
@data = options[:data]
|
8
|
+
end
|
9
|
+
|
10
|
+
REASONS = %w(asset_transfer_request audio_muted audio_replaced audioswap_removed
|
11
|
+
channel_transferred channel_whitelisted closed_audio_claim_on_visual_reference
|
12
|
+
closed_audio_revshare closed_by_admin closed_cover_revshare
|
13
|
+
closed_invalid_reference_segment closed_manually closed_partner_exclusion
|
14
|
+
closed_private_video closed_reference_conflict copyrighted_content_matched
|
15
|
+
counter_received dispute_resolution duplicate invalid_claim muting_audio
|
16
|
+
ownership_removed partner_deactivated pending_activation pending_adsense
|
17
|
+
pending_fingerprint pending_for_review reference_removed released replaced
|
18
|
+
review_expired revshare_disabled risk_of_error song_erased
|
19
|
+
suspended_monetization_on_channel video_classifier_rejecion video_content_modified
|
20
|
+
video_removed video_taken_down)
|
21
|
+
|
22
|
+
# @return [Time] the date and time when the event occurred.
|
23
|
+
has_attribute :time, type: Time
|
24
|
+
|
25
|
+
# @return [String] the reason an event occurred.
|
26
|
+
has_attribute :reason
|
27
|
+
|
28
|
+
# @return [String] the event's type.
|
29
|
+
has_attribute :type
|
30
|
+
|
31
|
+
# @return [String] the source type which triggered the event.
|
32
|
+
has_attribute :source_type, from: :source do |source|
|
33
|
+
(source || {})['type']
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [String] the ID of the content owner that initiated
|
37
|
+
# the event.
|
38
|
+
has_attribute :source_content_owner_id, from: :source do |source|
|
39
|
+
(source || {})['contentOwnerId']
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [String] the email address of the user who initiated
|
43
|
+
# the event.
|
44
|
+
has_attribute :source_user_email, from: :source do |source|
|
45
|
+
(source || {})['userEmail']
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [String] the reason that explains why a
|
49
|
+
# dispute_create event occurred.
|
50
|
+
has_attribute :dispute_reason, from: :type_details do |type_details|
|
51
|
+
(type_details || {})['disputeReason']
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String] a free-text explanation of the reason that a claim
|
55
|
+
# was disputed. This property is returned for dispute_create events.
|
56
|
+
has_attribute :dispute_notes, from: :type_details do |type_details|
|
57
|
+
(type_details || {})['disputeNotes']
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [String] the event status that resulted from a claim_update
|
61
|
+
# event.
|
62
|
+
has_attribute :update_status, from: :type_details do |type_details|
|
63
|
+
(type_details || {})['updateStatus']
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yt/models/base'
|
2
|
+
require 'yt/models/claim_event'
|
3
|
+
|
4
|
+
module Yt
|
5
|
+
module Models
|
6
|
+
# Provides methods to interact with YouTube ContentID claims.
|
7
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/claims
|
8
|
+
class ClaimHistory < Base
|
9
|
+
def initialize(options = {})
|
10
|
+
@data = options[:data]
|
11
|
+
@id = options[:id]
|
12
|
+
@auth = options[:auth]
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [String] the ID that YouTube assigns and uses to uniquely
|
16
|
+
# identify the claim.
|
17
|
+
has_attribute :id
|
18
|
+
|
19
|
+
# @return [String] the unique YouTube channel ID of the channel to
|
20
|
+
# which the claimed video was uploaded.
|
21
|
+
has_attribute :uploader_channel_id
|
22
|
+
|
23
|
+
# @return [Array<String>] the list of events associated with the claim.
|
24
|
+
has_attribute :events, from: :event do |event_info|
|
25
|
+
event_info.map{|event| ClaimEvent.new data: event}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/yt/request.rb
CHANGED
@@ -202,12 +202,11 @@ module Yt
|
|
202
202
|
def server_errors
|
203
203
|
[
|
204
204
|
OpenSSL::SSL::SSLError,
|
205
|
-
OpenSSL::SSL::SSLErrorWaitReadable,
|
206
205
|
Errno::ETIMEDOUT,
|
207
206
|
Errno::ENETUNREACH,
|
208
207
|
Errno::ECONNRESET,
|
209
208
|
Net::HTTPServerError
|
210
|
-
]
|
209
|
+
] + (RUBY_VERSION < '2' ? [] : [OpenSSL::SSL::SSLErrorWaitReadable])
|
211
210
|
end
|
212
211
|
|
213
212
|
# Sleeps for a while and returns true for the first +max_retries+ times,
|
@@ -265,4 +264,4 @@ module Yt
|
|
265
264
|
{request_curl: as_curl, response_body: response_body}
|
266
265
|
end
|
267
266
|
end
|
268
|
-
end
|
267
|
+
end
|
data/lib/yt/version.rb
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yt/models/claim_event'
|
3
|
+
|
4
|
+
describe Yt::ClaimEvent do
|
5
|
+
subject(:claim_event) { Yt::ClaimEvent.new data: data }
|
6
|
+
|
7
|
+
describe '#time' do
|
8
|
+
context 'given fetching a claim_event returns a time' do
|
9
|
+
let(:data) { {"time"=>"2015-04-08T21:52:13.000Z"} }
|
10
|
+
it { expect(claim_event.time).to be_a Time }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#type' do
|
15
|
+
context 'given fetching a claim_event returns a type' do
|
16
|
+
let(:data) { {"type"=>"claim_create"} }
|
17
|
+
it { expect(claim_event.type).to eq 'claim_create' }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#source_type' do
|
22
|
+
context 'given fetching a claim_event returns a source_type' do
|
23
|
+
let(:data) { {'source'=>{'type' => 'cms_user'}} }
|
24
|
+
it { expect(claim_event.source_type).to eq 'cms_user' }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#source_content_owner_id' do
|
29
|
+
context 'given fetching a claim_event returns a source_content_owner_id' do
|
30
|
+
let(:data) { {'source'=>{'contentOwnerId' => 'C1234'}} }
|
31
|
+
it { expect(claim_event.source_content_owner_id).to eq 'C1234' }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#source_user_email' do
|
36
|
+
context 'given fetching a claim_event returns a source_user_email' do
|
37
|
+
let(:data) { {'source'=>{'userEmail' => 'email@fullscreen.net'}} }
|
38
|
+
it { expect(claim_event.source_user_email).to eq 'email@fullscreen.net' }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#dispute_reason' do
|
43
|
+
context 'given fetching a claim_event returns a dispute_reason' do
|
44
|
+
let(:data) { {'typeDetails'=>{'disputeReason' => 'fair_use'}} }
|
45
|
+
it { expect(claim_event.dispute_reason).to eq 'fair_use' }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#dispute_notes' do
|
50
|
+
context 'given fetching a claim_event returns dispute_notes' do
|
51
|
+
let(:data) { {'typeDetails'=>{'disputeNotes' => 'User entered notes here.'}} }
|
52
|
+
it { expect(claim_event.dispute_notes).to eq 'User entered notes here.' }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#update_status' do
|
57
|
+
context 'given fetching a claim_event returns an update_status' do
|
58
|
+
let(:data) { {'typeDetails'=>{'updateStatus' => 'active'}} }
|
59
|
+
it { expect(claim_event.update_status).to eq 'active' }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yt/models/claim_history'
|
3
|
+
|
4
|
+
describe Yt::ClaimHistory do
|
5
|
+
subject(:claim_history) { Yt::ClaimHistory.new data: data }
|
6
|
+
|
7
|
+
describe '#id' do
|
8
|
+
context 'given fetching claim_history with an id' do
|
9
|
+
let(:data) { {"id"=>"acbd1234"}}
|
10
|
+
it { expect(claim_history.id).to eq "acbd1234" }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#uploader_channel_id' do
|
15
|
+
context 'given fetching claim_history with an uploader_channel_id' do
|
16
|
+
let(:data) { {"uploaderChannelId"=>"C1234"}}
|
17
|
+
it { expect(claim_history.uploader_channel_id).to eq "C1234" }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#events' do
|
22
|
+
context 'given fetching claim_history with associated events' do
|
23
|
+
let(:data) { {"event"=>[{"time"=>"2015-03-21T21:35:42.000Z"},{"time"=>"2015-03-21T21:35:42.000Z"}]} }
|
24
|
+
it { expect(claim_history.events.size).to eq 2 }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/models/request_spec.rb
CHANGED
@@ -120,7 +120,7 @@ describe Yt::Request do
|
|
120
120
|
# NOTE: This test is just a reflection of YouTube irrational behavior of
|
121
121
|
# being unavailable once in a while, and therefore causing Net::HTTP to
|
122
122
|
# fail, although retrying after some seconds works.
|
123
|
-
context 'an OpenSSL::SSL::SSLErrorWaitReadable' do
|
123
|
+
context 'an OpenSSL::SSL::SSLErrorWaitReadable', ruby2: true do
|
124
124
|
let(:http_error) { OpenSSL::SSL::SSLErrorWaitReadable.new }
|
125
125
|
|
126
126
|
context 'every time' do
|
@@ -139,4 +139,4 @@ describe Yt::Request do
|
|
139
139
|
end
|
140
140
|
end
|
141
141
|
end
|
142
|
-
end
|
142
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yt/models/claim'
|
3
|
+
require 'yt/models/claim_history'
|
4
|
+
|
5
|
+
describe Yt::ClaimHistory, :partner do
|
6
|
+
subject(:claim) { Yt::Claim.new id: asset_id, auth: $content_owner }
|
7
|
+
|
8
|
+
context 'given a claim previously administered by the authenticated Content Owner' do
|
9
|
+
let(:asset_id) { ENV['YT_TEST_CLAIM_ID'] }
|
10
|
+
|
11
|
+
describe 'the claim history can be obtained' do
|
12
|
+
it { expect(claim.claim_history.events.size > 0).to eq true }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'the claim_create event' do
|
16
|
+
let(:claim_create_event) { claim.claim_history.events.find {|e| e.type == 'claim_create'} }
|
17
|
+
it { expect(claim_create_event.time).to be_a Time }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.14.
|
4
|
+
version: 0.14.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claudio Baccigalupo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -136,6 +136,7 @@ files:
|
|
136
136
|
- lib/yt/collections/authentications.rb
|
137
137
|
- lib/yt/collections/base.rb
|
138
138
|
- lib/yt/collections/channels.rb
|
139
|
+
- lib/yt/collections/claim_histories.rb
|
139
140
|
- lib/yt/collections/claims.rb
|
140
141
|
- lib/yt/collections/content_details.rb
|
141
142
|
- lib/yt/collections/content_owner_details.rb
|
@@ -179,6 +180,8 @@ files:
|
|
179
180
|
- lib/yt/models/base.rb
|
180
181
|
- lib/yt/models/channel.rb
|
181
182
|
- lib/yt/models/claim.rb
|
183
|
+
- lib/yt/models/claim_event.rb
|
184
|
+
- lib/yt/models/claim_history.rb
|
182
185
|
- lib/yt/models/configuration.rb
|
183
186
|
- lib/yt/models/content_detail.rb
|
184
187
|
- lib/yt/models/content_owner.rb
|
@@ -227,6 +230,8 @@ files:
|
|
227
230
|
- spec/models/annotation_spec.rb
|
228
231
|
- spec/models/asset_spec.rb
|
229
232
|
- spec/models/channel_spec.rb
|
233
|
+
- spec/models/claim_event_spec.rb
|
234
|
+
- spec/models/claim_history_spec.rb
|
230
235
|
- spec/models/claim_spec.rb
|
231
236
|
- spec/models/configuration_spec.rb
|
232
237
|
- spec/models/content_detail_spec.rb
|
@@ -264,6 +269,7 @@ files:
|
|
264
269
|
- spec/requests/as_content_owner/advertising_options_set_spec.rb
|
265
270
|
- spec/requests/as_content_owner/asset_spec.rb
|
266
271
|
- spec/requests/as_content_owner/channel_spec.rb
|
272
|
+
- spec/requests/as_content_owner/claim_history_spec.rb
|
267
273
|
- spec/requests/as_content_owner/content_owner_spec.rb
|
268
274
|
- spec/requests/as_content_owner/match_policy_spec.rb
|
269
275
|
- spec/requests/as_content_owner/ownership_spec.rb
|
@@ -325,6 +331,8 @@ test_files:
|
|
325
331
|
- spec/models/annotation_spec.rb
|
326
332
|
- spec/models/asset_spec.rb
|
327
333
|
- spec/models/channel_spec.rb
|
334
|
+
- spec/models/claim_event_spec.rb
|
335
|
+
- spec/models/claim_history_spec.rb
|
328
336
|
- spec/models/claim_spec.rb
|
329
337
|
- spec/models/configuration_spec.rb
|
330
338
|
- spec/models/content_detail_spec.rb
|
@@ -362,6 +370,7 @@ test_files:
|
|
362
370
|
- spec/requests/as_content_owner/advertising_options_set_spec.rb
|
363
371
|
- spec/requests/as_content_owner/asset_spec.rb
|
364
372
|
- spec/requests/as_content_owner/channel_spec.rb
|
373
|
+
- spec/requests/as_content_owner/claim_history_spec.rb
|
365
374
|
- spec/requests/as_content_owner/content_owner_spec.rb
|
366
375
|
- spec/requests/as_content_owner/match_policy_spec.rb
|
367
376
|
- spec/requests/as_content_owner/ownership_spec.rb
|