late-sdk 0.0.938 → 0.0.939

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.
@@ -0,0 +1,318 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api Versioning and deprecation: all endpoints are versioned in the URL path (current version: /v1). Breaking changes only ship in a new path version; existing versions keep working. Deprecated operations are marked 'deprecated: true' in this spec and announced in the changelog (https://zernio.com/changelog) before removal. Errors: every 4xx/5xx response is application/json with a machine-readable 'code' and a human-readable 'error' message (see the ErrorResponse schema).
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Zernio
17
+ class CreateYoutubePlaylist201ResponsePlaylist < ApiModelBase
18
+ attr_accessor :id
19
+
20
+ attr_accessor :title
21
+
22
+ attr_accessor :description
23
+
24
+ attr_accessor :privacy
25
+
26
+ attr_accessor :item_count
27
+
28
+ attr_accessor :thumbnail_url
29
+
30
+ class EnumAttributeValidator
31
+ attr_reader :datatype
32
+ attr_reader :allowable_values
33
+
34
+ def initialize(datatype, allowable_values)
35
+ @allowable_values = allowable_values.map do |value|
36
+ case datatype.to_s
37
+ when /Integer/i
38
+ value.to_i
39
+ when /Float/i
40
+ value.to_f
41
+ else
42
+ value
43
+ end
44
+ end
45
+ end
46
+
47
+ def valid?(value)
48
+ !value || allowable_values.include?(value)
49
+ end
50
+ end
51
+
52
+ # Attribute mapping from ruby-style variable name to JSON key.
53
+ def self.attribute_map
54
+ {
55
+ :'id' => :'id',
56
+ :'title' => :'title',
57
+ :'description' => :'description',
58
+ :'privacy' => :'privacy',
59
+ :'item_count' => :'itemCount',
60
+ :'thumbnail_url' => :'thumbnailUrl'
61
+ }
62
+ end
63
+
64
+ # Returns attribute mapping this model knows about
65
+ def self.acceptable_attribute_map
66
+ attribute_map
67
+ end
68
+
69
+ # Returns all the JSON keys this model knows about
70
+ def self.acceptable_attributes
71
+ acceptable_attribute_map.values
72
+ end
73
+
74
+ # Attribute type mapping.
75
+ def self.openapi_types
76
+ {
77
+ :'id' => :'String',
78
+ :'title' => :'String',
79
+ :'description' => :'String',
80
+ :'privacy' => :'String',
81
+ :'item_count' => :'Integer',
82
+ :'thumbnail_url' => :'String'
83
+ }
84
+ end
85
+
86
+ # List of attributes with nullable: true
87
+ def self.openapi_nullable
88
+ Set.new([
89
+ ])
90
+ end
91
+
92
+ # Initializes the object
93
+ # @param [Hash] attributes Model attributes in the form of hash
94
+ def initialize(attributes = {})
95
+ if (!attributes.is_a?(Hash))
96
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::CreateYoutubePlaylist201ResponsePlaylist` initialize method"
97
+ end
98
+
99
+ # check to see if the attribute exists and convert string to symbol for hash key
100
+ acceptable_attribute_map = self.class.acceptable_attribute_map
101
+ attributes = attributes.each_with_object({}) { |(k, v), h|
102
+ if (!acceptable_attribute_map.key?(k.to_sym))
103
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::CreateYoutubePlaylist201ResponsePlaylist`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
104
+ end
105
+ h[k.to_sym] = v
106
+ }
107
+
108
+ if attributes.key?(:'id')
109
+ self.id = attributes[:'id']
110
+ else
111
+ self.id = nil
112
+ end
113
+
114
+ if attributes.key?(:'title')
115
+ self.title = attributes[:'title']
116
+ else
117
+ self.title = nil
118
+ end
119
+
120
+ if attributes.key?(:'description')
121
+ self.description = attributes[:'description']
122
+ else
123
+ self.description = nil
124
+ end
125
+
126
+ if attributes.key?(:'privacy')
127
+ self.privacy = attributes[:'privacy']
128
+ else
129
+ self.privacy = nil
130
+ end
131
+
132
+ if attributes.key?(:'item_count')
133
+ self.item_count = attributes[:'item_count']
134
+ else
135
+ self.item_count = nil
136
+ end
137
+
138
+ if attributes.key?(:'thumbnail_url')
139
+ self.thumbnail_url = attributes[:'thumbnail_url']
140
+ else
141
+ self.thumbnail_url = nil
142
+ end
143
+ end
144
+
145
+ # Show invalid properties with the reasons. Usually used together with valid?
146
+ # @return Array for valid properties with the reasons
147
+ def list_invalid_properties
148
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
149
+ invalid_properties = Array.new
150
+ if @id.nil?
151
+ invalid_properties.push('invalid value for "id", id cannot be nil.')
152
+ end
153
+
154
+ if @title.nil?
155
+ invalid_properties.push('invalid value for "title", title cannot be nil.')
156
+ end
157
+
158
+ if @description.nil?
159
+ invalid_properties.push('invalid value for "description", description cannot be nil.')
160
+ end
161
+
162
+ if @privacy.nil?
163
+ invalid_properties.push('invalid value for "privacy", privacy cannot be nil.')
164
+ end
165
+
166
+ if @item_count.nil?
167
+ invalid_properties.push('invalid value for "item_count", item_count cannot be nil.')
168
+ end
169
+
170
+ if @thumbnail_url.nil?
171
+ invalid_properties.push('invalid value for "thumbnail_url", thumbnail_url cannot be nil.')
172
+ end
173
+
174
+ invalid_properties
175
+ end
176
+
177
+ # Check to see if the all the properties in the model are valid
178
+ # @return true if the model is valid
179
+ def valid?
180
+ warn '[DEPRECATED] the `valid?` method is obsolete'
181
+ return false if @id.nil?
182
+ return false if @title.nil?
183
+ return false if @description.nil?
184
+ return false if @privacy.nil?
185
+ privacy_validator = EnumAttributeValidator.new('String', ["private", "public", "unlisted"])
186
+ return false unless privacy_validator.valid?(@privacy)
187
+ return false if @item_count.nil?
188
+ return false if @thumbnail_url.nil?
189
+ true
190
+ end
191
+
192
+ # Custom attribute writer method with validation
193
+ # @param [Object] id Value to be assigned
194
+ def id=(id)
195
+ if id.nil?
196
+ fail ArgumentError, 'id cannot be nil'
197
+ end
198
+
199
+ @id = id
200
+ end
201
+
202
+ # Custom attribute writer method with validation
203
+ # @param [Object] title Value to be assigned
204
+ def title=(title)
205
+ if title.nil?
206
+ fail ArgumentError, 'title cannot be nil'
207
+ end
208
+
209
+ @title = title
210
+ end
211
+
212
+ # Custom attribute writer method with validation
213
+ # @param [Object] description Value to be assigned
214
+ def description=(description)
215
+ if description.nil?
216
+ fail ArgumentError, 'description cannot be nil'
217
+ end
218
+
219
+ @description = description
220
+ end
221
+
222
+ # Custom attribute writer method checking allowed values (enum).
223
+ # @param [Object] privacy Object to be assigned
224
+ def privacy=(privacy)
225
+ validator = EnumAttributeValidator.new('String', ["private", "public", "unlisted"])
226
+ unless validator.valid?(privacy)
227
+ fail ArgumentError, "invalid value for \"privacy\", must be one of #{validator.allowable_values}."
228
+ end
229
+ @privacy = privacy
230
+ end
231
+
232
+ # Custom attribute writer method with validation
233
+ # @param [Object] item_count Value to be assigned
234
+ def item_count=(item_count)
235
+ if item_count.nil?
236
+ fail ArgumentError, 'item_count cannot be nil'
237
+ end
238
+
239
+ @item_count = item_count
240
+ end
241
+
242
+ # Custom attribute writer method with validation
243
+ # @param [Object] thumbnail_url Value to be assigned
244
+ def thumbnail_url=(thumbnail_url)
245
+ if thumbnail_url.nil?
246
+ fail ArgumentError, 'thumbnail_url cannot be nil'
247
+ end
248
+
249
+ @thumbnail_url = thumbnail_url
250
+ end
251
+
252
+ # Checks equality by comparing each attribute.
253
+ # @param [Object] Object to be compared
254
+ def ==(o)
255
+ return true if self.equal?(o)
256
+ self.class == o.class &&
257
+ id == o.id &&
258
+ title == o.title &&
259
+ description == o.description &&
260
+ privacy == o.privacy &&
261
+ item_count == o.item_count &&
262
+ thumbnail_url == o.thumbnail_url
263
+ end
264
+
265
+ # @see the `==` method
266
+ # @param [Object] Object to be compared
267
+ def eql?(o)
268
+ self == o
269
+ end
270
+
271
+ # Calculates hash code according to all attributes.
272
+ # @return [Integer] Hash code
273
+ def hash
274
+ [id, title, description, privacy, item_count, thumbnail_url].hash
275
+ end
276
+
277
+ # Builds the object from hash
278
+ # @param [Hash] attributes Model attributes in the form of hash
279
+ # @return [Object] Returns the model itself
280
+ def self.build_from_hash(attributes)
281
+ return nil unless attributes.is_a?(Hash)
282
+ attributes = attributes.transform_keys(&:to_sym)
283
+ transformed_hash = {}
284
+ openapi_types.each_pair do |key, type|
285
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
286
+ transformed_hash["#{key}"] = nil
287
+ elsif type =~ /\AArray<(.*)>/i
288
+ # check to ensure the input is an array given that the attribute
289
+ # is documented as an array but the input is not
290
+ if attributes[attribute_map[key]].is_a?(Array)
291
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
292
+ end
293
+ elsif !attributes[attribute_map[key]].nil?
294
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
295
+ end
296
+ end
297
+ new(transformed_hash)
298
+ end
299
+
300
+ # Returns the object in the form of hash
301
+ # @return [Hash] Returns the object in the form of hash
302
+ def to_hash
303
+ hash = {}
304
+ self.class.attribute_map.each_pair do |attr, param|
305
+ value = self.send(attr)
306
+ if value.nil?
307
+ is_nullable = self.class.openapi_nullable.include?(attr)
308
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
309
+ end
310
+
311
+ hash[param] = _to_hash(value)
312
+ end
313
+ hash
314
+ end
315
+
316
+ end
317
+
318
+ end
@@ -0,0 +1,229 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api Versioning and deprecation: all endpoints are versioned in the URL path (current version: /v1). Breaking changes only ship in a new path version; existing versions keep working. Deprecated operations are marked 'deprecated: true' in this spec and announced in the changelog (https://zernio.com/changelog) before removal. Errors: every 4xx/5xx response is application/json with a machine-readable 'code' and a human-readable 'error' message (see the ErrorResponse schema).
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Zernio
17
+ class CreateYoutubePlaylistRequest < ApiModelBase
18
+ # Playlist title. Leading and trailing whitespace is removed.
19
+ attr_accessor :title
20
+
21
+ # Optional playlist description.
22
+ attr_accessor :description
23
+
24
+ attr_accessor :privacy
25
+
26
+ class EnumAttributeValidator
27
+ attr_reader :datatype
28
+ attr_reader :allowable_values
29
+
30
+ def initialize(datatype, allowable_values)
31
+ @allowable_values = allowable_values.map do |value|
32
+ case datatype.to_s
33
+ when /Integer/i
34
+ value.to_i
35
+ when /Float/i
36
+ value.to_f
37
+ else
38
+ value
39
+ end
40
+ end
41
+ end
42
+
43
+ def valid?(value)
44
+ !value || allowable_values.include?(value)
45
+ end
46
+ end
47
+
48
+ # Attribute mapping from ruby-style variable name to JSON key.
49
+ def self.attribute_map
50
+ {
51
+ :'title' => :'title',
52
+ :'description' => :'description',
53
+ :'privacy' => :'privacy'
54
+ }
55
+ end
56
+
57
+ # Returns attribute mapping this model knows about
58
+ def self.acceptable_attribute_map
59
+ attribute_map
60
+ end
61
+
62
+ # Returns all the JSON keys this model knows about
63
+ def self.acceptable_attributes
64
+ acceptable_attribute_map.values
65
+ end
66
+
67
+ # Attribute type mapping.
68
+ def self.openapi_types
69
+ {
70
+ :'title' => :'String',
71
+ :'description' => :'String',
72
+ :'privacy' => :'String'
73
+ }
74
+ end
75
+
76
+ # List of attributes with nullable: true
77
+ def self.openapi_nullable
78
+ Set.new([
79
+ ])
80
+ end
81
+
82
+ # Initializes the object
83
+ # @param [Hash] attributes Model attributes in the form of hash
84
+ def initialize(attributes = {})
85
+ if (!attributes.is_a?(Hash))
86
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::CreateYoutubePlaylistRequest` initialize method"
87
+ end
88
+
89
+ # check to see if the attribute exists and convert string to symbol for hash key
90
+ acceptable_attribute_map = self.class.acceptable_attribute_map
91
+ attributes = attributes.each_with_object({}) { |(k, v), h|
92
+ if (!acceptable_attribute_map.key?(k.to_sym))
93
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::CreateYoutubePlaylistRequest`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
94
+ end
95
+ h[k.to_sym] = v
96
+ }
97
+
98
+ if attributes.key?(:'title')
99
+ self.title = attributes[:'title']
100
+ else
101
+ self.title = nil
102
+ end
103
+
104
+ if attributes.key?(:'description')
105
+ self.description = attributes[:'description']
106
+ end
107
+
108
+ if attributes.key?(:'privacy')
109
+ self.privacy = attributes[:'privacy']
110
+ else
111
+ self.privacy = 'private'
112
+ end
113
+ end
114
+
115
+ # Show invalid properties with the reasons. Usually used together with valid?
116
+ # @return Array for valid properties with the reasons
117
+ def list_invalid_properties
118
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
119
+ invalid_properties = Array.new
120
+ if @title.nil?
121
+ invalid_properties.push('invalid value for "title", title cannot be nil.')
122
+ end
123
+
124
+ if @title.to_s.length < 1
125
+ invalid_properties.push('invalid value for "title", the character length must be greater than or equal to 1.')
126
+ end
127
+
128
+ invalid_properties
129
+ end
130
+
131
+ # Check to see if the all the properties in the model are valid
132
+ # @return true if the model is valid
133
+ def valid?
134
+ warn '[DEPRECATED] the `valid?` method is obsolete'
135
+ return false if @title.nil?
136
+ return false if @title.to_s.length < 1
137
+ privacy_validator = EnumAttributeValidator.new('String', ["private", "public", "unlisted"])
138
+ return false unless privacy_validator.valid?(@privacy)
139
+ true
140
+ end
141
+
142
+ # Custom attribute writer method with validation
143
+ # @param [Object] title Value to be assigned
144
+ def title=(title)
145
+ if title.nil?
146
+ fail ArgumentError, 'title cannot be nil'
147
+ end
148
+
149
+ if title.to_s.length < 1
150
+ fail ArgumentError, 'invalid value for "title", the character length must be greater than or equal to 1.'
151
+ end
152
+
153
+ @title = title
154
+ end
155
+
156
+ # Custom attribute writer method checking allowed values (enum).
157
+ # @param [Object] privacy Object to be assigned
158
+ def privacy=(privacy)
159
+ validator = EnumAttributeValidator.new('String', ["private", "public", "unlisted"])
160
+ unless validator.valid?(privacy)
161
+ fail ArgumentError, "invalid value for \"privacy\", must be one of #{validator.allowable_values}."
162
+ end
163
+ @privacy = privacy
164
+ end
165
+
166
+ # Checks equality by comparing each attribute.
167
+ # @param [Object] Object to be compared
168
+ def ==(o)
169
+ return true if self.equal?(o)
170
+ self.class == o.class &&
171
+ title == o.title &&
172
+ description == o.description &&
173
+ privacy == o.privacy
174
+ end
175
+
176
+ # @see the `==` method
177
+ # @param [Object] Object to be compared
178
+ def eql?(o)
179
+ self == o
180
+ end
181
+
182
+ # Calculates hash code according to all attributes.
183
+ # @return [Integer] Hash code
184
+ def hash
185
+ [title, description, privacy].hash
186
+ end
187
+
188
+ # Builds the object from hash
189
+ # @param [Hash] attributes Model attributes in the form of hash
190
+ # @return [Object] Returns the model itself
191
+ def self.build_from_hash(attributes)
192
+ return nil unless attributes.is_a?(Hash)
193
+ attributes = attributes.transform_keys(&:to_sym)
194
+ transformed_hash = {}
195
+ openapi_types.each_pair do |key, type|
196
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
197
+ transformed_hash["#{key}"] = nil
198
+ elsif type =~ /\AArray<(.*)>/i
199
+ # check to ensure the input is an array given that the attribute
200
+ # is documented as an array but the input is not
201
+ if attributes[attribute_map[key]].is_a?(Array)
202
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
203
+ end
204
+ elsif !attributes[attribute_map[key]].nil?
205
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
206
+ end
207
+ end
208
+ new(transformed_hash)
209
+ end
210
+
211
+ # Returns the object in the form of hash
212
+ # @return [Hash] Returns the object in the form of hash
213
+ def to_hash
214
+ hash = {}
215
+ self.class.attribute_map.each_pair do |attr, param|
216
+ value = self.send(attr)
217
+ if value.nil?
218
+ is_nullable = self.class.openapi_nullable.include?(attr)
219
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
220
+ end
221
+
222
+ hash[param] = _to_hash(value)
223
+ end
224
+ hash
225
+ end
226
+
227
+ end
228
+
229
+ end
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.938'
14
+ VERSION = '0.0.939'
15
15
  end
