yt 0.11.1 → 0.11.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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +31 -33
- data/README.md +94 -3
- data/lib/yt.rb +1 -0
- data/lib/yt/actions/base.rb +19 -0
- data/lib/yt/actions/insert.rb +2 -0
- data/lib/yt/actions/list.rb +0 -7
- data/lib/yt/actions/modify.rb +2 -0
- data/lib/yt/collections/assets.rb +32 -0
- data/lib/yt/collections/authentications.rb +1 -0
- data/lib/yt/collections/claims.rb +16 -1
- data/lib/yt/collections/ownerships.rb +34 -0
- data/lib/yt/collections/references.rb +2 -12
- data/lib/yt/collections/resources.rb +0 -10
- data/lib/yt/models/account.rb +1 -1
- data/lib/yt/models/advertising_options_set.rb +33 -0
- data/lib/yt/models/asset.rb +100 -0
- data/lib/yt/models/channel.rb +1 -1
- data/lib/yt/models/claim.rb +22 -0
- data/lib/yt/models/content_owner.rb +16 -4
- data/lib/yt/models/match_policy.rb +2 -12
- data/lib/yt/models/ownership.rb +70 -0
- data/lib/yt/models/reference.rb +1 -1
- data/lib/yt/models/request.rb +13 -2
- data/lib/yt/models/resource.rb +0 -10
- data/lib/yt/models/resumable_session.rb +1 -0
- data/lib/yt/models/right_owner.rb +69 -0
- data/lib/yt/version.rb +1 -1
- data/spec/models/asset_spec.rb +20 -0
- data/spec/models/ownership_spec.rb +59 -0
- data/spec/models/right_owner_spec.rb +71 -0
- data/spec/requests/as_content_owner/advertising_options_set_spec.rb +15 -0
- data/spec/requests/as_content_owner/asset_spec.rb +12 -0
- data/spec/requests/as_content_owner/content_owner_spec.rb +37 -2
- data/spec/requests/as_content_owner/ownership_spec.rb +19 -0
- metadata +21 -3
- data/Gemfile.lock +0 -69
@@ -9,8 +9,8 @@ module Yt
|
|
9
9
|
class References < Base
|
10
10
|
def insert(attributes = {})
|
11
11
|
underscore_keys! attributes
|
12
|
-
body = {
|
13
|
-
params = {
|
12
|
+
body = {content_type: attributes[:content_type] }
|
13
|
+
params = {claim_id: attributes[:claim_id], on_behalf_of_content_owner: @auth.owner_name}
|
14
14
|
do_insert(params: params, body: body)
|
15
15
|
end
|
16
16
|
|
@@ -41,16 +41,6 @@ module Yt
|
|
41
41
|
def references_params
|
42
42
|
apply_where_params! on_behalf_of_content_owner: @parent.owner_name
|
43
43
|
end
|
44
|
-
|
45
|
-
# If we dropped support for ActiveSupport 3, then we could simply
|
46
|
-
# invoke transform_keys!{|key| key.to_s.underscore.to_sym}
|
47
|
-
def underscore_keys!(hash)
|
48
|
-
hash.dup.each_key{|key| hash[underscore key] = hash.delete key}
|
49
|
-
end
|
50
|
-
|
51
|
-
def underscore(value)
|
52
|
-
value.to_s.underscore.to_sym
|
53
|
-
end
|
54
44
|
end
|
55
45
|
end
|
56
46
|
end
|
@@ -59,12 +59,6 @@ module Yt
|
|
59
59
|
(part[:keys] & attributes.keys).any?
|
60
60
|
end
|
61
61
|
|
62
|
-
# If we dropped support for ActiveSupport 3, then we could simply
|
63
|
-
# invoke transform_keys!{|key| key.to_s.underscore.to_sym}
|
64
|
-
def underscore_keys!(hash)
|
65
|
-
hash.dup.each_key{|key| hash[underscore key] = hash.delete key}
|
66
|
-
end
|
67
|
-
|
68
62
|
# @return [Hash] the original hash with angle brackets characters in its
|
69
63
|
# values replaced with similar Unicode characters accepted by Youtube.
|
70
64
|
# @see https://support.google.com/youtube/answer/57404?hl=en
|
@@ -79,10 +73,6 @@ module Yt
|
|
79
73
|
def camelize(value)
|
80
74
|
value.to_s.camelize(:lower).to_sym
|
81
75
|
end
|
82
|
-
|
83
|
-
def underscore(value)
|
84
|
-
value.to_s.underscore.to_sym
|
85
|
-
end
|
86
76
|
end
|
87
77
|
end
|
88
78
|
end
|
data/lib/yt/models/account.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'yt/models/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module Models
|
5
|
+
# Encapsulates advertising options of a video, such as the types of ads
|
6
|
+
# that can run during the video as well as the times when ads are allowed
|
7
|
+
# to run during the video.
|
8
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/videoAdvertisingOptions#resource
|
9
|
+
class AdvertisingOptionsSet < Base
|
10
|
+
def initialize(options = {})
|
11
|
+
@auth = options[:auth]
|
12
|
+
@video_id = options[:video_id]
|
13
|
+
end
|
14
|
+
|
15
|
+
def update(attributes = {})
|
16
|
+
underscore_keys! attributes
|
17
|
+
do_patch body: attributes
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/videoAdvertisingOptions/patch
|
24
|
+
def patch_params
|
25
|
+
super.tap do |params|
|
26
|
+
params[:expected_response] = Net::HTTPOK
|
27
|
+
params[:path] = "/youtube/partner/v1/videoAdvertisingOptions/#{@video_id}"
|
28
|
+
params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'yt/models/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module Models
|
5
|
+
# Provides methods to interact with YouTube ContentID assets.
|
6
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/assets
|
7
|
+
class Asset < Base
|
8
|
+
attr_reader :auth
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
@data = options[:data]
|
12
|
+
@id = options[:id]
|
13
|
+
@auth = options[:auth]
|
14
|
+
end
|
15
|
+
|
16
|
+
# @!attribute [r] ownership
|
17
|
+
# @return [Yt::Models::Ownership] the asset’s ownership.
|
18
|
+
has_one :ownership
|
19
|
+
delegate :general_owners, :performance_owners, :synchronization_owners,
|
20
|
+
:mechanical_owners, to: :ownership
|
21
|
+
|
22
|
+
# Soft-deletes the asset.
|
23
|
+
# @note YouTube API does not provide a +delete+ method for the Asset
|
24
|
+
# resource, but only an +update+ method. Updating the +status+ of a
|
25
|
+
# Asset to "inactive" can be considered a soft-deletion.
|
26
|
+
# @note Despite what the documentation says, YouTube API never returns
|
27
|
+
# the status of an asset, so it’s impossible to update, although the
|
28
|
+
# documentation says this should be the case. If YouTube ever fixes
|
29
|
+
# the API, then the following code can be uncommented.
|
30
|
+
# @return [Boolean] whether the asset is inactive.
|
31
|
+
# def delete
|
32
|
+
# body = {id: id, status: :inactive}
|
33
|
+
# do_update(body: body) {|data| @data = data}
|
34
|
+
# inactive?
|
35
|
+
# end
|
36
|
+
|
37
|
+
# @return [String] the ID that YouTube assigns and uses to uniquely
|
38
|
+
# identify the asset.
|
39
|
+
def id
|
40
|
+
@id ||= @data['id']
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [String] the asset’s type. This value determines the metadata
|
44
|
+
# fields that you can set for the asset. In addition, certain API
|
45
|
+
# functions may only be supported for specific types of assets. For
|
46
|
+
# example, composition assets may have more complex ownership data than
|
47
|
+
# other types of assets.
|
48
|
+
# Valid values for this property are: art_track_video, composition,
|
49
|
+
# episode, general, movie, music_video, season, show, sound_recording,
|
50
|
+
# video_game, and web.
|
51
|
+
def type
|
52
|
+
@type ||= @data['type']
|
53
|
+
end
|
54
|
+
|
55
|
+
# Status
|
56
|
+
|
57
|
+
STATUSES = %q(active inactive pending)
|
58
|
+
|
59
|
+
# @return [String] the asset’s status. Valid values are: active,
|
60
|
+
# inactive, and pending.
|
61
|
+
# @note Despite what the documentation says, YouTube API never returns
|
62
|
+
# the status of an asset, so it’s impossible to update, although the
|
63
|
+
# documentation says this should be the case. If YouTube ever fixes
|
64
|
+
# the API, then the following code can be uncommented.
|
65
|
+
# def status
|
66
|
+
# @status ||= @data["status"]
|
67
|
+
# end
|
68
|
+
#
|
69
|
+
# # @return [Boolean] whether the asset is active.
|
70
|
+
# def active?
|
71
|
+
# status == 'active'
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# # @return [Boolean] whether the asset is inactive.
|
75
|
+
# def inactive?
|
76
|
+
# status == 'inactive'
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# # @return [Boolean] whether the asset is pending.
|
80
|
+
# def pending?
|
81
|
+
# status == 'pending'
|
82
|
+
# end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/assets/update
|
87
|
+
# @note Despite what the documentation says, YouTube API never returns
|
88
|
+
# the status of an asset, so it’s impossible to update, although the
|
89
|
+
# documentation says this should be the case. If YouTube ever fixes
|
90
|
+
# the API, then the following code can be uncommented.
|
91
|
+
# def update_params
|
92
|
+
# super.tap do |params|
|
93
|
+
# params[:expected_response] = Net::HTTPOK
|
94
|
+
# params[:path] = "/youtube/partner/v1/assets/#{id}"
|
95
|
+
# params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
96
|
+
# end
|
97
|
+
# end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/yt/models/channel.rb
CHANGED
data/lib/yt/models/claim.rb
CHANGED
@@ -7,6 +7,19 @@ module Yt
|
|
7
7
|
class Claim < Base
|
8
8
|
def initialize(options = {})
|
9
9
|
@data = options[:data]
|
10
|
+
@id = options[:id]
|
11
|
+
@auth = options[:auth]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Soft-deletes the claim.
|
15
|
+
# @note YouTube API does not provide a +delete+ method for the Asset
|
16
|
+
# resource, but only an +update+ method. Updating the +status+ of a
|
17
|
+
# Asset to "inactive" can be considered a soft-deletion.
|
18
|
+
# @return [Boolean] whether the claim is inactive.
|
19
|
+
def delete
|
20
|
+
body = {status: :inactive}
|
21
|
+
do_patch(body: body) {|data| @data = data}
|
22
|
+
inactive?
|
10
23
|
end
|
11
24
|
|
12
25
|
# @return [String] the ID that YouTube assigns and uses to uniquely
|
@@ -137,6 +150,15 @@ module Yt
|
|
137
150
|
def match_reference_id
|
138
151
|
@match_reference_id ||= @data.fetch('matchInfo', {})['referenceId']
|
139
152
|
end
|
153
|
+
|
154
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/claims/update
|
155
|
+
def patch_params
|
156
|
+
super.tap do |params|
|
157
|
+
params[:expected_response] = Net::HTTPOK
|
158
|
+
params[:path] = "/youtube/partner/v1/claims/#{id}"
|
159
|
+
params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
160
|
+
end
|
161
|
+
end
|
140
162
|
end
|
141
163
|
end
|
142
164
|
end
|
@@ -8,19 +8,23 @@ module Yt
|
|
8
8
|
class ContentOwner < Account
|
9
9
|
|
10
10
|
# @!attribute [r] partnered_channels
|
11
|
-
# @return [Yt::
|
11
|
+
# @return [Yt::Collections::PartneredChannels] the channels managed by the CMS account.
|
12
12
|
has_many :partnered_channels
|
13
13
|
|
14
14
|
# @!attribute [r] claims
|
15
|
-
# @return [Yt::
|
15
|
+
# @return [Yt::Collections::Claims] the claims administered by the content owner.
|
16
16
|
has_many :claims
|
17
17
|
|
18
|
+
# @!attribute [r] assets
|
19
|
+
# @return [Yt::Collection::Assets] the assets administered by the content owner.
|
20
|
+
has_many :assets
|
21
|
+
|
18
22
|
# @!attribute [r] references
|
19
|
-
# @return [Yt::
|
23
|
+
# @return [Yt::Collections::References] the references administered by the content owner.
|
20
24
|
has_many :references
|
21
25
|
|
22
26
|
# @!attribute [r] policies
|
23
|
-
# @return [Yt::
|
27
|
+
# @return [Yt::Collections::Policies] the policies saved by the content owner.
|
24
28
|
has_many :policies
|
25
29
|
|
26
30
|
def initialize(options = {})
|
@@ -31,6 +35,14 @@ module Yt
|
|
31
35
|
def create_reference(params = {})
|
32
36
|
references.insert params
|
33
37
|
end
|
38
|
+
|
39
|
+
def create_asset(params = {})
|
40
|
+
assets.insert params
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_claim(params = {})
|
44
|
+
claims.insert params
|
45
|
+
end
|
34
46
|
end
|
35
47
|
end
|
36
48
|
end
|
@@ -13,7 +13,7 @@ module Yt
|
|
13
13
|
|
14
14
|
def update(attributes = {})
|
15
15
|
underscore_keys! attributes
|
16
|
-
do_patch body:
|
16
|
+
do_patch body: attributes.slice(:policy_id)
|
17
17
|
true
|
18
18
|
end
|
19
19
|
|
@@ -25,20 +25,10 @@ module Yt
|
|
25
25
|
def patch_params
|
26
26
|
super.tap do |params|
|
27
27
|
params[:path] = "/youtube/partner/v1/assets/#{@asset_id}/matchPolicy"
|
28
|
-
params[:params] = {
|
28
|
+
params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
29
29
|
params[:expected_response] = Net::HTTPOK
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
33
|
-
# If we dropped support for ActiveSupport 3, then we could simply
|
34
|
-
# invoke transform_keys!{|key| key.to_s.underscore.to_sym}
|
35
|
-
def underscore_keys!(hash)
|
36
|
-
hash.dup.each_key{|key| hash[underscore key] = hash.delete key}
|
37
|
-
end
|
38
|
-
|
39
|
-
def underscore(value)
|
40
|
-
value.to_s.underscore.to_sym
|
41
|
-
end
|
42
32
|
end
|
43
33
|
end
|
44
34
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'yt/models/base'
|
2
|
+
require 'yt/models/right_owner'
|
3
|
+
|
4
|
+
module Yt
|
5
|
+
module Models
|
6
|
+
# Provides methods to interact with YouTube ContentID asset ownership,
|
7
|
+
# which provide ownership information for the specified asset.
|
8
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/ownership
|
9
|
+
class Ownership < Base
|
10
|
+
def initialize(options = {})
|
11
|
+
@data = options[:data] || {}
|
12
|
+
@auth = options[:auth]
|
13
|
+
@asset_id = options[:asset_id]
|
14
|
+
end
|
15
|
+
|
16
|
+
def update(attributes = {})
|
17
|
+
underscore_keys! attributes
|
18
|
+
do_update body: attributes
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
# Assigns 100% of the general ownership of the asset to @auth.
|
23
|
+
def obtain!
|
24
|
+
update general: [{ratio: 100, owner: @auth.owner_name, type: :exclude}]
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Array<RightOwner>] a list that identifies the owners of an
|
28
|
+
# asset and the territories where each owner has ownership.
|
29
|
+
# General asset ownership is used for all types of assets and is the
|
30
|
+
# only type of ownership data that can be provided for assets that are
|
31
|
+
# not compositions.
|
32
|
+
def general_owners
|
33
|
+
@general_owners ||= as_owners @data['general']
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Array<RightOwner>] a list that identifies owners of the
|
37
|
+
# performance rights for a composition asset.
|
38
|
+
def performance_owners
|
39
|
+
@performance_owners ||= as_owners @data['performance']
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [Array<RightOwner>] a list that identifies owners of the
|
43
|
+
# synchronization rights for a composition asset.
|
44
|
+
def synchronization_owners
|
45
|
+
@synchronization_owners ||= as_owners @data['synchronization']
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Array<RightOwner>] a list that identifies owners of the
|
49
|
+
# mechanical rights for a composition asset.
|
50
|
+
def mechanical_owners
|
51
|
+
@mechanical_owners ||= as_owners @data['mechanical']
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/ownership/update
|
57
|
+
def update_params
|
58
|
+
super.tap do |params|
|
59
|
+
params[:expected_response] = Net::HTTPOK
|
60
|
+
params[:path] = "/youtube/partner/v1/assets/#{@asset_id}/ownership"
|
61
|
+
params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def as_owners(data)
|
66
|
+
(data || []).map{|owner_data| Yt::RightOwner.new data: owner_data}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/yt/models/reference.rb
CHANGED
@@ -196,7 +196,7 @@ module Yt
|
|
196
196
|
super.tap do |params|
|
197
197
|
params[:expected_response] = Net::HTTPOK
|
198
198
|
params[:path] = "/youtube/partner/v1/references/#{id}"
|
199
|
-
params[:params] = {
|
199
|
+
params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
200
200
|
end
|
201
201
|
end
|
202
202
|
end
|
data/lib/yt/models/request.rb
CHANGED
@@ -15,7 +15,6 @@ module Yt
|
|
15
15
|
class Request
|
16
16
|
def initialize(options = {})
|
17
17
|
@auth = options[:auth]
|
18
|
-
@body = options[:body]
|
19
18
|
@file = options[:file]
|
20
19
|
@body_type = options.fetch :body_type, :json
|
21
20
|
@expected_response = options.fetch :expected_response, Net::HTTPSuccess
|
@@ -24,9 +23,14 @@ module Yt
|
|
24
23
|
@host = options.fetch :host, google_api_host
|
25
24
|
@method = options.fetch :method, :get
|
26
25
|
@path = options[:path]
|
27
|
-
@
|
26
|
+
@body = options[:body]
|
27
|
+
camelize_keys! @body if options.fetch(:camelize_body, true)
|
28
|
+
params = options.fetch :params, {}
|
29
|
+
camelize_keys! params if options.fetch(:camelize_params, true)
|
30
|
+
@query = params.to_param
|
28
31
|
end
|
29
32
|
|
33
|
+
|
30
34
|
def run
|
31
35
|
p as_curl if Yt.configuration.developing?
|
32
36
|
|
@@ -132,6 +136,13 @@ module Yt
|
|
132
136
|
end if body
|
133
137
|
end
|
134
138
|
|
139
|
+
def camelize_keys!(object)
|
140
|
+
return object unless object.is_a?(Hash)
|
141
|
+
object.dup.each_key do |key|
|
142
|
+
object[key.to_s.camelize(:lower).to_sym] = object.delete key
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
135
146
|
# There are two cases to run a request again: YouTube responds with a
|
136
147
|
# random error that can be fixed by waiting for some seconds and running
|
137
148
|
# the exact same query, or the access token needs to be refreshed.
|
data/lib/yt/models/resource.rb
CHANGED
@@ -80,12 +80,6 @@ module Yt
|
|
80
80
|
part[:required] || (part[:keys] & attributes.keys).any?
|
81
81
|
end
|
82
82
|
|
83
|
-
# If we dropped support for ActiveSupport 3, then we could simply
|
84
|
-
# invoke transform_keys!{|key| key.to_s.underscore.to_sym}
|
85
|
-
def underscore_keys!(hash)
|
86
|
-
hash.dup.each_key{|key| hash[underscore key] = hash.delete key}
|
87
|
-
end
|
88
|
-
|
89
83
|
# @return [Hash] the original hash with angle brackets characters in its
|
90
84
|
# values replaced with similar Unicode characters accepted by Youtube.
|
91
85
|
# @see https://support.google.com/youtube/answer/57404?hl=en
|
@@ -100,10 +94,6 @@ module Yt
|
|
100
94
|
def camelize(value)
|
101
95
|
value.to_s.camelize(:lower).to_sym
|
102
96
|
end
|
103
|
-
|
104
|
-
def underscore(value)
|
105
|
-
value.to_s.underscore.to_sym
|
106
|
-
end
|
107
97
|
end
|
108
98
|
end
|
109
99
|
end
|