yt 0.11.6 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/README.md +13 -2
- data/lib/yt/actions/list.rb +11 -1
- data/lib/yt/associations/has_attribute.rb +51 -0
- data/lib/yt/associations/has_many.rb +0 -15
- data/lib/yt/collections/content_owners.rb +0 -4
- data/lib/yt/collections/playlist_items.rb +1 -1
- data/lib/yt/collections/resources.rb +1 -1
- data/lib/yt/collections/subscribed_channels.rb +46 -0
- data/lib/yt/collections/subscribers.rb +33 -0
- data/lib/yt/collections/subscriptions.rb +0 -23
- data/lib/yt/models/account.rb +6 -1
- data/lib/yt/models/annotation.rb +4 -10
- data/lib/yt/models/asset.rb +3 -10
- data/lib/yt/models/base.rb +2 -0
- data/lib/yt/models/channel.rb +53 -25
- data/lib/yt/models/claim.rb +13 -25
- data/lib/yt/models/content_detail.rb +9 -11
- data/lib/yt/models/content_owner_detail.rb +2 -8
- data/lib/yt/models/device_flow.rb +3 -11
- data/lib/yt/models/live_streaming_detail.rb +5 -25
- data/lib/yt/models/ownership.rb +8 -8
- data/lib/yt/models/playlist.rb +14 -10
- data/lib/yt/models/playlist_item.rb +13 -0
- data/lib/yt/models/policy.rb +10 -14
- data/lib/yt/models/policy_rule.rb +15 -21
- data/lib/yt/models/reference.rb +13 -37
- data/lib/yt/models/right_owner.rb +6 -17
- data/lib/yt/models/snippet.rb +19 -33
- data/lib/yt/models/statistics_set.rb +9 -23
- data/lib/yt/models/status.rb +20 -25
- data/lib/yt/models/subscription.rb +2 -8
- data/lib/yt/models/user_info.rb +11 -33
- data/lib/yt/version.rb +1 -1
- data/spec/collections/subscriptions_spec.rb +0 -7
- data/spec/errors/forbidden_spec.rb +10 -0
- data/spec/errors/server_error_spec.rb +10 -0
- data/spec/models/subscription_spec.rb +0 -9
- data/spec/requests/as_account/account_spec.rb +8 -0
- data/spec/requests/as_account/channel_spec.rb +40 -6
- data/spec/requests/as_account/playlist_item_spec.rb +26 -0
- data/spec/requests/as_account/playlist_spec.rb +1 -0
- data/spec/requests/as_server_app/channel_spec.rb +9 -0
- metadata +9 -2
@@ -16,6 +16,19 @@ module Yt
|
|
16
16
|
def exists?
|
17
17
|
!@id.nil?
|
18
18
|
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def resource_id
|
23
|
+
{kind: 'youtube#video', videoId: video_id}
|
24
|
+
end
|
25
|
+
|
26
|
+
# @see https://developers.google.com/youtube/v3/docs/playlistItems/update
|
27
|
+
def update_parts
|
28
|
+
keys = [:position, :playlist_id, :resource_id]
|
29
|
+
snippet = {keys: keys, required: true}
|
30
|
+
{snippet: snippet}
|
31
|
+
end
|
19
32
|
end
|
20
33
|
end
|
21
34
|
end
|
data/lib/yt/models/policy.rb
CHANGED
@@ -14,31 +14,27 @@ module Yt
|
|
14
14
|
|
15
15
|
# @return [String] the ID that YouTube assigns and uses to uniquely
|
16
16
|
# identify the policy.
|
17
|
-
|
18
|
-
@id ||= @data['id']
|
19
|
-
end
|
17
|
+
has_attribute :id
|
20
18
|
|
21
19
|
# @return [String] the policy’s name.
|
22
|
-
|
23
|
-
@name ||= @data['name']
|
24
|
-
end
|
20
|
+
has_attribute :name
|
25
21
|
|
26
22
|
# @return [String] the policy’s description.
|
27
|
-
|
28
|
-
@name ||= @data['description']
|
29
|
-
end
|
23
|
+
has_attribute :description
|
30
24
|
|
31
25
|
# @return [String] the time the policy was updated.
|
32
|
-
|
33
|
-
|
26
|
+
has_attribute :updated_at, type: Time, from: :time_updated
|
27
|
+
|
28
|
+
# @deprecated Use {#updated_at} instead.
|
29
|
+
def time_updated
|
30
|
+
updated_at
|
34
31
|
end
|
35
|
-
alias time_updated updated_at
|
36
32
|
|
37
33
|
# @return [Array<PolicyRule>] a list of rules that specify the action
|
38
34
|
# that YouTube should take and may optionally specify the conditions
|
39
35
|
# under which that action is enforced.
|
40
|
-
|
41
|
-
|
36
|
+
has_attribute :rules do |rules|
|
37
|
+
rules.map{|rule| PolicyRule.new data: rule}
|
42
38
|
end
|
43
39
|
end
|
44
40
|
end
|
@@ -6,7 +6,7 @@ module Yt
|
|
6
6
|
# Rules that specify the action that YouTube should take and may optionally
|
7
7
|
# specify the conditions under which that action is enforced.
|
8
8
|
# @see https://developers.google.com/youtube/partner/docs/v1/policies
|
9
|
-
class PolicyRule
|
9
|
+
class PolicyRule < Base
|
10
10
|
def initialize(options = {})
|
11
11
|
@data = options[:data]
|
12
12
|
end
|
@@ -18,16 +18,12 @@ module Yt
|
|
18
18
|
# YouTube. Valid values for this property are: block, monetize, takedown,
|
19
19
|
# track.
|
20
20
|
# @return [String] the policy that YouTube should enforce.
|
21
|
-
|
22
|
-
@action ||= @data['action']
|
23
|
-
end
|
21
|
+
has_attribute :action
|
24
22
|
|
25
23
|
# @return [Array] A list of additional actions that YouTube should take
|
26
24
|
# if the conditions in the rule are met. Valid values for this property
|
27
25
|
# are: review.
|
28
|
-
|
29
|
-
@subaction ||= @data['subaction']
|
30
|
-
end
|
26
|
+
has_attribute :subaction
|
31
27
|
|
32
28
|
# Return the list of territories where the policy applies.
|
33
29
|
# Each territory is an ISO 3166 two-letter country code.
|
@@ -58,7 +54,7 @@ module Yt
|
|
58
54
|
# @example videos that match the reference for 20 to 30 seconds:
|
59
55
|
# match_duration #= [{low: 20.0, high: 30.0}]
|
60
56
|
def match_duration
|
61
|
-
|
57
|
+
match_duration_list.map{|r| low_and_high r}
|
62
58
|
end
|
63
59
|
|
64
60
|
# @return [Array<Hash<Symbol, Float>>] the intervals of percentages the
|
@@ -68,7 +64,7 @@ module Yt
|
|
68
64
|
# @example videos that match the reference for 40%~50% of their duration:
|
69
65
|
# match_percent #= [{low: 40.0, high: 50.0}]
|
70
66
|
def match_percent
|
71
|
-
|
67
|
+
match_percent_list.map{|r| low_and_high r}
|
72
68
|
end
|
73
69
|
|
74
70
|
# @return [Array<Hash<Symbol, Float>>] the intervals of duration that the
|
@@ -78,7 +74,7 @@ module Yt
|
|
78
74
|
# @example references that are between 20 and 30 seconds:
|
79
75
|
# reference_duration #= [{low: 20.0, high: 30.0}]
|
80
76
|
def reference_duration
|
81
|
-
|
77
|
+
reference_duration_list.map{|r| low_and_high r}
|
82
78
|
end
|
83
79
|
|
84
80
|
# @return [Array<Hash<Symbol, Float>>] the intervals of percentages the
|
@@ -88,41 +84,39 @@ module Yt
|
|
88
84
|
# @example videos that match either 0%~10% or 40%~50% of a reference:
|
89
85
|
# reference_percent #= [{low: 0.0, high: 10.0}, {low: 40.0, high: 50.0}]
|
90
86
|
def reference_percent
|
91
|
-
|
87
|
+
reference_percent_list.map{|r| low_and_high r}
|
92
88
|
end
|
93
89
|
|
94
90
|
private
|
95
91
|
|
96
|
-
|
97
|
-
@conditions ||= @data.fetch 'conditions', {}
|
98
|
-
end
|
92
|
+
has_attribute :conditions, default: {}
|
99
93
|
|
100
94
|
def territories_object
|
101
|
-
|
95
|
+
conditions.fetch 'requiredTerritories', {}
|
102
96
|
end
|
103
97
|
|
104
98
|
def territories_type
|
105
|
-
|
99
|
+
territories_object['type']
|
106
100
|
end
|
107
101
|
|
108
102
|
def territories
|
109
|
-
|
103
|
+
territories_object['territories']
|
110
104
|
end
|
111
105
|
|
112
106
|
def match_duration_list
|
113
|
-
|
107
|
+
conditions.fetch 'matchDuration', []
|
114
108
|
end
|
115
109
|
|
116
110
|
def match_percent_list
|
117
|
-
|
111
|
+
conditions.fetch 'matchPercent', []
|
118
112
|
end
|
119
113
|
|
120
114
|
def reference_duration_list
|
121
|
-
|
115
|
+
conditions.fetch 'referenceDuration', []
|
122
116
|
end
|
123
117
|
|
124
118
|
def reference_percent_list
|
125
|
-
|
119
|
+
conditions.fetch 'referencePercent', []
|
126
120
|
end
|
127
121
|
|
128
122
|
def low_and_high(range)
|
data/lib/yt/models/reference.rb
CHANGED
@@ -26,52 +26,38 @@ module Yt
|
|
26
26
|
|
27
27
|
# @return [String] the ID that YouTube assigns and uses to uniquely
|
28
28
|
# identify the reference.
|
29
|
-
|
30
|
-
@id ||= @data['id']
|
31
|
-
end
|
29
|
+
has_attribute :id
|
32
30
|
|
33
31
|
# @return [String] the ID that uniquely identifies the asset that the
|
34
32
|
# reference is associated with.
|
35
|
-
|
36
|
-
@asset_id ||= @data["assetId"]
|
37
|
-
end
|
33
|
+
has_attribute :asset_id
|
38
34
|
|
39
35
|
# @return [Float] The length of the reference in seconds
|
40
|
-
|
41
|
-
@length ||= @data["length"]
|
42
|
-
end
|
36
|
+
has_attribute :length
|
43
37
|
|
44
38
|
# @return [String] the ID of the source video. This field is only present
|
45
39
|
# if the reference was created by associating an asset with an existing
|
46
40
|
# YouTube video that was uploaded to a YouTube channel linked to your
|
47
41
|
# CMS account.
|
48
|
-
|
49
|
-
@video_id ||= @data["videoId"]
|
50
|
-
end
|
42
|
+
has_attribute :video_id
|
51
43
|
|
52
44
|
# @return [String] the claim ID that represents the resulting association
|
53
45
|
# between the asset and the video. This field is only present if the
|
54
46
|
# reference was created by associating an asset with an existing
|
55
47
|
# YouTube video that was uploaded to a YouTube channel linked to your
|
56
48
|
# CMS account.
|
57
|
-
|
58
|
-
@claim_id ||= @data["claimId"]
|
59
|
-
end
|
49
|
+
has_attribute :claim_id
|
60
50
|
|
61
51
|
# @return [boolean] whether or not the reference content is included in
|
62
52
|
# YouTube's AudioSwap program. Set this field's value to true to
|
63
53
|
# indicate that the reference content should be included in YouTube's
|
64
54
|
# AudioSwap program.
|
65
|
-
|
66
|
-
@audioswap_enabled ||= @data["audioswapEnabled"]
|
67
|
-
end
|
55
|
+
has_attribute :audioswap_enabled?, from: :audioswap_enabled
|
68
56
|
|
69
57
|
# @return [boolean] should the reference be used to generate claims. Set
|
70
58
|
# this value to true to indicate that the reference should not be used
|
71
59
|
# to generate claims. This field is only used on AudioSwap references.
|
72
|
-
|
73
|
-
@ignore_fp_match ||= @data["ignoreFpMatch"]
|
74
|
-
end
|
60
|
+
has_attribute :ignore_fp_match?, from: :ignore_fp_match
|
75
61
|
|
76
62
|
# @return [Boolean] the urgent status of the reference file.
|
77
63
|
# Set this value to true to indicate that YouTube should prioritize
|
@@ -81,23 +67,17 @@ module Yt
|
|
81
67
|
# videos that require time-sensitive processing.
|
82
68
|
# The sooner YouTube completes Content ID processing for a video, the
|
83
69
|
# sooner YouTube can match user-uploaded videos to that video.
|
84
|
-
|
85
|
-
@urgent ||= @data["urgent"]
|
86
|
-
end
|
70
|
+
has_attribute :urgent?, from: :urgent
|
87
71
|
|
88
72
|
# @return [String] An explanation of how a reference entered its current
|
89
73
|
# state. This value is only present if the reference’s status is either
|
90
74
|
# inactive or deleted.
|
91
|
-
|
92
|
-
@status_reason ||= @data["statusReason"]
|
93
|
-
end
|
75
|
+
has_attribute :status_reason
|
94
76
|
|
95
77
|
# @return [String] The ID that uniquely identifies the reference that
|
96
78
|
# this reference duplicates. This field is only present if the
|
97
79
|
# reference’s status is duplicate_on_hold.
|
98
|
-
|
99
|
-
@duplicate_leader ||= @data["duplicateLeader"]
|
100
|
-
end
|
80
|
+
has_attribute :duplicate_leader
|
101
81
|
|
102
82
|
# Status
|
103
83
|
|
@@ -108,10 +88,8 @@ module Yt
|
|
108
88
|
# @return [String] the reference’s status. Valid values are: activating,
|
109
89
|
# active, checking, computing_fingerprint, deleted, duplicate_on_hold,
|
110
90
|
# inactive, live_streaming_processing, and urgent_reference_processing.
|
111
|
-
|
112
|
-
|
113
|
-
end
|
114
|
-
|
91
|
+
has_attribute :status
|
92
|
+
|
115
93
|
# @return [Boolean] whether the reference is pending.
|
116
94
|
def activating?
|
117
95
|
status == 'activating'
|
@@ -167,9 +145,7 @@ module Yt
|
|
167
145
|
# @return [String] whether the reference covers the audio, video, or
|
168
146
|
# audiovisual portion of the claimed content. Valid values are: audio,
|
169
147
|
# audiovisual, video.
|
170
|
-
|
171
|
-
@content_type ||= @data["contentType"]
|
172
|
-
end
|
148
|
+
has_attribute :content_type
|
173
149
|
|
174
150
|
# @return [Boolean] whether the reference covers the audio of the
|
175
151
|
# content.
|
@@ -4,7 +4,7 @@ module Yt
|
|
4
4
|
module Models
|
5
5
|
# Encapsulates information about the various types of owners of an asset.
|
6
6
|
# @see https://developers.google.com/youtube/partner/docs/v1/ownership#resource
|
7
|
-
class RightOwner
|
7
|
+
class RightOwner < Base
|
8
8
|
def initialize(options = {})
|
9
9
|
@data = options[:data]
|
10
10
|
end
|
@@ -15,22 +15,16 @@ module Yt
|
|
15
15
|
# values are 100, which indicates that the owner completely owns the
|
16
16
|
# asset in the specified territories, and 0, which indicates that you
|
17
17
|
# are removing ownership of the asset in the specified territories.
|
18
|
-
|
19
|
-
@ratio ||= @data['ratio'].to_f
|
20
|
-
end
|
18
|
+
has_attribute :ratio, type: Float
|
21
19
|
|
22
20
|
# @return [String] the name of the asset’s owner or rights administrator.
|
23
|
-
|
24
|
-
@owner ||= @data['owner']
|
25
|
-
end
|
21
|
+
has_attribute :owner
|
26
22
|
|
27
23
|
# @return [String] if the asset is a composition asset and the asset
|
28
24
|
# owner is not known to have a formal relationship established with
|
29
25
|
# YouTube, the name of the asset’s publisher or rights administrator.
|
30
26
|
# @return [nil] otherwise.
|
31
|
-
|
32
|
-
@publisher ||= @data['publisher']
|
33
|
-
end
|
27
|
+
has_attribute :publisher
|
34
28
|
|
35
29
|
# Return the list of territories where the owner owns the asset.
|
36
30
|
# Each territory is an ISO 3166 two-letter country code.
|
@@ -57,13 +51,8 @@ module Yt
|
|
57
51
|
|
58
52
|
private
|
59
53
|
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
def territories
|
65
|
-
@territories ||= @data.fetch 'territories', []
|
66
|
-
end
|
54
|
+
has_attribute :type
|
55
|
+
has_attribute :territories, default: []
|
67
56
|
end
|
68
57
|
end
|
69
58
|
end
|
data/lib/yt/models/snippet.rb
CHANGED
@@ -11,7 +11,7 @@ module Yt
|
|
11
11
|
# @see https://developers.google.com/youtube/v3/docs/videos#resource
|
12
12
|
# @see https://developers.google.com/youtube/v3/docs/playlists#resource
|
13
13
|
# @see https://developers.google.com/youtube/v3/docs/playlistItems#resource
|
14
|
-
class Snippet
|
14
|
+
class Snippet < Base
|
15
15
|
def initialize(options = {})
|
16
16
|
@data = options[:data]
|
17
17
|
@auth = options[:auth]
|
@@ -23,9 +23,7 @@ module Yt
|
|
23
23
|
# @return [String] if the resource is a video, the video’s title. Has a
|
24
24
|
# maximum of 100 characters and may contain all valid UTF-8 characters
|
25
25
|
# except < and >.
|
26
|
-
|
27
|
-
@title ||= @data.fetch 'title', ''
|
28
|
-
end
|
26
|
+
has_attribute :title, default: ''
|
29
27
|
|
30
28
|
# @return [Yt::Models::Description] if the resource is a channel, the
|
31
29
|
# channel’s description. Has a maximum of 1000 characters.
|
@@ -36,8 +34,8 @@ module Yt
|
|
36
34
|
# @return [Yt::Models::Description] if the resource is a video, the
|
37
35
|
# video’s description. Has a maximum of 5000 bytes and may contain all
|
38
36
|
# valid UTF-8 characters except < and >.
|
39
|
-
|
40
|
-
|
37
|
+
has_attribute :description, default: '' do |description_text|
|
38
|
+
Description.new description_text
|
41
39
|
end
|
42
40
|
|
43
41
|
# @return [Time] if the resource is a channel, the date and time that the
|
@@ -48,9 +46,7 @@ module Yt
|
|
48
46
|
# that the item was added to the playlist.
|
49
47
|
# @return [Time] if the resource is a video, the date and time that the
|
50
48
|
# video was published.
|
51
|
-
|
52
|
-
@published_at ||= Time.parse @data['publishedAt']
|
53
|
-
end
|
49
|
+
has_attribute :published_at, type: Time
|
54
50
|
|
55
51
|
# @param [Symbol, String] size The size of the thumbnail to retrieve.
|
56
52
|
# @return [String] if the resource is a channel and +size+ is +default+,
|
@@ -67,8 +63,7 @@ module Yt
|
|
67
63
|
# Video and +size+ is +high+, the URL of an 480x360px image.
|
68
64
|
# @return [nil] if the +size+ is not +default+, +medium+ or +high+.
|
69
65
|
def thumbnail_url(size = :default)
|
70
|
-
|
71
|
-
@thumbnails.fetch(size.to_s, {})['url']
|
66
|
+
thumbnails.fetch(size.to_s, {})['url']
|
72
67
|
end
|
73
68
|
|
74
69
|
# @return [String] if the resource is a playlist, the ID that YouTube
|
@@ -78,9 +73,7 @@ module Yt
|
|
78
73
|
# @return [String] if the resource is a video, the ID that YouTube uses
|
79
74
|
# to uniquely identify the channel that the video was uploaded to.
|
80
75
|
# @return [nil] if the resource is a channel.
|
81
|
-
|
82
|
-
@channel_id ||= @data['channelId']
|
83
|
-
end
|
76
|
+
has_attribute :channel_id
|
84
77
|
|
85
78
|
# @return [String] if the resource is a playlist, the title of the
|
86
79
|
# channel that the playlist belongs to.
|
@@ -89,9 +82,7 @@ module Yt
|
|
89
82
|
# @return [String] if the resource is a video, the title of the channel
|
90
83
|
# that the video was uploaded to.
|
91
84
|
# @return [nil] if the resource is a channel.
|
92
|
-
|
93
|
-
@channel_title ||= @data['channelTitle']
|
94
|
-
end
|
85
|
+
has_attribute :channel_title
|
95
86
|
|
96
87
|
# @return [Array<Yt::Models::Tag>] if the resource is a channel, an
|
97
88
|
# empty array.
|
@@ -101,9 +92,7 @@ module Yt
|
|
101
92
|
# an empty array.
|
102
93
|
# @return [Array<Yt::Models::Tag>] if the resource is a video, the list
|
103
94
|
# of keyword tags associated with the video.
|
104
|
-
|
105
|
-
@tags ||= @data.fetch 'tags', []
|
106
|
-
end
|
95
|
+
has_attribute :tags, default: []
|
107
96
|
|
108
97
|
# @return [String] if the resource is a video, the YouTube video
|
109
98
|
# category associated with the video.
|
@@ -111,9 +100,7 @@ module Yt
|
|
111
100
|
# @return [nil] if the resource is a playlist.
|
112
101
|
# @return [nil] if the resource is a playlist item.
|
113
102
|
# @see https://developers.google.com/youtube/v3/docs/videoCategories/list
|
114
|
-
|
115
|
-
@category_id ||= @data['categoryId']
|
116
|
-
end
|
103
|
+
has_attribute :category_id
|
117
104
|
|
118
105
|
BROADCAST_TYPES = %q(live none upcoming)
|
119
106
|
|
@@ -122,18 +109,14 @@ module Yt
|
|
122
109
|
# @return [nil] if the resource is a channel.
|
123
110
|
# @return [nil] if the resource is a playlist.
|
124
111
|
# @return [nil] if the resource is a playlist item.
|
125
|
-
|
126
|
-
@live_broadcast_content ||= @data['liveBroadcastContent']
|
127
|
-
end
|
112
|
+
has_attribute :live_broadcast_content
|
128
113
|
|
129
114
|
# @return [String] if the resource is a playlist item, the ID that
|
130
115
|
# YouTube uses to uniquely identify the playlist that the item is in.
|
131
116
|
# @return [nil] if the resource is a channel.
|
132
117
|
# @return [nil] if the resource is a playlist.
|
133
118
|
# @return [nil] if the resource is a video.
|
134
|
-
|
135
|
-
@playlist_id ||= @data['playlistId']
|
136
|
-
end
|
119
|
+
has_attribute :playlist_id
|
137
120
|
|
138
121
|
# @return [Integer] if the resource is a playlist item, the order in
|
139
122
|
# which the item appears in a playlist. The value is zero-based, so the
|
@@ -141,9 +124,7 @@ module Yt
|
|
141
124
|
# @return [nil] if the resource is a channel.
|
142
125
|
# @return [nil] if the resource is a playlist.
|
143
126
|
# @return [nil] if the resource is a video.
|
144
|
-
|
145
|
-
@position ||= @data['position'].to_i
|
146
|
-
end
|
127
|
+
has_attribute :position, type: Integer
|
147
128
|
|
148
129
|
# @return [String] if the resource is a playlist item, the ID of the
|
149
130
|
# video the playlist item represents in the playlist.
|
@@ -151,7 +132,7 @@ module Yt
|
|
151
132
|
# @return [nil] if the resource is a playlist.
|
152
133
|
# @return [nil] if the resource is a video.
|
153
134
|
def video_id
|
154
|
-
|
135
|
+
resource_id['videoId']
|
155
136
|
end
|
156
137
|
|
157
138
|
# @return [Yt::Models::Video] the video the playlist item represents in
|
@@ -174,6 +155,11 @@ module Yt
|
|
174
155
|
def includes_tags
|
175
156
|
@includes_tags ||= @data.fetch :includes_tags, true
|
176
157
|
end
|
158
|
+
|
159
|
+
private
|
160
|
+
|
161
|
+
has_attribute :thumbnails, default: {}
|
162
|
+
has_attribute :resource_id, default: {}
|
177
163
|
end
|
178
164
|
end
|
179
165
|
end
|