data/lib/zernio-sdk.rb CHANGED
@@ -445,6 +445,9 @@ require 'zernio-sdk/models/create_whats_app_template_request_library_template_bu
445
445
  require 'zernio-sdk/models/create_workflow200_response'
446
446
  require 'zernio-sdk/models/create_workflow200_response_workflow'
447
447
  require 'zernio-sdk/models/create_workflow_request'
448
+ require 'zernio-sdk/models/create_youtube_playlist201_response'
449
+ require 'zernio-sdk/models/create_youtube_playlist201_response_playlist'
450
+ require 'zernio-sdk/models/create_youtube_playlist_request'
448
451
  require 'zernio-sdk/models/crosspost_discord_message200_response'
449
452
  require 'zernio-sdk/models/ctwa_ad_request_body'
450
453
  require 'zernio-sdk/models/ctwa_ad_request_body_cities_inner'
data/openapi.yaml CHANGED
@@ -25738,6 +25738,74 @@ paths:
25738
25738
  '400': { description: Not a YouTube account }
25739
25739
  '401': { $ref: '#/components/responses/Unauthorized' }
25740
25740
  '404': { description: Account not found }
25741
+ post:
25742
+ operationId: createYoutubePlaylist
25743
+ x-resource-group: "accounts"
25744
+ tags: [Connect]
25745
+ summary: Create YouTube playlist
25746
+ description: >
25747
+ Creates an empty playlist on the connected YouTube channel. Requires a title;
25748
+ privacy defaults to private. Returns the same playlist shape as the list endpoint.
25749
+ Pass the returned playlist.id as platformSpecificData.playlistId when publishing
25750
+ a video. Does not change the account's default playlist.
25751
+ Requires the youtube or youtube.force-ssl OAuth scope. Costs 50 YouTube quota units.
25752
+ This operation is not idempotent and is not automatically retried: repeating a
25753
+ request can create another playlist, including after a timeout. List playlists
25754
+ before retrying an ambiguous failure. Official series settings are not exposed
25755
+ by YouTube's public API and must be enabled manually in YouTube's desktop playlist settings.
25756
+ parameters:
25757
+ - name: accountId
25758
+ in: path
25759
+ required: true
25760
+ schema: { type: string }
25761
+ requestBody:
25762
+ required: true
25763
+ content:
25764
+ application/json:
25765
+ schema:
25766
+ type: object
25767
+ required: [title]
25768
+ properties:
25769
+ title: { type: string, minLength: 1, description: "Playlist title. Leading and trailing whitespace is removed." }
25770
+ description: { type: string, description: "Optional playlist description." }
25771
+ privacy: { type: string, enum: [private, public, unlisted], default: private }
25772
+ example:
25773
+ title: "Tutorials"
25774
+ description: "Step-by-step video tutorials"
25775
+ privacy: "private"
25776
+ responses:
25777
+ '201':
25778
+ description: Playlist created
25779
+ content:
25780
+ application/json:
25781
+ schema:
25782
+ type: object
25783
+ required: [playlist]
25784
+ properties:
25785
+ playlist:
25786
+ type: object
25787
+ required: [id, title, description, privacy, itemCount, thumbnailUrl]
25788
+ properties:
25789
+ id: { type: string }
25790
+ title: { type: string }
25791
+ description: { type: string }
25792
+ privacy: { type: string, enum: [private, public, unlisted] }
25793
+ itemCount: { type: integer }
25794
+ thumbnailUrl: { type: string }
25795
+ example:
25796
+ playlist:
25797
+ id: "PLxxxxxxxxxxxxx"
25798
+ title: "Tutorials"
25799
+ description: "Step-by-step video tutorials"
25800
+ privacy: "private"
25801
+ itemCount: 0
25802
+ thumbnailUrl: ""
25803
+ '400': { $ref: '#/components/responses/BadRequest' }
25804
+ '401': { $ref: '#/components/responses/Unauthorized' }
25805
+ '403': { description: "API key lacks access to the account or YouTube denied permission." }
25806
+ '404': { description: "Account not found or inaccessible." }
25807
+ '429': { description: "YouTube rate limit exceeded." }
25808
+ '502': { description: "YouTube request failed. Check existing playlists before retrying, because the playlist may have been created." }
25741
25809
  put:
25742
25810
  x-resource-group: "accounts"
25743
25811
  operationId: updateYoutubeDefaultPlaylist
@@ -215,6 +215,19 @@ describe 'ConnectApi' do
215
215
  end
216
216
  end
217
217
 
218
+ # unit tests for create_youtube_playlist
219
+ # Create YouTube playlist
220
+ # Creates an empty playlist on the connected YouTube channel. Requires a title; privacy defaults to private. Returns the same playlist shape as the list endpoint. Pass the returned playlist.id as platformSpecificData.playlistId when publishing a video. Does not change the account&#39;s default playlist. Requires the youtube or youtube.force-ssl OAuth scope. Costs 50 YouTube quota units. This operation is not idempotent and is not automatically retried: repeating a request can create another playlist, including after a timeout. List playlists before retrying an ambiguous failure. Official series settings are not exposed by YouTube&#39;s public API and must be enabled manually in YouTube&#39;s desktop playlist settings.
221
+ # @param account_id
222
+ # @param create_youtube_playlist_request
223
+ # @param [Hash] opts the optional parameters
224
+ # @return [CreateYoutubePlaylist201Response]
225
+ describe 'create_youtube_playlist test' do
226
+ it 'should work' do
227
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
228
+ end
229
+ end
230
+
218
231
  # unit tests for get_connect_url
219
232
  # Get OAuth connect URL
220
233
  # Initiate an OAuth connection flow. Returns an authUrl to redirect the user to. Standard flow: Zernio hosts the selection UI, then redirects to your redirect_url. Headless mode (headless&#x3D;true): user is redirected to your redirect_url with OAuth data for custom UI. Use the platform-specific selection endpoints to complete. TikTok: every connection now goes through the TikTok for Business app. One TikTok account per profile, so connecting on a profile that already holds one replaces it. Reconnecting the SAME account keeps it and all of its history; authorizing a DIFFERENT TikTok account takes the slot over and permanently deletes the previous account&#39;s analytics, inbox and DM history. The two are told apart by the &#x60;@handle&#x60; stored at the last connect, so an account whose handle has been renamed on TikTok since then reads as a different account. An authorization that leaves out a permission the connected account needs changes nothing at all and comes back as &#x60;missing_tiktok_permissions&#x60;; connect again and accept every permission on TikTok&#39;s screen.