changeset 225:ff8d54205cb6

conflict resolution
author Daniel Boline <ddboline@gmail.com>
date Mon, 01 Mar 2021 06:51:13 -0500
parents 3b10f76f5ec6 (current diff) f51740fa8de8 (diff)
children 347243450859
files example_crates/youtube_example/src/youtube_v3_types.rs generate/generate.py generate/templates.py
diffstat 16 files changed, 16868 insertions(+), 17221 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Mon Mar 01 06:51:13 2021 -0500
@@ -0,0 +1,19 @@
+**/*.txt
+**/*.json
+**/.vim/
+**/.vim
+**/cache/
+**/__pycache__/
+generate/gen/*
+
+# Generated by Cargo
+# will have compiled files and executables
+**/debug/
+**/target/
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
+**/Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
--- a/.hgtags	Sun Feb 28 11:47:05 2021 -0500
+++ b/.hgtags	Mon Mar 01 06:51:13 2021 -0500
@@ -14,3 +14,4 @@
 f87d7be7c3d7a41c22591f8a4fc1d9d3689b46ae common_v0.1.7
 a4cf37866bc54158d5838caf8f08192d4791d6d2 v0.2.0
 d010ec97738fd8d2d5827936cf145dfa97d3e050 v0.2.1
+534d389e944fa78fe2315b5a2fb4bc0adb91d40c v0.3.0
--- a/README.md	Sun Feb 28 11:47:05 2021 -0500
+++ b/README.md	Mon Mar 01 06:51:13 2021 -0500
@@ -30,7 +30,7 @@
   generate an API stub for the API with ID `storage:v1` (Google Cloud Storage v1),
   run
   ```shell
-  $ pipenv run ./generate.py --only_apis=storage:v1
+  $ pipenv run ./generate.py --apis=storage:v1
   ```
   (install `pipenv` using `pip install --user pipenv` before, if you don't have it
   yet). See more details in that directory.
--- a/async-google-apis-common/Cargo.lock	Sun Feb 28 11:47:05 2021 -0500
+++ b/async-google-apis-common/Cargo.lock	Mon Mar 01 06:51:13 2021 -0500
@@ -14,7 +14,7 @@
 
 [[package]]
 name = "async-google-apis-common"
-version = "0.2.1"
+version = "0.3.0"
 dependencies = [
  "anyhow",
  "chrono",
--- a/async-google-apis-common/Cargo.toml	Sun Feb 28 11:47:05 2021 -0500
+++ b/async-google-apis-common/Cargo.toml	Mon Mar 01 06:51:13 2021 -0500
@@ -1,6 +1,6 @@
 [package]
 name = "async-google-apis-common"
-version = "0.2.1"
+version = "0.3.0"
 authors = ["Lewin Bormann <lewin@lewin-bormann.info>"]
 edition = "2018"
 keywords = ["rest", "google", "async", "api"]
--- a/example_crates/drive_example/Cargo.lock	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/drive_example/Cargo.lock	Mon Mar 01 06:51:13 2021 -0500
@@ -23,7 +23,7 @@
 
 [[package]]
 name = "async-google-apis-common"
-version = "0.2.0"
+version = "0.3.0"
 dependencies = [
  "anyhow",
  "chrono",
@@ -860,9 +860,9 @@
 
 [[package]]
 name = "tokio"
-version = "1.0.1"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d258221f566b6c803c7b4714abadc080172b272090cdc5e244a6d4dd13c3a6bd"
+checksum = "e8190d04c665ea9e6b6a0dc45523ade572c088d2e6566244c1122671dbf4ae3a"
 dependencies = [
  "autocfg",
  "bytes",
@@ -876,9 +876,9 @@
 
 [[package]]
 name = "tokio-macros"
-version = "1.0.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42517d2975ca3114b22a16192634e8241dc5cc1f130be194645970cc1c371494"
+checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"
 dependencies = [
  "proc-macro2",
  "quote",
--- a/example_crates/drive_example/src/drive_v3_types.rs	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/drive_example/src/drive_v3_types.rs	Mon Mar 01 06:51:13 2021 -0500
@@ -74,7 +74,6 @@
     }
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct AboutDriveThemes {
     /// A link to this theme's background image.
@@ -112,7 +111,6 @@
     pub usage_in_drive_trash: Option<String>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct AboutTeamDriveThemes {
     /// Deprecated - use driveThemes/backgroundImageLink instead.
@@ -228,7 +226,7 @@
     /// Deprecated - use changeType instead.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
+    pub type_: Option<String>,
 }
 
 /// A list of changes for a user.
@@ -294,7 +292,7 @@
     /// The type of delivery mechanism used for this channel.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
+    pub type_: Option<String>,
 }
 
 /// The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.
@@ -400,7 +398,7 @@
     /// The type of the content restriction. Currently the only possible value is globalContentRestriction.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
+    pub type_: Option<String>,
 }
 
 /// An image file and cropping parameters from which a background image for this shared drive is set. This is a write only field; it can only be set on drive.drives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.
@@ -894,7 +892,8 @@
 /// The metadata for a file.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct File {
-    /// A collection of arbitrary key-value pairs which are private to the requesting app. Entries with null values are cleared in update and copy requests. These properties can only be retrieved using an authenticated request. An authenticated request uses an access token obtained with a OAuth 2 client ID. You cannot use an API key to retrieve private properties.
+    /// A collection of arbitrary key-value pairs which are private to the requesting app.
+    /// Entries with null values are cleared in update and copy requests. These properties can only be retrieved using an authenticated request. An authenticated request uses an access token obtained with a OAuth 2 client ID. You cannot use an API key to retrieve private properties.
     #[serde(rename = "appProperties")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub app_properties: Option<HashMap<String, String>>,
@@ -938,11 +937,13 @@
     #[serde(rename = "fileExtension")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub file_extension: Option<String>,
-    /// The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource. If an unsupported color is specified, the closest color in the palette will be used instead.
+    /// The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.
+    /// If an unsupported color is specified, the closest color in the palette will be used instead.
     #[serde(rename = "folderColorRgb")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub folder_color_rgb: Option<String>,
-    /// The full file extension extracted from the name field. May contain multiple concatenated extensions, such as "tar.gz". This is only available for files with binary content in Google Drive. This is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.
+    /// The full file extension extracted from the name field. May contain multiple concatenated extensions, such as "tar.gz". This is only available for files with binary content in Google Drive.
+    /// This is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.
     #[serde(rename = "fullFileExtension")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub full_file_extension: Option<String>,
@@ -985,7 +986,9 @@
     #[serde(rename = "md5Checksum")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub md5_checksum: Option<String>,
-    /// The MIME type of the file. Google Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded. If a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.
+    /// The MIME type of the file.
+    /// Google Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.
+    /// If a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.
     #[serde(rename = "mimeType")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub mime_type: Option<String>,
@@ -997,7 +1000,8 @@
     #[serde(rename = "modifiedByMeTime")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub modified_by_me_time: Option<DateTime<Utc>>,
-    /// DateTime: The last time the file was modified by anyone (RFC 3339 date-time). Note that setting modifiedTime will also update modifiedByMeTime for the user.
+    /// DateTime: The last time the file was modified by anyone (RFC 3339 date-time).
+    /// Note that setting modifiedTime will also update modifiedByMeTime for the user.
     #[serde(rename = "modifiedTime")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub modified_time: Option<DateTime<Utc>>,
@@ -1017,7 +1021,8 @@
     #[serde(rename = "owners")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub owners: Option<Vec<User>>,
-    /// The IDs of the parent folders which contain the file. If not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list.
+    /// The IDs of the parent folders which contain the file.
+    /// If not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list.
     #[serde(rename = "parents")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub parents: Option<Vec<String>>,
@@ -1029,7 +1034,8 @@
     #[serde(rename = "permissions")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub permissions: Option<Vec<Permission>>,
-    /// A collection of arbitrary key-value pairs which are visible to all apps. Entries with null values are cleared in update and copy requests.
+    /// A collection of arbitrary key-value pairs which are visible to all apps.
+    /// Entries with null values are cleared in update and copy requests.
     #[serde(rename = "properties")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub properties: Option<HashMap<String, String>>,
@@ -1159,7 +1165,6 @@
     pub space: Option<String>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct PermissionPermissionDetails {
     /// Whether this permission is inherited. This field is always populated. This is an output-only field.
@@ -1170,17 +1175,23 @@
     #[serde(rename = "inheritedFrom")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub inherited_from: Option<String>,
-    /// The permission type for this user. While new values may be added in future, the following are currently possible:   - file  - member
+    /// The permission type for this user. While new values may be added in future, the following are currently possible:  
+    /// - file
+    /// - member
     #[serde(rename = "permissionType")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub permission_type: Option<String>,
-    /// The primary role for this user. While new values may be added in the future, the following are currently possible:   - organizer  - fileOrganizer  - writer  - commenter  - reader
+    /// The primary role for this user. While new values may be added in the future, the following are currently possible:  
+    /// - organizer
+    /// - fileOrganizer
+    /// - writer
+    /// - commenter
+    /// - reader
     #[serde(rename = "role")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub role: Option<String>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct PermissionTeamDrivePermissionDetails {
     /// Deprecated - use permissionDetails/inherited instead.
@@ -1212,7 +1223,11 @@
     #[serde(rename = "deleted")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub deleted: Option<bool>,
-    /// The "pretty" name of the value of the permission. The following is a list of examples for each type of permission:   - user - User's full name, as defined for their Google account, such as "Joe Smith."  - group - Name of the Google Group, such as "The Company Administrators."  - domain - String domain name, such as "thecompany.com."  - anyone - No displayName is present.
+    /// The "pretty" name of the value of the permission. The following is a list of examples for each type of permission:  
+    /// - user - User's full name, as defined for their Google account, such as "Joe Smith."
+    /// - group - Name of the Google Group, such as "The Company Administrators."
+    /// - domain - String domain name, such as "thecompany.com."
+    /// - anyone - No displayName is present.
     #[serde(rename = "displayName")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub display_name: Option<String>,
@@ -1224,7 +1239,10 @@
     #[serde(rename = "emailAddress")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub email_address: Option<String>,
-    /// DateTime: The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:   - They can only be set on user and group permissions  - The time must be in the future  - The time cannot be more than a year in the future
+    /// DateTime: The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  
+    /// - They can only be set on user and group permissions
+    /// - The time must be in the future
+    /// - The time cannot be more than a year in the future
     #[serde(rename = "expirationTime")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub expiration_time: Option<DateTime<Utc>>,
@@ -1244,7 +1262,13 @@
     #[serde(rename = "photoLink")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub photo_link: Option<String>,
-    /// The role granted by this permission. While new values may be supported in the future, the following are currently allowed:   - owner  - organizer  - fileOrganizer  - writer  - commenter  - reader
+    /// The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  
+    /// - owner
+    /// - organizer
+    /// - fileOrganizer
+    /// - writer
+    /// - commenter
+    /// - reader
     #[serde(rename = "role")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub role: Option<String>,
@@ -1252,10 +1276,14 @@
     #[serde(rename = "teamDrivePermissionDetails")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub team_drive_permission_details: Option<Vec<PermissionTeamDrivePermissionDetails>>,
-    /// The type of the grantee. Valid values are:   - user  - group  - domain  - anyone  When creating a permission, if type is user or group, you must provide an emailAddress for the user or group. When type is domain, you must provide a domain. There isn't extra information required for a anyone type.
+    /// The type of the grantee. Valid values are:  
+    /// - user
+    /// - group
+    /// - domain
+    /// - anyone  When creating a permission, if type is user or group, you must provide an emailAddress for the user or group. When type is domain, you must provide a domain. There isn't extra information required for a anyone type.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
+    pub type_: Option<String>,
     /// Indicates the view for this permission. Only populated for permissions that belong to a view. published is the only supported value.
     #[serde(rename = "view")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -1282,7 +1310,9 @@
 /// A reply to a comment on a file.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct Reply {
-    /// The action the reply performed to the parent comment. Valid values are:   - resolve  - reopen
+    /// The action the reply performed to the parent comment. Valid values are:  
+    /// - resolve
+    /// - reopen
     #[serde(rename = "action")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub action: Option<String>,
@@ -1347,7 +1377,8 @@
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-    /// Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file. This field is only applicable to files with binary content in Drive.
+    /// Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.
+    /// This field is only applicable to files with binary content in Drive.
     #[serde(rename = "keepForever")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub keep_forever: Option<bool>,
@@ -1413,7 +1444,6 @@
     pub revisions: Option<Vec<Revision>>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct StartPageToken {
     /// Identifies what kind of resource this is. Value: the fixed string "drive#startPageToken".
@@ -3819,7 +3849,6 @@
     }
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct DriveParams {
     /// Data format for the response.
@@ -3919,7 +3948,7 @@
 
 impl AboutService {
     /// Create a new AboutService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> AboutService {
         AboutService {
@@ -4016,7 +4045,7 @@
 
 impl ChangesService {
     /// Create a new ChangesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChangesService {
         ChangesService {
@@ -4175,7 +4204,7 @@
 
 impl ChannelsService {
     /// Create a new ChannelsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelsService {
         ChannelsService {
@@ -4273,7 +4302,7 @@
 
 impl CommentsService {
     /// Create a new CommentsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentsService {
         CommentsService {
@@ -4515,7 +4544,7 @@
 
 impl DrivesService {
     /// Create a new DrivesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> DrivesService {
         DrivesService {
@@ -4803,7 +4832,7 @@
 
 impl FilesService {
     /// Create a new FilesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> FilesService {
         FilesService {
@@ -5398,7 +5427,7 @@
 
 impl PermissionsService {
     /// Create a new PermissionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PermissionsService {
         PermissionsService {
@@ -5648,7 +5677,7 @@
 
 impl RepliesService {
     /// Create a new RepliesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> RepliesService {
         RepliesService {
@@ -5901,7 +5930,7 @@
 
 impl RevisionsService {
     /// Create a new RevisionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> RevisionsService {
         RevisionsService {
@@ -6115,7 +6144,7 @@
 
 impl TeamdrivesService {
     /// Create a new TeamdrivesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> TeamdrivesService {
         TeamdrivesService {
--- a/example_crates/drive_example/src/media_download.patch	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/drive_example/src/media_download.patch	Mon Mar 01 06:51:13 2021 -0500
@@ -1,6 +1,6 @@
---- ../../generate/gen/drive_v3_types.rs	2021-01-29 11:36:40.915194494 +0100
-+++ src/drive_v3_types.rs	2021-01-29 11:42:27.374665228 +0100
-@@ -1676,6 +1676,8 @@
+--- a/src/drive_v3_types.rs
++++ b/src/drive_v3_types.rs
+@@ -1706,6 +1706,8 @@
      /// Responses with Content-Type of application/json
      #[serde(rename = "json")]
      Json,
@@ -9,7 +9,7 @@
  }
  
  impl std::default::Default for DriveParamsAlt {
-@@ -1689,6 +1691,7 @@
+@@ -1719,6 +1721,7 @@
          let s = match self {
              DriveParamsAlt::Undefined => write!(f, "undefined"),
              DriveParamsAlt::Json => write!(f, "json"),
--- a/example_crates/gcs_example/Cargo.lock	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/gcs_example/Cargo.lock	Mon Mar 01 06:51:13 2021 -0500
@@ -1,5 +1,7 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
+version = 3
+
 [[package]]
 name = "aho-corasick"
 version = "0.7.15"
@@ -32,7 +34,7 @@
 
 [[package]]
 name = "async-google-apis-common"
-version = "0.2.0"
+version = "0.3.0"
 dependencies = [
  "anyhow",
  "chrono",
@@ -901,9 +903,9 @@
 
 [[package]]
 name = "tokio"
-version = "1.0.1"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d258221f566b6c803c7b4714abadc080172b272090cdc5e244a6d4dd13c3a6bd"
+checksum = "e8190d04c665ea9e6b6a0dc45523ade572c088d2e6566244c1122671dbf4ae3a"
 dependencies = [
  "autocfg",
  "bytes",
@@ -917,9 +919,9 @@
 
 [[package]]
 name = "tokio-macros"
-version = "1.0.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42517d2975ca3114b22a16192634e8241dc5cc1f130be194645970cc1c371494"
+checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"
 dependencies = [
  "proc-macro2",
  "quote",
--- a/example_crates/gcs_example/src/media_download.patch	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/gcs_example/src/media_download.patch	Mon Mar 01 06:51:13 2021 -0500
@@ -1,6 +1,6 @@
---- ../../generate/gen/storage_v1_types.rs	2021-01-29 11:49:42.176524408 +0100
-+++ src/storage_v1_types.rs	2021-01-29 13:25:13.281422576 +0100
-@@ -1125,6 +1125,8 @@
+--- a/src/storage_v1_types.rs
++++ b/src/storage_v1_types.rs
+@@ -2070,6 +2070,8 @@
      /// Responses with Content-Type of application/json
      #[serde(rename = "json")]
      Json,
@@ -9,7 +9,7 @@
  }
  
  impl std::default::Default for StorageParamsAlt {
-@@ -1138,6 +1140,7 @@
+@@ -2083,6 +2085,7 @@
          let s = match self {
              StorageParamsAlt::Undefined => write!(f, "undefined"),
              StorageParamsAlt::Json => write!(f, "json"),
--- a/example_crates/gcs_example/src/storage_v1_types.rs	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/gcs_example/src/storage_v1_types.rs	Mon Mar 01 06:51:13 2021 -0500
@@ -72,7 +72,6 @@
     pub requester_pays: Option<bool>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct BucketCors {
     /// The value, in seconds, to return in the  Access-Control-Max-Age header used in preflight responses.
@@ -155,7 +154,7 @@
     /// Type of the action. Currently, only Delete and SetStorageClass are supported.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
+    pub type_: Option<String>,
 }
 
 /// The condition(s) under which the action will be taken.
@@ -203,7 +202,6 @@
     pub num_newer_versions: Option<i32>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct BucketLifecycleRule {
     /// The action to take.
@@ -435,7 +433,18 @@
     #[serde(rename = "email")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub email: Option<String>,
-    /// The entity holding the permission, in one of the following forms:  - user-userId  - user-email  - group-groupId  - group-email  - domain-domain  - project-team-projectId  - allUsers  - allAuthenticatedUsers Examples:  - The user liz@example.com would be user-liz@example.com.  - The group example@googlegroups.com would be group-example@googlegroups.com.  - To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.
+    /// The entity holding the permission, in one of the following forms:
+    /// - user-userId
+    /// - user-email
+    /// - group-groupId
+    /// - group-email
+    /// - domain-domain
+    /// - project-team-projectId
+    /// - allUsers
+    /// - allAuthenticatedUsers Examples:
+    /// - The user liz@example.com would be user-liz@example.com.
+    /// - The group example@googlegroups.com would be group-example@googlegroups.com.
+    /// - To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.
     #[serde(rename = "entity")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub entity: Option<String>,
@@ -541,7 +550,7 @@
     /// The type of delivery mechanism used for this channel.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
+    pub type_: Option<String>,
 }
 
 /// Conditions that must be met for this operation to execute.
@@ -553,7 +562,6 @@
     pub if_generation_match: Option<String>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ComposeRequestSourceObjects {
     /// i64: The generation of this object to use as the source.
@@ -926,7 +934,18 @@
     #[serde(rename = "email")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub email: Option<String>,
-    /// The entity holding the permission, in one of the following forms:  - user-userId  - user-email  - group-groupId  - group-email  - domain-domain  - project-team-projectId  - allUsers  - allAuthenticatedUsers Examples:  - The user liz@example.com would be user-liz@example.com.  - The group example@googlegroups.com would be group-example@googlegroups.com.  - To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.
+    /// The entity holding the permission, in one of the following forms:
+    /// - user-userId
+    /// - user-email
+    /// - group-groupId
+    /// - group-email
+    /// - domain-domain
+    /// - project-team-projectId
+    /// - allUsers
+    /// - allAuthenticatedUsers Examples:
+    /// - The user liz@example.com would be user-liz@example.com.
+    /// - The group example@googlegroups.com would be group-example@googlegroups.com.
+    /// - To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.
     #[serde(rename = "entity")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub entity: Option<String>,
@@ -1002,17 +1021,35 @@
     pub prefixes: Option<Vec<String>>,
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct PolicyBindings {
     #[serde(rename = "condition")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub condition: Option<Expr>,
-    /// A collection of identifiers for members who may assume the provided role. Recognized identifiers are as follows:   - allUsers — A special identifier that represents anyone on the internet; with or without a Google account.   - allAuthenticatedUsers — A special identifier that represents anyone who is authenticated with a Google account or a service account.   - user:emailid — An email address that represents a specific account. For example, user:alice@gmail.com or user:joe@example.com.   - serviceAccount:emailid — An email address that represents a service account. For example,  serviceAccount:my-other-app@appspot.gserviceaccount.com .   - group:emailid — An email address that represents a Google group. For example, group:admins@example.com.   - domain:domain — A Google Apps domain name that represents all the users of that domain. For example, domain:google.com or domain:example.com.   - projectOwner:projectid — Owners of the given project. For example, projectOwner:my-example-project   - projectEditor:projectid — Editors of the given project. For example, projectEditor:my-example-project   - projectViewer:projectid — Viewers of the given project. For example, projectViewer:my-example-project
+    /// A collection of identifiers for members who may assume the provided role. Recognized identifiers are as follows:  
+    /// - allUsers — A special identifier that represents anyone on the internet; with or without a Google account.  
+    /// - allAuthenticatedUsers — A special identifier that represents anyone who is authenticated with a Google account or a service account.  
+    /// - user:emailid — An email address that represents a specific account. For example, user:alice@gmail.com or user:joe@example.com.  
+    /// - serviceAccount:emailid — An email address that represents a service account. For example,  serviceAccount:my-other-app@appspot.gserviceaccount.com .  
+    /// - group:emailid — An email address that represents a Google group. For example, group:admins@example.com.  
+    /// - domain:domain — A Google Apps domain name that represents all the users of that domain. For example, domain:google.com or domain:example.com.  
+    /// - projectOwner:projectid — Owners of the given project. For example, projectOwner:my-example-project  
+    /// - projectEditor:projectid — Editors of the given project. For example, projectEditor:my-example-project  
+    /// - projectViewer:projectid — Viewers of the given project. For example, projectViewer:my-example-project
     #[serde(rename = "members")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub members: Option<Vec<String>>,
-    /// The role to which members belong. Two types of roles are supported: new IAM roles, which grant permissions that do not map directly to those provided by ACLs, and legacy IAM roles, which do map directly to ACL permissions. All roles are of the format roles/storage.specificRole. The new IAM roles are:   - roles/storage.admin — Full control of Google Cloud Storage resources.   - roles/storage.objectViewer — Read-Only access to Google Cloud Storage objects.   - roles/storage.objectCreator — Access to create objects in Google Cloud Storage.   - roles/storage.objectAdmin — Full control of Google Cloud Storage objects.   The legacy IAM roles are:   - roles/storage.legacyObjectReader — Read-only access to objects without listing. Equivalent to an ACL entry on an object with the READER role.   - roles/storage.legacyObjectOwner — Read/write access to existing objects without listing. Equivalent to an ACL entry on an object with the OWNER role.   - roles/storage.legacyBucketReader — Read access to buckets with object listing. Equivalent to an ACL entry on a bucket with the READER role.   - roles/storage.legacyBucketWriter — Read access to buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the WRITER role.   - roles/storage.legacyBucketOwner — Read and write access to existing buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the OWNER role.
+    /// The role to which members belong. Two types of roles are supported: new IAM roles, which grant permissions that do not map directly to those provided by ACLs, and legacy IAM roles, which do map directly to ACL permissions. All roles are of the format roles/storage.specificRole.
+    /// The new IAM roles are:  
+    /// - roles/storage.admin — Full control of Google Cloud Storage resources.  
+    /// - roles/storage.objectViewer — Read-Only access to Google Cloud Storage objects.  
+    /// - roles/storage.objectCreator — Access to create objects in Google Cloud Storage.  
+    /// - roles/storage.objectAdmin — Full control of Google Cloud Storage objects.   The legacy IAM roles are:  
+    /// - roles/storage.legacyObjectReader — Read-only access to objects without listing. Equivalent to an ACL entry on an object with the READER role.  
+    /// - roles/storage.legacyObjectOwner — Read/write access to existing objects without listing. Equivalent to an ACL entry on an object with the OWNER role.  
+    /// - roles/storage.legacyBucketReader — Read access to buckets with object listing. Equivalent to an ACL entry on a bucket with the READER role.  
+    /// - roles/storage.legacyBucketWriter — Read access to buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the WRITER role.  
+    /// - roles/storage.legacyBucketOwner — Read and write access to existing buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the OWNER role.
     #[serde(rename = "role")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub role: Option<String>,
@@ -1091,7 +1128,21 @@
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// The permissions held by the caller. Permissions are always of the format storage.resource.capability, where resource is one of buckets or objects. The supported permissions are as follows:   - storage.buckets.delete — Delete bucket.   - storage.buckets.get — Read bucket metadata.   - storage.buckets.getIamPolicy — Read bucket IAM policy.   - storage.buckets.create — Create bucket.   - storage.buckets.list — List buckets.   - storage.buckets.setIamPolicy — Update bucket IAM policy.   - storage.buckets.update — Update bucket metadata.   - storage.objects.delete — Delete object.   - storage.objects.get — Read object data and metadata.   - storage.objects.getIamPolicy — Read object IAM policy.   - storage.objects.create — Create object.   - storage.objects.list — List objects.   - storage.objects.setIamPolicy — Update object IAM policy.   - storage.objects.update — Update object metadata.
+    /// The permissions held by the caller. Permissions are always of the format storage.resource.capability, where resource is one of buckets or objects. The supported permissions are as follows:  
+    /// - storage.buckets.delete — Delete bucket.  
+    /// - storage.buckets.get — Read bucket metadata.  
+    /// - storage.buckets.getIamPolicy — Read bucket IAM policy.  
+    /// - storage.buckets.create — Create bucket.  
+    /// - storage.buckets.list — List buckets.  
+    /// - storage.buckets.setIamPolicy — Update bucket IAM policy.  
+    /// - storage.buckets.update — Update bucket metadata.  
+    /// - storage.objects.delete — Delete object.  
+    /// - storage.objects.get — Read object data and metadata.  
+    /// - storage.objects.getIamPolicy — Read object IAM policy.  
+    /// - storage.objects.create — Create object.  
+    /// - storage.objects.list — List objects.  
+    /// - storage.objects.setIamPolicy — Update object IAM policy.  
+    /// - storage.objects.update — Update object metadata.
     #[serde(rename = "permissions")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub permissions: Option<Vec<String>>,
@@ -5252,7 +5303,6 @@
     }
 }
 
-///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct StorageParams {
     /// Data format for the response.
@@ -5352,7 +5402,7 @@
 
 impl BucketAccessControlsService {
     /// Create a new BucketAccessControlsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> BucketAccessControlsService {
         BucketAccessControlsService {
@@ -5634,7 +5684,7 @@
 
 impl BucketsService {
     /// Create a new BucketsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> BucketsService {
         BucketsService {
@@ -6030,7 +6080,7 @@
 
 impl ChannelsService {
     /// Create a new ChannelsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelsService {
         ChannelsService {
@@ -6128,7 +6178,7 @@
 
 impl DefaultObjectAccessControlsService {
     /// Create a new DefaultObjectAccessControlsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(
         client: TlsClient,
@@ -6416,7 +6466,7 @@
 
 impl NotificationsService {
     /// Create a new NotificationsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> NotificationsService {
         NotificationsService {
@@ -6625,7 +6675,7 @@
 
 impl ObjectAccessControlsService {
     /// Create a new ObjectAccessControlsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ObjectAccessControlsService {
         ObjectAccessControlsService {
@@ -6913,7 +6963,7 @@
 
 impl ObjectsService {
     /// Create a new ObjectsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ObjectsService {
         ObjectsService {
@@ -7553,7 +7603,7 @@
 
 impl ProjectsService {
     /// Create a new ProjectsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ProjectsService {
         ProjectsService {
@@ -7621,7 +7671,7 @@
 
 impl ProjectsHmacKeysService {
     /// Create a new ProjectsHmacKeysService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ProjectsHmacKeysService {
         ProjectsHmacKeysService {
@@ -7872,7 +7922,7 @@
 
 impl ProjectsServiceAccountService {
     /// Create a new ProjectsServiceAccountService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(
         client: TlsClient,
--- a/example_crates/youtube_example/Cargo.lock	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/youtube_example/Cargo.lock	Mon Mar 01 06:51:13 2021 -0500
@@ -23,7 +23,7 @@
 
 [[package]]
 name = "async-google-apis-common"
-version = "0.2.0"
+version = "0.3.0"
 dependencies = [
  "anyhow",
  "chrono",
@@ -847,9 +847,9 @@
 
 [[package]]
 name = "tokio"
-version = "1.0.1"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d258221f566b6c803c7b4714abadc080172b272090cdc5e244a6d4dd13c3a6bd"
+checksum = "e8190d04c665ea9e6b6a0dc45523ade572c088d2e6566244c1122671dbf4ae3a"
 dependencies = [
  "autocfg",
  "bytes",
@@ -863,9 +863,9 @@
 
 [[package]]
 name = "tokio-macros"
-version = "1.0.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42517d2975ca3114b22a16192634e8241dc5cc1f130be194645970cc1c371494"
+checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"
 dependencies = [
  "proc-macro2",
  "quote",
--- a/example_crates/youtube_example/src/youtube_v3_types.rs	Sun Feb 28 11:47:05 2021 -0500
+++ b/example_crates/youtube_example/src/youtube_v3_types.rs	Mon Mar 01 06:51:13 2021 -0500
@@ -21,18 +21,22 @@
 /// Scopes of this API. Convertible to their string representation with `AsRef`.
 #[derive(Debug, Clone, Copy)]
 pub enum YoutubeScopes {
+    /// See, edit, and permanently delete your YouTube videos, ratings, comments and captions
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube.force-ssl
+    YoutubeForceSsl,
+    /// See a list of your current active channel members, their current level, and when they became a member
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube.channel-memberships.creator
+    YoutubeChannelMembershipsCreator,
+    /// Manage your YouTube videos
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube.upload
+    YoutubeUpload,
     /// View your YouTube account
     ///
     /// URL: https://www.googleapis.com/auth/youtube.readonly
     YoutubeReadonly,
-    /// Manage your YouTube videos
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube.upload
-    YoutubeUpload,
-    /// See a list of your current active channel members, their current level, and when they became a member
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube.channel-memberships.creator
-    YoutubeChannelMembershipsCreator,
     /// View private information of your YouTube channel relevant during the audit process with a YouTube partner
     ///
     /// URL: https://www.googleapis.com/auth/youtubepartner-channel-audit
@@ -41,10 +45,6 @@
     ///
     /// URL: https://www.googleapis.com/auth/youtube
     Youtube,
-    /// See, edit, and permanently delete your YouTube videos, ratings, comments and captions
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube.force-ssl
-    YoutubeForceSsl,
     /// View and manage your assets and associated content on YouTube
     ///
     /// URL: https://www.googleapis.com/auth/youtubepartner
@@ -54,21 +54,457 @@
 impl std::convert::AsRef<str> for YoutubeScopes {
     fn as_ref(&self) -> &'static str {
         match self {
-            YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
-            YoutubeScopes::YoutubeUpload => "https://www.googleapis.com/auth/youtube.upload",
+            YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
             YoutubeScopes::YoutubeChannelMembershipsCreator => {
                 "https://www.googleapis.com/auth/youtube.channel-memberships.creator"
             }
+            YoutubeScopes::YoutubeUpload => "https://www.googleapis.com/auth/youtube.upload",
+            YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
             YoutubeScopes::YoutubepartnerChannelAudit => {
                 "https://www.googleapis.com/auth/youtubepartner-channel-audit"
             }
             YoutubeScopes::Youtube => "https://www.googleapis.com/auth/youtube",
-            YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
             YoutubeScopes::Youtubepartner => "https://www.googleapis.com/auth/youtubepartner",
         }
     }
 }
 
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveChatMessage>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessageListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The amount of time the client should wait before polling again.
+    #[serde(rename = "pollingIntervalMillis")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub polling_interval_millis: Option<u32>,
+    /// DateTime: The date and time when the underlying stream went offline.
+    #[serde(rename = "offlineAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub offline_at: Option<DateTime<Utc>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+}
+
+/// A *playlistItem* resource identifies another resource, such as a video, that is included in a playlist. In addition, the playlistItem resource contains details about the included resource that pertain specifically to how that resource is used in that playlist. YouTube uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods. For example, if a user gives a positive rating to a video, you would insert that video into the liked videos playlist for that user's channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItem {
+    /// The ID that YouTube uses to uniquely identify the playlist item.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<PlaylistItemStatus>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<PlaylistItemSnippet>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<PlaylistItemContentDetails>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsDurationAtLevel {
+    /// The cumulative time the user has been a member for the given level in complete months (the time is rounded down to the nearest integer).
+    #[serde(rename = "memberTotalDurationMonths")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_total_duration_months: Option<i32>,
+    /// Pricing level ID.
+    #[serde(rename = "level")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub level: Option<String>,
+    /// The date and time when the user became a continuous member for the given level.
+    #[serde(rename = "memberSince")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_since: Option<String>,
+}
+
+/// Information about an audio stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoFileDetailsAudioStream {
+    /// The number of audio channels that the stream contains.
+    #[serde(rename = "channelCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_count: Option<u32>,
+    /// The audio codec that the stream uses.
+    #[serde(rename = "codec")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub codec: Option<String>,
+    /// u64: The audio stream's bitrate, in bits per second.
+    #[serde(rename = "bitrateBps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bitrate_bps: Option<String>,
+    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
+    #[serde(rename = "vendor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub vendor: Option<String>,
+}
+
+/// Channel localization setting
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelLocalization {
+    /// The localized strings for channel's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The localized strings for channel's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+}
+
+/// Comments written in (direct or indirect) reply to the top level comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadReplies {
+    /// A limited number of replies. Unless the number of replies returned equals total_reply_count in the snippet the returned replies are only a subset of the total number of replies.
+    #[serde(rename = "comments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comments: Option<Vec<Comment>>,
+}
+
+/// Basic details about a channel section, including title, style and position.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionSnippet {
+    /// The language of the channel section's default title and description.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<ChannelSectionLocalization>,
+    /// The style of the channel section.
+    #[serde(rename = "style")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub style: Option<ChannelSectionSnippetStyle>,
+    /// The ID that YouTube uses to uniquely identify the channel that published the channel section.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The position of the channel section in the channel.
+    #[serde(rename = "position")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub position: Option<u32>,
+    /// The type of the channel section.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<ChannelSectionSnippetType>,
+    /// The channel section's title for multiple_playlists and multiple_channels.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Entity {
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: Option<String>,
+    #[serde(rename = "typeId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_id: Option<String>,
+}
+
+/// A *comment* represents a single YouTube comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Comment {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#comment".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the comment.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<CommentSnippet>,
+}
+
+/// A *video* resource represents a YouTube video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Video {
+    #[serde(rename = "projectDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub project_details: Option<VideoProjectDetails>,
+    /// The ID that YouTube uses to uniquely identify the video.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#video".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<VideoStatistics>,
+    #[serde(rename = "suggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub suggestions: Option<VideoSuggestions>,
+    /// The localizations object contains localized versions of the basic details about the video, such as its title and description.
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, VideoLocalization>>,
+    #[serde(rename = "ageGating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub age_gating: Option<VideoAgeGating>,
+    #[serde(rename = "recordingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_details: Option<VideoRecordingDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "player")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub player: Option<VideoPlayer>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<VideoContentDetails>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<VideoStatus>,
+    #[serde(rename = "fileDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_details: Option<VideoFileDetails>,
+    #[serde(rename = "monetizationDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub monetization_details: Option<VideoMonetizationDetails>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoSnippet>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<VideoTopicDetails>,
+    #[serde(rename = "processingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_details: Option<VideoProcessingDetails>,
+    #[serde(rename = "liveStreamingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
+}
+
+/// Basic details about a playlist, including title, description and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistSnippet {
+    /// Note: if the playlist has a custom thumbnail, this field will not be populated. The video id selected by the user that will be used as the thumbnail of this playlist. This field defaults to the first publicly viewable video in the playlist, if: 1. The user has never selected a video to be the thumbnail of the playlist. 2. The user selects a video to be the thumbnail, and then removes that video from the playlist. 3. The user selects a non-owned video to be the thumbnail, but that video becomes private, or gets deleted.
+    #[serde(rename = "thumbnailVideoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnail_video_id: Option<String>,
+    /// The language of the playlist's default title and description.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+    /// The channel title of the channel that the video belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// Keyword tags associated with the playlist.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<String>>,
+    /// The playlist's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel that published the playlist.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// DateTime: The date and time that the playlist was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<PlaylistLocalization>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The playlist's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+}
+
+/// Information about the playlist item's privacy status.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemStatus {
+    /// This resource's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<PlaylistItemStatusPrivacyStatus>,
+}
+
+/// Basic details about a comment thread.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadSnippet {
+    /// The ID of the video the comments refer to, if any. No video_id implies a channel discussion comment.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// Whether the thread (and therefore all its comments) is visible to all YouTube users.
+    #[serde(rename = "isPublic")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_public: Option<bool>,
+    /// The total number of replies (not including the top level comment).
+    #[serde(rename = "totalReplyCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_reply_count: Option<u32>,
+    /// Whether the current viewer of the thread can reply to it. This is viewer specific - other viewers may see a different value for this field.
+    #[serde(rename = "canReply")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub can_reply: Option<bool>,
+    /// The YouTube channel the comments in the thread refer to or the channel with the video the comments refer to. If video_id isn't set the comments refer to the channel itself.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    #[serde(rename = "topLevelComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub top_level_comment: Option<Comment>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegionListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// A list of regions where YouTube is available. In this map, the i18n region ID is the map key, and its value is the corresponding i18nRegion resource.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<I18nRegion>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistListResponse {
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// A list of playlists that match the request criteria
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Playlist>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageRetractedDetails {
+    #[serde(rename = "retractedMessageId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub retracted_message_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MemberListResponse {
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// A list of members that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Member>>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#memberListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+}
+
 /// Details about a channelsection, including playlists and channels.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ChannelSectionContentDetails {
@@ -82,153 +518,341 @@
     pub channels: Option<Vec<String>>,
 }
 
-/// Statistics about the video, such as the number of times the video was viewed or liked.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoStatistics {
-    /// u64: The number of times the video has been viewed.
-    #[serde(rename = "viewCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub view_count: Option<String>,
-    /// u64: The number of users who have indicated that they liked the video by giving it a positive rating.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<String>,
-    /// u64: The number of users who have indicated that they disliked the video by giving it a negative rating.
-    #[serde(rename = "dislikeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dislike_count: Option<String>,
-    /// u64: The number of users who currently have the video marked as a favorite video.
-    #[serde(rename = "favoriteCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub favorite_count: Option<String>,
-    /// u64: The number of comments for the video.
-    #[serde(rename = "commentCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_count: Option<String>,
-}
-
-/// Details about the content to witch a subscription refers.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionContentDetails {
-    /// The number of new items in the subscription since its content was last read.
-    #[serde(rename = "newItemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub new_item_count: Option<u32>,
-    /// The type of activity this subscription is for (only uploads, everything).
-    #[serde(rename = "activityType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub activity_type: Option<SubscriptionContentDetailsActivityType>,
-    /// The approximate number of items that the subscription points to.
-    #[serde(rename = "totalItemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_item_count: Option<u32>,
-}
-
-/// Basic information about a third party account link, including its type and type-specific information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinkSnippet {
-    /// Type of the link named after the entities that are being linked.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ThirdPartyLinkSnippetType>,
-    #[serde(rename = "channelToStoreLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_to_store_link: Option<ChannelToStoreLinkDetails>,
-}
-
-/// Stub token pagination template to suppress results.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TokenPagination {}
-
-/// Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and editor suggestions.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSuggestions {
-    /// A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.
-    #[serde(rename = "processingWarnings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_warnings: Option<Vec<VideoSuggestionsProcessingWarnings>>,
-    /// A list of suggestions that may improve YouTube's ability to process the video.
-    #[serde(rename = "processingHints")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_hints: Option<Vec<VideoSuggestionsProcessingHints>>,
-    /// A list of video editing operations that might improve the video quality or playback experience of the uploaded video.
-    #[serde(rename = "editorSuggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub editor_suggestions: Option<Vec<VideoSuggestionsEditorSuggestions>>,
-    /// A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed.
-    #[serde(rename = "processingErrors")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_errors: Option<Vec<VideoSuggestionsProcessingErrors>>,
-    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
-    #[serde(rename = "tagSuggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
-}
-
-/// Basic details about a channel, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSnippet {
-    /// The custom url of the channel.
-    #[serde(rename = "customUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub custom_url: Option<String>,
-    /// DateTime: The date and time that the channel was created.
+/// Geographical coordinates of a point, in WGS84.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct GeoPoint {
+    /// Latitude in degrees.
+    #[serde(rename = "latitude")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub latitude: Option<f64>,
+    /// Altitude above the reference ellipsoid, in meters.
+    #[serde(rename = "altitude")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub altitude: Option<f64>,
+    /// Longitude in degrees.
+    #[serde(rename = "longitude")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub longitude: Option<f64>,
+}
+
+/// An *activity* resource contains information about an action that a particular channel, or user, has taken on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of action, the channel associated with the action, and the resource(s) associated with the action, such as the video that was rated or uploaded.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Activity {
+    /// Etag of this resource
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ActivitySnippet>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ActivityContentDetails>,
+    /// The ID that YouTube uses to uniquely identify the activity.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activity".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelProfileDetails {
+    /// The YouTube channel ID.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// The channel's URL.
+    #[serde(rename = "channelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_url: Option<String>,
+    /// The channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+}
+
+/// Basic details about a video, including title, description, uploader, thumbnails and category.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSnippet {
+    /// The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The default_audio_language property specifies the language spoken in the video's default audio track.
+    #[serde(rename = "defaultAudioLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_audio_language: Option<String>,
+    /// The video's description. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<VideoLocalization>,
+    /// Channel title for the channel that the video belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The YouTube video category associated with the video.
+    #[serde(rename = "categoryId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub category_id: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// DateTime: The date and time when the video was uploaded.
     #[serde(rename = "publishedAt")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub published_at: Option<DateTime<Utc>>,
-    /// The country of the channel.
-    #[serde(rename = "country")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country: Option<String>,
-    /// The language of the channel's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<ChannelLocalization>,
-    /// The description of the channel.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The channel's title.
+    /// Indicates if the video is an upcoming/active live broadcast. Or it's "none" if the video is not an upcoming/active live broadcast.
+    #[serde(rename = "liveBroadcastContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_content: Option<VideoSnippetLiveBroadcastContent>,
+    /// A list of keyword tags associated with the video. Tags may contain spaces.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<String>>,
+    /// The video's title. @mutable youtube.videos.insert youtube.videos.update
     #[serde(rename = "title")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub title: Option<String>,
-}
-
-/// Freebase topic information related to the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelTopicDetails {
-    /// A list of Wikipedia URLs that describe the channel's content.
-    #[serde(rename = "topicCategories")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_categories: Option<Vec<String>>,
-    /// A list of Freebase topic IDs associated with the channel. You can retrieve information about each topic using the Freebase Topic API.
-    #[serde(rename = "topicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_ids: Option<Vec<String>>,
-}
-
-/// The conversionPings object encapsulates information about conversion pings that need to be respected by the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelConversionPings {
-    /// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
-    #[serde(rename = "pings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pings: Option<Vec<ChannelConversionPing>>,
-}
-
-/// Comments written in (direct or indirect) reply to the top level comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadReplies {
-    /// A limited number of replies. Unless the number of replies returned equals total_reply_count in the snippet the returned replies are only a subset of the total number of replies.
-    #[serde(rename = "comments")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comments: Option<Vec<Comment>>,
+    /// The language of the videos's default snippet.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategoryListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// A list of video categories that can be associated with YouTube videos. In this map, the video category ID is the map key, and its value is the corresponding videoCategory resource.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<VideoCategory>>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategoryListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItemListResponse". Etag of this resource.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// A list of playlist items that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<PlaylistItem>>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+}
+
+/// Brief description of the live stream cdn settings.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CdnSettings {
+    ///  The method or protocol used to transmit the video stream.
+    #[serde(rename = "ingestionType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ingestion_type: Option<CdnSettingsIngestionType>,
+    #[serde(rename = "ingestionInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ingestion_info: Option<IngestionInfo>,
+    /// The frame rate of the inbound video data.
+    #[serde(rename = "frameRate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub frame_rate: Option<CdnSettingsFrameRate>,
+    /// The resolution of the inbound video data.
+    #[serde(rename = "resolution")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resolution: Option<CdnSettingsResolution>,
+    /// The format of the video stream that you are sending to Youtube.
+    #[serde(rename = "format")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub format: Option<String>,
+}
+
+/// Detailed settings of a broadcast.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastContentDetails {
+    /// This setting indicates whether the broadcast should automatically begin with an in-stream slate when you update the broadcast's status to live. After updating the status, you then need to send a liveCuepoints.insert request that sets the cuepoint's eventState to end to remove the in-stream slate and make your broadcast stream visible to viewers.
+    #[serde(rename = "startWithSlate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub start_with_slate: Option<bool>,
+    /// The mesh for projecting the video if projection is mesh. The mesh value must be a UTF-8 string containing the base-64 encoding of 3D mesh data that follows the Spherical Video V2 RFC specification for an mshp box, excluding the box size and type but including the following four reserved zero bytes for the version and flags.
+    #[serde(rename = "mesh")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mesh: Option<String>,
+    /// This setting indicates whether the broadcast video can be played in an embedded player. If you choose to archive the video (using the enableArchive property), this setting will also apply to the archived video.
+    #[serde(rename = "enableEmbed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_embed: Option<bool>,
+    /// Indicates whether this broadcast has low latency enabled.
+    #[serde(rename = "enableLowLatency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_low_latency: Option<bool>,
+    #[serde(rename = "monitorStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub monitor_stream: Option<MonitorStreamInfo>,
+    /// The projection format of this broadcast. This defaults to rectangular.
+    #[serde(rename = "projection")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub projection: Option<LiveBroadcastContentDetailsProjection>,
+    /// This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. *Important:* You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends.
+    #[serde(rename = "enableDvr")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_dvr: Option<bool>,
+    /// The 3D stereo layout of this broadcast. This defaults to mono.
+    #[serde(rename = "stereoLayout")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub stereo_layout: Option<LiveBroadcastContentDetailsStereoLayout>,
+    /// This setting indicates whether YouTube should enable content encryption for the broadcast.
+    #[serde(rename = "enableContentEncryption")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_content_encryption: Option<bool>,
+    /// This setting indicates whether HTTP POST closed captioning is enabled for this broadcast. The ingestion URL of the closed captions is returned through the liveStreams API. This is mutually exclusive with using the closed_captions_type property, and is equivalent to setting closed_captions_type to CLOSED_CAPTIONS_HTTP_POST.
+    #[serde(rename = "enableClosedCaptions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_closed_captions: Option<bool>,
+    #[serde(rename = "closedCaptionsType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
+    /// This setting indicates whether auto start is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
+    #[serde(rename = "enableAutoStart")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_auto_start: Option<bool>,
+    /// DateTime: The date and time that the live stream referenced by boundStreamId was last updated.
+    #[serde(rename = "boundStreamLastUpdateTimeMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bound_stream_last_update_time_ms: Option<DateTime<Utc>>,
+    /// This setting indicates whether auto stop is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
+    #[serde(rename = "enableAutoStop")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_auto_stop: Option<bool>,
+    /// Automatically start recording after the event goes live. The default value for this property is true. *Important:* You must also set the enableDvr property's value to true if you want the playback to be available immediately after the broadcast ends. If you set this property's value to true but do not also set the enableDvr property to true, there may be a delay of around one day before the archived video will be available for playback.
+    #[serde(rename = "recordFromStart")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub record_from_start: Option<bool>,
+    /// If both this and enable_low_latency are set, they must match. LATENCY_NORMAL should match enable_low_latency=false LATENCY_LOW should match enable_low_latency=true LATENCY_ULTRA_LOW should have enable_low_latency omitted.
+    #[serde(rename = "latencyPreference")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub latency_preference: Option<LiveBroadcastContentDetailsLatencyPreference>,
+    /// This value uniquely identifies the live stream bound to the broadcast.
+    #[serde(rename = "boundStreamId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bound_stream_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamHealthStatus {
+    /// The status code of this stream
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamHealthStatusStatus>,
+    /// u64: The last time this status was updated (in seconds)
+    #[serde(rename = "lastUpdateTimeSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub last_update_time_seconds: Option<String>,
+    /// The configurations issues on this stream
+    #[serde(rename = "configurationIssues")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
+}
+
+/// Information about a resource that received a positive (like) rating.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsLike {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionListResponse {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#captionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of captions that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Caption>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatTextMessageDetails {
+    /// The user's message.
+    #[serde(rename = "messageText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_text: Option<String>,
 }
 
 /// Statistics about the live broadcast. These represent a snapshot of the values at the time of the request. Statistics are only returned for live broadcasts.
@@ -240,180 +864,138 @@
     pub total_chat_count: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDuration {
-    /// The date and time when the user became a continuous member across all levels.
-    #[serde(rename = "memberSince")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_since: Option<String>,
-    /// The cumulative time the user has been a member across all levels in complete months (the time is rounded down to the nearest integer).
-    #[serde(rename = "memberTotalDurationMonths")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_total_duration_months: Option<i32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageAuthorDetails {
-    /// The channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: Option<String>,
-    /// Whether the author's identity has been verified by YouTube.
-    #[serde(rename = "isVerified")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_verified: Option<bool>,
-    /// Whether the author is a sponsor of the live chat.
-    #[serde(rename = "isChatSponsor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_chat_sponsor: Option<bool>,
-    /// The YouTube channel ID.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The channel's display name.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// Whether the author is a moderator of the live chat.
-    #[serde(rename = "isChatModerator")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_chat_moderator: Option<bool>,
-    /// Whether the author is the owner of the live chat.
-    #[serde(rename = "isChatOwner")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_chat_owner: Option<bool>,
-    /// The channels's avatar URL.
-    #[serde(rename = "profileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_image_url: Option<String>,
-}
-
-/// A `__videoAbuseReportReason__` resource identifies a reason that a video could be reported as abusive. Video abuse report reasons are used with `video.ReportAbuse`.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReason {
+/// Basic details about a video category, such as its localized title. Next Id: 17
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoStatus {
+    /// The status of the uploaded video.
+    #[serde(rename = "uploadStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload_status: Option<VideoStatusUploadStatus>,
+    /// The video's license. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "license")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub license: Option<VideoStatusLicense>,
+    /// This value indicates if the video can be embedded on another website. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "embeddable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embeddable: Option<bool>,
+    /// This value indicates if the extended video statistics on the watch page can be viewed by everyone. Note that the view count, likes, etc will still be visible if this is disabled. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "publicStatsViewable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub public_stats_viewable: Option<bool>,
+    /// DateTime: The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private..
+    #[serde(rename = "publishAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub publish_at: Option<DateTime<Utc>>,
+    /// This value explains why YouTube rejected an uploaded video. This property is only present if the uploadStatus property indicates that the upload was rejected.
+    #[serde(rename = "rejectionReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rejection_reason: Option<VideoStatusRejectionReason>,
+    /// The video's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<VideoStatusPrivacyStatus>,
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// This value explains why a video failed to upload. This property is only present if the uploadStatus property indicates that the upload failed.
+    #[serde(rename = "failureReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub failure_reason: Option<VideoStatusFailureReason>,
+    #[serde(rename = "selfDeclaredMadeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_declared_made_for_kids: Option<bool>,
+}
+
+/// Details about the content of a YouTube Video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoContentDetails {
+    /// The value of is_license_content indicates whether the video is licensed content.
+    #[serde(rename = "licensedContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub licensed_content: Option<bool>,
+    #[serde(rename = "regionRestriction")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
+    #[serde(rename = "contentRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_rating: Option<ContentRating>,
+    /// The value of captions indicates whether the video has captions or not.
+    #[serde(rename = "caption")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub caption: Option<VideoContentDetailsCaption>,
+    /// The value of definition indicates whether the video is available in high definition or only in standard definition.
+    #[serde(rename = "definition")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub definition: Option<VideoContentDetailsDefinition>,
+    /// Indicates whether the video uploader has provided a custom thumbnail image for the video. This property is only visible to the video uploader.
+    #[serde(rename = "hasCustomThumbnail")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub has_custom_thumbnail: Option<bool>,
+    /// Specifies the projection format of the video.
+    #[serde(rename = "projection")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub projection: Option<VideoContentDetailsProjection>,
+    /// The value of dimension indicates whether the video is available in 3D or in 2D.
+    #[serde(rename = "dimension")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dimension: Option<String>,
+    /// The length of the video. The tag value is an ISO 8601 duration in the format PT#M#S, in which the letters PT indicate that the value specifies a period of time, and the letters M and S refer to length in minutes and seconds, respectively. The # characters preceding the M and S letters are both integers that specify the number of minutes (or seconds) of the video. For example, a value of PT15M51S indicates that the video is 15 minutes and 51 seconds long.
+    #[serde(rename = "duration")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub duration: Option<String>,
+    #[serde(rename = "countryRestriction")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country_restriction: Option<AccessPolicy>,
+}
+
+/// DEPRECATED Region restriction of the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoContentDetailsRegionRestriction {
+    /// A list of region codes that identify countries where the video is blocked. If this property is present and a country is not listed in its value, then the video is viewable in that country. If this property is present and contains an empty list, the video is viewable in all countries.
+    #[serde(rename = "blocked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub blocked: Option<Vec<String>>,
+    /// A list of region codes that identify countries where the video is viewable. If this property is present and a country is not listed in its value, then the video is blocked from appearing in that country. If this property is present and contains an empty list, the video is blocked in all countries.
+    #[serde(rename = "allowed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub allowed: Option<Vec<String>>,
+}
+
+/// Brief description of the live stream status.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamStatus {
+    #[serde(rename = "healthStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub health_status: Option<LiveStreamHealthStatus>,
+    #[serde(rename = "streamStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub stream_status: Option<LiveStreamStatusStreamStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperStickerMetadata {
+    /// Unique identifier of the Super Sticker. This is a shorter form of the alt_text that includes pack name and a recognizable characteristic of the sticker.
+    #[serde(rename = "stickerId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub sticker_id: Option<String>,
+    /// Internationalized alt text that describes the sticker image and any animation associated with it.
+    #[serde(rename = "altText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt_text: Option<String>,
+    /// Specifies the localization language in which the alt text is returned.
+    #[serde(rename = "altTextLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt_text_language: Option<String>,
+}
+
+/// A *liveChatModerator* resource represents a moderator for a YouTube live chat. A chat moderator has the ability to ban/unban users from a chat, remove message, etc.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModerator {
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoAbuseReportReasonSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The ID of this abuse report reason.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReason"`.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-/// Describes processing status and progress and availability of some other Video resource parts.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProcessingDetails {
-    /// The video's processing status. This value indicates whether YouTube was able to process the video or if the video is still being processed.
-    #[serde(rename = "processingStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_status: Option<VideoProcessingDetailsProcessingStatus>,
-    /// The reason that YouTube failed to process the video. This property will only have a value if the processingStatus property's value is failed.
-    #[serde(rename = "processingFailureReason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_failure_reason: Option<VideoProcessingDetailsProcessingFailureReason>,
-    /// This value indicates whether video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
-    #[serde(rename = "editorSuggestionsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub editor_suggestions_availability: Option<String>,
-    #[serde(rename = "processingProgress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_progress: Option<VideoProcessingDetailsProcessingProgress>,
-    /// This value indicates whether file details are available for the uploaded video. You can retrieve a video's file details by requesting the fileDetails part in your videos.list() request.
-    #[serde(rename = "fileDetailsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_details_availability: Option<String>,
-    /// This value indicates whether the video processing engine has generated suggestions that might improve YouTube's ability to process the the video, warnings that explain video processing problems, or errors that cause video processing problems. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
-    #[serde(rename = "processingIssuesAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_issues_availability: Option<String>,
-    /// This value indicates whether thumbnail images have been generated for the video.
-    #[serde(rename = "thumbnailsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails_availability: Option<String>,
-    /// This value indicates whether keyword (tag) suggestions are available for the video. Tags can be added to a video's metadata to make it easier for other users to find the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
-    #[serde(rename = "tagSuggestionsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tag_suggestions_availability: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionListResponse {
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// A list of subscriptions that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Subscription>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscriptionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Video>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoListResponse".
+    pub snippet: Option<LiveChatModeratorSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModerator".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
@@ -421,63 +1003,56 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-}
-
-/// Information about a video that was marked as a favorite video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsFavorite {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
+    /// The ID that YouTube assigns to uniquely identify the moderator.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+/// Basic details about an i18n region, such as region code and human-readable name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegionSnippet {
+    /// The human-readable name of the region.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: Option<String>,
+    /// The region code as a 2-letter ISO country code.
+    #[serde(rename = "gl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub gl: Option<String>,
 }
 
 /// Basic details about a caption track, such as its language and name.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CaptionSnippet {
+    /// Indicates whether the track contains closed captions for the deaf and hard of hearing. The default value is false.
+    #[serde(rename = "isCC")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_c_c: Option<bool>,
+    /// The language of the caption track. The property value is a BCP-47 language tag.
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
     /// The reason that YouTube failed to process the caption track. This property is only present if the state property's value is failed.
     #[serde(rename = "failureReason")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub failure_reason: Option<CaptionSnippetFailureReason>,
-    /// Indicates whether caption track is formatted for "easy reader," meaning it is at a third-grade level for language learners. The default value is false.
-    #[serde(rename = "isEasyReader")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_easy_reader: Option<bool>,
-    /// The caption track's type.
-    #[serde(rename = "trackKind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub track_kind: Option<CaptionSnippetTrackKind>,
-    /// The language of the caption track. The property value is a BCP-47 language tag.
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
     /// Indicates whether YouTube synchronized the caption track to the audio track in the video. The value will be true if a sync was explicitly requested when the caption track was uploaded. For example, when calling the captions.insert or captions.update methods, you can set the sync parameter to true to instruct YouTube to sync the uploaded track to the video. If the value is false, YouTube uses the time codes in the uploaded caption track to determine when to display captions.
     #[serde(rename = "isAutoSynced")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub is_auto_synced: Option<bool>,
-    /// Indicates whether the caption track uses large text for the vision-impaired. The default value is false.
-    #[serde(rename = "isLarge")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_large: Option<bool>,
     /// DateTime: The date and time when the caption track was last updated.
     #[serde(rename = "lastUpdated")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub last_updated: Option<DateTime<Utc>>,
-    /// The ID that YouTube uses to uniquely identify the video associated with the caption track. @mutable youtube.captions.insert
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
+    /// The caption track's type.
+    #[serde(rename = "trackKind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub track_kind: Option<CaptionSnippetTrackKind>,
     /// The caption track's status.
     #[serde(rename = "status")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub status: Option<CaptionSnippetStatus>,
-    /// Indicates whether the caption track is a draft. If the value is true, then the track is not publicly visible. The default value is false. @mutable youtube.captions.insert youtube.captions.update
-    #[serde(rename = "isDraft")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_draft: Option<bool>,
-    /// Indicates whether the track contains closed captions for the deaf and hard of hearing. The default value is false.
-    #[serde(rename = "isCC")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_c_c: Option<bool>,
     /// The name of the caption track. The name is intended to be visible to the user as an option during playback.
     #[serde(rename = "name")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -486,356 +1061,1317 @@
     #[serde(rename = "audioTrackType")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub audio_track_type: Option<CaptionSnippetAudioTrackType>,
+    /// Indicates whether the caption track is a draft. If the value is true, then the track is not publicly visible. The default value is false. @mutable youtube.captions.insert youtube.captions.update
+    #[serde(rename = "isDraft")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_draft: Option<bool>,
+    /// Indicates whether caption track is formatted for "easy reader," meaning it is at a third-grade level for language learners. The default value is false.
+    #[serde(rename = "isEasyReader")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_easy_reader: Option<bool>,
+    /// Indicates whether the caption track uses large text for the vision-impaired. The default value is false.
+    #[serde(rename = "isLarge")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_large: Option<bool>,
+    /// The ID that YouTube uses to uniquely identify the video associated with the caption track. @mutable youtube.captions.insert
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+}
+
+/// Branding properties for the channel view.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSettings {
+    /// The ID for a Google Analytics account to track and measure traffic to the channels.
+    #[serde(rename = "trackingAnalyticsAccountId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tracking_analytics_account_id: Option<String>,
+    /// Which content tab users should see when viewing the channel.
+    #[serde(rename = "defaultTab")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_tab: Option<String>,
+    /// Whether the tab to browse the videos should be displayed.
+    #[serde(rename = "showBrowseView")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub show_browse_view: Option<bool>,
+    /// Whether user-submitted comments left on the channel page need to be approved by the channel owner to be publicly visible.
+    #[serde(rename = "moderateComments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderate_comments: Option<bool>,
+    /// Whether related channels should be proposed.
+    #[serde(rename = "showRelatedChannels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub show_related_channels: Option<bool>,
+    /// A prominent color that can be rendered on this channel page.
+    #[serde(rename = "profileColor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_color: Option<String>,
+    /// The list of featured channels.
+    #[serde(rename = "featuredChannelsUrls")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_channels_urls: Option<Vec<String>>,
+    /// Specifies the channel title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// Specifies the channel description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The trailer of the channel, for users that are not subscribers.
+    #[serde(rename = "unsubscribedTrailer")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub unsubscribed_trailer: Option<String>,
+    /// Title for the featured channels tab.
+    #[serde(rename = "featuredChannelsTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_channels_title: Option<String>,
+    /// The country of the channel.
+    #[serde(rename = "country")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country: Option<String>,
+    /// Lists keywords associated with the channel, comma-separated.
+    #[serde(rename = "keywords")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub keywords: Option<String>,
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LanguageTag {
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+/// Statistics about the video, such as the number of times the video was viewed or liked.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoStatistics {
+    /// u64: The number of users who have indicated that they disliked the video by giving it a negative rating.
+    #[serde(rename = "dislikeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dislike_count: Option<String>,
+    /// u64: The number of users who currently have the video marked as a favorite video.
+    #[serde(rename = "favoriteCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorite_count: Option<String>,
+    /// u64: The number of times the video has been viewed.
+    #[serde(rename = "viewCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub view_count: Option<String>,
+    /// u64: The number of comments for the video.
+    #[serde(rename = "commentCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment_count: Option<String>,
+    /// u64: The number of users who have indicated that they liked the video by giving it a positive rating.
+    #[serde(rename = "likeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like_count: Option<String>,
+}
+
+/// Information that identifies the recommended resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsRecommendation {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    #[serde(rename = "seedResourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub seed_resource_id: Option<ResourceId>,
+    /// The reason that the resource is recommended to the user.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<ActivityContentDetailsRecommendationReason>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestItemTestItemSnippet {}
+
+/// Basic details about an i18n language, such as language code and human-readable name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguageSnippet {
+    /// The human-readable name of the language in the language itself.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: Option<String>,
+    /// A short BCP-47 code that uniquely identifies a language.
+    #[serde(rename = "hl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hl: Option<String>,
+}
+
+/// Freebase topic information related to the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoTopicDetails {
+    /// A list of Wikipedia URLs that provide a high-level description of the video's content.
+    #[serde(rename = "topicCategories")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_categories: Option<Vec<String>>,
+    /// A list of Freebase topic IDs that are centrally associated with the video. These are topics that are centrally featured in the video, and it can be said that the video is mainly about each of these. You can retrieve information about each topic using the < a href="http://wiki.freebase.com/wiki/Topic_API">Freebase Topic API.
+    #[serde(rename = "topicIds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_ids: Option<Vec<String>>,
+    /// Similar to topic_id, except that these topics are merely relevant to the video. These are topics that may be mentioned in, or appear in the video. You can retrieve information about each topic using Freebase Topic API.
+    #[serde(rename = "relevantTopicIds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub relevant_topic_ids: Option<Vec<String>>,
+}
+
+/// The id of the author's YouTube channel, if any.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentSnippetAuthorChannelId {
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+/// A *playlist* resource represents a YouTube playlist. A playlist is a collection of videos that can be viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not limit the number of playlists that each user creates. By default, playlists are publicly visible to other users, but playlists can be public or private. YouTube also uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Playlist {
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<PlaylistContentDetails>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
+    #[serde(rename = "player")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub player: Option<PlaylistPlayer>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlist".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<PlaylistStatus>,
+    /// The ID that YouTube uses to uniquely identify the playlist.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<PlaylistSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThreadListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// A list of comment threads that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<CommentThread>>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+}
+
+/// Rights management policy for YouTube resources.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AccessPolicy {
+    /// A list of region codes that identify countries where the default policy do not apply.
+    #[serde(rename = "exception")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub exception: Option<Vec<String>>,
+    /// The value of allowed indicates whether the access to the policy is allowed or denied by default.
+    #[serde(rename = "allowed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub allowed: Option<bool>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseType {
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityListResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activityListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Activity>>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsDetails {
+    /// Display name for the highest level that the user has access to at the moment.
+    #[serde(rename = "highestAccessibleLevelDisplayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub highest_accessible_level_display_name: Option<String>,
+    /// Id of the highest level that the user has access to at the moment.
+    #[serde(rename = "highestAccessibleLevel")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub highest_accessible_level: Option<String>,
+    #[serde(rename = "membershipsDuration")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_duration: Option<MembershipsDuration>,
+    /// Ids of all levels that the user has access to. This includes the currently active level and all other levels that are included because of a higher purchase.
+    #[serde(rename = "accessibleLevels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub accessible_levels: Option<Vec<String>>,
+    /// Data about memberships duration on particular pricing levels.
+    #[serde(rename = "membershipsDurationAtLevels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_duration_at_levels: Option<Vec<MembershipsDurationAtLevel>>,
+}
+
+/// Information specific to a store on a merchandising platform linked to a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelToStoreLinkDetails {
+    /// Name of the store.
+    #[serde(rename = "storeName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub store_name: Option<String>,
+    /// Landing page of the store.
+    #[serde(rename = "storeUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub store_url: Option<String>,
+}
+
+/// A *membershipsLevel* resource represents an offer made by YouTube creators for their fans. Users can become members of the channel by joining one of the available levels. They will provide recurring monetary support and receives special benefits.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevel {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<MembershipsLevelSnippet>,
+    /// The ID that YouTube assigns to uniquely identify the memberships level.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// The third-party link status object contains information about the status of the link.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinkStatus {
+    #[serde(rename = "linkStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub link_status: Option<ThirdPartyLinkStatusLinkStatus>,
+}
+
+/// A *i18nRegion* resource identifies a region where YouTube is available.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegion {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegion".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the i18n region.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<I18nRegionSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatFanFundingEventDetails {
+    /// A rendered string that displays the fund amount and currency to the user.
+    #[serde(rename = "amountDisplayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_display_string: Option<String>,
+    /// The comment added by the user to this fan funding event.
+    #[serde(rename = "userComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_comment: Option<String>,
+    /// u64: The amount of the fund.
+    #[serde(rename = "amountMicros")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_micros: Option<String>,
+    /// The currency in which the fund was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentListResponse {
+    /// A list of comments that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Comment>>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+}
+
+/// LINT.IfChange Describes an invideo branding.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoBranding {
+    /// The channel to which this branding links. If not present it defaults to the current channel.
+    #[serde(rename = "targetChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub target_channel_id: Option<String>,
+    #[serde(rename = "timing")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub timing: Option<InvideoTiming>,
+    /// The bytes the uploaded image. Only used in api to youtube communication.
+    #[serde(rename = "imageBytes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_bytes: Option<String>,
+    /// The url of the uploaded image. Only used in apiary to api communication.
+    #[serde(rename = "imageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_url: Option<String>,
+    #[serde(rename = "position")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub position: Option<InvideoPosition>,
+}
+
+/// Branding properties for the watch. All deprecated.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct WatchSettings {
+    /// An ID that uniquely identifies a playlist that displays next to the video player.
+    #[serde(rename = "featuredPlaylistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_playlist_id: Option<String>,
+    /// The background color for the video watch page's branded area.
+    #[serde(rename = "textColor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_color: Option<String>,
+    /// The text color for the video watch page's branded area.
+    #[serde(rename = "backgroundColor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub background_color: Option<String>,
+}
+
+/// Basic details about a video category, such as its localized title.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonSnippet {
+    /// The localized label belonging to this abuse report reason.
+    #[serde(rename = "label")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub label: Option<String>,
+    /// The secondary reasons associated with this reason, if any are available. (There might be 0 or more.)
+    #[serde(rename = "secondaryReasons")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub secondary_reasons: Option<Vec<VideoAbuseReportSecondaryReason>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatSuperStickerDetails {
+    #[serde(rename = "superStickerMetadata")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_metadata: Option<SuperStickerMetadata>,
+    /// The currency in which the purchase was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+    /// A rendered string that displays the fund amount and currency to the user.
+    #[serde(rename = "amountDisplayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_display_string: Option<String>,
+    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
+    #[serde(rename = "tier")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tier: Option<u32>,
+    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
+    #[serde(rename = "amountMicros")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_micros: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchListResponse {
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "regionCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_code: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Pagination information for token pagination.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<SearchResult>>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+}
+
+/// A *comment thread* represents information that applies to a top level comment and all its replies. It can also include the top level comment itself and some of the replies.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThread {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<CommentThreadSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThread".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the comment thread.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "replies")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub replies: Option<CommentThreadReplies>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevelSnippet {
+    #[serde(rename = "levelDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub level_details: Option<LevelDetails>,
+    /// The id of the channel that's offering channel memberships.
+    #[serde(rename = "creatorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creator_channel_id: Option<String>,
+}
+
+/// Basic broadcast information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastSnippet {
+    /// The id of the live chat for this broadcast.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    /// The broadcast's description. As with the title, you can set this field by modifying the broadcast resource or by setting the description field of the corresponding video resource.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// DateTime: The date and time that the broadcast actually started. This information is only available once the broadcast's state is live.
+    #[serde(rename = "actualStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_start_time: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast was added to YouTube's live broadcast schedule.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast is scheduled to end.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<DateTime<Utc>>,
+    /// Indicates whether this broadcast is the default broadcast. Internal only.
+    #[serde(rename = "isDefaultBroadcast")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_default_broadcast: Option<bool>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// DateTime: The date and time that the broadcast is scheduled to start.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<DateTime<Utc>>,
+    /// The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// A *liveChatMessage* resource represents a chat message in a YouTube Live Chat.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessage {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the message.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessage".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "authorDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_details: Option<LiveChatMessageAuthorDetails>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveChatMessageSnippet>,
+}
+
+/// Details about the content to witch a subscription refers.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionContentDetails {
+    /// The type of activity this subscription is for (only uploads, everything).
+    #[serde(rename = "activityType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub activity_type: Option<SubscriptionContentDetailsActivityType>,
+    /// The approximate number of items that the subscription points to.
+    #[serde(rename = "totalItemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_item_count: Option<u32>,
+    /// The number of new items in the subscription since its content was last read.
+    #[serde(rename = "newItemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub new_item_count: Option<u32>,
+}
+
+/// Basic details about a comment, such as its author and text.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentSnippet {
+    /// Link to the author's YouTube channel, if any.
+    #[serde(rename = "authorChannelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_channel_url: Option<String>,
+    /// The total number of likes this comment has received.
+    #[serde(rename = "likeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like_count: Option<u32>,
+    /// The comment's text. The format is either plain text or HTML dependent on what has been requested. Even the plain text representation may differ from the text originally posted in that it may replace video links with video titles etc.
+    #[serde(rename = "textDisplay")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_display: Option<String>,
+    /// The comment's original raw text as initially posted or last updated. The original text will only be returned if it is accessible to the viewer, which is only guaranteed if the viewer is the comment's author.
+    #[serde(rename = "textOriginal")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_original: Option<String>,
+    /// The name of the user who posted the comment.
+    #[serde(rename = "authorDisplayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_display_name: Option<String>,
+    /// DateTime: The date and time when the comment was originally published.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// DateTime: The date and time when the comment was last updated.
+    #[serde(rename = "updatedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub updated_at: Option<DateTime<Utc>>,
+    #[serde(rename = "authorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_channel_id: Option<CommentSnippetAuthorChannelId>,
+    /// The rating the viewer has given to this comment. For the time being this will never return RATE_TYPE_DISLIKE and instead return RATE_TYPE_NONE. This may change in the future.
+    #[serde(rename = "viewerRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub viewer_rating: Option<CommentSnippetViewerRating>,
+    /// The ID of the video the comment refers to, if any.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The comment's moderation status. Will not be set if the comments were requested through the id filter.
+    #[serde(rename = "moderationStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderation_status: Option<CommentSnippetModerationStatus>,
+    /// The URL for the avatar of the user who posted the comment.
+    #[serde(rename = "authorProfileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_profile_image_url: Option<String>,
+    /// Whether the current viewer can rate this comment.
+    #[serde(rename = "canRate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub can_rate: Option<bool>,
+    /// The unique id of the parent comment, only set for replies.
+    #[serde(rename = "parentId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parent_id: Option<String>,
+    /// The id of the corresponding YouTube channel. In case of a channel comment this is the channel the comment refers to. In case of a video comment it's the video's channel.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageAuthorDetails {
+    /// Whether the author's identity has been verified by YouTube.
+    #[serde(rename = "isVerified")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_verified: Option<bool>,
+    /// The channel's URL.
+    #[serde(rename = "channelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_url: Option<String>,
+    /// The YouTube channel ID.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// Whether the author is a sponsor of the live chat.
+    #[serde(rename = "isChatSponsor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_sponsor: Option<bool>,
+    /// Whether the author is a moderator of the live chat.
+    #[serde(rename = "isChatModerator")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_moderator: Option<bool>,
+    /// Whether the author is the owner of the live chat.
+    #[serde(rename = "isChatOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_owner: Option<bool>,
+}
+
+/// Information about a new playlist item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPlaylistItem {
+    /// ID of the item within the playlist.
+    #[serde(rename = "playlistItemId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_item_id: Option<String>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// The value that YouTube uses to uniquely identify the playlist.
+    #[serde(rename = "playlistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_id: Option<String>,
+}
+
+/// A *caption* resource represents a YouTube caption track. A caption track is associated with exactly one YouTube video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Caption {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#caption".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the caption track.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<CaptionSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// Basic details about a subscription, including title, description and thumbnails of the subscribed item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionSnippet {
+    /// The subscription's details.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the subscriber's channel.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// Channel title for the channel that the subscription belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The subscription's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// DateTime: The date and time that the subscription was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// Details about the content of an activity: the video that was shared, the channel that was subscribed to, etc.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetails {
+    #[serde(rename = "channelItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_item: Option<ActivityContentDetailsChannelItem>,
+    #[serde(rename = "like")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like: Option<ActivityContentDetailsLike>,
+    #[serde(rename = "recommendation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recommendation: Option<ActivityContentDetailsRecommendation>,
+    #[serde(rename = "promotedItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub promoted_item: Option<ActivityContentDetailsPromotedItem>,
+    #[serde(rename = "subscription")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscription: Option<ActivityContentDetailsSubscription>,
+    #[serde(rename = "upload")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload: Option<ActivityContentDetailsUpload>,
+    #[serde(rename = "comment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment: Option<ActivityContentDetailsComment>,
+    #[serde(rename = "social")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub social: Option<ActivityContentDetailsSocial>,
+    #[serde(rename = "playlistItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_item: Option<ActivityContentDetailsPlaylistItem>,
+    #[serde(rename = "bulletin")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bulletin: Option<ActivityContentDetailsBulletin>,
+    #[serde(rename = "favorite")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorite: Option<ActivityContentDetailsFavorite>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LevelDetails {
+    /// The name that should be used when referring to this level.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+}
+
+/// Information about the uploaded video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsUpload {
+    /// The ID that YouTube uses to uniquely identify the uploaded video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+}
+
+/// Details about monetization of a YouTube Video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoMonetizationDetails {
+    #[serde(rename = "access")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub access: Option<AccessPolicy>,
+}
+
+/// Stub token pagination template to suppress results.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TokenPagination {}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MemberSnippet {
+    /// The id of the channel that's offering memberships.
+    #[serde(rename = "creatorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creator_channel_id: Option<String>,
+    #[serde(rename = "membershipsDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_details: Option<MembershipsDetails>,
+    #[serde(rename = "memberDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_details: Option<ChannelProfileDetails>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRatingListResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoGetRatingResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// A list of ratings that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<VideoRating>>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailSetResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thumbnailSetResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of thumbnails.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<ThumbnailDetails>>,
+}
+
+/// ChannelSection targeting setting.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionTargeting {
+    /// The country the channel section is targeting.
+    #[serde(rename = "countries")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub countries: Option<Vec<String>>,
+    /// The language the channel section is targeting.
+    #[serde(rename = "languages")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub languages: Option<Vec<String>>,
+    /// The region the channel section is targeting.
+    #[serde(rename = "regions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub regions: Option<Vec<String>>,
+}
+
+/// Basic details about a subscription's subscriber including title, description, channel ID and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionSubscriberSnippet {
+    /// The description of the subscriber.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The channel ID of the subscriber.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The title of the subscriber.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+}
+
+/// Basic details about a channel, including title, description and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSnippet {
+    /// The channel's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// DateTime: The date and time that the channel was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<ChannelLocalization>,
+    /// The custom url of the channel.
+    #[serde(rename = "customUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub custom_url: Option<String>,
+    /// The description of the channel.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The language of the channel's default title and description.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+    /// The country of the channel.
+    #[serde(rename = "country")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country: Option<String>,
+}
+
+/// Basic details about a playlist, including title, description and thumbnails. Basic details of a YouTube Playlist item provided by the author. Next ID: 15
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemSnippet {
+    /// Channel title for the channel that the playlist item belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The order in which the item appears in the playlist. The value uses a zero-based index, so the first item has a position of 0, the second item has a position of 1, and so forth.
+    #[serde(rename = "position")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub position: Option<u32>,
+    /// Channel id for the channel this video belongs to.
+    #[serde(rename = "videoOwnerChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_owner_channel_id: Option<String>,
+    /// The item's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// Channel title for the channel this video belongs to.
+    #[serde(rename = "videoOwnerChannelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_owner_channel_title: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the user that added the item to the playlist.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify thGe playlist that the playlist item is in.
+    #[serde(rename = "playlistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_id: Option<String>,
+    /// The item's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// DateTime: The date and time that the item was added to the playlist.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+}
+
+/// Playlist localization setting
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistLocalization {
+    /// The localized strings for playlist's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The localized strings for playlist's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// Internal representation of thumbnails for a YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailDetails {
+    #[serde(rename = "medium")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub medium: Option<Thumbnail>,
+    #[serde(rename = "maxres")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub maxres: Option<Thumbnail>,
+    #[serde(rename = "default")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default: Option<Thumbnail>,
+    #[serde(rename = "standard")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub standard: Option<Thumbnail>,
+    #[serde(rename = "high")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub high: Option<Thumbnail>,
 }
 
 /// A pair Property / Value.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct PropertyValue {
-    /// A property.
-    #[serde(rename = "property")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub property: Option<String>,
     /// The property's value.
     #[serde(rename = "value")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub value: Option<String>,
-}
-
-/// JSON template for the status part of a channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelStatus {
-    /// If true, then the user is linked to either a YouTube username or G+ account. Otherwise, the user doesn't have a public YouTube identity.
-    #[serde(rename = "isLinked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_linked: Option<bool>,
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// Privacy status of the channel.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<ChannelStatusPrivacyStatus>,
-    /// The long uploads status of this channel. See https://support.google.com/youtube/answer/71673 for more information.
-    #[serde(rename = "longUploadsStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub long_uploads_status: Option<ChannelStatusLongUploadsStatus>,
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-}
-
-/// Ratings schemes. The country-specific ratings are mostly for movies and shows. LINT.IfChange
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ContentRating {
-    /// The video's rating from Nigeria's National Film and Video Censors Board.
-    #[serde(rename = "nfvcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nfvcb_rating: Option<ContentRatingNfvcbRating>,
-    /// The video's rating from Statens medieråd (Sweden's National Media Council).
-    #[serde(rename = "smsaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub smsa_rating: Option<ContentRatingSmsaRating>,
-    /// The video's rating from the Austrian Board of Media Classification (Bundesministerium für Unterricht, Kunst und Kultur).
-    #[serde(rename = "bmukkRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bmukk_rating: Option<ContentRatingBmukkRating>,
-    /// This property has been deprecated. Use the contentDetails.contentRating.cncRating instead.
-    #[serde(rename = "fmocRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fmoc_rating: Option<ContentRatingFmocRating>,
-    /// The National Media Council ratings system for United Arab Emirates.
-    #[serde(rename = "nmcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nmc_rating: Option<ContentRatingNmcRating>,
-    /// The video's rating from Ireland's Raidió Teilifís Éireann.
-    #[serde(rename = "rteRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rte_rating: Option<ContentRatingRteRating>,
-    /// The video's rating from Hong Kong's Office for Film, Newspaper and Article Administration.
-    #[serde(rename = "fcoRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fco_rating: Option<ContentRatingFcoRating>,
-    /// The video's rating in Israel.
-    #[serde(rename = "ilfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ilfilm_rating: Option<ContentRatingIlfilmRating>,
-    /// The video's rating in Greece.
-    #[serde(rename = "grfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub grfilm_rating: Option<ContentRatingGrfilmRating>,
-    /// The video's rating from Taiwan's Ministry of Culture (文化部).
-    #[serde(rename = "moctwRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moctw_rating: Option<ContentRatingMoctwRating>,
-    /// The video's rating from Singapore's Media Development Authority (MDA) and, specifically, it's Board of Film Censors (BFC).
-    #[serde(rename = "mdaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mda_rating: Option<ContentRatingMdaRating>,
-    /// Reasons that explain why the video received its FPB (South Africa) rating.
-    #[serde(rename = "fpbRatingReasons")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fpb_rating_reasons: Option<Vec<ContentRatingFpbRatingReasons>>,
-    /// The video's rating from the Kenya Film Classification Board.
-    #[serde(rename = "kfcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kfcb_rating: Option<ContentRatingKfcbRating>,
-    /// The video's Ministerio de Cultura (Colombia) rating.
-    #[serde(rename = "mocRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moc_rating: Option<ContentRatingMocRating>,
-    /// Rating system in France - Commission de classification cinematographique
-    #[serde(rename = "cncRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cnc_rating: Option<ContentRatingCncRating>,
-    /// The video's Central Board of Film Certification (CBFC - India) rating.
-    #[serde(rename = "cbfcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cbfc_rating: Option<ContentRatingCbfcRating>,
-    /// The video's rating from the Movie and Television Review and Classification Board (Philippines).
-    #[serde(rename = "mtrcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mtrcb_rating: Option<ContentRatingMtrcbRating>,
-    /// The video's rating in Poland.
-    #[serde(rename = "nbcplRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nbcpl_rating: Option<ContentRatingNbcplRating>,
-    /// The video's rating from Finland's Kansallinen Audiovisuaalinen Instituutti (National Audiovisual Institute).
-    #[serde(rename = "mekuRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub meku_rating: Option<ContentRatingMekuRating>,
-    /// The video's rating from Italy's Autorità per le Garanzie nelle Comunicazioni (AGCOM).
-    #[serde(rename = "agcomRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub agcom_rating: Option<ContentRatingAgcomRating>,
-    /// The video's rating from the Commission de Contrôle des Films (Belgium).
-    #[serde(rename = "cicfRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cicf_rating: Option<ContentRatingCicfRating>,
-    /// The video's rating from the Maldives National Bureau of Classification.
-    #[serde(rename = "nbcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nbc_rating: Option<ContentRatingNbcRating>,
-    /// The video's Consejo de Calificación Cinematográfica (Chile) rating.
-    #[serde(rename = "cccRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ccc_rating: Option<ContentRatingCccRating>,
-    /// The video's rating in the Czech Republic.
-    #[serde(rename = "czfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub czfilm_rating: Option<ContentRatingCzfilmRating>,
-    /// The video's rating from France's Conseil supérieur de l’audiovisuel, which rates broadcast content.
-    #[serde(rename = "csaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub csa_rating: Option<ContentRatingCsaRating>,
-    /// The video's rating from the Nacionãlais Kino centrs (National Film Centre of Latvia).
-    #[serde(rename = "nkclvRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nkclv_rating: Option<ContentRatingNkclvRating>,
-    /// Rating system in Turkey - Evaluation and Classification Board of the Ministry of Culture and Tourism
-    #[serde(rename = "ecbmctRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ecbmct_rating: Option<ContentRatingEcbmctRating>,
-    /// The video's rating from Indonesia's Lembaga Sensor Film.
-    #[serde(rename = "lsfRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub lsf_rating: Option<ContentRatingLsfRating>,
-    /// The video's rating system for Vietnam - MCST
-    #[serde(rename = "mcstRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mcst_rating: Option<ContentRatingMcstRating>,
-    /// The video's TV Parental Guidelines (TVPG) rating.
-    #[serde(rename = "tvpgRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tvpg_rating: Option<ContentRatingTvpgRating>,
-    /// Rating system for Canadian TV - Canadian TV Classification System The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian English-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
-    #[serde(rename = "catvRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub catv_rating: Option<ContentRatingCatvRating>,
-    /// The video's rating in Venezuela.
-    #[serde(rename = "resorteviolenciaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resorteviolencia_rating: Option<ContentRatingResorteviolenciaRating>,
-    /// The video's Instituto de la Cinematografía y de las Artes Audiovisuales (ICAA - Spain) rating.
-    #[serde(rename = "icaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub icaa_rating: Option<ContentRatingIcaaRating>,
-    /// The video's Departamento de Justiça, Classificação, Qualificação e Títulos (DJCQT - Brazil) rating.
-    #[serde(rename = "djctqRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub djctq_rating: Option<ContentRatingDjctqRating>,
-    /// The video's NICAM/Kijkwijzer rating from the Nederlands Instituut voor de Classificatie van Audiovisuele Media (Netherlands).
-    #[serde(rename = "kijkwijzerRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kijkwijzer_rating: Option<ContentRatingKijkwijzerRating>,
-    /// The video's rating in Estonia.
-    #[serde(rename = "eefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub eefilm_rating: Option<ContentRatingEefilmRating>,
-    /// The video's rating from Romania's CONSILIUL NATIONAL AL AUDIOVIZUALULUI (CNA).
-    #[serde(rename = "cnaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cna_rating: Option<ContentRatingCnaRating>,
-    /// The video's Canadian Home Video Rating System (CHVRS) rating.
-    #[serde(rename = "chvrsRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub chvrs_rating: Option<ContentRatingChvrsRating>,
-    /// The video's rating in Slovakia.
-    #[serde(rename = "skfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub skfilm_rating: Option<ContentRatingSkfilmRating>,
-    /// The video's Australian Classification Board (ACB) or Australian Communications and Media Authority (ACMA) rating. ACMA ratings are used to classify children's television programming.
-    #[serde(rename = "acbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub acb_rating: Option<ContentRatingAcbRating>,
-    /// The video's rating from the Danish Film Institute's (Det Danske Filminstitut) Media Council for Children and Young People.
-    #[serde(rename = "mccypRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mccyp_rating: Option<ContentRatingMccypRating>,
-    /// The video's Anatel (Asociación Nacional de Televisión) rating for Chilean television.
-    #[serde(rename = "anatelRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub anatel_rating: Option<ContentRatingAnatelRating>,
-    /// The video's rating from Malaysia's Film Censorship Board.
-    #[serde(rename = "fcbmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fcbm_rating: Option<ContentRatingFcbmRating>,
-    /// The video's rating from South Africa's Film and Publication Board.
-    #[serde(rename = "fpbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fpb_rating: Option<ContentRatingFpbRating>,
-    /// The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian French-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
-    #[serde(rename = "catvfrRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub catvfr_rating: Option<ContentRatingCatvfrRating>,
-    /// The video's General Directorate of Radio, Television and Cinematography (Mexico) rating.
-    #[serde(rename = "rtcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rtc_rating: Option<ContentRatingRtcRating>,
-    /// The video's rating from Medietilsynet, the Norwegian Media Authority.
-    #[serde(rename = "medietilsynetRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub medietilsynet_rating: Option<ContentRatingMedietilsynetRating>,
-    /// The video's rating from the Hungarian Nemzeti Filmiroda, the Rating Committee of the National Office of Film.
-    #[serde(rename = "rcnofRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rcnof_rating: Option<ContentRatingRcnofRating>,
-    /// The video's British Board of Film Classification (BBFC) rating.
-    #[serde(rename = "bbfcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bbfc_rating: Option<ContentRatingBbfcRating>,
-    /// The rating system for MENA countries, a clone of MPAA. It is needed to prevent titles go live w/o additional QC check, since some of them can be inappropriate for the countries at all. See b/33408548 for more details.
-    #[serde(rename = "menaMpaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mena_mpaa_rating: Option<ContentRatingMenaMpaaRating>,
-    /// A rating that YouTube uses to identify age-restricted content.
-    #[serde(rename = "ytRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub yt_rating: Option<ContentRatingYtRating>,
-    /// The video's Office of Film and Literature Classification (OFLC - New Zealand) rating.
-    #[serde(rename = "oflcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub oflc_rating: Option<ContentRatingOflcRating>,
-    /// The video's rating in Peru.
-    #[serde(rename = "pefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pefilm_rating: Option<ContentRatingPefilmRating>,
-    /// The video's Korea Media Rating Board (영상물등급위원회) rating. The KMRB rates videos in South Korea.
-    #[serde(rename = "kmrbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kmrb_rating: Option<ContentRatingKmrbRating>,
-    /// The video's Irish Film Classification Office (IFCO - Ireland) rating. See the IFCO website for more information.
-    #[serde(rename = "ifcoRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ifco_rating: Option<ContentRatingIfcoRating>,
-    /// The video's rating from the Bulgarian National Film Center.
-    #[serde(rename = "nfrcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nfrc_rating: Option<ContentRatingNfrcRating>,
-    /// The video's Freiwillige Selbstkontrolle der Filmwirtschaft (FSK - Germany) rating.
-    #[serde(rename = "fskRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fsk_rating: Option<ContentRatingFskRating>,
-    /// The video's rating from the Ministero dei Beni e delle Attività Culturali e del Turismo (Italy).
-    #[serde(rename = "mibacRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mibac_rating: Option<ContentRatingMibacRating>,
-    /// The video's rating in Iceland.
-    #[serde(rename = "smaisRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub smais_rating: Option<ContentRatingSmaisRating>,
-    /// The video's rating in Switzerland.
-    #[serde(rename = "chfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub chfilm_rating: Option<ContentRatingChfilmRating>,
-    /// The video's INCAA (Instituto Nacional de Cine y Artes Audiovisuales - Argentina) rating.
-    #[serde(rename = "incaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub incaa_rating: Option<ContentRatingIncaaRating>,
-    /// The rating system for trailer, DVD, and Ad in the US. See http://movielabs.com/md/ratings/v2.3/html/US_MPAAT_Ratings.html.
-    #[serde(rename = "mpaatRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mpaat_rating: Option<ContentRatingMpaatRating>,
-    /// The video's rating from Malta's Film Age-Classification Board.
-    #[serde(rename = "mccaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mccaa_rating: Option<ContentRatingMccaaRating>,
-    /// Reasons that explain why the video received its DJCQT (Brazil) rating.
-    #[serde(rename = "djctqRatingReasons")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub djctq_rating_reasons: Option<Vec<ContentRatingDjctqRatingReasons>>,
-    /// The video's rating in Egypt.
-    #[serde(rename = "egfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub egfilm_rating: Option<ContentRatingEgfilmRating>,
-    /// The video's rating from Portugal's Comissão de Classificação de Espect´culos.
-    #[serde(rename = "cceRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cce_rating: Option<ContentRatingCceRating>,
-    /// The video's rating from Luxembourg's Commission de surveillance de la classification des films (CSCF).
-    #[serde(rename = "cscfRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cscf_rating: Option<ContentRatingCscfRating>,
-    /// The video's National Film Registry of the Russian Federation (MKRF - Russia) rating.
-    #[serde(rename = "russiaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub russia_rating: Option<ContentRatingRussiaRating>,
-    /// The video's rating from Thailand's Board of Film and Video Censors.
-    #[serde(rename = "bfvcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bfvc_rating: Option<ContentRatingBfvcRating>,
-    /// The video's Eirin (映倫) rating. Eirin is the Japanese rating system.
-    #[serde(rename = "eirinRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub eirin_rating: Option<ContentRatingEirinRating>,
-    /// The video's Motion Picture Association of America (MPAA) rating.
-    #[serde(rename = "mpaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mpaa_rating: Option<ContentRatingMpaaRating>,
-}
-
-///
+    /// A property.
+    #[serde(rename = "property")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub property: Option<String>,
+}
+
+/// Branding properties of a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBrandingSettings {
+    #[serde(rename = "image")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image: Option<ImageSettings>,
+    /// Additional experimental branding properties.
+    #[serde(rename = "hints")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hints: Option<Vec<PropertyValue>>,
+    #[serde(rename = "channel")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel: Option<ChannelSettings>,
+    #[serde(rename = "watch")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch: Option<WatchSettings>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonListResponse {
+    /// The `visitorId` identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReasonListResponse"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// A list of valid abuse reasons that are used with `video.ReportAbuse`.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<VideoAbuseReportReason>>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// Basic details about a search result, including title, description and thumbnails of the item referenced by the search result.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchResultSnippet {
+    /// The value that YouTube uses to uniquely identify the channel that published the resource that the search result identifies.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// DateTime: The creation date and time of the resource that the search result identifies.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// The title of the channel that published the resource that the search result identifies.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// A description of the search result.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The title of the search result.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// It indicates if the resource (video or channel) has upcoming/active live broadcast content. Or it's "none" if there is not any upcoming/active live broadcasts.
+    #[serde(rename = "liveBroadcastContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_content: Option<SearchResultSnippetLiveBroadcastContent>,
+}
+
+/// Details about the live streaming metadata.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoLiveStreamingDetails {
+    /// DateTime: The time that the broadcast actually started. This value will not be available until the broadcast begins.
+    #[serde(rename = "actualStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_start_time: Option<DateTime<Utc>>,
+    /// DateTime: The time that the broadcast actually ended. This value will not be available until the broadcast is over.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<DateTime<Utc>>,
+    /// u64: The number of viewers currently watching the broadcast. The property and its value will be present if the broadcast has current viewers and the broadcast owner has not hidden the viewcount for the video. Note that YouTube stops tracking the number of concurrent viewers for a broadcast when the broadcast ends. So, this property would not identify the number of viewers watching an archived video of a live broadcast that already ended.
+    #[serde(rename = "concurrentViewers")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub concurrent_viewers: Option<String>,
+    /// The ID of the currently active live chat attached to this video. This field is filled only if the video is a currently live broadcast that has live chat. Once the broadcast transitions to complete this field will be removed and the live chat closed down. For persistent broadcasts that live chat id will no longer be tied to this video but rather to the new video being displayed at the persistent page.
+    #[serde(rename = "activeLiveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub active_live_chat_id: Option<String>,
+    /// DateTime: The time that the broadcast is scheduled to end. If the value is empty or the property is not present, then the broadcast is scheduled to contiue indefinitely.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<DateTime<Utc>>,
+    /// DateTime: The time that the broadcast is scheduled to begin.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<DateTime<Utc>>,
+}
+
+/// Paging details for lists of resources, including total number of items available and number of resources returned in a single page.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PageInfo {
+    /// The number of results included in the API response.
+    #[serde(rename = "resultsPerPage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub results_per_page: Option<i32>,
+    /// The total number of results in the result set.
+    #[serde(rename = "totalResults")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_results: Option<i32>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistPlayer {
+    /// An <iframe> tag that embeds a player that will play the playlist.
+    #[serde(rename = "embedHtml")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_html: Option<String>,
+}
+
+/// A *videoCategory* resource identifies a category that has been or could be associated with uploaded videos.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategory {
+    /// The ID that YouTube uses to uniquely identify the video category.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategory".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoCategorySnippet>,
+}
+
+/// Video processing progress and completion time estimate.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProcessingDetailsProcessingProgress {
+    /// u64: An estimate of the amount of time, in millseconds, that YouTube needs to finish processing the video.
+    #[serde(rename = "timeLeftMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_left_ms: Option<String>,
+    /// u64: The number of parts of the video that YouTube has already processed. You can estimate the percentage of the video that YouTube has already processed by calculating: 100 * parts_processed / parts_total Note that since the estimated number of parts could increase without a corresponding increase in the number of parts that have already been processed, it is possible that the calculated progress could periodically decrease while YouTube processes a video.
+    #[serde(rename = "partsProcessed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parts_processed: Option<String>,
+    /// u64: An estimate of the total number of parts that need to be processed for the video. The number may be updated with more precise estimates while YouTube processes the video.
+    #[serde(rename = "partsTotal")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parts_total: Option<String>,
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ChannelContentDetailsRelatedPlaylists {
+    /// The ID of the playlist that contains the channel"s liked videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "likes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub likes: Option<String>,
+    /// The ID of the playlist that contains the channel"s watch later playlist. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "watchLater")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch_later: Option<String>,
+    /// The ID of the playlist that contains the channel"s favorite videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "favorites")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorites: Option<String>,
+    /// The ID of the playlist that contains the channel"s uploaded videos. Use the videos.insert method to upload new videos and the videos.delete method to delete previously uploaded videos.
+    #[serde(rename = "uploads")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub uploads: Option<String>,
     /// The ID of the playlist that contains the channel"s watch history. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
     #[serde(rename = "watchHistory")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub watch_history: Option<String>,
-    /// The ID of the playlist that contains the channel"s watch later playlist. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
-    #[serde(rename = "watchLater")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch_later: Option<String>,
-    /// The ID of the playlist that contains the channel"s uploaded videos. Use the videos.insert method to upload new videos and the videos.delete method to delete previously uploaded videos.
-    #[serde(rename = "uploads")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub uploads: Option<String>,
-    /// The ID of the playlist that contains the channel"s favorite videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
-    #[serde(rename = "favorites")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub favorites: Option<String>,
-    /// The ID of the playlist that contains the channel"s liked videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
-    #[serde(rename = "likes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub likes: Option<String>,
 }
 
 /// Details about the content of a channel.
@@ -846,43 +2382,360 @@
     pub related_playlists: Option<ChannelContentDetailsRelatedPlaylists>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamHealthStatus {
-    /// The configurations issues on this stream
-    #[serde(rename = "configurationIssues")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
-    /// u64: The last time this status was updated (in seconds)
-    #[serde(rename = "lastUpdateTimeSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub last_update_time_seconds: Option<String>,
-    /// The status code of this stream
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct RelatedEntity {
+    #[serde(rename = "entity")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub entity: Option<Entity>,
+}
+
+/// Describes processing status and progress and availability of some other Video resource parts.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProcessingDetails {
+    /// This value indicates whether thumbnail images have been generated for the video.
+    #[serde(rename = "thumbnailsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails_availability: Option<String>,
+    /// This value indicates whether the video processing engine has generated suggestions that might improve YouTube's ability to process the the video, warnings that explain video processing problems, or errors that cause video processing problems. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "processingIssuesAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_issues_availability: Option<String>,
+    /// The video's processing status. This value indicates whether YouTube was able to process the video or if the video is still being processed.
+    #[serde(rename = "processingStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_status: Option<VideoProcessingDetailsProcessingStatus>,
+    /// This value indicates whether video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "editorSuggestionsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub editor_suggestions_availability: Option<String>,
+    #[serde(rename = "processingProgress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_progress: Option<VideoProcessingDetailsProcessingProgress>,
+    /// The reason that YouTube failed to process the video. This property will only have a value if the processingStatus property's value is failed.
+    #[serde(rename = "processingFailureReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_failure_reason: Option<VideoProcessingDetailsProcessingFailureReason>,
+    /// This value indicates whether keyword (tag) suggestions are available for the video. Tags can be added to a video's metadata to make it easier for other users to find the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "tagSuggestionsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag_suggestions_availability: Option<String>,
+    /// This value indicates whether file details are available for the uploaded video. You can retrieve a video's file details by requesting the fileDetails part in your videos.list() request.
+    #[serde(rename = "fileDetailsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_details_availability: Option<String>,
+}
+
+/// Basic details about rating of a video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRating {
+    /// The ID that YouTube uses to uniquely identify the video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// Rating of a video.
+    #[serde(rename = "rating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rating: Option<VideoRatingRating>,
+}
+
+/// A search result contains information about a YouTube video, channel, or playlist that matches the search parameters specified in an API request. While a search result points to a uniquely identifiable resource, like a video, it does not have its own persistent data.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchResult {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<SearchResultSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchResult".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<ResourceId>,
+}
+
+/// A channel banner returned as the response to a channel_banner.insert call.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBannerResource {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelBannerResource".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The URL of this banner image.
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: Option<String>,
+}
+
+/// Information about a video stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoFileDetailsVideoStream {
+    /// The encoded video content's height in pixels.
+    #[serde(rename = "heightPixels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub height_pixels: Option<u32>,
+    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
+    #[serde(rename = "vendor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub vendor: Option<String>,
+    /// The video stream's frame rate, in frames per second.
+    #[serde(rename = "frameRateFps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub frame_rate_fps: Option<f64>,
+    /// The video content's display aspect ratio, which specifies the aspect ratio in which the video should be displayed.
+    #[serde(rename = "aspectRatio")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub aspect_ratio: Option<f64>,
+    /// The amount that YouTube needs to rotate the original source content to properly display the video.
+    #[serde(rename = "rotation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rotation: Option<VideoFileDetailsVideoStreamRotation>,
+    /// u64: The video stream's bitrate, in bits per second.
+    #[serde(rename = "bitrateBps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bitrate_bps: Option<String>,
+    /// The encoded video content's width in pixels. You can calculate the video's encoding aspect ratio as width_pixels / height_pixels.
+    #[serde(rename = "widthPixels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub width_pixels: Option<u32>,
+    /// The video codec that the stream uses.
+    #[serde(rename = "codec")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub codec: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamListResponse {
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// A list of live streams that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveStream>>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStreamListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageDeletedDetails {
+    #[serde(rename = "deletedMessageId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub deleted_message_id: Option<String>,
+}
+
+/// Describes information necessary for ingesting an RTMP or an HTTP stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct IngestionInfo {
+    /// This ingestion url may be used instead of backupIngestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
+    #[serde(rename = "rtmpsBackupIngestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rtmps_backup_ingestion_address: Option<String>,
+    /// The backup ingestion URL that you should use to stream video to YouTube. You have the option of simultaneously streaming the content that you are sending to the ingestionAddress to this URL.
+    #[serde(rename = "backupIngestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub backup_ingestion_address: Option<String>,
+    /// The HTTP or RTMP stream name that YouTube assigns to the video stream.
+    #[serde(rename = "streamName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub stream_name: Option<String>,
+    /// This ingestion url may be used instead of ingestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
+    #[serde(rename = "rtmpsIngestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rtmps_ingestion_address: Option<String>,
+    /// The primary ingestion URL that you should use to stream video to YouTube. You must stream video to this URL. Depending on which application or tool you use to encode your video stream, you may need to enter the stream URL and stream name separately or you may need to concatenate them in the following format: *STREAM_URL/STREAM_NAME*
+    #[serde(rename = "ingestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ingestion_address: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBanSnippet {
+    /// The chat this ban is pertinent to.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    #[serde(rename = "bannedUserDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banned_user_details: Option<ChannelProfileDetails>,
+    /// The type of ban.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<LiveChatBanSnippetType>,
+    /// u64: The duration of a ban, only filled if the ban has type TEMPORARY.
+    #[serde(rename = "banDurationSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_duration_seconds: Option<String>,
+}
+
+/// Branding properties for images associated with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ImageSettings {
+    #[serde(rename = "largeBrandedBannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub large_branded_banner_image_url: Option<LocalizedProperty>,
+    #[serde(rename = "smallBrandedBannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub small_branded_banner_image_url: Option<LocalizedProperty>,
+    /// Banner image. Tablet size low resolution (1138x188).
+    #[serde(rename = "bannerTabletLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_low_image_url: Option<String>,
+    #[serde(rename = "smallBrandedBannerImageImapScript")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
+    #[serde(rename = "largeBrandedBannerImageImapScript")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub large_branded_banner_image_imap_script: Option<LocalizedProperty>,
+    /// Banner image. Tablet size extra high resolution (2560x424).
+    #[serde(rename = "bannerTabletExtraHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_extra_hd_image_url: Option<String>,
+    /// Banner image. Mobile size low resolution (320x88).
+    #[serde(rename = "bannerMobileLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_low_image_url: Option<String>,
+    /// The URL for a 1px by 1px tracking pixel that can be used to collect statistics for views of the channel or video pages.
+    #[serde(rename = "trackingImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tracking_image_url: Option<String>,
+    /// Banner image. Tablet size (1707x283).
+    #[serde(rename = "bannerTabletImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_image_url: Option<String>,
+    /// Banner image. Mobile size medium/high resolution (960x263).
+    #[serde(rename = "bannerMobileMediumHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_medium_hd_image_url: Option<String>,
+    /// Banner image. TV size low resolution (854x480).
+    #[serde(rename = "bannerTvLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_low_image_url: Option<String>,
+    /// Banner image. TV size medium resolution (1280x720).
+    #[serde(rename = "bannerTvMediumImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_medium_image_url: Option<String>,
+    #[serde(rename = "watchIconImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch_icon_image_url: Option<String>,
+    /// Banner image. Mobile size high resolution (1440x395).
+    #[serde(rename = "bannerMobileExtraHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_extra_hd_image_url: Option<String>,
+    /// Banner image. TV size high resolution (1920x1080).
+    #[serde(rename = "bannerTvHighImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_high_image_url: Option<String>,
+    /// Banner image. Desktop size (1060x175).
+    #[serde(rename = "bannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_image_url: Option<String>,
+    /// Banner image. Mobile size high resolution (1280x360).
+    #[serde(rename = "bannerMobileHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_hd_image_url: Option<String>,
+    /// Banner image. TV size extra high resolution (2120x1192).
+    #[serde(rename = "bannerTvImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_image_url: Option<String>,
+    /// Banner image. Mobile size (640x175).
+    #[serde(rename = "bannerMobileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_image_url: Option<String>,
+    /// This is generated when a ChannelBanner.Insert request has succeeded for the given channel.
+    #[serde(rename = "bannerExternalUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_external_url: Option<String>,
+    /// Banner image. Tablet size high resolution (2276x377).
+    #[serde(rename = "bannerTabletHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_hd_image_url: Option<String>,
+    #[serde(rename = "backgroundImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub background_image_url: Option<LocalizedProperty>,
+}
+
+/// A *channel* resource contains information about a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Channel {
+    /// The ID that YouTube uses to uniquely identify the channel.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, ChannelLocalization>>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ChannelSnippet>,
+    #[serde(rename = "brandingSettings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub branding_settings: Option<ChannelBrandingSettings>,
+    #[serde(rename = "conversionPings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conversion_pings: Option<ChannelConversionPings>,
+    #[serde(rename = "auditDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub audit_details: Option<ChannelAuditDetails>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<ChannelTopicDetails>,
     #[serde(rename = "status")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveStreamHealthStatusStatus>,
-}
-
-/// Describes the spatial position of a visual widget inside a video. It is a union of various position types, out of which only will be set one.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct InvideoPosition {
-    /// Describes in which corner of the video the visual widget will appear.
-    #[serde(rename = "cornerPosition")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub corner_position: Option<InvideoPositionCornerPosition>,
-    /// Defines the position type.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<InvideoPositionType>,
-}
-
-///
+    pub status: Option<ChannelStatus>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ChannelContentDetails>,
+    #[serde(rename = "contentOwnerDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_owner_details: Option<ChannelContentOwnerDetails>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channel".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<ChannelStatistics>,
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct PlaylistItemContentDetails {
-    /// The time, measured in seconds from the start of the video, when the video should stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video.
-    #[serde(rename = "endAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub end_at: Option<String>,
     /// A user-generated note for this item.
     #[serde(rename = "note")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -899,88 +2752,217 @@
     #[serde(rename = "videoPublishedAt")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub video_published_at: Option<DateTime<Utc>>,
-}
-
-/// Describes a temporal position of a visual widget inside a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct InvideoTiming {
-    /// Describes a timing type. If the value is offsetFromStart, then the offsetMs field represents an offset from the start of the video. If the value is offsetFromEnd, then the offsetMs field represents an offset from the end of the video.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<InvideoTimingType>,
-    /// u64: Defines the time at which the promotion will appear. Depending on the value of type the value of the offsetMs field will represent a time offset from the start or from the end of the video, expressed in milliseconds.
-    #[serde(rename = "offsetMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub offset_ms: Option<String>,
-    /// u64: Defines the duration in milliseconds for which the promotion should be displayed. If missing, the client should use the default.
-    #[serde(rename = "durationMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub duration_ms: Option<String>,
-}
-
-/// A *playlist* resource represents a YouTube playlist. A playlist is a collection of videos that can be viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not limit the number of playlists that each user creates. By default, playlists are publicly visible to other users, but playlists can be public or private. YouTube also uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Playlist {
+    /// The time, measured in seconds from the start of the video, when the video should stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video.
+    #[serde(rename = "endAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub end_at: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorListResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<PlaylistPlayer>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistContentDetails>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlist".
+    /// A list of moderators that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveChatModerator>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModeratorListResponse".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the playlist.
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+}
+
+/// Details about a resource which is being promoted.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPromotedItem {
+    /// The URL the client should ping to indicate that the user was shown this promoted item.
+    #[serde(rename = "creativeViewUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creative_view_url: Option<String>,
+    /// The custom call-to-action button text. If specified, it will override the default button text for the cta_type.
+    #[serde(rename = "customCtaButtonText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub custom_cta_button_text: Option<String>,
+    /// The type of call-to-action, a message to the user indicating action that can be taken.
+    #[serde(rename = "ctaType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cta_type: Option<ActivityContentDetailsPromotedItemCtaType>,
+    /// The URL the client should direct the user to, if the user chooses to visit the advertiser's website.
+    #[serde(rename = "destinationUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub destination_url: Option<String>,
+    /// The text description to accompany the promoted item.
+    #[serde(rename = "descriptionText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description_text: Option<String>,
+    /// The list of impression URLs. The client should ping all of these URLs to indicate that the user was shown this promoted item.
+    #[serde(rename = "impressionUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub impression_url: Option<Vec<String>>,
+    /// The list of forecasting URLs. The client should ping all of these URLs when a promoted item is not available, to indicate that a promoted item could have been shown.
+    #[serde(rename = "forecastingUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub forecasting_url: Option<Vec<String>>,
+    /// The URL the client should fetch to request a promoted item.
+    #[serde(rename = "adTag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ad_tag: Option<String>,
+    /// The URL the client should ping to indicate that the user clicked through on this promoted item.
+    #[serde(rename = "clickTrackingUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub click_tracking_url: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the promoted video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelListResponse {
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Channel>>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+}
+
+/// The contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentOwnerDetails {
+    /// DateTime: The date and time when the channel was linked to the content owner.
+    #[serde(rename = "timeLinked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_linked: Option<DateTime<Utc>>,
+    /// The ID of the content owner linked to the channel.
+    #[serde(rename = "contentOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_owner: Option<String>,
+}
+
+/// A `__videoAbuseReportReason__` resource identifies a reason that a video could be reported as abusive. Video abuse report reasons are used with `video.ReportAbuse`.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReason {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoAbuseReportReasonSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReason"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID of this abuse report reason.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<PlaylistStatus>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistSnippet>,
-}
-
-/// A channel banner returned as the response to a channel_banner.insert call.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelBannerResource {
-    /// The URL of this banner image.
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevelListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelBannerResource".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-///
+    /// A list of pricing levels offered by a creator to the fans.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<MembershipsLevel>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct SuperChatEventSnippet {
+    /// A rendered string that displays the purchase amount and currency (e.g., "$1.00"). The string is rendered for the given language.
+    #[serde(rename = "displayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_string: Option<String>,
+    /// The tier for the paid message, which is based on the amount of money spent to purchase the message.
+    #[serde(rename = "messageType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_type: Option<u32>,
     /// u64: The purchase amount, in micros of the purchase currency. e.g., 1 is represented as 1000000.
     #[serde(rename = "amountMicros")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub amount_micros: Option<String>,
+    /// The currency in which the purchase was made. ISO 4217.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
     #[serde(rename = "superStickerMetadata")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// True if this event is a Super Sticker event.
-    #[serde(rename = "isSuperStickerEvent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_super_sticker_event: Option<bool>,
+    /// Channel id where the event occurred.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    #[serde(rename = "supporterDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub supporter_details: Option<ChannelProfileDetails>,
     /// DateTime: The date and time when the event occurred.
     #[serde(rename = "createdAt")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -989,97 +2971,65 @@
     #[serde(rename = "commentText")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub comment_text: Option<String>,
-    #[serde(rename = "supporterDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub supporter_details: Option<ChannelProfileDetails>,
-    /// Channel id where the event occurred.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The tier for the paid message, which is based on the amount of money spent to purchase the message.
-    #[serde(rename = "messageType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_type: Option<u32>,
-    /// A rendered string that displays the purchase amount and currency (e.g., "$1.00"). The string is rendered for the given language.
-    #[serde(rename = "displayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_string: Option<String>,
-    /// The currency in which the purchase was made. ISO 4217.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-}
-
-/// A *liveChatModerator* resource represents a moderator for a YouTube live chat. A chat moderator has the ability to ban/unban users from a chat, remove message, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModerator {
-    /// The ID that YouTube assigns to uniquely identify the moderator.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveChatModeratorSnippet>,
+    /// True if this event is a Super Sticker event.
+    #[serde(rename = "isSuperStickerEvent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_super_sticker_event: Option<bool>,
+}
+
+/// Basic information about a third party account link, including its type and type-specific information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinkSnippet {
+    #[serde(rename = "channelToStoreLink")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_to_store_link: Option<ChannelToStoreLinkDetails>,
+    /// Type of the link named after the entities that are being linked.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<ThirdPartyLinkSnippetType>,
+}
+
+/// An *i18nLanguage* resource identifies a UI language currently supported by YouTube.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguage {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModerator".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-/// A *subscription* resource contains information about a YouTube user subscription. A subscription notifies a user when new videos are added to a channel or when another user takes one of several actions on YouTube, such as uploading a video, rating a video, or commenting on a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Subscription {
-    #[serde(rename = "subscriberSnippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscriber_snippet: Option<SubscriptionSubscriberSnippet>,
-    /// The ID that YouTube uses to uniquely identify the subscription.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscription".
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguage".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the i18n language.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SubscriptionSnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<SubscriptionContentDetails>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDurationAtLevel {
-    /// The cumulative time the user has been a member for the given level in complete months (the time is rounded down to the nearest integer).
-    #[serde(rename = "memberTotalDurationMonths")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_total_duration_months: Option<i32>,
-    /// Pricing level ID.
-    #[serde(rename = "level")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub level: Option<String>,
-    /// The date and time when the user became a continuous member for the given level.
-    #[serde(rename = "memberSince")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_since: Option<String>,
-}
-
-/// A *comment* represents a single YouTube comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Comment {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CommentSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#comment".
+    pub snippet: Option<I18nLanguageSnippet>,
+}
+
+/// Settings and Info of the monitor stream
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MonitorStreamInfo {
+    /// If you have set the enableMonitorStream property to true, then this property determines the length of the live broadcast delay.
+    #[serde(rename = "broadcastStreamDelayMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub broadcast_stream_delay_ms: Option<u32>,
+    /// HTML code that embeds a player that plays the monitor stream.
+    #[serde(rename = "embedHtml")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_html: Option<String>,
+    /// This value determines whether the monitor stream is enabled for the broadcast. If the monitor stream is enabled, then YouTube will broadcast the event content on a special stream intended only for the broadcaster's consumption. The broadcaster can use the stream to review the event content and also to identify the optimal times to insert cuepoints. You need to set this value to true if you intend to have a broadcast delay for your event. *Note:* This property cannot be updated once the broadcast is in the testing or live state.
+    #[serde(rename = "enableMonitorStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_monitor_stream: Option<bool>,
+}
+
+/// A `__superChatEvent__` resource represents a Super Chat purchase on a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEvent {
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#superChatEvent"`.
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
@@ -1087,158 +3037,236 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the comment.
+    /// The ID that YouTube assigns to uniquely identify the Super Chat event.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<SuperChatEventSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestItem {
+    /// i64:
+    #[serde(rename = "gaia")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub gaia: Option<String>,
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-}
-
-/// Details about the live streaming metadata.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoLiveStreamingDetails {
-    /// DateTime: The time that the broadcast is scheduled to begin.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<DateTime<Utc>>,
-    /// The ID of the currently active live chat attached to this video. This field is filled only if the video is a currently live broadcast that has live chat. Once the broadcast transitions to complete this field will be removed and the live chat closed down. For persistent broadcasts that live chat id will no longer be tied to this video but rather to the new video being displayed at the persistent page.
-    #[serde(rename = "activeLiveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub active_live_chat_id: Option<String>,
-    /// DateTime: The time that the broadcast actually started. This value will not be available until the broadcast begins.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<DateTime<Utc>>,
-    /// DateTime: The time that the broadcast is scheduled to end. If the value is empty or the property is not present, then the broadcast is scheduled to contiue indefinitely.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<DateTime<Utc>>,
-    /// u64: The number of viewers currently watching the broadcast. The property and its value will be present if the broadcast has current viewers and the broadcast owner has not hidden the viewcount for the video. Note that YouTube stops tracking the number of concurrent viewers for a broadcast when the broadcast ends. So, this property would not identify the number of viewers watching an archived video of a live broadcast that already ended.
-    #[serde(rename = "concurrentViewers")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub concurrent_viewers: Option<String>,
-    /// DateTime: The time that the broadcast actually ended. This value will not be available until the broadcast is over.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<DateTime<Utc>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelProfileDetails {
-    /// The channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: Option<String>,
-    /// The channel's display name.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// The channels's avatar URL.
-    #[serde(rename = "profileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_image_url: Option<String>,
-    /// The YouTube channel ID.
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<TestItemTestItemSnippet>,
+}
+
+/// A *third party account link* resource represents a link between a YouTube account or a channel and an account on a third-party service.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLink {
+    /// The linking_token identifies a YouTube account and channel with which the third party account is linked.
+    #[serde(rename = "linkingToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub linking_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thirdPartyLink".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ThirdPartyLinkSnippet>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<ThirdPartyLinkStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamConfigurationIssue {
+    /// How severe this issue is to the stream.
+    #[serde(rename = "severity")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub severity: Option<LiveStreamConfigurationIssueSeverity>,
+    /// The kind of error happening.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<LiveStreamConfigurationIssueType>,
+    /// The short-form reason for this issue.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<String>,
+    /// The long-form description of the issue and how to resolve it.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsDuration {
+    /// The date and time when the user became a continuous member across all levels.
+    #[serde(rename = "memberSince")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_since: Option<String>,
+    /// The cumulative time the user has been a member across all levels in complete months (the time is rounded down to the nearest integer).
+    #[serde(rename = "memberTotalDurationMonths")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_total_duration_months: Option<i32>,
+}
+
+/// Recording information associated with the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRecordingDetails {
+    #[serde(rename = "location")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location: Option<GeoPoint>,
+    /// DateTime: The date and time when the video was recorded.
+    #[serde(rename = "recordingDate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_date: Option<DateTime<Utc>>,
+    /// The text description of the location where the video was recorded.
+    #[serde(rename = "locationDescription")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location_description: Option<String>,
+}
+
+/// ChannelSection localization setting
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionLocalization {
+    /// The localized strings for channel section's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// Freebase topic information related to the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelTopicDetails {
+    /// A list of Wikipedia URLs that describe the channel's content.
+    #[serde(rename = "topicCategories")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_categories: Option<Vec<String>>,
+    /// A list of Freebase topic IDs associated with the channel. You can retrieve information about each topic using the Freebase Topic API.
+    #[serde(rename = "topicIds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_ids: Option<Vec<String>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReport {
+    /// The specific, or secondary, reason that this content is abusive (if available). The value is an abuse report reason ID that is a valid secondary reason for the primary reason.
+    #[serde(rename = "secondaryReasonId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub secondary_reason_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The language that the content was viewed in.
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
+    /// Additional comments regarding the abuse report.
+    #[serde(rename = "comments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comments: Option<String>,
+    /// The high-level, or primary, reason that the content is abusive. The value is an abuse report reason ID.
+    #[serde(rename = "reasonId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEventListResponse {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#superChatEventListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// A list of Super Chat purchases that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<SuperChatEvent>>,
+}
+
+/// The auditDetails object encapsulates channel data that is relevant for YouTube Partners during the audit process.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelAuditDetails {
+    /// Whether or not the channel has any copyright strikes.
+    #[serde(rename = "copyrightStrikesGoodStanding")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub copyright_strikes_good_standing: Option<bool>,
+    /// Whether or not the channel has any unresolved claims.
+    #[serde(rename = "contentIdClaimsGoodStanding")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_id_claims_good_standing: Option<bool>,
+    /// Whether or not the channel respects the community guidelines.
+    #[serde(rename = "communityGuidelinesGoodStanding")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub community_guidelines_good_standing: Option<bool>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAgeGating {
+    /// Video game rating, if any.
+    #[serde(rename = "videoGameRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_game_rating: Option<VideoAgeGatingVideoGameRating>,
+    /// Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present.
+    #[serde(rename = "restricted")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub restricted: Option<bool>,
+    /// Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content.
+    #[serde(rename = "alcoholContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alcohol_content: Option<bool>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamSnippet {
+    /// DateTime: The date and time that the stream was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// The stream's title. The value must be between 1 and 128 characters long.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The stream's description. The value cannot be longer than 10000 characters.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "isDefaultStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_default_stream: Option<bool>,
+    /// The ID that YouTube uses to uniquely identify the channel that is transmitting the stream.
     #[serde(rename = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperStickerDetails {
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The currency in which the purchase was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-    #[serde(rename = "superStickerMetadata")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
-    #[serde(rename = "tier")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tier: Option<u32>,
-}
-
-/// Basic details about a channel section, including title, style and position.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionSnippet {
-    /// The channel section's title for multiple_playlists and multiple_channels.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel that published the channel section.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The style of the channel section.
-    #[serde(rename = "style")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub style: Option<ChannelSectionSnippetStyle>,
-    /// The language of the channel section's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<ChannelSectionLocalization>,
-    /// The type of the channel section.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ChannelSectionSnippetType>,
-    /// The position of the channel section in the channel.
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<u32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatUserBannedMessageDetails {
-    #[serde(rename = "bannedUserDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banned_user_details: Option<ChannelProfileDetails>,
-    /// The type of ban.
-    #[serde(rename = "banType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_type: Option<LiveChatUserBannedMessageDetailsBanType>,
-    /// u64: The duration of the ban. This property is only present if the banType is temporary.
-    #[serde(rename = "banDurationSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_duration_seconds: Option<String>,
-}
-
-/// Details about a social network post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSocial {
-    /// The author of the social network post.
-    #[serde(rename = "author")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author: Option<String>,
-    /// An image of the post's author.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The URL of the social network post.
-    #[serde(rename = "referenceUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reference_url: Option<String>,
-    /// The name of the social network.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ActivityContentDetailsSocialType>,
-}
-
 /// A single tag suggestion with it's relevance information.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct VideoSuggestionsTagSuggestion {
@@ -1252,1035 +3280,353 @@
     pub category_restricts: Option<Vec<String>>,
 }
 
-/// Basic details about an activity, including title, description, thumbnails, activity type and group. Next ID: 12
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivitySnippet {
-    /// The title of the resource primarily associated with the activity.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// DateTime: The date and time that the video was uploaded.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The description of the resource primarily associated with the activity. @mutable youtube.activities.insert
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The group ID associated with the activity. A group ID identifies user events that are associated with the same user and resource. For example, if a user rates a video and marks the same video as a favorite, the entries for those events would have the same group ID in the user's activity feed. In your user interface, you can avoid repetition by grouping events with the same groupId value.
-    #[serde(rename = "groupId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub group_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel associated with the activity.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// Channel title for the channel responsible for this activity
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The type of activity that the resource describes.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ActivitySnippetType>,
-}
-
-/// Detailed settings of a broadcast.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastContentDetails {
-    /// This setting indicates whether auto stop is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
-    #[serde(rename = "enableAutoStop")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_auto_stop: Option<bool>,
-    /// The 3D stereo layout of this broadcast. This defaults to mono.
-    #[serde(rename = "stereoLayout")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stereo_layout: Option<LiveBroadcastContentDetailsStereoLayout>,
-    /// This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. *Important:* You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends.
-    #[serde(rename = "enableDvr")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_dvr: Option<bool>,
-    /// This value uniquely identifies the live stream bound to the broadcast.
-    #[serde(rename = "boundStreamId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bound_stream_id: Option<String>,
-    /// This setting indicates whether YouTube should enable content encryption for the broadcast.
-    #[serde(rename = "enableContentEncryption")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_content_encryption: Option<bool>,
-    /// This setting indicates whether HTTP POST closed captioning is enabled for this broadcast. The ingestion URL of the closed captions is returned through the liveStreams API. This is mutually exclusive with using the closed_captions_type property, and is equivalent to setting closed_captions_type to CLOSED_CAPTIONS_HTTP_POST.
-    #[serde(rename = "enableClosedCaptions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_closed_captions: Option<bool>,
-    /// This setting indicates whether auto start is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
-    #[serde(rename = "enableAutoStart")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_auto_start: Option<bool>,
-    /// This setting indicates whether the broadcast should automatically begin with an in-stream slate when you update the broadcast's status to live. After updating the status, you then need to send a liveCuepoints.insert request that sets the cuepoint's eventState to end to remove the in-stream slate and make your broadcast stream visible to viewers.
-    #[serde(rename = "startWithSlate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start_with_slate: Option<bool>,
-    /// The mesh for projecting the video if projection is mesh. The mesh value must be a UTF-8 string containing the base-64 encoding of 3D mesh data that follows the Spherical Video V2 RFC specification for an mshp box, excluding the box size and type but including the following four reserved zero bytes for the version and flags.
-    #[serde(rename = "mesh")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mesh: Option<String>,
-    /// This setting indicates whether the broadcast video can be played in an embedded player. If you choose to archive the video (using the enableArchive property), this setting will also apply to the archived video.
-    #[serde(rename = "enableEmbed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_embed: Option<bool>,
-    /// Indicates whether this broadcast has low latency enabled.
-    #[serde(rename = "enableLowLatency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_low_latency: Option<bool>,
-    /// DateTime: The date and time that the live stream referenced by boundStreamId was last updated.
-    #[serde(rename = "boundStreamLastUpdateTimeMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bound_stream_last_update_time_ms: Option<DateTime<Utc>>,
-    #[serde(rename = "monitorStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monitor_stream: Option<MonitorStreamInfo>,
-    /// The projection format of this broadcast. This defaults to rectangular.
-    #[serde(rename = "projection")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub projection: Option<LiveBroadcastContentDetailsProjection>,
-    /// If both this and enable_low_latency are set, they must match. LATENCY_NORMAL should match enable_low_latency=false LATENCY_LOW should match enable_low_latency=true LATENCY_ULTRA_LOW should have enable_low_latency omitted.
-    #[serde(rename = "latencyPreference")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub latency_preference: Option<LiveBroadcastContentDetailsLatencyPreference>,
-    #[serde(rename = "closedCaptionsType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
-    /// Automatically start recording after the event goes live. The default value for this property is true. *Important:* You must also set the enableDvr property's value to true if you want the playback to be available immediately after the broadcast ends. If you set this property's value to true but do not also set the enableDvr property to true, there may be a delay of around one day before the archived video will be available for playback.
-    #[serde(rename = "recordFromStart")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub record_from_start: Option<bool>,
-}
-
-/// Player to be used for a video playback.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoPlayer {
-    /// An <iframe> tag that embeds a player that will play the video.
-    #[serde(rename = "embedHtml")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_html: Option<String>,
-    /// i64: The embed width
-    #[serde(rename = "embedWidth")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_width: Option<String>,
-    /// i64:
-    #[serde(rename = "embedHeight")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_height: Option<String>,
-}
-
-/// Basic broadcast information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastSnippet {
-    /// Indicates whether this broadcast is the default broadcast. Internal only.
-    #[serde(rename = "isDefaultBroadcast")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_default_broadcast: Option<bool>,
-    /// DateTime: The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<DateTime<Utc>>,
-    /// The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// DateTime: The date and time that the broadcast actually started. This information is only available once the broadcast's state is live.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<DateTime<Utc>>,
-    /// DateTime: The date and time that the broadcast was added to YouTube's live broadcast schedule.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// DateTime: The date and time that the broadcast is scheduled to start.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<DateTime<Utc>>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The broadcast's description. As with the title, you can set this field by modifying the broadcast resource or by setting the description field of the corresponding video resource.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The id of the live chat for this broadcast.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    /// DateTime: The date and time that the broadcast is scheduled to end.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<DateTime<Utc>>,
-    /// The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-/// Playlist localization setting
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistLocalization {
-    /// The localized strings for playlist's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The localized strings for playlist's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorSnippet {
-    #[serde(rename = "moderatorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderator_details: Option<ChannelProfileDetails>,
-    /// The ID of the live chat this moderator can act on.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelListResponse".
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistStatus {
+    /// The playlist's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<PlaylistStatusPrivacyStatus>,
+}
+
+/// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelConversionPing {
+    /// The url (without the schema) that the player shall send the ping to. It's at caller's descretion to decide which schema to use (http vs https) Example of a returned url: //googleads.g.doubleclick.net/pagead/ viewthroughconversion/962985656/?data=path%3DtHe_path%3Btype%3D cview%3Butuid%3DGISQtTNGYqaYl4sKxoVvKA&labe=default The caller must append biscotti authentication (ms param in case of mobile, for example) to this ping.
+    #[serde(rename = "conversionUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conversion_url: Option<String>,
+    /// Defines the context of the ping.
+    #[serde(rename = "context")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub context: Option<ChannelConversionPingContext>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSection {
+    #[serde(rename = "targeting")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub targeting: Option<ChannelSectionTargeting>,
+    /// The ID that YouTube uses to uniquely identify the channel section.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSection".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Channel>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestItemTestItemSnippet {}
-
-/// Basic details about a video, including title, description, uploader, thumbnails and category.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSnippet {
-    /// DateTime: The date and time when the video was uploaded.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// Indicates if the video is an upcoming/active live broadcast. Or it's "none" if the video is not an upcoming/active live broadcast.
-    #[serde(rename = "liveBroadcastContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_content: Option<VideoSnippetLiveBroadcastContent>,
-    /// A list of keyword tags associated with the video. Tags may contain spaces.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<String>>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<VideoLocalization>,
-    /// The video's description. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The default_audio_language property specifies the language spoken in the video's default audio track.
-    #[serde(rename = "defaultAudioLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_audio_language: Option<String>,
-    /// The video's title. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Channel title for the channel that the video belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The YouTube video category associated with the video.
-    #[serde(rename = "categoryId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub category_id: Option<String>,
-    /// The language of the videos's default snippet.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-}
-
-/// Information about the playlist item's privacy status.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemStatus {
-    /// This resource's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<PlaylistItemStatusPrivacyStatus>,
-}
-
-/// Details about a channel bulletin post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsBulletin {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Statistics about a channel: number of subscribers, number of videos in the channel, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelStatistics {
-    /// u64: The number of times the channel has been viewed.
-    #[serde(rename = "viewCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub view_count: Option<String>,
-    /// u64: The number of videos uploaded to the channel.
-    #[serde(rename = "videoCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_count: Option<String>,
-    /// Whether or not the number of subscribers is shown for this user.
-    #[serde(rename = "hiddenSubscriberCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hidden_subscriber_count: Option<bool>,
-    /// u64: The number of subscribers that the channel has.
-    #[serde(rename = "subscriberCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscriber_count: Option<String>,
-    /// u64: The number of comments for the channel.
-    #[serde(rename = "commentCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_count: Option<String>,
-}
-
-/// A *channel* resource contains information about a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Channel {
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<ChannelStatus>,
-    /// The ID that YouTube uses to uniquely identify the channel.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "brandingSettings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub branding_settings: Option<ChannelBrandingSettings>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ChannelSnippet>,
-    #[serde(rename = "auditDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audit_details: Option<ChannelAuditDetails>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "conversionPings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conversion_pings: Option<ChannelConversionPings>,
-    #[serde(rename = "topicDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_details: Option<ChannelTopicDetails>,
+    pub snippet: Option<ChannelSectionSnippet>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ChannelSectionContentDetails>,
     /// Localizations for different languages
     #[serde(rename = "localizations")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelLocalization>>,
-    #[serde(rename = "contentOwnerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_owner_details: Option<ChannelContentOwnerDetails>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channel".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ChannelContentDetails>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<ChannelStatistics>,
-}
-
-/// Basic details about a video category, such as its localized title.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategorySnippet {
-    /// The YouTube channel that created the video category.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The video category's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    #[serde(rename = "assignable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub assignable: Option<bool>,
-}
-
-/// Information that identifies the recommended resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsRecommendation {
-    /// The reason that the resource is recommended to the user.
-    #[serde(rename = "reason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason: Option<ActivityContentDetailsRecommendationReason>,
-    #[serde(rename = "seedResourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub seed_resource_id: Option<ResourceId>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReport {
-    /// The language that the content was viewed in.
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// Additional comments regarding the abuse report.
-    #[serde(rename = "comments")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comments: Option<String>,
-    /// The specific, or secondary, reason that this content is abusive (if available). The value is an abuse report reason ID that is a valid secondary reason for the primary reason.
-    #[serde(rename = "secondaryReasonId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub secondary_reason_id: Option<String>,
-    /// The high-level, or primary, reason that the content is abusive. The value is an abuse report reason ID.
-    #[serde(rename = "reasonId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason_id: Option<String>,
-}
-
-/// Details about the content of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoContentDetails {
-    #[serde(rename = "regionRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
-    /// The value of is_license_content indicates whether the video is licensed content.
-    #[serde(rename = "licensedContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub licensed_content: Option<bool>,
-    /// The value of definition indicates whether the video is available in high definition or only in standard definition.
-    #[serde(rename = "definition")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub definition: Option<VideoContentDetailsDefinition>,
-    /// Specifies the projection format of the video.
-    #[serde(rename = "projection")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub projection: Option<VideoContentDetailsProjection>,
-    /// The value of captions indicates whether the video has captions or not.
-    #[serde(rename = "caption")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub caption: Option<VideoContentDetailsCaption>,
-    /// The value of dimension indicates whether the video is available in 3D or in 2D.
-    #[serde(rename = "dimension")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dimension: Option<String>,
-    /// The length of the video. The tag value is an ISO 8601 duration in the format PT#M#S, in which the letters PT indicate that the value specifies a period of time, and the letters M and S refer to length in minutes and seconds, respectively. The # characters preceding the M and S letters are both integers that specify the number of minutes (or seconds) of the video. For example, a value of PT15M51S indicates that the video is 15 minutes and 51 seconds long.
-    #[serde(rename = "duration")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub duration: Option<String>,
-    #[serde(rename = "countryRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country_restriction: Option<AccessPolicy>,
-    /// Indicates whether the video uploader has provided a custom thumbnail image for the video. This property is only visible to the video uploader.
-    #[serde(rename = "hasCustomThumbnail")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub has_custom_thumbnail: Option<bool>,
-    #[serde(rename = "contentRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_rating: Option<ContentRating>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistListResponse {
+    pub localizations: Option<HashMap<String, ChannelSectionLocalization>>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// A list of playlists that match the request criteria
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Playlist>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatTextMessageDetails {
-    /// The user's message.
-    #[serde(rename = "messageText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_text: Option<String>,
-}
-
-/// Branding properties for the watch. All deprecated.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct WatchSettings {
-    /// The background color for the video watch page's branded area.
-    #[serde(rename = "textColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_color: Option<String>,
-    /// The text color for the video watch page's branded area.
-    #[serde(rename = "backgroundColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_color: Option<String>,
-    /// An ID that uniquely identifies a playlist that displays next to the video player.
-    #[serde(rename = "featuredPlaylistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_playlist_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionListResponse {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#captionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of captions that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Caption>>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-}
-
-/// The third-party link status object contains information about the status of the link.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinkStatus {
-    #[serde(rename = "linkStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub link_status: Option<ThirdPartyLinkStatusLinkStatus>,
-}
-
-/// A thumbnail is an image representing a YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Thumbnail {
-    /// (Optional) Width of the thumbnail image.
-    #[serde(rename = "width")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub width: Option<u32>,
-    /// The thumbnail image's URL.
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-    /// (Optional) Height of the thumbnail image.
-    #[serde(rename = "height")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height: Option<u32>,
-}
-
-/// Localized versions of certain video properties (e.g. title).
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoLocalization {
-    /// Localized version of the video's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Localized version of the video's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSectionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of ChannelSections that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<ChannelSection>>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// A search result contains information about a YouTube video, channel, or playlist that matches the search parameters specified in an API request. While a search result points to a uniquely identifiable resource, like a video, it does not have its own persistent data.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchResult {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchResult".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SearchResultSnippet>,
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<ResourceId>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamConfigurationIssue {
-    /// The long-form description of the issue and how to resolve it.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The short-form reason for this issue.
-    #[serde(rename = "reason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason: Option<String>,
-    /// How severe this issue is to the stream.
-    #[serde(rename = "severity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub severity: Option<LiveStreamConfigurationIssueSeverity>,
-    /// The kind of error happening.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<LiveStreamConfigurationIssueType>,
-}
-
-/// An *i18nLanguage* resource identifies a UI language currently supported by YouTube.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguage {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<I18nLanguageSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguage".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the i18n language.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventListResponse {
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// A list of Super Chat purchases that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<SuperChatEvent>>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#superChatEventListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorListResponse {
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of moderators that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatModerator>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModeratorListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-/// A live stream describes a live ingestion point.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStream {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveStreamSnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveStreamContentDetails>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveStreamStatus>,
-    /// The ID that YouTube assigns to uniquely identify the stream.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "cdn")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cdn: Option<CdnSettings>,
-}
-
-/// A *video* resource represents a YouTube video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Video {
-    #[serde(rename = "monetizationDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monetization_details: Option<VideoMonetizationDetails>,
-    #[serde(rename = "suggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub suggestions: Option<VideoSuggestions>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#video".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "ageGating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub age_gating: Option<VideoAgeGating>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoSnippet>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<VideoStatus>,
-    /// The localizations object contains localized versions of the basic details about the video, such as its title and description.
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, VideoLocalization>>,
-    #[serde(rename = "processingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_details: Option<VideoProcessingDetails>,
-    #[serde(rename = "fileDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_details: Option<VideoFileDetails>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<VideoContentDetails>,
-    #[serde(rename = "liveStreamingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
-    #[serde(rename = "recordingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_details: Option<VideoRecordingDetails>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "projectDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub project_details: Option<VideoProjectDetails>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<VideoStatistics>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<VideoPlayer>,
-    /// The ID that YouTube uses to uniquely identify the video.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "topicDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_details: Option<VideoTopicDetails>,
-}
-
-/// Describes original video file properties, including technical details about audio and video streams, but also metadata information like content length, digitization time, or geotagging information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetails {
-    /// u64: The uploaded file's size in bytes. This field is present whether a video file or another type of file was uploaded.
-    #[serde(rename = "fileSize")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_size: Option<String>,
-    /// A list of video streams contained in the uploaded video file. Each item in the list contains detailed metadata about a video stream.
-    #[serde(rename = "videoStreams")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_streams: Option<Vec<VideoFileDetailsVideoStream>>,
-    /// The uploaded file's name. This field is present whether a video file or another type of file was uploaded.
-    #[serde(rename = "fileName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_name: Option<String>,
-    /// u64: The length of the uploaded video in milliseconds.
-    #[serde(rename = "durationMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub duration_ms: Option<String>,
-    /// The uploaded video file's container format.
-    #[serde(rename = "container")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub container: Option<String>,
-    /// A list of audio streams contained in the uploaded video file. Each item in the list contains detailed metadata about an audio stream.
-    #[serde(rename = "audioStreams")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audio_streams: Option<Vec<VideoFileDetailsAudioStream>>,
-    /// u64: The uploaded video file's combined (video and audio) bitrate in bits per second.
-    #[serde(rename = "bitrateBps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bitrate_bps: Option<String>,
-    /// The uploaded file's type as detected by YouTube's video processing engine. Currently, YouTube only processes video files, but this field is present whether a video file or another type of file was uploaded.
-    #[serde(rename = "fileType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_type: Option<VideoFileDetailsFileType>,
-    /// The date and time when the uploaded video file was created. The value is specified in ISO 8601 format. Currently, the following ISO 8601 formats are supported: - Date only: YYYY-MM-DD - Naive time: YYYY-MM-DDTHH:MM:SS - Time with timezone: YYYY-MM-DDTHH:MM:SS+HH:MM
-    #[serde(rename = "creationTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creation_time: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastListResponse {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcastListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// A list of broadcasts that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveBroadcast>>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-}
-
-/// Basic details about a subscription's subscriber including title, description, channel ID and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionSubscriberSnippet {
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The channel ID of the subscriber.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The description of the subscriber.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The title of the subscriber.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-/// Brief description of the live stream cdn settings.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CdnSettings {
-    ///  The method or protocol used to transmit the video stream.
-    #[serde(rename = "ingestionType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_type: Option<CdnSettingsIngestionType>,
-    /// The frame rate of the inbound video data.
-    #[serde(rename = "frameRate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub frame_rate: Option<CdnSettingsFrameRate>,
-    #[serde(rename = "ingestionInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_info: Option<IngestionInfo>,
-    /// The resolution of the inbound video data.
-    #[serde(rename = "resolution")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resolution: Option<CdnSettingsResolution>,
-    /// The format of the video stream that you are sending to Youtube.
-    #[serde(rename = "format")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub format: Option<String>,
-}
-
-/// Live broadcast state.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastStatus {
-    /// This field will be set to True if the creator declares the broadcast to be kids only: go/live-cw-work.
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-    /// The broadcast's status. The status can be updated using the API's liveBroadcasts.transition method.
-    #[serde(rename = "lifeCycleStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub life_cycle_status: Option<LiveBroadcastStatusLifeCycleStatus>,
-    /// Priority of the live broadcast event (internal state).
-    #[serde(rename = "liveBroadcastPriority")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_priority: Option<LiveBroadcastStatusLiveBroadcastPriority>,
-    /// The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<LiveBroadcastStatusPrivacyStatus>,
-    /// Whether the broadcast is made for kids or not, decided by YouTube instead of the creator. This field is read only.
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// The broadcast's recording status.
-    #[serde(rename = "recordingStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_status: Option<LiveBroadcastStatusRecordingStatus>,
-}
-
-/// Information about a resource that received a positive (like) rating.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsLike {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// The contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked with the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelContentOwnerDetails {
-    /// The ID of the content owner linked to the channel.
-    #[serde(rename = "contentOwner")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_owner: Option<String>,
-    /// DateTime: The date and time when the channel was linked to the content owner.
-    #[serde(rename = "timeLinked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_linked: Option<DateTime<Utc>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LocalizedString {
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
+}
+
+/// Ratings schemes. The country-specific ratings are mostly for movies and shows. LINT.IfChange
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ContentRating {
+    /// The video's Central Board of Film Certification (CBFC - India) rating.
+    #[serde(rename = "cbfcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cbfc_rating: Option<ContentRatingCbfcRating>,
+    /// The video's rating in Estonia.
+    #[serde(rename = "eefilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub eefilm_rating: Option<ContentRatingEefilmRating>,
+    /// Reasons that explain why the video received its FPB (South Africa) rating.
+    #[serde(rename = "fpbRatingReasons")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fpb_rating_reasons: Option<Vec<ContentRatingFpbRatingReasons>>,
+    /// The video's rating from Nigeria's National Film and Video Censors Board.
+    #[serde(rename = "nfvcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nfvcb_rating: Option<ContentRatingNfvcbRating>,
+    /// The video's rating from Hong Kong's Office for Film, Newspaper and Article Administration.
+    #[serde(rename = "fcoRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fco_rating: Option<ContentRatingFcoRating>,
+    /// The video's NICAM/Kijkwijzer rating from the Nederlands Instituut voor de Classificatie van Audiovisuele Media (Netherlands).
+    #[serde(rename = "kijkwijzerRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kijkwijzer_rating: Option<ContentRatingKijkwijzerRating>,
+    /// The video's British Board of Film Classification (BBFC) rating.
+    #[serde(rename = "bbfcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bbfc_rating: Option<ContentRatingBbfcRating>,
+    /// The video's rating in Venezuela.
+    #[serde(rename = "resorteviolenciaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resorteviolencia_rating: Option<ContentRatingResorteviolenciaRating>,
+    /// The video's rating from the Kenya Film Classification Board.
+    #[serde(rename = "kfcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kfcb_rating: Option<ContentRatingKfcbRating>,
+    /// The video's rating in Israel.
+    #[serde(rename = "ilfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ilfilm_rating: Option<ContentRatingIlfilmRating>,
+    /// The video's rating from Taiwan's Ministry of Culture (文化部).
+    #[serde(rename = "moctwRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moctw_rating: Option<ContentRatingMoctwRating>,
+    /// The video's rating from the Austrian Board of Media Classification (Bundesministerium für Unterricht, Kunst und Kultur).
+    #[serde(rename = "bmukkRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bmukk_rating: Option<ContentRatingBmukkRating>,
+    /// The video's National Film Registry of the Russian Federation (MKRF - Russia) rating.
+    #[serde(rename = "russiaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub russia_rating: Option<ContentRatingRussiaRating>,
+    /// Rating system for Canadian TV - Canadian TV Classification System The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian English-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
+    #[serde(rename = "catvRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub catv_rating: Option<ContentRatingCatvRating>,
+    /// The video's Ministerio de Cultura (Colombia) rating.
+    #[serde(rename = "mocRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moc_rating: Option<ContentRatingMocRating>,
+    /// The video's rating from Ireland's Raidió Teilifís Éireann.
+    #[serde(rename = "rteRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rte_rating: Option<ContentRatingRteRating>,
+    /// The video's Anatel (Asociación Nacional de Televisión) rating for Chilean television.
+    #[serde(rename = "anatelRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub anatel_rating: Option<ContentRatingAnatelRating>,
+    /// The video's rating from Malta's Film Age-Classification Board.
+    #[serde(rename = "mccaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mccaa_rating: Option<ContentRatingMccaaRating>,
+    /// The video's Motion Picture Association of America (MPAA) rating.
+    #[serde(rename = "mpaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mpaa_rating: Option<ContentRatingMpaaRating>,
+    /// The video's TV Parental Guidelines (TVPG) rating.
+    #[serde(rename = "tvpgRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tvpg_rating: Option<ContentRatingTvpgRating>,
+    /// The video's rating in Slovakia.
+    #[serde(rename = "skfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub skfilm_rating: Option<ContentRatingSkfilmRating>,
+    /// The rating system for MENA countries, a clone of MPAA. It is needed to prevent titles go live w/o additional QC check, since some of them can be inappropriate for the countries at all. See b/33408548 for more details.
+    #[serde(rename = "menaMpaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mena_mpaa_rating: Option<ContentRatingMenaMpaaRating>,
+    /// The video's Canadian Home Video Rating System (CHVRS) rating.
+    #[serde(rename = "chvrsRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub chvrs_rating: Option<ContentRatingChvrsRating>,
+    /// The video's rating in the Czech Republic.
+    #[serde(rename = "czfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub czfilm_rating: Option<ContentRatingCzfilmRating>,
+    /// Rating system in France - Commission de classification cinematographique
+    #[serde(rename = "cncRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cnc_rating: Option<ContentRatingCncRating>,
+    /// The video's rating from Singapore's Media Development Authority (MDA) and, specifically, it's Board of Film Censors (BFC).
+    #[serde(rename = "mdaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mda_rating: Option<ContentRatingMdaRating>,
+    /// The video's rating from Romania's CONSILIUL NATIONAL AL AUDIOVIZUALULUI (CNA).
+    #[serde(rename = "cnaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cna_rating: Option<ContentRatingCnaRating>,
+    /// Reasons that explain why the video received its DJCQT (Brazil) rating.
+    #[serde(rename = "djctqRatingReasons")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub djctq_rating_reasons: Option<Vec<ContentRatingDjctqRatingReasons>>,
+    /// This property has been deprecated. Use the contentDetails.contentRating.cncRating instead.
+    #[serde(rename = "fmocRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fmoc_rating: Option<ContentRatingFmocRating>,
+    /// A rating that YouTube uses to identify age-restricted content.
+    #[serde(rename = "ytRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub yt_rating: Option<ContentRatingYtRating>,
+    /// The video's rating from the Movie and Television Review and Classification Board (Philippines).
+    #[serde(rename = "mtrcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mtrcb_rating: Option<ContentRatingMtrcbRating>,
+    /// The video's Australian Classification Board (ACB) or Australian Communications and Media Authority (ACMA) rating. ACMA ratings are used to classify children's television programming.
+    #[serde(rename = "acbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub acb_rating: Option<ContentRatingAcbRating>,
+    /// The video's rating from Finland's Kansallinen Audiovisuaalinen Instituutti (National Audiovisual Institute).
+    #[serde(rename = "mekuRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub meku_rating: Option<ContentRatingMekuRating>,
+    /// The video's rating from Indonesia's Lembaga Sensor Film.
+    #[serde(rename = "lsfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub lsf_rating: Option<ContentRatingLsfRating>,
+    /// The video's Irish Film Classification Office (IFCO - Ireland) rating. See the IFCO website for more information.
+    #[serde(rename = "ifcoRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ifco_rating: Option<ContentRatingIfcoRating>,
+    /// Rating system in Turkey - Evaluation and Classification Board of the Ministry of Culture and Tourism
+    #[serde(rename = "ecbmctRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ecbmct_rating: Option<ContentRatingEcbmctRating>,
+    /// The video's rating from the Maldives National Bureau of Classification.
+    #[serde(rename = "nbcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nbc_rating: Option<ContentRatingNbcRating>,
+    /// The video's rating from Italy's Autorità per le Garanzie nelle Comunicazioni (AGCOM).
+    #[serde(rename = "agcomRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub agcom_rating: Option<ContentRatingAgcomRating>,
+    /// The video's rating from the Ministero dei Beni e delle Attività Culturali e del Turismo (Italy).
+    #[serde(rename = "mibacRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mibac_rating: Option<ContentRatingMibacRating>,
+    /// The video's Instituto de la Cinematografía y de las Artes Audiovisuales (ICAA - Spain) rating.
+    #[serde(rename = "icaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub icaa_rating: Option<ContentRatingIcaaRating>,
+    /// The rating system for trailer, DVD, and Ad in the US. See http://movielabs.com/md/ratings/v2.3/html/US_MPAAT_Ratings.html.
+    #[serde(rename = "mpaatRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mpaat_rating: Option<ContentRatingMpaatRating>,
+    /// The video's rating from Medietilsynet, the Norwegian Media Authority.
+    #[serde(rename = "medietilsynetRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub medietilsynet_rating: Option<ContentRatingMedietilsynetRating>,
+    /// The video's rating in Greece.
+    #[serde(rename = "grfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub grfilm_rating: Option<ContentRatingGrfilmRating>,
+    /// The video's Eirin (映倫) rating. Eirin is the Japanese rating system.
+    #[serde(rename = "eirinRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub eirin_rating: Option<ContentRatingEirinRating>,
+    /// The video's rating in Poland.
+    #[serde(rename = "nbcplRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nbcpl_rating: Option<ContentRatingNbcplRating>,
+    /// The video's rating in Peru.
+    #[serde(rename = "pefilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pefilm_rating: Option<ContentRatingPefilmRating>,
+    /// The video's Freiwillige Selbstkontrolle der Filmwirtschaft (FSK - Germany) rating.
+    #[serde(rename = "fskRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fsk_rating: Option<ContentRatingFskRating>,
+    /// The video's Office of Film and Literature Classification (OFLC - New Zealand) rating.
+    #[serde(rename = "oflcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub oflc_rating: Option<ContentRatingOflcRating>,
+    /// The video's rating from Statens medieråd (Sweden's National Media Council).
+    #[serde(rename = "smsaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub smsa_rating: Option<ContentRatingSmsaRating>,
+    /// The video's rating in Egypt.
+    #[serde(rename = "egfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub egfilm_rating: Option<ContentRatingEgfilmRating>,
+    /// The video's rating in Iceland.
+    #[serde(rename = "smaisRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub smais_rating: Option<ContentRatingSmaisRating>,
+    /// The video's rating from Luxembourg's Commission de surveillance de la classification des films (CSCF).
+    #[serde(rename = "cscfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cscf_rating: Option<ContentRatingCscfRating>,
+    /// The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian French-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
+    #[serde(rename = "catvfrRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub catvfr_rating: Option<ContentRatingCatvfrRating>,
+    /// The video's rating from Portugal's Comissão de Classificação de Espect´culos.
+    #[serde(rename = "cceRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cce_rating: Option<ContentRatingCceRating>,
+    /// The video's rating from South Africa's Film and Publication Board.
+    #[serde(rename = "fpbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fpb_rating: Option<ContentRatingFpbRating>,
+    /// The video's rating system for Vietnam - MCST
+    #[serde(rename = "mcstRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mcst_rating: Option<ContentRatingMcstRating>,
+    /// The video's rating from the Danish Film Institute's (Det Danske Filminstitut) Media Council for Children and Young People.
+    #[serde(rename = "mccypRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mccyp_rating: Option<ContentRatingMccypRating>,
+    /// The video's rating from Malaysia's Film Censorship Board.
+    #[serde(rename = "fcbmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fcbm_rating: Option<ContentRatingFcbmRating>,
+    /// The National Media Council ratings system for United Arab Emirates.
+    #[serde(rename = "nmcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nmc_rating: Option<ContentRatingNmcRating>,
+    /// The video's rating in Switzerland.
+    #[serde(rename = "chfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub chfilm_rating: Option<ContentRatingChfilmRating>,
+    /// The video's rating from the Nacionãlais Kino centrs (National Film Centre of Latvia).
+    #[serde(rename = "nkclvRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nkclv_rating: Option<ContentRatingNkclvRating>,
+    /// The video's rating from the Bulgarian National Film Center.
+    #[serde(rename = "nfrcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nfrc_rating: Option<ContentRatingNfrcRating>,
+    /// The video's Departamento de Justiça, Classificação, Qualificação e Títulos (DJCQT - Brazil) rating.
+    #[serde(rename = "djctqRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub djctq_rating: Option<ContentRatingDjctqRating>,
+    /// The video's rating from Thailand's Board of Film and Video Censors.
+    #[serde(rename = "bfvcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bfvc_rating: Option<ContentRatingBfvcRating>,
+    /// The video's INCAA (Instituto Nacional de Cine y Artes Audiovisuales - Argentina) rating.
+    #[serde(rename = "incaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub incaa_rating: Option<ContentRatingIncaaRating>,
+    /// The video's rating from the Commission de Contrôle des Films (Belgium).
+    #[serde(rename = "cicfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cicf_rating: Option<ContentRatingCicfRating>,
+    /// The video's Korea Media Rating Board (영상물등급위원회) rating. The KMRB rates videos in South Korea.
+    #[serde(rename = "kmrbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kmrb_rating: Option<ContentRatingKmrbRating>,
+    /// The video's Consejo de Calificación Cinematográfica (Chile) rating.
+    #[serde(rename = "cccRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ccc_rating: Option<ContentRatingCccRating>,
+    /// The video's rating from France's Conseil supérieur de l’audiovisuel, which rates broadcast content.
+    #[serde(rename = "csaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub csa_rating: Option<ContentRatingCsaRating>,
+    /// The video's rating from the Hungarian Nemzeti Filmiroda, the Rating Committee of the National Office of Film.
+    #[serde(rename = "rcnofRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rcnof_rating: Option<ContentRatingRcnofRating>,
+    /// The video's General Directorate of Radio, Television and Cinematography (Mexico) rating.
+    #[serde(rename = "rtcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rtc_rating: Option<ContentRatingRtcRating>,
 }
 
 /// A `__liveChatBan__` resource represents a ban for a YouTube live chat.
@@ -2303,135 +3649,24 @@
     pub id: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistContentDetails {
-    /// The number of videos in the playlist.
-    #[serde(rename = "itemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub item_count: Option<u32>,
-}
-
-/// Branding properties for images associated with the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ImageSettings {
-    /// Banner image. Tablet size extra high resolution (2560x424).
-    #[serde(rename = "bannerTabletExtraHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_extra_hd_image_url: Option<String>,
-    /// Banner image. Tablet size high resolution (2276x377).
-    #[serde(rename = "bannerTabletHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_hd_image_url: Option<String>,
-    /// Banner image. Mobile size (640x175).
-    #[serde(rename = "bannerMobileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_image_url: Option<String>,
-    /// Banner image. TV size high resolution (1920x1080).
-    #[serde(rename = "bannerTvHighImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_high_image_url: Option<String>,
-    #[serde(rename = "watchIconImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch_icon_image_url: Option<String>,
-    #[serde(rename = "smallBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_url: Option<LocalizedProperty>,
-    /// Banner image. Mobile size high resolution (1280x360).
-    #[serde(rename = "bannerMobileHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_hd_image_url: Option<String>,
-    #[serde(rename = "largeBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_imap_script: Option<LocalizedProperty>,
-    #[serde(rename = "backgroundImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_image_url: Option<LocalizedProperty>,
-    #[serde(rename = "smallBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
-    /// This is generated when a ChannelBanner.Insert request has succeeded for the given channel.
-    #[serde(rename = "bannerExternalUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_external_url: Option<String>,
-    /// Banner image. TV size low resolution (854x480).
-    #[serde(rename = "bannerTvLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_low_image_url: Option<String>,
-    #[serde(rename = "largeBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_url: Option<LocalizedProperty>,
-    /// Banner image. Mobile size high resolution (1440x395).
-    #[serde(rename = "bannerMobileExtraHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_extra_hd_image_url: Option<String>,
-    /// Banner image. Mobile size low resolution (320x88).
-    #[serde(rename = "bannerMobileLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_low_image_url: Option<String>,
-    /// Banner image. Tablet size (1707x283).
-    #[serde(rename = "bannerTabletImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_image_url: Option<String>,
-    /// Banner image. Desktop size (1060x175).
-    #[serde(rename = "bannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_image_url: Option<String>,
-    /// Banner image. TV size extra high resolution (2120x1192).
-    #[serde(rename = "bannerTvImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_image_url: Option<String>,
-    /// Banner image. Mobile size medium/high resolution (960x263).
-    #[serde(rename = "bannerMobileMediumHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_medium_hd_image_url: Option<String>,
-    /// The URL for a 1px by 1px tracking pixel that can be used to collect statistics for views of the channel or video pages.
-    #[serde(rename = "trackingImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tracking_image_url: Option<String>,
-    /// Banner image. TV size medium resolution (1280x720).
-    #[serde(rename = "bannerTvMediumImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_medium_image_url: Option<String>,
-    /// Banner image. Tablet size low resolution (1138x188).
-    #[serde(rename = "bannerTabletLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_low_image_url: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelListResponse {
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoListResponse {
     /// Serialized EventId of the request which produced this response.
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Video>>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
-    /// A list of pricing levels offered by a creator to the fans.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<MembershipsLevel>>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadListResponse {
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThreadListResponse".
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoListResponse".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
@@ -2441,111 +3676,177 @@
     #[serde(rename = "tokenPagination")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub token_pagination: Option<TokenPagination>,
-    /// A list of comment threads that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<CommentThread>>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatUserBannedMessageDetails {
+    /// u64: The duration of the ban. This property is only present if the banType is temporary.
+    #[serde(rename = "banDurationSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_duration_seconds: Option<String>,
+    #[serde(rename = "bannedUserDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banned_user_details: Option<ChannelProfileDetails>,
+    /// The type of ban.
+    #[serde(rename = "banType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_type: Option<LiveChatUserBannedMessageDetailsBanType>,
+}
+
+/// Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and editor suggestions.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSuggestions {
+    /// A list of video editing operations that might improve the video quality or playback experience of the uploaded video.
+    #[serde(rename = "editorSuggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub editor_suggestions: Option<Vec<VideoSuggestionsEditorSuggestions>>,
+    /// A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.
+    #[serde(rename = "processingWarnings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_warnings: Option<Vec<VideoSuggestionsProcessingWarnings>>,
+    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
+    #[serde(rename = "tagSuggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
+    /// A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed.
+    #[serde(rename = "processingErrors")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_errors: Option<Vec<VideoSuggestionsProcessingErrors>>,
+    /// A list of suggestions that may improve YouTube's ability to process the video.
+    #[serde(rename = "processingHints")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_hints: Option<Vec<VideoSuggestionsProcessingHints>>,
+}
+
+/// A *member* resource represents a member for a YouTube channel. A member provides recurring monetary support to a creator and receives special benefits.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Member {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#member".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// Detailed settings of a stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamContentDetails {
-    /// The ingestion URL where the closed captions of this stream are sent.
-    #[serde(rename = "closedCaptionsIngestionUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub closed_captions_ingestion_url: Option<String>,
-    /// Indicates whether the stream is reusable, which means that it can be bound to multiple broadcasts. It is common for broadcasters to reuse the same stream for many different broadcasts if those broadcasts occur at different times. If you set this value to false, then the stream will not be reusable, which means that it can only be bound to one broadcast. Non-reusable streams differ from reusable streams in the following ways: - A non-reusable stream can only be bound to one broadcast. - A non-reusable stream might be deleted by an automated process after the broadcast ends. - The liveStreams.list method does not list non-reusable streams if you call the method and set the mine parameter to true. The only way to use that method to retrieve the resource for a non-reusable stream is to use the id parameter to identify the stream.
-    #[serde(rename = "isReusable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_reusable: Option<bool>,
-}
-
-/// Details about a resource which is being promoted.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsPromotedItem {
-    /// The text description to accompany the promoted item.
-    #[serde(rename = "descriptionText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description_text: Option<String>,
-    /// The custom call-to-action button text. If specified, it will override the default button text for the cta_type.
-    #[serde(rename = "customCtaButtonText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub custom_cta_button_text: Option<String>,
-    /// The type of call-to-action, a message to the user indicating action that can be taken.
-    #[serde(rename = "ctaType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cta_type: Option<ActivityContentDetailsPromotedItemCtaType>,
-    /// The URL the client should fetch to request a promoted item.
-    #[serde(rename = "adTag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ad_tag: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the promoted video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// The URL the client should ping to indicate that the user was shown this promoted item.
-    #[serde(rename = "creativeViewUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creative_view_url: Option<String>,
-    /// The URL the client should ping to indicate that the user clicked through on this promoted item.
-    #[serde(rename = "clickTrackingUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub click_tracking_url: Option<String>,
-    /// The list of impression URLs. The client should ping all of these URLs to indicate that the user was shown this promoted item.
-    #[serde(rename = "impressionUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub impression_url: Option<Vec<String>>,
-    /// The list of forecasting URLs. The client should ping all of these URLs when a promoted item is not available, to indicate that a promoted item could have been shown.
-    #[serde(rename = "forecastingUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub forecasting_url: Option<Vec<String>>,
-    /// The URL the client should direct the user to, if the user chooses to visit the advertiser's website.
-    #[serde(rename = "destinationUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub destination_url: Option<String>,
-}
-
-/// The id of the author's YouTube channel, if any.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentSnippetAuthorChannelId {
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentListResponse {
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// A list of comments that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Comment>>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<MemberSnippet>,
+}
+
+/// Basic details about a video category, such as its localized title.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategorySnippet {
+    #[serde(rename = "assignable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub assignable: Option<bool>,
+    /// The video category's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The YouTube channel that created the video category.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+}
+
+/// A live stream describes a live ingestion point.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStream {
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamStatus>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveStreamContentDetails>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "cdn")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cdn: Option<CdnSettings>,
+    /// The ID that YouTube assigns to uniquely identify the stream.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveStreamSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// Describes original video file properties, including technical details about audio and video streams, but also metadata information like content length, digitization time, or geotagging information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoFileDetails {
+    /// A list of video streams contained in the uploaded video file. Each item in the list contains detailed metadata about a video stream.
+    #[serde(rename = "videoStreams")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_streams: Option<Vec<VideoFileDetailsVideoStream>>,
+    /// A list of audio streams contained in the uploaded video file. Each item in the list contains detailed metadata about an audio stream.
+    #[serde(rename = "audioStreams")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub audio_streams: Option<Vec<VideoFileDetailsAudioStream>>,
+    /// The date and time when the uploaded video file was created. The value is specified in ISO 8601 format. Currently, the following ISO 8601 formats are supported: - Date only: YYYY-MM-DD - Naive time: YYYY-MM-DDTHH:MM:SS - Time with timezone: YYYY-MM-DDTHH:MM:SS+HH:MM
+    #[serde(rename = "creationTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creation_time: Option<String>,
+    /// u64: The length of the uploaded video in milliseconds.
+    #[serde(rename = "durationMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub duration_ms: Option<String>,
+    /// The uploaded video file's container format.
+    #[serde(rename = "container")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub container: Option<String>,
+    /// The uploaded file's type as detected by YouTube's video processing engine. Currently, YouTube only processes video files, but this field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_type: Option<VideoFileDetailsFileType>,
+    /// u64: The uploaded video file's combined (video and audio) bitrate in bits per second.
+    #[serde(rename = "bitrateBps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bitrate_bps: Option<String>,
+    /// u64: The uploaded file's size in bytes. This field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileSize")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_size: Option<String>,
+    /// The uploaded file's name. This field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_name: Option<String>,
+}
+
+/// Player to be used for a video playback.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoPlayer {
+    /// i64:
+    #[serde(rename = "embedHeight")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_height: Option<String>,
+    /// An <iframe> tag that embeds a player that will play the video.
+    #[serde(rename = "embedHtml")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_html: Option<String>,
+    /// i64: The embed width
+    #[serde(rename = "embedWidth")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_width: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -2554,240 +3855,6 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-/// LINT.IfChange Describes an invideo branding.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct InvideoBranding {
-    /// The bytes the uploaded image. Only used in api to youtube communication.
-    #[serde(rename = "imageBytes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_bytes: Option<String>,
-    /// The channel to which this branding links. If not present it defaults to the current channel.
-    #[serde(rename = "targetChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub target_channel_id: Option<String>,
-    #[serde(rename = "timing")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub timing: Option<InvideoTiming>,
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<InvideoPosition>,
-    /// The url of the uploaded image. Only used in apiary to api communication.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-}
-
-/// DEPRECATED Region restriction of the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoContentDetailsRegionRestriction {
-    /// A list of region codes that identify countries where the video is blocked. If this property is present and a country is not listed in its value, then the video is viewable in that country. If this property is present and contains an empty list, the video is viewable in all countries.
-    #[serde(rename = "blocked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub blocked: Option<Vec<String>>,
-    /// A list of region codes that identify countries where the video is viewable. If this property is present and a country is not listed in its value, then the video is blocked from appearing in that country. If this property is present and contains an empty list, the video is blocked in all countries.
-    #[serde(rename = "allowed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub allowed: Option<Vec<String>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRatingListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// A list of ratings that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoRating>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoGetRatingResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategoryListResponse {
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategoryListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of video categories that can be associated with YouTube videos. In this map, the video category ID is the map key, and its value is the corresponding videoCategory resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoCategory>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-}
-
-/// Details about a resource which was added to a channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsChannelItem {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Information specific to a store on a merchandising platform linked to a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelToStoreLinkDetails {
-    /// Name of the store.
-    #[serde(rename = "storeName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub store_name: Option<String>,
-    /// Landing page of the store.
-    #[serde(rename = "storeUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub store_url: Option<String>,
-}
-
-/// A *playlistItem* resource identifies another resource, such as a video, that is included in a playlist. In addition, the playlistItem resource contains details about the included resource that pertain specifically to how that resource is used in that playlist. YouTube uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods. For example, if a user gives a positive rating to a video, you would insert that video into the liked videos playlist for that user's channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItem {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the playlist item.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistItemContentDetails>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistItemSnippet>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<PlaylistItemStatus>,
-}
-
-/// Paging details for lists of resources, including total number of items available and number of resources returned in a single page.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PageInfo {
-    /// The total number of results in the result set.
-    #[serde(rename = "totalResults")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_results: Option<i32>,
-    /// The number of results included in the API response.
-    #[serde(rename = "resultsPerPage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub results_per_page: Option<i32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAgeGating {
-    /// Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content.
-    #[serde(rename = "alcoholContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alcohol_content: Option<bool>,
-    /// Video game rating, if any.
-    #[serde(rename = "videoGameRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_game_rating: Option<VideoAgeGatingVideoGameRating>,
-    /// Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present.
-    #[serde(rename = "restricted")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub restricted: Option<bool>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBanSnippet {
-    /// u64: The duration of a ban, only filled if the ban has type TEMPORARY.
-    #[serde(rename = "banDurationSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_duration_seconds: Option<String>,
-    /// The type of ban.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<LiveChatBanSnippetType>,
-    /// The chat this ban is pertinent to.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    #[serde(rename = "bannedUserDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banned_user_details: Option<ChannelProfileDetails>,
-}
-
-/// A `__superChatEvent__` resource represents a Super Chat purchase on a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEvent {
-    /// The ID that YouTube assigns to uniquely identify the Super Chat event.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#superChatEvent"`.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SuperChatEventSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// DEPRECATED. b/157517979: This part was never populated after it was added. However, it sees non-zero traffic because there is generated client code in the wild that refers to it [1]. We keep this field and do NOT remove it because otherwise V3 would return an error when this part gets requested [2]. [1] https://developers.google.com/resources/api-libraries/documentation/youtube/v3/csharp/latest/classGoogle_1_1Apis_1_1YouTube_1_1v3_1_1Data_1_1VideoProjectDetails.html [2] http://google3/video/youtube/src/python/servers/data_api/common.py?l=1565-1569&rcl=344141677
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProjectDetails {}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activityListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -2795,373 +3862,6 @@
     #[serde(rename = "tokenPagination")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub token_pagination: Option<TokenPagination>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Activity>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LocalizedString {
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-}
-
-/// Basic details about a video category, such as its localized title.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonSnippet {
-    /// The localized label belonging to this abuse report reason.
-    #[serde(rename = "label")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub label: Option<String>,
-    /// The secondary reasons associated with this reason, if any are available. (There might be 0 or more.)
-    #[serde(rename = "secondaryReasons")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub secondary_reasons: Option<Vec<VideoAbuseReportSecondaryReason>>,
-}
-
-/// Video processing progress and completion time estimate.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProcessingDetailsProcessingProgress {
-    /// u64: An estimate of the total number of parts that need to be processed for the video. The number may be updated with more precise estimates while YouTube processes the video.
-    #[serde(rename = "partsTotal")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parts_total: Option<String>,
-    /// u64: An estimate of the amount of time, in millseconds, that YouTube needs to finish processing the video.
-    #[serde(rename = "timeLeftMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_left_ms: Option<String>,
-    /// u64: The number of parts of the video that YouTube has already processed. You can estimate the percentage of the video that YouTube has already processed by calculating: 100 * parts_processed / parts_total Note that since the estimated number of parts could increase without a corresponding increase in the number of parts that have already been processed, it is possible that the calculated progress could periodically decrease while YouTube processes a video.
-    #[serde(rename = "partsProcessed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parts_processed: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageRetractedDetails {
-    #[serde(rename = "retractedMessageId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub retracted_message_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageDeletedDetails {
-    #[serde(rename = "deletedMessageId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub deleted_message_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListResponse {
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    #[serde(rename = "regionCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_code: Option<String>,
-    /// Pagination information for token pagination.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<SearchResult>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDetails {
-    /// Ids of all levels that the user has access to. This includes the currently active level and all other levels that are included because of a higher purchase.
-    #[serde(rename = "accessibleLevels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub accessible_levels: Option<Vec<String>>,
-    /// Data about memberships duration on particular pricing levels.
-    #[serde(rename = "membershipsDurationAtLevels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_duration_at_levels: Option<Vec<MembershipsDurationAtLevel>>,
-    /// Display name for the highest level that the user has access to at the moment.
-    #[serde(rename = "highestAccessibleLevelDisplayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub highest_accessible_level_display_name: Option<String>,
-    #[serde(rename = "membershipsDuration")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_duration: Option<MembershipsDuration>,
-    /// Id of the highest level that the user has access to at the moment.
-    #[serde(rename = "highestAccessibleLevel")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub highest_accessible_level: Option<String>,
-}
-
-/// Geographical coordinates of a point, in WGS84.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct GeoPoint {
-    /// Altitude above the reference ellipsoid, in meters.
-    #[serde(rename = "altitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub altitude: Option<f64>,
-    /// Latitude in degrees.
-    #[serde(rename = "latitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub latitude: Option<f64>,
-    /// Longitude in degrees.
-    #[serde(rename = "longitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub longitude: Option<f64>,
-}
-
-/// Basic details about rating of a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRating {
-    /// The ID that YouTube uses to uniquely identify the video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// Rating of a video.
-    #[serde(rename = "rating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rating: Option<VideoRatingRating>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Entity {
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "typeId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelSnippet {
-    #[serde(rename = "levelDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub level_details: Option<LevelDetails>,
-    /// The id of the channel that's offering channel memberships.
-    #[serde(rename = "creatorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creator_channel_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguageListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguageListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of supported i18n languages. In this map, the i18n language ID is the map key, and its value is the corresponding i18nLanguage resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<I18nLanguage>>,
-}
-
-/// Information about the uploaded video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsUpload {
-    /// The ID that YouTube uses to uniquely identify the uploaded video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-}
-
-/// Freebase topic information related to the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoTopicDetails {
-    /// A list of Wikipedia URLs that provide a high-level description of the video's content.
-    #[serde(rename = "topicCategories")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_categories: Option<Vec<String>>,
-    /// Similar to topic_id, except that these topics are merely relevant to the video. These are topics that may be mentioned in, or appear in the video. You can retrieve information about each topic using Freebase Topic API.
-    #[serde(rename = "relevantTopicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub relevant_topic_ids: Option<Vec<String>>,
-    /// A list of Freebase topic IDs that are centrally associated with the video. These are topics that are centrally featured in the video, and it can be said that the video is mainly about each of these. You can retrieve information about each topic using the < a href="http://wiki.freebase.com/wiki/Topic_API">Freebase Topic API.
-    #[serde(rename = "topicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_ids: Option<Vec<String>>,
-}
-
-/// A *third party account link* resource represents a link between a YouTube account or a channel and an account on a third-party service.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLink {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thirdPartyLink".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<ThirdPartyLinkStatus>,
-    /// Etag of this resource
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The linking_token identifies a YouTube account and channel with which the third party account is linked.
-    #[serde(rename = "linkingToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub linking_token: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ThirdPartyLinkSnippet>,
-}
-
-/// Basic details about a comment, such as its author and text.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentSnippet {
-    /// Link to the author's YouTube channel, if any.
-    #[serde(rename = "authorChannelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_url: Option<String>,
-    /// The unique id of the parent comment, only set for replies.
-    #[serde(rename = "parentId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parent_id: Option<String>,
-    /// The comment's original raw text as initially posted or last updated. The original text will only be returned if it is accessible to the viewer, which is only guaranteed if the viewer is the comment's author.
-    #[serde(rename = "textOriginal")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_original: Option<String>,
-    /// The comment's moderation status. Will not be set if the comments were requested through the id filter.
-    #[serde(rename = "moderationStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderation_status: Option<CommentSnippetModerationStatus>,
-    /// The name of the user who posted the comment.
-    #[serde(rename = "authorDisplayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_display_name: Option<String>,
-    /// The URL for the avatar of the user who posted the comment.
-    #[serde(rename = "authorProfileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_profile_image_url: Option<String>,
-    /// DateTime: The date and time when the comment was last updated.
-    #[serde(rename = "updatedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated_at: Option<DateTime<Utc>>,
-    /// Whether the current viewer can rate this comment.
-    #[serde(rename = "canRate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub can_rate: Option<bool>,
-    /// The total number of likes this comment has received.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<u32>,
-    #[serde(rename = "authorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_id: Option<CommentSnippetAuthorChannelId>,
-    /// The rating the viewer has given to this comment. For the time being this will never return RATE_TYPE_DISLIKE and instead return RATE_TYPE_NONE. This may change in the future.
-    #[serde(rename = "viewerRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub viewer_rating: Option<CommentSnippetViewerRating>,
-    /// The ID of the video the comment refers to, if any.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// DateTime: The date and time when the comment was originally published.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The comment's text. The format is either plain text or HTML dependent on what has been requested. Even the plain text representation may differ from the text originally posted in that it may replace video links with video titles etc.
-    #[serde(rename = "textDisplay")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_display: Option<String>,
-    /// The id of the corresponding YouTube channel. In case of a channel comment this is the channel the comment refers to. In case of a video comment it's the video's channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MemberListResponse {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of members that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Member>>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#memberListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -3169,177 +3869,447 @@
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
-}
-
-/// Rights management policy for YouTube resources.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AccessPolicy {
-    /// A list of region codes that identify countries where the default policy do not apply.
-    #[serde(rename = "exception")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub exception: Option<Vec<String>>,
-    /// The value of allowed indicates whether the access to the policy is allowed or denied by default.
-    #[serde(rename = "allowed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub allowed: Option<bool>,
-}
-
-/// An *activity* resource contains information about an action that a particular channel, or user, has taken on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of action, the channel associated with the action, and the resource(s) associated with the action, such as the video that was rated or uploaded.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Activity {
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ActivityContentDetails>,
-    /// Etag of this resource
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the activity.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activity".
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcastListResponse".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ActivitySnippet>,
-}
-
-/// Basic details about a search result, including title, description and thumbnails of the item referenced by the search result.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchResultSnippet {
-    /// The title of the channel that published the resource that the search result identifies.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The title of the search result.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
+    /// A list of broadcasts that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveBroadcast>>,
+}
+
+/// Statistics about a channel: number of subscribers, number of videos in the channel, etc.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelStatistics {
+    /// u64: The number of subscribers that the channel has.
+    #[serde(rename = "subscriberCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscriber_count: Option<String>,
+    /// u64: The number of comments for the channel.
+    #[serde(rename = "commentCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment_count: Option<String>,
+    /// u64: The number of times the channel has been viewed.
+    #[serde(rename = "viewCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub view_count: Option<String>,
+    /// Whether or not the number of subscribers is shown for this user.
+    #[serde(rename = "hiddenSubscriberCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hidden_subscriber_count: Option<bool>,
+    /// u64: The number of videos uploaded to the channel.
+    #[serde(rename = "videoCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_count: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistContentDetails {
+    /// The number of videos in the playlist.
+    #[serde(rename = "itemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub item_count: Option<u32>,
+}
+
+/// Basic details about an activity, including title, description, thumbnails, activity type and group. Next ID: 12
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivitySnippet {
     #[serde(rename = "thumbnails")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub thumbnails: Option<ThumbnailDetails>,
-    /// DateTime: The creation date and time of the resource that the search result identifies.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The value that YouTube uses to uniquely identify the channel that published the resource that the search result identifies.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// A description of the search result.
+    /// The title of the resource primarily associated with the activity.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// Channel title for the channel responsible for this activity
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The description of the resource primarily associated with the activity. @mutable youtube.activities.insert
     #[serde(rename = "description")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub description: Option<String>,
-    /// It indicates if the resource (video or channel) has upcoming/active live broadcast content. Or it's "none" if there is not any upcoming/active live broadcasts.
-    #[serde(rename = "liveBroadcastContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_content: Option<SearchResultSnippetLiveBroadcastContent>,
-}
-
-/// A *caption* resource represents a YouTube caption track. A caption track is associated with exactly one YouTube video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Caption {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#caption".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
+    /// The type of activity that the resource describes.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<ActivitySnippetType>,
+    /// The ID that YouTube uses to uniquely identify the channel associated with the activity.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// DateTime: The date and time that the video was uploaded.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// The group ID associated with the activity. A group ID identifies user events that are associated with the same user and resource. For example, if a user rates a video and marks the same video as a favorite, the entries for those events would have the same group ID in the user's activity feed. In your user interface, you can avoid repetition by grouping events with the same groupId value.
+    #[serde(rename = "groupId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub group_id: Option<String>,
+}
+
+/// Details about a resource which was added to a channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsChannelItem {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// Live broadcast state.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastStatus {
+    /// The broadcast's status. The status can be updated using the API's liveBroadcasts.transition method.
+    #[serde(rename = "lifeCycleStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub life_cycle_status: Option<LiveBroadcastStatusLifeCycleStatus>,
+    /// The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<LiveBroadcastStatusPrivacyStatus>,
+    /// The broadcast's recording status.
+    #[serde(rename = "recordingStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_status: Option<LiveBroadcastStatusRecordingStatus>,
+    /// Priority of the live broadcast event (internal state).
+    #[serde(rename = "liveBroadcastPriority")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_priority: Option<LiveBroadcastStatusLiveBroadcastPriority>,
+    /// Whether the broadcast is made for kids or not, decided by YouTube instead of the creator. This field is read only.
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// This field will be set to True if the creator declares the broadcast to be kids only: go/live-cw-work.
+    #[serde(rename = "selfDeclaredMadeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_declared_made_for_kids: Option<bool>,
+}
+
+/// Detailed settings of a stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamContentDetails {
+    /// Indicates whether the stream is reusable, which means that it can be bound to multiple broadcasts. It is common for broadcasters to reuse the same stream for many different broadcasts if those broadcasts occur at different times. If you set this value to false, then the stream will not be reusable, which means that it can only be bound to one broadcast. Non-reusable streams differ from reusable streams in the following ways: - A non-reusable stream can only be bound to one broadcast. - A non-reusable stream might be deleted by an automated process after the broadcast ends. - The liveStreams.list method does not list non-reusable streams if you call the method and set the mine parameter to true. The only way to use that method to retrieve the resource for a non-reusable stream is to use the id parameter to identify the stream.
+    #[serde(rename = "isReusable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_reusable: Option<bool>,
+    /// The ingestion URL where the closed captions of this stream are sent.
+    #[serde(rename = "closedCaptionsIngestionUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub closed_captions_ingestion_url: Option<String>,
+}
+
+/// Details about a channel bulletin post.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsBulletin {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// Information about a video that was marked as a favorite video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsFavorite {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatSuperChatDetails {
+    /// The comment added by the user to this Super Chat event.
+    #[serde(rename = "userComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_comment: Option<String>,
+    /// A rendered string that displays the fund amount and currency to the user.
+    #[serde(rename = "amountDisplayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_display_string: Option<String>,
+    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
+    #[serde(rename = "tier")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tier: Option<u32>,
+    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
+    #[serde(rename = "amountMicros")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_micros: Option<String>,
+    /// The currency in which the purchase was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseReport {
+    #[serde(rename = "relatedEntities")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub related_entities: Option<Vec<RelatedEntity>>,
+    #[serde(rename = "abuseTypes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub abuse_types: Option<Vec<AbuseType>>,
+    #[serde(rename = "subject")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subject: Option<Entity>,
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+}
+
+/// Localized versions of certain video properties (e.g. title).
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoLocalization {
+    /// Localized version of the video's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// Localized version of the video's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// DEPRECATED. b/157517979: This part was never populated after it was added. However, it sees non-zero traffic because there is generated client code in the wild that refers to it [1]. We keep this field and do NOT remove it because otherwise V3 would return an error when this part gets requested [2]. [1] https://developers.google.com/resources/api-libraries/documentation/youtube/v3/csharp/latest/classGoogle_1_1Apis_1_1YouTube_1_1v3_1_1Data_1_1VideoProjectDetails.html [2] http://google3/video/youtube/src/python/servers/data_api/common.py?l=1565-1569&rcl=344141677
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProjectDetails {}
+
+/// Describes a temporal position of a visual widget inside a video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoTiming {
+    /// u64: Defines the time at which the promotion will appear. Depending on the value of type the value of the offsetMs field will represent a time offset from the start or from the end of the video, expressed in milliseconds.
+    #[serde(rename = "offsetMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub offset_ms: Option<String>,
+    /// Describes a timing type. If the value is offsetFromStart, then the offsetMs field represents an offset from the start of the video. If the value is offsetFromEnd, then the offsetMs field represents an offset from the end of the video.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<InvideoTimingType>,
+    /// u64: Defines the duration in milliseconds for which the promotion should be displayed. If missing, the client should use the default.
+    #[serde(rename = "durationMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub duration_ms: Option<String>,
+}
+
+/// A thumbnail is an image representing a YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Thumbnail {
+    /// (Optional) Height of the thumbnail image.
+    #[serde(rename = "height")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub height: Option<u32>,
+    /// (Optional) Width of the thumbnail image.
+    #[serde(rename = "width")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub width: Option<u32>,
+    /// The thumbnail image's URL.
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionListResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the caption track.
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscriptionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// A list of subscriptions that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Subscription>>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+}
+
+/// A *liveBroadcast* resource represents an event that will be streamed, via live video, on YouTube.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcast {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<LiveBroadcastStatistics>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveBroadcastStatus>,
+    /// The ID that YouTube assigns to uniquely identify the broadcast.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveBroadcastContentDetails>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CaptionSnippet>,
-}
-
-/// The auditDetails object encapsulates channel data that is relevant for YouTube Partners during the audit process.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelAuditDetails {
-    /// Whether or not the channel has any copyright strikes.
-    #[serde(rename = "copyrightStrikesGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub copyright_strikes_good_standing: Option<bool>,
-    /// Whether or not the channel respects the community guidelines.
-    #[serde(rename = "communityGuidelinesGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub community_guidelines_good_standing: Option<bool>,
-    /// Whether or not the channel has any unresolved claims.
-    #[serde(rename = "contentIdClaimsGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_id_claims_good_standing: Option<bool>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageSnippet {
-    /// The type of message, this will always be present, it determines the contents of the message as well as which fields will be present.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<LiveChatMessageSnippetType>,
-    /// The ID of the user that authored this message, this field is not always filled. textMessageEvent - the user that wrote the message fanFundingEvent - the user that funded the broadcast newSponsorEvent - the user that just became a sponsor messageDeletedEvent - the moderator that took the action messageRetractedEvent - the author that retracted their message userBannedEvent - the moderator that took the action superChatEvent - the user that made the purchase
-    #[serde(rename = "authorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_id: Option<String>,
-    #[serde(rename = "superChatDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_chat_details: Option<LiveChatSuperChatDetails>,
-    #[serde(rename = "superStickerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_details: Option<LiveChatSuperStickerDetails>,
-    #[serde(rename = "messageDeletedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_deleted_details: Option<LiveChatMessageDeletedDetails>,
-    /// Whether the message has display content that should be displayed to users.
-    #[serde(rename = "hasDisplayContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub has_display_content: Option<bool>,
-    /// Contains a string that can be displayed to the user. If this field is not present the message is silent, at the moment only messages of type TOMBSTONE and CHAT_ENDED_EVENT are silent.
-    #[serde(rename = "displayMessage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_message: Option<String>,
+    pub snippet: Option<LiveBroadcastSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcast".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguageListResponse {
+    /// A list of supported i18n languages. In this map, the i18n language ID is the map key, and its value is the corresponding i18nLanguage resource.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<I18nLanguage>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguageListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// Information about a resource that received a comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsComment {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// JSON template for the status part of a channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelStatus {
+    #[serde(rename = "selfDeclaredMadeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_declared_made_for_kids: Option<bool>,
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// Privacy status of the channel.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<ChannelStatusPrivacyStatus>,
+    /// If true, then the user is linked to either a YouTube username or G+ account. Otherwise, the user doesn't have a public YouTube identity.
+    #[serde(rename = "isLinked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_linked: Option<bool>,
+    /// The long uploads status of this channel. See https://support.google.com/youtube/answer/71673 for more information.
+    #[serde(rename = "longUploadsStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub long_uploads_status: Option<ChannelStatusLongUploadsStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorSnippet {
+    #[serde(rename = "moderatorDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderator_details: Option<ChannelProfileDetails>,
+    /// The ID of the live chat this moderator can act on.
     #[serde(rename = "liveChatId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub live_chat_id: Option<String>,
-    #[serde(rename = "fanFundingEventDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fan_funding_event_details: Option<LiveChatFanFundingEventDetails>,
-    #[serde(rename = "messageRetractedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_retracted_details: Option<LiveChatMessageRetractedDetails>,
-    #[serde(rename = "textMessageDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_message_details: Option<LiveChatTextMessageDetails>,
-    /// DateTime: The date and time when the message was orignally published.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    #[serde(rename = "userBannedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_banned_details: Option<LiveChatUserBannedMessageDetails>,
-}
-
-///
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct LocalizedProperty {
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<LanguageTag>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<Vec<LocalizedString>>,
     #[serde(rename = "default")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub default: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<Vec<LocalizedString>>,
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<LanguageTag>,
-}
-
-///
+}
+
+/// Information about a channel that a user subscribed to.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsSubscription {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// A *subscription* resource contains information about a YouTube user subscription. A subscription notifies a user when new videos are added to a channel or when another user takes one of several actions on YouTube, such as uploading a video, rating a video, or commenting on a video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Subscription {
+    /// The ID that YouTube uses to uniquely identify the subscription.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "subscriberSnippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscriber_snippet: Option<SubscriptionSubscriberSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscription".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<SubscriptionContentDetails>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<SubscriptionSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// A resource id is a generic reference that points to another YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ResourceId {
+    /// The type of the API resource.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a playlist. This property is only present if the resourceId.kind value is youtube#playlist.
+    #[serde(rename = "playlistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel. This property is only present if the resourceId.kind value is youtube#channel.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a video. This property is only present if the resourceId.kind value is youtube#video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct VideoAbuseReportSecondaryReason {
     /// The localized label for this abuse report secondary reason.
@@ -3352,1169 +4322,1087 @@
     pub id: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistPlayer {
-    /// An <iframe> tag that embeds a player that will play the playlist.
-    #[serde(rename = "embedHtml")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_html: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageListResponse {
-    /// The amount of time the client should wait before polling again.
-    #[serde(rename = "pollingIntervalMillis")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub polling_interval_millis: Option<u32>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessageListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatMessage>>,
-    /// DateTime: The date and time when the underlying stream went offline.
-    #[serde(rename = "offlineAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub offline_at: Option<DateTime<Utc>>,
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSection {
-    /// The ID that YouTube uses to uniquely identify the channel section.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "targeting")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub targeting: Option<ChannelSectionTargeting>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSection".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ChannelSectionContentDetails>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelSectionLocalization>>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ChannelSectionSnippet>,
-}
-
-/// Describes information necessary for ingesting an RTMP or an HTTP stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct IngestionInfo {
-    /// The backup ingestion URL that you should use to stream video to YouTube. You have the option of simultaneously streaming the content that you are sending to the ingestionAddress to this URL.
-    #[serde(rename = "backupIngestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub backup_ingestion_address: Option<String>,
-    /// This ingestion url may be used instead of backupIngestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
-    #[serde(rename = "rtmpsBackupIngestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rtmps_backup_ingestion_address: Option<String>,
-    /// The HTTP or RTMP stream name that YouTube assigns to the video stream.
-    #[serde(rename = "streamName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stream_name: Option<String>,
-    /// The primary ingestion URL that you should use to stream video to YouTube. You must stream video to this URL. Depending on which application or tool you use to encode your video stream, you may need to enter the stream URL and stream name separately or you may need to concatenate them in the following format: *STREAM_URL/STREAM_NAME*
-    #[serde(rename = "ingestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_address: Option<String>,
-    /// This ingestion url may be used instead of ingestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
-    #[serde(rename = "rtmpsIngestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rtmps_ingestion_address: Option<String>,
-}
-
-/// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelConversionPing {
-    /// The url (without the schema) that the player shall send the ping to. It's at caller's descretion to decide which schema to use (http vs https) Example of a returned url: //googleads.g.doubleclick.net/pagead/ viewthroughconversion/962985656/?data=path%3DtHe_path%3Btype%3D cview%3Butuid%3DGISQtTNGYqaYl4sKxoVvKA&labe=default The caller must append biscotti authentication (ms param in case of mobile, for example) to this ping.
-    #[serde(rename = "conversionUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conversion_url: Option<String>,
-    /// Defines the context of the ping.
-    #[serde(rename = "context")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub context: Option<ChannelConversionPingContext>,
-}
-
-/// Information about a channel that a user subscribed to.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSubscription {
+/// Details about a social network post.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsSocial {
+    /// The name of the social network.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<ActivityContentDetailsSocialType>,
     #[serde(rename = "resourceId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub resource_id: Option<ResourceId>,
-}
-
-/// A *videoCategory* resource identifies a category that has been or could be associated with uploaded videos.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategory {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoCategorySnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategory".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the video category.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// Details about monetization of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoMonetizationDetails {
-    #[serde(rename = "access")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub access: Option<AccessPolicy>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistStatus {
-    /// The playlist's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<PlaylistStatusPrivacyStatus>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThumbnailSetResponse {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of thumbnails.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<ThumbnailDetails>>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thumbnailSetResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-}
-
-/// Information about a video stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetailsVideoStream {
-    /// The video content's display aspect ratio, which specifies the aspect ratio in which the video should be displayed.
-    #[serde(rename = "aspectRatio")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub aspect_ratio: Option<f64>,
-    /// The encoded video content's height in pixels.
-    #[serde(rename = "heightPixels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height_pixels: Option<u32>,
-    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
-    #[serde(rename = "vendor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub vendor: Option<String>,
-    /// u64: The video stream's bitrate, in bits per second.
-    #[serde(rename = "bitrateBps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bitrate_bps: Option<String>,
-    /// The video codec that the stream uses.
-    #[serde(rename = "codec")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub codec: Option<String>,
-    /// The video stream's frame rate, in frames per second.
-    #[serde(rename = "frameRateFps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub frame_rate_fps: Option<f64>,
-    /// The encoded video content's width in pixels. You can calculate the video's encoding aspect ratio as width_pixels / height_pixels.
-    #[serde(rename = "widthPixels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub width_pixels: Option<u32>,
-    /// The amount that YouTube needs to rotate the original source content to properly display the video.
-    #[serde(rename = "rotation")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rotation: Option<VideoFileDetailsVideoStreamRotation>,
-}
-
-/// A *liveChatMessage* resource represents a chat message in a YouTube Live Chat.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessage {
-    /// The ID that YouTube assigns to uniquely identify the message.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveChatMessageSnippet>,
-    #[serde(rename = "authorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_details: Option<LiveChatMessageAuthorDetails>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessage".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// ChannelSection localization setting
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionLocalization {
-    /// The localized strings for channel section's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseReport {
-    #[serde(rename = "abuseTypes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub abuse_types: Option<Vec<AbuseType>>,
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "relatedEntities")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub related_entities: Option<Vec<RelatedEntity>>,
-    #[serde(rename = "subject")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subject: Option<Entity>,
-}
-
-/// Details about the content of an activity: the video that was shared, the channel that was subscribed to, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetails {
-    #[serde(rename = "recommendation")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recommendation: Option<ActivityContentDetailsRecommendation>,
-    #[serde(rename = "upload")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload: Option<ActivityContentDetailsUpload>,
-    #[serde(rename = "bulletin")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bulletin: Option<ActivityContentDetailsBulletin>,
-    #[serde(rename = "playlistItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_item: Option<ActivityContentDetailsPlaylistItem>,
-    #[serde(rename = "like")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like: Option<ActivityContentDetailsLike>,
-    #[serde(rename = "social")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub social: Option<ActivityContentDetailsSocial>,
-    #[serde(rename = "promotedItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub promoted_item: Option<ActivityContentDetailsPromotedItem>,
-    #[serde(rename = "favorite")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub favorite: Option<ActivityContentDetailsFavorite>,
-    #[serde(rename = "subscription")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscription: Option<ActivityContentDetailsSubscription>,
-    #[serde(rename = "channelItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_item: Option<ActivityContentDetailsChannelItem>,
-    #[serde(rename = "comment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment: Option<ActivityContentDetailsComment>,
-}
-
-/// Internal representation of thumbnails for a YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThumbnailDetails {
-    #[serde(rename = "maxres")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub maxres: Option<Thumbnail>,
-    #[serde(rename = "default")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default: Option<Thumbnail>,
-    #[serde(rename = "standard")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub standard: Option<Thumbnail>,
-    #[serde(rename = "medium")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub medium: Option<Thumbnail>,
-    #[serde(rename = "high")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub high: Option<Thumbnail>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails. Basic details of a YouTube Playlist item provided by the author. Next ID: 15
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemSnippet {
-    /// The item's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The item's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// Channel title for the channel this video belongs to.
-    #[serde(rename = "videoOwnerChannelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_owner_channel_title: Option<String>,
-    /// The ID that YouTube uses to uniquely identify thGe playlist that the playlist item is in.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the user that added the item to the playlist.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// Channel id for the channel this video belongs to.
-    #[serde(rename = "videoOwnerChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_owner_channel_id: Option<String>,
-    /// The order in which the item appears in the playlist. The value uses a zero-based index, so the first item has a position of 0, the second item has a position of 1, and so forth.
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<u32>,
-    /// Channel title for the channel that the playlist item belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// DateTime: The date and time that the item was added to the playlist.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatFanFundingEventDetails {
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The currency in which the fund was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-    /// The comment added by the user to this fan funding event.
-    #[serde(rename = "userComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_comment: Option<String>,
-    /// u64: The amount of the fund.
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-}
-
-/// A *member* resource represents a member for a YouTube channel. A member provides recurring monetary support to a creator and receives special benefits.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Member {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#member".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<MemberSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// Recording information associated with the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRecordingDetails {
-    #[serde(rename = "location")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub location: Option<GeoPoint>,
-    /// The text description of the location where the video was recorded.
-    #[serde(rename = "locationDescription")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub location_description: Option<String>,
-    /// DateTime: The date and time when the video was recorded.
-    #[serde(rename = "recordingDate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_date: Option<DateTime<Utc>>,
-}
-
-/// Basic details about a subscription, including title, description and thumbnails of the subscribed item.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionSnippet {
-    /// The subscription's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The subscription's details.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// Channel title for the channel that the subscription belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// DateTime: The date and time that the subscription was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The ID that YouTube uses to uniquely identify the subscriber's channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MemberSnippet {
-    /// The id of the channel that's offering memberships.
-    #[serde(rename = "creatorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creator_channel_id: Option<String>,
-    #[serde(rename = "memberDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_details: Option<ChannelProfileDetails>,
-    #[serde(rename = "membershipsDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_details: Option<MembershipsDetails>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct RelatedEntity {
-    #[serde(rename = "entity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub entity: Option<Entity>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseType {
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// Branding properties for the channel view.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSettings {
-    /// Which content tab users should see when viewing the channel.
-    #[serde(rename = "defaultTab")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_tab: Option<String>,
-    /// The ID for a Google Analytics account to track and measure traffic to the channels.
-    #[serde(rename = "trackingAnalyticsAccountId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tracking_analytics_account_id: Option<String>,
-    /// Title for the featured channels tab.
-    #[serde(rename = "featuredChannelsTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_channels_title: Option<String>,
-    /// Lists keywords associated with the channel, comma-separated.
-    #[serde(rename = "keywords")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub keywords: Option<String>,
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    /// The country of the channel.
-    #[serde(rename = "country")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country: Option<String>,
-    /// A prominent color that can be rendered on this channel page.
-    #[serde(rename = "profileColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_color: Option<String>,
-    /// Specifies the channel title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Whether the tab to browse the videos should be displayed.
-    #[serde(rename = "showBrowseView")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub show_browse_view: Option<bool>,
-    /// The trailer of the channel, for users that are not subscribers.
-    #[serde(rename = "unsubscribedTrailer")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub unsubscribed_trailer: Option<String>,
-    /// Whether related channels should be proposed.
-    #[serde(rename = "showRelatedChannels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub show_related_channels: Option<bool>,
-    /// Specifies the channel description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// Whether user-submitted comments left on the channel page need to be approved by the channel owner to be publicly visible.
-    #[serde(rename = "moderateComments")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderate_comments: Option<bool>,
-    /// The list of featured channels.
-    #[serde(rename = "featuredChannelsUrls")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_channels_urls: Option<Vec<String>>,
-}
-
-/// A *i18nRegion* resource identifies a region where YouTube is available.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegion {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<I18nRegionSnippet>,
+    /// The URL of the social network post.
+    #[serde(rename = "referenceUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reference_url: Option<String>,
+    /// The author of the social network post.
+    #[serde(rename = "author")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author: Option<String>,
+    /// An image of the post's author.
+    #[serde(rename = "imageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_url: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the i18n region.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegion".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-/// Channel localization setting
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelLocalization {
-    /// The localized strings for channel's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The localized strings for channel's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LevelDetails {
-    /// The name that should be used when referring to this level.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItemListResponse". Etag of this resource.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of playlist items that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<PlaylistItem>>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// Information about a resource that received a comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsComment {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Information about an audio stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetailsAudioStream {
-    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
-    #[serde(rename = "vendor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub vendor: Option<String>,
-    /// The number of audio channels that the stream contains.
-    #[serde(rename = "channelCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_count: Option<u32>,
-    /// The audio codec that the stream uses.
-    #[serde(rename = "codec")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub codec: Option<String>,
-    /// u64: The audio stream's bitrate, in bits per second.
-    #[serde(rename = "bitrateBps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bitrate_bps: Option<String>,
-}
-
-/// Basic details about a comment thread.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadSnippet {
-    /// The total number of replies (not including the top level comment).
-    #[serde(rename = "totalReplyCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_reply_count: Option<u32>,
-    #[serde(rename = "topLevelComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub top_level_comment: Option<Comment>,
-    /// Whether the current viewer of the thread can reply to it. This is viewer specific - other viewers may see a different value for this field.
-    #[serde(rename = "canReply")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub can_reply: Option<bool>,
-    /// The YouTube channel the comments in the thread refer to or the channel with the video the comments refer to. If video_id isn't set the comments refer to the channel itself.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The ID of the video the comments refer to, if any. No video_id implies a channel discussion comment.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// Whether the thread (and therefore all its comments) is visible to all YouTube users.
-    #[serde(rename = "isPublic")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_public: Option<bool>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperChatDetails {
-    /// The currency in which the purchase was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
-    #[serde(rename = "tier")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tier: Option<u32>,
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The comment added by the user to this Super Chat event.
-    #[serde(rename = "userComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_comment: Option<String>,
-}
-
-/// A *liveBroadcast* resource represents an event that will be streamed, via live video, on YouTube.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcast {
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveBroadcastContentDetails>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveBroadcastStatus>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<LiveBroadcastStatistics>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcast".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the broadcast.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveBroadcastSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperStickerMetadata {
-    /// Internationalized alt text that describes the sticker image and any animation associated with it.
-    #[serde(rename = "altText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt_text: Option<String>,
-    /// Specifies the localization language in which the alt text is returned.
-    #[serde(rename = "altTextLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt_text_language: Option<String>,
-    /// Unique identifier of the Super Sticker. This is a shorter form of the alt_text that includes pack name and a recognizable characteristic of the sticker.
-    #[serde(rename = "stickerId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sticker_id: Option<String>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistSnippet {
-    /// The channel title of the channel that the video belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The language of the playlist's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    /// Keyword tags associated with the playlist.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<String>>,
-    /// DateTime: The date and time that the playlist was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The playlist's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<PlaylistLocalization>,
-    /// The ID that YouTube uses to uniquely identify the channel that published the playlist.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The playlist's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Note: if the playlist has a custom thumbnail, this field will not be populated. The video id selected by the user that will be used as the thumbnail of this playlist. This field defaults to the first publicly viewable video in the playlist, if: 1. The user has never selected a video to be the thumbnail of the playlist. 2. The user selects a video to be the thumbnail, and then removes that video from the playlist. 3. The user selects a non-owned video to be the thumbnail, but that video becomes private, or gets deleted.
-    #[serde(rename = "thumbnailVideoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnail_video_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamSnippet {
-    /// The ID that YouTube uses to uniquely identify the channel that is transmitting the stream.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The stream's description. The value cannot be longer than 10000 characters.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "isDefaultStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_default_stream: Option<bool>,
-    /// The stream's title. The value must be between 1 and 128 characters long.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// DateTime: The date and time that the stream was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-}
-
-/// A *comment thread* represents information that applies to a top level comment and all its replies. It can also include the top level comment itself and some of the replies.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThread {
-    /// The ID that YouTube uses to uniquely identify the comment thread.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CommentThreadSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThread".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "replies")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub replies: Option<CommentThreadReplies>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReasonListResponse"`.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
     /// Serialized EventId of the request which produced this response.
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    /// A list of valid abuse reasons that are used with `video.ReportAbuse`.
+    /// A list of ChannelSections that match the request criteria.
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoAbuseReportReason>>,
-    /// The `visitorId` identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// Brief description of the live stream status.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamStatus {
-    #[serde(rename = "healthStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub health_status: Option<LiveStreamHealthStatus>,
-    #[serde(rename = "streamStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stream_status: Option<LiveStreamStatusStreamStatus>,
-}
-
-/// A *membershipsLevel* resource represents an offer made by YouTube creators for their fans. Users can become members of the channel by joining one of the available levels. They will provide recurring monetary support and receives special benefits.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevel {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the memberships level.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<MembershipsLevelSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStreamListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
+    pub items: Option<Vec<ChannelSection>>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// A list of live streams that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveStream>>,
-}
-
-/// A resource id is a generic reference that points to another YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ResourceId {
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel. This property is only present if the resourceId.kind value is youtube#channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The type of the API resource.
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSectionListResponse".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a video. This property is only present if the resourceId.kind value is youtube#video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a playlist. This property is only present if the resourceId.kind value is youtube#playlist.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-}
-
-/// Basic details about a video category, such as its localized title. Next Id: 17
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoStatus {
-    /// This value indicates if the extended video statistics on the watch page can be viewed by everyone. Note that the view count, likes, etc will still be visible if this is disabled. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "publicStatsViewable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub public_stats_viewable: Option<bool>,
-    /// The video's license. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "license")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub license: Option<VideoStatusLicense>,
-    /// This value explains why a video failed to upload. This property is only present if the uploadStatus property indicates that the upload failed.
-    #[serde(rename = "failureReason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub failure_reason: Option<VideoStatusFailureReason>,
-    /// The status of the uploaded video.
-    #[serde(rename = "uploadStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload_status: Option<VideoStatusUploadStatus>,
-    /// This value explains why YouTube rejected an uploaded video. This property is only present if the uploadStatus property indicates that the upload was rejected.
-    #[serde(rename = "rejectionReason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rejection_reason: Option<VideoStatusRejectionReason>,
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// The video's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<VideoStatusPrivacyStatus>,
-    /// This value indicates if the video can be embedded on another website. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "embeddable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embeddable: Option<bool>,
-    /// DateTime: The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private..
-    #[serde(rename = "publishAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub publish_at: Option<DateTime<Utc>>,
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-}
-
-/// Information about a new playlist item.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsPlaylistItem {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// ID of the item within the playlist.
-    #[serde(rename = "playlistItemId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_item_id: Option<String>,
-    /// The value that YouTube uses to uniquely identify the playlist.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-}
-
-/// Branding properties of a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelBrandingSettings {
-    #[serde(rename = "channel")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel: Option<ChannelSettings>,
-    /// Additional experimental branding properties.
-    #[serde(rename = "hints")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hints: Option<Vec<PropertyValue>>,
-    #[serde(rename = "watch")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch: Option<WatchSettings>,
-    #[serde(rename = "image")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image: Option<ImageSettings>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionListResponse {
-    /// A list of regions where YouTube is available. In this map, the i18n region ID is the map key, and its value is the corresponding i18nRegion resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<I18nRegion>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// ChannelSection targeting setting.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionTargeting {
-    /// The language the channel section is targeting.
-    #[serde(rename = "languages")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub languages: Option<Vec<String>>,
-    /// The region the channel section is targeting.
-    #[serde(rename = "regions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub regions: Option<Vec<String>>,
-    /// The country the channel section is targeting.
-    #[serde(rename = "countries")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub countries: Option<Vec<String>>,
-}
-
-/// Settings and Info of the monitor stream
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MonitorStreamInfo {
-    /// HTML code that embeds a player that plays the monitor stream.
-    #[serde(rename = "embedHtml")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_html: Option<String>,
-    /// This value determines whether the monitor stream is enabled for the broadcast. If the monitor stream is enabled, then YouTube will broadcast the event content on a special stream intended only for the broadcaster's consumption. The broadcaster can use the stream to review the event content and also to identify the optimal times to insert cuepoints. You need to set this value to true if you intend to have a broadcast delay for your event. *Note:* This property cannot be updated once the broadcast is in the testing or live state.
-    #[serde(rename = "enableMonitorStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_monitor_stream: Option<bool>,
-    /// If you have set the enableMonitorStream property to true, then this property determines the length of the live broadcast delay.
-    #[serde(rename = "broadcastStreamDelayMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub broadcast_stream_delay_ms: Option<u32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LanguageTag {
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestItem {
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<TestItemTestItemSnippet>,
-    /// i64:
-    #[serde(rename = "gaia")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub gaia: Option<String>,
-}
-
-/// Basic details about an i18n region, such as region code and human-readable name.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionSnippet {
-    /// The human-readable name of the region.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
-    /// The region code as a 2-letter ISO country code.
-    #[serde(rename = "gl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub gl: Option<String>,
-}
-
-/// Basic details about an i18n language, such as language code and human-readable name.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguageSnippet {
-    /// A short BCP-47 code that uniquely identifies a language.
-    #[serde(rename = "hl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hl: Option<String>,
-    /// The human-readable name of the language in the language itself.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
+}
+
+/// Describes the spatial position of a visual widget inside a video. It is a union of various position types, out of which only will be set one.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoPosition {
+    /// Describes in which corner of the video the visual widget will appear.
+    #[serde(rename = "cornerPosition")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub corner_position: Option<InvideoPositionCornerPosition>,
+    /// Defines the position type.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<InvideoPositionType>,
+}
+
+/// The conversionPings object encapsulates information about conversion pings that need to be respected by the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelConversionPings {
+    /// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
+    #[serde(rename = "pings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pings: Option<Vec<ChannelConversionPing>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageSnippet {
+    #[serde(rename = "superChatDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_chat_details: Option<LiveChatSuperChatDetails>,
+    /// Contains a string that can be displayed to the user. If this field is not present the message is silent, at the moment only messages of type TOMBSTONE and CHAT_ENDED_EVENT are silent.
+    #[serde(rename = "displayMessage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_message: Option<String>,
+    #[serde(rename = "fanFundingEventDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fan_funding_event_details: Option<LiveChatFanFundingEventDetails>,
+    /// DateTime: The date and time when the message was orignally published.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "userBannedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_banned_details: Option<LiveChatUserBannedMessageDetails>,
+    #[serde(rename = "messageDeletedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_deleted_details: Option<LiveChatMessageDeletedDetails>,
+    #[serde(rename = "messageRetractedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_retracted_details: Option<LiveChatMessageRetractedDetails>,
+    /// The type of message, this will always be present, it determines the contents of the message as well as which fields will be present.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<LiveChatMessageSnippetType>,
+    /// The ID of the user that authored this message, this field is not always filled. textMessageEvent - the user that wrote the message fanFundingEvent - the user that funded the broadcast newSponsorEvent - the user that just became a sponsor messageDeletedEvent - the moderator that took the action messageRetractedEvent - the author that retracted their message userBannedEvent - the moderator that took the action superChatEvent - the user that made the purchase
+    #[serde(rename = "authorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_channel_id: Option<String>,
+    #[serde(rename = "superStickerDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_details: Option<LiveChatSuperStickerDetails>,
+    /// Whether the message has display content that should be displayed to users.
+    #[serde(rename = "hasDisplayContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub has_display_content: Option<bool>,
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    #[serde(rename = "textMessageDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_message_details: Option<LiveChatTextMessageDetails>,
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelSectionSnippetStyle {
+    Undefined,
+    #[serde(rename = "channelsectionStyleUnspecified")]
+    ChannelsectionStyleUnspecified,
+    #[serde(rename = "horizontalRow")]
+    HorizontalRow,
+    #[serde(rename = "verticalList")]
+    VerticalList,
+}
+
+impl std::default::Default for ChannelSectionSnippetStyle {
+    fn default() -> ChannelSectionSnippetStyle {
+        ChannelSectionSnippetStyle::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelSectionSnippetStyle {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelSectionSnippetStyle::Undefined => write!(f, "undefined"),
+            ChannelSectionSnippetStyle::ChannelsectionStyleUnspecified => {
+                write!(f, "channelsectionStyleUnspecified")
+            }
+            ChannelSectionSnippetStyle::HorizontalRow => write!(f, "horizontalRow"),
+            ChannelSectionSnippetStyle::VerticalList => write!(f, "verticalList"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelSectionSnippetType {
+    Undefined,
+    #[serde(rename = "channelsectionTypeUnspecified")]
+    ChannelsectionTypeUnspecified,
+    #[serde(rename = "singlePlaylist")]
+    SinglePlaylist,
+    #[serde(rename = "multiplePlaylists")]
+    MultiplePlaylists,
+    #[serde(rename = "popularUploads")]
+    PopularUploads,
+    #[serde(rename = "recentUploads")]
+    RecentUploads,
+    #[serde(rename = "likes")]
+    Likes,
+    #[serde(rename = "allPlaylists")]
+    AllPlaylists,
+    #[serde(rename = "likedPlaylists")]
+    LikedPlaylists,
+    #[serde(rename = "recentPosts")]
+    RecentPosts,
+    #[serde(rename = "recentActivity")]
+    RecentActivity,
+    #[serde(rename = "liveEvents")]
+    LiveEvents,
+    #[serde(rename = "upcomingEvents")]
+    UpcomingEvents,
+    #[serde(rename = "completedEvents")]
+    CompletedEvents,
+    #[serde(rename = "multipleChannels")]
+    MultipleChannels,
+    #[serde(rename = "postedVideos")]
+    PostedVideos,
+    #[serde(rename = "postedPlaylists")]
+    PostedPlaylists,
+    #[serde(rename = "subscriptions")]
+    Subscriptions,
+}
+
+impl std::default::Default for ChannelSectionSnippetType {
+    fn default() -> ChannelSectionSnippetType {
+        ChannelSectionSnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelSectionSnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelSectionSnippetType::Undefined => write!(f, "undefined"),
+            ChannelSectionSnippetType::ChannelsectionTypeUnspecified => {
+                write!(f, "channelsectionTypeUnspecified")
+            }
+            ChannelSectionSnippetType::SinglePlaylist => write!(f, "singlePlaylist"),
+            ChannelSectionSnippetType::MultiplePlaylists => write!(f, "multiplePlaylists"),
+            ChannelSectionSnippetType::PopularUploads => write!(f, "popularUploads"),
+            ChannelSectionSnippetType::RecentUploads => write!(f, "recentUploads"),
+            ChannelSectionSnippetType::Likes => write!(f, "likes"),
+            ChannelSectionSnippetType::AllPlaylists => write!(f, "allPlaylists"),
+            ChannelSectionSnippetType::LikedPlaylists => write!(f, "likedPlaylists"),
+            ChannelSectionSnippetType::RecentPosts => write!(f, "recentPosts"),
+            ChannelSectionSnippetType::RecentActivity => write!(f, "recentActivity"),
+            ChannelSectionSnippetType::LiveEvents => write!(f, "liveEvents"),
+            ChannelSectionSnippetType::UpcomingEvents => write!(f, "upcomingEvents"),
+            ChannelSectionSnippetType::CompletedEvents => write!(f, "completedEvents"),
+            ChannelSectionSnippetType::MultipleChannels => write!(f, "multipleChannels"),
+            ChannelSectionSnippetType::PostedVideos => write!(f, "postedVideos"),
+            ChannelSectionSnippetType::PostedPlaylists => write!(f, "postedPlaylists"),
+            ChannelSectionSnippetType::Subscriptions => write!(f, "subscriptions"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum PlaylistItemStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for PlaylistItemStatusPrivacyStatus {
+    fn default() -> PlaylistItemStatusPrivacyStatus {
+        PlaylistItemStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for PlaylistItemStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            PlaylistItemStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            PlaylistItemStatusPrivacyStatus::Public => write!(f, "public"),
+            PlaylistItemStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            PlaylistItemStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSnippetLiveBroadcastContent {
+    Undefined,
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+    /// The live broadcast is active.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast has been completed.
+    #[serde(rename = "completed")]
+    Completed,
+}
+
+impl std::default::Default for VideoSnippetLiveBroadcastContent {
+    fn default() -> VideoSnippetLiveBroadcastContent {
+        VideoSnippetLiveBroadcastContent::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSnippetLiveBroadcastContent {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
+            VideoSnippetLiveBroadcastContent::None => write!(f, "none"),
+            VideoSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
+            VideoSnippetLiveBroadcastContent::Live => write!(f, "live"),
+            VideoSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CdnSettingsIngestionType {
+    Undefined,
+    #[serde(rename = "rtmp")]
+    Rtmp,
+    #[serde(rename = "dash")]
+    Dash,
+    #[serde(rename = "webrtc")]
+    Webrtc,
+    #[serde(rename = "hls")]
+    Hls,
+}
+
+impl std::default::Default for CdnSettingsIngestionType {
+    fn default() -> CdnSettingsIngestionType {
+        CdnSettingsIngestionType::Undefined
+    }
+}
+
+impl std::fmt::Display for CdnSettingsIngestionType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CdnSettingsIngestionType::Undefined => write!(f, "undefined"),
+            CdnSettingsIngestionType::Rtmp => write!(f, "rtmp"),
+            CdnSettingsIngestionType::Dash => write!(f, "dash"),
+            CdnSettingsIngestionType::Webrtc => write!(f, "webrtc"),
+            CdnSettingsIngestionType::Hls => write!(f, "hls"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CdnSettingsFrameRate {
+    Undefined,
+    #[serde(rename = "30fps")]
+    _30fps,
+    #[serde(rename = "60fps")]
+    _60fps,
+    #[serde(rename = "variable")]
+    Variable,
+}
+
+impl std::default::Default for CdnSettingsFrameRate {
+    fn default() -> CdnSettingsFrameRate {
+        CdnSettingsFrameRate::Undefined
+    }
+}
+
+impl std::fmt::Display for CdnSettingsFrameRate {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CdnSettingsFrameRate::Undefined => write!(f, "undefined"),
+            CdnSettingsFrameRate::_30fps => write!(f, "30fps"),
+            CdnSettingsFrameRate::_60fps => write!(f, "60fps"),
+            CdnSettingsFrameRate::Variable => write!(f, "variable"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CdnSettingsResolution {
+    Undefined,
+    #[serde(rename = "240p")]
+    _240p,
+    #[serde(rename = "360p")]
+    _360p,
+    #[serde(rename = "480p")]
+    _480p,
+    #[serde(rename = "720p")]
+    _720p,
+    #[serde(rename = "1080p")]
+    _1080p,
+    #[serde(rename = "1440p")]
+    _1440p,
+    #[serde(rename = "2160p")]
+    _2160p,
+    #[serde(rename = "variable")]
+    Variable,
+}
+
+impl std::default::Default for CdnSettingsResolution {
+    fn default() -> CdnSettingsResolution {
+        CdnSettingsResolution::Undefined
+    }
+}
+
+impl std::fmt::Display for CdnSettingsResolution {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CdnSettingsResolution::Undefined => write!(f, "undefined"),
+            CdnSettingsResolution::_240p => write!(f, "240p"),
+            CdnSettingsResolution::_360p => write!(f, "360p"),
+            CdnSettingsResolution::_480p => write!(f, "480p"),
+            CdnSettingsResolution::_720p => write!(f, "720p"),
+            CdnSettingsResolution::_1080p => write!(f, "1080p"),
+            CdnSettingsResolution::_1440p => write!(f, "1440p"),
+            CdnSettingsResolution::_2160p => write!(f, "2160p"),
+            CdnSettingsResolution::Variable => write!(f, "variable"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsProjection {
+    Undefined,
+    #[serde(rename = "projectionUnspecified")]
+    ProjectionUnspecified,
+    #[serde(rename = "rectangular")]
+    Rectangular,
+    #[serde(rename = "360")]
+    _360,
+    #[serde(rename = "mesh")]
+    Mesh,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsProjection {
+    fn default() -> LiveBroadcastContentDetailsProjection {
+        LiveBroadcastContentDetailsProjection::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsProjection {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsProjection::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsProjection::ProjectionUnspecified => {
+                write!(f, "projectionUnspecified")
+            }
+            LiveBroadcastContentDetailsProjection::Rectangular => write!(f, "rectangular"),
+            LiveBroadcastContentDetailsProjection::_360 => write!(f, "360"),
+            LiveBroadcastContentDetailsProjection::Mesh => write!(f, "mesh"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsStereoLayout {
+    Undefined,
+    #[serde(rename = "stereoLayoutUnspecified")]
+    StereoLayoutUnspecified,
+    #[serde(rename = "mono")]
+    Mono,
+    #[serde(rename = "leftRight")]
+    LeftRight,
+    #[serde(rename = "topBottom")]
+    TopBottom,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsStereoLayout {
+    fn default() -> LiveBroadcastContentDetailsStereoLayout {
+        LiveBroadcastContentDetailsStereoLayout::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsStereoLayout {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsStereoLayout::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsStereoLayout::StereoLayoutUnspecified => {
+                write!(f, "stereoLayoutUnspecified")
+            }
+            LiveBroadcastContentDetailsStereoLayout::Mono => write!(f, "mono"),
+            LiveBroadcastContentDetailsStereoLayout::LeftRight => write!(f, "leftRight"),
+            LiveBroadcastContentDetailsStereoLayout::TopBottom => write!(f, "topBottom"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsClosedCaptionsType {
+    Undefined,
+    #[serde(rename = "closedCaptionsTypeUnspecified")]
+    ClosedCaptionsTypeUnspecified,
+    #[serde(rename = "closedCaptionsDisabled")]
+    ClosedCaptionsDisabled,
+    #[serde(rename = "closedCaptionsHttpPost")]
+    ClosedCaptionsHttpPost,
+    #[serde(rename = "closedCaptionsEmbedded")]
+    ClosedCaptionsEmbedded,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsClosedCaptionsType {
+    fn default() -> LiveBroadcastContentDetailsClosedCaptionsType {
+        LiveBroadcastContentDetailsClosedCaptionsType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsClosedCaptionsType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsClosedCaptionsType::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsTypeUnspecified => {
+                write!(f, "closedCaptionsTypeUnspecified")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsDisabled => {
+                write!(f, "closedCaptionsDisabled")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsHttpPost => {
+                write!(f, "closedCaptionsHttpPost")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsEmbedded => {
+                write!(f, "closedCaptionsEmbedded")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsLatencyPreference {
+    Undefined,
+    #[serde(rename = "latencyPreferenceUnspecified")]
+    LatencyPreferenceUnspecified,
+    /// Best for: highest quality viewer playbacks and higher resolutions.
+    #[serde(rename = "normal")]
+    Normal,
+    /// Best for: near real-time interaction, with minimal playback buffering.
+    #[serde(rename = "low")]
+    Low,
+    /// Best for: real-time interaction Does not support: Closed captions, 1440p, and 4k resolutions
+    #[serde(rename = "ultraLow")]
+    UltraLow,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsLatencyPreference {
+    fn default() -> LiveBroadcastContentDetailsLatencyPreference {
+        LiveBroadcastContentDetailsLatencyPreference::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsLatencyPreference {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsLatencyPreference::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsLatencyPreference::LatencyPreferenceUnspecified => {
+                write!(f, "latencyPreferenceUnspecified")
+            }
+            LiveBroadcastContentDetailsLatencyPreference::Normal => write!(f, "normal"),
+            LiveBroadcastContentDetailsLatencyPreference::Low => write!(f, "low"),
+            LiveBroadcastContentDetailsLatencyPreference::UltraLow => write!(f, "ultraLow"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveStreamHealthStatusStatus {
+    Undefined,
+    #[serde(rename = "good")]
+    Good,
+    #[serde(rename = "ok")]
+    Ok,
+    #[serde(rename = "bad")]
+    Bad,
+    #[serde(rename = "noData")]
+    NoData,
+    #[serde(rename = "revoked")]
+    Revoked,
+}
+
+impl std::default::Default for LiveStreamHealthStatusStatus {
+    fn default() -> LiveStreamHealthStatusStatus {
+        LiveStreamHealthStatusStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamHealthStatusStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamHealthStatusStatus::Undefined => write!(f, "undefined"),
+            LiveStreamHealthStatusStatus::Good => write!(f, "good"),
+            LiveStreamHealthStatusStatus::Ok => write!(f, "ok"),
+            LiveStreamHealthStatusStatus::Bad => write!(f, "bad"),
+            LiveStreamHealthStatusStatus::NoData => write!(f, "noData"),
+            LiveStreamHealthStatusStatus::Revoked => write!(f, "revoked"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusUploadStatus {
+    Undefined,
+    /// Video has been uploaded but not processed yet.
+    #[serde(rename = "uploaded")]
+    Uploaded,
+    /// Video has been successfully processed.
+    #[serde(rename = "processed")]
+    Processed,
+    /// Processing has failed. See FailureReason.
+    #[serde(rename = "failed")]
+    Failed,
+    /// Video has been rejected. See RejectionReason.
+    #[serde(rename = "rejected")]
+    Rejected,
+    /// Video has been deleted.
+    #[serde(rename = "deleted")]
+    Deleted,
+}
+
+impl std::default::Default for VideoStatusUploadStatus {
+    fn default() -> VideoStatusUploadStatus {
+        VideoStatusUploadStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusUploadStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusUploadStatus::Undefined => write!(f, "undefined"),
+            VideoStatusUploadStatus::Uploaded => write!(f, "uploaded"),
+            VideoStatusUploadStatus::Processed => write!(f, "processed"),
+            VideoStatusUploadStatus::Failed => write!(f, "failed"),
+            VideoStatusUploadStatus::Rejected => write!(f, "rejected"),
+            VideoStatusUploadStatus::Deleted => write!(f, "deleted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusLicense {
+    Undefined,
+    #[serde(rename = "youtube")]
+    Youtube,
+    #[serde(rename = "creativeCommon")]
+    CreativeCommon,
+}
+
+impl std::default::Default for VideoStatusLicense {
+    fn default() -> VideoStatusLicense {
+        VideoStatusLicense::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusLicense {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusLicense::Undefined => write!(f, "undefined"),
+            VideoStatusLicense::Youtube => write!(f, "youtube"),
+            VideoStatusLicense::CreativeCommon => write!(f, "creativeCommon"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusRejectionReason {
+    Undefined,
+    /// Copyright infringement.
+    #[serde(rename = "copyright")]
+    Copyright,
+    /// Inappropriate video content.
+    #[serde(rename = "inappropriate")]
+    Inappropriate,
+    /// Duplicate upload in the same channel.
+    #[serde(rename = "duplicate")]
+    Duplicate,
+    /// Terms of use violation.
+    #[serde(rename = "termsOfUse")]
+    TermsOfUse,
+    /// Uploader account was suspended.
+    #[serde(rename = "uploaderAccountSuspended")]
+    UploaderAccountSuspended,
+    /// Video duration was too long.
+    #[serde(rename = "length")]
+    Length,
+    /// Blocked by content owner.
+    #[serde(rename = "claim")]
+    Claim,
+    /// Uploader closed his/her account.
+    #[serde(rename = "uploaderAccountClosed")]
+    UploaderAccountClosed,
+    /// Trademark infringement.
+    #[serde(rename = "trademark")]
+    Trademark,
+    /// An unspecified legal reason.
+    #[serde(rename = "legal")]
+    Legal,
+}
+
+impl std::default::Default for VideoStatusRejectionReason {
+    fn default() -> VideoStatusRejectionReason {
+        VideoStatusRejectionReason::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusRejectionReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusRejectionReason::Undefined => write!(f, "undefined"),
+            VideoStatusRejectionReason::Copyright => write!(f, "copyright"),
+            VideoStatusRejectionReason::Inappropriate => write!(f, "inappropriate"),
+            VideoStatusRejectionReason::Duplicate => write!(f, "duplicate"),
+            VideoStatusRejectionReason::TermsOfUse => write!(f, "termsOfUse"),
+            VideoStatusRejectionReason::UploaderAccountSuspended => {
+                write!(f, "uploaderAccountSuspended")
+            }
+            VideoStatusRejectionReason::Length => write!(f, "length"),
+            VideoStatusRejectionReason::Claim => write!(f, "claim"),
+            VideoStatusRejectionReason::UploaderAccountClosed => write!(f, "uploaderAccountClosed"),
+            VideoStatusRejectionReason::Trademark => write!(f, "trademark"),
+            VideoStatusRejectionReason::Legal => write!(f, "legal"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for VideoStatusPrivacyStatus {
+    fn default() -> VideoStatusPrivacyStatus {
+        VideoStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            VideoStatusPrivacyStatus::Public => write!(f, "public"),
+            VideoStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            VideoStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusFailureReason {
+    Undefined,
+    /// Unable to convert video content.
+    #[serde(rename = "conversion")]
+    Conversion,
+    /// Invalid file format.
+    #[serde(rename = "invalidFile")]
+    InvalidFile,
+    /// Empty file.
+    #[serde(rename = "emptyFile")]
+    EmptyFile,
+    /// File was too small.
+    #[serde(rename = "tooSmall")]
+    TooSmall,
+    /// Unsupported codec.
+    #[serde(rename = "codec")]
+    Codec,
+    /// Upload wasn't finished.
+    #[serde(rename = "uploadAborted")]
+    UploadAborted,
+}
+
+impl std::default::Default for VideoStatusFailureReason {
+    fn default() -> VideoStatusFailureReason {
+        VideoStatusFailureReason::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusFailureReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusFailureReason::Undefined => write!(f, "undefined"),
+            VideoStatusFailureReason::Conversion => write!(f, "conversion"),
+            VideoStatusFailureReason::InvalidFile => write!(f, "invalidFile"),
+            VideoStatusFailureReason::EmptyFile => write!(f, "emptyFile"),
+            VideoStatusFailureReason::TooSmall => write!(f, "tooSmall"),
+            VideoStatusFailureReason::Codec => write!(f, "codec"),
+            VideoStatusFailureReason::UploadAborted => write!(f, "uploadAborted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsCaption {
+    Undefined,
+    #[serde(rename = "true")]
+    True,
+    #[serde(rename = "false")]
+    False,
+}
+
+impl std::default::Default for VideoContentDetailsCaption {
+    fn default() -> VideoContentDetailsCaption {
+        VideoContentDetailsCaption::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoContentDetailsCaption {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoContentDetailsCaption::Undefined => write!(f, "undefined"),
+            VideoContentDetailsCaption::True => write!(f, "true"),
+            VideoContentDetailsCaption::False => write!(f, "false"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsDefinition {
+    Undefined,
+    /// sd
+    #[serde(rename = "sd")]
+    Sd,
+    /// hd
+    #[serde(rename = "hd")]
+    Hd,
+}
+
+impl std::default::Default for VideoContentDetailsDefinition {
+    fn default() -> VideoContentDetailsDefinition {
+        VideoContentDetailsDefinition::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoContentDetailsDefinition {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoContentDetailsDefinition::Undefined => write!(f, "undefined"),
+            VideoContentDetailsDefinition::Sd => write!(f, "sd"),
+            VideoContentDetailsDefinition::Hd => write!(f, "hd"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsProjection {
+    Undefined,
+    #[serde(rename = "rectangular")]
+    Rectangular,
+    #[serde(rename = "360")]
+    _360,
+}
+
+impl std::default::Default for VideoContentDetailsProjection {
+    fn default() -> VideoContentDetailsProjection {
+        VideoContentDetailsProjection::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoContentDetailsProjection {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoContentDetailsProjection::Undefined => write!(f, "undefined"),
+            VideoContentDetailsProjection::Rectangular => write!(f, "rectangular"),
+            VideoContentDetailsProjection::_360 => write!(f, "360"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveStreamStatusStreamStatus {
+    Undefined,
+    #[serde(rename = "created")]
+    Created,
+    #[serde(rename = "ready")]
+    Ready,
+    #[serde(rename = "active")]
+    Active,
+    #[serde(rename = "inactive")]
+    Inactive,
+    #[serde(rename = "error")]
+    Error,
+}
+
+impl std::default::Default for LiveStreamStatusStreamStatus {
+    fn default() -> LiveStreamStatusStreamStatus {
+        LiveStreamStatusStreamStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamStatusStreamStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamStatusStreamStatus::Undefined => write!(f, "undefined"),
+            LiveStreamStatusStreamStatus::Created => write!(f, "created"),
+            LiveStreamStatusStreamStatus::Ready => write!(f, "ready"),
+            LiveStreamStatusStreamStatus::Active => write!(f, "active"),
+            LiveStreamStatusStreamStatus::Inactive => write!(f, "inactive"),
+            LiveStreamStatusStreamStatus::Error => write!(f, "error"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetFailureReason {
+    Undefined,
+    #[serde(rename = "unknownFormat")]
+    UnknownFormat,
+    #[serde(rename = "unsupportedFormat")]
+    UnsupportedFormat,
+    #[serde(rename = "processingFailed")]
+    ProcessingFailed,
+}
+
+impl std::default::Default for CaptionSnippetFailureReason {
+    fn default() -> CaptionSnippetFailureReason {
+        CaptionSnippetFailureReason::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetFailureReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetFailureReason::Undefined => write!(f, "undefined"),
+            CaptionSnippetFailureReason::UnknownFormat => write!(f, "unknownFormat"),
+            CaptionSnippetFailureReason::UnsupportedFormat => write!(f, "unsupportedFormat"),
+            CaptionSnippetFailureReason::ProcessingFailed => write!(f, "processingFailed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetTrackKind {
+    Undefined,
+    #[serde(rename = "standard")]
+    Standard,
+    #[serde(rename = "ASR")]
+    ASR,
+    #[serde(rename = "forced")]
+    Forced,
+}
+
+impl std::default::Default for CaptionSnippetTrackKind {
+    fn default() -> CaptionSnippetTrackKind {
+        CaptionSnippetTrackKind::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetTrackKind {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetTrackKind::Undefined => write!(f, "undefined"),
+            CaptionSnippetTrackKind::Standard => write!(f, "standard"),
+            CaptionSnippetTrackKind::ASR => write!(f, "ASR"),
+            CaptionSnippetTrackKind::Forced => write!(f, "forced"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetStatus {
+    Undefined,
+    #[serde(rename = "serving")]
+    Serving,
+    #[serde(rename = "syncing")]
+    Syncing,
+    #[serde(rename = "failed")]
+    Failed,
+}
+
+impl std::default::Default for CaptionSnippetStatus {
+    fn default() -> CaptionSnippetStatus {
+        CaptionSnippetStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetStatus::Undefined => write!(f, "undefined"),
+            CaptionSnippetStatus::Serving => write!(f, "serving"),
+            CaptionSnippetStatus::Syncing => write!(f, "syncing"),
+            CaptionSnippetStatus::Failed => write!(f, "failed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetAudioTrackType {
+    Undefined,
+    #[serde(rename = "unknown")]
+    Unknown,
+    #[serde(rename = "primary")]
+    Primary,
+    #[serde(rename = "commentary")]
+    Commentary,
+    #[serde(rename = "descriptive")]
+    Descriptive,
+}
+
+impl std::default::Default for CaptionSnippetAudioTrackType {
+    fn default() -> CaptionSnippetAudioTrackType {
+        CaptionSnippetAudioTrackType::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetAudioTrackType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetAudioTrackType::Undefined => write!(f, "undefined"),
+            CaptionSnippetAudioTrackType::Unknown => write!(f, "unknown"),
+            CaptionSnippetAudioTrackType::Primary => write!(f, "primary"),
+            CaptionSnippetAudioTrackType::Commentary => write!(f, "commentary"),
+            CaptionSnippetAudioTrackType::Descriptive => write!(f, "descriptive"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivityContentDetailsRecommendationReason {
+    Undefined,
+    #[serde(rename = "reasonUnspecified")]
+    ReasonUnspecified,
+    #[serde(rename = "videoFavorited")]
+    VideoFavorited,
+    #[serde(rename = "videoLiked")]
+    VideoLiked,
+    #[serde(rename = "videoWatched")]
+    VideoWatched,
+}
+
+impl std::default::Default for ActivityContentDetailsRecommendationReason {
+    fn default() -> ActivityContentDetailsRecommendationReason {
+        ActivityContentDetailsRecommendationReason::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivityContentDetailsRecommendationReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivityContentDetailsRecommendationReason::Undefined => write!(f, "undefined"),
+            ActivityContentDetailsRecommendationReason::ReasonUnspecified => {
+                write!(f, "reasonUnspecified")
+            }
+            ActivityContentDetailsRecommendationReason::VideoFavorited => {
+                write!(f, "videoFavorited")
+            }
+            ActivityContentDetailsRecommendationReason::VideoLiked => write!(f, "videoLiked"),
+            ActivityContentDetailsRecommendationReason::VideoWatched => write!(f, "videoWatched"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinkStatusLinkStatus {
+    Undefined,
+    #[serde(rename = "unknown")]
+    Unknown,
+    #[serde(rename = "failed")]
+    Failed,
+    #[serde(rename = "pending")]
+    Pending,
+    #[serde(rename = "linked")]
+    Linked,
+}
+
+impl std::default::Default for ThirdPartyLinkStatusLinkStatus {
+    fn default() -> ThirdPartyLinkStatusLinkStatus {
+        ThirdPartyLinkStatusLinkStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinkStatusLinkStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinkStatusLinkStatus::Undefined => write!(f, "undefined"),
+            ThirdPartyLinkStatusLinkStatus::Unknown => write!(f, "unknown"),
+            ThirdPartyLinkStatusLinkStatus::Failed => write!(f, "failed"),
+            ThirdPartyLinkStatusLinkStatus::Pending => write!(f, "pending"),
+            ThirdPartyLinkStatusLinkStatus::Linked => write!(f, "linked"),
+        };
+        Ok(())
+    }
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum SubscriptionContentDetailsActivityType {
     Undefined,
-    ///
     #[serde(rename = "subscriptionActivityTypeUnspecified")]
     SubscriptionActivityTypeUnspecified,
-    ///
     #[serde(rename = "all")]
     All,
-    ///
     #[serde(rename = "uploads")]
     Uploads,
 }
@@ -4540,9 +5428,309 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentSnippetViewerRating {
+    Undefined,
+    #[serde(rename = "none")]
+    None,
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "dislike")]
+    Dislike,
+}
+
+impl std::default::Default for CommentSnippetViewerRating {
+    fn default() -> CommentSnippetViewerRating {
+        CommentSnippetViewerRating::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentSnippetViewerRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentSnippetViewerRating::Undefined => write!(f, "undefined"),
+            CommentSnippetViewerRating::None => write!(f, "none"),
+            CommentSnippetViewerRating::Like => write!(f, "like"),
+            CommentSnippetViewerRating::Dislike => write!(f, "dislike"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentSnippetModerationStatus {
+    Undefined,
+    /// The comment is available for public display.
+    #[serde(rename = "published")]
+    Published,
+    /// The comment is awaiting review by a moderator.
+    #[serde(rename = "heldForReview")]
+    HeldForReview,
+    #[serde(rename = "likelySpam")]
+    LikelySpam,
+    /// The comment is unfit for display.
+    #[serde(rename = "rejected")]
+    Rejected,
+}
+
+impl std::default::Default for CommentSnippetModerationStatus {
+    fn default() -> CommentSnippetModerationStatus {
+        CommentSnippetModerationStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentSnippetModerationStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentSnippetModerationStatus::Undefined => write!(f, "undefined"),
+            CommentSnippetModerationStatus::Published => write!(f, "published"),
+            CommentSnippetModerationStatus::HeldForReview => write!(f, "heldForReview"),
+            CommentSnippetModerationStatus::LikelySpam => write!(f, "likelySpam"),
+            CommentSnippetModerationStatus::Rejected => write!(f, "rejected"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchResultSnippetLiveBroadcastContent {
+    Undefined,
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+    /// The live broadcast is active.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast has been completed.
+    #[serde(rename = "completed")]
+    Completed,
+}
+
+impl std::default::Default for SearchResultSnippetLiveBroadcastContent {
+    fn default() -> SearchResultSnippetLiveBroadcastContent {
+        SearchResultSnippetLiveBroadcastContent::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchResultSnippetLiveBroadcastContent {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchResultSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
+            SearchResultSnippetLiveBroadcastContent::None => write!(f, "none"),
+            SearchResultSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
+            SearchResultSnippetLiveBroadcastContent::Live => write!(f, "live"),
+            SearchResultSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoProcessingDetailsProcessingStatus {
+    Undefined,
+    #[serde(rename = "processing")]
+    Processing,
+    #[serde(rename = "succeeded")]
+    Succeeded,
+    #[serde(rename = "failed")]
+    Failed,
+    #[serde(rename = "terminated")]
+    Terminated,
+}
+
+impl std::default::Default for VideoProcessingDetailsProcessingStatus {
+    fn default() -> VideoProcessingDetailsProcessingStatus {
+        VideoProcessingDetailsProcessingStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoProcessingDetailsProcessingStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoProcessingDetailsProcessingStatus::Undefined => write!(f, "undefined"),
+            VideoProcessingDetailsProcessingStatus::Processing => write!(f, "processing"),
+            VideoProcessingDetailsProcessingStatus::Succeeded => write!(f, "succeeded"),
+            VideoProcessingDetailsProcessingStatus::Failed => write!(f, "failed"),
+            VideoProcessingDetailsProcessingStatus::Terminated => write!(f, "terminated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoProcessingDetailsProcessingFailureReason {
+    Undefined,
+    #[serde(rename = "uploadFailed")]
+    UploadFailed,
+    #[serde(rename = "transcodeFailed")]
+    TranscodeFailed,
+    #[serde(rename = "streamingFailed")]
+    StreamingFailed,
+    #[serde(rename = "other")]
+    Other,
+}
+
+impl std::default::Default for VideoProcessingDetailsProcessingFailureReason {
+    fn default() -> VideoProcessingDetailsProcessingFailureReason {
+        VideoProcessingDetailsProcessingFailureReason::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoProcessingDetailsProcessingFailureReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoProcessingDetailsProcessingFailureReason::Undefined => write!(f, "undefined"),
+            VideoProcessingDetailsProcessingFailureReason::UploadFailed => {
+                write!(f, "uploadFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::TranscodeFailed => {
+                write!(f, "transcodeFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::StreamingFailed => {
+                write!(f, "streamingFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::Other => write!(f, "other"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoRatingRating {
+    Undefined,
+    #[serde(rename = "none")]
+    None,
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "dislike")]
+    Dislike,
+}
+
+impl std::default::Default for VideoRatingRating {
+    fn default() -> VideoRatingRating {
+        VideoRatingRating::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoRatingRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoRatingRating::Undefined => write!(f, "undefined"),
+            VideoRatingRating::None => write!(f, "none"),
+            VideoRatingRating::Like => write!(f, "like"),
+            VideoRatingRating::Dislike => write!(f, "dislike"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoFileDetailsVideoStreamRotation {
+    Undefined,
+    #[serde(rename = "none")]
+    None,
+    #[serde(rename = "clockwise")]
+    Clockwise,
+    #[serde(rename = "upsideDown")]
+    UpsideDown,
+    #[serde(rename = "counterClockwise")]
+    CounterClockwise,
+    #[serde(rename = "other")]
+    Other,
+}
+
+impl std::default::Default for VideoFileDetailsVideoStreamRotation {
+    fn default() -> VideoFileDetailsVideoStreamRotation {
+        VideoFileDetailsVideoStreamRotation::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoFileDetailsVideoStreamRotation {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoFileDetailsVideoStreamRotation::Undefined => write!(f, "undefined"),
+            VideoFileDetailsVideoStreamRotation::None => write!(f, "none"),
+            VideoFileDetailsVideoStreamRotation::Clockwise => write!(f, "clockwise"),
+            VideoFileDetailsVideoStreamRotation::UpsideDown => write!(f, "upsideDown"),
+            VideoFileDetailsVideoStreamRotation::CounterClockwise => write!(f, "counterClockwise"),
+            VideoFileDetailsVideoStreamRotation::Other => write!(f, "other"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveChatBanSnippetType {
+    Undefined,
+    /// An invalid ban type.
+    #[serde(rename = "liveChatBanTypeUnspecified")]
+    LiveChatBanTypeUnspecified,
+    /// A permanent ban.
+    #[serde(rename = "permanent")]
+    Permanent,
+    /// A temporary ban.
+    #[serde(rename = "temporary")]
+    Temporary,
+}
+
+impl std::default::Default for LiveChatBanSnippetType {
+    fn default() -> LiveChatBanSnippetType {
+        LiveChatBanSnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveChatBanSnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveChatBanSnippetType::Undefined => write!(f, "undefined"),
+            LiveChatBanSnippetType::LiveChatBanTypeUnspecified => {
+                write!(f, "liveChatBanTypeUnspecified")
+            }
+            LiveChatBanSnippetType::Permanent => write!(f, "permanent"),
+            LiveChatBanSnippetType::Temporary => write!(f, "temporary"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivityContentDetailsPromotedItemCtaType {
+    Undefined,
+    #[serde(rename = "ctaTypeUnspecified")]
+    CtaTypeUnspecified,
+    #[serde(rename = "visitAdvertiserSite")]
+    VisitAdvertiserSite,
+}
+
+impl std::default::Default for ActivityContentDetailsPromotedItemCtaType {
+    fn default() -> ActivityContentDetailsPromotedItemCtaType {
+        ActivityContentDetailsPromotedItemCtaType::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivityContentDetailsPromotedItemCtaType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivityContentDetailsPromotedItemCtaType::Undefined => write!(f, "undefined"),
+            ActivityContentDetailsPromotedItemCtaType::CtaTypeUnspecified => {
+                write!(f, "ctaTypeUnspecified")
+            }
+            ActivityContentDetailsPromotedItemCtaType::VisitAdvertiserSite => {
+                write!(f, "visitAdvertiserSite")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum ThirdPartyLinkSnippetType {
     Undefined,
-    ///
     #[serde(rename = "linkUnspecified")]
     LinkUnspecified,
     /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
@@ -4568,6 +5756,3923 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveStreamConfigurationIssueSeverity {
+    Undefined,
+    #[serde(rename = "info")]
+    Info,
+    #[serde(rename = "warning")]
+    Warning,
+    #[serde(rename = "error")]
+    Error,
+}
+
+impl std::default::Default for LiveStreamConfigurationIssueSeverity {
+    fn default() -> LiveStreamConfigurationIssueSeverity {
+        LiveStreamConfigurationIssueSeverity::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamConfigurationIssueSeverity {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamConfigurationIssueSeverity::Undefined => write!(f, "undefined"),
+            LiveStreamConfigurationIssueSeverity::Info => write!(f, "info"),
+            LiveStreamConfigurationIssueSeverity::Warning => write!(f, "warning"),
+            LiveStreamConfigurationIssueSeverity::Error => write!(f, "error"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveStreamConfigurationIssueType {
+    Undefined,
+    #[serde(rename = "gopSizeOver")]
+    GopSizeOver,
+    #[serde(rename = "gopSizeLong")]
+    GopSizeLong,
+    #[serde(rename = "gopSizeShort")]
+    GopSizeShort,
+    #[serde(rename = "openGop")]
+    OpenGop,
+    #[serde(rename = "badContainer")]
+    BadContainer,
+    #[serde(rename = "audioBitrateHigh")]
+    AudioBitrateHigh,
+    #[serde(rename = "audioBitrateLow")]
+    AudioBitrateLow,
+    #[serde(rename = "audioSampleRate")]
+    AudioSampleRate,
+    #[serde(rename = "bitrateHigh")]
+    BitrateHigh,
+    #[serde(rename = "bitrateLow")]
+    BitrateLow,
+    #[serde(rename = "audioCodec")]
+    AudioCodec,
+    #[serde(rename = "videoCodec")]
+    VideoCodec,
+    #[serde(rename = "noAudioStream")]
+    NoAudioStream,
+    #[serde(rename = "noVideoStream")]
+    NoVideoStream,
+    #[serde(rename = "multipleVideoStreams")]
+    MultipleVideoStreams,
+    #[serde(rename = "multipleAudioStreams")]
+    MultipleAudioStreams,
+    #[serde(rename = "audioTooManyChannels")]
+    AudioTooManyChannels,
+    #[serde(rename = "interlacedVideo")]
+    InterlacedVideo,
+    #[serde(rename = "frameRateHigh")]
+    FrameRateHigh,
+    #[serde(rename = "resolutionMismatch")]
+    ResolutionMismatch,
+    #[serde(rename = "videoCodecMismatch")]
+    VideoCodecMismatch,
+    #[serde(rename = "videoInterlaceMismatch")]
+    VideoInterlaceMismatch,
+    #[serde(rename = "videoProfileMismatch")]
+    VideoProfileMismatch,
+    #[serde(rename = "videoBitrateMismatch")]
+    VideoBitrateMismatch,
+    #[serde(rename = "framerateMismatch")]
+    FramerateMismatch,
+    #[serde(rename = "gopMismatch")]
+    GopMismatch,
+    #[serde(rename = "audioSampleRateMismatch")]
+    AudioSampleRateMismatch,
+    #[serde(rename = "audioStereoMismatch")]
+    AudioStereoMismatch,
+    #[serde(rename = "audioCodecMismatch")]
+    AudioCodecMismatch,
+    #[serde(rename = "audioBitrateMismatch")]
+    AudioBitrateMismatch,
+    #[serde(rename = "videoResolutionSuboptimal")]
+    VideoResolutionSuboptimal,
+    #[serde(rename = "videoResolutionUnsupported")]
+    VideoResolutionUnsupported,
+    #[serde(rename = "videoIngestionStarved")]
+    VideoIngestionStarved,
+    #[serde(rename = "videoIngestionFasterThanRealtime")]
+    VideoIngestionFasterThanRealtime,
+}
+
+impl std::default::Default for LiveStreamConfigurationIssueType {
+    fn default() -> LiveStreamConfigurationIssueType {
+        LiveStreamConfigurationIssueType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamConfigurationIssueType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamConfigurationIssueType::Undefined => write!(f, "undefined"),
+            LiveStreamConfigurationIssueType::GopSizeOver => write!(f, "gopSizeOver"),
+            LiveStreamConfigurationIssueType::GopSizeLong => write!(f, "gopSizeLong"),
+            LiveStreamConfigurationIssueType::GopSizeShort => write!(f, "gopSizeShort"),
+            LiveStreamConfigurationIssueType::OpenGop => write!(f, "openGop"),
+            LiveStreamConfigurationIssueType::BadContainer => write!(f, "badContainer"),
+            LiveStreamConfigurationIssueType::AudioBitrateHigh => write!(f, "audioBitrateHigh"),
+            LiveStreamConfigurationIssueType::AudioBitrateLow => write!(f, "audioBitrateLow"),
+            LiveStreamConfigurationIssueType::AudioSampleRate => write!(f, "audioSampleRate"),
+            LiveStreamConfigurationIssueType::BitrateHigh => write!(f, "bitrateHigh"),
+            LiveStreamConfigurationIssueType::BitrateLow => write!(f, "bitrateLow"),
+            LiveStreamConfigurationIssueType::AudioCodec => write!(f, "audioCodec"),
+            LiveStreamConfigurationIssueType::VideoCodec => write!(f, "videoCodec"),
+            LiveStreamConfigurationIssueType::NoAudioStream => write!(f, "noAudioStream"),
+            LiveStreamConfigurationIssueType::NoVideoStream => write!(f, "noVideoStream"),
+            LiveStreamConfigurationIssueType::MultipleVideoStreams => {
+                write!(f, "multipleVideoStreams")
+            }
+            LiveStreamConfigurationIssueType::MultipleAudioStreams => {
+                write!(f, "multipleAudioStreams")
+            }
+            LiveStreamConfigurationIssueType::AudioTooManyChannels => {
+                write!(f, "audioTooManyChannels")
+            }
+            LiveStreamConfigurationIssueType::InterlacedVideo => write!(f, "interlacedVideo"),
+            LiveStreamConfigurationIssueType::FrameRateHigh => write!(f, "frameRateHigh"),
+            LiveStreamConfigurationIssueType::ResolutionMismatch => write!(f, "resolutionMismatch"),
+            LiveStreamConfigurationIssueType::VideoCodecMismatch => write!(f, "videoCodecMismatch"),
+            LiveStreamConfigurationIssueType::VideoInterlaceMismatch => {
+                write!(f, "videoInterlaceMismatch")
+            }
+            LiveStreamConfigurationIssueType::VideoProfileMismatch => {
+                write!(f, "videoProfileMismatch")
+            }
+            LiveStreamConfigurationIssueType::VideoBitrateMismatch => {
+                write!(f, "videoBitrateMismatch")
+            }
+            LiveStreamConfigurationIssueType::FramerateMismatch => write!(f, "framerateMismatch"),
+            LiveStreamConfigurationIssueType::GopMismatch => write!(f, "gopMismatch"),
+            LiveStreamConfigurationIssueType::AudioSampleRateMismatch => {
+                write!(f, "audioSampleRateMismatch")
+            }
+            LiveStreamConfigurationIssueType::AudioStereoMismatch => {
+                write!(f, "audioStereoMismatch")
+            }
+            LiveStreamConfigurationIssueType::AudioCodecMismatch => write!(f, "audioCodecMismatch"),
+            LiveStreamConfigurationIssueType::AudioBitrateMismatch => {
+                write!(f, "audioBitrateMismatch")
+            }
+            LiveStreamConfigurationIssueType::VideoResolutionSuboptimal => {
+                write!(f, "videoResolutionSuboptimal")
+            }
+            LiveStreamConfigurationIssueType::VideoResolutionUnsupported => {
+                write!(f, "videoResolutionUnsupported")
+            }
+            LiveStreamConfigurationIssueType::VideoIngestionStarved => {
+                write!(f, "videoIngestionStarved")
+            }
+            LiveStreamConfigurationIssueType::VideoIngestionFasterThanRealtime => {
+                write!(f, "videoIngestionFasterThanRealtime")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoAgeGatingVideoGameRating {
+    Undefined,
+    #[serde(rename = "anyone")]
+    Anyone,
+    #[serde(rename = "m15Plus")]
+    M15Plus,
+    #[serde(rename = "m16Plus")]
+    M16Plus,
+    #[serde(rename = "m17Plus")]
+    M17Plus,
+}
+
+impl std::default::Default for VideoAgeGatingVideoGameRating {
+    fn default() -> VideoAgeGatingVideoGameRating {
+        VideoAgeGatingVideoGameRating::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoAgeGatingVideoGameRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoAgeGatingVideoGameRating::Undefined => write!(f, "undefined"),
+            VideoAgeGatingVideoGameRating::Anyone => write!(f, "anyone"),
+            VideoAgeGatingVideoGameRating::M15Plus => write!(f, "m15Plus"),
+            VideoAgeGatingVideoGameRating::M16Plus => write!(f, "m16Plus"),
+            VideoAgeGatingVideoGameRating::M17Plus => write!(f, "m17Plus"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum PlaylistStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for PlaylistStatusPrivacyStatus {
+    fn default() -> PlaylistStatusPrivacyStatus {
+        PlaylistStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for PlaylistStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            PlaylistStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            PlaylistStatusPrivacyStatus::Public => write!(f, "public"),
+            PlaylistStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            PlaylistStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelConversionPingContext {
+    Undefined,
+    #[serde(rename = "subscribe")]
+    Subscribe,
+    #[serde(rename = "unsubscribe")]
+    Unsubscribe,
+    #[serde(rename = "cview")]
+    Cview,
+}
+
+impl std::default::Default for ChannelConversionPingContext {
+    fn default() -> ChannelConversionPingContext {
+        ChannelConversionPingContext::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelConversionPingContext {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelConversionPingContext::Undefined => write!(f, "undefined"),
+            ChannelConversionPingContext::Subscribe => write!(f, "subscribe"),
+            ChannelConversionPingContext::Unsubscribe => write!(f, "unsubscribe"),
+            ChannelConversionPingContext::Cview => write!(f, "cview"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCbfcRating {
+    Undefined,
+    #[serde(rename = "cbfcUnspecified")]
+    CbfcUnspecified,
+    /// U
+    #[serde(rename = "cbfcU")]
+    CbfcU,
+    /// U/A
+    #[serde(rename = "cbfcUA")]
+    CbfcUA,
+    /// A
+    #[serde(rename = "cbfcA")]
+    CbfcA,
+    /// S
+    #[serde(rename = "cbfcS")]
+    CbfcS,
+    #[serde(rename = "cbfcUnrated")]
+    CbfcUnrated,
+}
+
+impl std::default::Default for ContentRatingCbfcRating {
+    fn default() -> ContentRatingCbfcRating {
+        ContentRatingCbfcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCbfcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCbfcRating::Undefined => write!(f, "undefined"),
+            ContentRatingCbfcRating::CbfcUnspecified => write!(f, "cbfcUnspecified"),
+            ContentRatingCbfcRating::CbfcU => write!(f, "cbfcU"),
+            ContentRatingCbfcRating::CbfcUA => write!(f, "cbfcUA"),
+            ContentRatingCbfcRating::CbfcA => write!(f, "cbfcA"),
+            ContentRatingCbfcRating::CbfcS => write!(f, "cbfcS"),
+            ContentRatingCbfcRating::CbfcUnrated => write!(f, "cbfcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEefilmRating {
+    Undefined,
+    #[serde(rename = "eefilmUnspecified")]
+    EefilmUnspecified,
+    /// Pere
+    #[serde(rename = "eefilmPere")]
+    EefilmPere,
+    /// L
+    #[serde(rename = "eefilmL")]
+    EefilmL,
+    /// MS-6
+    #[serde(rename = "eefilmMs6")]
+    EefilmMs6,
+    /// K-6
+    #[serde(rename = "eefilmK6")]
+    EefilmK6,
+    /// MS-12
+    #[serde(rename = "eefilmMs12")]
+    EefilmMs12,
+    /// K-12
+    #[serde(rename = "eefilmK12")]
+    EefilmK12,
+    /// K-14
+    #[serde(rename = "eefilmK14")]
+    EefilmK14,
+    /// K-16
+    #[serde(rename = "eefilmK16")]
+    EefilmK16,
+    #[serde(rename = "eefilmUnrated")]
+    EefilmUnrated,
+}
+
+impl std::default::Default for ContentRatingEefilmRating {
+    fn default() -> ContentRatingEefilmRating {
+        ContentRatingEefilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEefilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEefilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingEefilmRating::EefilmUnspecified => write!(f, "eefilmUnspecified"),
+            ContentRatingEefilmRating::EefilmPere => write!(f, "eefilmPere"),
+            ContentRatingEefilmRating::EefilmL => write!(f, "eefilmL"),
+            ContentRatingEefilmRating::EefilmMs6 => write!(f, "eefilmMs6"),
+            ContentRatingEefilmRating::EefilmK6 => write!(f, "eefilmK6"),
+            ContentRatingEefilmRating::EefilmMs12 => write!(f, "eefilmMs12"),
+            ContentRatingEefilmRating::EefilmK12 => write!(f, "eefilmK12"),
+            ContentRatingEefilmRating::EefilmK14 => write!(f, "eefilmK14"),
+            ContentRatingEefilmRating::EefilmK16 => write!(f, "eefilmK16"),
+            ContentRatingEefilmRating::EefilmUnrated => write!(f, "eefilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFpbRatingReasons {
+    Undefined,
+    #[serde(rename = "fpbRatingReasonUnspecified")]
+    FpbRatingReasonUnspecified,
+    /// South Africa rating content descriptors.
+    #[serde(rename = "fpbBlasphemy")]
+    FpbBlasphemy,
+    #[serde(rename = "fpbLanguage")]
+    FpbLanguage,
+    #[serde(rename = "fpbNudity")]
+    FpbNudity,
+    #[serde(rename = "fpbPrejudice")]
+    FpbPrejudice,
+    #[serde(rename = "fpbSex")]
+    FpbSex,
+    #[serde(rename = "fpbViolence")]
+    FpbViolence,
+    #[serde(rename = "fpbDrugs")]
+    FpbDrugs,
+    #[serde(rename = "fpbSexualViolence")]
+    FpbSexualViolence,
+    #[serde(rename = "fpbHorror")]
+    FpbHorror,
+    #[serde(rename = "fpbCriminalTechniques")]
+    FpbCriminalTechniques,
+    #[serde(rename = "fpbImitativeActsTechniques")]
+    FpbImitativeActsTechniques,
+}
+
+impl std::default::Default for ContentRatingFpbRatingReasons {
+    fn default() -> ContentRatingFpbRatingReasons {
+        ContentRatingFpbRatingReasons::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFpbRatingReasons {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFpbRatingReasons::Undefined => write!(f, "undefined"),
+            ContentRatingFpbRatingReasons::FpbRatingReasonUnspecified => {
+                write!(f, "fpbRatingReasonUnspecified")
+            }
+            ContentRatingFpbRatingReasons::FpbBlasphemy => write!(f, "fpbBlasphemy"),
+            ContentRatingFpbRatingReasons::FpbLanguage => write!(f, "fpbLanguage"),
+            ContentRatingFpbRatingReasons::FpbNudity => write!(f, "fpbNudity"),
+            ContentRatingFpbRatingReasons::FpbPrejudice => write!(f, "fpbPrejudice"),
+            ContentRatingFpbRatingReasons::FpbSex => write!(f, "fpbSex"),
+            ContentRatingFpbRatingReasons::FpbViolence => write!(f, "fpbViolence"),
+            ContentRatingFpbRatingReasons::FpbDrugs => write!(f, "fpbDrugs"),
+            ContentRatingFpbRatingReasons::FpbSexualViolence => write!(f, "fpbSexualViolence"),
+            ContentRatingFpbRatingReasons::FpbHorror => write!(f, "fpbHorror"),
+            ContentRatingFpbRatingReasons::FpbCriminalTechniques => {
+                write!(f, "fpbCriminalTechniques")
+            }
+            ContentRatingFpbRatingReasons::FpbImitativeActsTechniques => {
+                write!(f, "fpbImitativeActsTechniques")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNfvcbRating {
+    Undefined,
+    #[serde(rename = "nfvcbUnspecified")]
+    NfvcbUnspecified,
+    /// G
+    #[serde(rename = "nfvcbG")]
+    NfvcbG,
+    /// PG
+    #[serde(rename = "nfvcbPg")]
+    NfvcbPg,
+    /// 12
+    #[serde(rename = "nfvcb12")]
+    Nfvcb12,
+    /// 12A
+    #[serde(rename = "nfvcb12a")]
+    Nfvcb12a,
+    /// 15
+    #[serde(rename = "nfvcb15")]
+    Nfvcb15,
+    /// 18
+    #[serde(rename = "nfvcb18")]
+    Nfvcb18,
+    /// RE
+    #[serde(rename = "nfvcbRe")]
+    NfvcbRe,
+    #[serde(rename = "nfvcbUnrated")]
+    NfvcbUnrated,
+}
+
+impl std::default::Default for ContentRatingNfvcbRating {
+    fn default() -> ContentRatingNfvcbRating {
+        ContentRatingNfvcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNfvcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNfvcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingNfvcbRating::NfvcbUnspecified => write!(f, "nfvcbUnspecified"),
+            ContentRatingNfvcbRating::NfvcbG => write!(f, "nfvcbG"),
+            ContentRatingNfvcbRating::NfvcbPg => write!(f, "nfvcbPg"),
+            ContentRatingNfvcbRating::Nfvcb12 => write!(f, "nfvcb12"),
+            ContentRatingNfvcbRating::Nfvcb12a => write!(f, "nfvcb12a"),
+            ContentRatingNfvcbRating::Nfvcb15 => write!(f, "nfvcb15"),
+            ContentRatingNfvcbRating::Nfvcb18 => write!(f, "nfvcb18"),
+            ContentRatingNfvcbRating::NfvcbRe => write!(f, "nfvcbRe"),
+            ContentRatingNfvcbRating::NfvcbUnrated => write!(f, "nfvcbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFcoRating {
+    Undefined,
+    #[serde(rename = "fcoUnspecified")]
+    FcoUnspecified,
+    /// I
+    #[serde(rename = "fcoI")]
+    FcoI,
+    /// IIA
+    #[serde(rename = "fcoIia")]
+    FcoIia,
+    /// IIB
+    #[serde(rename = "fcoIib")]
+    FcoIib,
+    /// II
+    #[serde(rename = "fcoIi")]
+    FcoIi,
+    /// III
+    #[serde(rename = "fcoIii")]
+    FcoIii,
+    #[serde(rename = "fcoUnrated")]
+    FcoUnrated,
+}
+
+impl std::default::Default for ContentRatingFcoRating {
+    fn default() -> ContentRatingFcoRating {
+        ContentRatingFcoRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFcoRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFcoRating::Undefined => write!(f, "undefined"),
+            ContentRatingFcoRating::FcoUnspecified => write!(f, "fcoUnspecified"),
+            ContentRatingFcoRating::FcoI => write!(f, "fcoI"),
+            ContentRatingFcoRating::FcoIia => write!(f, "fcoIia"),
+            ContentRatingFcoRating::FcoIib => write!(f, "fcoIib"),
+            ContentRatingFcoRating::FcoIi => write!(f, "fcoIi"),
+            ContentRatingFcoRating::FcoIii => write!(f, "fcoIii"),
+            ContentRatingFcoRating::FcoUnrated => write!(f, "fcoUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKijkwijzerRating {
+    Undefined,
+    #[serde(rename = "kijkwijzerUnspecified")]
+    KijkwijzerUnspecified,
+    /// AL
+    #[serde(rename = "kijkwijzerAl")]
+    KijkwijzerAl,
+    /// 6
+    #[serde(rename = "kijkwijzer6")]
+    Kijkwijzer6,
+    /// 9
+    #[serde(rename = "kijkwijzer9")]
+    Kijkwijzer9,
+    /// 12
+    #[serde(rename = "kijkwijzer12")]
+    Kijkwijzer12,
+    /// 16
+    #[serde(rename = "kijkwijzer16")]
+    Kijkwijzer16,
+    #[serde(rename = "kijkwijzer18")]
+    Kijkwijzer18,
+    #[serde(rename = "kijkwijzerUnrated")]
+    KijkwijzerUnrated,
+}
+
+impl std::default::Default for ContentRatingKijkwijzerRating {
+    fn default() -> ContentRatingKijkwijzerRating {
+        ContentRatingKijkwijzerRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingKijkwijzerRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingKijkwijzerRating::Undefined => write!(f, "undefined"),
+            ContentRatingKijkwijzerRating::KijkwijzerUnspecified => {
+                write!(f, "kijkwijzerUnspecified")
+            }
+            ContentRatingKijkwijzerRating::KijkwijzerAl => write!(f, "kijkwijzerAl"),
+            ContentRatingKijkwijzerRating::Kijkwijzer6 => write!(f, "kijkwijzer6"),
+            ContentRatingKijkwijzerRating::Kijkwijzer9 => write!(f, "kijkwijzer9"),
+            ContentRatingKijkwijzerRating::Kijkwijzer12 => write!(f, "kijkwijzer12"),
+            ContentRatingKijkwijzerRating::Kijkwijzer16 => write!(f, "kijkwijzer16"),
+            ContentRatingKijkwijzerRating::Kijkwijzer18 => write!(f, "kijkwijzer18"),
+            ContentRatingKijkwijzerRating::KijkwijzerUnrated => write!(f, "kijkwijzerUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBbfcRating {
+    Undefined,
+    #[serde(rename = "bbfcUnspecified")]
+    BbfcUnspecified,
+    /// U
+    #[serde(rename = "bbfcU")]
+    BbfcU,
+    /// PG
+    #[serde(rename = "bbfcPg")]
+    BbfcPg,
+    /// 12A
+    #[serde(rename = "bbfc12a")]
+    Bbfc12a,
+    /// 12
+    #[serde(rename = "bbfc12")]
+    Bbfc12,
+    /// 15
+    #[serde(rename = "bbfc15")]
+    Bbfc15,
+    /// 18
+    #[serde(rename = "bbfc18")]
+    Bbfc18,
+    /// R18
+    #[serde(rename = "bbfcR18")]
+    BbfcR18,
+    #[serde(rename = "bbfcUnrated")]
+    BbfcUnrated,
+}
+
+impl std::default::Default for ContentRatingBbfcRating {
+    fn default() -> ContentRatingBbfcRating {
+        ContentRatingBbfcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingBbfcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingBbfcRating::Undefined => write!(f, "undefined"),
+            ContentRatingBbfcRating::BbfcUnspecified => write!(f, "bbfcUnspecified"),
+            ContentRatingBbfcRating::BbfcU => write!(f, "bbfcU"),
+            ContentRatingBbfcRating::BbfcPg => write!(f, "bbfcPg"),
+            ContentRatingBbfcRating::Bbfc12a => write!(f, "bbfc12a"),
+            ContentRatingBbfcRating::Bbfc12 => write!(f, "bbfc12"),
+            ContentRatingBbfcRating::Bbfc15 => write!(f, "bbfc15"),
+            ContentRatingBbfcRating::Bbfc18 => write!(f, "bbfc18"),
+            ContentRatingBbfcRating::BbfcR18 => write!(f, "bbfcR18"),
+            ContentRatingBbfcRating::BbfcUnrated => write!(f, "bbfcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingResorteviolenciaRating {
+    Undefined,
+    #[serde(rename = "resorteviolenciaUnspecified")]
+    ResorteviolenciaUnspecified,
+    /// A
+    #[serde(rename = "resorteviolenciaA")]
+    ResorteviolenciaA,
+    /// B
+    #[serde(rename = "resorteviolenciaB")]
+    ResorteviolenciaB,
+    /// C
+    #[serde(rename = "resorteviolenciaC")]
+    ResorteviolenciaC,
+    /// D
+    #[serde(rename = "resorteviolenciaD")]
+    ResorteviolenciaD,
+    /// E
+    #[serde(rename = "resorteviolenciaE")]
+    ResorteviolenciaE,
+    #[serde(rename = "resorteviolenciaUnrated")]
+    ResorteviolenciaUnrated,
+}
+
+impl std::default::Default for ContentRatingResorteviolenciaRating {
+    fn default() -> ContentRatingResorteviolenciaRating {
+        ContentRatingResorteviolenciaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingResorteviolenciaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingResorteviolenciaRating::Undefined => write!(f, "undefined"),
+            ContentRatingResorteviolenciaRating::ResorteviolenciaUnspecified => {
+                write!(f, "resorteviolenciaUnspecified")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaA => {
+                write!(f, "resorteviolenciaA")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaB => {
+                write!(f, "resorteviolenciaB")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaC => {
+                write!(f, "resorteviolenciaC")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaD => {
+                write!(f, "resorteviolenciaD")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaE => {
+                write!(f, "resorteviolenciaE")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaUnrated => {
+                write!(f, "resorteviolenciaUnrated")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKfcbRating {
+    Undefined,
+    #[serde(rename = "kfcbUnspecified")]
+    KfcbUnspecified,
+    /// GE
+    #[serde(rename = "kfcbG")]
+    KfcbG,
+    /// PG
+    #[serde(rename = "kfcbPg")]
+    KfcbPg,
+    /// 16
+    #[serde(rename = "kfcb16plus")]
+    Kfcb16plus,
+    /// 18
+    #[serde(rename = "kfcbR")]
+    KfcbR,
+    #[serde(rename = "kfcbUnrated")]
+    KfcbUnrated,
+}
+
+impl std::default::Default for ContentRatingKfcbRating {
+    fn default() -> ContentRatingKfcbRating {
+        ContentRatingKfcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingKfcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingKfcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingKfcbRating::KfcbUnspecified => write!(f, "kfcbUnspecified"),
+            ContentRatingKfcbRating::KfcbG => write!(f, "kfcbG"),
+            ContentRatingKfcbRating::KfcbPg => write!(f, "kfcbPg"),
+            ContentRatingKfcbRating::Kfcb16plus => write!(f, "kfcb16plus"),
+            ContentRatingKfcbRating::KfcbR => write!(f, "kfcbR"),
+            ContentRatingKfcbRating::KfcbUnrated => write!(f, "kfcbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIlfilmRating {
+    Undefined,
+    #[serde(rename = "ilfilmUnspecified")]
+    IlfilmUnspecified,
+    /// AA
+    #[serde(rename = "ilfilmAa")]
+    IlfilmAa,
+    /// 12
+    #[serde(rename = "ilfilm12")]
+    Ilfilm12,
+    /// 14
+    #[serde(rename = "ilfilm14")]
+    Ilfilm14,
+    /// 16
+    #[serde(rename = "ilfilm16")]
+    Ilfilm16,
+    /// 18
+    #[serde(rename = "ilfilm18")]
+    Ilfilm18,
+    #[serde(rename = "ilfilmUnrated")]
+    IlfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingIlfilmRating {
+    fn default() -> ContentRatingIlfilmRating {
+        ContentRatingIlfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIlfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIlfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingIlfilmRating::IlfilmUnspecified => write!(f, "ilfilmUnspecified"),
+            ContentRatingIlfilmRating::IlfilmAa => write!(f, "ilfilmAa"),
+            ContentRatingIlfilmRating::Ilfilm12 => write!(f, "ilfilm12"),
+            ContentRatingIlfilmRating::Ilfilm14 => write!(f, "ilfilm14"),
+            ContentRatingIlfilmRating::Ilfilm16 => write!(f, "ilfilm16"),
+            ContentRatingIlfilmRating::Ilfilm18 => write!(f, "ilfilm18"),
+            ContentRatingIlfilmRating::IlfilmUnrated => write!(f, "ilfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMoctwRating {
+    Undefined,
+    #[serde(rename = "moctwUnspecified")]
+    MoctwUnspecified,
+    /// G
+    #[serde(rename = "moctwG")]
+    MoctwG,
+    /// P
+    #[serde(rename = "moctwP")]
+    MoctwP,
+    /// PG
+    #[serde(rename = "moctwPg")]
+    MoctwPg,
+    /// R
+    #[serde(rename = "moctwR")]
+    MoctwR,
+    #[serde(rename = "moctwUnrated")]
+    MoctwUnrated,
+    /// R-12
+    #[serde(rename = "moctwR12")]
+    MoctwR12,
+    /// R-15
+    #[serde(rename = "moctwR15")]
+    MoctwR15,
+}
+
+impl std::default::Default for ContentRatingMoctwRating {
+    fn default() -> ContentRatingMoctwRating {
+        ContentRatingMoctwRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMoctwRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMoctwRating::Undefined => write!(f, "undefined"),
+            ContentRatingMoctwRating::MoctwUnspecified => write!(f, "moctwUnspecified"),
+            ContentRatingMoctwRating::MoctwG => write!(f, "moctwG"),
+            ContentRatingMoctwRating::MoctwP => write!(f, "moctwP"),
+            ContentRatingMoctwRating::MoctwPg => write!(f, "moctwPg"),
+            ContentRatingMoctwRating::MoctwR => write!(f, "moctwR"),
+            ContentRatingMoctwRating::MoctwUnrated => write!(f, "moctwUnrated"),
+            ContentRatingMoctwRating::MoctwR12 => write!(f, "moctwR12"),
+            ContentRatingMoctwRating::MoctwR15 => write!(f, "moctwR15"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBmukkRating {
+    Undefined,
+    #[serde(rename = "bmukkUnspecified")]
+    BmukkUnspecified,
+    /// Unrestricted
+    #[serde(rename = "bmukkAa")]
+    BmukkAa,
+    /// 6+
+    #[serde(rename = "bmukk6")]
+    Bmukk6,
+    /// 8+
+    #[serde(rename = "bmukk8")]
+    Bmukk8,
+    /// 10+
+    #[serde(rename = "bmukk10")]
+    Bmukk10,
+    /// 12+
+    #[serde(rename = "bmukk12")]
+    Bmukk12,
+    /// 14+
+    #[serde(rename = "bmukk14")]
+    Bmukk14,
+    /// 16+
+    #[serde(rename = "bmukk16")]
+    Bmukk16,
+    #[serde(rename = "bmukkUnrated")]
+    BmukkUnrated,
+}
+
+impl std::default::Default for ContentRatingBmukkRating {
+    fn default() -> ContentRatingBmukkRating {
+        ContentRatingBmukkRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingBmukkRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingBmukkRating::Undefined => write!(f, "undefined"),
+            ContentRatingBmukkRating::BmukkUnspecified => write!(f, "bmukkUnspecified"),
+            ContentRatingBmukkRating::BmukkAa => write!(f, "bmukkAa"),
+            ContentRatingBmukkRating::Bmukk6 => write!(f, "bmukk6"),
+            ContentRatingBmukkRating::Bmukk8 => write!(f, "bmukk8"),
+            ContentRatingBmukkRating::Bmukk10 => write!(f, "bmukk10"),
+            ContentRatingBmukkRating::Bmukk12 => write!(f, "bmukk12"),
+            ContentRatingBmukkRating::Bmukk14 => write!(f, "bmukk14"),
+            ContentRatingBmukkRating::Bmukk16 => write!(f, "bmukk16"),
+            ContentRatingBmukkRating::BmukkUnrated => write!(f, "bmukkUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRussiaRating {
+    Undefined,
+    #[serde(rename = "russiaUnspecified")]
+    RussiaUnspecified,
+    /// 0+
+    #[serde(rename = "russia0")]
+    Russia0,
+    /// 6+
+    #[serde(rename = "russia6")]
+    Russia6,
+    /// 12+
+    #[serde(rename = "russia12")]
+    Russia12,
+    /// 16+
+    #[serde(rename = "russia16")]
+    Russia16,
+    /// 18+
+    #[serde(rename = "russia18")]
+    Russia18,
+    #[serde(rename = "russiaUnrated")]
+    RussiaUnrated,
+}
+
+impl std::default::Default for ContentRatingRussiaRating {
+    fn default() -> ContentRatingRussiaRating {
+        ContentRatingRussiaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRussiaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRussiaRating::Undefined => write!(f, "undefined"),
+            ContentRatingRussiaRating::RussiaUnspecified => write!(f, "russiaUnspecified"),
+            ContentRatingRussiaRating::Russia0 => write!(f, "russia0"),
+            ContentRatingRussiaRating::Russia6 => write!(f, "russia6"),
+            ContentRatingRussiaRating::Russia12 => write!(f, "russia12"),
+            ContentRatingRussiaRating::Russia16 => write!(f, "russia16"),
+            ContentRatingRussiaRating::Russia18 => write!(f, "russia18"),
+            ContentRatingRussiaRating::RussiaUnrated => write!(f, "russiaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCatvRating {
+    Undefined,
+    #[serde(rename = "catvUnspecified")]
+    CatvUnspecified,
+    /// C
+    #[serde(rename = "catvC")]
+    CatvC,
+    /// C8
+    #[serde(rename = "catvC8")]
+    CatvC8,
+    /// G
+    #[serde(rename = "catvG")]
+    CatvG,
+    /// PG
+    #[serde(rename = "catvPg")]
+    CatvPg,
+    /// 14+
+    #[serde(rename = "catv14plus")]
+    Catv14plus,
+    /// 18+
+    #[serde(rename = "catv18plus")]
+    Catv18plus,
+    #[serde(rename = "catvUnrated")]
+    CatvUnrated,
+    #[serde(rename = "catvE")]
+    CatvE,
+}
+
+impl std::default::Default for ContentRatingCatvRating {
+    fn default() -> ContentRatingCatvRating {
+        ContentRatingCatvRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCatvRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCatvRating::Undefined => write!(f, "undefined"),
+            ContentRatingCatvRating::CatvUnspecified => write!(f, "catvUnspecified"),
+            ContentRatingCatvRating::CatvC => write!(f, "catvC"),
+            ContentRatingCatvRating::CatvC8 => write!(f, "catvC8"),
+            ContentRatingCatvRating::CatvG => write!(f, "catvG"),
+            ContentRatingCatvRating::CatvPg => write!(f, "catvPg"),
+            ContentRatingCatvRating::Catv14plus => write!(f, "catv14plus"),
+            ContentRatingCatvRating::Catv18plus => write!(f, "catv18plus"),
+            ContentRatingCatvRating::CatvUnrated => write!(f, "catvUnrated"),
+            ContentRatingCatvRating::CatvE => write!(f, "catvE"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMocRating {
+    Undefined,
+    #[serde(rename = "mocUnspecified")]
+    MocUnspecified,
+    /// E
+    #[serde(rename = "mocE")]
+    MocE,
+    /// T
+    #[serde(rename = "mocT")]
+    MocT,
+    /// 7
+    #[serde(rename = "moc7")]
+    Moc7,
+    /// 12
+    #[serde(rename = "moc12")]
+    Moc12,
+    /// 15
+    #[serde(rename = "moc15")]
+    Moc15,
+    /// 18
+    #[serde(rename = "moc18")]
+    Moc18,
+    /// X
+    #[serde(rename = "mocX")]
+    MocX,
+    /// Banned
+    #[serde(rename = "mocBanned")]
+    MocBanned,
+    #[serde(rename = "mocUnrated")]
+    MocUnrated,
+}
+
+impl std::default::Default for ContentRatingMocRating {
+    fn default() -> ContentRatingMocRating {
+        ContentRatingMocRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMocRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMocRating::Undefined => write!(f, "undefined"),
+            ContentRatingMocRating::MocUnspecified => write!(f, "mocUnspecified"),
+            ContentRatingMocRating::MocE => write!(f, "mocE"),
+            ContentRatingMocRating::MocT => write!(f, "mocT"),
+            ContentRatingMocRating::Moc7 => write!(f, "moc7"),
+            ContentRatingMocRating::Moc12 => write!(f, "moc12"),
+            ContentRatingMocRating::Moc15 => write!(f, "moc15"),
+            ContentRatingMocRating::Moc18 => write!(f, "moc18"),
+            ContentRatingMocRating::MocX => write!(f, "mocX"),
+            ContentRatingMocRating::MocBanned => write!(f, "mocBanned"),
+            ContentRatingMocRating::MocUnrated => write!(f, "mocUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRteRating {
+    Undefined,
+    #[serde(rename = "rteUnspecified")]
+    RteUnspecified,
+    /// GA
+    #[serde(rename = "rteGa")]
+    RteGa,
+    /// CH
+    #[serde(rename = "rteCh")]
+    RteCh,
+    /// PS
+    #[serde(rename = "rtePs")]
+    RtePs,
+    /// MA
+    #[serde(rename = "rteMa")]
+    RteMa,
+    #[serde(rename = "rteUnrated")]
+    RteUnrated,
+}
+
+impl std::default::Default for ContentRatingRteRating {
+    fn default() -> ContentRatingRteRating {
+        ContentRatingRteRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRteRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRteRating::Undefined => write!(f, "undefined"),
+            ContentRatingRteRating::RteUnspecified => write!(f, "rteUnspecified"),
+            ContentRatingRteRating::RteGa => write!(f, "rteGa"),
+            ContentRatingRteRating::RteCh => write!(f, "rteCh"),
+            ContentRatingRteRating::RtePs => write!(f, "rtePs"),
+            ContentRatingRteRating::RteMa => write!(f, "rteMa"),
+            ContentRatingRteRating::RteUnrated => write!(f, "rteUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAnatelRating {
+    Undefined,
+    #[serde(rename = "anatelUnspecified")]
+    AnatelUnspecified,
+    /// F
+    #[serde(rename = "anatelF")]
+    AnatelF,
+    /// I
+    #[serde(rename = "anatelI")]
+    AnatelI,
+    /// I-7
+    #[serde(rename = "anatelI7")]
+    AnatelI7,
+    /// I-10
+    #[serde(rename = "anatelI10")]
+    AnatelI10,
+    /// I-12
+    #[serde(rename = "anatelI12")]
+    AnatelI12,
+    /// R
+    #[serde(rename = "anatelR")]
+    AnatelR,
+    /// A
+    #[serde(rename = "anatelA")]
+    AnatelA,
+    #[serde(rename = "anatelUnrated")]
+    AnatelUnrated,
+}
+
+impl std::default::Default for ContentRatingAnatelRating {
+    fn default() -> ContentRatingAnatelRating {
+        ContentRatingAnatelRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingAnatelRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingAnatelRating::Undefined => write!(f, "undefined"),
+            ContentRatingAnatelRating::AnatelUnspecified => write!(f, "anatelUnspecified"),
+            ContentRatingAnatelRating::AnatelF => write!(f, "anatelF"),
+            ContentRatingAnatelRating::AnatelI => write!(f, "anatelI"),
+            ContentRatingAnatelRating::AnatelI7 => write!(f, "anatelI7"),
+            ContentRatingAnatelRating::AnatelI10 => write!(f, "anatelI10"),
+            ContentRatingAnatelRating::AnatelI12 => write!(f, "anatelI12"),
+            ContentRatingAnatelRating::AnatelR => write!(f, "anatelR"),
+            ContentRatingAnatelRating::AnatelA => write!(f, "anatelA"),
+            ContentRatingAnatelRating::AnatelUnrated => write!(f, "anatelUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMccaaRating {
+    Undefined,
+    #[serde(rename = "mccaaUnspecified")]
+    MccaaUnspecified,
+    /// U
+    #[serde(rename = "mccaaU")]
+    MccaaU,
+    /// PG
+    #[serde(rename = "mccaaPg")]
+    MccaaPg,
+    /// 12A
+    #[serde(rename = "mccaa12a")]
+    Mccaa12a,
+    /// 12
+    #[serde(rename = "mccaa12")]
+    Mccaa12,
+    /// 14 - this rating was removed from the new classification structure introduced in 2013.
+    #[serde(rename = "mccaa14")]
+    Mccaa14,
+    /// 15
+    #[serde(rename = "mccaa15")]
+    Mccaa15,
+    /// 16 - this rating was removed from the new classification structure introduced in 2013.
+    #[serde(rename = "mccaa16")]
+    Mccaa16,
+    /// 18
+    #[serde(rename = "mccaa18")]
+    Mccaa18,
+    #[serde(rename = "mccaaUnrated")]
+    MccaaUnrated,
+}
+
+impl std::default::Default for ContentRatingMccaaRating {
+    fn default() -> ContentRatingMccaaRating {
+        ContentRatingMccaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMccaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMccaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMccaaRating::MccaaUnspecified => write!(f, "mccaaUnspecified"),
+            ContentRatingMccaaRating::MccaaU => write!(f, "mccaaU"),
+            ContentRatingMccaaRating::MccaaPg => write!(f, "mccaaPg"),
+            ContentRatingMccaaRating::Mccaa12a => write!(f, "mccaa12a"),
+            ContentRatingMccaaRating::Mccaa12 => write!(f, "mccaa12"),
+            ContentRatingMccaaRating::Mccaa14 => write!(f, "mccaa14"),
+            ContentRatingMccaaRating::Mccaa15 => write!(f, "mccaa15"),
+            ContentRatingMccaaRating::Mccaa16 => write!(f, "mccaa16"),
+            ContentRatingMccaaRating::Mccaa18 => write!(f, "mccaa18"),
+            ContentRatingMccaaRating::MccaaUnrated => write!(f, "mccaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMpaaRating {
+    Undefined,
+    #[serde(rename = "mpaaUnspecified")]
+    MpaaUnspecified,
+    /// G
+    #[serde(rename = "mpaaG")]
+    MpaaG,
+    /// PG
+    #[serde(rename = "mpaaPg")]
+    MpaaPg,
+    /// PG-13
+    #[serde(rename = "mpaaPg13")]
+    MpaaPg13,
+    /// R
+    #[serde(rename = "mpaaR")]
+    MpaaR,
+    /// NC-17
+    #[serde(rename = "mpaaNc17")]
+    MpaaNc17,
+    /// ! X
+    #[serde(rename = "mpaaX")]
+    MpaaX,
+    #[serde(rename = "mpaaUnrated")]
+    MpaaUnrated,
+}
+
+impl std::default::Default for ContentRatingMpaaRating {
+    fn default() -> ContentRatingMpaaRating {
+        ContentRatingMpaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMpaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMpaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMpaaRating::MpaaUnspecified => write!(f, "mpaaUnspecified"),
+            ContentRatingMpaaRating::MpaaG => write!(f, "mpaaG"),
+            ContentRatingMpaaRating::MpaaPg => write!(f, "mpaaPg"),
+            ContentRatingMpaaRating::MpaaPg13 => write!(f, "mpaaPg13"),
+            ContentRatingMpaaRating::MpaaR => write!(f, "mpaaR"),
+            ContentRatingMpaaRating::MpaaNc17 => write!(f, "mpaaNc17"),
+            ContentRatingMpaaRating::MpaaX => write!(f, "mpaaX"),
+            ContentRatingMpaaRating::MpaaUnrated => write!(f, "mpaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingTvpgRating {
+    Undefined,
+    #[serde(rename = "tvpgUnspecified")]
+    TvpgUnspecified,
+    /// TV-Y
+    #[serde(rename = "tvpgY")]
+    TvpgY,
+    /// TV-Y7
+    #[serde(rename = "tvpgY7")]
+    TvpgY7,
+    /// TV-Y7-FV
+    #[serde(rename = "tvpgY7Fv")]
+    TvpgY7Fv,
+    /// TV-G
+    #[serde(rename = "tvpgG")]
+    TvpgG,
+    /// TV-PG
+    #[serde(rename = "tvpgPg")]
+    TvpgPg,
+    /// TV-14
+    #[serde(rename = "pg14")]
+    Pg14,
+    /// TV-MA
+    #[serde(rename = "tvpgMa")]
+    TvpgMa,
+    #[serde(rename = "tvpgUnrated")]
+    TvpgUnrated,
+}
+
+impl std::default::Default for ContentRatingTvpgRating {
+    fn default() -> ContentRatingTvpgRating {
+        ContentRatingTvpgRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingTvpgRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingTvpgRating::Undefined => write!(f, "undefined"),
+            ContentRatingTvpgRating::TvpgUnspecified => write!(f, "tvpgUnspecified"),
+            ContentRatingTvpgRating::TvpgY => write!(f, "tvpgY"),
+            ContentRatingTvpgRating::TvpgY7 => write!(f, "tvpgY7"),
+            ContentRatingTvpgRating::TvpgY7Fv => write!(f, "tvpgY7Fv"),
+            ContentRatingTvpgRating::TvpgG => write!(f, "tvpgG"),
+            ContentRatingTvpgRating::TvpgPg => write!(f, "tvpgPg"),
+            ContentRatingTvpgRating::Pg14 => write!(f, "pg14"),
+            ContentRatingTvpgRating::TvpgMa => write!(f, "tvpgMa"),
+            ContentRatingTvpgRating::TvpgUnrated => write!(f, "tvpgUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSkfilmRating {
+    Undefined,
+    #[serde(rename = "skfilmUnspecified")]
+    SkfilmUnspecified,
+    /// G
+    #[serde(rename = "skfilmG")]
+    SkfilmG,
+    /// P2
+    #[serde(rename = "skfilmP2")]
+    SkfilmP2,
+    /// P5
+    #[serde(rename = "skfilmP5")]
+    SkfilmP5,
+    /// P8
+    #[serde(rename = "skfilmP8")]
+    SkfilmP8,
+    #[serde(rename = "skfilmUnrated")]
+    SkfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingSkfilmRating {
+    fn default() -> ContentRatingSkfilmRating {
+        ContentRatingSkfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingSkfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingSkfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingSkfilmRating::SkfilmUnspecified => write!(f, "skfilmUnspecified"),
+            ContentRatingSkfilmRating::SkfilmG => write!(f, "skfilmG"),
+            ContentRatingSkfilmRating::SkfilmP2 => write!(f, "skfilmP2"),
+            ContentRatingSkfilmRating::SkfilmP5 => write!(f, "skfilmP5"),
+            ContentRatingSkfilmRating::SkfilmP8 => write!(f, "skfilmP8"),
+            ContentRatingSkfilmRating::SkfilmUnrated => write!(f, "skfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMenaMpaaRating {
+    Undefined,
+    #[serde(rename = "menaMpaaUnspecified")]
+    MenaMpaaUnspecified,
+    /// G
+    #[serde(rename = "menaMpaaG")]
+    MenaMpaaG,
+    /// PG
+    #[serde(rename = "menaMpaaPg")]
+    MenaMpaaPg,
+    /// PG-13
+    #[serde(rename = "menaMpaaPg13")]
+    MenaMpaaPg13,
+    /// R
+    #[serde(rename = "menaMpaaR")]
+    MenaMpaaR,
+    /// To keep the same enum values as MPAA's items have, skip NC_17.
+    #[serde(rename = "menaMpaaUnrated")]
+    MenaMpaaUnrated,
+}
+
+impl std::default::Default for ContentRatingMenaMpaaRating {
+    fn default() -> ContentRatingMenaMpaaRating {
+        ContentRatingMenaMpaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMenaMpaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMenaMpaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnspecified => write!(f, "menaMpaaUnspecified"),
+            ContentRatingMenaMpaaRating::MenaMpaaG => write!(f, "menaMpaaG"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg => write!(f, "menaMpaaPg"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg13 => write!(f, "menaMpaaPg13"),
+            ContentRatingMenaMpaaRating::MenaMpaaR => write!(f, "menaMpaaR"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnrated => write!(f, "menaMpaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingChvrsRating {
+    Undefined,
+    #[serde(rename = "chvrsUnspecified")]
+    ChvrsUnspecified,
+    /// G
+    #[serde(rename = "chvrsG")]
+    ChvrsG,
+    /// PG
+    #[serde(rename = "chvrsPg")]
+    ChvrsPg,
+    /// 14A
+    #[serde(rename = "chvrs14a")]
+    Chvrs14a,
+    /// 18A
+    #[serde(rename = "chvrs18a")]
+    Chvrs18a,
+    /// R
+    #[serde(rename = "chvrsR")]
+    ChvrsR,
+    /// E
+    #[serde(rename = "chvrsE")]
+    ChvrsE,
+    #[serde(rename = "chvrsUnrated")]
+    ChvrsUnrated,
+}
+
+impl std::default::Default for ContentRatingChvrsRating {
+    fn default() -> ContentRatingChvrsRating {
+        ContentRatingChvrsRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingChvrsRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingChvrsRating::Undefined => write!(f, "undefined"),
+            ContentRatingChvrsRating::ChvrsUnspecified => write!(f, "chvrsUnspecified"),
+            ContentRatingChvrsRating::ChvrsG => write!(f, "chvrsG"),
+            ContentRatingChvrsRating::ChvrsPg => write!(f, "chvrsPg"),
+            ContentRatingChvrsRating::Chvrs14a => write!(f, "chvrs14a"),
+            ContentRatingChvrsRating::Chvrs18a => write!(f, "chvrs18a"),
+            ContentRatingChvrsRating::ChvrsR => write!(f, "chvrsR"),
+            ContentRatingChvrsRating::ChvrsE => write!(f, "chvrsE"),
+            ContentRatingChvrsRating::ChvrsUnrated => write!(f, "chvrsUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCzfilmRating {
+    Undefined,
+    #[serde(rename = "czfilmUnspecified")]
+    CzfilmUnspecified,
+    /// U
+    #[serde(rename = "czfilmU")]
+    CzfilmU,
+    /// 12
+    #[serde(rename = "czfilm12")]
+    Czfilm12,
+    /// 14
+    #[serde(rename = "czfilm14")]
+    Czfilm14,
+    /// 18
+    #[serde(rename = "czfilm18")]
+    Czfilm18,
+    #[serde(rename = "czfilmUnrated")]
+    CzfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingCzfilmRating {
+    fn default() -> ContentRatingCzfilmRating {
+        ContentRatingCzfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCzfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCzfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingCzfilmRating::CzfilmUnspecified => write!(f, "czfilmUnspecified"),
+            ContentRatingCzfilmRating::CzfilmU => write!(f, "czfilmU"),
+            ContentRatingCzfilmRating::Czfilm12 => write!(f, "czfilm12"),
+            ContentRatingCzfilmRating::Czfilm14 => write!(f, "czfilm14"),
+            ContentRatingCzfilmRating::Czfilm18 => write!(f, "czfilm18"),
+            ContentRatingCzfilmRating::CzfilmUnrated => write!(f, "czfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCncRating {
+    Undefined,
+    #[serde(rename = "cncUnspecified")]
+    CncUnspecified,
+    /// T
+    #[serde(rename = "cncT")]
+    CncT,
+    /// 10
+    #[serde(rename = "cnc10")]
+    Cnc10,
+    /// 12
+    #[serde(rename = "cnc12")]
+    Cnc12,
+    /// 16
+    #[serde(rename = "cnc16")]
+    Cnc16,
+    /// 18
+    #[serde(rename = "cnc18")]
+    Cnc18,
+    /// E
+    #[serde(rename = "cncE")]
+    CncE,
+    /// interdiction
+    #[serde(rename = "cncInterdiction")]
+    CncInterdiction,
+    #[serde(rename = "cncUnrated")]
+    CncUnrated,
+}
+
+impl std::default::Default for ContentRatingCncRating {
+    fn default() -> ContentRatingCncRating {
+        ContentRatingCncRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCncRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCncRating::Undefined => write!(f, "undefined"),
+            ContentRatingCncRating::CncUnspecified => write!(f, "cncUnspecified"),
+            ContentRatingCncRating::CncT => write!(f, "cncT"),
+            ContentRatingCncRating::Cnc10 => write!(f, "cnc10"),
+            ContentRatingCncRating::Cnc12 => write!(f, "cnc12"),
+            ContentRatingCncRating::Cnc16 => write!(f, "cnc16"),
+            ContentRatingCncRating::Cnc18 => write!(f, "cnc18"),
+            ContentRatingCncRating::CncE => write!(f, "cncE"),
+            ContentRatingCncRating::CncInterdiction => write!(f, "cncInterdiction"),
+            ContentRatingCncRating::CncUnrated => write!(f, "cncUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMdaRating {
+    Undefined,
+    #[serde(rename = "mdaUnspecified")]
+    MdaUnspecified,
+    /// G
+    #[serde(rename = "mdaG")]
+    MdaG,
+    /// PG
+    #[serde(rename = "mdaPg")]
+    MdaPg,
+    /// PG13
+    #[serde(rename = "mdaPg13")]
+    MdaPg13,
+    /// NC16
+    #[serde(rename = "mdaNc16")]
+    MdaNc16,
+    /// M18
+    #[serde(rename = "mdaM18")]
+    MdaM18,
+    /// R21
+    #[serde(rename = "mdaR21")]
+    MdaR21,
+    #[serde(rename = "mdaUnrated")]
+    MdaUnrated,
+}
+
+impl std::default::Default for ContentRatingMdaRating {
+    fn default() -> ContentRatingMdaRating {
+        ContentRatingMdaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMdaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMdaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMdaRating::MdaUnspecified => write!(f, "mdaUnspecified"),
+            ContentRatingMdaRating::MdaG => write!(f, "mdaG"),
+            ContentRatingMdaRating::MdaPg => write!(f, "mdaPg"),
+            ContentRatingMdaRating::MdaPg13 => write!(f, "mdaPg13"),
+            ContentRatingMdaRating::MdaNc16 => write!(f, "mdaNc16"),
+            ContentRatingMdaRating::MdaM18 => write!(f, "mdaM18"),
+            ContentRatingMdaRating::MdaR21 => write!(f, "mdaR21"),
+            ContentRatingMdaRating::MdaUnrated => write!(f, "mdaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCnaRating {
+    Undefined,
+    #[serde(rename = "cnaUnspecified")]
+    CnaUnspecified,
+    /// AP
+    #[serde(rename = "cnaAp")]
+    CnaAp,
+    /// 12
+    #[serde(rename = "cna12")]
+    Cna12,
+    /// 15
+    #[serde(rename = "cna15")]
+    Cna15,
+    /// 18
+    #[serde(rename = "cna18")]
+    Cna18,
+    /// 18+
+    #[serde(rename = "cna18plus")]
+    Cna18plus,
+    #[serde(rename = "cnaUnrated")]
+    CnaUnrated,
+}
+
+impl std::default::Default for ContentRatingCnaRating {
+    fn default() -> ContentRatingCnaRating {
+        ContentRatingCnaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCnaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCnaRating::Undefined => write!(f, "undefined"),
+            ContentRatingCnaRating::CnaUnspecified => write!(f, "cnaUnspecified"),
+            ContentRatingCnaRating::CnaAp => write!(f, "cnaAp"),
+            ContentRatingCnaRating::Cna12 => write!(f, "cna12"),
+            ContentRatingCnaRating::Cna15 => write!(f, "cna15"),
+            ContentRatingCnaRating::Cna18 => write!(f, "cna18"),
+            ContentRatingCnaRating::Cna18plus => write!(f, "cna18plus"),
+            ContentRatingCnaRating::CnaUnrated => write!(f, "cnaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingDjctqRatingReasons {
+    Undefined,
+    #[serde(rename = "djctqRatingReasonUnspecified")]
+    DjctqRatingReasonUnspecified,
+    /// Brazil rating content descriptors. See http://go/brazilratings section F. Violência (Violence)
+    #[serde(rename = "djctqViolence")]
+    DjctqViolence,
+    /// Violência extrema (Extreme violence)
+    #[serde(rename = "djctqExtremeViolence")]
+    DjctqExtremeViolence,
+    /// Conteúdo sexual (Sexual content)
+    #[serde(rename = "djctqSexualContent")]
+    DjctqSexualContent,
+    /// Nudez (Nudity)
+    #[serde(rename = "djctqNudity")]
+    DjctqNudity,
+    /// Sexo (Sex)
+    #[serde(rename = "djctqSex")]
+    DjctqSex,
+    /// Sexo Explícito (Explicit sex)
+    #[serde(rename = "djctqExplicitSex")]
+    DjctqExplicitSex,
+    /// Drogas (Drugs)
+    #[serde(rename = "djctqDrugs")]
+    DjctqDrugs,
+    /// Drogas Lícitas (Legal drugs)
+    #[serde(rename = "djctqLegalDrugs")]
+    DjctqLegalDrugs,
+    /// Drogas Ilícitas (Illegal drugs)
+    #[serde(rename = "djctqIllegalDrugs")]
+    DjctqIllegalDrugs,
+    /// Linguagem Imprópria (Inappropriate language)
+    #[serde(rename = "djctqInappropriateLanguage")]
+    DjctqInappropriateLanguage,
+    /// Atos Criminosos (Criminal Acts)
+    #[serde(rename = "djctqCriminalActs")]
+    DjctqCriminalActs,
+    /// Conteúdo Impactante (Impacting content)
+    #[serde(rename = "djctqImpactingContent")]
+    DjctqImpactingContent,
+}
+
+impl std::default::Default for ContentRatingDjctqRatingReasons {
+    fn default() -> ContentRatingDjctqRatingReasons {
+        ContentRatingDjctqRatingReasons::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingDjctqRatingReasons {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingDjctqRatingReasons::Undefined => write!(f, "undefined"),
+            ContentRatingDjctqRatingReasons::DjctqRatingReasonUnspecified => {
+                write!(f, "djctqRatingReasonUnspecified")
+            }
+            ContentRatingDjctqRatingReasons::DjctqViolence => write!(f, "djctqViolence"),
+            ContentRatingDjctqRatingReasons::DjctqExtremeViolence => {
+                write!(f, "djctqExtremeViolence")
+            }
+            ContentRatingDjctqRatingReasons::DjctqSexualContent => write!(f, "djctqSexualContent"),
+            ContentRatingDjctqRatingReasons::DjctqNudity => write!(f, "djctqNudity"),
+            ContentRatingDjctqRatingReasons::DjctqSex => write!(f, "djctqSex"),
+            ContentRatingDjctqRatingReasons::DjctqExplicitSex => write!(f, "djctqExplicitSex"),
+            ContentRatingDjctqRatingReasons::DjctqDrugs => write!(f, "djctqDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqLegalDrugs => write!(f, "djctqLegalDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqIllegalDrugs => write!(f, "djctqIllegalDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqInappropriateLanguage => {
+                write!(f, "djctqInappropriateLanguage")
+            }
+            ContentRatingDjctqRatingReasons::DjctqCriminalActs => write!(f, "djctqCriminalActs"),
+            ContentRatingDjctqRatingReasons::DjctqImpactingContent => {
+                write!(f, "djctqImpactingContent")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFmocRating {
+    Undefined,
+    #[serde(rename = "fmocUnspecified")]
+    FmocUnspecified,
+    /// U
+    #[serde(rename = "fmocU")]
+    FmocU,
+    /// 10
+    #[serde(rename = "fmoc10")]
+    Fmoc10,
+    /// 12
+    #[serde(rename = "fmoc12")]
+    Fmoc12,
+    /// 16
+    #[serde(rename = "fmoc16")]
+    Fmoc16,
+    /// 18
+    #[serde(rename = "fmoc18")]
+    Fmoc18,
+    /// E
+    #[serde(rename = "fmocE")]
+    FmocE,
+    #[serde(rename = "fmocUnrated")]
+    FmocUnrated,
+}
+
+impl std::default::Default for ContentRatingFmocRating {
+    fn default() -> ContentRatingFmocRating {
+        ContentRatingFmocRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFmocRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFmocRating::Undefined => write!(f, "undefined"),
+            ContentRatingFmocRating::FmocUnspecified => write!(f, "fmocUnspecified"),
+            ContentRatingFmocRating::FmocU => write!(f, "fmocU"),
+            ContentRatingFmocRating::Fmoc10 => write!(f, "fmoc10"),
+            ContentRatingFmocRating::Fmoc12 => write!(f, "fmoc12"),
+            ContentRatingFmocRating::Fmoc16 => write!(f, "fmoc16"),
+            ContentRatingFmocRating::Fmoc18 => write!(f, "fmoc18"),
+            ContentRatingFmocRating::FmocE => write!(f, "fmocE"),
+            ContentRatingFmocRating::FmocUnrated => write!(f, "fmocUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingYtRating {
+    Undefined,
+    #[serde(rename = "ytUnspecified")]
+    YtUnspecified,
+    #[serde(rename = "ytAgeRestricted")]
+    YtAgeRestricted,
+}
+
+impl std::default::Default for ContentRatingYtRating {
+    fn default() -> ContentRatingYtRating {
+        ContentRatingYtRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingYtRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingYtRating::Undefined => write!(f, "undefined"),
+            ContentRatingYtRating::YtUnspecified => write!(f, "ytUnspecified"),
+            ContentRatingYtRating::YtAgeRestricted => write!(f, "ytAgeRestricted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMtrcbRating {
+    Undefined,
+    #[serde(rename = "mtrcbUnspecified")]
+    MtrcbUnspecified,
+    /// G
+    #[serde(rename = "mtrcbG")]
+    MtrcbG,
+    /// PG
+    #[serde(rename = "mtrcbPg")]
+    MtrcbPg,
+    /// R-13
+    #[serde(rename = "mtrcbR13")]
+    MtrcbR13,
+    /// R-16
+    #[serde(rename = "mtrcbR16")]
+    MtrcbR16,
+    /// R-18
+    #[serde(rename = "mtrcbR18")]
+    MtrcbR18,
+    /// X
+    #[serde(rename = "mtrcbX")]
+    MtrcbX,
+    #[serde(rename = "mtrcbUnrated")]
+    MtrcbUnrated,
+}
+
+impl std::default::Default for ContentRatingMtrcbRating {
+    fn default() -> ContentRatingMtrcbRating {
+        ContentRatingMtrcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMtrcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMtrcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingMtrcbRating::MtrcbUnspecified => write!(f, "mtrcbUnspecified"),
+            ContentRatingMtrcbRating::MtrcbG => write!(f, "mtrcbG"),
+            ContentRatingMtrcbRating::MtrcbPg => write!(f, "mtrcbPg"),
+            ContentRatingMtrcbRating::MtrcbR13 => write!(f, "mtrcbR13"),
+            ContentRatingMtrcbRating::MtrcbR16 => write!(f, "mtrcbR16"),
+            ContentRatingMtrcbRating::MtrcbR18 => write!(f, "mtrcbR18"),
+            ContentRatingMtrcbRating::MtrcbX => write!(f, "mtrcbX"),
+            ContentRatingMtrcbRating::MtrcbUnrated => write!(f, "mtrcbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAcbRating {
+    Undefined,
+    #[serde(rename = "acbUnspecified")]
+    AcbUnspecified,
+    /// E
+    #[serde(rename = "acbE")]
+    AcbE,
+    /// Programs that have been given a P classification by the Australian Communications and Media Authority. These programs are intended for preschool children.
+    #[serde(rename = "acbP")]
+    AcbP,
+    /// Programs that have been given a C classification by the Australian Communications and Media Authority. These programs are intended for children (other than preschool children) who are younger than 14 years of age.
+    #[serde(rename = "acbC")]
+    AcbC,
+    /// G
+    #[serde(rename = "acbG")]
+    AcbG,
+    /// PG
+    #[serde(rename = "acbPg")]
+    AcbPg,
+    /// M
+    #[serde(rename = "acbM")]
+    AcbM,
+    /// MA15+
+    #[serde(rename = "acbMa15plus")]
+    AcbMa15plus,
+    /// R18+
+    #[serde(rename = "acbR18plus")]
+    AcbR18plus,
+    #[serde(rename = "acbUnrated")]
+    AcbUnrated,
+}
+
+impl std::default::Default for ContentRatingAcbRating {
+    fn default() -> ContentRatingAcbRating {
+        ContentRatingAcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingAcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingAcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingAcbRating::AcbUnspecified => write!(f, "acbUnspecified"),
+            ContentRatingAcbRating::AcbE => write!(f, "acbE"),
+            ContentRatingAcbRating::AcbP => write!(f, "acbP"),
+            ContentRatingAcbRating::AcbC => write!(f, "acbC"),
+            ContentRatingAcbRating::AcbG => write!(f, "acbG"),
+            ContentRatingAcbRating::AcbPg => write!(f, "acbPg"),
+            ContentRatingAcbRating::AcbM => write!(f, "acbM"),
+            ContentRatingAcbRating::AcbMa15plus => write!(f, "acbMa15plus"),
+            ContentRatingAcbRating::AcbR18plus => write!(f, "acbR18plus"),
+            ContentRatingAcbRating::AcbUnrated => write!(f, "acbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMekuRating {
+    Undefined,
+    #[serde(rename = "mekuUnspecified")]
+    MekuUnspecified,
+    /// S
+    #[serde(rename = "mekuS")]
+    MekuS,
+    /// 7
+    #[serde(rename = "meku7")]
+    Meku7,
+    /// 12
+    #[serde(rename = "meku12")]
+    Meku12,
+    /// 16
+    #[serde(rename = "meku16")]
+    Meku16,
+    /// 18
+    #[serde(rename = "meku18")]
+    Meku18,
+    #[serde(rename = "mekuUnrated")]
+    MekuUnrated,
+}
+
+impl std::default::Default for ContentRatingMekuRating {
+    fn default() -> ContentRatingMekuRating {
+        ContentRatingMekuRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMekuRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMekuRating::Undefined => write!(f, "undefined"),
+            ContentRatingMekuRating::MekuUnspecified => write!(f, "mekuUnspecified"),
+            ContentRatingMekuRating::MekuS => write!(f, "mekuS"),
+            ContentRatingMekuRating::Meku7 => write!(f, "meku7"),
+            ContentRatingMekuRating::Meku12 => write!(f, "meku12"),
+            ContentRatingMekuRating::Meku16 => write!(f, "meku16"),
+            ContentRatingMekuRating::Meku18 => write!(f, "meku18"),
+            ContentRatingMekuRating::MekuUnrated => write!(f, "mekuUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingLsfRating {
+    Undefined,
+    #[serde(rename = "lsfUnspecified")]
+    LsfUnspecified,
+    /// SU
+    #[serde(rename = "lsfSu")]
+    LsfSu,
+    /// A
+    #[serde(rename = "lsfA")]
+    LsfA,
+    /// BO
+    #[serde(rename = "lsfBo")]
+    LsfBo,
+    /// 13
+    #[serde(rename = "lsf13")]
+    Lsf13,
+    /// R
+    #[serde(rename = "lsfR")]
+    LsfR,
+    /// 17
+    #[serde(rename = "lsf17")]
+    Lsf17,
+    /// D
+    #[serde(rename = "lsfD")]
+    LsfD,
+    /// 21
+    #[serde(rename = "lsf21")]
+    Lsf21,
+    #[serde(rename = "lsfUnrated")]
+    LsfUnrated,
+}
+
+impl std::default::Default for ContentRatingLsfRating {
+    fn default() -> ContentRatingLsfRating {
+        ContentRatingLsfRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingLsfRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingLsfRating::Undefined => write!(f, "undefined"),
+            ContentRatingLsfRating::LsfUnspecified => write!(f, "lsfUnspecified"),
+            ContentRatingLsfRating::LsfSu => write!(f, "lsfSu"),
+            ContentRatingLsfRating::LsfA => write!(f, "lsfA"),
+            ContentRatingLsfRating::LsfBo => write!(f, "lsfBo"),
+            ContentRatingLsfRating::Lsf13 => write!(f, "lsf13"),
+            ContentRatingLsfRating::LsfR => write!(f, "lsfR"),
+            ContentRatingLsfRating::Lsf17 => write!(f, "lsf17"),
+            ContentRatingLsfRating::LsfD => write!(f, "lsfD"),
+            ContentRatingLsfRating::Lsf21 => write!(f, "lsf21"),
+            ContentRatingLsfRating::LsfUnrated => write!(f, "lsfUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIfcoRating {
+    Undefined,
+    #[serde(rename = "ifcoUnspecified")]
+    IfcoUnspecified,
+    /// G
+    #[serde(rename = "ifcoG")]
+    IfcoG,
+    /// PG
+    #[serde(rename = "ifcoPg")]
+    IfcoPg,
+    /// 12
+    #[serde(rename = "ifco12")]
+    Ifco12,
+    /// 12A
+    #[serde(rename = "ifco12a")]
+    Ifco12a,
+    /// 15
+    #[serde(rename = "ifco15")]
+    Ifco15,
+    /// 15A
+    #[serde(rename = "ifco15a")]
+    Ifco15a,
+    /// 16
+    #[serde(rename = "ifco16")]
+    Ifco16,
+    /// 18
+    #[serde(rename = "ifco18")]
+    Ifco18,
+    #[serde(rename = "ifcoUnrated")]
+    IfcoUnrated,
+}
+
+impl std::default::Default for ContentRatingIfcoRating {
+    fn default() -> ContentRatingIfcoRating {
+        ContentRatingIfcoRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIfcoRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIfcoRating::Undefined => write!(f, "undefined"),
+            ContentRatingIfcoRating::IfcoUnspecified => write!(f, "ifcoUnspecified"),
+            ContentRatingIfcoRating::IfcoG => write!(f, "ifcoG"),
+            ContentRatingIfcoRating::IfcoPg => write!(f, "ifcoPg"),
+            ContentRatingIfcoRating::Ifco12 => write!(f, "ifco12"),
+            ContentRatingIfcoRating::Ifco12a => write!(f, "ifco12a"),
+            ContentRatingIfcoRating::Ifco15 => write!(f, "ifco15"),
+            ContentRatingIfcoRating::Ifco15a => write!(f, "ifco15a"),
+            ContentRatingIfcoRating::Ifco16 => write!(f, "ifco16"),
+            ContentRatingIfcoRating::Ifco18 => write!(f, "ifco18"),
+            ContentRatingIfcoRating::IfcoUnrated => write!(f, "ifcoUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEcbmctRating {
+    Undefined,
+    #[serde(rename = "ecbmctUnspecified")]
+    EcbmctUnspecified,
+    /// G
+    #[serde(rename = "ecbmctG")]
+    EcbmctG,
+    /// 7A
+    #[serde(rename = "ecbmct7a")]
+    Ecbmct7a,
+    /// 7+
+    #[serde(rename = "ecbmct7plus")]
+    Ecbmct7plus,
+    /// 13A
+    #[serde(rename = "ecbmct13a")]
+    Ecbmct13a,
+    /// 13+
+    #[serde(rename = "ecbmct13plus")]
+    Ecbmct13plus,
+    /// 15A
+    #[serde(rename = "ecbmct15a")]
+    Ecbmct15a,
+    /// 15+
+    #[serde(rename = "ecbmct15plus")]
+    Ecbmct15plus,
+    /// 18+
+    #[serde(rename = "ecbmct18plus")]
+    Ecbmct18plus,
+    #[serde(rename = "ecbmctUnrated")]
+    EcbmctUnrated,
+}
+
+impl std::default::Default for ContentRatingEcbmctRating {
+    fn default() -> ContentRatingEcbmctRating {
+        ContentRatingEcbmctRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEcbmctRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEcbmctRating::Undefined => write!(f, "undefined"),
+            ContentRatingEcbmctRating::EcbmctUnspecified => write!(f, "ecbmctUnspecified"),
+            ContentRatingEcbmctRating::EcbmctG => write!(f, "ecbmctG"),
+            ContentRatingEcbmctRating::Ecbmct7a => write!(f, "ecbmct7a"),
+            ContentRatingEcbmctRating::Ecbmct7plus => write!(f, "ecbmct7plus"),
+            ContentRatingEcbmctRating::Ecbmct13a => write!(f, "ecbmct13a"),
+            ContentRatingEcbmctRating::Ecbmct13plus => write!(f, "ecbmct13plus"),
+            ContentRatingEcbmctRating::Ecbmct15a => write!(f, "ecbmct15a"),
+            ContentRatingEcbmctRating::Ecbmct15plus => write!(f, "ecbmct15plus"),
+            ContentRatingEcbmctRating::Ecbmct18plus => write!(f, "ecbmct18plus"),
+            ContentRatingEcbmctRating::EcbmctUnrated => write!(f, "ecbmctUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNbcRating {
+    Undefined,
+    #[serde(rename = "nbcUnspecified")]
+    NbcUnspecified,
+    /// G
+    #[serde(rename = "nbcG")]
+    NbcG,
+    /// PG
+    #[serde(rename = "nbcPg")]
+    NbcPg,
+    /// 12+
+    #[serde(rename = "nbc12plus")]
+    Nbc12plus,
+    /// 15+
+    #[serde(rename = "nbc15plus")]
+    Nbc15plus,
+    /// 18+
+    #[serde(rename = "nbc18plus")]
+    Nbc18plus,
+    /// 18+R
+    #[serde(rename = "nbc18plusr")]
+    Nbc18plusr,
+    /// PU
+    #[serde(rename = "nbcPu")]
+    NbcPu,
+    #[serde(rename = "nbcUnrated")]
+    NbcUnrated,
+}
+
+impl std::default::Default for ContentRatingNbcRating {
+    fn default() -> ContentRatingNbcRating {
+        ContentRatingNbcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNbcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNbcRating::Undefined => write!(f, "undefined"),
+            ContentRatingNbcRating::NbcUnspecified => write!(f, "nbcUnspecified"),
+            ContentRatingNbcRating::NbcG => write!(f, "nbcG"),
+            ContentRatingNbcRating::NbcPg => write!(f, "nbcPg"),
+            ContentRatingNbcRating::Nbc12plus => write!(f, "nbc12plus"),
+            ContentRatingNbcRating::Nbc15plus => write!(f, "nbc15plus"),
+            ContentRatingNbcRating::Nbc18plus => write!(f, "nbc18plus"),
+            ContentRatingNbcRating::Nbc18plusr => write!(f, "nbc18plusr"),
+            ContentRatingNbcRating::NbcPu => write!(f, "nbcPu"),
+            ContentRatingNbcRating::NbcUnrated => write!(f, "nbcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAgcomRating {
+    Undefined,
+    #[serde(rename = "agcomUnspecified")]
+    AgcomUnspecified,
+    /// T
+    #[serde(rename = "agcomT")]
+    AgcomT,
+    /// VM14
+    #[serde(rename = "agcomVm14")]
+    AgcomVm14,
+    /// VM18
+    #[serde(rename = "agcomVm18")]
+    AgcomVm18,
+    #[serde(rename = "agcomUnrated")]
+    AgcomUnrated,
+}
+
+impl std::default::Default for ContentRatingAgcomRating {
+    fn default() -> ContentRatingAgcomRating {
+        ContentRatingAgcomRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingAgcomRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingAgcomRating::Undefined => write!(f, "undefined"),
+            ContentRatingAgcomRating::AgcomUnspecified => write!(f, "agcomUnspecified"),
+            ContentRatingAgcomRating::AgcomT => write!(f, "agcomT"),
+            ContentRatingAgcomRating::AgcomVm14 => write!(f, "agcomVm14"),
+            ContentRatingAgcomRating::AgcomVm18 => write!(f, "agcomVm18"),
+            ContentRatingAgcomRating::AgcomUnrated => write!(f, "agcomUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMibacRating {
+    Undefined,
+    #[serde(rename = "mibacUnspecified")]
+    MibacUnspecified,
+    #[serde(rename = "mibacT")]
+    MibacT,
+    #[serde(rename = "mibacVap")]
+    MibacVap,
+    #[serde(rename = "mibacVm12")]
+    MibacVm12,
+    #[serde(rename = "mibacVm14")]
+    MibacVm14,
+    #[serde(rename = "mibacVm18")]
+    MibacVm18,
+    #[serde(rename = "mibacUnrated")]
+    MibacUnrated,
+}
+
+impl std::default::Default for ContentRatingMibacRating {
+    fn default() -> ContentRatingMibacRating {
+        ContentRatingMibacRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMibacRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMibacRating::Undefined => write!(f, "undefined"),
+            ContentRatingMibacRating::MibacUnspecified => write!(f, "mibacUnspecified"),
+            ContentRatingMibacRating::MibacT => write!(f, "mibacT"),
+            ContentRatingMibacRating::MibacVap => write!(f, "mibacVap"),
+            ContentRatingMibacRating::MibacVm12 => write!(f, "mibacVm12"),
+            ContentRatingMibacRating::MibacVm14 => write!(f, "mibacVm14"),
+            ContentRatingMibacRating::MibacVm18 => write!(f, "mibacVm18"),
+            ContentRatingMibacRating::MibacUnrated => write!(f, "mibacUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIcaaRating {
+    Undefined,
+    #[serde(rename = "icaaUnspecified")]
+    IcaaUnspecified,
+    /// APTA
+    #[serde(rename = "icaaApta")]
+    IcaaApta,
+    /// 7
+    #[serde(rename = "icaa7")]
+    Icaa7,
+    /// 12
+    #[serde(rename = "icaa12")]
+    Icaa12,
+    /// 13
+    #[serde(rename = "icaa13")]
+    Icaa13,
+    /// 16
+    #[serde(rename = "icaa16")]
+    Icaa16,
+    /// 18
+    #[serde(rename = "icaa18")]
+    Icaa18,
+    /// X
+    #[serde(rename = "icaaX")]
+    IcaaX,
+    #[serde(rename = "icaaUnrated")]
+    IcaaUnrated,
+}
+
+impl std::default::Default for ContentRatingIcaaRating {
+    fn default() -> ContentRatingIcaaRating {
+        ContentRatingIcaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIcaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIcaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingIcaaRating::IcaaUnspecified => write!(f, "icaaUnspecified"),
+            ContentRatingIcaaRating::IcaaApta => write!(f, "icaaApta"),
+            ContentRatingIcaaRating::Icaa7 => write!(f, "icaa7"),
+            ContentRatingIcaaRating::Icaa12 => write!(f, "icaa12"),
+            ContentRatingIcaaRating::Icaa13 => write!(f, "icaa13"),
+            ContentRatingIcaaRating::Icaa16 => write!(f, "icaa16"),
+            ContentRatingIcaaRating::Icaa18 => write!(f, "icaa18"),
+            ContentRatingIcaaRating::IcaaX => write!(f, "icaaX"),
+            ContentRatingIcaaRating::IcaaUnrated => write!(f, "icaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMpaatRating {
+    Undefined,
+    #[serde(rename = "mpaatUnspecified")]
+    MpaatUnspecified,
+    /// GB
+    #[serde(rename = "mpaatGb")]
+    MpaatGb,
+    /// RB
+    #[serde(rename = "mpaatRb")]
+    MpaatRb,
+}
+
+impl std::default::Default for ContentRatingMpaatRating {
+    fn default() -> ContentRatingMpaatRating {
+        ContentRatingMpaatRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMpaatRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMpaatRating::Undefined => write!(f, "undefined"),
+            ContentRatingMpaatRating::MpaatUnspecified => write!(f, "mpaatUnspecified"),
+            ContentRatingMpaatRating::MpaatGb => write!(f, "mpaatGb"),
+            ContentRatingMpaatRating::MpaatRb => write!(f, "mpaatRb"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMedietilsynetRating {
+    Undefined,
+    #[serde(rename = "medietilsynetUnspecified")]
+    MedietilsynetUnspecified,
+    /// A
+    #[serde(rename = "medietilsynetA")]
+    MedietilsynetA,
+    /// 6
+    #[serde(rename = "medietilsynet6")]
+    Medietilsynet6,
+    /// 7
+    #[serde(rename = "medietilsynet7")]
+    Medietilsynet7,
+    /// 9
+    #[serde(rename = "medietilsynet9")]
+    Medietilsynet9,
+    /// 11
+    #[serde(rename = "medietilsynet11")]
+    Medietilsynet11,
+    /// 12
+    #[serde(rename = "medietilsynet12")]
+    Medietilsynet12,
+    /// 15
+    #[serde(rename = "medietilsynet15")]
+    Medietilsynet15,
+    /// 18
+    #[serde(rename = "medietilsynet18")]
+    Medietilsynet18,
+    #[serde(rename = "medietilsynetUnrated")]
+    MedietilsynetUnrated,
+}
+
+impl std::default::Default for ContentRatingMedietilsynetRating {
+    fn default() -> ContentRatingMedietilsynetRating {
+        ContentRatingMedietilsynetRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMedietilsynetRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMedietilsynetRating::Undefined => write!(f, "undefined"),
+            ContentRatingMedietilsynetRating::MedietilsynetUnspecified => {
+                write!(f, "medietilsynetUnspecified")
+            }
+            ContentRatingMedietilsynetRating::MedietilsynetA => write!(f, "medietilsynetA"),
+            ContentRatingMedietilsynetRating::Medietilsynet6 => write!(f, "medietilsynet6"),
+            ContentRatingMedietilsynetRating::Medietilsynet7 => write!(f, "medietilsynet7"),
+            ContentRatingMedietilsynetRating::Medietilsynet9 => write!(f, "medietilsynet9"),
+            ContentRatingMedietilsynetRating::Medietilsynet11 => write!(f, "medietilsynet11"),
+            ContentRatingMedietilsynetRating::Medietilsynet12 => write!(f, "medietilsynet12"),
+            ContentRatingMedietilsynetRating::Medietilsynet15 => write!(f, "medietilsynet15"),
+            ContentRatingMedietilsynetRating::Medietilsynet18 => write!(f, "medietilsynet18"),
+            ContentRatingMedietilsynetRating::MedietilsynetUnrated => {
+                write!(f, "medietilsynetUnrated")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingGrfilmRating {
+    Undefined,
+    #[serde(rename = "grfilmUnspecified")]
+    GrfilmUnspecified,
+    /// K
+    #[serde(rename = "grfilmK")]
+    GrfilmK,
+    /// E
+    #[serde(rename = "grfilmE")]
+    GrfilmE,
+    /// K-12
+    #[serde(rename = "grfilmK12")]
+    GrfilmK12,
+    /// K-13
+    #[serde(rename = "grfilmK13")]
+    GrfilmK13,
+    /// K-15
+    #[serde(rename = "grfilmK15")]
+    GrfilmK15,
+    /// K-17
+    #[serde(rename = "grfilmK17")]
+    GrfilmK17,
+    /// K-18
+    #[serde(rename = "grfilmK18")]
+    GrfilmK18,
+    #[serde(rename = "grfilmUnrated")]
+    GrfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingGrfilmRating {
+    fn default() -> ContentRatingGrfilmRating {
+        ContentRatingGrfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingGrfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingGrfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingGrfilmRating::GrfilmUnspecified => write!(f, "grfilmUnspecified"),
+            ContentRatingGrfilmRating::GrfilmK => write!(f, "grfilmK"),
+            ContentRatingGrfilmRating::GrfilmE => write!(f, "grfilmE"),
+            ContentRatingGrfilmRating::GrfilmK12 => write!(f, "grfilmK12"),
+            ContentRatingGrfilmRating::GrfilmK13 => write!(f, "grfilmK13"),
+            ContentRatingGrfilmRating::GrfilmK15 => write!(f, "grfilmK15"),
+            ContentRatingGrfilmRating::GrfilmK17 => write!(f, "grfilmK17"),
+            ContentRatingGrfilmRating::GrfilmK18 => write!(f, "grfilmK18"),
+            ContentRatingGrfilmRating::GrfilmUnrated => write!(f, "grfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEirinRating {
+    Undefined,
+    #[serde(rename = "eirinUnspecified")]
+    EirinUnspecified,
+    /// G
+    #[serde(rename = "eirinG")]
+    EirinG,
+    /// PG-12
+    #[serde(rename = "eirinPg12")]
+    EirinPg12,
+    /// R15+
+    #[serde(rename = "eirinR15plus")]
+    EirinR15plus,
+    /// R18+
+    #[serde(rename = "eirinR18plus")]
+    EirinR18plus,
+    #[serde(rename = "eirinUnrated")]
+    EirinUnrated,
+}
+
+impl std::default::Default for ContentRatingEirinRating {
+    fn default() -> ContentRatingEirinRating {
+        ContentRatingEirinRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEirinRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEirinRating::Undefined => write!(f, "undefined"),
+            ContentRatingEirinRating::EirinUnspecified => write!(f, "eirinUnspecified"),
+            ContentRatingEirinRating::EirinG => write!(f, "eirinG"),
+            ContentRatingEirinRating::EirinPg12 => write!(f, "eirinPg12"),
+            ContentRatingEirinRating::EirinR15plus => write!(f, "eirinR15plus"),
+            ContentRatingEirinRating::EirinR18plus => write!(f, "eirinR18plus"),
+            ContentRatingEirinRating::EirinUnrated => write!(f, "eirinUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNbcplRating {
+    Undefined,
+    #[serde(rename = "nbcplUnspecified")]
+    NbcplUnspecified,
+    #[serde(rename = "nbcplI")]
+    NbcplI,
+    #[serde(rename = "nbcplIi")]
+    NbcplIi,
+    #[serde(rename = "nbcplIii")]
+    NbcplIii,
+    #[serde(rename = "nbcplIv")]
+    NbcplIv,
+    #[serde(rename = "nbcpl18plus")]
+    Nbcpl18plus,
+    #[serde(rename = "nbcplUnrated")]
+    NbcplUnrated,
+}
+
+impl std::default::Default for ContentRatingNbcplRating {
+    fn default() -> ContentRatingNbcplRating {
+        ContentRatingNbcplRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNbcplRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNbcplRating::Undefined => write!(f, "undefined"),
+            ContentRatingNbcplRating::NbcplUnspecified => write!(f, "nbcplUnspecified"),
+            ContentRatingNbcplRating::NbcplI => write!(f, "nbcplI"),
+            ContentRatingNbcplRating::NbcplIi => write!(f, "nbcplIi"),
+            ContentRatingNbcplRating::NbcplIii => write!(f, "nbcplIii"),
+            ContentRatingNbcplRating::NbcplIv => write!(f, "nbcplIv"),
+            ContentRatingNbcplRating::Nbcpl18plus => write!(f, "nbcpl18plus"),
+            ContentRatingNbcplRating::NbcplUnrated => write!(f, "nbcplUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingPefilmRating {
+    Undefined,
+    #[serde(rename = "pefilmUnspecified")]
+    PefilmUnspecified,
+    /// PT
+    #[serde(rename = "pefilmPt")]
+    PefilmPt,
+    /// PG
+    #[serde(rename = "pefilmPg")]
+    PefilmPg,
+    /// 14
+    #[serde(rename = "pefilm14")]
+    Pefilm14,
+    /// 18
+    #[serde(rename = "pefilm18")]
+    Pefilm18,
+    #[serde(rename = "pefilmUnrated")]
+    PefilmUnrated,
+}
+
+impl std::default::Default for ContentRatingPefilmRating {
+    fn default() -> ContentRatingPefilmRating {
+        ContentRatingPefilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingPefilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingPefilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingPefilmRating::PefilmUnspecified => write!(f, "pefilmUnspecified"),
+            ContentRatingPefilmRating::PefilmPt => write!(f, "pefilmPt"),
+            ContentRatingPefilmRating::PefilmPg => write!(f, "pefilmPg"),
+            ContentRatingPefilmRating::Pefilm14 => write!(f, "pefilm14"),
+            ContentRatingPefilmRating::Pefilm18 => write!(f, "pefilm18"),
+            ContentRatingPefilmRating::PefilmUnrated => write!(f, "pefilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFskRating {
+    Undefined,
+    #[serde(rename = "fskUnspecified")]
+    FskUnspecified,
+    /// FSK 0
+    #[serde(rename = "fsk0")]
+    Fsk0,
+    /// FSK 6
+    #[serde(rename = "fsk6")]
+    Fsk6,
+    /// FSK 12
+    #[serde(rename = "fsk12")]
+    Fsk12,
+    /// FSK 16
+    #[serde(rename = "fsk16")]
+    Fsk16,
+    /// FSK 18
+    #[serde(rename = "fsk18")]
+    Fsk18,
+    #[serde(rename = "fskUnrated")]
+    FskUnrated,
+}
+
+impl std::default::Default for ContentRatingFskRating {
+    fn default() -> ContentRatingFskRating {
+        ContentRatingFskRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFskRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFskRating::Undefined => write!(f, "undefined"),
+            ContentRatingFskRating::FskUnspecified => write!(f, "fskUnspecified"),
+            ContentRatingFskRating::Fsk0 => write!(f, "fsk0"),
+            ContentRatingFskRating::Fsk6 => write!(f, "fsk6"),
+            ContentRatingFskRating::Fsk12 => write!(f, "fsk12"),
+            ContentRatingFskRating::Fsk16 => write!(f, "fsk16"),
+            ContentRatingFskRating::Fsk18 => write!(f, "fsk18"),
+            ContentRatingFskRating::FskUnrated => write!(f, "fskUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingOflcRating {
+    Undefined,
+    #[serde(rename = "oflcUnspecified")]
+    OflcUnspecified,
+    /// G
+    #[serde(rename = "oflcG")]
+    OflcG,
+    /// PG
+    #[serde(rename = "oflcPg")]
+    OflcPg,
+    /// M
+    #[serde(rename = "oflcM")]
+    OflcM,
+    /// R13
+    #[serde(rename = "oflcR13")]
+    OflcR13,
+    /// R15
+    #[serde(rename = "oflcR15")]
+    OflcR15,
+    /// R16
+    #[serde(rename = "oflcR16")]
+    OflcR16,
+    /// R18
+    #[serde(rename = "oflcR18")]
+    OflcR18,
+    #[serde(rename = "oflcUnrated")]
+    OflcUnrated,
+    /// RP13
+    #[serde(rename = "oflcRp13")]
+    OflcRp13,
+    /// RP16
+    #[serde(rename = "oflcRp16")]
+    OflcRp16,
+    /// RP18
+    #[serde(rename = "oflcRp18")]
+    OflcRp18,
+}
+
+impl std::default::Default for ContentRatingOflcRating {
+    fn default() -> ContentRatingOflcRating {
+        ContentRatingOflcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingOflcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingOflcRating::Undefined => write!(f, "undefined"),
+            ContentRatingOflcRating::OflcUnspecified => write!(f, "oflcUnspecified"),
+            ContentRatingOflcRating::OflcG => write!(f, "oflcG"),
+            ContentRatingOflcRating::OflcPg => write!(f, "oflcPg"),
+            ContentRatingOflcRating::OflcM => write!(f, "oflcM"),
+            ContentRatingOflcRating::OflcR13 => write!(f, "oflcR13"),
+            ContentRatingOflcRating::OflcR15 => write!(f, "oflcR15"),
+            ContentRatingOflcRating::OflcR16 => write!(f, "oflcR16"),
+            ContentRatingOflcRating::OflcR18 => write!(f, "oflcR18"),
+            ContentRatingOflcRating::OflcUnrated => write!(f, "oflcUnrated"),
+            ContentRatingOflcRating::OflcRp13 => write!(f, "oflcRp13"),
+            ContentRatingOflcRating::OflcRp16 => write!(f, "oflcRp16"),
+            ContentRatingOflcRating::OflcRp18 => write!(f, "oflcRp18"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSmsaRating {
+    Undefined,
+    #[serde(rename = "smsaUnspecified")]
+    SmsaUnspecified,
+    /// All ages
+    #[serde(rename = "smsaA")]
+    SmsaA,
+    /// 7
+    #[serde(rename = "smsa7")]
+    Smsa7,
+    /// 11
+    #[serde(rename = "smsa11")]
+    Smsa11,
+    /// 15
+    #[serde(rename = "smsa15")]
+    Smsa15,
+    #[serde(rename = "smsaUnrated")]
+    SmsaUnrated,
+}
+
+impl std::default::Default for ContentRatingSmsaRating {
+    fn default() -> ContentRatingSmsaRating {
+        ContentRatingSmsaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingSmsaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingSmsaRating::Undefined => write!(f, "undefined"),
+            ContentRatingSmsaRating::SmsaUnspecified => write!(f, "smsaUnspecified"),
+            ContentRatingSmsaRating::SmsaA => write!(f, "smsaA"),
+            ContentRatingSmsaRating::Smsa7 => write!(f, "smsa7"),
+            ContentRatingSmsaRating::Smsa11 => write!(f, "smsa11"),
+            ContentRatingSmsaRating::Smsa15 => write!(f, "smsa15"),
+            ContentRatingSmsaRating::SmsaUnrated => write!(f, "smsaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEgfilmRating {
+    Undefined,
+    #[serde(rename = "egfilmUnspecified")]
+    EgfilmUnspecified,
+    /// GN
+    #[serde(rename = "egfilmGn")]
+    EgfilmGn,
+    /// 18
+    #[serde(rename = "egfilm18")]
+    Egfilm18,
+    /// BN
+    #[serde(rename = "egfilmBn")]
+    EgfilmBn,
+    #[serde(rename = "egfilmUnrated")]
+    EgfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingEgfilmRating {
+    fn default() -> ContentRatingEgfilmRating {
+        ContentRatingEgfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEgfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEgfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingEgfilmRating::EgfilmUnspecified => write!(f, "egfilmUnspecified"),
+            ContentRatingEgfilmRating::EgfilmGn => write!(f, "egfilmGn"),
+            ContentRatingEgfilmRating::Egfilm18 => write!(f, "egfilm18"),
+            ContentRatingEgfilmRating::EgfilmBn => write!(f, "egfilmBn"),
+            ContentRatingEgfilmRating::EgfilmUnrated => write!(f, "egfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSmaisRating {
+    Undefined,
+    #[serde(rename = "smaisUnspecified")]
+    SmaisUnspecified,
+    /// L
+    #[serde(rename = "smaisL")]
+    SmaisL,
+    /// 7
+    #[serde(rename = "smais7")]
+    Smais7,
+    /// 12
+    #[serde(rename = "smais12")]
+    Smais12,
+    /// 14
+    #[serde(rename = "smais14")]
+    Smais14,
+    /// 16
+    #[serde(rename = "smais16")]
+    Smais16,
+    /// 18
+    #[serde(rename = "smais18")]
+    Smais18,
+    #[serde(rename = "smaisUnrated")]
+    SmaisUnrated,
+}
+
+impl std::default::Default for ContentRatingSmaisRating {
+    fn default() -> ContentRatingSmaisRating {
+        ContentRatingSmaisRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingSmaisRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingSmaisRating::Undefined => write!(f, "undefined"),
+            ContentRatingSmaisRating::SmaisUnspecified => write!(f, "smaisUnspecified"),
+            ContentRatingSmaisRating::SmaisL => write!(f, "smaisL"),
+            ContentRatingSmaisRating::Smais7 => write!(f, "smais7"),
+            ContentRatingSmaisRating::Smais12 => write!(f, "smais12"),
+            ContentRatingSmaisRating::Smais14 => write!(f, "smais14"),
+            ContentRatingSmaisRating::Smais16 => write!(f, "smais16"),
+            ContentRatingSmaisRating::Smais18 => write!(f, "smais18"),
+            ContentRatingSmaisRating::SmaisUnrated => write!(f, "smaisUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCscfRating {
+    Undefined,
+    #[serde(rename = "cscfUnspecified")]
+    CscfUnspecified,
+    /// AL
+    #[serde(rename = "cscfAl")]
+    CscfAl,
+    /// A
+    #[serde(rename = "cscfA")]
+    CscfA,
+    /// 6
+    #[serde(rename = "cscf6")]
+    Cscf6,
+    /// 9
+    #[serde(rename = "cscf9")]
+    Cscf9,
+    /// 12
+    #[serde(rename = "cscf12")]
+    Cscf12,
+    /// 16
+    #[serde(rename = "cscf16")]
+    Cscf16,
+    /// 18
+    #[serde(rename = "cscf18")]
+    Cscf18,
+    #[serde(rename = "cscfUnrated")]
+    CscfUnrated,
+}
+
+impl std::default::Default for ContentRatingCscfRating {
+    fn default() -> ContentRatingCscfRating {
+        ContentRatingCscfRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCscfRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCscfRating::Undefined => write!(f, "undefined"),
+            ContentRatingCscfRating::CscfUnspecified => write!(f, "cscfUnspecified"),
+            ContentRatingCscfRating::CscfAl => write!(f, "cscfAl"),
+            ContentRatingCscfRating::CscfA => write!(f, "cscfA"),
+            ContentRatingCscfRating::Cscf6 => write!(f, "cscf6"),
+            ContentRatingCscfRating::Cscf9 => write!(f, "cscf9"),
+            ContentRatingCscfRating::Cscf12 => write!(f, "cscf12"),
+            ContentRatingCscfRating::Cscf16 => write!(f, "cscf16"),
+            ContentRatingCscfRating::Cscf18 => write!(f, "cscf18"),
+            ContentRatingCscfRating::CscfUnrated => write!(f, "cscfUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCatvfrRating {
+    Undefined,
+    #[serde(rename = "catvfrUnspecified")]
+    CatvfrUnspecified,
+    /// G
+    #[serde(rename = "catvfrG")]
+    CatvfrG,
+    /// 8+
+    #[serde(rename = "catvfr8plus")]
+    Catvfr8plus,
+    /// 13+
+    #[serde(rename = "catvfr13plus")]
+    Catvfr13plus,
+    /// 16+
+    #[serde(rename = "catvfr16plus")]
+    Catvfr16plus,
+    /// 18+
+    #[serde(rename = "catvfr18plus")]
+    Catvfr18plus,
+    #[serde(rename = "catvfrUnrated")]
+    CatvfrUnrated,
+    #[serde(rename = "catvfrE")]
+    CatvfrE,
+}
+
+impl std::default::Default for ContentRatingCatvfrRating {
+    fn default() -> ContentRatingCatvfrRating {
+        ContentRatingCatvfrRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCatvfrRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCatvfrRating::Undefined => write!(f, "undefined"),
+            ContentRatingCatvfrRating::CatvfrUnspecified => write!(f, "catvfrUnspecified"),
+            ContentRatingCatvfrRating::CatvfrG => write!(f, "catvfrG"),
+            ContentRatingCatvfrRating::Catvfr8plus => write!(f, "catvfr8plus"),
+            ContentRatingCatvfrRating::Catvfr13plus => write!(f, "catvfr13plus"),
+            ContentRatingCatvfrRating::Catvfr16plus => write!(f, "catvfr16plus"),
+            ContentRatingCatvfrRating::Catvfr18plus => write!(f, "catvfr18plus"),
+            ContentRatingCatvfrRating::CatvfrUnrated => write!(f, "catvfrUnrated"),
+            ContentRatingCatvfrRating::CatvfrE => write!(f, "catvfrE"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCceRating {
+    Undefined,
+    #[serde(rename = "cceUnspecified")]
+    CceUnspecified,
+    /// 4
+    #[serde(rename = "cceM4")]
+    CceM4,
+    /// 6
+    #[serde(rename = "cceM6")]
+    CceM6,
+    /// 12
+    #[serde(rename = "cceM12")]
+    CceM12,
+    /// 16
+    #[serde(rename = "cceM16")]
+    CceM16,
+    /// 18
+    #[serde(rename = "cceM18")]
+    CceM18,
+    #[serde(rename = "cceUnrated")]
+    CceUnrated,
+    /// 14
+    #[serde(rename = "cceM14")]
+    CceM14,
+}
+
+impl std::default::Default for ContentRatingCceRating {
+    fn default() -> ContentRatingCceRating {
+        ContentRatingCceRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCceRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCceRating::Undefined => write!(f, "undefined"),
+            ContentRatingCceRating::CceUnspecified => write!(f, "cceUnspecified"),
+            ContentRatingCceRating::CceM4 => write!(f, "cceM4"),
+            ContentRatingCceRating::CceM6 => write!(f, "cceM6"),
+            ContentRatingCceRating::CceM12 => write!(f, "cceM12"),
+            ContentRatingCceRating::CceM16 => write!(f, "cceM16"),
+            ContentRatingCceRating::CceM18 => write!(f, "cceM18"),
+            ContentRatingCceRating::CceUnrated => write!(f, "cceUnrated"),
+            ContentRatingCceRating::CceM14 => write!(f, "cceM14"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFpbRating {
+    Undefined,
+    #[serde(rename = "fpbUnspecified")]
+    FpbUnspecified,
+    /// A
+    #[serde(rename = "fpbA")]
+    FpbA,
+    /// PG
+    #[serde(rename = "fpbPg")]
+    FpbPg,
+    /// 7-9PG
+    #[serde(rename = "fpb79Pg")]
+    Fpb79Pg,
+    /// 10-12PG
+    #[serde(rename = "fpb1012Pg")]
+    Fpb1012Pg,
+    /// 13
+    #[serde(rename = "fpb13")]
+    Fpb13,
+    /// 16
+    #[serde(rename = "fpb16")]
+    Fpb16,
+    /// 18
+    #[serde(rename = "fpb18")]
+    Fpb18,
+    /// X18
+    #[serde(rename = "fpbX18")]
+    FpbX18,
+    /// XX
+    #[serde(rename = "fpbXx")]
+    FpbXx,
+    #[serde(rename = "fpbUnrated")]
+    FpbUnrated,
+    /// 10
+    #[serde(rename = "fpb10")]
+    Fpb10,
+}
+
+impl std::default::Default for ContentRatingFpbRating {
+    fn default() -> ContentRatingFpbRating {
+        ContentRatingFpbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFpbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFpbRating::Undefined => write!(f, "undefined"),
+            ContentRatingFpbRating::FpbUnspecified => write!(f, "fpbUnspecified"),
+            ContentRatingFpbRating::FpbA => write!(f, "fpbA"),
+            ContentRatingFpbRating::FpbPg => write!(f, "fpbPg"),
+            ContentRatingFpbRating::Fpb79Pg => write!(f, "fpb79Pg"),
+            ContentRatingFpbRating::Fpb1012Pg => write!(f, "fpb1012Pg"),
+            ContentRatingFpbRating::Fpb13 => write!(f, "fpb13"),
+            ContentRatingFpbRating::Fpb16 => write!(f, "fpb16"),
+            ContentRatingFpbRating::Fpb18 => write!(f, "fpb18"),
+            ContentRatingFpbRating::FpbX18 => write!(f, "fpbX18"),
+            ContentRatingFpbRating::FpbXx => write!(f, "fpbXx"),
+            ContentRatingFpbRating::FpbUnrated => write!(f, "fpbUnrated"),
+            ContentRatingFpbRating::Fpb10 => write!(f, "fpb10"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMcstRating {
+    Undefined,
+    #[serde(rename = "mcstUnspecified")]
+    McstUnspecified,
+    /// P
+    #[serde(rename = "mcstP")]
+    McstP,
+    /// 0
+    #[serde(rename = "mcst0")]
+    Mcst0,
+    /// C13
+    #[serde(rename = "mcstC13")]
+    McstC13,
+    /// C16
+    #[serde(rename = "mcstC16")]
+    McstC16,
+    /// 16+
+    #[serde(rename = "mcst16plus")]
+    Mcst16plus,
+    /// C18
+    #[serde(rename = "mcstC18")]
+    McstC18,
+    /// MCST_G_PG
+    #[serde(rename = "mcstGPg")]
+    McstGPg,
+    #[serde(rename = "mcstUnrated")]
+    McstUnrated,
+}
+
+impl std::default::Default for ContentRatingMcstRating {
+    fn default() -> ContentRatingMcstRating {
+        ContentRatingMcstRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMcstRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMcstRating::Undefined => write!(f, "undefined"),
+            ContentRatingMcstRating::McstUnspecified => write!(f, "mcstUnspecified"),
+            ContentRatingMcstRating::McstP => write!(f, "mcstP"),
+            ContentRatingMcstRating::Mcst0 => write!(f, "mcst0"),
+            ContentRatingMcstRating::McstC13 => write!(f, "mcstC13"),
+            ContentRatingMcstRating::McstC16 => write!(f, "mcstC16"),
+            ContentRatingMcstRating::Mcst16plus => write!(f, "mcst16plus"),
+            ContentRatingMcstRating::McstC18 => write!(f, "mcstC18"),
+            ContentRatingMcstRating::McstGPg => write!(f, "mcstGPg"),
+            ContentRatingMcstRating::McstUnrated => write!(f, "mcstUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMccypRating {
+    Undefined,
+    #[serde(rename = "mccypUnspecified")]
+    MccypUnspecified,
+    /// A
+    #[serde(rename = "mccypA")]
+    MccypA,
+    /// 7
+    #[serde(rename = "mccyp7")]
+    Mccyp7,
+    /// 11
+    #[serde(rename = "mccyp11")]
+    Mccyp11,
+    /// 15
+    #[serde(rename = "mccyp15")]
+    Mccyp15,
+    #[serde(rename = "mccypUnrated")]
+    MccypUnrated,
+}
+
+impl std::default::Default for ContentRatingMccypRating {
+    fn default() -> ContentRatingMccypRating {
+        ContentRatingMccypRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMccypRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMccypRating::Undefined => write!(f, "undefined"),
+            ContentRatingMccypRating::MccypUnspecified => write!(f, "mccypUnspecified"),
+            ContentRatingMccypRating::MccypA => write!(f, "mccypA"),
+            ContentRatingMccypRating::Mccyp7 => write!(f, "mccyp7"),
+            ContentRatingMccypRating::Mccyp11 => write!(f, "mccyp11"),
+            ContentRatingMccypRating::Mccyp15 => write!(f, "mccyp15"),
+            ContentRatingMccypRating::MccypUnrated => write!(f, "mccypUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFcbmRating {
+    Undefined,
+    #[serde(rename = "fcbmUnspecified")]
+    FcbmUnspecified,
+    /// U
+    #[serde(rename = "fcbmU")]
+    FcbmU,
+    /// PG13
+    #[serde(rename = "fcbmPg13")]
+    FcbmPg13,
+    /// P13
+    #[serde(rename = "fcbmP13")]
+    FcbmP13,
+    /// 18
+    #[serde(rename = "fcbm18")]
+    Fcbm18,
+    /// 18SX
+    #[serde(rename = "fcbm18sx")]
+    Fcbm18sx,
+    /// 18PA
+    #[serde(rename = "fcbm18pa")]
+    Fcbm18pa,
+    /// 18SG
+    #[serde(rename = "fcbm18sg")]
+    Fcbm18sg,
+    /// 18PL
+    #[serde(rename = "fcbm18pl")]
+    Fcbm18pl,
+    #[serde(rename = "fcbmUnrated")]
+    FcbmUnrated,
+}
+
+impl std::default::Default for ContentRatingFcbmRating {
+    fn default() -> ContentRatingFcbmRating {
+        ContentRatingFcbmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFcbmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFcbmRating::Undefined => write!(f, "undefined"),
+            ContentRatingFcbmRating::FcbmUnspecified => write!(f, "fcbmUnspecified"),
+            ContentRatingFcbmRating::FcbmU => write!(f, "fcbmU"),
+            ContentRatingFcbmRating::FcbmPg13 => write!(f, "fcbmPg13"),
+            ContentRatingFcbmRating::FcbmP13 => write!(f, "fcbmP13"),
+            ContentRatingFcbmRating::Fcbm18 => write!(f, "fcbm18"),
+            ContentRatingFcbmRating::Fcbm18sx => write!(f, "fcbm18sx"),
+            ContentRatingFcbmRating::Fcbm18pa => write!(f, "fcbm18pa"),
+            ContentRatingFcbmRating::Fcbm18sg => write!(f, "fcbm18sg"),
+            ContentRatingFcbmRating::Fcbm18pl => write!(f, "fcbm18pl"),
+            ContentRatingFcbmRating::FcbmUnrated => write!(f, "fcbmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNmcRating {
+    Undefined,
+    #[serde(rename = "nmcUnspecified")]
+    NmcUnspecified,
+    /// G
+    #[serde(rename = "nmcG")]
+    NmcG,
+    /// PG
+    #[serde(rename = "nmcPg")]
+    NmcPg,
+    /// PG-13
+    #[serde(rename = "nmcPg13")]
+    NmcPg13,
+    /// PG-15
+    #[serde(rename = "nmcPg15")]
+    NmcPg15,
+    /// 15+
+    #[serde(rename = "nmc15plus")]
+    Nmc15plus,
+    /// 18+
+    #[serde(rename = "nmc18plus")]
+    Nmc18plus,
+    /// 18TC
+    #[serde(rename = "nmc18tc")]
+    Nmc18tc,
+    #[serde(rename = "nmcUnrated")]
+    NmcUnrated,
+}
+
+impl std::default::Default for ContentRatingNmcRating {
+    fn default() -> ContentRatingNmcRating {
+        ContentRatingNmcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNmcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNmcRating::Undefined => write!(f, "undefined"),
+            ContentRatingNmcRating::NmcUnspecified => write!(f, "nmcUnspecified"),
+            ContentRatingNmcRating::NmcG => write!(f, "nmcG"),
+            ContentRatingNmcRating::NmcPg => write!(f, "nmcPg"),
+            ContentRatingNmcRating::NmcPg13 => write!(f, "nmcPg13"),
+            ContentRatingNmcRating::NmcPg15 => write!(f, "nmcPg15"),
+            ContentRatingNmcRating::Nmc15plus => write!(f, "nmc15plus"),
+            ContentRatingNmcRating::Nmc18plus => write!(f, "nmc18plus"),
+            ContentRatingNmcRating::Nmc18tc => write!(f, "nmc18tc"),
+            ContentRatingNmcRating::NmcUnrated => write!(f, "nmcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingChfilmRating {
+    Undefined,
+    #[serde(rename = "chfilmUnspecified")]
+    ChfilmUnspecified,
+    /// 0
+    #[serde(rename = "chfilm0")]
+    Chfilm0,
+    /// 6
+    #[serde(rename = "chfilm6")]
+    Chfilm6,
+    /// 12
+    #[serde(rename = "chfilm12")]
+    Chfilm12,
+    /// 16
+    #[serde(rename = "chfilm16")]
+    Chfilm16,
+    /// 18
+    #[serde(rename = "chfilm18")]
+    Chfilm18,
+    #[serde(rename = "chfilmUnrated")]
+    ChfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingChfilmRating {
+    fn default() -> ContentRatingChfilmRating {
+        ContentRatingChfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingChfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingChfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingChfilmRating::ChfilmUnspecified => write!(f, "chfilmUnspecified"),
+            ContentRatingChfilmRating::Chfilm0 => write!(f, "chfilm0"),
+            ContentRatingChfilmRating::Chfilm6 => write!(f, "chfilm6"),
+            ContentRatingChfilmRating::Chfilm12 => write!(f, "chfilm12"),
+            ContentRatingChfilmRating::Chfilm16 => write!(f, "chfilm16"),
+            ContentRatingChfilmRating::Chfilm18 => write!(f, "chfilm18"),
+            ContentRatingChfilmRating::ChfilmUnrated => write!(f, "chfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNkclvRating {
+    Undefined,
+    #[serde(rename = "nkclvUnspecified")]
+    NkclvUnspecified,
+    /// U
+    #[serde(rename = "nkclvU")]
+    NkclvU,
+    /// 7+
+    #[serde(rename = "nkclv7plus")]
+    Nkclv7plus,
+    /// 12+
+    #[serde(rename = "nkclv12plus")]
+    Nkclv12plus,
+    /// ! 16+
+    #[serde(rename = "nkclv16plus")]
+    Nkclv16plus,
+    /// 18+
+    #[serde(rename = "nkclv18plus")]
+    Nkclv18plus,
+    #[serde(rename = "nkclvUnrated")]
+    NkclvUnrated,
+}
+
+impl std::default::Default for ContentRatingNkclvRating {
+    fn default() -> ContentRatingNkclvRating {
+        ContentRatingNkclvRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNkclvRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNkclvRating::Undefined => write!(f, "undefined"),
+            ContentRatingNkclvRating::NkclvUnspecified => write!(f, "nkclvUnspecified"),
+            ContentRatingNkclvRating::NkclvU => write!(f, "nkclvU"),
+            ContentRatingNkclvRating::Nkclv7plus => write!(f, "nkclv7plus"),
+            ContentRatingNkclvRating::Nkclv12plus => write!(f, "nkclv12plus"),
+            ContentRatingNkclvRating::Nkclv16plus => write!(f, "nkclv16plus"),
+            ContentRatingNkclvRating::Nkclv18plus => write!(f, "nkclv18plus"),
+            ContentRatingNkclvRating::NkclvUnrated => write!(f, "nkclvUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNfrcRating {
+    Undefined,
+    #[serde(rename = "nfrcUnspecified")]
+    NfrcUnspecified,
+    /// A
+    #[serde(rename = "nfrcA")]
+    NfrcA,
+    /// B
+    #[serde(rename = "nfrcB")]
+    NfrcB,
+    /// C
+    #[serde(rename = "nfrcC")]
+    NfrcC,
+    /// D
+    #[serde(rename = "nfrcD")]
+    NfrcD,
+    /// X
+    #[serde(rename = "nfrcX")]
+    NfrcX,
+    #[serde(rename = "nfrcUnrated")]
+    NfrcUnrated,
+}
+
+impl std::default::Default for ContentRatingNfrcRating {
+    fn default() -> ContentRatingNfrcRating {
+        ContentRatingNfrcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNfrcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNfrcRating::Undefined => write!(f, "undefined"),
+            ContentRatingNfrcRating::NfrcUnspecified => write!(f, "nfrcUnspecified"),
+            ContentRatingNfrcRating::NfrcA => write!(f, "nfrcA"),
+            ContentRatingNfrcRating::NfrcB => write!(f, "nfrcB"),
+            ContentRatingNfrcRating::NfrcC => write!(f, "nfrcC"),
+            ContentRatingNfrcRating::NfrcD => write!(f, "nfrcD"),
+            ContentRatingNfrcRating::NfrcX => write!(f, "nfrcX"),
+            ContentRatingNfrcRating::NfrcUnrated => write!(f, "nfrcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingDjctqRating {
+    Undefined,
+    #[serde(rename = "djctqUnspecified")]
+    DjctqUnspecified,
+    /// L
+    #[serde(rename = "djctqL")]
+    DjctqL,
+    /// 10
+    #[serde(rename = "djctq10")]
+    Djctq10,
+    /// 12
+    #[serde(rename = "djctq12")]
+    Djctq12,
+    /// 14
+    #[serde(rename = "djctq14")]
+    Djctq14,
+    /// 16
+    #[serde(rename = "djctq16")]
+    Djctq16,
+    /// 18
+    #[serde(rename = "djctq18")]
+    Djctq18,
+    #[serde(rename = "djctqEr")]
+    DjctqEr,
+    #[serde(rename = "djctqL10")]
+    DjctqL10,
+    #[serde(rename = "djctqL12")]
+    DjctqL12,
+    #[serde(rename = "djctqL14")]
+    DjctqL14,
+    #[serde(rename = "djctqL16")]
+    DjctqL16,
+    #[serde(rename = "djctqL18")]
+    DjctqL18,
+    #[serde(rename = "djctq1012")]
+    Djctq1012,
+    #[serde(rename = "djctq1014")]
+    Djctq1014,
+    #[serde(rename = "djctq1016")]
+    Djctq1016,
+    #[serde(rename = "djctq1018")]
+    Djctq1018,
+    #[serde(rename = "djctq1214")]
+    Djctq1214,
+    #[serde(rename = "djctq1216")]
+    Djctq1216,
+    #[serde(rename = "djctq1218")]
+    Djctq1218,
+    #[serde(rename = "djctq1416")]
+    Djctq1416,
+    #[serde(rename = "djctq1418")]
+    Djctq1418,
+    #[serde(rename = "djctq1618")]
+    Djctq1618,
+    #[serde(rename = "djctqUnrated")]
+    DjctqUnrated,
+}
+
+impl std::default::Default for ContentRatingDjctqRating {
+    fn default() -> ContentRatingDjctqRating {
+        ContentRatingDjctqRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingDjctqRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingDjctqRating::Undefined => write!(f, "undefined"),
+            ContentRatingDjctqRating::DjctqUnspecified => write!(f, "djctqUnspecified"),
+            ContentRatingDjctqRating::DjctqL => write!(f, "djctqL"),
+            ContentRatingDjctqRating::Djctq10 => write!(f, "djctq10"),
+            ContentRatingDjctqRating::Djctq12 => write!(f, "djctq12"),
+            ContentRatingDjctqRating::Djctq14 => write!(f, "djctq14"),
+            ContentRatingDjctqRating::Djctq16 => write!(f, "djctq16"),
+            ContentRatingDjctqRating::Djctq18 => write!(f, "djctq18"),
+            ContentRatingDjctqRating::DjctqEr => write!(f, "djctqEr"),
+            ContentRatingDjctqRating::DjctqL10 => write!(f, "djctqL10"),
+            ContentRatingDjctqRating::DjctqL12 => write!(f, "djctqL12"),
+            ContentRatingDjctqRating::DjctqL14 => write!(f, "djctqL14"),
+            ContentRatingDjctqRating::DjctqL16 => write!(f, "djctqL16"),
+            ContentRatingDjctqRating::DjctqL18 => write!(f, "djctqL18"),
+            ContentRatingDjctqRating::Djctq1012 => write!(f, "djctq1012"),
+            ContentRatingDjctqRating::Djctq1014 => write!(f, "djctq1014"),
+            ContentRatingDjctqRating::Djctq1016 => write!(f, "djctq1016"),
+            ContentRatingDjctqRating::Djctq1018 => write!(f, "djctq1018"),
+            ContentRatingDjctqRating::Djctq1214 => write!(f, "djctq1214"),
+            ContentRatingDjctqRating::Djctq1216 => write!(f, "djctq1216"),
+            ContentRatingDjctqRating::Djctq1218 => write!(f, "djctq1218"),
+            ContentRatingDjctqRating::Djctq1416 => write!(f, "djctq1416"),
+            ContentRatingDjctqRating::Djctq1418 => write!(f, "djctq1418"),
+            ContentRatingDjctqRating::Djctq1618 => write!(f, "djctq1618"),
+            ContentRatingDjctqRating::DjctqUnrated => write!(f, "djctqUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBfvcRating {
+    Undefined,
+    #[serde(rename = "bfvcUnspecified")]
+    BfvcUnspecified,
+    /// G
+    #[serde(rename = "bfvcG")]
+    BfvcG,
+    /// E
+    #[serde(rename = "bfvcE")]
+    BfvcE,
+    /// 13
+    #[serde(rename = "bfvc13")]
+    Bfvc13,
+    /// 15
+    #[serde(rename = "bfvc15")]
+    Bfvc15,
+    /// 18
+    #[serde(rename = "bfvc18")]
+    Bfvc18,
+    /// 20
+    #[serde(rename = "bfvc20")]
+    Bfvc20,
+    /// B
+    #[serde(rename = "bfvcB")]
+    BfvcB,
+    #[serde(rename = "bfvcUnrated")]
+    BfvcUnrated,
+}
+
+impl std::default::Default for ContentRatingBfvcRating {
+    fn default() -> ContentRatingBfvcRating {
+        ContentRatingBfvcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingBfvcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingBfvcRating::Undefined => write!(f, "undefined"),
+            ContentRatingBfvcRating::BfvcUnspecified => write!(f, "bfvcUnspecified"),
+            ContentRatingBfvcRating::BfvcG => write!(f, "bfvcG"),
+            ContentRatingBfvcRating::BfvcE => write!(f, "bfvcE"),
+            ContentRatingBfvcRating::Bfvc13 => write!(f, "bfvc13"),
+            ContentRatingBfvcRating::Bfvc15 => write!(f, "bfvc15"),
+            ContentRatingBfvcRating::Bfvc18 => write!(f, "bfvc18"),
+            ContentRatingBfvcRating::Bfvc20 => write!(f, "bfvc20"),
+            ContentRatingBfvcRating::BfvcB => write!(f, "bfvcB"),
+            ContentRatingBfvcRating::BfvcUnrated => write!(f, "bfvcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIncaaRating {
+    Undefined,
+    #[serde(rename = "incaaUnspecified")]
+    IncaaUnspecified,
+    /// ATP (Apta para todo publico)
+    #[serde(rename = "incaaAtp")]
+    IncaaAtp,
+    /// 13 (Solo apta para mayores de 13 años)
+    #[serde(rename = "incaaSam13")]
+    IncaaSam13,
+    /// 16 (Solo apta para mayores de 16 años)
+    #[serde(rename = "incaaSam16")]
+    IncaaSam16,
+    /// 18 (Solo apta para mayores de 18 años)
+    #[serde(rename = "incaaSam18")]
+    IncaaSam18,
+    /// X (Solo apta para mayores de 18 años, de exhibición condicionada)
+    #[serde(rename = "incaaC")]
+    IncaaC,
+    #[serde(rename = "incaaUnrated")]
+    IncaaUnrated,
+}
+
+impl std::default::Default for ContentRatingIncaaRating {
+    fn default() -> ContentRatingIncaaRating {
+        ContentRatingIncaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIncaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIncaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingIncaaRating::IncaaUnspecified => write!(f, "incaaUnspecified"),
+            ContentRatingIncaaRating::IncaaAtp => write!(f, "incaaAtp"),
+            ContentRatingIncaaRating::IncaaSam13 => write!(f, "incaaSam13"),
+            ContentRatingIncaaRating::IncaaSam16 => write!(f, "incaaSam16"),
+            ContentRatingIncaaRating::IncaaSam18 => write!(f, "incaaSam18"),
+            ContentRatingIncaaRating::IncaaC => write!(f, "incaaC"),
+            ContentRatingIncaaRating::IncaaUnrated => write!(f, "incaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCicfRating {
+    Undefined,
+    #[serde(rename = "cicfUnspecified")]
+    CicfUnspecified,
+    /// E
+    #[serde(rename = "cicfE")]
+    CicfE,
+    /// KT/EA
+    #[serde(rename = "cicfKtEa")]
+    CicfKtEa,
+    /// KNT/ENA
+    #[serde(rename = "cicfKntEna")]
+    CicfKntEna,
+    #[serde(rename = "cicfUnrated")]
+    CicfUnrated,
+}
+
+impl std::default::Default for ContentRatingCicfRating {
+    fn default() -> ContentRatingCicfRating {
+        ContentRatingCicfRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCicfRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCicfRating::Undefined => write!(f, "undefined"),
+            ContentRatingCicfRating::CicfUnspecified => write!(f, "cicfUnspecified"),
+            ContentRatingCicfRating::CicfE => write!(f, "cicfE"),
+            ContentRatingCicfRating::CicfKtEa => write!(f, "cicfKtEa"),
+            ContentRatingCicfRating::CicfKntEna => write!(f, "cicfKntEna"),
+            ContentRatingCicfRating::CicfUnrated => write!(f, "cicfUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKmrbRating {
+    Undefined,
+    #[serde(rename = "kmrbUnspecified")]
+    KmrbUnspecified,
+    /// 전체관람가
+    #[serde(rename = "kmrbAll")]
+    KmrbAll,
+    /// 12세 이상 관람가
+    #[serde(rename = "kmrb12plus")]
+    Kmrb12plus,
+    /// 15세 이상 관람가
+    #[serde(rename = "kmrb15plus")]
+    Kmrb15plus,
+    #[serde(rename = "kmrbTeenr")]
+    KmrbTeenr,
+    /// 청소년 관람불가
+    #[serde(rename = "kmrbR")]
+    KmrbR,
+    #[serde(rename = "kmrbUnrated")]
+    KmrbUnrated,
+}
+
+impl std::default::Default for ContentRatingKmrbRating {
+    fn default() -> ContentRatingKmrbRating {
+        ContentRatingKmrbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingKmrbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingKmrbRating::Undefined => write!(f, "undefined"),
+            ContentRatingKmrbRating::KmrbUnspecified => write!(f, "kmrbUnspecified"),
+            ContentRatingKmrbRating::KmrbAll => write!(f, "kmrbAll"),
+            ContentRatingKmrbRating::Kmrb12plus => write!(f, "kmrb12plus"),
+            ContentRatingKmrbRating::Kmrb15plus => write!(f, "kmrb15plus"),
+            ContentRatingKmrbRating::KmrbTeenr => write!(f, "kmrbTeenr"),
+            ContentRatingKmrbRating::KmrbR => write!(f, "kmrbR"),
+            ContentRatingKmrbRating::KmrbUnrated => write!(f, "kmrbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCccRating {
+    Undefined,
+    #[serde(rename = "cccUnspecified")]
+    CccUnspecified,
+    /// Todo espectador
+    #[serde(rename = "cccTe")]
+    CccTe,
+    /// 6+ - Inconveniente para menores de 7 años
+    #[serde(rename = "ccc6")]
+    Ccc6,
+    /// 14+
+    #[serde(rename = "ccc14")]
+    Ccc14,
+    /// 18+
+    #[serde(rename = "ccc18")]
+    Ccc18,
+    /// 18+ - contenido excesivamente violento
+    #[serde(rename = "ccc18v")]
+    Ccc18v,
+    /// 18+ - contenido pornográfico
+    #[serde(rename = "ccc18s")]
+    Ccc18s,
+    #[serde(rename = "cccUnrated")]
+    CccUnrated,
+}
+
+impl std::default::Default for ContentRatingCccRating {
+    fn default() -> ContentRatingCccRating {
+        ContentRatingCccRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCccRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCccRating::Undefined => write!(f, "undefined"),
+            ContentRatingCccRating::CccUnspecified => write!(f, "cccUnspecified"),
+            ContentRatingCccRating::CccTe => write!(f, "cccTe"),
+            ContentRatingCccRating::Ccc6 => write!(f, "ccc6"),
+            ContentRatingCccRating::Ccc14 => write!(f, "ccc14"),
+            ContentRatingCccRating::Ccc18 => write!(f, "ccc18"),
+            ContentRatingCccRating::Ccc18v => write!(f, "ccc18v"),
+            ContentRatingCccRating::Ccc18s => write!(f, "ccc18s"),
+            ContentRatingCccRating::CccUnrated => write!(f, "cccUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCsaRating {
+    Undefined,
+    #[serde(rename = "csaUnspecified")]
+    CsaUnspecified,
+    /// T
+    #[serde(rename = "csaT")]
+    CsaT,
+    /// 10
+    #[serde(rename = "csa10")]
+    Csa10,
+    /// 12
+    #[serde(rename = "csa12")]
+    Csa12,
+    /// 16
+    #[serde(rename = "csa16")]
+    Csa16,
+    /// 18
+    #[serde(rename = "csa18")]
+    Csa18,
+    /// Interdiction
+    #[serde(rename = "csaInterdiction")]
+    CsaInterdiction,
+    #[serde(rename = "csaUnrated")]
+    CsaUnrated,
+}
+
+impl std::default::Default for ContentRatingCsaRating {
+    fn default() -> ContentRatingCsaRating {
+        ContentRatingCsaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCsaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCsaRating::Undefined => write!(f, "undefined"),
+            ContentRatingCsaRating::CsaUnspecified => write!(f, "csaUnspecified"),
+            ContentRatingCsaRating::CsaT => write!(f, "csaT"),
+            ContentRatingCsaRating::Csa10 => write!(f, "csa10"),
+            ContentRatingCsaRating::Csa12 => write!(f, "csa12"),
+            ContentRatingCsaRating::Csa16 => write!(f, "csa16"),
+            ContentRatingCsaRating::Csa18 => write!(f, "csa18"),
+            ContentRatingCsaRating::CsaInterdiction => write!(f, "csaInterdiction"),
+            ContentRatingCsaRating::CsaUnrated => write!(f, "csaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRcnofRating {
+    Undefined,
+    #[serde(rename = "rcnofUnspecified")]
+    RcnofUnspecified,
+    #[serde(rename = "rcnofI")]
+    RcnofI,
+    #[serde(rename = "rcnofIi")]
+    RcnofIi,
+    #[serde(rename = "rcnofIii")]
+    RcnofIii,
+    #[serde(rename = "rcnofIv")]
+    RcnofIv,
+    #[serde(rename = "rcnofV")]
+    RcnofV,
+    #[serde(rename = "rcnofVi")]
+    RcnofVi,
+    #[serde(rename = "rcnofUnrated")]
+    RcnofUnrated,
+}
+
+impl std::default::Default for ContentRatingRcnofRating {
+    fn default() -> ContentRatingRcnofRating {
+        ContentRatingRcnofRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRcnofRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRcnofRating::Undefined => write!(f, "undefined"),
+            ContentRatingRcnofRating::RcnofUnspecified => write!(f, "rcnofUnspecified"),
+            ContentRatingRcnofRating::RcnofI => write!(f, "rcnofI"),
+            ContentRatingRcnofRating::RcnofIi => write!(f, "rcnofIi"),
+            ContentRatingRcnofRating::RcnofIii => write!(f, "rcnofIii"),
+            ContentRatingRcnofRating::RcnofIv => write!(f, "rcnofIv"),
+            ContentRatingRcnofRating::RcnofV => write!(f, "rcnofV"),
+            ContentRatingRcnofRating::RcnofVi => write!(f, "rcnofVi"),
+            ContentRatingRcnofRating::RcnofUnrated => write!(f, "rcnofUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRtcRating {
+    Undefined,
+    #[serde(rename = "rtcUnspecified")]
+    RtcUnspecified,
+    /// AA
+    #[serde(rename = "rtcAa")]
+    RtcAa,
+    /// A
+    #[serde(rename = "rtcA")]
+    RtcA,
+    /// B
+    #[serde(rename = "rtcB")]
+    RtcB,
+    /// B15
+    #[serde(rename = "rtcB15")]
+    RtcB15,
+    /// C
+    #[serde(rename = "rtcC")]
+    RtcC,
+    /// D
+    #[serde(rename = "rtcD")]
+    RtcD,
+    #[serde(rename = "rtcUnrated")]
+    RtcUnrated,
+}
+
+impl std::default::Default for ContentRatingRtcRating {
+    fn default() -> ContentRatingRtcRating {
+        ContentRatingRtcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRtcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRtcRating::Undefined => write!(f, "undefined"),
+            ContentRatingRtcRating::RtcUnspecified => write!(f, "rtcUnspecified"),
+            ContentRatingRtcRating::RtcAa => write!(f, "rtcAa"),
+            ContentRatingRtcRating::RtcA => write!(f, "rtcA"),
+            ContentRatingRtcRating::RtcB => write!(f, "rtcB"),
+            ContentRatingRtcRating::RtcB15 => write!(f, "rtcB15"),
+            ContentRatingRtcRating::RtcC => write!(f, "rtcC"),
+            ContentRatingRtcRating::RtcD => write!(f, "rtcD"),
+            ContentRatingRtcRating::RtcUnrated => write!(f, "rtcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveChatUserBannedMessageDetailsBanType {
+    Undefined,
+    #[serde(rename = "permanent")]
+    Permanent,
+    #[serde(rename = "temporary")]
+    Temporary,
+}
+
+impl std::default::Default for LiveChatUserBannedMessageDetailsBanType {
+    fn default() -> LiveChatUserBannedMessageDetailsBanType {
+        LiveChatUserBannedMessageDetailsBanType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveChatUserBannedMessageDetailsBanType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveChatUserBannedMessageDetailsBanType::Undefined => write!(f, "undefined"),
+            LiveChatUserBannedMessageDetailsBanType::Permanent => write!(f, "permanent"),
+            LiveChatUserBannedMessageDetailsBanType::Temporary => write!(f, "temporary"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSuggestionsEditorSuggestions {
+    Undefined,
+    /// Picture brightness levels seem off and could be corrected.
+    #[serde(rename = "videoAutoLevels")]
+    VideoAutoLevels,
+    /// The video appears shaky and could be stabilized.
+    #[serde(rename = "videoStabilize")]
+    VideoStabilize,
+    /// Margins (mattes) detected around the picture could be cropped.
+    #[serde(rename = "videoCrop")]
+    VideoCrop,
+    /// The audio track appears silent and could be swapped with a better quality one.
+    #[serde(rename = "audioQuietAudioSwap")]
+    AudioQuietAudioSwap,
+}
+
+impl std::default::Default for VideoSuggestionsEditorSuggestions {
+    fn default() -> VideoSuggestionsEditorSuggestions {
+        VideoSuggestionsEditorSuggestions::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsEditorSuggestions {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsEditorSuggestions::Undefined => write!(f, "undefined"),
+            VideoSuggestionsEditorSuggestions::VideoAutoLevels => write!(f, "videoAutoLevels"),
+            VideoSuggestionsEditorSuggestions::VideoStabilize => write!(f, "videoStabilize"),
+            VideoSuggestionsEditorSuggestions::VideoCrop => write!(f, "videoCrop"),
+            VideoSuggestionsEditorSuggestions::AudioQuietAudioSwap => {
+                write!(f, "audioQuietAudioSwap")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum VideoSuggestionsProcessingWarnings {
     Undefined,
     /// Unrecognized file format, transcoding is likely to fail.
@@ -4652,90 +9757,6 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoSuggestionsProcessingHints {
-    Undefined,
-    /// The MP4 file is not streamable, this will slow down the processing. MOOV atom was not found at the beginning of the file.
-    #[serde(rename = "nonStreamableMov")]
-    NonStreamableMov,
-    /// Probably a better quality version of the video exists. The video has wide screen aspect ratio, but is not an HD video.
-    #[serde(rename = "sendBestQualityVideo")]
-    SendBestQualityVideo,
-    /// Uploaded video is spherical video.
-    #[serde(rename = "sphericalVideo")]
-    SphericalVideo,
-    /// Uploaded video has spatial audio.
-    #[serde(rename = "spatialAudio")]
-    SpatialAudio,
-    /// Uploaded video is VR video.
-    #[serde(rename = "vrVideo")]
-    VrVideo,
-    /// Uploaded video is HDR video.
-    #[serde(rename = "hdrVideo")]
-    HdrVideo,
-}
-
-impl std::default::Default for VideoSuggestionsProcessingHints {
-    fn default() -> VideoSuggestionsProcessingHints {
-        VideoSuggestionsProcessingHints::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoSuggestionsProcessingHints {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoSuggestionsProcessingHints::Undefined => write!(f, "undefined"),
-            VideoSuggestionsProcessingHints::NonStreamableMov => write!(f, "nonStreamableMov"),
-            VideoSuggestionsProcessingHints::SendBestQualityVideo => {
-                write!(f, "sendBestQualityVideo")
-            }
-            VideoSuggestionsProcessingHints::SphericalVideo => write!(f, "sphericalVideo"),
-            VideoSuggestionsProcessingHints::SpatialAudio => write!(f, "spatialAudio"),
-            VideoSuggestionsProcessingHints::VrVideo => write!(f, "vrVideo"),
-            VideoSuggestionsProcessingHints::HdrVideo => write!(f, "hdrVideo"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoSuggestionsEditorSuggestions {
-    Undefined,
-    /// Picture brightness levels seem off and could be corrected.
-    #[serde(rename = "videoAutoLevels")]
-    VideoAutoLevels,
-    /// The video appears shaky and could be stabilized.
-    #[serde(rename = "videoStabilize")]
-    VideoStabilize,
-    /// Margins (mattes) detected around the picture could be cropped.
-    #[serde(rename = "videoCrop")]
-    VideoCrop,
-    /// The audio track appears silent and could be swapped with a better quality one.
-    #[serde(rename = "audioQuietAudioSwap")]
-    AudioQuietAudioSwap,
-}
-
-impl std::default::Default for VideoSuggestionsEditorSuggestions {
-    fn default() -> VideoSuggestionsEditorSuggestions {
-        VideoSuggestionsEditorSuggestions::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoSuggestionsEditorSuggestions {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoSuggestionsEditorSuggestions::Undefined => write!(f, "undefined"),
-            VideoSuggestionsEditorSuggestions::VideoAutoLevels => write!(f, "videoAutoLevels"),
-            VideoSuggestionsEditorSuggestions::VideoStabilize => write!(f, "videoStabilize"),
-            VideoSuggestionsEditorSuggestions::VideoCrop => write!(f, "videoCrop"),
-            VideoSuggestionsEditorSuggestions::AudioQuietAudioSwap => {
-                write!(f, "audioQuietAudioSwap")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum VideoSuggestionsProcessingErrors {
     Undefined,
     /// File contains audio only (e.g., an MP3 file).
@@ -4786,5034 +9807,46 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoProcessingDetailsProcessingStatus {
-    Undefined,
-    ///
-    #[serde(rename = "processing")]
-    Processing,
-    ///
-    #[serde(rename = "succeeded")]
-    Succeeded,
-    ///
-    #[serde(rename = "failed")]
-    Failed,
-    ///
-    #[serde(rename = "terminated")]
-    Terminated,
-}
-
-impl std::default::Default for VideoProcessingDetailsProcessingStatus {
-    fn default() -> VideoProcessingDetailsProcessingStatus {
-        VideoProcessingDetailsProcessingStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoProcessingDetailsProcessingStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoProcessingDetailsProcessingStatus::Undefined => write!(f, "undefined"),
-            VideoProcessingDetailsProcessingStatus::Processing => write!(f, "processing"),
-            VideoProcessingDetailsProcessingStatus::Succeeded => write!(f, "succeeded"),
-            VideoProcessingDetailsProcessingStatus::Failed => write!(f, "failed"),
-            VideoProcessingDetailsProcessingStatus::Terminated => write!(f, "terminated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoProcessingDetailsProcessingFailureReason {
-    Undefined,
-    ///
-    #[serde(rename = "uploadFailed")]
-    UploadFailed,
-    ///
-    #[serde(rename = "transcodeFailed")]
-    TranscodeFailed,
-    ///
-    #[serde(rename = "streamingFailed")]
-    StreamingFailed,
-    ///
-    #[serde(rename = "other")]
-    Other,
-}
-
-impl std::default::Default for VideoProcessingDetailsProcessingFailureReason {
-    fn default() -> VideoProcessingDetailsProcessingFailureReason {
-        VideoProcessingDetailsProcessingFailureReason::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoProcessingDetailsProcessingFailureReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoProcessingDetailsProcessingFailureReason::Undefined => write!(f, "undefined"),
-            VideoProcessingDetailsProcessingFailureReason::UploadFailed => {
-                write!(f, "uploadFailed")
-            }
-            VideoProcessingDetailsProcessingFailureReason::TranscodeFailed => {
-                write!(f, "transcodeFailed")
-            }
-            VideoProcessingDetailsProcessingFailureReason::StreamingFailed => {
-                write!(f, "streamingFailed")
-            }
-            VideoProcessingDetailsProcessingFailureReason::Other => write!(f, "other"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetFailureReason {
-    Undefined,
-    ///
-    #[serde(rename = "unknownFormat")]
-    UnknownFormat,
-    ///
-    #[serde(rename = "unsupportedFormat")]
-    UnsupportedFormat,
-    ///
-    #[serde(rename = "processingFailed")]
-    ProcessingFailed,
-}
-
-impl std::default::Default for CaptionSnippetFailureReason {
-    fn default() -> CaptionSnippetFailureReason {
-        CaptionSnippetFailureReason::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetFailureReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetFailureReason::Undefined => write!(f, "undefined"),
-            CaptionSnippetFailureReason::UnknownFormat => write!(f, "unknownFormat"),
-            CaptionSnippetFailureReason::UnsupportedFormat => write!(f, "unsupportedFormat"),
-            CaptionSnippetFailureReason::ProcessingFailed => write!(f, "processingFailed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetTrackKind {
-    Undefined,
-    ///
-    #[serde(rename = "standard")]
-    Standard,
-    ///
-    #[serde(rename = "ASR")]
-    ASR,
-    ///
-    #[serde(rename = "forced")]
-    Forced,
-}
-
-impl std::default::Default for CaptionSnippetTrackKind {
-    fn default() -> CaptionSnippetTrackKind {
-        CaptionSnippetTrackKind::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetTrackKind {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetTrackKind::Undefined => write!(f, "undefined"),
-            CaptionSnippetTrackKind::Standard => write!(f, "standard"),
-            CaptionSnippetTrackKind::ASR => write!(f, "ASR"),
-            CaptionSnippetTrackKind::Forced => write!(f, "forced"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetStatus {
-    Undefined,
-    ///
-    #[serde(rename = "serving")]
-    Serving,
-    ///
-    #[serde(rename = "syncing")]
-    Syncing,
-    ///
-    #[serde(rename = "failed")]
-    Failed,
-}
-
-impl std::default::Default for CaptionSnippetStatus {
-    fn default() -> CaptionSnippetStatus {
-        CaptionSnippetStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetStatus::Undefined => write!(f, "undefined"),
-            CaptionSnippetStatus::Serving => write!(f, "serving"),
-            CaptionSnippetStatus::Syncing => write!(f, "syncing"),
-            CaptionSnippetStatus::Failed => write!(f, "failed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetAudioTrackType {
-    Undefined,
-    ///
-    #[serde(rename = "unknown")]
-    Unknown,
-    ///
-    #[serde(rename = "primary")]
-    Primary,
-    ///
-    #[serde(rename = "commentary")]
-    Commentary,
-    ///
-    #[serde(rename = "descriptive")]
-    Descriptive,
-}
-
-impl std::default::Default for CaptionSnippetAudioTrackType {
-    fn default() -> CaptionSnippetAudioTrackType {
-        CaptionSnippetAudioTrackType::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetAudioTrackType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetAudioTrackType::Undefined => write!(f, "undefined"),
-            CaptionSnippetAudioTrackType::Unknown => write!(f, "unknown"),
-            CaptionSnippetAudioTrackType::Primary => write!(f, "primary"),
-            CaptionSnippetAudioTrackType::Commentary => write!(f, "commentary"),
-            CaptionSnippetAudioTrackType::Descriptive => write!(f, "descriptive"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelStatusPrivacyStatus {
-    Undefined,
-    ///
-    #[serde(rename = "public")]
-    Public,
-    ///
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    ///
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for ChannelStatusPrivacyStatus {
-    fn default() -> ChannelStatusPrivacyStatus {
-        ChannelStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            ChannelStatusPrivacyStatus::Public => write!(f, "public"),
-            ChannelStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            ChannelStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelStatusLongUploadsStatus {
-    Undefined,
-    ///
-    #[serde(rename = "longUploadsUnspecified")]
-    LongUploadsUnspecified,
-    ///
-    #[serde(rename = "allowed")]
-    Allowed,
-    ///
-    #[serde(rename = "eligible")]
-    Eligible,
-    ///
-    #[serde(rename = "disallowed")]
-    Disallowed,
-}
-
-impl std::default::Default for ChannelStatusLongUploadsStatus {
-    fn default() -> ChannelStatusLongUploadsStatus {
-        ChannelStatusLongUploadsStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelStatusLongUploadsStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelStatusLongUploadsStatus::Undefined => write!(f, "undefined"),
-            ChannelStatusLongUploadsStatus::LongUploadsUnspecified => {
-                write!(f, "longUploadsUnspecified")
-            }
-            ChannelStatusLongUploadsStatus::Allowed => write!(f, "allowed"),
-            ChannelStatusLongUploadsStatus::Eligible => write!(f, "eligible"),
-            ChannelStatusLongUploadsStatus::Disallowed => write!(f, "disallowed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNfvcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "nfvcbUnspecified")]
-    NfvcbUnspecified,
-    /// G
-    #[serde(rename = "nfvcbG")]
-    NfvcbG,
-    /// PG
-    #[serde(rename = "nfvcbPg")]
-    NfvcbPg,
-    /// 12
-    #[serde(rename = "nfvcb12")]
-    Nfvcb12,
-    /// 12A
-    #[serde(rename = "nfvcb12a")]
-    Nfvcb12a,
-    /// 15
-    #[serde(rename = "nfvcb15")]
-    Nfvcb15,
-    /// 18
-    #[serde(rename = "nfvcb18")]
-    Nfvcb18,
-    /// RE
-    #[serde(rename = "nfvcbRe")]
-    NfvcbRe,
-    ///
-    #[serde(rename = "nfvcbUnrated")]
-    NfvcbUnrated,
-}
-
-impl std::default::Default for ContentRatingNfvcbRating {
-    fn default() -> ContentRatingNfvcbRating {
-        ContentRatingNfvcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNfvcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNfvcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingNfvcbRating::NfvcbUnspecified => write!(f, "nfvcbUnspecified"),
-            ContentRatingNfvcbRating::NfvcbG => write!(f, "nfvcbG"),
-            ContentRatingNfvcbRating::NfvcbPg => write!(f, "nfvcbPg"),
-            ContentRatingNfvcbRating::Nfvcb12 => write!(f, "nfvcb12"),
-            ContentRatingNfvcbRating::Nfvcb12a => write!(f, "nfvcb12a"),
-            ContentRatingNfvcbRating::Nfvcb15 => write!(f, "nfvcb15"),
-            ContentRatingNfvcbRating::Nfvcb18 => write!(f, "nfvcb18"),
-            ContentRatingNfvcbRating::NfvcbRe => write!(f, "nfvcbRe"),
-            ContentRatingNfvcbRating::NfvcbUnrated => write!(f, "nfvcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSmsaRating {
-    Undefined,
-    ///
-    #[serde(rename = "smsaUnspecified")]
-    SmsaUnspecified,
-    /// All ages
-    #[serde(rename = "smsaA")]
-    SmsaA,
-    /// 7
-    #[serde(rename = "smsa7")]
-    Smsa7,
-    /// 11
-    #[serde(rename = "smsa11")]
-    Smsa11,
-    /// 15
-    #[serde(rename = "smsa15")]
-    Smsa15,
-    ///
-    #[serde(rename = "smsaUnrated")]
-    SmsaUnrated,
-}
-
-impl std::default::Default for ContentRatingSmsaRating {
-    fn default() -> ContentRatingSmsaRating {
-        ContentRatingSmsaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSmsaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSmsaRating::Undefined => write!(f, "undefined"),
-            ContentRatingSmsaRating::SmsaUnspecified => write!(f, "smsaUnspecified"),
-            ContentRatingSmsaRating::SmsaA => write!(f, "smsaA"),
-            ContentRatingSmsaRating::Smsa7 => write!(f, "smsa7"),
-            ContentRatingSmsaRating::Smsa11 => write!(f, "smsa11"),
-            ContentRatingSmsaRating::Smsa15 => write!(f, "smsa15"),
-            ContentRatingSmsaRating::SmsaUnrated => write!(f, "smsaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBmukkRating {
-    Undefined,
-    ///
-    #[serde(rename = "bmukkUnspecified")]
-    BmukkUnspecified,
-    /// Unrestricted
-    #[serde(rename = "bmukkAa")]
-    BmukkAa,
-    /// 6+
-    #[serde(rename = "bmukk6")]
-    Bmukk6,
-    /// 8+
-    #[serde(rename = "bmukk8")]
-    Bmukk8,
-    /// 10+
-    #[serde(rename = "bmukk10")]
-    Bmukk10,
-    /// 12+
-    #[serde(rename = "bmukk12")]
-    Bmukk12,
-    /// 14+
-    #[serde(rename = "bmukk14")]
-    Bmukk14,
-    /// 16+
-    #[serde(rename = "bmukk16")]
-    Bmukk16,
-    ///
-    #[serde(rename = "bmukkUnrated")]
-    BmukkUnrated,
-}
-
-impl std::default::Default for ContentRatingBmukkRating {
-    fn default() -> ContentRatingBmukkRating {
-        ContentRatingBmukkRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBmukkRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBmukkRating::Undefined => write!(f, "undefined"),
-            ContentRatingBmukkRating::BmukkUnspecified => write!(f, "bmukkUnspecified"),
-            ContentRatingBmukkRating::BmukkAa => write!(f, "bmukkAa"),
-            ContentRatingBmukkRating::Bmukk6 => write!(f, "bmukk6"),
-            ContentRatingBmukkRating::Bmukk8 => write!(f, "bmukk8"),
-            ContentRatingBmukkRating::Bmukk10 => write!(f, "bmukk10"),
-            ContentRatingBmukkRating::Bmukk12 => write!(f, "bmukk12"),
-            ContentRatingBmukkRating::Bmukk14 => write!(f, "bmukk14"),
-            ContentRatingBmukkRating::Bmukk16 => write!(f, "bmukk16"),
-            ContentRatingBmukkRating::BmukkUnrated => write!(f, "bmukkUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFmocRating {
-    Undefined,
-    ///
-    #[serde(rename = "fmocUnspecified")]
-    FmocUnspecified,
-    /// U
-    #[serde(rename = "fmocU")]
-    FmocU,
-    /// 10
-    #[serde(rename = "fmoc10")]
-    Fmoc10,
-    /// 12
-    #[serde(rename = "fmoc12")]
-    Fmoc12,
-    /// 16
-    #[serde(rename = "fmoc16")]
-    Fmoc16,
-    /// 18
-    #[serde(rename = "fmoc18")]
-    Fmoc18,
-    /// E
-    #[serde(rename = "fmocE")]
-    FmocE,
-    ///
-    #[serde(rename = "fmocUnrated")]
-    FmocUnrated,
-}
-
-impl std::default::Default for ContentRatingFmocRating {
-    fn default() -> ContentRatingFmocRating {
-        ContentRatingFmocRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFmocRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFmocRating::Undefined => write!(f, "undefined"),
-            ContentRatingFmocRating::FmocUnspecified => write!(f, "fmocUnspecified"),
-            ContentRatingFmocRating::FmocU => write!(f, "fmocU"),
-            ContentRatingFmocRating::Fmoc10 => write!(f, "fmoc10"),
-            ContentRatingFmocRating::Fmoc12 => write!(f, "fmoc12"),
-            ContentRatingFmocRating::Fmoc16 => write!(f, "fmoc16"),
-            ContentRatingFmocRating::Fmoc18 => write!(f, "fmoc18"),
-            ContentRatingFmocRating::FmocE => write!(f, "fmocE"),
-            ContentRatingFmocRating::FmocUnrated => write!(f, "fmocUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNmcRating {
-    Undefined,
-    ///
-    #[serde(rename = "nmcUnspecified")]
-    NmcUnspecified,
-    /// G
-    #[serde(rename = "nmcG")]
-    NmcG,
-    /// PG
-    #[serde(rename = "nmcPg")]
-    NmcPg,
-    /// PG-13
-    #[serde(rename = "nmcPg13")]
-    NmcPg13,
-    /// PG-15
-    #[serde(rename = "nmcPg15")]
-    NmcPg15,
-    /// 15+
-    #[serde(rename = "nmc15plus")]
-    Nmc15plus,
-    /// 18+
-    #[serde(rename = "nmc18plus")]
-    Nmc18plus,
-    /// 18TC
-    #[serde(rename = "nmc18tc")]
-    Nmc18tc,
-    ///
-    #[serde(rename = "nmcUnrated")]
-    NmcUnrated,
-}
-
-impl std::default::Default for ContentRatingNmcRating {
-    fn default() -> ContentRatingNmcRating {
-        ContentRatingNmcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNmcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNmcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNmcRating::NmcUnspecified => write!(f, "nmcUnspecified"),
-            ContentRatingNmcRating::NmcG => write!(f, "nmcG"),
-            ContentRatingNmcRating::NmcPg => write!(f, "nmcPg"),
-            ContentRatingNmcRating::NmcPg13 => write!(f, "nmcPg13"),
-            ContentRatingNmcRating::NmcPg15 => write!(f, "nmcPg15"),
-            ContentRatingNmcRating::Nmc15plus => write!(f, "nmc15plus"),
-            ContentRatingNmcRating::Nmc18plus => write!(f, "nmc18plus"),
-            ContentRatingNmcRating::Nmc18tc => write!(f, "nmc18tc"),
-            ContentRatingNmcRating::NmcUnrated => write!(f, "nmcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRteRating {
-    Undefined,
-    ///
-    #[serde(rename = "rteUnspecified")]
-    RteUnspecified,
-    /// GA
-    #[serde(rename = "rteGa")]
-    RteGa,
-    /// CH
-    #[serde(rename = "rteCh")]
-    RteCh,
-    /// PS
-    #[serde(rename = "rtePs")]
-    RtePs,
-    /// MA
-    #[serde(rename = "rteMa")]
-    RteMa,
-    ///
-    #[serde(rename = "rteUnrated")]
-    RteUnrated,
-}
-
-impl std::default::Default for ContentRatingRteRating {
-    fn default() -> ContentRatingRteRating {
-        ContentRatingRteRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRteRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRteRating::Undefined => write!(f, "undefined"),
-            ContentRatingRteRating::RteUnspecified => write!(f, "rteUnspecified"),
-            ContentRatingRteRating::RteGa => write!(f, "rteGa"),
-            ContentRatingRteRating::RteCh => write!(f, "rteCh"),
-            ContentRatingRteRating::RtePs => write!(f, "rtePs"),
-            ContentRatingRteRating::RteMa => write!(f, "rteMa"),
-            ContentRatingRteRating::RteUnrated => write!(f, "rteUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFcoRating {
-    Undefined,
-    ///
-    #[serde(rename = "fcoUnspecified")]
-    FcoUnspecified,
-    /// I
-    #[serde(rename = "fcoI")]
-    FcoI,
-    /// IIA
-    #[serde(rename = "fcoIia")]
-    FcoIia,
-    /// IIB
-    #[serde(rename = "fcoIib")]
-    FcoIib,
-    /// II
-    #[serde(rename = "fcoIi")]
-    FcoIi,
-    /// III
-    #[serde(rename = "fcoIii")]
-    FcoIii,
-    ///
-    #[serde(rename = "fcoUnrated")]
-    FcoUnrated,
-}
-
-impl std::default::Default for ContentRatingFcoRating {
-    fn default() -> ContentRatingFcoRating {
-        ContentRatingFcoRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFcoRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFcoRating::Undefined => write!(f, "undefined"),
-            ContentRatingFcoRating::FcoUnspecified => write!(f, "fcoUnspecified"),
-            ContentRatingFcoRating::FcoI => write!(f, "fcoI"),
-            ContentRatingFcoRating::FcoIia => write!(f, "fcoIia"),
-            ContentRatingFcoRating::FcoIib => write!(f, "fcoIib"),
-            ContentRatingFcoRating::FcoIi => write!(f, "fcoIi"),
-            ContentRatingFcoRating::FcoIii => write!(f, "fcoIii"),
-            ContentRatingFcoRating::FcoUnrated => write!(f, "fcoUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIlfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "ilfilmUnspecified")]
-    IlfilmUnspecified,
-    /// AA
-    #[serde(rename = "ilfilmAa")]
-    IlfilmAa,
-    /// 12
-    #[serde(rename = "ilfilm12")]
-    Ilfilm12,
-    /// 14
-    #[serde(rename = "ilfilm14")]
-    Ilfilm14,
-    /// 16
-    #[serde(rename = "ilfilm16")]
-    Ilfilm16,
-    /// 18
-    #[serde(rename = "ilfilm18")]
-    Ilfilm18,
-    ///
-    #[serde(rename = "ilfilmUnrated")]
-    IlfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingIlfilmRating {
-    fn default() -> ContentRatingIlfilmRating {
-        ContentRatingIlfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIlfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIlfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingIlfilmRating::IlfilmUnspecified => write!(f, "ilfilmUnspecified"),
-            ContentRatingIlfilmRating::IlfilmAa => write!(f, "ilfilmAa"),
-            ContentRatingIlfilmRating::Ilfilm12 => write!(f, "ilfilm12"),
-            ContentRatingIlfilmRating::Ilfilm14 => write!(f, "ilfilm14"),
-            ContentRatingIlfilmRating::Ilfilm16 => write!(f, "ilfilm16"),
-            ContentRatingIlfilmRating::Ilfilm18 => write!(f, "ilfilm18"),
-            ContentRatingIlfilmRating::IlfilmUnrated => write!(f, "ilfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingGrfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "grfilmUnspecified")]
-    GrfilmUnspecified,
-    /// K
-    #[serde(rename = "grfilmK")]
-    GrfilmK,
-    /// E
-    #[serde(rename = "grfilmE")]
-    GrfilmE,
-    /// K-12
-    #[serde(rename = "grfilmK12")]
-    GrfilmK12,
-    /// K-13
-    #[serde(rename = "grfilmK13")]
-    GrfilmK13,
-    /// K-15
-    #[serde(rename = "grfilmK15")]
-    GrfilmK15,
-    /// K-17
-    #[serde(rename = "grfilmK17")]
-    GrfilmK17,
-    /// K-18
-    #[serde(rename = "grfilmK18")]
-    GrfilmK18,
-    ///
-    #[serde(rename = "grfilmUnrated")]
-    GrfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingGrfilmRating {
-    fn default() -> ContentRatingGrfilmRating {
-        ContentRatingGrfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingGrfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingGrfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingGrfilmRating::GrfilmUnspecified => write!(f, "grfilmUnspecified"),
-            ContentRatingGrfilmRating::GrfilmK => write!(f, "grfilmK"),
-            ContentRatingGrfilmRating::GrfilmE => write!(f, "grfilmE"),
-            ContentRatingGrfilmRating::GrfilmK12 => write!(f, "grfilmK12"),
-            ContentRatingGrfilmRating::GrfilmK13 => write!(f, "grfilmK13"),
-            ContentRatingGrfilmRating::GrfilmK15 => write!(f, "grfilmK15"),
-            ContentRatingGrfilmRating::GrfilmK17 => write!(f, "grfilmK17"),
-            ContentRatingGrfilmRating::GrfilmK18 => write!(f, "grfilmK18"),
-            ContentRatingGrfilmRating::GrfilmUnrated => write!(f, "grfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMoctwRating {
-    Undefined,
-    ///
-    #[serde(rename = "moctwUnspecified")]
-    MoctwUnspecified,
-    /// G
-    #[serde(rename = "moctwG")]
-    MoctwG,
-    /// P
-    #[serde(rename = "moctwP")]
-    MoctwP,
-    /// PG
-    #[serde(rename = "moctwPg")]
-    MoctwPg,
-    /// R
-    #[serde(rename = "moctwR")]
-    MoctwR,
-    ///
-    #[serde(rename = "moctwUnrated")]
-    MoctwUnrated,
-    /// R-12
-    #[serde(rename = "moctwR12")]
-    MoctwR12,
-    /// R-15
-    #[serde(rename = "moctwR15")]
-    MoctwR15,
-}
-
-impl std::default::Default for ContentRatingMoctwRating {
-    fn default() -> ContentRatingMoctwRating {
-        ContentRatingMoctwRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMoctwRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMoctwRating::Undefined => write!(f, "undefined"),
-            ContentRatingMoctwRating::MoctwUnspecified => write!(f, "moctwUnspecified"),
-            ContentRatingMoctwRating::MoctwG => write!(f, "moctwG"),
-            ContentRatingMoctwRating::MoctwP => write!(f, "moctwP"),
-            ContentRatingMoctwRating::MoctwPg => write!(f, "moctwPg"),
-            ContentRatingMoctwRating::MoctwR => write!(f, "moctwR"),
-            ContentRatingMoctwRating::MoctwUnrated => write!(f, "moctwUnrated"),
-            ContentRatingMoctwRating::MoctwR12 => write!(f, "moctwR12"),
-            ContentRatingMoctwRating::MoctwR15 => write!(f, "moctwR15"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMdaRating {
-    Undefined,
-    ///
-    #[serde(rename = "mdaUnspecified")]
-    MdaUnspecified,
-    /// G
-    #[serde(rename = "mdaG")]
-    MdaG,
-    /// PG
-    #[serde(rename = "mdaPg")]
-    MdaPg,
-    /// PG13
-    #[serde(rename = "mdaPg13")]
-    MdaPg13,
-    /// NC16
-    #[serde(rename = "mdaNc16")]
-    MdaNc16,
-    /// M18
-    #[serde(rename = "mdaM18")]
-    MdaM18,
-    /// R21
-    #[serde(rename = "mdaR21")]
-    MdaR21,
-    ///
-    #[serde(rename = "mdaUnrated")]
-    MdaUnrated,
-}
-
-impl std::default::Default for ContentRatingMdaRating {
-    fn default() -> ContentRatingMdaRating {
-        ContentRatingMdaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMdaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMdaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMdaRating::MdaUnspecified => write!(f, "mdaUnspecified"),
-            ContentRatingMdaRating::MdaG => write!(f, "mdaG"),
-            ContentRatingMdaRating::MdaPg => write!(f, "mdaPg"),
-            ContentRatingMdaRating::MdaPg13 => write!(f, "mdaPg13"),
-            ContentRatingMdaRating::MdaNc16 => write!(f, "mdaNc16"),
-            ContentRatingMdaRating::MdaM18 => write!(f, "mdaM18"),
-            ContentRatingMdaRating::MdaR21 => write!(f, "mdaR21"),
-            ContentRatingMdaRating::MdaUnrated => write!(f, "mdaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFpbRatingReasons {
-    Undefined,
-    ///
-    #[serde(rename = "fpbRatingReasonUnspecified")]
-    FpbRatingReasonUnspecified,
-    /// South Africa rating content descriptors.
-    #[serde(rename = "fpbBlasphemy")]
-    FpbBlasphemy,
-    ///
-    #[serde(rename = "fpbLanguage")]
-    FpbLanguage,
-    ///
-    #[serde(rename = "fpbNudity")]
-    FpbNudity,
-    ///
-    #[serde(rename = "fpbPrejudice")]
-    FpbPrejudice,
-    ///
-    #[serde(rename = "fpbSex")]
-    FpbSex,
-    ///
-    #[serde(rename = "fpbViolence")]
-    FpbViolence,
-    ///
-    #[serde(rename = "fpbDrugs")]
-    FpbDrugs,
-    ///
-    #[serde(rename = "fpbSexualViolence")]
-    FpbSexualViolence,
-    ///
-    #[serde(rename = "fpbHorror")]
-    FpbHorror,
-    ///
-    #[serde(rename = "fpbCriminalTechniques")]
-    FpbCriminalTechniques,
-    ///
-    #[serde(rename = "fpbImitativeActsTechniques")]
-    FpbImitativeActsTechniques,
-}
-
-impl std::default::Default for ContentRatingFpbRatingReasons {
-    fn default() -> ContentRatingFpbRatingReasons {
-        ContentRatingFpbRatingReasons::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFpbRatingReasons {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFpbRatingReasons::Undefined => write!(f, "undefined"),
-            ContentRatingFpbRatingReasons::FpbRatingReasonUnspecified => {
-                write!(f, "fpbRatingReasonUnspecified")
-            }
-            ContentRatingFpbRatingReasons::FpbBlasphemy => write!(f, "fpbBlasphemy"),
-            ContentRatingFpbRatingReasons::FpbLanguage => write!(f, "fpbLanguage"),
-            ContentRatingFpbRatingReasons::FpbNudity => write!(f, "fpbNudity"),
-            ContentRatingFpbRatingReasons::FpbPrejudice => write!(f, "fpbPrejudice"),
-            ContentRatingFpbRatingReasons::FpbSex => write!(f, "fpbSex"),
-            ContentRatingFpbRatingReasons::FpbViolence => write!(f, "fpbViolence"),
-            ContentRatingFpbRatingReasons::FpbDrugs => write!(f, "fpbDrugs"),
-            ContentRatingFpbRatingReasons::FpbSexualViolence => write!(f, "fpbSexualViolence"),
-            ContentRatingFpbRatingReasons::FpbHorror => write!(f, "fpbHorror"),
-            ContentRatingFpbRatingReasons::FpbCriminalTechniques => {
-                write!(f, "fpbCriminalTechniques")
-            }
-            ContentRatingFpbRatingReasons::FpbImitativeActsTechniques => {
-                write!(f, "fpbImitativeActsTechniques")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKfcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "kfcbUnspecified")]
-    KfcbUnspecified,
-    /// GE
-    #[serde(rename = "kfcbG")]
-    KfcbG,
-    /// PG
-    #[serde(rename = "kfcbPg")]
-    KfcbPg,
-    /// 16
-    #[serde(rename = "kfcb16plus")]
-    Kfcb16plus,
-    /// 18
-    #[serde(rename = "kfcbR")]
-    KfcbR,
-    ///
-    #[serde(rename = "kfcbUnrated")]
-    KfcbUnrated,
-}
-
-impl std::default::Default for ContentRatingKfcbRating {
-    fn default() -> ContentRatingKfcbRating {
-        ContentRatingKfcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKfcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKfcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingKfcbRating::KfcbUnspecified => write!(f, "kfcbUnspecified"),
-            ContentRatingKfcbRating::KfcbG => write!(f, "kfcbG"),
-            ContentRatingKfcbRating::KfcbPg => write!(f, "kfcbPg"),
-            ContentRatingKfcbRating::Kfcb16plus => write!(f, "kfcb16plus"),
-            ContentRatingKfcbRating::KfcbR => write!(f, "kfcbR"),
-            ContentRatingKfcbRating::KfcbUnrated => write!(f, "kfcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMocRating {
-    Undefined,
-    ///
-    #[serde(rename = "mocUnspecified")]
-    MocUnspecified,
-    /// E
-    #[serde(rename = "mocE")]
-    MocE,
-    /// T
-    #[serde(rename = "mocT")]
-    MocT,
-    /// 7
-    #[serde(rename = "moc7")]
-    Moc7,
-    /// 12
-    #[serde(rename = "moc12")]
-    Moc12,
-    /// 15
-    #[serde(rename = "moc15")]
-    Moc15,
-    /// 18
-    #[serde(rename = "moc18")]
-    Moc18,
-    /// X
-    #[serde(rename = "mocX")]
-    MocX,
-    /// Banned
-    #[serde(rename = "mocBanned")]
-    MocBanned,
-    ///
-    #[serde(rename = "mocUnrated")]
-    MocUnrated,
-}
-
-impl std::default::Default for ContentRatingMocRating {
-    fn default() -> ContentRatingMocRating {
-        ContentRatingMocRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMocRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMocRating::Undefined => write!(f, "undefined"),
-            ContentRatingMocRating::MocUnspecified => write!(f, "mocUnspecified"),
-            ContentRatingMocRating::MocE => write!(f, "mocE"),
-            ContentRatingMocRating::MocT => write!(f, "mocT"),
-            ContentRatingMocRating::Moc7 => write!(f, "moc7"),
-            ContentRatingMocRating::Moc12 => write!(f, "moc12"),
-            ContentRatingMocRating::Moc15 => write!(f, "moc15"),
-            ContentRatingMocRating::Moc18 => write!(f, "moc18"),
-            ContentRatingMocRating::MocX => write!(f, "mocX"),
-            ContentRatingMocRating::MocBanned => write!(f, "mocBanned"),
-            ContentRatingMocRating::MocUnrated => write!(f, "mocUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCncRating {
-    Undefined,
-    ///
-    #[serde(rename = "cncUnspecified")]
-    CncUnspecified,
-    /// T
-    #[serde(rename = "cncT")]
-    CncT,
-    /// 10
-    #[serde(rename = "cnc10")]
-    Cnc10,
-    /// 12
-    #[serde(rename = "cnc12")]
-    Cnc12,
-    /// 16
-    #[serde(rename = "cnc16")]
-    Cnc16,
-    /// 18
-    #[serde(rename = "cnc18")]
-    Cnc18,
-    /// E
-    #[serde(rename = "cncE")]
-    CncE,
-    /// interdiction
-    #[serde(rename = "cncInterdiction")]
-    CncInterdiction,
-    ///
-    #[serde(rename = "cncUnrated")]
-    CncUnrated,
-}
-
-impl std::default::Default for ContentRatingCncRating {
-    fn default() -> ContentRatingCncRating {
-        ContentRatingCncRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCncRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCncRating::Undefined => write!(f, "undefined"),
-            ContentRatingCncRating::CncUnspecified => write!(f, "cncUnspecified"),
-            ContentRatingCncRating::CncT => write!(f, "cncT"),
-            ContentRatingCncRating::Cnc10 => write!(f, "cnc10"),
-            ContentRatingCncRating::Cnc12 => write!(f, "cnc12"),
-            ContentRatingCncRating::Cnc16 => write!(f, "cnc16"),
-            ContentRatingCncRating::Cnc18 => write!(f, "cnc18"),
-            ContentRatingCncRating::CncE => write!(f, "cncE"),
-            ContentRatingCncRating::CncInterdiction => write!(f, "cncInterdiction"),
-            ContentRatingCncRating::CncUnrated => write!(f, "cncUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCbfcRating {
-    Undefined,
-    ///
-    #[serde(rename = "cbfcUnspecified")]
-    CbfcUnspecified,
-    /// U
-    #[serde(rename = "cbfcU")]
-    CbfcU,
-    /// U/A
-    #[serde(rename = "cbfcUA")]
-    CbfcUA,
-    /// A
-    #[serde(rename = "cbfcA")]
-    CbfcA,
-    /// S
-    #[serde(rename = "cbfcS")]
-    CbfcS,
-    ///
-    #[serde(rename = "cbfcUnrated")]
-    CbfcUnrated,
-}
-
-impl std::default::Default for ContentRatingCbfcRating {
-    fn default() -> ContentRatingCbfcRating {
-        ContentRatingCbfcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCbfcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCbfcRating::Undefined => write!(f, "undefined"),
-            ContentRatingCbfcRating::CbfcUnspecified => write!(f, "cbfcUnspecified"),
-            ContentRatingCbfcRating::CbfcU => write!(f, "cbfcU"),
-            ContentRatingCbfcRating::CbfcUA => write!(f, "cbfcUA"),
-            ContentRatingCbfcRating::CbfcA => write!(f, "cbfcA"),
-            ContentRatingCbfcRating::CbfcS => write!(f, "cbfcS"),
-            ContentRatingCbfcRating::CbfcUnrated => write!(f, "cbfcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMtrcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "mtrcbUnspecified")]
-    MtrcbUnspecified,
-    /// G
-    #[serde(rename = "mtrcbG")]
-    MtrcbG,
-    /// PG
-    #[serde(rename = "mtrcbPg")]
-    MtrcbPg,
-    /// R-13
-    #[serde(rename = "mtrcbR13")]
-    MtrcbR13,
-    /// R-16
-    #[serde(rename = "mtrcbR16")]
-    MtrcbR16,
-    /// R-18
-    #[serde(rename = "mtrcbR18")]
-    MtrcbR18,
-    /// X
-    #[serde(rename = "mtrcbX")]
-    MtrcbX,
-    ///
-    #[serde(rename = "mtrcbUnrated")]
-    MtrcbUnrated,
-}
-
-impl std::default::Default for ContentRatingMtrcbRating {
-    fn default() -> ContentRatingMtrcbRating {
-        ContentRatingMtrcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMtrcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMtrcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingMtrcbRating::MtrcbUnspecified => write!(f, "mtrcbUnspecified"),
-            ContentRatingMtrcbRating::MtrcbG => write!(f, "mtrcbG"),
-            ContentRatingMtrcbRating::MtrcbPg => write!(f, "mtrcbPg"),
-            ContentRatingMtrcbRating::MtrcbR13 => write!(f, "mtrcbR13"),
-            ContentRatingMtrcbRating::MtrcbR16 => write!(f, "mtrcbR16"),
-            ContentRatingMtrcbRating::MtrcbR18 => write!(f, "mtrcbR18"),
-            ContentRatingMtrcbRating::MtrcbX => write!(f, "mtrcbX"),
-            ContentRatingMtrcbRating::MtrcbUnrated => write!(f, "mtrcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNbcplRating {
-    Undefined,
-    ///
-    #[serde(rename = "nbcplUnspecified")]
-    NbcplUnspecified,
-    ///
-    #[serde(rename = "nbcplI")]
-    NbcplI,
-    ///
-    #[serde(rename = "nbcplIi")]
-    NbcplIi,
-    ///
-    #[serde(rename = "nbcplIii")]
-    NbcplIii,
-    ///
-    #[serde(rename = "nbcplIv")]
-    NbcplIv,
-    ///
-    #[serde(rename = "nbcpl18plus")]
-    Nbcpl18plus,
-    ///
-    #[serde(rename = "nbcplUnrated")]
-    NbcplUnrated,
-}
-
-impl std::default::Default for ContentRatingNbcplRating {
-    fn default() -> ContentRatingNbcplRating {
-        ContentRatingNbcplRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNbcplRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNbcplRating::Undefined => write!(f, "undefined"),
-            ContentRatingNbcplRating::NbcplUnspecified => write!(f, "nbcplUnspecified"),
-            ContentRatingNbcplRating::NbcplI => write!(f, "nbcplI"),
-            ContentRatingNbcplRating::NbcplIi => write!(f, "nbcplIi"),
-            ContentRatingNbcplRating::NbcplIii => write!(f, "nbcplIii"),
-            ContentRatingNbcplRating::NbcplIv => write!(f, "nbcplIv"),
-            ContentRatingNbcplRating::Nbcpl18plus => write!(f, "nbcpl18plus"),
-            ContentRatingNbcplRating::NbcplUnrated => write!(f, "nbcplUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMekuRating {
-    Undefined,
-    ///
-    #[serde(rename = "mekuUnspecified")]
-    MekuUnspecified,
-    /// S
-    #[serde(rename = "mekuS")]
-    MekuS,
-    /// 7
-    #[serde(rename = "meku7")]
-    Meku7,
-    /// 12
-    #[serde(rename = "meku12")]
-    Meku12,
-    /// 16
-    #[serde(rename = "meku16")]
-    Meku16,
-    /// 18
-    #[serde(rename = "meku18")]
-    Meku18,
-    ///
-    #[serde(rename = "mekuUnrated")]
-    MekuUnrated,
-}
-
-impl std::default::Default for ContentRatingMekuRating {
-    fn default() -> ContentRatingMekuRating {
-        ContentRatingMekuRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMekuRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMekuRating::Undefined => write!(f, "undefined"),
-            ContentRatingMekuRating::MekuUnspecified => write!(f, "mekuUnspecified"),
-            ContentRatingMekuRating::MekuS => write!(f, "mekuS"),
-            ContentRatingMekuRating::Meku7 => write!(f, "meku7"),
-            ContentRatingMekuRating::Meku12 => write!(f, "meku12"),
-            ContentRatingMekuRating::Meku16 => write!(f, "meku16"),
-            ContentRatingMekuRating::Meku18 => write!(f, "meku18"),
-            ContentRatingMekuRating::MekuUnrated => write!(f, "mekuUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAgcomRating {
-    Undefined,
-    ///
-    #[serde(rename = "agcomUnspecified")]
-    AgcomUnspecified,
-    /// T
-    #[serde(rename = "agcomT")]
-    AgcomT,
-    /// VM14
-    #[serde(rename = "agcomVm14")]
-    AgcomVm14,
-    /// VM18
-    #[serde(rename = "agcomVm18")]
-    AgcomVm18,
-    ///
-    #[serde(rename = "agcomUnrated")]
-    AgcomUnrated,
-}
-
-impl std::default::Default for ContentRatingAgcomRating {
-    fn default() -> ContentRatingAgcomRating {
-        ContentRatingAgcomRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAgcomRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAgcomRating::Undefined => write!(f, "undefined"),
-            ContentRatingAgcomRating::AgcomUnspecified => write!(f, "agcomUnspecified"),
-            ContentRatingAgcomRating::AgcomT => write!(f, "agcomT"),
-            ContentRatingAgcomRating::AgcomVm14 => write!(f, "agcomVm14"),
-            ContentRatingAgcomRating::AgcomVm18 => write!(f, "agcomVm18"),
-            ContentRatingAgcomRating::AgcomUnrated => write!(f, "agcomUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCicfRating {
-    Undefined,
-    ///
-    #[serde(rename = "cicfUnspecified")]
-    CicfUnspecified,
-    /// E
-    #[serde(rename = "cicfE")]
-    CicfE,
-    /// KT/EA
-    #[serde(rename = "cicfKtEa")]
-    CicfKtEa,
-    /// KNT/ENA
-    #[serde(rename = "cicfKntEna")]
-    CicfKntEna,
-    ///
-    #[serde(rename = "cicfUnrated")]
-    CicfUnrated,
-}
-
-impl std::default::Default for ContentRatingCicfRating {
-    fn default() -> ContentRatingCicfRating {
-        ContentRatingCicfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCicfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCicfRating::Undefined => write!(f, "undefined"),
-            ContentRatingCicfRating::CicfUnspecified => write!(f, "cicfUnspecified"),
-            ContentRatingCicfRating::CicfE => write!(f, "cicfE"),
-            ContentRatingCicfRating::CicfKtEa => write!(f, "cicfKtEa"),
-            ContentRatingCicfRating::CicfKntEna => write!(f, "cicfKntEna"),
-            ContentRatingCicfRating::CicfUnrated => write!(f, "cicfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNbcRating {
-    Undefined,
-    ///
-    #[serde(rename = "nbcUnspecified")]
-    NbcUnspecified,
-    /// G
-    #[serde(rename = "nbcG")]
-    NbcG,
-    /// PG
-    #[serde(rename = "nbcPg")]
-    NbcPg,
-    /// 12+
-    #[serde(rename = "nbc12plus")]
-    Nbc12plus,
-    /// 15+
-    #[serde(rename = "nbc15plus")]
-    Nbc15plus,
-    /// 18+
-    #[serde(rename = "nbc18plus")]
-    Nbc18plus,
-    /// 18+R
-    #[serde(rename = "nbc18plusr")]
-    Nbc18plusr,
-    /// PU
-    #[serde(rename = "nbcPu")]
-    NbcPu,
-    ///
-    #[serde(rename = "nbcUnrated")]
-    NbcUnrated,
-}
-
-impl std::default::Default for ContentRatingNbcRating {
-    fn default() -> ContentRatingNbcRating {
-        ContentRatingNbcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNbcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNbcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNbcRating::NbcUnspecified => write!(f, "nbcUnspecified"),
-            ContentRatingNbcRating::NbcG => write!(f, "nbcG"),
-            ContentRatingNbcRating::NbcPg => write!(f, "nbcPg"),
-            ContentRatingNbcRating::Nbc12plus => write!(f, "nbc12plus"),
-            ContentRatingNbcRating::Nbc15plus => write!(f, "nbc15plus"),
-            ContentRatingNbcRating::Nbc18plus => write!(f, "nbc18plus"),
-            ContentRatingNbcRating::Nbc18plusr => write!(f, "nbc18plusr"),
-            ContentRatingNbcRating::NbcPu => write!(f, "nbcPu"),
-            ContentRatingNbcRating::NbcUnrated => write!(f, "nbcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCccRating {
-    Undefined,
-    ///
-    #[serde(rename = "cccUnspecified")]
-    CccUnspecified,
-    /// Todo espectador
-    #[serde(rename = "cccTe")]
-    CccTe,
-    /// 6+ - Inconveniente para menores de 7 años
-    #[serde(rename = "ccc6")]
-    Ccc6,
-    /// 14+
-    #[serde(rename = "ccc14")]
-    Ccc14,
-    /// 18+
-    #[serde(rename = "ccc18")]
-    Ccc18,
-    /// 18+ - contenido excesivamente violento
-    #[serde(rename = "ccc18v")]
-    Ccc18v,
-    /// 18+ - contenido pornográfico
-    #[serde(rename = "ccc18s")]
-    Ccc18s,
-    ///
-    #[serde(rename = "cccUnrated")]
-    CccUnrated,
-}
-
-impl std::default::Default for ContentRatingCccRating {
-    fn default() -> ContentRatingCccRating {
-        ContentRatingCccRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCccRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCccRating::Undefined => write!(f, "undefined"),
-            ContentRatingCccRating::CccUnspecified => write!(f, "cccUnspecified"),
-            ContentRatingCccRating::CccTe => write!(f, "cccTe"),
-            ContentRatingCccRating::Ccc6 => write!(f, "ccc6"),
-            ContentRatingCccRating::Ccc14 => write!(f, "ccc14"),
-            ContentRatingCccRating::Ccc18 => write!(f, "ccc18"),
-            ContentRatingCccRating::Ccc18v => write!(f, "ccc18v"),
-            ContentRatingCccRating::Ccc18s => write!(f, "ccc18s"),
-            ContentRatingCccRating::CccUnrated => write!(f, "cccUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCzfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "czfilmUnspecified")]
-    CzfilmUnspecified,
-    /// U
-    #[serde(rename = "czfilmU")]
-    CzfilmU,
-    /// 12
-    #[serde(rename = "czfilm12")]
-    Czfilm12,
-    /// 14
-    #[serde(rename = "czfilm14")]
-    Czfilm14,
-    /// 18
-    #[serde(rename = "czfilm18")]
-    Czfilm18,
-    ///
-    #[serde(rename = "czfilmUnrated")]
-    CzfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingCzfilmRating {
-    fn default() -> ContentRatingCzfilmRating {
-        ContentRatingCzfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCzfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCzfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingCzfilmRating::CzfilmUnspecified => write!(f, "czfilmUnspecified"),
-            ContentRatingCzfilmRating::CzfilmU => write!(f, "czfilmU"),
-            ContentRatingCzfilmRating::Czfilm12 => write!(f, "czfilm12"),
-            ContentRatingCzfilmRating::Czfilm14 => write!(f, "czfilm14"),
-            ContentRatingCzfilmRating::Czfilm18 => write!(f, "czfilm18"),
-            ContentRatingCzfilmRating::CzfilmUnrated => write!(f, "czfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCsaRating {
-    Undefined,
-    ///
-    #[serde(rename = "csaUnspecified")]
-    CsaUnspecified,
-    /// T
-    #[serde(rename = "csaT")]
-    CsaT,
-    /// 10
-    #[serde(rename = "csa10")]
-    Csa10,
-    /// 12
-    #[serde(rename = "csa12")]
-    Csa12,
-    /// 16
-    #[serde(rename = "csa16")]
-    Csa16,
-    /// 18
-    #[serde(rename = "csa18")]
-    Csa18,
-    /// Interdiction
-    #[serde(rename = "csaInterdiction")]
-    CsaInterdiction,
-    ///
-    #[serde(rename = "csaUnrated")]
-    CsaUnrated,
-}
-
-impl std::default::Default for ContentRatingCsaRating {
-    fn default() -> ContentRatingCsaRating {
-        ContentRatingCsaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCsaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCsaRating::Undefined => write!(f, "undefined"),
-            ContentRatingCsaRating::CsaUnspecified => write!(f, "csaUnspecified"),
-            ContentRatingCsaRating::CsaT => write!(f, "csaT"),
-            ContentRatingCsaRating::Csa10 => write!(f, "csa10"),
-            ContentRatingCsaRating::Csa12 => write!(f, "csa12"),
-            ContentRatingCsaRating::Csa16 => write!(f, "csa16"),
-            ContentRatingCsaRating::Csa18 => write!(f, "csa18"),
-            ContentRatingCsaRating::CsaInterdiction => write!(f, "csaInterdiction"),
-            ContentRatingCsaRating::CsaUnrated => write!(f, "csaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNkclvRating {
-    Undefined,
-    ///
-    #[serde(rename = "nkclvUnspecified")]
-    NkclvUnspecified,
-    /// U
-    #[serde(rename = "nkclvU")]
-    NkclvU,
-    /// 7+
-    #[serde(rename = "nkclv7plus")]
-    Nkclv7plus,
-    /// 12+
-    #[serde(rename = "nkclv12plus")]
-    Nkclv12plus,
-    /// ! 16+
-    #[serde(rename = "nkclv16plus")]
-    Nkclv16plus,
-    /// 18+
-    #[serde(rename = "nkclv18plus")]
-    Nkclv18plus,
-    ///
-    #[serde(rename = "nkclvUnrated")]
-    NkclvUnrated,
-}
-
-impl std::default::Default for ContentRatingNkclvRating {
-    fn default() -> ContentRatingNkclvRating {
-        ContentRatingNkclvRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNkclvRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNkclvRating::Undefined => write!(f, "undefined"),
-            ContentRatingNkclvRating::NkclvUnspecified => write!(f, "nkclvUnspecified"),
-            ContentRatingNkclvRating::NkclvU => write!(f, "nkclvU"),
-            ContentRatingNkclvRating::Nkclv7plus => write!(f, "nkclv7plus"),
-            ContentRatingNkclvRating::Nkclv12plus => write!(f, "nkclv12plus"),
-            ContentRatingNkclvRating::Nkclv16plus => write!(f, "nkclv16plus"),
-            ContentRatingNkclvRating::Nkclv18plus => write!(f, "nkclv18plus"),
-            ContentRatingNkclvRating::NkclvUnrated => write!(f, "nkclvUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEcbmctRating {
-    Undefined,
-    ///
-    #[serde(rename = "ecbmctUnspecified")]
-    EcbmctUnspecified,
-    /// G
-    #[serde(rename = "ecbmctG")]
-    EcbmctG,
-    /// 7A
-    #[serde(rename = "ecbmct7a")]
-    Ecbmct7a,
-    /// 7+
-    #[serde(rename = "ecbmct7plus")]
-    Ecbmct7plus,
-    /// 13A
-    #[serde(rename = "ecbmct13a")]
-    Ecbmct13a,
-    /// 13+
-    #[serde(rename = "ecbmct13plus")]
-    Ecbmct13plus,
-    /// 15A
-    #[serde(rename = "ecbmct15a")]
-    Ecbmct15a,
-    /// 15+
-    #[serde(rename = "ecbmct15plus")]
-    Ecbmct15plus,
-    /// 18+
-    #[serde(rename = "ecbmct18plus")]
-    Ecbmct18plus,
-    ///
-    #[serde(rename = "ecbmctUnrated")]
-    EcbmctUnrated,
-}
-
-impl std::default::Default for ContentRatingEcbmctRating {
-    fn default() -> ContentRatingEcbmctRating {
-        ContentRatingEcbmctRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEcbmctRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEcbmctRating::Undefined => write!(f, "undefined"),
-            ContentRatingEcbmctRating::EcbmctUnspecified => write!(f, "ecbmctUnspecified"),
-            ContentRatingEcbmctRating::EcbmctG => write!(f, "ecbmctG"),
-            ContentRatingEcbmctRating::Ecbmct7a => write!(f, "ecbmct7a"),
-            ContentRatingEcbmctRating::Ecbmct7plus => write!(f, "ecbmct7plus"),
-            ContentRatingEcbmctRating::Ecbmct13a => write!(f, "ecbmct13a"),
-            ContentRatingEcbmctRating::Ecbmct13plus => write!(f, "ecbmct13plus"),
-            ContentRatingEcbmctRating::Ecbmct15a => write!(f, "ecbmct15a"),
-            ContentRatingEcbmctRating::Ecbmct15plus => write!(f, "ecbmct15plus"),
-            ContentRatingEcbmctRating::Ecbmct18plus => write!(f, "ecbmct18plus"),
-            ContentRatingEcbmctRating::EcbmctUnrated => write!(f, "ecbmctUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingLsfRating {
-    Undefined,
-    ///
-    #[serde(rename = "lsfUnspecified")]
-    LsfUnspecified,
-    /// SU
-    #[serde(rename = "lsfSu")]
-    LsfSu,
-    /// A
-    #[serde(rename = "lsfA")]
-    LsfA,
-    /// BO
-    #[serde(rename = "lsfBo")]
-    LsfBo,
-    /// 13
-    #[serde(rename = "lsf13")]
-    Lsf13,
-    /// R
-    #[serde(rename = "lsfR")]
-    LsfR,
-    /// 17
-    #[serde(rename = "lsf17")]
-    Lsf17,
-    /// D
-    #[serde(rename = "lsfD")]
-    LsfD,
-    /// 21
-    #[serde(rename = "lsf21")]
-    Lsf21,
-    ///
-    #[serde(rename = "lsfUnrated")]
-    LsfUnrated,
-}
-
-impl std::default::Default for ContentRatingLsfRating {
-    fn default() -> ContentRatingLsfRating {
-        ContentRatingLsfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingLsfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingLsfRating::Undefined => write!(f, "undefined"),
-            ContentRatingLsfRating::LsfUnspecified => write!(f, "lsfUnspecified"),
-            ContentRatingLsfRating::LsfSu => write!(f, "lsfSu"),
-            ContentRatingLsfRating::LsfA => write!(f, "lsfA"),
-            ContentRatingLsfRating::LsfBo => write!(f, "lsfBo"),
-            ContentRatingLsfRating::Lsf13 => write!(f, "lsf13"),
-            ContentRatingLsfRating::LsfR => write!(f, "lsfR"),
-            ContentRatingLsfRating::Lsf17 => write!(f, "lsf17"),
-            ContentRatingLsfRating::LsfD => write!(f, "lsfD"),
-            ContentRatingLsfRating::Lsf21 => write!(f, "lsf21"),
-            ContentRatingLsfRating::LsfUnrated => write!(f, "lsfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMcstRating {
-    Undefined,
-    ///
-    #[serde(rename = "mcstUnspecified")]
-    McstUnspecified,
-    /// P
-    #[serde(rename = "mcstP")]
-    McstP,
-    /// 0
-    #[serde(rename = "mcst0")]
-    Mcst0,
-    /// C13
-    #[serde(rename = "mcstC13")]
-    McstC13,
-    /// C16
-    #[serde(rename = "mcstC16")]
-    McstC16,
-    /// 16+
-    #[serde(rename = "mcst16plus")]
-    Mcst16plus,
-    /// C18
-    #[serde(rename = "mcstC18")]
-    McstC18,
-    /// MCST_G_PG
-    #[serde(rename = "mcstGPg")]
-    McstGPg,
-    ///
-    #[serde(rename = "mcstUnrated")]
-    McstUnrated,
-}
-
-impl std::default::Default for ContentRatingMcstRating {
-    fn default() -> ContentRatingMcstRating {
-        ContentRatingMcstRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMcstRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMcstRating::Undefined => write!(f, "undefined"),
-            ContentRatingMcstRating::McstUnspecified => write!(f, "mcstUnspecified"),
-            ContentRatingMcstRating::McstP => write!(f, "mcstP"),
-            ContentRatingMcstRating::Mcst0 => write!(f, "mcst0"),
-            ContentRatingMcstRating::McstC13 => write!(f, "mcstC13"),
-            ContentRatingMcstRating::McstC16 => write!(f, "mcstC16"),
-            ContentRatingMcstRating::Mcst16plus => write!(f, "mcst16plus"),
-            ContentRatingMcstRating::McstC18 => write!(f, "mcstC18"),
-            ContentRatingMcstRating::McstGPg => write!(f, "mcstGPg"),
-            ContentRatingMcstRating::McstUnrated => write!(f, "mcstUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingTvpgRating {
-    Undefined,
-    ///
-    #[serde(rename = "tvpgUnspecified")]
-    TvpgUnspecified,
-    /// TV-Y
-    #[serde(rename = "tvpgY")]
-    TvpgY,
-    /// TV-Y7
-    #[serde(rename = "tvpgY7")]
-    TvpgY7,
-    /// TV-Y7-FV
-    #[serde(rename = "tvpgY7Fv")]
-    TvpgY7Fv,
-    /// TV-G
-    #[serde(rename = "tvpgG")]
-    TvpgG,
-    /// TV-PG
-    #[serde(rename = "tvpgPg")]
-    TvpgPg,
-    /// TV-14
-    #[serde(rename = "pg14")]
-    Pg14,
-    /// TV-MA
-    #[serde(rename = "tvpgMa")]
-    TvpgMa,
-    ///
-    #[serde(rename = "tvpgUnrated")]
-    TvpgUnrated,
-}
-
-impl std::default::Default for ContentRatingTvpgRating {
-    fn default() -> ContentRatingTvpgRating {
-        ContentRatingTvpgRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingTvpgRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingTvpgRating::Undefined => write!(f, "undefined"),
-            ContentRatingTvpgRating::TvpgUnspecified => write!(f, "tvpgUnspecified"),
-            ContentRatingTvpgRating::TvpgY => write!(f, "tvpgY"),
-            ContentRatingTvpgRating::TvpgY7 => write!(f, "tvpgY7"),
-            ContentRatingTvpgRating::TvpgY7Fv => write!(f, "tvpgY7Fv"),
-            ContentRatingTvpgRating::TvpgG => write!(f, "tvpgG"),
-            ContentRatingTvpgRating::TvpgPg => write!(f, "tvpgPg"),
-            ContentRatingTvpgRating::Pg14 => write!(f, "pg14"),
-            ContentRatingTvpgRating::TvpgMa => write!(f, "tvpgMa"),
-            ContentRatingTvpgRating::TvpgUnrated => write!(f, "tvpgUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCatvRating {
-    Undefined,
-    ///
-    #[serde(rename = "catvUnspecified")]
-    CatvUnspecified,
-    /// C
-    #[serde(rename = "catvC")]
-    CatvC,
-    /// C8
-    #[serde(rename = "catvC8")]
-    CatvC8,
-    /// G
-    #[serde(rename = "catvG")]
-    CatvG,
-    /// PG
-    #[serde(rename = "catvPg")]
-    CatvPg,
-    /// 14+
-    #[serde(rename = "catv14plus")]
-    Catv14plus,
-    /// 18+
-    #[serde(rename = "catv18plus")]
-    Catv18plus,
-    ///
-    #[serde(rename = "catvUnrated")]
-    CatvUnrated,
-    ///
-    #[serde(rename = "catvE")]
-    CatvE,
-}
-
-impl std::default::Default for ContentRatingCatvRating {
-    fn default() -> ContentRatingCatvRating {
-        ContentRatingCatvRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCatvRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCatvRating::Undefined => write!(f, "undefined"),
-            ContentRatingCatvRating::CatvUnspecified => write!(f, "catvUnspecified"),
-            ContentRatingCatvRating::CatvC => write!(f, "catvC"),
-            ContentRatingCatvRating::CatvC8 => write!(f, "catvC8"),
-            ContentRatingCatvRating::CatvG => write!(f, "catvG"),
-            ContentRatingCatvRating::CatvPg => write!(f, "catvPg"),
-            ContentRatingCatvRating::Catv14plus => write!(f, "catv14plus"),
-            ContentRatingCatvRating::Catv18plus => write!(f, "catv18plus"),
-            ContentRatingCatvRating::CatvUnrated => write!(f, "catvUnrated"),
-            ContentRatingCatvRating::CatvE => write!(f, "catvE"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingResorteviolenciaRating {
-    Undefined,
-    ///
-    #[serde(rename = "resorteviolenciaUnspecified")]
-    ResorteviolenciaUnspecified,
-    /// A
-    #[serde(rename = "resorteviolenciaA")]
-    ResorteviolenciaA,
-    /// B
-    #[serde(rename = "resorteviolenciaB")]
-    ResorteviolenciaB,
-    /// C
-    #[serde(rename = "resorteviolenciaC")]
-    ResorteviolenciaC,
-    /// D
-    #[serde(rename = "resorteviolenciaD")]
-    ResorteviolenciaD,
-    /// E
-    #[serde(rename = "resorteviolenciaE")]
-    ResorteviolenciaE,
-    ///
-    #[serde(rename = "resorteviolenciaUnrated")]
-    ResorteviolenciaUnrated,
-}
-
-impl std::default::Default for ContentRatingResorteviolenciaRating {
-    fn default() -> ContentRatingResorteviolenciaRating {
-        ContentRatingResorteviolenciaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingResorteviolenciaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingResorteviolenciaRating::Undefined => write!(f, "undefined"),
-            ContentRatingResorteviolenciaRating::ResorteviolenciaUnspecified => {
-                write!(f, "resorteviolenciaUnspecified")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaA => {
-                write!(f, "resorteviolenciaA")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaB => {
-                write!(f, "resorteviolenciaB")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaC => {
-                write!(f, "resorteviolenciaC")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaD => {
-                write!(f, "resorteviolenciaD")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaE => {
-                write!(f, "resorteviolenciaE")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaUnrated => {
-                write!(f, "resorteviolenciaUnrated")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIcaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "icaaUnspecified")]
-    IcaaUnspecified,
-    /// APTA
-    #[serde(rename = "icaaApta")]
-    IcaaApta,
-    /// 7
-    #[serde(rename = "icaa7")]
-    Icaa7,
-    /// 12
-    #[serde(rename = "icaa12")]
-    Icaa12,
-    /// 13
-    #[serde(rename = "icaa13")]
-    Icaa13,
-    /// 16
-    #[serde(rename = "icaa16")]
-    Icaa16,
-    /// 18
-    #[serde(rename = "icaa18")]
-    Icaa18,
-    /// X
-    #[serde(rename = "icaaX")]
-    IcaaX,
-    ///
-    #[serde(rename = "icaaUnrated")]
-    IcaaUnrated,
-}
-
-impl std::default::Default for ContentRatingIcaaRating {
-    fn default() -> ContentRatingIcaaRating {
-        ContentRatingIcaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIcaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIcaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingIcaaRating::IcaaUnspecified => write!(f, "icaaUnspecified"),
-            ContentRatingIcaaRating::IcaaApta => write!(f, "icaaApta"),
-            ContentRatingIcaaRating::Icaa7 => write!(f, "icaa7"),
-            ContentRatingIcaaRating::Icaa12 => write!(f, "icaa12"),
-            ContentRatingIcaaRating::Icaa13 => write!(f, "icaa13"),
-            ContentRatingIcaaRating::Icaa16 => write!(f, "icaa16"),
-            ContentRatingIcaaRating::Icaa18 => write!(f, "icaa18"),
-            ContentRatingIcaaRating::IcaaX => write!(f, "icaaX"),
-            ContentRatingIcaaRating::IcaaUnrated => write!(f, "icaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingDjctqRating {
-    Undefined,
-    ///
-    #[serde(rename = "djctqUnspecified")]
-    DjctqUnspecified,
-    /// L
-    #[serde(rename = "djctqL")]
-    DjctqL,
-    /// 10
-    #[serde(rename = "djctq10")]
-    Djctq10,
-    /// 12
-    #[serde(rename = "djctq12")]
-    Djctq12,
-    /// 14
-    #[serde(rename = "djctq14")]
-    Djctq14,
-    /// 16
-    #[serde(rename = "djctq16")]
-    Djctq16,
-    /// 18
-    #[serde(rename = "djctq18")]
-    Djctq18,
-    ///
-    #[serde(rename = "djctqEr")]
-    DjctqEr,
-    ///
-    #[serde(rename = "djctqL10")]
-    DjctqL10,
-    ///
-    #[serde(rename = "djctqL12")]
-    DjctqL12,
-    ///
-    #[serde(rename = "djctqL14")]
-    DjctqL14,
-    ///
-    #[serde(rename = "djctqL16")]
-    DjctqL16,
-    ///
-    #[serde(rename = "djctqL18")]
-    DjctqL18,
-    ///
-    #[serde(rename = "djctq1012")]
-    Djctq1012,
-    ///
-    #[serde(rename = "djctq1014")]
-    Djctq1014,
-    ///
-    #[serde(rename = "djctq1016")]
-    Djctq1016,
-    ///
-    #[serde(rename = "djctq1018")]
-    Djctq1018,
-    ///
-    #[serde(rename = "djctq1214")]
-    Djctq1214,
-    ///
-    #[serde(rename = "djctq1216")]
-    Djctq1216,
-    ///
-    #[serde(rename = "djctq1218")]
-    Djctq1218,
-    ///
-    #[serde(rename = "djctq1416")]
-    Djctq1416,
-    ///
-    #[serde(rename = "djctq1418")]
-    Djctq1418,
-    ///
-    #[serde(rename = "djctq1618")]
-    Djctq1618,
-    ///
-    #[serde(rename = "djctqUnrated")]
-    DjctqUnrated,
-}
-
-impl std::default::Default for ContentRatingDjctqRating {
-    fn default() -> ContentRatingDjctqRating {
-        ContentRatingDjctqRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingDjctqRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingDjctqRating::Undefined => write!(f, "undefined"),
-            ContentRatingDjctqRating::DjctqUnspecified => write!(f, "djctqUnspecified"),
-            ContentRatingDjctqRating::DjctqL => write!(f, "djctqL"),
-            ContentRatingDjctqRating::Djctq10 => write!(f, "djctq10"),
-            ContentRatingDjctqRating::Djctq12 => write!(f, "djctq12"),
-            ContentRatingDjctqRating::Djctq14 => write!(f, "djctq14"),
-            ContentRatingDjctqRating::Djctq16 => write!(f, "djctq16"),
-            ContentRatingDjctqRating::Djctq18 => write!(f, "djctq18"),
-            ContentRatingDjctqRating::DjctqEr => write!(f, "djctqEr"),
-            ContentRatingDjctqRating::DjctqL10 => write!(f, "djctqL10"),
-            ContentRatingDjctqRating::DjctqL12 => write!(f, "djctqL12"),
-            ContentRatingDjctqRating::DjctqL14 => write!(f, "djctqL14"),
-            ContentRatingDjctqRating::DjctqL16 => write!(f, "djctqL16"),
-            ContentRatingDjctqRating::DjctqL18 => write!(f, "djctqL18"),
-            ContentRatingDjctqRating::Djctq1012 => write!(f, "djctq1012"),
-            ContentRatingDjctqRating::Djctq1014 => write!(f, "djctq1014"),
-            ContentRatingDjctqRating::Djctq1016 => write!(f, "djctq1016"),
-            ContentRatingDjctqRating::Djctq1018 => write!(f, "djctq1018"),
-            ContentRatingDjctqRating::Djctq1214 => write!(f, "djctq1214"),
-            ContentRatingDjctqRating::Djctq1216 => write!(f, "djctq1216"),
-            ContentRatingDjctqRating::Djctq1218 => write!(f, "djctq1218"),
-            ContentRatingDjctqRating::Djctq1416 => write!(f, "djctq1416"),
-            ContentRatingDjctqRating::Djctq1418 => write!(f, "djctq1418"),
-            ContentRatingDjctqRating::Djctq1618 => write!(f, "djctq1618"),
-            ContentRatingDjctqRating::DjctqUnrated => write!(f, "djctqUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKijkwijzerRating {
-    Undefined,
-    ///
-    #[serde(rename = "kijkwijzerUnspecified")]
-    KijkwijzerUnspecified,
-    /// AL
-    #[serde(rename = "kijkwijzerAl")]
-    KijkwijzerAl,
-    /// 6
-    #[serde(rename = "kijkwijzer6")]
-    Kijkwijzer6,
-    /// 9
-    #[serde(rename = "kijkwijzer9")]
-    Kijkwijzer9,
-    /// 12
-    #[serde(rename = "kijkwijzer12")]
-    Kijkwijzer12,
-    /// 16
-    #[serde(rename = "kijkwijzer16")]
-    Kijkwijzer16,
-    ///
-    #[serde(rename = "kijkwijzer18")]
-    Kijkwijzer18,
-    ///
-    #[serde(rename = "kijkwijzerUnrated")]
-    KijkwijzerUnrated,
-}
-
-impl std::default::Default for ContentRatingKijkwijzerRating {
-    fn default() -> ContentRatingKijkwijzerRating {
-        ContentRatingKijkwijzerRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKijkwijzerRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKijkwijzerRating::Undefined => write!(f, "undefined"),
-            ContentRatingKijkwijzerRating::KijkwijzerUnspecified => {
-                write!(f, "kijkwijzerUnspecified")
-            }
-            ContentRatingKijkwijzerRating::KijkwijzerAl => write!(f, "kijkwijzerAl"),
-            ContentRatingKijkwijzerRating::Kijkwijzer6 => write!(f, "kijkwijzer6"),
-            ContentRatingKijkwijzerRating::Kijkwijzer9 => write!(f, "kijkwijzer9"),
-            ContentRatingKijkwijzerRating::Kijkwijzer12 => write!(f, "kijkwijzer12"),
-            ContentRatingKijkwijzerRating::Kijkwijzer16 => write!(f, "kijkwijzer16"),
-            ContentRatingKijkwijzerRating::Kijkwijzer18 => write!(f, "kijkwijzer18"),
-            ContentRatingKijkwijzerRating::KijkwijzerUnrated => write!(f, "kijkwijzerUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEefilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "eefilmUnspecified")]
-    EefilmUnspecified,
-    /// Pere
-    #[serde(rename = "eefilmPere")]
-    EefilmPere,
-    /// L
-    #[serde(rename = "eefilmL")]
-    EefilmL,
-    /// MS-6
-    #[serde(rename = "eefilmMs6")]
-    EefilmMs6,
-    /// K-6
-    #[serde(rename = "eefilmK6")]
-    EefilmK6,
-    /// MS-12
-    #[serde(rename = "eefilmMs12")]
-    EefilmMs12,
-    /// K-12
-    #[serde(rename = "eefilmK12")]
-    EefilmK12,
-    /// K-14
-    #[serde(rename = "eefilmK14")]
-    EefilmK14,
-    /// K-16
-    #[serde(rename = "eefilmK16")]
-    EefilmK16,
-    ///
-    #[serde(rename = "eefilmUnrated")]
-    EefilmUnrated,
-}
-
-impl std::default::Default for ContentRatingEefilmRating {
-    fn default() -> ContentRatingEefilmRating {
-        ContentRatingEefilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEefilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEefilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingEefilmRating::EefilmUnspecified => write!(f, "eefilmUnspecified"),
-            ContentRatingEefilmRating::EefilmPere => write!(f, "eefilmPere"),
-            ContentRatingEefilmRating::EefilmL => write!(f, "eefilmL"),
-            ContentRatingEefilmRating::EefilmMs6 => write!(f, "eefilmMs6"),
-            ContentRatingEefilmRating::EefilmK6 => write!(f, "eefilmK6"),
-            ContentRatingEefilmRating::EefilmMs12 => write!(f, "eefilmMs12"),
-            ContentRatingEefilmRating::EefilmK12 => write!(f, "eefilmK12"),
-            ContentRatingEefilmRating::EefilmK14 => write!(f, "eefilmK14"),
-            ContentRatingEefilmRating::EefilmK16 => write!(f, "eefilmK16"),
-            ContentRatingEefilmRating::EefilmUnrated => write!(f, "eefilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCnaRating {
-    Undefined,
-    ///
-    #[serde(rename = "cnaUnspecified")]
-    CnaUnspecified,
-    /// AP
-    #[serde(rename = "cnaAp")]
-    CnaAp,
-    /// 12
-    #[serde(rename = "cna12")]
-    Cna12,
-    /// 15
-    #[serde(rename = "cna15")]
-    Cna15,
-    /// 18
-    #[serde(rename = "cna18")]
-    Cna18,
-    /// 18+
-    #[serde(rename = "cna18plus")]
-    Cna18plus,
-    ///
-    #[serde(rename = "cnaUnrated")]
-    CnaUnrated,
-}
-
-impl std::default::Default for ContentRatingCnaRating {
-    fn default() -> ContentRatingCnaRating {
-        ContentRatingCnaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCnaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCnaRating::Undefined => write!(f, "undefined"),
-            ContentRatingCnaRating::CnaUnspecified => write!(f, "cnaUnspecified"),
-            ContentRatingCnaRating::CnaAp => write!(f, "cnaAp"),
-            ContentRatingCnaRating::Cna12 => write!(f, "cna12"),
-            ContentRatingCnaRating::Cna15 => write!(f, "cna15"),
-            ContentRatingCnaRating::Cna18 => write!(f, "cna18"),
-            ContentRatingCnaRating::Cna18plus => write!(f, "cna18plus"),
-            ContentRatingCnaRating::CnaUnrated => write!(f, "cnaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingChvrsRating {
-    Undefined,
-    ///
-    #[serde(rename = "chvrsUnspecified")]
-    ChvrsUnspecified,
-    /// G
-    #[serde(rename = "chvrsG")]
-    ChvrsG,
-    /// PG
-    #[serde(rename = "chvrsPg")]
-    ChvrsPg,
-    /// 14A
-    #[serde(rename = "chvrs14a")]
-    Chvrs14a,
-    /// 18A
-    #[serde(rename = "chvrs18a")]
-    Chvrs18a,
-    /// R
-    #[serde(rename = "chvrsR")]
-    ChvrsR,
-    /// E
-    #[serde(rename = "chvrsE")]
-    ChvrsE,
-    ///
-    #[serde(rename = "chvrsUnrated")]
-    ChvrsUnrated,
-}
-
-impl std::default::Default for ContentRatingChvrsRating {
-    fn default() -> ContentRatingChvrsRating {
-        ContentRatingChvrsRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingChvrsRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingChvrsRating::Undefined => write!(f, "undefined"),
-            ContentRatingChvrsRating::ChvrsUnspecified => write!(f, "chvrsUnspecified"),
-            ContentRatingChvrsRating::ChvrsG => write!(f, "chvrsG"),
-            ContentRatingChvrsRating::ChvrsPg => write!(f, "chvrsPg"),
-            ContentRatingChvrsRating::Chvrs14a => write!(f, "chvrs14a"),
-            ContentRatingChvrsRating::Chvrs18a => write!(f, "chvrs18a"),
-            ContentRatingChvrsRating::ChvrsR => write!(f, "chvrsR"),
-            ContentRatingChvrsRating::ChvrsE => write!(f, "chvrsE"),
-            ContentRatingChvrsRating::ChvrsUnrated => write!(f, "chvrsUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSkfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "skfilmUnspecified")]
-    SkfilmUnspecified,
-    /// G
-    #[serde(rename = "skfilmG")]
-    SkfilmG,
-    /// P2
-    #[serde(rename = "skfilmP2")]
-    SkfilmP2,
-    /// P5
-    #[serde(rename = "skfilmP5")]
-    SkfilmP5,
-    /// P8
-    #[serde(rename = "skfilmP8")]
-    SkfilmP8,
-    ///
-    #[serde(rename = "skfilmUnrated")]
-    SkfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingSkfilmRating {
-    fn default() -> ContentRatingSkfilmRating {
-        ContentRatingSkfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSkfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSkfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingSkfilmRating::SkfilmUnspecified => write!(f, "skfilmUnspecified"),
-            ContentRatingSkfilmRating::SkfilmG => write!(f, "skfilmG"),
-            ContentRatingSkfilmRating::SkfilmP2 => write!(f, "skfilmP2"),
-            ContentRatingSkfilmRating::SkfilmP5 => write!(f, "skfilmP5"),
-            ContentRatingSkfilmRating::SkfilmP8 => write!(f, "skfilmP8"),
-            ContentRatingSkfilmRating::SkfilmUnrated => write!(f, "skfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "acbUnspecified")]
-    AcbUnspecified,
-    /// E
-    #[serde(rename = "acbE")]
-    AcbE,
-    /// Programs that have been given a P classification by the Australian Communications and Media Authority. These programs are intended for preschool children.
-    #[serde(rename = "acbP")]
-    AcbP,
-    /// Programs that have been given a C classification by the Australian Communications and Media Authority. These programs are intended for children (other than preschool children) who are younger than 14 years of age.
-    #[serde(rename = "acbC")]
-    AcbC,
-    /// G
-    #[serde(rename = "acbG")]
-    AcbG,
-    /// PG
-    #[serde(rename = "acbPg")]
-    AcbPg,
-    /// M
-    #[serde(rename = "acbM")]
-    AcbM,
-    /// MA15+
-    #[serde(rename = "acbMa15plus")]
-    AcbMa15plus,
-    /// R18+
-    #[serde(rename = "acbR18plus")]
-    AcbR18plus,
-    ///
-    #[serde(rename = "acbUnrated")]
-    AcbUnrated,
-}
-
-impl std::default::Default for ContentRatingAcbRating {
-    fn default() -> ContentRatingAcbRating {
-        ContentRatingAcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingAcbRating::AcbUnspecified => write!(f, "acbUnspecified"),
-            ContentRatingAcbRating::AcbE => write!(f, "acbE"),
-            ContentRatingAcbRating::AcbP => write!(f, "acbP"),
-            ContentRatingAcbRating::AcbC => write!(f, "acbC"),
-            ContentRatingAcbRating::AcbG => write!(f, "acbG"),
-            ContentRatingAcbRating::AcbPg => write!(f, "acbPg"),
-            ContentRatingAcbRating::AcbM => write!(f, "acbM"),
-            ContentRatingAcbRating::AcbMa15plus => write!(f, "acbMa15plus"),
-            ContentRatingAcbRating::AcbR18plus => write!(f, "acbR18plus"),
-            ContentRatingAcbRating::AcbUnrated => write!(f, "acbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMccypRating {
-    Undefined,
-    ///
-    #[serde(rename = "mccypUnspecified")]
-    MccypUnspecified,
-    /// A
-    #[serde(rename = "mccypA")]
-    MccypA,
-    /// 7
-    #[serde(rename = "mccyp7")]
-    Mccyp7,
-    /// 11
-    #[serde(rename = "mccyp11")]
-    Mccyp11,
-    /// 15
-    #[serde(rename = "mccyp15")]
-    Mccyp15,
-    ///
-    #[serde(rename = "mccypUnrated")]
-    MccypUnrated,
-}
-
-impl std::default::Default for ContentRatingMccypRating {
-    fn default() -> ContentRatingMccypRating {
-        ContentRatingMccypRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMccypRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMccypRating::Undefined => write!(f, "undefined"),
-            ContentRatingMccypRating::MccypUnspecified => write!(f, "mccypUnspecified"),
-            ContentRatingMccypRating::MccypA => write!(f, "mccypA"),
-            ContentRatingMccypRating::Mccyp7 => write!(f, "mccyp7"),
-            ContentRatingMccypRating::Mccyp11 => write!(f, "mccyp11"),
-            ContentRatingMccypRating::Mccyp15 => write!(f, "mccyp15"),
-            ContentRatingMccypRating::MccypUnrated => write!(f, "mccypUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAnatelRating {
-    Undefined,
-    ///
-    #[serde(rename = "anatelUnspecified")]
-    AnatelUnspecified,
-    /// F
-    #[serde(rename = "anatelF")]
-    AnatelF,
-    /// I
-    #[serde(rename = "anatelI")]
-    AnatelI,
-    /// I-7
-    #[serde(rename = "anatelI7")]
-    AnatelI7,
-    /// I-10
-    #[serde(rename = "anatelI10")]
-    AnatelI10,
-    /// I-12
-    #[serde(rename = "anatelI12")]
-    AnatelI12,
-    /// R
-    #[serde(rename = "anatelR")]
-    AnatelR,
-    /// A
-    #[serde(rename = "anatelA")]
-    AnatelA,
-    ///
-    #[serde(rename = "anatelUnrated")]
-    AnatelUnrated,
-}
-
-impl std::default::Default for ContentRatingAnatelRating {
-    fn default() -> ContentRatingAnatelRating {
-        ContentRatingAnatelRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAnatelRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAnatelRating::Undefined => write!(f, "undefined"),
-            ContentRatingAnatelRating::AnatelUnspecified => write!(f, "anatelUnspecified"),
-            ContentRatingAnatelRating::AnatelF => write!(f, "anatelF"),
-            ContentRatingAnatelRating::AnatelI => write!(f, "anatelI"),
-            ContentRatingAnatelRating::AnatelI7 => write!(f, "anatelI7"),
-            ContentRatingAnatelRating::AnatelI10 => write!(f, "anatelI10"),
-            ContentRatingAnatelRating::AnatelI12 => write!(f, "anatelI12"),
-            ContentRatingAnatelRating::AnatelR => write!(f, "anatelR"),
-            ContentRatingAnatelRating::AnatelA => write!(f, "anatelA"),
-            ContentRatingAnatelRating::AnatelUnrated => write!(f, "anatelUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFcbmRating {
-    Undefined,
-    ///
-    #[serde(rename = "fcbmUnspecified")]
-    FcbmUnspecified,
-    /// U
-    #[serde(rename = "fcbmU")]
-    FcbmU,
-    /// PG13
-    #[serde(rename = "fcbmPg13")]
-    FcbmPg13,
-    /// P13
-    #[serde(rename = "fcbmP13")]
-    FcbmP13,
-    /// 18
-    #[serde(rename = "fcbm18")]
-    Fcbm18,
-    /// 18SX
-    #[serde(rename = "fcbm18sx")]
-    Fcbm18sx,
-    /// 18PA
-    #[serde(rename = "fcbm18pa")]
-    Fcbm18pa,
-    /// 18SG
-    #[serde(rename = "fcbm18sg")]
-    Fcbm18sg,
-    /// 18PL
-    #[serde(rename = "fcbm18pl")]
-    Fcbm18pl,
-    ///
-    #[serde(rename = "fcbmUnrated")]
-    FcbmUnrated,
-}
-
-impl std::default::Default for ContentRatingFcbmRating {
-    fn default() -> ContentRatingFcbmRating {
-        ContentRatingFcbmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFcbmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFcbmRating::Undefined => write!(f, "undefined"),
-            ContentRatingFcbmRating::FcbmUnspecified => write!(f, "fcbmUnspecified"),
-            ContentRatingFcbmRating::FcbmU => write!(f, "fcbmU"),
-            ContentRatingFcbmRating::FcbmPg13 => write!(f, "fcbmPg13"),
-            ContentRatingFcbmRating::FcbmP13 => write!(f, "fcbmP13"),
-            ContentRatingFcbmRating::Fcbm18 => write!(f, "fcbm18"),
-            ContentRatingFcbmRating::Fcbm18sx => write!(f, "fcbm18sx"),
-            ContentRatingFcbmRating::Fcbm18pa => write!(f, "fcbm18pa"),
-            ContentRatingFcbmRating::Fcbm18sg => write!(f, "fcbm18sg"),
-            ContentRatingFcbmRating::Fcbm18pl => write!(f, "fcbm18pl"),
-            ContentRatingFcbmRating::FcbmUnrated => write!(f, "fcbmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFpbRating {
-    Undefined,
-    ///
-    #[serde(rename = "fpbUnspecified")]
-    FpbUnspecified,
-    /// A
-    #[serde(rename = "fpbA")]
-    FpbA,
-    /// PG
-    #[serde(rename = "fpbPg")]
-    FpbPg,
-    /// 7-9PG
-    #[serde(rename = "fpb79Pg")]
-    Fpb79Pg,
-    /// 10-12PG
-    #[serde(rename = "fpb1012Pg")]
-    Fpb1012Pg,
-    /// 13
-    #[serde(rename = "fpb13")]
-    Fpb13,
-    /// 16
-    #[serde(rename = "fpb16")]
-    Fpb16,
-    /// 18
-    #[serde(rename = "fpb18")]
-    Fpb18,
-    /// X18
-    #[serde(rename = "fpbX18")]
-    FpbX18,
-    /// XX
-    #[serde(rename = "fpbXx")]
-    FpbXx,
-    ///
-    #[serde(rename = "fpbUnrated")]
-    FpbUnrated,
-    /// 10
-    #[serde(rename = "fpb10")]
-    Fpb10,
-}
-
-impl std::default::Default for ContentRatingFpbRating {
-    fn default() -> ContentRatingFpbRating {
-        ContentRatingFpbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFpbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFpbRating::Undefined => write!(f, "undefined"),
-            ContentRatingFpbRating::FpbUnspecified => write!(f, "fpbUnspecified"),
-            ContentRatingFpbRating::FpbA => write!(f, "fpbA"),
-            ContentRatingFpbRating::FpbPg => write!(f, "fpbPg"),
-            ContentRatingFpbRating::Fpb79Pg => write!(f, "fpb79Pg"),
-            ContentRatingFpbRating::Fpb1012Pg => write!(f, "fpb1012Pg"),
-            ContentRatingFpbRating::Fpb13 => write!(f, "fpb13"),
-            ContentRatingFpbRating::Fpb16 => write!(f, "fpb16"),
-            ContentRatingFpbRating::Fpb18 => write!(f, "fpb18"),
-            ContentRatingFpbRating::FpbX18 => write!(f, "fpbX18"),
-            ContentRatingFpbRating::FpbXx => write!(f, "fpbXx"),
-            ContentRatingFpbRating::FpbUnrated => write!(f, "fpbUnrated"),
-            ContentRatingFpbRating::Fpb10 => write!(f, "fpb10"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCatvfrRating {
-    Undefined,
-    ///
-    #[serde(rename = "catvfrUnspecified")]
-    CatvfrUnspecified,
-    /// G
-    #[serde(rename = "catvfrG")]
-    CatvfrG,
-    /// 8+
-    #[serde(rename = "catvfr8plus")]
-    Catvfr8plus,
-    /// 13+
-    #[serde(rename = "catvfr13plus")]
-    Catvfr13plus,
-    /// 16+
-    #[serde(rename = "catvfr16plus")]
-    Catvfr16plus,
-    /// 18+
-    #[serde(rename = "catvfr18plus")]
-    Catvfr18plus,
-    ///
-    #[serde(rename = "catvfrUnrated")]
-    CatvfrUnrated,
-    ///
-    #[serde(rename = "catvfrE")]
-    CatvfrE,
-}
-
-impl std::default::Default for ContentRatingCatvfrRating {
-    fn default() -> ContentRatingCatvfrRating {
-        ContentRatingCatvfrRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCatvfrRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCatvfrRating::Undefined => write!(f, "undefined"),
-            ContentRatingCatvfrRating::CatvfrUnspecified => write!(f, "catvfrUnspecified"),
-            ContentRatingCatvfrRating::CatvfrG => write!(f, "catvfrG"),
-            ContentRatingCatvfrRating::Catvfr8plus => write!(f, "catvfr8plus"),
-            ContentRatingCatvfrRating::Catvfr13plus => write!(f, "catvfr13plus"),
-            ContentRatingCatvfrRating::Catvfr16plus => write!(f, "catvfr16plus"),
-            ContentRatingCatvfrRating::Catvfr18plus => write!(f, "catvfr18plus"),
-            ContentRatingCatvfrRating::CatvfrUnrated => write!(f, "catvfrUnrated"),
-            ContentRatingCatvfrRating::CatvfrE => write!(f, "catvfrE"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRtcRating {
-    Undefined,
-    ///
-    #[serde(rename = "rtcUnspecified")]
-    RtcUnspecified,
-    /// AA
-    #[serde(rename = "rtcAa")]
-    RtcAa,
-    /// A
-    #[serde(rename = "rtcA")]
-    RtcA,
-    /// B
-    #[serde(rename = "rtcB")]
-    RtcB,
-    /// B15
-    #[serde(rename = "rtcB15")]
-    RtcB15,
-    /// C
-    #[serde(rename = "rtcC")]
-    RtcC,
-    /// D
-    #[serde(rename = "rtcD")]
-    RtcD,
-    ///
-    #[serde(rename = "rtcUnrated")]
-    RtcUnrated,
-}
-
-impl std::default::Default for ContentRatingRtcRating {
-    fn default() -> ContentRatingRtcRating {
-        ContentRatingRtcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRtcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRtcRating::Undefined => write!(f, "undefined"),
-            ContentRatingRtcRating::RtcUnspecified => write!(f, "rtcUnspecified"),
-            ContentRatingRtcRating::RtcAa => write!(f, "rtcAa"),
-            ContentRatingRtcRating::RtcA => write!(f, "rtcA"),
-            ContentRatingRtcRating::RtcB => write!(f, "rtcB"),
-            ContentRatingRtcRating::RtcB15 => write!(f, "rtcB15"),
-            ContentRatingRtcRating::RtcC => write!(f, "rtcC"),
-            ContentRatingRtcRating::RtcD => write!(f, "rtcD"),
-            ContentRatingRtcRating::RtcUnrated => write!(f, "rtcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMedietilsynetRating {
-    Undefined,
-    ///
-    #[serde(rename = "medietilsynetUnspecified")]
-    MedietilsynetUnspecified,
-    /// A
-    #[serde(rename = "medietilsynetA")]
-    MedietilsynetA,
-    /// 6
-    #[serde(rename = "medietilsynet6")]
-    Medietilsynet6,
-    /// 7
-    #[serde(rename = "medietilsynet7")]
-    Medietilsynet7,
-    /// 9
-    #[serde(rename = "medietilsynet9")]
-    Medietilsynet9,
-    /// 11
-    #[serde(rename = "medietilsynet11")]
-    Medietilsynet11,
-    /// 12
-    #[serde(rename = "medietilsynet12")]
-    Medietilsynet12,
-    /// 15
-    #[serde(rename = "medietilsynet15")]
-    Medietilsynet15,
-    /// 18
-    #[serde(rename = "medietilsynet18")]
-    Medietilsynet18,
-    ///
-    #[serde(rename = "medietilsynetUnrated")]
-    MedietilsynetUnrated,
-}
-
-impl std::default::Default for ContentRatingMedietilsynetRating {
-    fn default() -> ContentRatingMedietilsynetRating {
-        ContentRatingMedietilsynetRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMedietilsynetRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMedietilsynetRating::Undefined => write!(f, "undefined"),
-            ContentRatingMedietilsynetRating::MedietilsynetUnspecified => {
-                write!(f, "medietilsynetUnspecified")
-            }
-            ContentRatingMedietilsynetRating::MedietilsynetA => write!(f, "medietilsynetA"),
-            ContentRatingMedietilsynetRating::Medietilsynet6 => write!(f, "medietilsynet6"),
-            ContentRatingMedietilsynetRating::Medietilsynet7 => write!(f, "medietilsynet7"),
-            ContentRatingMedietilsynetRating::Medietilsynet9 => write!(f, "medietilsynet9"),
-            ContentRatingMedietilsynetRating::Medietilsynet11 => write!(f, "medietilsynet11"),
-            ContentRatingMedietilsynetRating::Medietilsynet12 => write!(f, "medietilsynet12"),
-            ContentRatingMedietilsynetRating::Medietilsynet15 => write!(f, "medietilsynet15"),
-            ContentRatingMedietilsynetRating::Medietilsynet18 => write!(f, "medietilsynet18"),
-            ContentRatingMedietilsynetRating::MedietilsynetUnrated => {
-                write!(f, "medietilsynetUnrated")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRcnofRating {
-    Undefined,
-    ///
-    #[serde(rename = "rcnofUnspecified")]
-    RcnofUnspecified,
-    ///
-    #[serde(rename = "rcnofI")]
-    RcnofI,
-    ///
-    #[serde(rename = "rcnofIi")]
-    RcnofIi,
-    ///
-    #[serde(rename = "rcnofIii")]
-    RcnofIii,
-    ///
-    #[serde(rename = "rcnofIv")]
-    RcnofIv,
-    ///
-    #[serde(rename = "rcnofV")]
-    RcnofV,
-    ///
-    #[serde(rename = "rcnofVi")]
-    RcnofVi,
-    ///
-    #[serde(rename = "rcnofUnrated")]
-    RcnofUnrated,
-}
-
-impl std::default::Default for ContentRatingRcnofRating {
-    fn default() -> ContentRatingRcnofRating {
-        ContentRatingRcnofRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRcnofRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRcnofRating::Undefined => write!(f, "undefined"),
-            ContentRatingRcnofRating::RcnofUnspecified => write!(f, "rcnofUnspecified"),
-            ContentRatingRcnofRating::RcnofI => write!(f, "rcnofI"),
-            ContentRatingRcnofRating::RcnofIi => write!(f, "rcnofIi"),
-            ContentRatingRcnofRating::RcnofIii => write!(f, "rcnofIii"),
-            ContentRatingRcnofRating::RcnofIv => write!(f, "rcnofIv"),
-            ContentRatingRcnofRating::RcnofV => write!(f, "rcnofV"),
-            ContentRatingRcnofRating::RcnofVi => write!(f, "rcnofVi"),
-            ContentRatingRcnofRating::RcnofUnrated => write!(f, "rcnofUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBbfcRating {
-    Undefined,
-    ///
-    #[serde(rename = "bbfcUnspecified")]
-    BbfcUnspecified,
-    /// U
-    #[serde(rename = "bbfcU")]
-    BbfcU,
-    /// PG
-    #[serde(rename = "bbfcPg")]
-    BbfcPg,
-    /// 12A
-    #[serde(rename = "bbfc12a")]
-    Bbfc12a,
-    /// 12
-    #[serde(rename = "bbfc12")]
-    Bbfc12,
-    /// 15
-    #[serde(rename = "bbfc15")]
-    Bbfc15,
-    /// 18
-    #[serde(rename = "bbfc18")]
-    Bbfc18,
-    /// R18
-    #[serde(rename = "bbfcR18")]
-    BbfcR18,
-    ///
-    #[serde(rename = "bbfcUnrated")]
-    BbfcUnrated,
-}
-
-impl std::default::Default for ContentRatingBbfcRating {
-    fn default() -> ContentRatingBbfcRating {
-        ContentRatingBbfcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBbfcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBbfcRating::Undefined => write!(f, "undefined"),
-            ContentRatingBbfcRating::BbfcUnspecified => write!(f, "bbfcUnspecified"),
-            ContentRatingBbfcRating::BbfcU => write!(f, "bbfcU"),
-            ContentRatingBbfcRating::BbfcPg => write!(f, "bbfcPg"),
-            ContentRatingBbfcRating::Bbfc12a => write!(f, "bbfc12a"),
-            ContentRatingBbfcRating::Bbfc12 => write!(f, "bbfc12"),
-            ContentRatingBbfcRating::Bbfc15 => write!(f, "bbfc15"),
-            ContentRatingBbfcRating::Bbfc18 => write!(f, "bbfc18"),
-            ContentRatingBbfcRating::BbfcR18 => write!(f, "bbfcR18"),
-            ContentRatingBbfcRating::BbfcUnrated => write!(f, "bbfcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMenaMpaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "menaMpaaUnspecified")]
-    MenaMpaaUnspecified,
-    /// G
-    #[serde(rename = "menaMpaaG")]
-    MenaMpaaG,
-    /// PG
-    #[serde(rename = "menaMpaaPg")]
-    MenaMpaaPg,
-    /// PG-13
-    #[serde(rename = "menaMpaaPg13")]
-    MenaMpaaPg13,
-    /// R
-    #[serde(rename = "menaMpaaR")]
-    MenaMpaaR,
-    /// To keep the same enum values as MPAA's items have, skip NC_17.
-    #[serde(rename = "menaMpaaUnrated")]
-    MenaMpaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMenaMpaaRating {
-    fn default() -> ContentRatingMenaMpaaRating {
-        ContentRatingMenaMpaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMenaMpaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMenaMpaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMenaMpaaRating::MenaMpaaUnspecified => write!(f, "menaMpaaUnspecified"),
-            ContentRatingMenaMpaaRating::MenaMpaaG => write!(f, "menaMpaaG"),
-            ContentRatingMenaMpaaRating::MenaMpaaPg => write!(f, "menaMpaaPg"),
-            ContentRatingMenaMpaaRating::MenaMpaaPg13 => write!(f, "menaMpaaPg13"),
-            ContentRatingMenaMpaaRating::MenaMpaaR => write!(f, "menaMpaaR"),
-            ContentRatingMenaMpaaRating::MenaMpaaUnrated => write!(f, "menaMpaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingYtRating {
-    Undefined,
-    ///
-    #[serde(rename = "ytUnspecified")]
-    YtUnspecified,
-    ///
-    #[serde(rename = "ytAgeRestricted")]
-    YtAgeRestricted,
-}
-
-impl std::default::Default for ContentRatingYtRating {
-    fn default() -> ContentRatingYtRating {
-        ContentRatingYtRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingYtRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingYtRating::Undefined => write!(f, "undefined"),
-            ContentRatingYtRating::YtUnspecified => write!(f, "ytUnspecified"),
-            ContentRatingYtRating::YtAgeRestricted => write!(f, "ytAgeRestricted"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingOflcRating {
-    Undefined,
-    ///
-    #[serde(rename = "oflcUnspecified")]
-    OflcUnspecified,
-    /// G
-    #[serde(rename = "oflcG")]
-    OflcG,
-    /// PG
-    #[serde(rename = "oflcPg")]
-    OflcPg,
-    /// M
-    #[serde(rename = "oflcM")]
-    OflcM,
-    /// R13
-    #[serde(rename = "oflcR13")]
-    OflcR13,
-    /// R15
-    #[serde(rename = "oflcR15")]
-    OflcR15,
-    /// R16
-    #[serde(rename = "oflcR16")]
-    OflcR16,
-    /// R18
-    #[serde(rename = "oflcR18")]
-    OflcR18,
-    ///
-    #[serde(rename = "oflcUnrated")]
-    OflcUnrated,
-    /// RP13
-    #[serde(rename = "oflcRp13")]
-    OflcRp13,
-    /// RP16
-    #[serde(rename = "oflcRp16")]
-    OflcRp16,
-    /// RP18
-    #[serde(rename = "oflcRp18")]
-    OflcRp18,
-}
-
-impl std::default::Default for ContentRatingOflcRating {
-    fn default() -> ContentRatingOflcRating {
-        ContentRatingOflcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingOflcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingOflcRating::Undefined => write!(f, "undefined"),
-            ContentRatingOflcRating::OflcUnspecified => write!(f, "oflcUnspecified"),
-            ContentRatingOflcRating::OflcG => write!(f, "oflcG"),
-            ContentRatingOflcRating::OflcPg => write!(f, "oflcPg"),
-            ContentRatingOflcRating::OflcM => write!(f, "oflcM"),
-            ContentRatingOflcRating::OflcR13 => write!(f, "oflcR13"),
-            ContentRatingOflcRating::OflcR15 => write!(f, "oflcR15"),
-            ContentRatingOflcRating::OflcR16 => write!(f, "oflcR16"),
-            ContentRatingOflcRating::OflcR18 => write!(f, "oflcR18"),
-            ContentRatingOflcRating::OflcUnrated => write!(f, "oflcUnrated"),
-            ContentRatingOflcRating::OflcRp13 => write!(f, "oflcRp13"),
-            ContentRatingOflcRating::OflcRp16 => write!(f, "oflcRp16"),
-            ContentRatingOflcRating::OflcRp18 => write!(f, "oflcRp18"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingPefilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "pefilmUnspecified")]
-    PefilmUnspecified,
-    /// PT
-    #[serde(rename = "pefilmPt")]
-    PefilmPt,
-    /// PG
-    #[serde(rename = "pefilmPg")]
-    PefilmPg,
-    /// 14
-    #[serde(rename = "pefilm14")]
-    Pefilm14,
-    /// 18
-    #[serde(rename = "pefilm18")]
-    Pefilm18,
-    ///
-    #[serde(rename = "pefilmUnrated")]
-    PefilmUnrated,
-}
-
-impl std::default::Default for ContentRatingPefilmRating {
-    fn default() -> ContentRatingPefilmRating {
-        ContentRatingPefilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingPefilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingPefilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingPefilmRating::PefilmUnspecified => write!(f, "pefilmUnspecified"),
-            ContentRatingPefilmRating::PefilmPt => write!(f, "pefilmPt"),
-            ContentRatingPefilmRating::PefilmPg => write!(f, "pefilmPg"),
-            ContentRatingPefilmRating::Pefilm14 => write!(f, "pefilm14"),
-            ContentRatingPefilmRating::Pefilm18 => write!(f, "pefilm18"),
-            ContentRatingPefilmRating::PefilmUnrated => write!(f, "pefilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKmrbRating {
-    Undefined,
-    ///
-    #[serde(rename = "kmrbUnspecified")]
-    KmrbUnspecified,
-    /// 전체관람가
-    #[serde(rename = "kmrbAll")]
-    KmrbAll,
-    /// 12세 이상 관람가
-    #[serde(rename = "kmrb12plus")]
-    Kmrb12plus,
-    /// 15세 이상 관람가
-    #[serde(rename = "kmrb15plus")]
-    Kmrb15plus,
-    ///
-    #[serde(rename = "kmrbTeenr")]
-    KmrbTeenr,
-    /// 청소년 관람불가
-    #[serde(rename = "kmrbR")]
-    KmrbR,
-    ///
-    #[serde(rename = "kmrbUnrated")]
-    KmrbUnrated,
-}
-
-impl std::default::Default for ContentRatingKmrbRating {
-    fn default() -> ContentRatingKmrbRating {
-        ContentRatingKmrbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKmrbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKmrbRating::Undefined => write!(f, "undefined"),
-            ContentRatingKmrbRating::KmrbUnspecified => write!(f, "kmrbUnspecified"),
-            ContentRatingKmrbRating::KmrbAll => write!(f, "kmrbAll"),
-            ContentRatingKmrbRating::Kmrb12plus => write!(f, "kmrb12plus"),
-            ContentRatingKmrbRating::Kmrb15plus => write!(f, "kmrb15plus"),
-            ContentRatingKmrbRating::KmrbTeenr => write!(f, "kmrbTeenr"),
-            ContentRatingKmrbRating::KmrbR => write!(f, "kmrbR"),
-            ContentRatingKmrbRating::KmrbUnrated => write!(f, "kmrbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIfcoRating {
-    Undefined,
-    ///
-    #[serde(rename = "ifcoUnspecified")]
-    IfcoUnspecified,
-    /// G
-    #[serde(rename = "ifcoG")]
-    IfcoG,
-    /// PG
-    #[serde(rename = "ifcoPg")]
-    IfcoPg,
-    /// 12
-    #[serde(rename = "ifco12")]
-    Ifco12,
-    /// 12A
-    #[serde(rename = "ifco12a")]
-    Ifco12a,
-    /// 15
-    #[serde(rename = "ifco15")]
-    Ifco15,
-    /// 15A
-    #[serde(rename = "ifco15a")]
-    Ifco15a,
-    /// 16
-    #[serde(rename = "ifco16")]
-    Ifco16,
-    /// 18
-    #[serde(rename = "ifco18")]
-    Ifco18,
-    ///
-    #[serde(rename = "ifcoUnrated")]
-    IfcoUnrated,
-}
-
-impl std::default::Default for ContentRatingIfcoRating {
-    fn default() -> ContentRatingIfcoRating {
-        ContentRatingIfcoRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIfcoRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIfcoRating::Undefined => write!(f, "undefined"),
-            ContentRatingIfcoRating::IfcoUnspecified => write!(f, "ifcoUnspecified"),
-            ContentRatingIfcoRating::IfcoG => write!(f, "ifcoG"),
-            ContentRatingIfcoRating::IfcoPg => write!(f, "ifcoPg"),
-            ContentRatingIfcoRating::Ifco12 => write!(f, "ifco12"),
-            ContentRatingIfcoRating::Ifco12a => write!(f, "ifco12a"),
-            ContentRatingIfcoRating::Ifco15 => write!(f, "ifco15"),
-            ContentRatingIfcoRating::Ifco15a => write!(f, "ifco15a"),
-            ContentRatingIfcoRating::Ifco16 => write!(f, "ifco16"),
-            ContentRatingIfcoRating::Ifco18 => write!(f, "ifco18"),
-            ContentRatingIfcoRating::IfcoUnrated => write!(f, "ifcoUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNfrcRating {
-    Undefined,
-    ///
-    #[serde(rename = "nfrcUnspecified")]
-    NfrcUnspecified,
-    /// A
-    #[serde(rename = "nfrcA")]
-    NfrcA,
-    /// B
-    #[serde(rename = "nfrcB")]
-    NfrcB,
-    /// C
-    #[serde(rename = "nfrcC")]
-    NfrcC,
-    /// D
-    #[serde(rename = "nfrcD")]
-    NfrcD,
-    /// X
-    #[serde(rename = "nfrcX")]
-    NfrcX,
-    ///
-    #[serde(rename = "nfrcUnrated")]
-    NfrcUnrated,
-}
-
-impl std::default::Default for ContentRatingNfrcRating {
-    fn default() -> ContentRatingNfrcRating {
-        ContentRatingNfrcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNfrcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNfrcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNfrcRating::NfrcUnspecified => write!(f, "nfrcUnspecified"),
-            ContentRatingNfrcRating::NfrcA => write!(f, "nfrcA"),
-            ContentRatingNfrcRating::NfrcB => write!(f, "nfrcB"),
-            ContentRatingNfrcRating::NfrcC => write!(f, "nfrcC"),
-            ContentRatingNfrcRating::NfrcD => write!(f, "nfrcD"),
-            ContentRatingNfrcRating::NfrcX => write!(f, "nfrcX"),
-            ContentRatingNfrcRating::NfrcUnrated => write!(f, "nfrcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFskRating {
-    Undefined,
-    ///
-    #[serde(rename = "fskUnspecified")]
-    FskUnspecified,
-    /// FSK 0
-    #[serde(rename = "fsk0")]
-    Fsk0,
-    /// FSK 6
-    #[serde(rename = "fsk6")]
-    Fsk6,
-    /// FSK 12
-    #[serde(rename = "fsk12")]
-    Fsk12,
-    /// FSK 16
-    #[serde(rename = "fsk16")]
-    Fsk16,
-    /// FSK 18
-    #[serde(rename = "fsk18")]
-    Fsk18,
-    ///
-    #[serde(rename = "fskUnrated")]
-    FskUnrated,
-}
-
-impl std::default::Default for ContentRatingFskRating {
-    fn default() -> ContentRatingFskRating {
-        ContentRatingFskRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFskRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFskRating::Undefined => write!(f, "undefined"),
-            ContentRatingFskRating::FskUnspecified => write!(f, "fskUnspecified"),
-            ContentRatingFskRating::Fsk0 => write!(f, "fsk0"),
-            ContentRatingFskRating::Fsk6 => write!(f, "fsk6"),
-            ContentRatingFskRating::Fsk12 => write!(f, "fsk12"),
-            ContentRatingFskRating::Fsk16 => write!(f, "fsk16"),
-            ContentRatingFskRating::Fsk18 => write!(f, "fsk18"),
-            ContentRatingFskRating::FskUnrated => write!(f, "fskUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMibacRating {
-    Undefined,
-    ///
-    #[serde(rename = "mibacUnspecified")]
-    MibacUnspecified,
-    ///
-    #[serde(rename = "mibacT")]
-    MibacT,
-    ///
-    #[serde(rename = "mibacVap")]
-    MibacVap,
-    ///
-    #[serde(rename = "mibacVm12")]
-    MibacVm12,
-    ///
-    #[serde(rename = "mibacVm14")]
-    MibacVm14,
-    ///
-    #[serde(rename = "mibacVm18")]
-    MibacVm18,
-    ///
-    #[serde(rename = "mibacUnrated")]
-    MibacUnrated,
-}
-
-impl std::default::Default for ContentRatingMibacRating {
-    fn default() -> ContentRatingMibacRating {
-        ContentRatingMibacRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMibacRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMibacRating::Undefined => write!(f, "undefined"),
-            ContentRatingMibacRating::MibacUnspecified => write!(f, "mibacUnspecified"),
-            ContentRatingMibacRating::MibacT => write!(f, "mibacT"),
-            ContentRatingMibacRating::MibacVap => write!(f, "mibacVap"),
-            ContentRatingMibacRating::MibacVm12 => write!(f, "mibacVm12"),
-            ContentRatingMibacRating::MibacVm14 => write!(f, "mibacVm14"),
-            ContentRatingMibacRating::MibacVm18 => write!(f, "mibacVm18"),
-            ContentRatingMibacRating::MibacUnrated => write!(f, "mibacUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSmaisRating {
-    Undefined,
-    ///
-    #[serde(rename = "smaisUnspecified")]
-    SmaisUnspecified,
-    /// L
-    #[serde(rename = "smaisL")]
-    SmaisL,
-    /// 7
-    #[serde(rename = "smais7")]
-    Smais7,
-    /// 12
-    #[serde(rename = "smais12")]
-    Smais12,
-    /// 14
-    #[serde(rename = "smais14")]
-    Smais14,
-    /// 16
-    #[serde(rename = "smais16")]
-    Smais16,
-    /// 18
-    #[serde(rename = "smais18")]
-    Smais18,
-    ///
-    #[serde(rename = "smaisUnrated")]
-    SmaisUnrated,
-}
-
-impl std::default::Default for ContentRatingSmaisRating {
-    fn default() -> ContentRatingSmaisRating {
-        ContentRatingSmaisRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSmaisRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSmaisRating::Undefined => write!(f, "undefined"),
-            ContentRatingSmaisRating::SmaisUnspecified => write!(f, "smaisUnspecified"),
-            ContentRatingSmaisRating::SmaisL => write!(f, "smaisL"),
-            ContentRatingSmaisRating::Smais7 => write!(f, "smais7"),
-            ContentRatingSmaisRating::Smais12 => write!(f, "smais12"),
-            ContentRatingSmaisRating::Smais14 => write!(f, "smais14"),
-            ContentRatingSmaisRating::Smais16 => write!(f, "smais16"),
-            ContentRatingSmaisRating::Smais18 => write!(f, "smais18"),
-            ContentRatingSmaisRating::SmaisUnrated => write!(f, "smaisUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingChfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "chfilmUnspecified")]
-    ChfilmUnspecified,
-    /// 0
-    #[serde(rename = "chfilm0")]
-    Chfilm0,
-    /// 6
-    #[serde(rename = "chfilm6")]
-    Chfilm6,
-    /// 12
-    #[serde(rename = "chfilm12")]
-    Chfilm12,
-    /// 16
-    #[serde(rename = "chfilm16")]
-    Chfilm16,
-    /// 18
-    #[serde(rename = "chfilm18")]
-    Chfilm18,
-    ///
-    #[serde(rename = "chfilmUnrated")]
-    ChfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingChfilmRating {
-    fn default() -> ContentRatingChfilmRating {
-        ContentRatingChfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingChfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingChfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingChfilmRating::ChfilmUnspecified => write!(f, "chfilmUnspecified"),
-            ContentRatingChfilmRating::Chfilm0 => write!(f, "chfilm0"),
-            ContentRatingChfilmRating::Chfilm6 => write!(f, "chfilm6"),
-            ContentRatingChfilmRating::Chfilm12 => write!(f, "chfilm12"),
-            ContentRatingChfilmRating::Chfilm16 => write!(f, "chfilm16"),
-            ContentRatingChfilmRating::Chfilm18 => write!(f, "chfilm18"),
-            ContentRatingChfilmRating::ChfilmUnrated => write!(f, "chfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIncaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "incaaUnspecified")]
-    IncaaUnspecified,
-    /// ATP (Apta para todo publico)
-    #[serde(rename = "incaaAtp")]
-    IncaaAtp,
-    /// 13 (Solo apta para mayores de 13 años)
-    #[serde(rename = "incaaSam13")]
-    IncaaSam13,
-    /// 16 (Solo apta para mayores de 16 años)
-    #[serde(rename = "incaaSam16")]
-    IncaaSam16,
-    /// 18 (Solo apta para mayores de 18 años)
-    #[serde(rename = "incaaSam18")]
-    IncaaSam18,
-    /// X (Solo apta para mayores de 18 años, de exhibición condicionada)
-    #[serde(rename = "incaaC")]
-    IncaaC,
-    ///
-    #[serde(rename = "incaaUnrated")]
-    IncaaUnrated,
-}
-
-impl std::default::Default for ContentRatingIncaaRating {
-    fn default() -> ContentRatingIncaaRating {
-        ContentRatingIncaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIncaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIncaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingIncaaRating::IncaaUnspecified => write!(f, "incaaUnspecified"),
-            ContentRatingIncaaRating::IncaaAtp => write!(f, "incaaAtp"),
-            ContentRatingIncaaRating::IncaaSam13 => write!(f, "incaaSam13"),
-            ContentRatingIncaaRating::IncaaSam16 => write!(f, "incaaSam16"),
-            ContentRatingIncaaRating::IncaaSam18 => write!(f, "incaaSam18"),
-            ContentRatingIncaaRating::IncaaC => write!(f, "incaaC"),
-            ContentRatingIncaaRating::IncaaUnrated => write!(f, "incaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMpaatRating {
-    Undefined,
-    ///
-    #[serde(rename = "mpaatUnspecified")]
-    MpaatUnspecified,
-    /// GB
-    #[serde(rename = "mpaatGb")]
-    MpaatGb,
-    /// RB
-    #[serde(rename = "mpaatRb")]
-    MpaatRb,
-}
-
-impl std::default::Default for ContentRatingMpaatRating {
-    fn default() -> ContentRatingMpaatRating {
-        ContentRatingMpaatRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMpaatRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMpaatRating::Undefined => write!(f, "undefined"),
-            ContentRatingMpaatRating::MpaatUnspecified => write!(f, "mpaatUnspecified"),
-            ContentRatingMpaatRating::MpaatGb => write!(f, "mpaatGb"),
-            ContentRatingMpaatRating::MpaatRb => write!(f, "mpaatRb"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMccaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "mccaaUnspecified")]
-    MccaaUnspecified,
-    /// U
-    #[serde(rename = "mccaaU")]
-    MccaaU,
-    /// PG
-    #[serde(rename = "mccaaPg")]
-    MccaaPg,
-    /// 12A
-    #[serde(rename = "mccaa12a")]
-    Mccaa12a,
-    /// 12
-    #[serde(rename = "mccaa12")]
-    Mccaa12,
-    /// 14 - this rating was removed from the new classification structure introduced in 2013.
-    #[serde(rename = "mccaa14")]
-    Mccaa14,
-    /// 15
-    #[serde(rename = "mccaa15")]
-    Mccaa15,
-    /// 16 - this rating was removed from the new classification structure introduced in 2013.
-    #[serde(rename = "mccaa16")]
-    Mccaa16,
-    /// 18
-    #[serde(rename = "mccaa18")]
-    Mccaa18,
-    ///
-    #[serde(rename = "mccaaUnrated")]
-    MccaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMccaaRating {
-    fn default() -> ContentRatingMccaaRating {
-        ContentRatingMccaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMccaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMccaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMccaaRating::MccaaUnspecified => write!(f, "mccaaUnspecified"),
-            ContentRatingMccaaRating::MccaaU => write!(f, "mccaaU"),
-            ContentRatingMccaaRating::MccaaPg => write!(f, "mccaaPg"),
-            ContentRatingMccaaRating::Mccaa12a => write!(f, "mccaa12a"),
-            ContentRatingMccaaRating::Mccaa12 => write!(f, "mccaa12"),
-            ContentRatingMccaaRating::Mccaa14 => write!(f, "mccaa14"),
-            ContentRatingMccaaRating::Mccaa15 => write!(f, "mccaa15"),
-            ContentRatingMccaaRating::Mccaa16 => write!(f, "mccaa16"),
-            ContentRatingMccaaRating::Mccaa18 => write!(f, "mccaa18"),
-            ContentRatingMccaaRating::MccaaUnrated => write!(f, "mccaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingDjctqRatingReasons {
-    Undefined,
-    ///
-    #[serde(rename = "djctqRatingReasonUnspecified")]
-    DjctqRatingReasonUnspecified,
-    /// Brazil rating content descriptors. See http://go/brazilratings section F. Violência (Violence)
-    #[serde(rename = "djctqViolence")]
-    DjctqViolence,
-    /// Violência extrema (Extreme violence)
-    #[serde(rename = "djctqExtremeViolence")]
-    DjctqExtremeViolence,
-    /// Conteúdo sexual (Sexual content)
-    #[serde(rename = "djctqSexualContent")]
-    DjctqSexualContent,
-    /// Nudez (Nudity)
-    #[serde(rename = "djctqNudity")]
-    DjctqNudity,
-    /// Sexo (Sex)
-    #[serde(rename = "djctqSex")]
-    DjctqSex,
-    /// Sexo Explícito (Explicit sex)
-    #[serde(rename = "djctqExplicitSex")]
-    DjctqExplicitSex,
-    /// Drogas (Drugs)
-    #[serde(rename = "djctqDrugs")]
-    DjctqDrugs,
-    /// Drogas Lícitas (Legal drugs)
-    #[serde(rename = "djctqLegalDrugs")]
-    DjctqLegalDrugs,
-    /// Drogas Ilícitas (Illegal drugs)
-    #[serde(rename = "djctqIllegalDrugs")]
-    DjctqIllegalDrugs,
-    /// Linguagem Imprópria (Inappropriate language)
-    #[serde(rename = "djctqInappropriateLanguage")]
-    DjctqInappropriateLanguage,
-    /// Atos Criminosos (Criminal Acts)
-    #[serde(rename = "djctqCriminalActs")]
-    DjctqCriminalActs,
-    /// Conteúdo Impactante (Impacting content)
-    #[serde(rename = "djctqImpactingContent")]
-    DjctqImpactingContent,
-}
-
-impl std::default::Default for ContentRatingDjctqRatingReasons {
-    fn default() -> ContentRatingDjctqRatingReasons {
-        ContentRatingDjctqRatingReasons::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingDjctqRatingReasons {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingDjctqRatingReasons::Undefined => write!(f, "undefined"),
-            ContentRatingDjctqRatingReasons::DjctqRatingReasonUnspecified => {
-                write!(f, "djctqRatingReasonUnspecified")
-            }
-            ContentRatingDjctqRatingReasons::DjctqViolence => write!(f, "djctqViolence"),
-            ContentRatingDjctqRatingReasons::DjctqExtremeViolence => {
-                write!(f, "djctqExtremeViolence")
-            }
-            ContentRatingDjctqRatingReasons::DjctqSexualContent => write!(f, "djctqSexualContent"),
-            ContentRatingDjctqRatingReasons::DjctqNudity => write!(f, "djctqNudity"),
-            ContentRatingDjctqRatingReasons::DjctqSex => write!(f, "djctqSex"),
-            ContentRatingDjctqRatingReasons::DjctqExplicitSex => write!(f, "djctqExplicitSex"),
-            ContentRatingDjctqRatingReasons::DjctqDrugs => write!(f, "djctqDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqLegalDrugs => write!(f, "djctqLegalDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqIllegalDrugs => write!(f, "djctqIllegalDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqInappropriateLanguage => {
-                write!(f, "djctqInappropriateLanguage")
-            }
-            ContentRatingDjctqRatingReasons::DjctqCriminalActs => write!(f, "djctqCriminalActs"),
-            ContentRatingDjctqRatingReasons::DjctqImpactingContent => {
-                write!(f, "djctqImpactingContent")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEgfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "egfilmUnspecified")]
-    EgfilmUnspecified,
-    /// GN
-    #[serde(rename = "egfilmGn")]
-    EgfilmGn,
-    /// 18
-    #[serde(rename = "egfilm18")]
-    Egfilm18,
-    /// BN
-    #[serde(rename = "egfilmBn")]
-    EgfilmBn,
-    ///
-    #[serde(rename = "egfilmUnrated")]
-    EgfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingEgfilmRating {
-    fn default() -> ContentRatingEgfilmRating {
-        ContentRatingEgfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEgfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEgfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingEgfilmRating::EgfilmUnspecified => write!(f, "egfilmUnspecified"),
-            ContentRatingEgfilmRating::EgfilmGn => write!(f, "egfilmGn"),
-            ContentRatingEgfilmRating::Egfilm18 => write!(f, "egfilm18"),
-            ContentRatingEgfilmRating::EgfilmBn => write!(f, "egfilmBn"),
-            ContentRatingEgfilmRating::EgfilmUnrated => write!(f, "egfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCceRating {
-    Undefined,
-    ///
-    #[serde(rename = "cceUnspecified")]
-    CceUnspecified,
-    /// 4
-    #[serde(rename = "cceM4")]
-    CceM4,
-    /// 6
-    #[serde(rename = "cceM6")]
-    CceM6,
-    /// 12
-    #[serde(rename = "cceM12")]
-    CceM12,
-    /// 16
-    #[serde(rename = "cceM16")]
-    CceM16,
-    /// 18
-    #[serde(rename = "cceM18")]
-    CceM18,
-    ///
-    #[serde(rename = "cceUnrated")]
-    CceUnrated,
-    /// 14
-    #[serde(rename = "cceM14")]
-    CceM14,
-}
-
-impl std::default::Default for ContentRatingCceRating {
-    fn default() -> ContentRatingCceRating {
-        ContentRatingCceRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCceRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCceRating::Undefined => write!(f, "undefined"),
-            ContentRatingCceRating::CceUnspecified => write!(f, "cceUnspecified"),
-            ContentRatingCceRating::CceM4 => write!(f, "cceM4"),
-            ContentRatingCceRating::CceM6 => write!(f, "cceM6"),
-            ContentRatingCceRating::CceM12 => write!(f, "cceM12"),
-            ContentRatingCceRating::CceM16 => write!(f, "cceM16"),
-            ContentRatingCceRating::CceM18 => write!(f, "cceM18"),
-            ContentRatingCceRating::CceUnrated => write!(f, "cceUnrated"),
-            ContentRatingCceRating::CceM14 => write!(f, "cceM14"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCscfRating {
-    Undefined,
-    ///
-    #[serde(rename = "cscfUnspecified")]
-    CscfUnspecified,
-    /// AL
-    #[serde(rename = "cscfAl")]
-    CscfAl,
-    /// A
-    #[serde(rename = "cscfA")]
-    CscfA,
-    /// 6
-    #[serde(rename = "cscf6")]
-    Cscf6,
-    /// 9
-    #[serde(rename = "cscf9")]
-    Cscf9,
-    /// 12
-    #[serde(rename = "cscf12")]
-    Cscf12,
-    /// 16
-    #[serde(rename = "cscf16")]
-    Cscf16,
-    /// 18
-    #[serde(rename = "cscf18")]
-    Cscf18,
-    ///
-    #[serde(rename = "cscfUnrated")]
-    CscfUnrated,
-}
-
-impl std::default::Default for ContentRatingCscfRating {
-    fn default() -> ContentRatingCscfRating {
-        ContentRatingCscfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCscfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCscfRating::Undefined => write!(f, "undefined"),
-            ContentRatingCscfRating::CscfUnspecified => write!(f, "cscfUnspecified"),
-            ContentRatingCscfRating::CscfAl => write!(f, "cscfAl"),
-            ContentRatingCscfRating::CscfA => write!(f, "cscfA"),
-            ContentRatingCscfRating::Cscf6 => write!(f, "cscf6"),
-            ContentRatingCscfRating::Cscf9 => write!(f, "cscf9"),
-            ContentRatingCscfRating::Cscf12 => write!(f, "cscf12"),
-            ContentRatingCscfRating::Cscf16 => write!(f, "cscf16"),
-            ContentRatingCscfRating::Cscf18 => write!(f, "cscf18"),
-            ContentRatingCscfRating::CscfUnrated => write!(f, "cscfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRussiaRating {
-    Undefined,
-    ///
-    #[serde(rename = "russiaUnspecified")]
-    RussiaUnspecified,
-    /// 0+
-    #[serde(rename = "russia0")]
-    Russia0,
-    /// 6+
-    #[serde(rename = "russia6")]
-    Russia6,
-    /// 12+
-    #[serde(rename = "russia12")]
-    Russia12,
-    /// 16+
-    #[serde(rename = "russia16")]
-    Russia16,
-    /// 18+
-    #[serde(rename = "russia18")]
-    Russia18,
-    ///
-    #[serde(rename = "russiaUnrated")]
-    RussiaUnrated,
-}
-
-impl std::default::Default for ContentRatingRussiaRating {
-    fn default() -> ContentRatingRussiaRating {
-        ContentRatingRussiaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRussiaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRussiaRating::Undefined => write!(f, "undefined"),
-            ContentRatingRussiaRating::RussiaUnspecified => write!(f, "russiaUnspecified"),
-            ContentRatingRussiaRating::Russia0 => write!(f, "russia0"),
-            ContentRatingRussiaRating::Russia6 => write!(f, "russia6"),
-            ContentRatingRussiaRating::Russia12 => write!(f, "russia12"),
-            ContentRatingRussiaRating::Russia16 => write!(f, "russia16"),
-            ContentRatingRussiaRating::Russia18 => write!(f, "russia18"),
-            ContentRatingRussiaRating::RussiaUnrated => write!(f, "russiaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBfvcRating {
-    Undefined,
-    ///
-    #[serde(rename = "bfvcUnspecified")]
-    BfvcUnspecified,
-    /// G
-    #[serde(rename = "bfvcG")]
-    BfvcG,
-    /// E
-    #[serde(rename = "bfvcE")]
-    BfvcE,
-    /// 13
-    #[serde(rename = "bfvc13")]
-    Bfvc13,
-    /// 15
-    #[serde(rename = "bfvc15")]
-    Bfvc15,
-    /// 18
-    #[serde(rename = "bfvc18")]
-    Bfvc18,
-    /// 20
-    #[serde(rename = "bfvc20")]
-    Bfvc20,
-    /// B
-    #[serde(rename = "bfvcB")]
-    BfvcB,
-    ///
-    #[serde(rename = "bfvcUnrated")]
-    BfvcUnrated,
-}
-
-impl std::default::Default for ContentRatingBfvcRating {
-    fn default() -> ContentRatingBfvcRating {
-        ContentRatingBfvcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBfvcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBfvcRating::Undefined => write!(f, "undefined"),
-            ContentRatingBfvcRating::BfvcUnspecified => write!(f, "bfvcUnspecified"),
-            ContentRatingBfvcRating::BfvcG => write!(f, "bfvcG"),
-            ContentRatingBfvcRating::BfvcE => write!(f, "bfvcE"),
-            ContentRatingBfvcRating::Bfvc13 => write!(f, "bfvc13"),
-            ContentRatingBfvcRating::Bfvc15 => write!(f, "bfvc15"),
-            ContentRatingBfvcRating::Bfvc18 => write!(f, "bfvc18"),
-            ContentRatingBfvcRating::Bfvc20 => write!(f, "bfvc20"),
-            ContentRatingBfvcRating::BfvcB => write!(f, "bfvcB"),
-            ContentRatingBfvcRating::BfvcUnrated => write!(f, "bfvcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEirinRating {
-    Undefined,
-    ///
-    #[serde(rename = "eirinUnspecified")]
-    EirinUnspecified,
-    /// G
-    #[serde(rename = "eirinG")]
-    EirinG,
-    /// PG-12
-    #[serde(rename = "eirinPg12")]
-    EirinPg12,
-    /// R15+
-    #[serde(rename = "eirinR15plus")]
-    EirinR15plus,
-    /// R18+
-    #[serde(rename = "eirinR18plus")]
-    EirinR18plus,
-    ///
-    #[serde(rename = "eirinUnrated")]
-    EirinUnrated,
-}
-
-impl std::default::Default for ContentRatingEirinRating {
-    fn default() -> ContentRatingEirinRating {
-        ContentRatingEirinRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEirinRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEirinRating::Undefined => write!(f, "undefined"),
-            ContentRatingEirinRating::EirinUnspecified => write!(f, "eirinUnspecified"),
-            ContentRatingEirinRating::EirinG => write!(f, "eirinG"),
-            ContentRatingEirinRating::EirinPg12 => write!(f, "eirinPg12"),
-            ContentRatingEirinRating::EirinR15plus => write!(f, "eirinR15plus"),
-            ContentRatingEirinRating::EirinR18plus => write!(f, "eirinR18plus"),
-            ContentRatingEirinRating::EirinUnrated => write!(f, "eirinUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMpaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "mpaaUnspecified")]
-    MpaaUnspecified,
-    /// G
-    #[serde(rename = "mpaaG")]
-    MpaaG,
-    /// PG
-    #[serde(rename = "mpaaPg")]
-    MpaaPg,
-    /// PG-13
-    #[serde(rename = "mpaaPg13")]
-    MpaaPg13,
-    /// R
-    #[serde(rename = "mpaaR")]
-    MpaaR,
-    /// NC-17
-    #[serde(rename = "mpaaNc17")]
-    MpaaNc17,
-    /// ! X
-    #[serde(rename = "mpaaX")]
-    MpaaX,
-    ///
-    #[serde(rename = "mpaaUnrated")]
-    MpaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMpaaRating {
-    fn default() -> ContentRatingMpaaRating {
-        ContentRatingMpaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMpaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMpaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMpaaRating::MpaaUnspecified => write!(f, "mpaaUnspecified"),
-            ContentRatingMpaaRating::MpaaG => write!(f, "mpaaG"),
-            ContentRatingMpaaRating::MpaaPg => write!(f, "mpaaPg"),
-            ContentRatingMpaaRating::MpaaPg13 => write!(f, "mpaaPg13"),
-            ContentRatingMpaaRating::MpaaR => write!(f, "mpaaR"),
-            ContentRatingMpaaRating::MpaaNc17 => write!(f, "mpaaNc17"),
-            ContentRatingMpaaRating::MpaaX => write!(f, "mpaaX"),
-            ContentRatingMpaaRating::MpaaUnrated => write!(f, "mpaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamHealthStatusStatus {
-    Undefined,
-    ///
-    #[serde(rename = "good")]
-    Good,
-    ///
-    #[serde(rename = "ok")]
-    Ok,
-    ///
-    #[serde(rename = "bad")]
-    Bad,
-    ///
-    #[serde(rename = "noData")]
-    NoData,
-    ///
-    #[serde(rename = "revoked")]
-    Revoked,
-}
-
-impl std::default::Default for LiveStreamHealthStatusStatus {
-    fn default() -> LiveStreamHealthStatusStatus {
-        LiveStreamHealthStatusStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamHealthStatusStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamHealthStatusStatus::Undefined => write!(f, "undefined"),
-            LiveStreamHealthStatusStatus::Good => write!(f, "good"),
-            LiveStreamHealthStatusStatus::Ok => write!(f, "ok"),
-            LiveStreamHealthStatusStatus::Bad => write!(f, "bad"),
-            LiveStreamHealthStatusStatus::NoData => write!(f, "noData"),
-            LiveStreamHealthStatusStatus::Revoked => write!(f, "revoked"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoPositionCornerPosition {
-    Undefined,
-    ///
-    #[serde(rename = "topLeft")]
-    TopLeft,
-    ///
-    #[serde(rename = "topRight")]
-    TopRight,
-    ///
-    #[serde(rename = "bottomLeft")]
-    BottomLeft,
-    ///
-    #[serde(rename = "bottomRight")]
-    BottomRight,
-}
-
-impl std::default::Default for InvideoPositionCornerPosition {
-    fn default() -> InvideoPositionCornerPosition {
-        InvideoPositionCornerPosition::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoPositionCornerPosition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoPositionCornerPosition::Undefined => write!(f, "undefined"),
-            InvideoPositionCornerPosition::TopLeft => write!(f, "topLeft"),
-            InvideoPositionCornerPosition::TopRight => write!(f, "topRight"),
-            InvideoPositionCornerPosition::BottomLeft => write!(f, "bottomLeft"),
-            InvideoPositionCornerPosition::BottomRight => write!(f, "bottomRight"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoPositionType {
-    Undefined,
-    ///
-    #[serde(rename = "corner")]
-    Corner,
-}
-
-impl std::default::Default for InvideoPositionType {
-    fn default() -> InvideoPositionType {
-        InvideoPositionType::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoPositionType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoPositionType::Undefined => write!(f, "undefined"),
-            InvideoPositionType::Corner => write!(f, "corner"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoTimingType {
-    Undefined,
-    ///
-    #[serde(rename = "offsetFromStart")]
-    OffsetFromStart,
-    ///
-    #[serde(rename = "offsetFromEnd")]
-    OffsetFromEnd,
-}
-
-impl std::default::Default for InvideoTimingType {
-    fn default() -> InvideoTimingType {
-        InvideoTimingType::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoTimingType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoTimingType::Undefined => write!(f, "undefined"),
-            InvideoTimingType::OffsetFromStart => write!(f, "offsetFromStart"),
-            InvideoTimingType::OffsetFromEnd => write!(f, "offsetFromEnd"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelSectionSnippetStyle {
-    Undefined,
-    ///
-    #[serde(rename = "channelsectionStyleUnspecified")]
-    ChannelsectionStyleUnspecified,
-    ///
-    #[serde(rename = "horizontalRow")]
-    HorizontalRow,
-    ///
-    #[serde(rename = "verticalList")]
-    VerticalList,
-}
-
-impl std::default::Default for ChannelSectionSnippetStyle {
-    fn default() -> ChannelSectionSnippetStyle {
-        ChannelSectionSnippetStyle::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelSectionSnippetStyle {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelSectionSnippetStyle::Undefined => write!(f, "undefined"),
-            ChannelSectionSnippetStyle::ChannelsectionStyleUnspecified => {
-                write!(f, "channelsectionStyleUnspecified")
-            }
-            ChannelSectionSnippetStyle::HorizontalRow => write!(f, "horizontalRow"),
-            ChannelSectionSnippetStyle::VerticalList => write!(f, "verticalList"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelSectionSnippetType {
-    Undefined,
-    ///
-    #[serde(rename = "channelsectionTypeUnspecified")]
-    ChannelsectionTypeUnspecified,
-    ///
-    #[serde(rename = "singlePlaylist")]
-    SinglePlaylist,
-    ///
-    #[serde(rename = "multiplePlaylists")]
-    MultiplePlaylists,
-    ///
-    #[serde(rename = "popularUploads")]
-    PopularUploads,
-    ///
-    #[serde(rename = "recentUploads")]
-    RecentUploads,
-    ///
-    #[serde(rename = "likes")]
-    Likes,
-    ///
-    #[serde(rename = "allPlaylists")]
-    AllPlaylists,
-    ///
-    #[serde(rename = "likedPlaylists")]
-    LikedPlaylists,
-    ///
-    #[serde(rename = "recentPosts")]
-    RecentPosts,
-    ///
-    #[serde(rename = "recentActivity")]
-    RecentActivity,
-    ///
-    #[serde(rename = "liveEvents")]
-    LiveEvents,
-    ///
-    #[serde(rename = "upcomingEvents")]
-    UpcomingEvents,
-    ///
-    #[serde(rename = "completedEvents")]
-    CompletedEvents,
-    ///
-    #[serde(rename = "multipleChannels")]
-    MultipleChannels,
-    ///
-    #[serde(rename = "postedVideos")]
-    PostedVideos,
-    ///
-    #[serde(rename = "postedPlaylists")]
-    PostedPlaylists,
-    ///
-    #[serde(rename = "subscriptions")]
-    Subscriptions,
-}
-
-impl std::default::Default for ChannelSectionSnippetType {
-    fn default() -> ChannelSectionSnippetType {
-        ChannelSectionSnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelSectionSnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelSectionSnippetType::Undefined => write!(f, "undefined"),
-            ChannelSectionSnippetType::ChannelsectionTypeUnspecified => {
-                write!(f, "channelsectionTypeUnspecified")
-            }
-            ChannelSectionSnippetType::SinglePlaylist => write!(f, "singlePlaylist"),
-            ChannelSectionSnippetType::MultiplePlaylists => write!(f, "multiplePlaylists"),
-            ChannelSectionSnippetType::PopularUploads => write!(f, "popularUploads"),
-            ChannelSectionSnippetType::RecentUploads => write!(f, "recentUploads"),
-            ChannelSectionSnippetType::Likes => write!(f, "likes"),
-            ChannelSectionSnippetType::AllPlaylists => write!(f, "allPlaylists"),
-            ChannelSectionSnippetType::LikedPlaylists => write!(f, "likedPlaylists"),
-            ChannelSectionSnippetType::RecentPosts => write!(f, "recentPosts"),
-            ChannelSectionSnippetType::RecentActivity => write!(f, "recentActivity"),
-            ChannelSectionSnippetType::LiveEvents => write!(f, "liveEvents"),
-            ChannelSectionSnippetType::UpcomingEvents => write!(f, "upcomingEvents"),
-            ChannelSectionSnippetType::CompletedEvents => write!(f, "completedEvents"),
-            ChannelSectionSnippetType::MultipleChannels => write!(f, "multipleChannels"),
-            ChannelSectionSnippetType::PostedVideos => write!(f, "postedVideos"),
-            ChannelSectionSnippetType::PostedPlaylists => write!(f, "postedPlaylists"),
-            ChannelSectionSnippetType::Subscriptions => write!(f, "subscriptions"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveChatUserBannedMessageDetailsBanType {
-    Undefined,
-    ///
-    #[serde(rename = "permanent")]
-    Permanent,
-    ///
-    #[serde(rename = "temporary")]
-    Temporary,
-}
-
-impl std::default::Default for LiveChatUserBannedMessageDetailsBanType {
-    fn default() -> LiveChatUserBannedMessageDetailsBanType {
-        LiveChatUserBannedMessageDetailsBanType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveChatUserBannedMessageDetailsBanType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveChatUserBannedMessageDetailsBanType::Undefined => write!(f, "undefined"),
-            LiveChatUserBannedMessageDetailsBanType::Permanent => write!(f, "permanent"),
-            LiveChatUserBannedMessageDetailsBanType::Temporary => write!(f, "temporary"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivityContentDetailsSocialType {
-    Undefined,
-    ///
-    #[serde(rename = "typeUnspecified")]
-    TypeUnspecified,
-    ///
-    #[serde(rename = "googlePlus")]
-    GooglePlus,
-    ///
-    #[serde(rename = "facebook")]
-    Facebook,
-    ///
-    #[serde(rename = "twitter")]
-    Twitter,
-}
-
-impl std::default::Default for ActivityContentDetailsSocialType {
-    fn default() -> ActivityContentDetailsSocialType {
-        ActivityContentDetailsSocialType::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivityContentDetailsSocialType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivityContentDetailsSocialType::Undefined => write!(f, "undefined"),
-            ActivityContentDetailsSocialType::TypeUnspecified => write!(f, "typeUnspecified"),
-            ActivityContentDetailsSocialType::GooglePlus => write!(f, "googlePlus"),
-            ActivityContentDetailsSocialType::Facebook => write!(f, "facebook"),
-            ActivityContentDetailsSocialType::Twitter => write!(f, "twitter"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivitySnippetType {
-    Undefined,
-    ///
-    #[serde(rename = "typeUnspecified")]
-    TypeUnspecified,
-    ///
-    #[serde(rename = "upload")]
-    Upload,
-    ///
-    #[serde(rename = "like")]
-    Like,
-    ///
-    #[serde(rename = "favorite")]
-    Favorite,
-    ///
-    #[serde(rename = "comment")]
-    Comment,
-    ///
-    #[serde(rename = "subscription")]
-    Subscription,
-    ///
-    #[serde(rename = "playlistItem")]
-    PlaylistItem,
-    ///
-    #[serde(rename = "recommendation")]
-    Recommendation,
-    ///
-    #[serde(rename = "bulletin")]
-    Bulletin,
-    ///
-    #[serde(rename = "social")]
-    Social,
-    ///
-    #[serde(rename = "channelItem")]
-    ChannelItem,
-    ///
-    #[serde(rename = "promotedItem")]
-    PromotedItem,
-}
-
-impl std::default::Default for ActivitySnippetType {
-    fn default() -> ActivitySnippetType {
-        ActivitySnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivitySnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivitySnippetType::Undefined => write!(f, "undefined"),
-            ActivitySnippetType::TypeUnspecified => write!(f, "typeUnspecified"),
-            ActivitySnippetType::Upload => write!(f, "upload"),
-            ActivitySnippetType::Like => write!(f, "like"),
-            ActivitySnippetType::Favorite => write!(f, "favorite"),
-            ActivitySnippetType::Comment => write!(f, "comment"),
-            ActivitySnippetType::Subscription => write!(f, "subscription"),
-            ActivitySnippetType::PlaylistItem => write!(f, "playlistItem"),
-            ActivitySnippetType::Recommendation => write!(f, "recommendation"),
-            ActivitySnippetType::Bulletin => write!(f, "bulletin"),
-            ActivitySnippetType::Social => write!(f, "social"),
-            ActivitySnippetType::ChannelItem => write!(f, "channelItem"),
-            ActivitySnippetType::PromotedItem => write!(f, "promotedItem"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsStereoLayout {
-    Undefined,
-    ///
-    #[serde(rename = "stereoLayoutUnspecified")]
-    StereoLayoutUnspecified,
-    ///
-    #[serde(rename = "mono")]
-    Mono,
-    ///
-    #[serde(rename = "leftRight")]
-    LeftRight,
-    ///
-    #[serde(rename = "topBottom")]
-    TopBottom,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsStereoLayout {
-    fn default() -> LiveBroadcastContentDetailsStereoLayout {
-        LiveBroadcastContentDetailsStereoLayout::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsStereoLayout {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsStereoLayout::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsStereoLayout::StereoLayoutUnspecified => {
-                write!(f, "stereoLayoutUnspecified")
-            }
-            LiveBroadcastContentDetailsStereoLayout::Mono => write!(f, "mono"),
-            LiveBroadcastContentDetailsStereoLayout::LeftRight => write!(f, "leftRight"),
-            LiveBroadcastContentDetailsStereoLayout::TopBottom => write!(f, "topBottom"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsProjection {
-    Undefined,
-    ///
-    #[serde(rename = "projectionUnspecified")]
-    ProjectionUnspecified,
-    ///
-    #[serde(rename = "rectangular")]
-    Rectangular,
-    ///
-    #[serde(rename = "360")]
-    _360,
-    ///
-    #[serde(rename = "mesh")]
-    Mesh,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsProjection {
-    fn default() -> LiveBroadcastContentDetailsProjection {
-        LiveBroadcastContentDetailsProjection::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsProjection {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsProjection::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsProjection::ProjectionUnspecified => {
-                write!(f, "projectionUnspecified")
-            }
-            LiveBroadcastContentDetailsProjection::Rectangular => write!(f, "rectangular"),
-            LiveBroadcastContentDetailsProjection::_360 => write!(f, "360"),
-            LiveBroadcastContentDetailsProjection::Mesh => write!(f, "mesh"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsLatencyPreference {
-    Undefined,
-    ///
-    #[serde(rename = "latencyPreferenceUnspecified")]
-    LatencyPreferenceUnspecified,
-    /// Best for: highest quality viewer playbacks and higher resolutions.
-    #[serde(rename = "normal")]
-    Normal,
-    /// Best for: near real-time interaction, with minimal playback buffering.
-    #[serde(rename = "low")]
-    Low,
-    /// Best for: real-time interaction Does not support: Closed captions, 1440p, and 4k resolutions
-    #[serde(rename = "ultraLow")]
-    UltraLow,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsLatencyPreference {
-    fn default() -> LiveBroadcastContentDetailsLatencyPreference {
-        LiveBroadcastContentDetailsLatencyPreference::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsLatencyPreference {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsLatencyPreference::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsLatencyPreference::LatencyPreferenceUnspecified => {
-                write!(f, "latencyPreferenceUnspecified")
-            }
-            LiveBroadcastContentDetailsLatencyPreference::Normal => write!(f, "normal"),
-            LiveBroadcastContentDetailsLatencyPreference::Low => write!(f, "low"),
-            LiveBroadcastContentDetailsLatencyPreference::UltraLow => write!(f, "ultraLow"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsClosedCaptionsType {
-    Undefined,
-    ///
-    #[serde(rename = "closedCaptionsTypeUnspecified")]
-    ClosedCaptionsTypeUnspecified,
-    ///
-    #[serde(rename = "closedCaptionsDisabled")]
-    ClosedCaptionsDisabled,
-    ///
-    #[serde(rename = "closedCaptionsHttpPost")]
-    ClosedCaptionsHttpPost,
-    ///
-    #[serde(rename = "closedCaptionsEmbedded")]
-    ClosedCaptionsEmbedded,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsClosedCaptionsType {
-    fn default() -> LiveBroadcastContentDetailsClosedCaptionsType {
-        LiveBroadcastContentDetailsClosedCaptionsType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsClosedCaptionsType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsClosedCaptionsType::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsTypeUnspecified => {
-                write!(f, "closedCaptionsTypeUnspecified")
-            }
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsDisabled => {
-                write!(f, "closedCaptionsDisabled")
-            }
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsHttpPost => {
-                write!(f, "closedCaptionsHttpPost")
-            }
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsEmbedded => {
-                write!(f, "closedCaptionsEmbedded")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoSnippetLiveBroadcastContent {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for VideoSnippetLiveBroadcastContent {
-    fn default() -> VideoSnippetLiveBroadcastContent {
-        VideoSnippetLiveBroadcastContent::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoSnippetLiveBroadcastContent {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
-            VideoSnippetLiveBroadcastContent::None => write!(f, "none"),
-            VideoSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
-            VideoSnippetLiveBroadcastContent::Live => write!(f, "live"),
-            VideoSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum PlaylistItemStatusPrivacyStatus {
-    Undefined,
-    ///
-    #[serde(rename = "public")]
-    Public,
-    ///
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    ///
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for PlaylistItemStatusPrivacyStatus {
-    fn default() -> PlaylistItemStatusPrivacyStatus {
-        PlaylistItemStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for PlaylistItemStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            PlaylistItemStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            PlaylistItemStatusPrivacyStatus::Public => write!(f, "public"),
-            PlaylistItemStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            PlaylistItemStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivityContentDetailsRecommendationReason {
-    Undefined,
-    ///
-    #[serde(rename = "reasonUnspecified")]
-    ReasonUnspecified,
-    ///
-    #[serde(rename = "videoFavorited")]
-    VideoFavorited,
-    ///
-    #[serde(rename = "videoLiked")]
-    VideoLiked,
-    ///
-    #[serde(rename = "videoWatched")]
-    VideoWatched,
-}
-
-impl std::default::Default for ActivityContentDetailsRecommendationReason {
-    fn default() -> ActivityContentDetailsRecommendationReason {
-        ActivityContentDetailsRecommendationReason::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivityContentDetailsRecommendationReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivityContentDetailsRecommendationReason::Undefined => write!(f, "undefined"),
-            ActivityContentDetailsRecommendationReason::ReasonUnspecified => {
-                write!(f, "reasonUnspecified")
-            }
-            ActivityContentDetailsRecommendationReason::VideoFavorited => {
-                write!(f, "videoFavorited")
-            }
-            ActivityContentDetailsRecommendationReason::VideoLiked => write!(f, "videoLiked"),
-            ActivityContentDetailsRecommendationReason::VideoWatched => write!(f, "videoWatched"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoContentDetailsDefinition {
-    Undefined,
-    /// sd
-    #[serde(rename = "sd")]
-    Sd,
-    /// hd
-    #[serde(rename = "hd")]
-    Hd,
-}
-
-impl std::default::Default for VideoContentDetailsDefinition {
-    fn default() -> VideoContentDetailsDefinition {
-        VideoContentDetailsDefinition::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoContentDetailsDefinition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoContentDetailsDefinition::Undefined => write!(f, "undefined"),
-            VideoContentDetailsDefinition::Sd => write!(f, "sd"),
-            VideoContentDetailsDefinition::Hd => write!(f, "hd"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoContentDetailsProjection {
-    Undefined,
-    ///
-    #[serde(rename = "rectangular")]
-    Rectangular,
-    ///
-    #[serde(rename = "360")]
-    _360,
-}
-
-impl std::default::Default for VideoContentDetailsProjection {
-    fn default() -> VideoContentDetailsProjection {
-        VideoContentDetailsProjection::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoContentDetailsProjection {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoContentDetailsProjection::Undefined => write!(f, "undefined"),
-            VideoContentDetailsProjection::Rectangular => write!(f, "rectangular"),
-            VideoContentDetailsProjection::_360 => write!(f, "360"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoContentDetailsCaption {
-    Undefined,
-    ///
-    #[serde(rename = "true")]
-    True,
-    ///
-    #[serde(rename = "false")]
-    False,
-}
-
-impl std::default::Default for VideoContentDetailsCaption {
-    fn default() -> VideoContentDetailsCaption {
-        VideoContentDetailsCaption::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoContentDetailsCaption {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoContentDetailsCaption::Undefined => write!(f, "undefined"),
-            VideoContentDetailsCaption::True => write!(f, "true"),
-            VideoContentDetailsCaption::False => write!(f, "false"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinkStatusLinkStatus {
-    Undefined,
-    ///
-    #[serde(rename = "unknown")]
-    Unknown,
-    ///
-    #[serde(rename = "failed")]
-    Failed,
-    ///
-    #[serde(rename = "pending")]
-    Pending,
-    ///
-    #[serde(rename = "linked")]
-    Linked,
-}
-
-impl std::default::Default for ThirdPartyLinkStatusLinkStatus {
-    fn default() -> ThirdPartyLinkStatusLinkStatus {
-        ThirdPartyLinkStatusLinkStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ThirdPartyLinkStatusLinkStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ThirdPartyLinkStatusLinkStatus::Undefined => write!(f, "undefined"),
-            ThirdPartyLinkStatusLinkStatus::Unknown => write!(f, "unknown"),
-            ThirdPartyLinkStatusLinkStatus::Failed => write!(f, "failed"),
-            ThirdPartyLinkStatusLinkStatus::Pending => write!(f, "pending"),
-            ThirdPartyLinkStatusLinkStatus::Linked => write!(f, "linked"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamConfigurationIssueSeverity {
-    Undefined,
-    ///
-    #[serde(rename = "info")]
-    Info,
-    ///
-    #[serde(rename = "warning")]
-    Warning,
-    ///
-    #[serde(rename = "error")]
-    Error,
-}
-
-impl std::default::Default for LiveStreamConfigurationIssueSeverity {
-    fn default() -> LiveStreamConfigurationIssueSeverity {
-        LiveStreamConfigurationIssueSeverity::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamConfigurationIssueSeverity {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamConfigurationIssueSeverity::Undefined => write!(f, "undefined"),
-            LiveStreamConfigurationIssueSeverity::Info => write!(f, "info"),
-            LiveStreamConfigurationIssueSeverity::Warning => write!(f, "warning"),
-            LiveStreamConfigurationIssueSeverity::Error => write!(f, "error"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamConfigurationIssueType {
-    Undefined,
-    ///
-    #[serde(rename = "gopSizeOver")]
-    GopSizeOver,
-    ///
-    #[serde(rename = "gopSizeLong")]
-    GopSizeLong,
-    ///
-    #[serde(rename = "gopSizeShort")]
-    GopSizeShort,
-    ///
-    #[serde(rename = "openGop")]
-    OpenGop,
-    ///
-    #[serde(rename = "badContainer")]
-    BadContainer,
-    ///
-    #[serde(rename = "audioBitrateHigh")]
-    AudioBitrateHigh,
-    ///
-    #[serde(rename = "audioBitrateLow")]
-    AudioBitrateLow,
-    ///
-    #[serde(rename = "audioSampleRate")]
-    AudioSampleRate,
-    ///
-    #[serde(rename = "bitrateHigh")]
-    BitrateHigh,
-    ///
-    #[serde(rename = "bitrateLow")]
-    BitrateLow,
-    ///
-    #[serde(rename = "audioCodec")]
-    AudioCodec,
-    ///
-    #[serde(rename = "videoCodec")]
-    VideoCodec,
-    ///
-    #[serde(rename = "noAudioStream")]
-    NoAudioStream,
-    ///
-    #[serde(rename = "noVideoStream")]
-    NoVideoStream,
-    ///
-    #[serde(rename = "multipleVideoStreams")]
-    MultipleVideoStreams,
-    ///
-    #[serde(rename = "multipleAudioStreams")]
-    MultipleAudioStreams,
-    ///
-    #[serde(rename = "audioTooManyChannels")]
-    AudioTooManyChannels,
-    ///
-    #[serde(rename = "interlacedVideo")]
-    InterlacedVideo,
-    ///
-    #[serde(rename = "frameRateHigh")]
-    FrameRateHigh,
-    ///
-    #[serde(rename = "resolutionMismatch")]
-    ResolutionMismatch,
-    ///
-    #[serde(rename = "videoCodecMismatch")]
-    VideoCodecMismatch,
-    ///
-    #[serde(rename = "videoInterlaceMismatch")]
-    VideoInterlaceMismatch,
-    ///
-    #[serde(rename = "videoProfileMismatch")]
-    VideoProfileMismatch,
-    ///
-    #[serde(rename = "videoBitrateMismatch")]
-    VideoBitrateMismatch,
-    ///
-    #[serde(rename = "framerateMismatch")]
-    FramerateMismatch,
-    ///
-    #[serde(rename = "gopMismatch")]
-    GopMismatch,
-    ///
-    #[serde(rename = "audioSampleRateMismatch")]
-    AudioSampleRateMismatch,
-    ///
-    #[serde(rename = "audioStereoMismatch")]
-    AudioStereoMismatch,
-    ///
-    #[serde(rename = "audioCodecMismatch")]
-    AudioCodecMismatch,
-    ///
-    #[serde(rename = "audioBitrateMismatch")]
-    AudioBitrateMismatch,
-    ///
-    #[serde(rename = "videoResolutionSuboptimal")]
-    VideoResolutionSuboptimal,
-    ///
-    #[serde(rename = "videoResolutionUnsupported")]
-    VideoResolutionUnsupported,
-    ///
-    #[serde(rename = "videoIngestionStarved")]
-    VideoIngestionStarved,
-    ///
-    #[serde(rename = "videoIngestionFasterThanRealtime")]
-    VideoIngestionFasterThanRealtime,
-}
-
-impl std::default::Default for LiveStreamConfigurationIssueType {
-    fn default() -> LiveStreamConfigurationIssueType {
-        LiveStreamConfigurationIssueType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamConfigurationIssueType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamConfigurationIssueType::Undefined => write!(f, "undefined"),
-            LiveStreamConfigurationIssueType::GopSizeOver => write!(f, "gopSizeOver"),
-            LiveStreamConfigurationIssueType::GopSizeLong => write!(f, "gopSizeLong"),
-            LiveStreamConfigurationIssueType::GopSizeShort => write!(f, "gopSizeShort"),
-            LiveStreamConfigurationIssueType::OpenGop => write!(f, "openGop"),
-            LiveStreamConfigurationIssueType::BadContainer => write!(f, "badContainer"),
-            LiveStreamConfigurationIssueType::AudioBitrateHigh => write!(f, "audioBitrateHigh"),
-            LiveStreamConfigurationIssueType::AudioBitrateLow => write!(f, "audioBitrateLow"),
-            LiveStreamConfigurationIssueType::AudioSampleRate => write!(f, "audioSampleRate"),
-            LiveStreamConfigurationIssueType::BitrateHigh => write!(f, "bitrateHigh"),
-            LiveStreamConfigurationIssueType::BitrateLow => write!(f, "bitrateLow"),
-            LiveStreamConfigurationIssueType::AudioCodec => write!(f, "audioCodec"),
-            LiveStreamConfigurationIssueType::VideoCodec => write!(f, "videoCodec"),
-            LiveStreamConfigurationIssueType::NoAudioStream => write!(f, "noAudioStream"),
-            LiveStreamConfigurationIssueType::NoVideoStream => write!(f, "noVideoStream"),
-            LiveStreamConfigurationIssueType::MultipleVideoStreams => {
-                write!(f, "multipleVideoStreams")
-            }
-            LiveStreamConfigurationIssueType::MultipleAudioStreams => {
-                write!(f, "multipleAudioStreams")
-            }
-            LiveStreamConfigurationIssueType::AudioTooManyChannels => {
-                write!(f, "audioTooManyChannels")
-            }
-            LiveStreamConfigurationIssueType::InterlacedVideo => write!(f, "interlacedVideo"),
-            LiveStreamConfigurationIssueType::FrameRateHigh => write!(f, "frameRateHigh"),
-            LiveStreamConfigurationIssueType::ResolutionMismatch => write!(f, "resolutionMismatch"),
-            LiveStreamConfigurationIssueType::VideoCodecMismatch => write!(f, "videoCodecMismatch"),
-            LiveStreamConfigurationIssueType::VideoInterlaceMismatch => {
-                write!(f, "videoInterlaceMismatch")
-            }
-            LiveStreamConfigurationIssueType::VideoProfileMismatch => {
-                write!(f, "videoProfileMismatch")
-            }
-            LiveStreamConfigurationIssueType::VideoBitrateMismatch => {
-                write!(f, "videoBitrateMismatch")
-            }
-            LiveStreamConfigurationIssueType::FramerateMismatch => write!(f, "framerateMismatch"),
-            LiveStreamConfigurationIssueType::GopMismatch => write!(f, "gopMismatch"),
-            LiveStreamConfigurationIssueType::AudioSampleRateMismatch => {
-                write!(f, "audioSampleRateMismatch")
-            }
-            LiveStreamConfigurationIssueType::AudioStereoMismatch => {
-                write!(f, "audioStereoMismatch")
-            }
-            LiveStreamConfigurationIssueType::AudioCodecMismatch => write!(f, "audioCodecMismatch"),
-            LiveStreamConfigurationIssueType::AudioBitrateMismatch => {
-                write!(f, "audioBitrateMismatch")
-            }
-            LiveStreamConfigurationIssueType::VideoResolutionSuboptimal => {
-                write!(f, "videoResolutionSuboptimal")
-            }
-            LiveStreamConfigurationIssueType::VideoResolutionUnsupported => {
-                write!(f, "videoResolutionUnsupported")
-            }
-            LiveStreamConfigurationIssueType::VideoIngestionStarved => {
-                write!(f, "videoIngestionStarved")
-            }
-            LiveStreamConfigurationIssueType::VideoIngestionFasterThanRealtime => {
-                write!(f, "videoIngestionFasterThanRealtime")
-            }
+pub enum VideoSuggestionsProcessingHints {
+    Undefined,
+    /// The MP4 file is not streamable, this will slow down the processing. MOOV atom was not found at the beginning of the file.
+    #[serde(rename = "nonStreamableMov")]
+    NonStreamableMov,
+    /// Probably a better quality version of the video exists. The video has wide screen aspect ratio, but is not an HD video.
+    #[serde(rename = "sendBestQualityVideo")]
+    SendBestQualityVideo,
+    /// Uploaded video is spherical video.
+    #[serde(rename = "sphericalVideo")]
+    SphericalVideo,
+    /// Uploaded video has spatial audio.
+    #[serde(rename = "spatialAudio")]
+    SpatialAudio,
+    /// Uploaded video is VR video.
+    #[serde(rename = "vrVideo")]
+    VrVideo,
+    /// Uploaded video is HDR video.
+    #[serde(rename = "hdrVideo")]
+    HdrVideo,
+}
+
+impl std::default::Default for VideoSuggestionsProcessingHints {
+    fn default() -> VideoSuggestionsProcessingHints {
+        VideoSuggestionsProcessingHints::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsProcessingHints {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsProcessingHints::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingHints::NonStreamableMov => write!(f, "nonStreamableMov"),
+            VideoSuggestionsProcessingHints::SendBestQualityVideo => {
+                write!(f, "sendBestQualityVideo")
+            }
+            VideoSuggestionsProcessingHints::SphericalVideo => write!(f, "sphericalVideo"),
+            VideoSuggestionsProcessingHints::SpatialAudio => write!(f, "spatialAudio"),
+            VideoSuggestionsProcessingHints::VrVideo => write!(f, "vrVideo"),
+            VideoSuggestionsProcessingHints::HdrVideo => write!(f, "hdrVideo"),
         };
         Ok(())
     }
@@ -9868,120 +9901,56 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsIngestionType {
-    Undefined,
-    ///
-    #[serde(rename = "rtmp")]
-    Rtmp,
-    ///
-    #[serde(rename = "dash")]
-    Dash,
-    ///
-    #[serde(rename = "webrtc")]
-    Webrtc,
-    ///
-    #[serde(rename = "hls")]
-    Hls,
-}
-
-impl std::default::Default for CdnSettingsIngestionType {
-    fn default() -> CdnSettingsIngestionType {
-        CdnSettingsIngestionType::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsIngestionType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsIngestionType::Undefined => write!(f, "undefined"),
-            CdnSettingsIngestionType::Rtmp => write!(f, "rtmp"),
-            CdnSettingsIngestionType::Dash => write!(f, "dash"),
-            CdnSettingsIngestionType::Webrtc => write!(f, "webrtc"),
-            CdnSettingsIngestionType::Hls => write!(f, "hls"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsFrameRate {
-    Undefined,
-    ///
-    #[serde(rename = "30fps")]
-    _30fps,
-    ///
-    #[serde(rename = "60fps")]
-    _60fps,
-    ///
-    #[serde(rename = "variable")]
-    Variable,
-}
-
-impl std::default::Default for CdnSettingsFrameRate {
-    fn default() -> CdnSettingsFrameRate {
-        CdnSettingsFrameRate::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsFrameRate {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsFrameRate::Undefined => write!(f, "undefined"),
-            CdnSettingsFrameRate::_30fps => write!(f, "30fps"),
-            CdnSettingsFrameRate::_60fps => write!(f, "60fps"),
-            CdnSettingsFrameRate::Variable => write!(f, "variable"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsResolution {
-    Undefined,
-    ///
-    #[serde(rename = "240p")]
-    _240p,
-    ///
-    #[serde(rename = "360p")]
-    _360p,
-    ///
-    #[serde(rename = "480p")]
-    _480p,
-    ///
-    #[serde(rename = "720p")]
-    _720p,
-    ///
-    #[serde(rename = "1080p")]
-    _1080p,
-    ///
-    #[serde(rename = "1440p")]
-    _1440p,
-    ///
-    #[serde(rename = "2160p")]
-    _2160p,
-    ///
-    #[serde(rename = "variable")]
-    Variable,
-}
-
-impl std::default::Default for CdnSettingsResolution {
-    fn default() -> CdnSettingsResolution {
-        CdnSettingsResolution::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsResolution {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsResolution::Undefined => write!(f, "undefined"),
-            CdnSettingsResolution::_240p => write!(f, "240p"),
-            CdnSettingsResolution::_360p => write!(f, "360p"),
-            CdnSettingsResolution::_480p => write!(f, "480p"),
-            CdnSettingsResolution::_720p => write!(f, "720p"),
-            CdnSettingsResolution::_1080p => write!(f, "1080p"),
-            CdnSettingsResolution::_1440p => write!(f, "1440p"),
-            CdnSettingsResolution::_2160p => write!(f, "2160p"),
-            CdnSettingsResolution::Variable => write!(f, "variable"),
+pub enum ActivitySnippetType {
+    Undefined,
+    #[serde(rename = "typeUnspecified")]
+    TypeUnspecified,
+    #[serde(rename = "upload")]
+    Upload,
+    #[serde(rename = "like")]
+    Like,
+    #[serde(rename = "favorite")]
+    Favorite,
+    #[serde(rename = "comment")]
+    Comment,
+    #[serde(rename = "subscription")]
+    Subscription,
+    #[serde(rename = "playlistItem")]
+    PlaylistItem,
+    #[serde(rename = "recommendation")]
+    Recommendation,
+    #[serde(rename = "bulletin")]
+    Bulletin,
+    #[serde(rename = "social")]
+    Social,
+    #[serde(rename = "channelItem")]
+    ChannelItem,
+    #[serde(rename = "promotedItem")]
+    PromotedItem,
+}
+
+impl std::default::Default for ActivitySnippetType {
+    fn default() -> ActivitySnippetType {
+        ActivitySnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivitySnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivitySnippetType::Undefined => write!(f, "undefined"),
+            ActivitySnippetType::TypeUnspecified => write!(f, "typeUnspecified"),
+            ActivitySnippetType::Upload => write!(f, "upload"),
+            ActivitySnippetType::Like => write!(f, "like"),
+            ActivitySnippetType::Favorite => write!(f, "favorite"),
+            ActivitySnippetType::Comment => write!(f, "comment"),
+            ActivitySnippetType::Subscription => write!(f, "subscription"),
+            ActivitySnippetType::PlaylistItem => write!(f, "playlistItem"),
+            ActivitySnippetType::Recommendation => write!(f, "recommendation"),
+            ActivitySnippetType::Bulletin => write!(f, "bulletin"),
+            ActivitySnippetType::Social => write!(f, "social"),
+            ActivitySnippetType::ChannelItem => write!(f, "channelItem"),
+            ActivitySnippetType::PromotedItem => write!(f, "promotedItem"),
         };
         Ok(())
     }
@@ -10046,53 +10015,12 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusLiveBroadcastPriority {
-    Undefined,
-    ///
-    #[serde(rename = "liveBroadcastPriorityUnspecified")]
-    LiveBroadcastPriorityUnspecified,
-    /// Low priority broadcast: for low view count HoAs or other low priority broadcasts.
-    #[serde(rename = "low")]
-    Low,
-    /// Normal priority broadcast: for regular HoAs and broadcasts.
-    #[serde(rename = "normal")]
-    Normal,
-    /// High priority broadcast: for high profile HoAs, like PixelCorp ones.
-    #[serde(rename = "high")]
-    High,
-}
-
-impl std::default::Default for LiveBroadcastStatusLiveBroadcastPriority {
-    fn default() -> LiveBroadcastStatusLiveBroadcastPriority {
-        LiveBroadcastStatusLiveBroadcastPriority::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusLiveBroadcastPriority {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusLiveBroadcastPriority::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusLiveBroadcastPriority::LiveBroadcastPriorityUnspecified => {
-                write!(f, "liveBroadcastPriorityUnspecified")
-            }
-            LiveBroadcastStatusLiveBroadcastPriority::Low => write!(f, "low"),
-            LiveBroadcastStatusLiveBroadcastPriority::Normal => write!(f, "normal"),
-            LiveBroadcastStatusLiveBroadcastPriority::High => write!(f, "high"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum LiveBroadcastStatusPrivacyStatus {
     Undefined,
-    ///
     #[serde(rename = "public")]
     Public,
-    ///
     #[serde(rename = "unlisted")]
     Unlisted,
-    ///
     #[serde(rename = "private")]
     Private,
 }
@@ -10154,238 +10082,213 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivityContentDetailsPromotedItemCtaType {
-    Undefined,
-    ///
-    #[serde(rename = "ctaTypeUnspecified")]
-    CtaTypeUnspecified,
-    ///
-    #[serde(rename = "visitAdvertiserSite")]
-    VisitAdvertiserSite,
-}
-
-impl std::default::Default for ActivityContentDetailsPromotedItemCtaType {
-    fn default() -> ActivityContentDetailsPromotedItemCtaType {
-        ActivityContentDetailsPromotedItemCtaType::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivityContentDetailsPromotedItemCtaType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivityContentDetailsPromotedItemCtaType::Undefined => write!(f, "undefined"),
-            ActivityContentDetailsPromotedItemCtaType::CtaTypeUnspecified => {
-                write!(f, "ctaTypeUnspecified")
-            }
-            ActivityContentDetailsPromotedItemCtaType::VisitAdvertiserSite => {
-                write!(f, "visitAdvertiserSite")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoAgeGatingVideoGameRating {
-    Undefined,
-    ///
-    #[serde(rename = "anyone")]
-    Anyone,
-    ///
-    #[serde(rename = "m15Plus")]
-    M15Plus,
-    ///
-    #[serde(rename = "m16Plus")]
-    M16Plus,
-    ///
-    #[serde(rename = "m17Plus")]
-    M17Plus,
-}
-
-impl std::default::Default for VideoAgeGatingVideoGameRating {
-    fn default() -> VideoAgeGatingVideoGameRating {
-        VideoAgeGatingVideoGameRating::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoAgeGatingVideoGameRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoAgeGatingVideoGameRating::Undefined => write!(f, "undefined"),
-            VideoAgeGatingVideoGameRating::Anyone => write!(f, "anyone"),
-            VideoAgeGatingVideoGameRating::M15Plus => write!(f, "m15Plus"),
-            VideoAgeGatingVideoGameRating::M16Plus => write!(f, "m16Plus"),
-            VideoAgeGatingVideoGameRating::M17Plus => write!(f, "m17Plus"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveChatBanSnippetType {
-    Undefined,
-    /// An invalid ban type.
-    #[serde(rename = "liveChatBanTypeUnspecified")]
-    LiveChatBanTypeUnspecified,
-    /// A permanent ban.
-    #[serde(rename = "permanent")]
-    Permanent,
-    /// A temporary ban.
-    #[serde(rename = "temporary")]
-    Temporary,
-}
-
-impl std::default::Default for LiveChatBanSnippetType {
-    fn default() -> LiveChatBanSnippetType {
-        LiveChatBanSnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveChatBanSnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveChatBanSnippetType::Undefined => write!(f, "undefined"),
-            LiveChatBanSnippetType::LiveChatBanTypeUnspecified => {
-                write!(f, "liveChatBanTypeUnspecified")
-            }
-            LiveChatBanSnippetType::Permanent => write!(f, "permanent"),
-            LiveChatBanSnippetType::Temporary => write!(f, "temporary"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoRatingRating {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The entity is liked.
-    #[serde(rename = "like")]
-    Like,
-    /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for VideoRatingRating {
-    fn default() -> VideoRatingRating {
-        VideoRatingRating::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoRatingRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoRatingRating::Undefined => write!(f, "undefined"),
-            VideoRatingRating::None => write!(f, "none"),
-            VideoRatingRating::Like => write!(f, "like"),
-            VideoRatingRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentSnippetModerationStatus {
-    Undefined,
-    /// The comment is available for public display.
-    #[serde(rename = "published")]
-    Published,
-    /// The comment is awaiting review by a moderator.
-    #[serde(rename = "heldForReview")]
-    HeldForReview,
-    ///
-    #[serde(rename = "likelySpam")]
-    LikelySpam,
-    /// The comment is unfit for display.
-    #[serde(rename = "rejected")]
-    Rejected,
-}
-
-impl std::default::Default for CommentSnippetModerationStatus {
-    fn default() -> CommentSnippetModerationStatus {
-        CommentSnippetModerationStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentSnippetModerationStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentSnippetModerationStatus::Undefined => write!(f, "undefined"),
-            CommentSnippetModerationStatus::Published => write!(f, "published"),
-            CommentSnippetModerationStatus::HeldForReview => write!(f, "heldForReview"),
-            CommentSnippetModerationStatus::LikelySpam => write!(f, "likelySpam"),
-            CommentSnippetModerationStatus::Rejected => write!(f, "rejected"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentSnippetViewerRating {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The entity is liked.
-    #[serde(rename = "like")]
-    Like,
-    /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for CommentSnippetViewerRating {
-    fn default() -> CommentSnippetViewerRating {
-        CommentSnippetViewerRating::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentSnippetViewerRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentSnippetViewerRating::Undefined => write!(f, "undefined"),
-            CommentSnippetViewerRating::None => write!(f, "none"),
-            CommentSnippetViewerRating::Like => write!(f, "like"),
-            CommentSnippetViewerRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchResultSnippetLiveBroadcastContent {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for SearchResultSnippetLiveBroadcastContent {
-    fn default() -> SearchResultSnippetLiveBroadcastContent {
-        SearchResultSnippetLiveBroadcastContent::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchResultSnippetLiveBroadcastContent {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchResultSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
-            SearchResultSnippetLiveBroadcastContent::None => write!(f, "none"),
-            SearchResultSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
-            SearchResultSnippetLiveBroadcastContent::Live => write!(f, "live"),
-            SearchResultSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
+pub enum LiveBroadcastStatusLiveBroadcastPriority {
+    Undefined,
+    #[serde(rename = "liveBroadcastPriorityUnspecified")]
+    LiveBroadcastPriorityUnspecified,
+    /// Low priority broadcast: for low view count HoAs or other low priority broadcasts.
+    #[serde(rename = "low")]
+    Low,
+    /// Normal priority broadcast: for regular HoAs and broadcasts.
+    #[serde(rename = "normal")]
+    Normal,
+    /// High priority broadcast: for high profile HoAs, like PixelCorp ones.
+    #[serde(rename = "high")]
+    High,
+}
+
+impl std::default::Default for LiveBroadcastStatusLiveBroadcastPriority {
+    fn default() -> LiveBroadcastStatusLiveBroadcastPriority {
+        LiveBroadcastStatusLiveBroadcastPriority::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastStatusLiveBroadcastPriority {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastStatusLiveBroadcastPriority::Undefined => write!(f, "undefined"),
+            LiveBroadcastStatusLiveBroadcastPriority::LiveBroadcastPriorityUnspecified => {
+                write!(f, "liveBroadcastPriorityUnspecified")
+            }
+            LiveBroadcastStatusLiveBroadcastPriority::Low => write!(f, "low"),
+            LiveBroadcastStatusLiveBroadcastPriority::Normal => write!(f, "normal"),
+            LiveBroadcastStatusLiveBroadcastPriority::High => write!(f, "high"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoTimingType {
+    Undefined,
+    #[serde(rename = "offsetFromStart")]
+    OffsetFromStart,
+    #[serde(rename = "offsetFromEnd")]
+    OffsetFromEnd,
+}
+
+impl std::default::Default for InvideoTimingType {
+    fn default() -> InvideoTimingType {
+        InvideoTimingType::Undefined
+    }
+}
+
+impl std::fmt::Display for InvideoTimingType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            InvideoTimingType::Undefined => write!(f, "undefined"),
+            InvideoTimingType::OffsetFromStart => write!(f, "offsetFromStart"),
+            InvideoTimingType::OffsetFromEnd => write!(f, "offsetFromEnd"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for ChannelStatusPrivacyStatus {
+    fn default() -> ChannelStatusPrivacyStatus {
+        ChannelStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            ChannelStatusPrivacyStatus::Public => write!(f, "public"),
+            ChannelStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            ChannelStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelStatusLongUploadsStatus {
+    Undefined,
+    #[serde(rename = "longUploadsUnspecified")]
+    LongUploadsUnspecified,
+    #[serde(rename = "allowed")]
+    Allowed,
+    #[serde(rename = "eligible")]
+    Eligible,
+    #[serde(rename = "disallowed")]
+    Disallowed,
+}
+
+impl std::default::Default for ChannelStatusLongUploadsStatus {
+    fn default() -> ChannelStatusLongUploadsStatus {
+        ChannelStatusLongUploadsStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelStatusLongUploadsStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelStatusLongUploadsStatus::Undefined => write!(f, "undefined"),
+            ChannelStatusLongUploadsStatus::LongUploadsUnspecified => {
+                write!(f, "longUploadsUnspecified")
+            }
+            ChannelStatusLongUploadsStatus::Allowed => write!(f, "allowed"),
+            ChannelStatusLongUploadsStatus::Eligible => write!(f, "eligible"),
+            ChannelStatusLongUploadsStatus::Disallowed => write!(f, "disallowed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivityContentDetailsSocialType {
+    Undefined,
+    #[serde(rename = "typeUnspecified")]
+    TypeUnspecified,
+    #[serde(rename = "googlePlus")]
+    GooglePlus,
+    #[serde(rename = "facebook")]
+    Facebook,
+    #[serde(rename = "twitter")]
+    Twitter,
+}
+
+impl std::default::Default for ActivityContentDetailsSocialType {
+    fn default() -> ActivityContentDetailsSocialType {
+        ActivityContentDetailsSocialType::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivityContentDetailsSocialType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivityContentDetailsSocialType::Undefined => write!(f, "undefined"),
+            ActivityContentDetailsSocialType::TypeUnspecified => write!(f, "typeUnspecified"),
+            ActivityContentDetailsSocialType::GooglePlus => write!(f, "googlePlus"),
+            ActivityContentDetailsSocialType::Facebook => write!(f, "facebook"),
+            ActivityContentDetailsSocialType::Twitter => write!(f, "twitter"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoPositionCornerPosition {
+    Undefined,
+    #[serde(rename = "topLeft")]
+    TopLeft,
+    #[serde(rename = "topRight")]
+    TopRight,
+    #[serde(rename = "bottomLeft")]
+    BottomLeft,
+    #[serde(rename = "bottomRight")]
+    BottomRight,
+}
+
+impl std::default::Default for InvideoPositionCornerPosition {
+    fn default() -> InvideoPositionCornerPosition {
+        InvideoPositionCornerPosition::Undefined
+    }
+}
+
+impl std::fmt::Display for InvideoPositionCornerPosition {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            InvideoPositionCornerPosition::Undefined => write!(f, "undefined"),
+            InvideoPositionCornerPosition::TopLeft => write!(f, "topLeft"),
+            InvideoPositionCornerPosition::TopRight => write!(f, "topRight"),
+            InvideoPositionCornerPosition::BottomLeft => write!(f, "bottomLeft"),
+            InvideoPositionCornerPosition::BottomRight => write!(f, "bottomRight"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoPositionType {
+    Undefined,
+    #[serde(rename = "corner")]
+    Corner,
+}
+
+impl std::default::Default for InvideoPositionType {
+    fn default() -> InvideoPositionType {
+        InvideoPositionType::Undefined
+    }
+}
+
+impl std::fmt::Display for InvideoPositionType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            InvideoPositionType::Undefined => write!(f, "undefined"),
+            InvideoPositionType::Corner => write!(f, "corner"),
         };
         Ok(())
     }
@@ -10394,43 +10297,30 @@
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum LiveChatMessageSnippetType {
     Undefined,
-    ///
     #[serde(rename = "invalidType")]
     InvalidType,
-    ///
     #[serde(rename = "textMessageEvent")]
     TextMessageEvent,
-    ///
     #[serde(rename = "tombstone")]
     Tombstone,
-    ///
     #[serde(rename = "fanFundingEvent")]
     FanFundingEvent,
-    ///
     #[serde(rename = "chatEndedEvent")]
     ChatEndedEvent,
-    ///
     #[serde(rename = "sponsorOnlyModeStartedEvent")]
     SponsorOnlyModeStartedEvent,
-    ///
     #[serde(rename = "sponsorOnlyModeEndedEvent")]
     SponsorOnlyModeEndedEvent,
-    ///
     #[serde(rename = "newSponsorEvent")]
     NewSponsorEvent,
-    ///
     #[serde(rename = "messageDeletedEvent")]
     MessageDeletedEvent,
-    ///
     #[serde(rename = "messageRetractedEvent")]
     MessageRetractedEvent,
-    ///
     #[serde(rename = "userBannedEvent")]
     UserBannedEvent,
-    ///
     #[serde(rename = "superChatEvent")]
     SuperChatEvent,
-    ///
     #[serde(rename = "superStickerEvent")]
     SuperStickerEvent,
 }
@@ -10468,350 +10358,785 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelConversionPingContext {
-    Undefined,
-    ///
-    #[serde(rename = "subscribe")]
-    Subscribe,
-    ///
-    #[serde(rename = "unsubscribe")]
-    Unsubscribe,
-    ///
-    #[serde(rename = "cview")]
-    Cview,
-}
-
-impl std::default::Default for ChannelConversionPingContext {
-    fn default() -> ChannelConversionPingContext {
-        ChannelConversionPingContext::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelConversionPingContext {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelConversionPingContext::Undefined => write!(f, "undefined"),
-            ChannelConversionPingContext::Subscribe => write!(f, "subscribe"),
-            ChannelConversionPingContext::Unsubscribe => write!(f, "unsubscribe"),
-            ChannelConversionPingContext::Cview => write!(f, "cview"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum PlaylistStatusPrivacyStatus {
-    Undefined,
-    ///
-    #[serde(rename = "public")]
-    Public,
-    ///
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    ///
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for PlaylistStatusPrivacyStatus {
-    fn default() -> PlaylistStatusPrivacyStatus {
-        PlaylistStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for PlaylistStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            PlaylistStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            PlaylistStatusPrivacyStatus::Public => write!(f, "public"),
-            PlaylistStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            PlaylistStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoFileDetailsVideoStreamRotation {
-    Undefined,
-    ///
+pub enum MembersListMode {
+    Undefined,
+    #[serde(rename = "listMembersModeUnknown")]
+    ListMembersModeUnknown,
+    /// Return only members that joined after the first call with this mode was made.
+    #[serde(rename = "updates")]
+    Updates,
+    /// Return all current members, from newest to oldest.
+    #[serde(rename = "all_current")]
+    All_current,
+}
+
+impl std::default::Default for MembersListMode {
+    fn default() -> MembersListMode {
+        MembersListMode::Undefined
+    }
+}
+
+impl std::fmt::Display for MembersListMode {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            MembersListMode::Undefined => write!(f, "undefined"),
+            MembersListMode::ListMembersModeUnknown => write!(f, "listMembersModeUnknown"),
+            MembersListMode::Updates => write!(f, "updates"),
+            MembersListMode::All_current => write!(f, "all_current"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideosListMyRating {
+    Undefined,
+    #[serde(rename = "none")]
+    None,
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "dislike")]
+    Dislike,
+}
+
+impl std::default::Default for VideosListMyRating {
+    fn default() -> VideosListMyRating {
+        VideosListMyRating::Undefined
+    }
+}
+
+impl std::fmt::Display for VideosListMyRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideosListMyRating::Undefined => write!(f, "undefined"),
+            VideosListMyRating::None => write!(f, "none"),
+            VideosListMyRating::Like => write!(f, "like"),
+            VideosListMyRating::Dislike => write!(f, "dislike"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideosListChart {
+    Undefined,
+    #[serde(rename = "chartUnspecified")]
+    ChartUnspecified,
+    /// Return the most popular videos for the specified content region and video category.
+    #[serde(rename = "mostPopular")]
+    MostPopular,
+}
+
+impl std::default::Default for VideosListChart {
+    fn default() -> VideosListChart {
+        VideosListChart::Undefined
+    }
+}
+
+impl std::fmt::Display for VideosListChart {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideosListChart::Undefined => write!(f, "undefined"),
+            VideosListChart::ChartUnspecified => write!(f, "chartUnspecified"),
+            VideosListChart::MostPopular => write!(f, "mostPopular"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideosRateRating {
+    Undefined,
     #[serde(rename = "none")]
     None,
-    ///
-    #[serde(rename = "clockwise")]
-    Clockwise,
-    ///
-    #[serde(rename = "upsideDown")]
-    UpsideDown,
-    ///
-    #[serde(rename = "counterClockwise")]
-    CounterClockwise,
-    ///
-    #[serde(rename = "other")]
-    Other,
-}
-
-impl std::default::Default for VideoFileDetailsVideoStreamRotation {
-    fn default() -> VideoFileDetailsVideoStreamRotation {
-        VideoFileDetailsVideoStreamRotation::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoFileDetailsVideoStreamRotation {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoFileDetailsVideoStreamRotation::Undefined => write!(f, "undefined"),
-            VideoFileDetailsVideoStreamRotation::None => write!(f, "none"),
-            VideoFileDetailsVideoStreamRotation::Clockwise => write!(f, "clockwise"),
-            VideoFileDetailsVideoStreamRotation::UpsideDown => write!(f, "upsideDown"),
-            VideoFileDetailsVideoStreamRotation::CounterClockwise => write!(f, "counterClockwise"),
-            VideoFileDetailsVideoStreamRotation::Other => write!(f, "other"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamStatusStreamStatus {
-    Undefined,
-    ///
-    #[serde(rename = "created")]
-    Created,
-    ///
-    #[serde(rename = "ready")]
-    Ready,
-    ///
-    #[serde(rename = "active")]
-    Active,
-    ///
-    #[serde(rename = "inactive")]
-    Inactive,
-    ///
-    #[serde(rename = "error")]
-    Error,
-}
-
-impl std::default::Default for LiveStreamStatusStreamStatus {
-    fn default() -> LiveStreamStatusStreamStatus {
-        LiveStreamStatusStreamStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamStatusStreamStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamStatusStreamStatus::Undefined => write!(f, "undefined"),
-            LiveStreamStatusStreamStatus::Created => write!(f, "created"),
-            LiveStreamStatusStreamStatus::Ready => write!(f, "ready"),
-            LiveStreamStatusStreamStatus::Active => write!(f, "active"),
-            LiveStreamStatusStreamStatus::Inactive => write!(f, "inactive"),
-            LiveStreamStatusStreamStatus::Error => write!(f, "error"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusLicense {
-    Undefined,
-    ///
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "dislike")]
+    Dislike,
+}
+
+impl std::default::Default for VideosRateRating {
+    fn default() -> VideosRateRating {
+        VideosRateRating::Undefined
+    }
+}
+
+impl std::fmt::Display for VideosRateRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideosRateRating::Undefined => write!(f, "undefined"),
+            VideosRateRating::None => write!(f, "none"),
+            VideosRateRating::Like => write!(f, "like"),
+            VideosRateRating::Dislike => write!(f, "dislike"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoSyndicated {
+    Undefined,
+    #[serde(rename = "videoSyndicatedUnspecified")]
+    VideoSyndicatedUnspecified,
+    /// Return all videos, syndicated or not.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve syndicated videos.
+    #[serde(rename = "true")]
+    True,
+}
+
+impl std::default::Default for SearchListVideoSyndicated {
+    fn default() -> SearchListVideoSyndicated {
+        SearchListVideoSyndicated::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoSyndicated {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoSyndicated::Undefined => write!(f, "undefined"),
+            SearchListVideoSyndicated::VideoSyndicatedUnspecified => {
+                write!(f, "videoSyndicatedUnspecified")
+            }
+            SearchListVideoSyndicated::Any => write!(f, "any"),
+            SearchListVideoSyndicated::True => write!(f, "true"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListChannelType {
+    Undefined,
+    #[serde(rename = "channelTypeUnspecified")]
+    ChannelTypeUnspecified,
+    /// Return all channels.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve shows.
+    #[serde(rename = "show")]
+    Show,
+}
+
+impl std::default::Default for SearchListChannelType {
+    fn default() -> SearchListChannelType {
+        SearchListChannelType::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListChannelType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListChannelType::Undefined => write!(f, "undefined"),
+            SearchListChannelType::ChannelTypeUnspecified => write!(f, "channelTypeUnspecified"),
+            SearchListChannelType::Any => write!(f, "any"),
+            SearchListChannelType::Show => write!(f, "show"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoDimension {
+    Undefined,
+    #[serde(rename = "any")]
+    Any,
+    /// Restrict search results to exclude 3D videos.
+    #[serde(rename = "2d")]
+    _2d,
+    /// Restrict search results to only include 3D videos.
+    #[serde(rename = "3d")]
+    _3d,
+}
+
+impl std::default::Default for SearchListVideoDimension {
+    fn default() -> SearchListVideoDimension {
+        SearchListVideoDimension::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoDimension {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoDimension::Undefined => write!(f, "undefined"),
+            SearchListVideoDimension::Any => write!(f, "any"),
+            SearchListVideoDimension::_2d => write!(f, "2d"),
+            SearchListVideoDimension::_3d => write!(f, "3d"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoDuration {
+    Undefined,
+    #[serde(rename = "videoDurationUnspecified")]
+    VideoDurationUnspecified,
+    /// Do not filter video search results based on their duration. This is the default value.
+    #[serde(rename = "any")]
+    Any,
+    /// Only include videos that are less than four minutes long.
+    #[serde(rename = "short")]
+    Short,
+    /// Only include videos that are between four and 20 minutes long (inclusive).
+    #[serde(rename = "medium")]
+    Medium,
+    /// Only include videos longer than 20 minutes.
+    #[serde(rename = "long")]
+    Long,
+}
+
+impl std::default::Default for SearchListVideoDuration {
+    fn default() -> SearchListVideoDuration {
+        SearchListVideoDuration::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoDuration {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoDuration::Undefined => write!(f, "undefined"),
+            SearchListVideoDuration::VideoDurationUnspecified => {
+                write!(f, "videoDurationUnspecified")
+            }
+            SearchListVideoDuration::Any => write!(f, "any"),
+            SearchListVideoDuration::Short => write!(f, "short"),
+            SearchListVideoDuration::Medium => write!(f, "medium"),
+            SearchListVideoDuration::Long => write!(f, "long"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListOrder {
+    Undefined,
+    #[serde(rename = "searchSortUnspecified")]
+    SearchSortUnspecified,
+    /// Resources are sorted in reverse chronological order based on the date they were created.
+    #[serde(rename = "date")]
+    Date,
+    /// Resources are sorted from highest to lowest rating.
+    #[serde(rename = "rating")]
+    Rating,
+    /// Resources are sorted from highest to lowest number of views.
+    #[serde(rename = "viewCount")]
+    ViewCount,
+    /// Resources are sorted based on their relevance to the search query. This is the default value for this parameter.
+    #[serde(rename = "relevance")]
+    Relevance,
+    /// Resources are sorted alphabetically by title.
+    #[serde(rename = "title")]
+    Title,
+    /// Channels are sorted in descending order of their number of uploaded videos.
+    #[serde(rename = "videoCount")]
+    VideoCount,
+}
+
+impl std::default::Default for SearchListOrder {
+    fn default() -> SearchListOrder {
+        SearchListOrder::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListOrder {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListOrder::Undefined => write!(f, "undefined"),
+            SearchListOrder::SearchSortUnspecified => write!(f, "searchSortUnspecified"),
+            SearchListOrder::Date => write!(f, "date"),
+            SearchListOrder::Rating => write!(f, "rating"),
+            SearchListOrder::ViewCount => write!(f, "viewCount"),
+            SearchListOrder::Relevance => write!(f, "relevance"),
+            SearchListOrder::Title => write!(f, "title"),
+            SearchListOrder::VideoCount => write!(f, "videoCount"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoLicense {
+    Undefined,
+    /// Return all videos, regardless of which license they have, that match the query parameters.
+    #[serde(rename = "any")]
+    Any,
+    /// Only return videos that have the standard YouTube license.
     #[serde(rename = "youtube")]
     Youtube,
-    ///
+    /// Only return videos that have a Creative Commons license. Users can reuse videos with this license in other videos that they create. Learn more.
     #[serde(rename = "creativeCommon")]
     CreativeCommon,
 }
 
-impl std::default::Default for VideoStatusLicense {
-    fn default() -> VideoStatusLicense {
-        VideoStatusLicense::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusLicense {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusLicense::Undefined => write!(f, "undefined"),
-            VideoStatusLicense::Youtube => write!(f, "youtube"),
-            VideoStatusLicense::CreativeCommon => write!(f, "creativeCommon"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusFailureReason {
-    Undefined,
-    /// Unable to convert video content.
-    #[serde(rename = "conversion")]
-    Conversion,
-    /// Invalid file format.
-    #[serde(rename = "invalidFile")]
-    InvalidFile,
-    /// Empty file.
-    #[serde(rename = "emptyFile")]
-    EmptyFile,
-    /// File was too small.
-    #[serde(rename = "tooSmall")]
-    TooSmall,
-    /// Unsupported codec.
-    #[serde(rename = "codec")]
-    Codec,
-    /// Upload wasn't finished.
-    #[serde(rename = "uploadAborted")]
-    UploadAborted,
-}
-
-impl std::default::Default for VideoStatusFailureReason {
-    fn default() -> VideoStatusFailureReason {
-        VideoStatusFailureReason::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusFailureReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusFailureReason::Undefined => write!(f, "undefined"),
-            VideoStatusFailureReason::Conversion => write!(f, "conversion"),
-            VideoStatusFailureReason::InvalidFile => write!(f, "invalidFile"),
-            VideoStatusFailureReason::EmptyFile => write!(f, "emptyFile"),
-            VideoStatusFailureReason::TooSmall => write!(f, "tooSmall"),
-            VideoStatusFailureReason::Codec => write!(f, "codec"),
-            VideoStatusFailureReason::UploadAborted => write!(f, "uploadAborted"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusUploadStatus {
-    Undefined,
-    /// Video has been uploaded but not processed yet.
-    #[serde(rename = "uploaded")]
-    Uploaded,
-    /// Video has been successfully processed.
-    #[serde(rename = "processed")]
-    Processed,
-    /// Processing has failed. See FailureReason.
-    #[serde(rename = "failed")]
-    Failed,
-    /// Video has been rejected. See RejectionReason.
+impl std::default::Default for SearchListVideoLicense {
+    fn default() -> SearchListVideoLicense {
+        SearchListVideoLicense::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoLicense {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoLicense::Undefined => write!(f, "undefined"),
+            SearchListVideoLicense::Any => write!(f, "any"),
+            SearchListVideoLicense::Youtube => write!(f, "youtube"),
+            SearchListVideoLicense::CreativeCommon => write!(f, "creativeCommon"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListSafeSearch {
+    Undefined,
+    #[serde(rename = "safeSearchSettingUnspecified")]
+    SafeSearchSettingUnspecified,
+    /// YouTube will not filter the search result set.
+    #[serde(rename = "none")]
+    None,
+    /// YouTube will filter some content from search results and, at the least, will filter content that is restricted in your locale. Based on their content, search results could be removed from search results or demoted in search results. This is the default parameter value.
+    #[serde(rename = "moderate")]
+    Moderate,
+    /// YouTube will try to exclude all restricted content from the search result set. Based on their content, search results could be removed from search results or demoted in search results.
+    #[serde(rename = "strict")]
+    Strict,
+}
+
+impl std::default::Default for SearchListSafeSearch {
+    fn default() -> SearchListSafeSearch {
+        SearchListSafeSearch::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListSafeSearch {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListSafeSearch::Undefined => write!(f, "undefined"),
+            SearchListSafeSearch::SafeSearchSettingUnspecified => {
+                write!(f, "safeSearchSettingUnspecified")
+            }
+            SearchListSafeSearch::None => write!(f, "none"),
+            SearchListSafeSearch::Moderate => write!(f, "moderate"),
+            SearchListSafeSearch::Strict => write!(f, "strict"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoType {
+    Undefined,
+    #[serde(rename = "videoTypeUnspecified")]
+    VideoTypeUnspecified,
+    /// Return all videos.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve movies.
+    #[serde(rename = "movie")]
+    Movie,
+    /// Only retrieve episodes of shows.
+    #[serde(rename = "episode")]
+    Episode,
+}
+
+impl std::default::Default for SearchListVideoType {
+    fn default() -> SearchListVideoType {
+        SearchListVideoType::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoType::Undefined => write!(f, "undefined"),
+            SearchListVideoType::VideoTypeUnspecified => write!(f, "videoTypeUnspecified"),
+            SearchListVideoType::Any => write!(f, "any"),
+            SearchListVideoType::Movie => write!(f, "movie"),
+            SearchListVideoType::Episode => write!(f, "episode"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoEmbeddable {
+    Undefined,
+    #[serde(rename = "videoEmbeddableUnspecified")]
+    VideoEmbeddableUnspecified,
+    /// Return all videos, embeddable or not.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve embeddable videos.
+    #[serde(rename = "true")]
+    True,
+}
+
+impl std::default::Default for SearchListVideoEmbeddable {
+    fn default() -> SearchListVideoEmbeddable {
+        SearchListVideoEmbeddable::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoEmbeddable {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoEmbeddable::Undefined => write!(f, "undefined"),
+            SearchListVideoEmbeddable::VideoEmbeddableUnspecified => {
+                write!(f, "videoEmbeddableUnspecified")
+            }
+            SearchListVideoEmbeddable::Any => write!(f, "any"),
+            SearchListVideoEmbeddable::True => write!(f, "true"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoDefinition {
+    Undefined,
+    /// Return all videos, regardless of their resolution.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve videos in standard definition.
+    #[serde(rename = "standard")]
+    Standard,
+    /// Only retrieve HD videos.
+    #[serde(rename = "high")]
+    High,
+}
+
+impl std::default::Default for SearchListVideoDefinition {
+    fn default() -> SearchListVideoDefinition {
+        SearchListVideoDefinition::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoDefinition {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoDefinition::Undefined => write!(f, "undefined"),
+            SearchListVideoDefinition::Any => write!(f, "any"),
+            SearchListVideoDefinition::Standard => write!(f, "standard"),
+            SearchListVideoDefinition::High => write!(f, "high"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoCaption {
+    Undefined,
+    #[serde(rename = "videoCaptionUnspecified")]
+    VideoCaptionUnspecified,
+    /// Do not filter results based on caption availability.
+    #[serde(rename = "any")]
+    Any,
+    /// Only include videos that have captions.
+    #[serde(rename = "closedCaption")]
+    ClosedCaption,
+    /// Only include videos that do not have captions.
+    #[serde(rename = "none")]
+    None,
+}
+
+impl std::default::Default for SearchListVideoCaption {
+    fn default() -> SearchListVideoCaption {
+        SearchListVideoCaption::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoCaption {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoCaption::Undefined => write!(f, "undefined"),
+            SearchListVideoCaption::VideoCaptionUnspecified => write!(f, "videoCaptionUnspecified"),
+            SearchListVideoCaption::Any => write!(f, "any"),
+            SearchListVideoCaption::ClosedCaption => write!(f, "closedCaption"),
+            SearchListVideoCaption::None => write!(f, "none"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListEventType {
+    Undefined,
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+    /// The live broadcast is active.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast has been completed.
+    #[serde(rename = "completed")]
+    Completed,
+}
+
+impl std::default::Default for SearchListEventType {
+    fn default() -> SearchListEventType {
+        SearchListEventType::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListEventType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListEventType::Undefined => write!(f, "undefined"),
+            SearchListEventType::None => write!(f, "none"),
+            SearchListEventType::Upcoming => write!(f, "upcoming"),
+            SearchListEventType::Live => write!(f, "live"),
+            SearchListEventType::Completed => write!(f, "completed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinksDeleteType {
+    Undefined,
+    #[serde(rename = "linkUnspecified")]
+    LinkUnspecified,
+    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
+    #[serde(rename = "channelToStoreLink")]
+    ChannelToStoreLink,
+}
+
+impl std::default::Default for ThirdPartyLinksDeleteType {
+    fn default() -> ThirdPartyLinksDeleteType {
+        ThirdPartyLinksDeleteType::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinksDeleteType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinksDeleteType::Undefined => write!(f, "undefined"),
+            ThirdPartyLinksDeleteType::LinkUnspecified => write!(f, "linkUnspecified"),
+            ThirdPartyLinksDeleteType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinksListType {
+    Undefined,
+    #[serde(rename = "linkUnspecified")]
+    LinkUnspecified,
+    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
+    #[serde(rename = "channelToStoreLink")]
+    ChannelToStoreLink,
+}
+
+impl std::default::Default for ThirdPartyLinksListType {
+    fn default() -> ThirdPartyLinksListType {
+        ThirdPartyLinksListType::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinksListType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinksListType::Undefined => write!(f, "undefined"),
+            ThirdPartyLinksListType::LinkUnspecified => write!(f, "linkUnspecified"),
+            ThirdPartyLinksListType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsTransitionBroadcastStatus {
+    Undefined,
+    #[serde(rename = "statusUnspecified")]
+    StatusUnspecified,
+    /// Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream. Note that you can only transition a broadcast to the testing state if its contentDetails.monitorStream.enableMonitorStream property is set to true.",
+    #[serde(rename = "testing")]
+    Testing,
+    /// Return only persistent broadcasts.
+    #[serde(rename = "live")]
+    Live,
+    /// The broadcast is over. YouTube stops transmitting video.
+    #[serde(rename = "complete")]
+    Complete,
+}
+
+impl std::default::Default for LiveBroadcastsTransitionBroadcastStatus {
+    fn default() -> LiveBroadcastsTransitionBroadcastStatus {
+        LiveBroadcastsTransitionBroadcastStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsTransitionBroadcastStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsTransitionBroadcastStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastsTransitionBroadcastStatus::StatusUnspecified => {
+                write!(f, "statusUnspecified")
+            }
+            LiveBroadcastsTransitionBroadcastStatus::Testing => write!(f, "testing"),
+            LiveBroadcastsTransitionBroadcastStatus::Live => write!(f, "live"),
+            LiveBroadcastsTransitionBroadcastStatus::Complete => write!(f, "complete"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsListBroadcastType {
+    Undefined,
+    #[serde(rename = "broadcastTypeFilterUnspecified")]
+    BroadcastTypeFilterUnspecified,
+    /// Return all broadcasts.
+    #[serde(rename = "all")]
+    All,
+    /// Return only scheduled event broadcasts.
+    #[serde(rename = "event")]
+    Event,
+    /// Return only persistent broadcasts.
+    #[serde(rename = "persistent")]
+    Persistent,
+}
+
+impl std::default::Default for LiveBroadcastsListBroadcastType {
+    fn default() -> LiveBroadcastsListBroadcastType {
+        LiveBroadcastsListBroadcastType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsListBroadcastType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsListBroadcastType::Undefined => write!(f, "undefined"),
+            LiveBroadcastsListBroadcastType::BroadcastTypeFilterUnspecified => {
+                write!(f, "broadcastTypeFilterUnspecified")
+            }
+            LiveBroadcastsListBroadcastType::All => write!(f, "all"),
+            LiveBroadcastsListBroadcastType::Event => write!(f, "event"),
+            LiveBroadcastsListBroadcastType::Persistent => write!(f, "persistent"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsListBroadcastStatus {
+    Undefined,
+    #[serde(rename = "broadcastStatusFilterUnspecified")]
+    BroadcastStatusFilterUnspecified,
+    /// Return all broadcasts.
+    #[serde(rename = "all")]
+    All,
+    /// Return current live broadcasts.
+    #[serde(rename = "active")]
+    Active,
+    /// Return broadcasts that have not yet started.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+    /// Return broadcasts that have already ended.
+    #[serde(rename = "completed")]
+    Completed,
+}
+
+impl std::default::Default for LiveBroadcastsListBroadcastStatus {
+    fn default() -> LiveBroadcastsListBroadcastStatus {
+        LiveBroadcastsListBroadcastStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsListBroadcastStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsListBroadcastStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastsListBroadcastStatus::BroadcastStatusFilterUnspecified => {
+                write!(f, "broadcastStatusFilterUnspecified")
+            }
+            LiveBroadcastsListBroadcastStatus::All => write!(f, "all"),
+            LiveBroadcastsListBroadcastStatus::Active => write!(f, "active"),
+            LiveBroadcastsListBroadcastStatus::Upcoming => write!(f, "upcoming"),
+            LiveBroadcastsListBroadcastStatus::Completed => write!(f, "completed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SubscriptionsListOrder {
+    Undefined,
+    #[serde(rename = "subscriptionOrderUnspecified")]
+    SubscriptionOrderUnspecified,
+    /// Sort by relevance.
+    #[serde(rename = "relevance")]
+    Relevance,
+    /// Sort by order of activity.
+    #[serde(rename = "unread")]
+    Unread,
+    /// Sort alphabetically.
+    #[serde(rename = "alphabetical")]
+    Alphabetical,
+}
+
+impl std::default::Default for SubscriptionsListOrder {
+    fn default() -> SubscriptionsListOrder {
+        SubscriptionsListOrder::Undefined
+    }
+}
+
+impl std::fmt::Display for SubscriptionsListOrder {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SubscriptionsListOrder::Undefined => write!(f, "undefined"),
+            SubscriptionsListOrder::SubscriptionOrderUnspecified => {
+                write!(f, "subscriptionOrderUnspecified")
+            }
+            SubscriptionsListOrder::Relevance => write!(f, "relevance"),
+            SubscriptionsListOrder::Unread => write!(f, "unread"),
+            SubscriptionsListOrder::Alphabetical => write!(f, "alphabetical"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentsSetModerationStatusModerationStatus {
+    Undefined,
+    /// The comment is available for public display.
+    #[serde(rename = "published")]
+    Published,
+    /// The comment is awaiting review by a moderator.
+    #[serde(rename = "heldForReview")]
+    HeldForReview,
+    #[serde(rename = "likelySpam")]
+    LikelySpam,
+    /// The comment is unfit for display.
     #[serde(rename = "rejected")]
     Rejected,
-    /// Video has been deleted.
-    #[serde(rename = "deleted")]
-    Deleted,
-}
-
-impl std::default::Default for VideoStatusUploadStatus {
-    fn default() -> VideoStatusUploadStatus {
-        VideoStatusUploadStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusUploadStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusUploadStatus::Undefined => write!(f, "undefined"),
-            VideoStatusUploadStatus::Uploaded => write!(f, "uploaded"),
-            VideoStatusUploadStatus::Processed => write!(f, "processed"),
-            VideoStatusUploadStatus::Failed => write!(f, "failed"),
-            VideoStatusUploadStatus::Rejected => write!(f, "rejected"),
-            VideoStatusUploadStatus::Deleted => write!(f, "deleted"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusRejectionReason {
-    Undefined,
-    /// Copyright infringement.
-    #[serde(rename = "copyright")]
-    Copyright,
-    /// Inappropriate video content.
-    #[serde(rename = "inappropriate")]
-    Inappropriate,
-    /// Duplicate upload in the same channel.
-    #[serde(rename = "duplicate")]
-    Duplicate,
-    /// Terms of use violation.
-    #[serde(rename = "termsOfUse")]
-    TermsOfUse,
-    /// Uploader account was suspended.
-    #[serde(rename = "uploaderAccountSuspended")]
-    UploaderAccountSuspended,
-    /// Video duration was too long.
-    #[serde(rename = "length")]
-    Length,
-    /// Blocked by content owner.
-    #[serde(rename = "claim")]
-    Claim,
-    /// Uploader closed his/her account.
-    #[serde(rename = "uploaderAccountClosed")]
-    UploaderAccountClosed,
-    /// Trademark infringement.
-    #[serde(rename = "trademark")]
-    Trademark,
-    /// An unspecified legal reason.
-    #[serde(rename = "legal")]
-    Legal,
-}
-
-impl std::default::Default for VideoStatusRejectionReason {
-    fn default() -> VideoStatusRejectionReason {
-        VideoStatusRejectionReason::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusRejectionReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusRejectionReason::Undefined => write!(f, "undefined"),
-            VideoStatusRejectionReason::Copyright => write!(f, "copyright"),
-            VideoStatusRejectionReason::Inappropriate => write!(f, "inappropriate"),
-            VideoStatusRejectionReason::Duplicate => write!(f, "duplicate"),
-            VideoStatusRejectionReason::TermsOfUse => write!(f, "termsOfUse"),
-            VideoStatusRejectionReason::UploaderAccountSuspended => {
-                write!(f, "uploaderAccountSuspended")
-            }
-            VideoStatusRejectionReason::Length => write!(f, "length"),
-            VideoStatusRejectionReason::Claim => write!(f, "claim"),
-            VideoStatusRejectionReason::UploaderAccountClosed => write!(f, "uploaderAccountClosed"),
-            VideoStatusRejectionReason::Trademark => write!(f, "trademark"),
-            VideoStatusRejectionReason::Legal => write!(f, "legal"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusPrivacyStatus {
-    Undefined,
-    ///
-    #[serde(rename = "public")]
-    Public,
-    ///
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    ///
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for VideoStatusPrivacyStatus {
-    fn default() -> VideoStatusPrivacyStatus {
-        VideoStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            VideoStatusPrivacyStatus::Public => write!(f, "public"),
-            VideoStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            VideoStatusPrivacyStatus::Private => write!(f, "private"),
+}
+
+impl std::default::Default for CommentsSetModerationStatusModerationStatus {
+    fn default() -> CommentsSetModerationStatusModerationStatus {
+        CommentsSetModerationStatusModerationStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentsSetModerationStatusModerationStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentsSetModerationStatusModerationStatus::Undefined => write!(f, "undefined"),
+            CommentsSetModerationStatusModerationStatus::Published => write!(f, "published"),
+            CommentsSetModerationStatusModerationStatus::HeldForReview => {
+                write!(f, "heldForReview")
+            }
+            CommentsSetModerationStatusModerationStatus::LikelySpam => write!(f, "likelySpam"),
+            CommentsSetModerationStatusModerationStatus::Rejected => write!(f, "rejected"),
         };
         Ok(())
     }
@@ -10820,7 +11145,6 @@
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum CommentsListTextFormat {
     Undefined,
-    ///
     #[serde(rename = "textFormatUnspecified")]
     TextFormatUnspecified,
     /// Returns the comments in HTML format. This is the default value.
@@ -10850,135 +11174,8 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentsSetModerationStatusModerationStatus {
-    Undefined,
-    /// The comment is available for public display.
-    #[serde(rename = "published")]
-    Published,
-    /// The comment is awaiting review by a moderator.
-    #[serde(rename = "heldForReview")]
-    HeldForReview,
-    ///
-    #[serde(rename = "likelySpam")]
-    LikelySpam,
-    /// The comment is unfit for display.
-    #[serde(rename = "rejected")]
-    Rejected,
-}
-
-impl std::default::Default for CommentsSetModerationStatusModerationStatus {
-    fn default() -> CommentsSetModerationStatusModerationStatus {
-        CommentsSetModerationStatusModerationStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentsSetModerationStatusModerationStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentsSetModerationStatusModerationStatus::Undefined => write!(f, "undefined"),
-            CommentsSetModerationStatusModerationStatus::Published => write!(f, "published"),
-            CommentsSetModerationStatusModerationStatus::HeldForReview => {
-                write!(f, "heldForReview")
-            }
-            CommentsSetModerationStatusModerationStatus::LikelySpam => write!(f, "likelySpam"),
-            CommentsSetModerationStatusModerationStatus::Rejected => write!(f, "rejected"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinksListType {
-    Undefined,
-    ///
-    #[serde(rename = "linkUnspecified")]
-    LinkUnspecified,
-    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
-    #[serde(rename = "channelToStoreLink")]
-    ChannelToStoreLink,
-}
-
-impl std::default::Default for ThirdPartyLinksListType {
-    fn default() -> ThirdPartyLinksListType {
-        ThirdPartyLinksListType::Undefined
-    }
-}
-
-impl std::fmt::Display for ThirdPartyLinksListType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ThirdPartyLinksListType::Undefined => write!(f, "undefined"),
-            ThirdPartyLinksListType::LinkUnspecified => write!(f, "linkUnspecified"),
-            ThirdPartyLinksListType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinksDeleteType {
-    Undefined,
-    ///
-    #[serde(rename = "linkUnspecified")]
-    LinkUnspecified,
-    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
-    #[serde(rename = "channelToStoreLink")]
-    ChannelToStoreLink,
-}
-
-impl std::default::Default for ThirdPartyLinksDeleteType {
-    fn default() -> ThirdPartyLinksDeleteType {
-        ThirdPartyLinksDeleteType::Undefined
-    }
-}
-
-impl std::fmt::Display for ThirdPartyLinksDeleteType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ThirdPartyLinksDeleteType::Undefined => write!(f, "undefined"),
-            ThirdPartyLinksDeleteType::LinkUnspecified => write!(f, "linkUnspecified"),
-            ThirdPartyLinksDeleteType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentThreadsListOrder {
-    Undefined,
-    ///
-    #[serde(rename = "orderUnspecified")]
-    OrderUnspecified,
-    /// Order by time.
-    #[serde(rename = "time")]
-    Time,
-    /// Order by relevance.
-    #[serde(rename = "relevance")]
-    Relevance,
-}
-
-impl std::default::Default for CommentThreadsListOrder {
-    fn default() -> CommentThreadsListOrder {
-        CommentThreadsListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentThreadsListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentThreadsListOrder::Undefined => write!(f, "undefined"),
-            CommentThreadsListOrder::OrderUnspecified => write!(f, "orderUnspecified"),
-            CommentThreadsListOrder::Time => write!(f, "time"),
-            CommentThreadsListOrder::Relevance => write!(f, "relevance"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum CommentThreadsListTextFormat {
     Undefined,
-    ///
     #[serde(rename = "textFormatUnspecified")]
     TextFormatUnspecified,
     /// Returns the comments in HTML format. This is the default value.
@@ -11018,7 +11215,6 @@
     /// The comment is awaiting review by a moderator.
     #[serde(rename = "heldForReview")]
     HeldForReview,
-    ///
     #[serde(rename = "likelySpam")]
     LikelySpam,
     /// The comment is unfit for display.
@@ -11046,712 +11242,31 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideosRateRating {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The entity is liked.
-    #[serde(rename = "like")]
-    Like,
-    /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for VideosRateRating {
-    fn default() -> VideosRateRating {
-        VideosRateRating::Undefined
-    }
-}
-
-impl std::fmt::Display for VideosRateRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideosRateRating::Undefined => write!(f, "undefined"),
-            VideosRateRating::None => write!(f, "none"),
-            VideosRateRating::Like => write!(f, "like"),
-            VideosRateRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideosListMyRating {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The entity is liked.
-    #[serde(rename = "like")]
-    Like,
-    /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for VideosListMyRating {
-    fn default() -> VideosListMyRating {
-        VideosListMyRating::Undefined
-    }
-}
-
-impl std::fmt::Display for VideosListMyRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideosListMyRating::Undefined => write!(f, "undefined"),
-            VideosListMyRating::None => write!(f, "none"),
-            VideosListMyRating::Like => write!(f, "like"),
-            VideosListMyRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideosListChart {
-    Undefined,
-    ///
-    #[serde(rename = "chartUnspecified")]
-    ChartUnspecified,
-    /// Return the most popular videos for the specified content region and video category.
-    #[serde(rename = "mostPopular")]
-    MostPopular,
-}
-
-impl std::default::Default for VideosListChart {
-    fn default() -> VideosListChart {
-        VideosListChart::Undefined
-    }
-}
-
-impl std::fmt::Display for VideosListChart {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideosListChart::Undefined => write!(f, "undefined"),
-            VideosListChart::ChartUnspecified => write!(f, "chartUnspecified"),
-            VideosListChart::MostPopular => write!(f, "mostPopular"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsListBroadcastStatus {
-    Undefined,
-    ///
-    #[serde(rename = "broadcastStatusFilterUnspecified")]
-    BroadcastStatusFilterUnspecified,
-    /// Return all broadcasts.
-    #[serde(rename = "all")]
-    All,
-    /// Return current live broadcasts.
-    #[serde(rename = "active")]
-    Active,
-    /// Return broadcasts that have not yet started.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// Return broadcasts that have already ended.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for LiveBroadcastsListBroadcastStatus {
-    fn default() -> LiveBroadcastsListBroadcastStatus {
-        LiveBroadcastsListBroadcastStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsListBroadcastStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsListBroadcastStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastsListBroadcastStatus::BroadcastStatusFilterUnspecified => {
-                write!(f, "broadcastStatusFilterUnspecified")
-            }
-            LiveBroadcastsListBroadcastStatus::All => write!(f, "all"),
-            LiveBroadcastsListBroadcastStatus::Active => write!(f, "active"),
-            LiveBroadcastsListBroadcastStatus::Upcoming => write!(f, "upcoming"),
-            LiveBroadcastsListBroadcastStatus::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsListBroadcastType {
-    Undefined,
-    ///
-    #[serde(rename = "broadcastTypeFilterUnspecified")]
-    BroadcastTypeFilterUnspecified,
-    /// Return all broadcasts.
-    #[serde(rename = "all")]
-    All,
-    /// Return only scheduled event broadcasts.
-    #[serde(rename = "event")]
-    Event,
-    /// Return only persistent broadcasts.
-    #[serde(rename = "persistent")]
-    Persistent,
-}
-
-impl std::default::Default for LiveBroadcastsListBroadcastType {
-    fn default() -> LiveBroadcastsListBroadcastType {
-        LiveBroadcastsListBroadcastType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsListBroadcastType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsListBroadcastType::Undefined => write!(f, "undefined"),
-            LiveBroadcastsListBroadcastType::BroadcastTypeFilterUnspecified => {
-                write!(f, "broadcastTypeFilterUnspecified")
-            }
-            LiveBroadcastsListBroadcastType::All => write!(f, "all"),
-            LiveBroadcastsListBroadcastType::Event => write!(f, "event"),
-            LiveBroadcastsListBroadcastType::Persistent => write!(f, "persistent"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsTransitionBroadcastStatus {
-    Undefined,
-    ///
-    #[serde(rename = "statusUnspecified")]
-    StatusUnspecified,
-    /// Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream. Note that you can only transition a broadcast to the testing state if its contentDetails.monitorStream.enableMonitorStream property is set to true.",
-    #[serde(rename = "testing")]
-    Testing,
-    /// Return only persistent broadcasts.
-    #[serde(rename = "live")]
-    Live,
-    /// The broadcast is over. YouTube stops transmitting video.
-    #[serde(rename = "complete")]
-    Complete,
-}
-
-impl std::default::Default for LiveBroadcastsTransitionBroadcastStatus {
-    fn default() -> LiveBroadcastsTransitionBroadcastStatus {
-        LiveBroadcastsTransitionBroadcastStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsTransitionBroadcastStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsTransitionBroadcastStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastsTransitionBroadcastStatus::StatusUnspecified => {
-                write!(f, "statusUnspecified")
-            }
-            LiveBroadcastsTransitionBroadcastStatus::Testing => write!(f, "testing"),
-            LiveBroadcastsTransitionBroadcastStatus::Live => write!(f, "live"),
-            LiveBroadcastsTransitionBroadcastStatus::Complete => write!(f, "complete"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SubscriptionsListOrder {
-    Undefined,
-    ///
-    #[serde(rename = "subscriptionOrderUnspecified")]
-    SubscriptionOrderUnspecified,
-    /// Sort by relevance.
-    #[serde(rename = "relevance")]
-    Relevance,
-    /// Sort by order of activity.
-    #[serde(rename = "unread")]
-    Unread,
-    /// Sort alphabetically.
-    #[serde(rename = "alphabetical")]
-    Alphabetical,
-}
-
-impl std::default::Default for SubscriptionsListOrder {
-    fn default() -> SubscriptionsListOrder {
-        SubscriptionsListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for SubscriptionsListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SubscriptionsListOrder::Undefined => write!(f, "undefined"),
-            SubscriptionsListOrder::SubscriptionOrderUnspecified => {
-                write!(f, "subscriptionOrderUnspecified")
-            }
-            SubscriptionsListOrder::Relevance => write!(f, "relevance"),
-            SubscriptionsListOrder::Unread => write!(f, "unread"),
-            SubscriptionsListOrder::Alphabetical => write!(f, "alphabetical"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListSafeSearch {
-    Undefined,
-    ///
-    #[serde(rename = "safeSearchSettingUnspecified")]
-    SafeSearchSettingUnspecified,
-    /// YouTube will not filter the search result set.
-    #[serde(rename = "none")]
-    None,
-    /// YouTube will filter some content from search results and, at the least, will filter content that is restricted in your locale. Based on their content, search results could be removed from search results or demoted in search results. This is the default parameter value.
-    #[serde(rename = "moderate")]
-    Moderate,
-    /// YouTube will try to exclude all restricted content from the search result set. Based on their content, search results could be removed from search results or demoted in search results.
-    #[serde(rename = "strict")]
-    Strict,
-}
-
-impl std::default::Default for SearchListSafeSearch {
-    fn default() -> SearchListSafeSearch {
-        SearchListSafeSearch::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListSafeSearch {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListSafeSearch::Undefined => write!(f, "undefined"),
-            SearchListSafeSearch::SafeSearchSettingUnspecified => {
-                write!(f, "safeSearchSettingUnspecified")
-            }
-            SearchListSafeSearch::None => write!(f, "none"),
-            SearchListSafeSearch::Moderate => write!(f, "moderate"),
-            SearchListSafeSearch::Strict => write!(f, "strict"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoLicense {
-    Undefined,
-    /// Return all videos, regardless of which license they have, that match the query parameters.
-    #[serde(rename = "any")]
-    Any,
-    /// Only return videos that have the standard YouTube license.
-    #[serde(rename = "youtube")]
-    Youtube,
-    /// Only return videos that have a Creative Commons license. Users can reuse videos with this license in other videos that they create. Learn more.
-    #[serde(rename = "creativeCommon")]
-    CreativeCommon,
-}
-
-impl std::default::Default for SearchListVideoLicense {
-    fn default() -> SearchListVideoLicense {
-        SearchListVideoLicense::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoLicense {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoLicense::Undefined => write!(f, "undefined"),
-            SearchListVideoLicense::Any => write!(f, "any"),
-            SearchListVideoLicense::Youtube => write!(f, "youtube"),
-            SearchListVideoLicense::CreativeCommon => write!(f, "creativeCommon"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListOrder {
-    Undefined,
-    ///
-    #[serde(rename = "searchSortUnspecified")]
-    SearchSortUnspecified,
-    /// Resources are sorted in reverse chronological order based on the date they were created.
-    #[serde(rename = "date")]
-    Date,
-    /// Resources are sorted from highest to lowest rating.
-    #[serde(rename = "rating")]
-    Rating,
-    /// Resources are sorted from highest to lowest number of views.
-    #[serde(rename = "viewCount")]
-    ViewCount,
-    /// Resources are sorted based on their relevance to the search query. This is the default value for this parameter.
+pub enum CommentThreadsListOrder {
+    Undefined,
+    #[serde(rename = "orderUnspecified")]
+    OrderUnspecified,
+    /// Order by time.
+    #[serde(rename = "time")]
+    Time,
+    /// Order by relevance.
     #[serde(rename = "relevance")]
     Relevance,
-    /// Resources are sorted alphabetically by title.
-    #[serde(rename = "title")]
-    Title,
-    /// Channels are sorted in descending order of their number of uploaded videos.
-    #[serde(rename = "videoCount")]
-    VideoCount,
-}
-
-impl std::default::Default for SearchListOrder {
-    fn default() -> SearchListOrder {
-        SearchListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListOrder::Undefined => write!(f, "undefined"),
-            SearchListOrder::SearchSortUnspecified => write!(f, "searchSortUnspecified"),
-            SearchListOrder::Date => write!(f, "date"),
-            SearchListOrder::Rating => write!(f, "rating"),
-            SearchListOrder::ViewCount => write!(f, "viewCount"),
-            SearchListOrder::Relevance => write!(f, "relevance"),
-            SearchListOrder::Title => write!(f, "title"),
-            SearchListOrder::VideoCount => write!(f, "videoCount"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListEventType {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for SearchListEventType {
-    fn default() -> SearchListEventType {
-        SearchListEventType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListEventType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListEventType::Undefined => write!(f, "undefined"),
-            SearchListEventType::None => write!(f, "none"),
-            SearchListEventType::Upcoming => write!(f, "upcoming"),
-            SearchListEventType::Live => write!(f, "live"),
-            SearchListEventType::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDefinition {
-    Undefined,
-    /// Return all videos, regardless of their resolution.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve videos in standard definition.
-    #[serde(rename = "standard")]
-    Standard,
-    /// Only retrieve HD videos.
-    #[serde(rename = "high")]
-    High,
-}
-
-impl std::default::Default for SearchListVideoDefinition {
-    fn default() -> SearchListVideoDefinition {
-        SearchListVideoDefinition::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDefinition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDefinition::Undefined => write!(f, "undefined"),
-            SearchListVideoDefinition::Any => write!(f, "any"),
-            SearchListVideoDefinition::Standard => write!(f, "standard"),
-            SearchListVideoDefinition::High => write!(f, "high"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoEmbeddable {
-    Undefined,
-    ///
-    #[serde(rename = "videoEmbeddableUnspecified")]
-    VideoEmbeddableUnspecified,
-    /// Return all videos, embeddable or not.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve embeddable videos.
-    #[serde(rename = "true")]
-    True,
-}
-
-impl std::default::Default for SearchListVideoEmbeddable {
-    fn default() -> SearchListVideoEmbeddable {
-        SearchListVideoEmbeddable::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoEmbeddable {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoEmbeddable::Undefined => write!(f, "undefined"),
-            SearchListVideoEmbeddable::VideoEmbeddableUnspecified => {
-                write!(f, "videoEmbeddableUnspecified")
-            }
-            SearchListVideoEmbeddable::Any => write!(f, "any"),
-            SearchListVideoEmbeddable::True => write!(f, "true"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoType {
-    Undefined,
-    ///
-    #[serde(rename = "videoTypeUnspecified")]
-    VideoTypeUnspecified,
-    /// Return all videos.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve movies.
-    #[serde(rename = "movie")]
-    Movie,
-    /// Only retrieve episodes of shows.
-    #[serde(rename = "episode")]
-    Episode,
-}
-
-impl std::default::Default for SearchListVideoType {
-    fn default() -> SearchListVideoType {
-        SearchListVideoType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoType::Undefined => write!(f, "undefined"),
-            SearchListVideoType::VideoTypeUnspecified => write!(f, "videoTypeUnspecified"),
-            SearchListVideoType::Any => write!(f, "any"),
-            SearchListVideoType::Movie => write!(f, "movie"),
-            SearchListVideoType::Episode => write!(f, "episode"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListChannelType {
-    Undefined,
-    ///
-    #[serde(rename = "channelTypeUnspecified")]
-    ChannelTypeUnspecified,
-    /// Return all channels.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve shows.
-    #[serde(rename = "show")]
-    Show,
-}
-
-impl std::default::Default for SearchListChannelType {
-    fn default() -> SearchListChannelType {
-        SearchListChannelType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListChannelType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListChannelType::Undefined => write!(f, "undefined"),
-            SearchListChannelType::ChannelTypeUnspecified => write!(f, "channelTypeUnspecified"),
-            SearchListChannelType::Any => write!(f, "any"),
-            SearchListChannelType::Show => write!(f, "show"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoCaption {
-    Undefined,
-    ///
-    #[serde(rename = "videoCaptionUnspecified")]
-    VideoCaptionUnspecified,
-    /// Do not filter results based on caption availability.
-    #[serde(rename = "any")]
-    Any,
-    /// Only include videos that have captions.
-    #[serde(rename = "closedCaption")]
-    ClosedCaption,
-    /// Only include videos that do not have captions.
-    #[serde(rename = "none")]
-    None,
-}
-
-impl std::default::Default for SearchListVideoCaption {
-    fn default() -> SearchListVideoCaption {
-        SearchListVideoCaption::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoCaption {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoCaption::Undefined => write!(f, "undefined"),
-            SearchListVideoCaption::VideoCaptionUnspecified => write!(f, "videoCaptionUnspecified"),
-            SearchListVideoCaption::Any => write!(f, "any"),
-            SearchListVideoCaption::ClosedCaption => write!(f, "closedCaption"),
-            SearchListVideoCaption::None => write!(f, "none"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDimension {
-    Undefined,
-    ///
-    #[serde(rename = "any")]
-    Any,
-    /// Restrict search results to exclude 3D videos.
-    #[serde(rename = "2d")]
-    _2d,
-    /// Restrict search results to only include 3D videos.
-    #[serde(rename = "3d")]
-    _3d,
-}
-
-impl std::default::Default for SearchListVideoDimension {
-    fn default() -> SearchListVideoDimension {
-        SearchListVideoDimension::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDimension {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDimension::Undefined => write!(f, "undefined"),
-            SearchListVideoDimension::Any => write!(f, "any"),
-            SearchListVideoDimension::_2d => write!(f, "2d"),
-            SearchListVideoDimension::_3d => write!(f, "3d"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDuration {
-    Undefined,
-    ///
-    #[serde(rename = "videoDurationUnspecified")]
-    VideoDurationUnspecified,
-    /// Do not filter video search results based on their duration. This is the default value.
-    #[serde(rename = "any")]
-    Any,
-    /// Only include videos that are less than four minutes long.
-    #[serde(rename = "short")]
-    Short,
-    /// Only include videos that are between four and 20 minutes long (inclusive).
-    #[serde(rename = "medium")]
-    Medium,
-    /// Only include videos longer than 20 minutes.
-    #[serde(rename = "long")]
-    Long,
-}
-
-impl std::default::Default for SearchListVideoDuration {
-    fn default() -> SearchListVideoDuration {
-        SearchListVideoDuration::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDuration {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDuration::Undefined => write!(f, "undefined"),
-            SearchListVideoDuration::VideoDurationUnspecified => {
-                write!(f, "videoDurationUnspecified")
-            }
-            SearchListVideoDuration::Any => write!(f, "any"),
-            SearchListVideoDuration::Short => write!(f, "short"),
-            SearchListVideoDuration::Medium => write!(f, "medium"),
-            SearchListVideoDuration::Long => write!(f, "long"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoSyndicated {
-    Undefined,
-    ///
-    #[serde(rename = "videoSyndicatedUnspecified")]
-    VideoSyndicatedUnspecified,
-    /// Return all videos, syndicated or not.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve syndicated videos.
-    #[serde(rename = "true")]
-    True,
-}
-
-impl std::default::Default for SearchListVideoSyndicated {
-    fn default() -> SearchListVideoSyndicated {
-        SearchListVideoSyndicated::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoSyndicated {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoSyndicated::Undefined => write!(f, "undefined"),
-            SearchListVideoSyndicated::VideoSyndicatedUnspecified => {
-                write!(f, "videoSyndicatedUnspecified")
-            }
-            SearchListVideoSyndicated::Any => write!(f, "any"),
-            SearchListVideoSyndicated::True => write!(f, "true"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum MembersListMode {
-    Undefined,
-    ///
-    #[serde(rename = "listMembersModeUnknown")]
-    ListMembersModeUnknown,
-    /// Return only members that joined after the first call with this mode was made.
-    #[serde(rename = "updates")]
-    Updates,
-    /// Return all current members, from newest to oldest.
-    #[serde(rename = "all_current")]
-    All_current,
-}
-
-impl std::default::Default for MembersListMode {
-    fn default() -> MembersListMode {
-        MembersListMode::Undefined
-    }
-}
-
-impl std::fmt::Display for MembersListMode {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            MembersListMode::Undefined => write!(f, "undefined"),
-            MembersListMode::ListMembersModeUnknown => write!(f, "listMembersModeUnknown"),
-            MembersListMode::Updates => write!(f, "updates"),
-            MembersListMode::All_current => write!(f, "all_current"),
+}
+
+impl std::default::Default for CommentThreadsListOrder {
+    fn default() -> CommentThreadsListOrder {
+        CommentThreadsListOrder::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentThreadsListOrder {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentThreadsListOrder::Undefined => write!(f, "undefined"),
+            CommentThreadsListOrder::OrderUnspecified => write!(f, "orderUnspecified"),
+            CommentThreadsListOrder::Time => write!(f, "time"),
+            CommentThreadsListOrder::Relevance => write!(f, "relevance"),
         };
         Ok(())
     }
@@ -11823,11 +11338,11 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the i18nLanguage resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
     #[serde(rename = "hl")]
     pub hl: Option<String>,
+    /// The *part* parameter specifies the i18nLanguage resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
 }
 
 impl std::fmt::Display for I18nLanguagesListParams {
@@ -11848,174 +11363,24 @@
     }
 }
 
-/// Parameters for the `videoCategories.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategoriesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// The *part* parameter specifies the videoCategory resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Returns the video categories with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-}
-
-impl std::fmt::Display for VideoCategoriesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channels.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Return the channel associated with a YouTube username.
-    #[serde(rename = "forUsername")]
-    pub for_username: Option<String>,
-    /// Return the channels subscribed to the authenticated user
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// Return the channels with the specified IDs.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Return the ids of channels owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set *part=contentDetails*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the channels managed by the authenticated user.
-    #[serde(rename = "managedByMe")]
-    pub managed_by_me: Option<bool>,
-    /// Return the channels within the specified guide category ID.
-    #[serde(rename = "categoryId")]
-    pub category_id: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-}
-
-impl std::fmt::Display for ChannelsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_username {
-            write!(
-                f,
-                "&forUsername={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_subscribers {
-            write!(
-                f,
-                "&mySubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.managed_by_me {
-            write!(
-                f,
-                "&managedByMe={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.category_id {
-            write!(
-                f,
-                "&categoryId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
+/// Parameters for the `membershipsLevels.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevelsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the membershipsLevel resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for MembershipsLevelsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
         Ok(())
     }
 }
@@ -12052,24 +11417,1053 @@
     }
 }
 
-/// Parameters for the `liveChatModerators.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatModeratorsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
+/// Parameters for the `channels.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Return the channels within the specified guide category ID.
+    #[serde(rename = "categoryId")]
+    pub category_id: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set *part=contentDetails*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return the ids of channels owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// Return the channels subscribed to the authenticated user
+    #[serde(rename = "mySubscribers")]
+    pub my_subscribers: Option<bool>,
+    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// Return the channels with the specified IDs.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Return the channel associated with a YouTube username.
+    #[serde(rename = "forUsername")]
+    pub for_username: Option<String>,
+    /// Return the channels managed by the authenticated user.
+    #[serde(rename = "managedByMe")]
+    pub managed_by_me: Option<bool>,
+}
+
+impl std::fmt::Display for ChannelsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.category_id {
+            write!(
+                f,
+                "&categoryId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_subscribers {
+            write!(
+                f,
+                "&mySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_username {
+            write!(
+                f,
+                "&forUsername={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.managed_by_me {
+            write!(
+                f,
+                "&managedByMe={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `superChatEvents.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEventsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the superChatEvent resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Return rendered funding amounts in specified language.
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+}
+
+impl std::fmt::Display for SuperChatEventsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `members.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembersListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Parameter that specifies which channel members to return.
+    #[serde(rename = "mode")]
+    pub mode: Option<MembersListMode>,
+    /// Filter members in the results set to the ones that have access to a level.
+    #[serde(rename = "hasAccessToLevel")]
+    pub has_access_to_level: Option<String>,
+    /// The *part* parameter specifies the member resource parts that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Comma separated list of channel IDs. Only data about members that are part of this list will be included in the response.
+    #[serde(rename = "filterByMemberChannelId")]
+    pub filter_by_member_channel_id: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+}
+
+impl std::fmt::Display for MembersListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.mode {
+            write!(
+                f,
+                "&mode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.has_access_to_level {
+            write!(
+                f,
+                "&hasAccessToLevel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.filter_by_member_channel_id {
+            write!(
+                f,
+                "&filterByMemberChannelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelBanners.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBannersInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// Unused, channel_id is currently derived from the security context of the requestor.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for ChannelBannersInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which identify the times portion of the video that should play when users watch the video in the playlist. If your request is updating a playlist item that sets these values, and the request's part parameter value includes the contentDetails part, the playlist item's start and end times will be updated to whatever value the request body specifies. If the request body does not specify values, the existing start and end times will be removed and replaced with the default settings.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistItemsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistItemsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistItemsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Return the playlist items within the given playlist.
+    #[serde(rename = "playlistId")]
+    pub playlist_id: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more playlistItem resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlistItem resource, the snippet property contains numerous fields, including the title, description, position, and resourceId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Return the playlist items associated with the given video ID.
+    #[serde(rename = "videoId")]
+    pub video_id: Option<String>,
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistItemsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.playlist_id {
+            write!(
+                f,
+                "&playlistId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_id {
+            write!(
+                f,
+                "&videoId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videoCategories.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategoriesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Returns the video categories with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// The *part* parameter specifies the videoCategory resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+}
+
+impl std::fmt::Display for VideoCategoriesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.reportAbuse` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosReportAbuseParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosReportAbuseParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting. In addition, not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Use a chart that is specific to the specified region
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    /// Return videos with the given ids.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return the player with maximum height specified in
+    #[serde(rename = "maxWidth")]
+    pub max_width: Option<i32>,
+    #[serde(rename = "locale")]
+    pub locale: Option<String>,
+    /// Return videos liked/disliked by the authenticated user. Does not support RateType.RATED_TYPE_NONE.
+    #[serde(rename = "myRating")]
+    pub my_rating: Option<VideosListMyRating>,
+    #[serde(rename = "maxHeight")]
+    pub max_height: Option<i32>,
+    /// Use chart that is specific to the specified video category
+    #[serde(rename = "videoCategoryId")]
+    pub video_category_id: Option<String>,
+    /// Return the videos that are in the specified chart.
+    #[serde(rename = "chart")]
+    pub chart: Option<VideosListChart>,
+    /// The *part* parameter specifies a comma-separated list of one or more video resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a video resource, the snippet property contains the channelId, title, description, tags, and categoryId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for VideosListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_width {
+            write!(
+                f,
+                "&maxWidth={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.locale {
+            write!(
+                f,
+                "&locale={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_rating {
+            write!(
+                f,
+                "&myRating={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_height {
+            write!(
+                f,
+                "&maxHeight={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_category_id {
+            write!(
+                f,
+                "&videoCategoryId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.chart {
+            write!(
+                f,
+                "&chart={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// Should stabilize be applied to the upload.
+    #[serde(rename = "stabilize")]
+    pub stabilize: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Should auto-levels be applied to the upload.
+    #[serde(rename = "autoLevels")]
+    pub auto_levels: Option<bool>,
+    /// Notify the channel subscribers about the new video. As default, the notification is enabled.
+    #[serde(rename = "notifySubscribers")]
+    pub notify_subscribers: Option<bool>,
+}
+
+impl std::fmt::Display for VideosInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.stabilize {
+            write!(
+                f,
+                "&stabilize={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.auto_levels {
+            write!(
+                f,
+                "&autoLevels={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.notify_subscribers {
+            write!(
+                f,
+                "&notifySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.getRating` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosGetRatingParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosGetRatingParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.rate` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosRateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "rating")]
+    pub rating: VideosRateRating,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for VideosRateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&rating={}",
+            percent_encode(format!("{}", self.rating).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelSections.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for ChannelSectionsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelSections.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for ChannelSectionsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelSections.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Return the ChannelSections owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// Return content in specified language
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more channelSection resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, and contentDetails. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channelSection resource, the snippet property contains other properties, such as a display title for the channelSection. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return the ChannelSections with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return the ChannelSections owned by the specified channel ID.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for ChannelSectionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelSections.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for ChannelSectionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         Ok(())
     }
 }
@@ -12101,18 +12495,18 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
     /// The id of the live chat for which moderators should be returned.
     #[serde(rename = "liveChatId")]
     pub live_chat_id: String,
+    /// The *part* parameter specifies the liveChatModerator resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
     /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The *part* parameter specifies the liveChatModerator resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
 }
 
 impl std::fmt::Display for LiveChatModeratorsListParams {
@@ -12131,13 +12525,6 @@
             "&part={}",
             percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -12145,36 +12532,80 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// Parameters for the `superChatEvents.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the superChatEvent resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatModerators.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveChatModeratorsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatMessages.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-    /// Return rendered funding amounts in specified language.
+    /// The *part* parameter specifies the liveChatComment resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The id of the live chat for which comments should be returned.
+    #[serde(rename = "liveChatId")]
+    pub live_chat_id: String,
+    /// Specifies the localization language in which the system messages should be returned.
     #[serde(rename = "hl")]
     pub hl: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    /// Specifies the size of the profile image that should be returned for each user.
+    #[serde(rename = "profileImageSize")]
+    pub profile_image_size: Option<u32>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken property identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
 }
 
-impl std::fmt::Display for SuperChatEventsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+impl std::fmt::Display for LiveChatMessagesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&liveChatId={}",
+            percent_encode(
+                format!("{}", self.live_chat_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
         )?;
         if let Some(ref v) = self.max_results {
             write!(
@@ -12190,6 +12621,13 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.profile_image_size {
+            write!(
+                f,
+                "&profileImageSize={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.page_token {
             write!(
                 f,
@@ -12201,55 +12639,573 @@
     }
 }
 
-/// Parameters for the `comments.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsListParams {
+/// Parameters for the `liveChatMessages.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for LiveChatMessagesDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatMessages.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes. It identifies the properties that the write operation will set as well as the properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveChatMessagesInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `abuseReports.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseReportsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for AbuseReportsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `search.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Filter on syndicated videos.
+    #[serde(rename = "videoSyndicated")]
+    pub video_syndicated: Option<SearchListVideoSyndicated>,
+    /// Add a filter on the channel search.
+    #[serde(rename = "channelType")]
+    pub channel_type: Option<SearchListChannelType>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Filter on 3d videos.
+    #[serde(rename = "videoDimension")]
+    pub video_dimension: Option<SearchListVideoDimension>,
+    /// Restrict results to a particular topic.
+    #[serde(rename = "topicId")]
+    pub topic_id: Option<String>,
+    /// Filter on the duration of the videos.
+    #[serde(rename = "videoDuration")]
+    pub video_duration: Option<SearchListVideoDuration>,
+    /// Search for the private videos of the authenticated user.
+    #[serde(rename = "forMine")]
+    pub for_mine: Option<bool>,
+    /// Sort order of the results.
+    #[serde(rename = "order")]
+    pub order: Option<SearchListOrder>,
+    /// Filter on the license of the videos.
+    #[serde(rename = "videoLicense")]
+    pub video_license: Option<SearchListVideoLicense>,
+    /// Return results relevant to this language.
+    #[serde(rename = "relevanceLanguage")]
+    pub relevance_language: Option<String>,
+    /// Display the content as seen by viewers in this country.
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    /// Search owned by a content owner.
+    #[serde(rename = "forContentOwner")]
+    pub for_content_owner: Option<bool>,
+    /// The *part* parameter specifies a comma-separated list of one or more search resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Filter on videos in a specific category.
+    #[serde(rename = "videoCategoryId")]
+    pub video_category_id: Option<String>,
+    /// Restrict results to a particular set of resource types from One Platform.
+    #[serde(rename = "type")]
+    pub type_: Option<String>,
+    /// Search related to a resource.
+    #[serde(rename = "relatedToVideoId")]
+    pub related_to_video_id: Option<String>,
+    /// Filter on distance from the location (specified above).
+    #[serde(rename = "locationRadius")]
+    pub location_radius: Option<String>,
+    /// Indicates whether the search results should include restricted content as well as standard content.
+    #[serde(rename = "safeSearch")]
+    pub safe_search: Option<SearchListSafeSearch>,
+    /// Filter on resources belonging to this channelId.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Filter on resources published before this date.
+    #[serde(rename = "publishedBefore")]
+    pub published_before: Option<String>,
+    /// Filter on videos of a specific type.
+    #[serde(rename = "videoType")]
+    pub video_type: Option<SearchListVideoType>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Restrict the search to only retrieve videos uploaded using the project id of the authenticated user.
+    #[serde(rename = "forDeveloper")]
+    pub for_developer: Option<bool>,
+    /// Filter on embeddable videos.
+    #[serde(rename = "videoEmbeddable")]
+    pub video_embeddable: Option<SearchListVideoEmbeddable>,
+    /// Filter on the definition of the videos.
+    #[serde(rename = "videoDefinition")]
+    pub video_definition: Option<SearchListVideoDefinition>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Filter on location of the video
+    #[serde(rename = "location")]
+    pub location: Option<String>,
+    /// Filter on the presence of captions on the videos.
+    #[serde(rename = "videoCaption")]
+    pub video_caption: Option<SearchListVideoCaption>,
+    /// Textual search terms to match.
+    #[serde(rename = "q")]
+    pub q: Option<String>,
+    /// Filter on the livestream status of the videos.
+    #[serde(rename = "eventType")]
+    pub event_type: Option<SearchListEventType>,
+    /// Filter on resources published after this date.
+    #[serde(rename = "publishedAfter")]
+    pub published_after: Option<String>,
+}
+
+impl std::fmt::Display for SearchListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.video_syndicated {
+            write!(
+                f,
+                "&videoSyndicated={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_type {
+            write!(
+                f,
+                "&channelType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_dimension {
+            write!(
+                f,
+                "&videoDimension={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.topic_id {
+            write!(
+                f,
+                "&topicId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_duration {
+            write!(
+                f,
+                "&videoDuration={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_mine {
+            write!(
+                f,
+                "&forMine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_license {
+            write!(
+                f,
+                "&videoLicense={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.relevance_language {
+            write!(
+                f,
+                "&relevanceLanguage={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_content_owner {
+            write!(
+                f,
+                "&forContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_category_id {
+            write!(
+                f,
+                "&videoCategoryId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.type_ {
+            write!(
+                f,
+                "&type={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.related_to_video_id {
+            write!(
+                f,
+                "&relatedToVideoId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.location_radius {
+            write!(
+                f,
+                "&locationRadius={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.safe_search {
+            write!(
+                f,
+                "&safeSearch={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_before {
+            write!(
+                f,
+                "&publishedBefore={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_type {
+            write!(
+                f,
+                "&videoType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_developer {
+            write!(
+                f,
+                "&forDeveloper={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_embeddable {
+            write!(
+                f,
+                "&videoEmbeddable={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_definition {
+            write!(
+                f,
+                "&videoDefinition={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.location {
+            write!(
+                f,
+                "&location={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_caption {
+            write!(
+                f,
+                "&videoCaption={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.q {
+            write!(
+                f,
+                "&q={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.event_type {
+            write!(
+                f,
+                "&eventType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_after {
+            write!(
+                f,
+                "&publishedAfter={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `tests.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for TestsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Delete the partner links with the given linking token.
+    #[serde(rename = "linkingToken")]
+    pub linking_token: String,
+    /// Type of the link to be deleted.
+    #[serde(rename = "type")]
+    pub type_: ThirdPartyLinksDeleteType,
+    /// Do not use. Required for compatibility.
+    #[serde(rename = "part")]
+    pub part: Option<String>,
+}
+
+impl std::fmt::Display for ThirdPartyLinksDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&linkingToken={}",
+            percent_encode(
+                format!("{}", self.linking_token).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        write!(
+            f,
+            "&type={}",
+            percent_encode(format!("{}", self.type_).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.part {
+            write!(
+                f,
+                "&part={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ThirdPartyLinksInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Get a third party link with the given linking token.
+    #[serde(rename = "linkingToken")]
+    pub linking_token: Option<String>,
+    /// The *part* parameter specifies the thirdPartyLink resource parts that the API response will include. Supported values are linkingToken, status, and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Get a third party link of the given type.
+    #[serde(rename = "type")]
+    pub type_: Option<ThirdPartyLinksListType>,
+}
+
+impl std::fmt::Display for ThirdPartyLinksListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.linking_token {
+            write!(
+                f,
+                "&linkingToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.type_ {
+            write!(
+                f,
+                "&type={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ThirdPartyLinksUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsListParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-    /// Returns the comments with the given IDs for One Platform.
+    /// Return LiveStreams with the given ids from Stubby or Apiary.
     #[serde(rename = "id")]
     pub id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more comment resource properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Returns replies to the specified comment. Note, currently YouTube features only one level of replies (ie replies to top level comments). However replies to replies may be supported in the future.
-    #[serde(rename = "parentId")]
-    pub parent_id: Option<String>,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: Option<CommentsListTextFormat>,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
     /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
-}
-
-impl std::fmt::Display for CommentsListParams {
+    /// The *part* parameter specifies a comma-separated list of one or more liveStream resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, cdn, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for LiveStreamsListParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -12270,17 +13226,443 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.parent_id {
-            write!(
-                f,
-                "&parentId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.text_format {
-            write!(
-                f,
-                "&textFormat={}",
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. If the request body does not specify a value for a mutable property, the existing value for that property will be removed.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for LiveStreamsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for LiveStreamsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, content_details, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for LiveStreamsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `activities.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivitiesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "home")]
+    pub home: Option<bool>,
+    #[serde(rename = "publishedBefore")]
+    pub published_before: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more activity resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in an activity resource, the snippet property contains other properties that identify the type of activity, a display title for the activity, and so forth. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    #[serde(rename = "publishedAfter")]
+    pub published_after: Option<String>,
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+}
+
+impl std::fmt::Display for ActivitiesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.home {
+            write!(
+                f,
+                "&home={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_before {
+            write!(
+                f,
+                "&publishedBefore={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_after {
+            write!(
+                f,
+                "&publishedAfter={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// Broadcast to delete.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for LiveBroadcastsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.transition` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsTransitionParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The status to which the broadcast is going to transition.
+    #[serde(rename = "broadcastStatus")]
+    pub broadcast_status: LiveBroadcastsTransitionBroadcastStatus,
+    /// Broadcast to transition.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveBroadcastsTransitionParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&broadcastStatus={}",
+            percent_encode(
+                format!("{}", self.broadcast_status).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Return broadcasts with the given ids from Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return only broadcasts with the selected type.
+    #[serde(rename = "broadcastType")]
+    pub broadcast_type: Option<LiveBroadcastsListBroadcastType>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, status and statistics.
+    #[serde(rename = "part")]
+    pub part: String,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Return broadcasts with a certain status, e.g. active broadcasts.
+    #[serde(rename = "broadcastStatus")]
+    pub broadcast_status: Option<LiveBroadcastsListBroadcastStatus>,
+}
+
+impl std::fmt::Display for LiveBroadcastsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.broadcast_type {
+            write!(
+                f,
+                "&broadcastType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -12291,6 +13673,667 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.broadcast_status {
+            write!(
+                f,
+                "&broadcastStatus={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.bind` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsBindParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Broadcast to bind to the stream
+    #[serde(rename = "id")]
+    pub id: String,
+    /// Stream to bind, if not set unbind the current one.
+    #[serde(rename = "streamId")]
+    pub stream_id: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveBroadcastsBindParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.stream_id {
+            write!(
+                f,
+                "&streamId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for LiveBroadcastsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a broadcast's privacy status is defined in the status part. As such, if your request is updating a private or unlisted broadcast, and the request's part parameter value includes the status part, the broadcast's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the broadcast will revert to the default privacy setting.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for LiveBroadcastsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
+    #[serde(rename = "sync")]
+    pub sync: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// ID of the Google+ Page for the channel that the request is on behalf of.
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.sync {
+            write!(
+                f,
+                "&sync={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the caption resource parts that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
+    #[serde(rename = "sync")]
+    pub sync: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.sync {
+            write!(
+                f,
+                "&sync={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.download` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsDownloadParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+    /// The ID of the caption track to download, required for One Platform.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// Convert the captions into this format. Supported options are sbv, srt, and vtt.
+    #[serde(rename = "tfmt")]
+    pub tfmt: Option<String>,
+    /// tlang is the language code; machine translate the captions into this language.
+    #[serde(rename = "tlang")]
+    pub tlang: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsDownloadParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.tfmt {
+            write!(
+                f,
+                "&tfmt={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.tlang {
+            write!(
+                f,
+                "&tlang={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Returns the captions for the specified video.
+    #[serde(rename = "videoId")]
+    pub video_id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// ID of the Google+ Page for the channel that the request is on behalf of.
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+    /// Returns the captions with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&videoId={}",
+            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `i18nRegions.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the i18nRegion resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+}
+
+impl std::fmt::Display for I18nRegionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `subscriptions.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for SubscriptionsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `subscriptions.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Return the subscriptions of the given channel owner.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// The order of the returned subscriptions
+    #[serde(rename = "order")]
+    pub order: Option<SubscriptionsListOrder>,
+    /// Return the subscribers of the given channel owner.
+    #[serde(rename = "mySubscribers")]
+    pub my_subscribers: Option<bool>,
+    /// The *part* parameter specifies a comma-separated list of one or more subscription resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a subscription resource, the snippet property contains other properties, such as a display title for the subscription. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    #[serde(rename = "myRecentSubscribers")]
+    pub my_recent_subscribers: Option<bool>,
+    /// Return the subscriptions with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Return the subscriptions to the subset of these channels that the authenticated user is subscribed to.
+    #[serde(rename = "forChannelId")]
+    pub for_channel_id: Option<String>,
+    /// Flag for returning the subscriptions of the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for SubscriptionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_subscribers {
+            write!(
+                f,
+                "&mySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_recent_subscribers {
+            write!(
+                f,
+                "&myRecentSubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_channel_id {
+            write!(
+                f,
+                "&forChannelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `subscriptions.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for SubscriptionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatBans.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBansDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for LiveChatBansDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatBans.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBansInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveChatBansInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
         Ok(())
     }
 }
@@ -12348,12 +14391,12 @@
     /// Modifies the moderation status of the comments with the given IDs
     #[serde(rename = "id")]
     pub id: String,
+    /// Specifies the requested moderation status. Note, comments can be in statuses, which are not available through this call. For example, this call does not allow to mark a comment as 'likely spam'. Valid values: MODERATION_STATUS_PUBLISHED, MODERATION_STATUS_HELD_FOR_REVIEW, MODERATION_STATUS_REJECTED.
+    #[serde(rename = "moderationStatus")]
+    pub moderation_status: CommentsSetModerationStatusModerationStatus,
     /// If set to true the author of the comment gets added to the ban list. This means all future comments of the author will autmomatically be rejected. Only valid in combination with STATUS_REJECTED.
     #[serde(rename = "banAuthor")]
     pub ban_author: Option<bool>,
-    /// Specifies the requested moderation status. Note, comments can be in statuses, which are not available through this call. For example, this call does not allow to mark a comment as 'likely spam'. Valid values: MODERATION_STATUS_PUBLISHED, MODERATION_STATUS_HELD_FOR_REVIEW, MODERATION_STATUS_REJECTED.
-    #[serde(rename = "moderationStatus")]
-    pub moderation_status: CommentsSetModerationStatusModerationStatus,
 }
 
 impl std::fmt::Display for CommentsSetModerationStatusParams {
@@ -12383,6 +14426,28 @@
     }
 }
 
+/// Parameters for the `comments.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
 /// Parameters for the `comments.delete` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CommentsDeleteParams {
@@ -12404,206 +14469,39 @@
     }
 }
 
-/// Parameters for the `thirdPartyLinks.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for ThirdPartyLinksUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `thirdPartyLinks.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for ThirdPartyLinksInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `thirdPartyLinks.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Get a third party link with the given linking token.
-    #[serde(rename = "linkingToken")]
-    pub linking_token: Option<String>,
-    /// The *part* parameter specifies the thirdPartyLink resource parts that the API response will include. Supported values are linkingToken, status, and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Get a third party link of the given type.
-    #[serde(rename = "type")]
-    pub typ: Option<ThirdPartyLinksListType>,
-}
-
-impl std::fmt::Display for ThirdPartyLinksListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.linking_token {
-            write!(
-                f,
-                "&linkingToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.typ {
-            write!(
-                f,
-                "&type={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `thirdPartyLinks.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Type of the link to be deleted.
-    #[serde(rename = "type")]
-    pub typ: ThirdPartyLinksDeleteType,
-    /// Delete the partner links with the given linking token.
-    #[serde(rename = "linkingToken")]
-    pub linking_token: String,
-    /// Do not use. Required for compatibility.
-    #[serde(rename = "part")]
-    pub part: Option<String>,
-}
-
-impl std::fmt::Display for ThirdPartyLinksDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&type={}",
-            percent_encode(format!("{}", self.typ).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&linkingToken={}",
-            percent_encode(
-                format!("{}", self.linking_token).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        if let Some(ref v) = self.part {
-            write!(
-                f,
-                "&part={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveChatMessagesDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the liveChatComment resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The id of the live chat for which comments should be returned.
-    #[serde(rename = "liveChatId")]
-    pub live_chat_id: String,
-    /// Specifies the size of the profile image that should be returned for each user.
-    #[serde(rename = "profileImageSize")]
-    pub profile_image_size: Option<u32>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken property identify other pages that could be retrieved.
+/// Parameters for the `comments.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
-    /// Specifies the localization language in which the system messages should be returned.
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
+    /// Returns replies to the specified comment. Note, currently YouTube features only one level of replies (ie replies to top level comments). However replies to replies may be supported in the future.
+    #[serde(rename = "parentId")]
+    pub parent_id: Option<String>,
+    /// The requested text format for the returned comments.
+    #[serde(rename = "textFormat")]
+    pub text_format: Option<CommentsListTextFormat>,
+    /// Returns the comments with the given IDs for One Platform.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-}
-
-impl std::fmt::Display for LiveChatMessagesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&liveChatId={}",
-            percent_encode(
-                format!("{}", self.live_chat_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        if let Some(ref v) = self.profile_image_size {
-            write!(
-                f,
-                "&profileImageSize={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
+    /// The *part* parameter specifies a comma-separated list of one or more comment resource properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
         if let Some(ref v) = self.page_token {
             write!(
                 f,
@@ -12611,140 +14509,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes. It identifies the properties that the write operation will set as well as the properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatMessagesInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentThreadsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies a comma-separated list of one or more commentThread resource properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "order")]
-    pub order: Option<CommentThreadsListOrder>,
-    /// Returns the comment threads with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Limits the returned comment threads to those matching the specified key words. Not compatible with the 'id' filter.
-    #[serde(rename = "searchTerms")]
-    pub search_terms: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: Option<CommentThreadsListTextFormat>,
-    /// Limits the returned comment threads to those with the specified moderation status. Not compatible with the 'id' filter. Valid values: published, heldForReview, likelySpam.
-    #[serde(rename = "moderationStatus")]
-    pub moderation_status: Option<CommentThreadsListModerationStatus>,
-    /// Returns the comment threads of the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: Option<String>,
-    /// Returns the comment threads for all the channel comments (ie does not include comments left on videos).
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Returns the comment threads of all videos of the channel and the channel comments as well.
-    #[serde(rename = "allThreadsRelatedToChannelId")]
-    pub all_threads_related_to_channel_id: Option<String>,
-}
-
-impl std::fmt::Display for CommentThreadsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.search_terms {
-            write!(
-                f,
-                "&searchTerms={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
+        if let Some(ref v) = self.parent_id {
+            write!(
+                f,
+                "&parentId={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -12755,173 +14523,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.moderation_status {
-            write!(
-                f,
-                "&moderationStatus={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_id {
-            write!(
-                f,
-                "&videoId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.all_threads_related_to_channel_id {
-            write!(
-                f,
-                "&allThreadsRelatedToChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies a comma-separated list of commentThread resource properties that the API response will include. You must at least include the snippet part in the parameter value since that part contains all of the properties that the API request can update.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentThreadsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for ChannelSectionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for ChannelSectionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return the ChannelSections with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Return content in specified language
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// Return the ChannelSections owned by the specified channel ID.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more channelSection resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, and contentDetails. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channelSection resource, the snippet property contains other properties, such as a display title for the channelSection. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the ChannelSections owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for ChannelSectionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
         if let Some(ref v) = self.id {
             write!(
                 f,
@@ -12929,265 +14530,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for ChannelSectionsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveStreams.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. If the request body does not specify a value for a mutable property, the existing value for that property will be removed.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveStreamsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveStreams.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, content_details, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for LiveStreamsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveStreams.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for LiveStreamsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveStreams.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveStream resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, cdn, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Return LiveStreams with the given ids from Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-}
-
-impl std::fmt::Display for LiveStreamsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -13199,383 +14541,26 @@
     }
 }
 
-/// Parameters for the `videos.getRating` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosGetRatingParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosGetRatingParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Should stabilize be applied to the upload.
-    #[serde(rename = "stabilize")]
-    pub stabilize: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Should auto-levels be applied to the upload.
-    #[serde(rename = "autoLevels")]
-    pub auto_levels: Option<bool>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Notify the channel subscribers about the new video. As default, the notification is enabled.
-    #[serde(rename = "notifySubscribers")]
-    pub notify_subscribers: Option<bool>,
-}
-
-impl std::fmt::Display for VideosInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.stabilize {
-            write!(
-                f,
-                "&stabilize={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.auto_levels {
-            write!(
-                f,
-                "&autoLevels={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.notify_subscribers {
-            write!(
-                f,
-                "&notifySubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosUpdateParams {
+/// Parameters for the `thumbnails.set` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailsSetParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
     /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting. In addition, not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for VideosUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.rate` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosRateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "rating")]
-    pub rating: VideosRateRating,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for VideosRateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&rating={}",
-            percent_encode(format!("{}", self.rating).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Use a chart that is specific to the specified region
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Return the player with maximum height specified in
-    #[serde(rename = "maxWidth")]
-    pub max_width: Option<i32>,
-    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more video resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a video resource, the snippet property contains the channelId, title, description, tags, and categoryId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "locale")]
-    pub locale: Option<String>,
-    #[serde(rename = "maxHeight")]
-    pub max_height: Option<i32>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Return videos liked/disliked by the authenticated user. Does not support RateType.RATED_TYPE_NONE.
-    #[serde(rename = "myRating")]
-    pub my_rating: Option<VideosListMyRating>,
-    /// Return the videos that are in the specified chart.
-    #[serde(rename = "chart")]
-    pub chart: Option<VideosListChart>,
-    /// Return videos with the given ids.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Use chart that is specific to the specified video category
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_width {
-            write!(
-                f,
-                "&maxWidth={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.locale {
-            write!(
-                f,
-                "&locale={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_height {
-            write!(
-                f,
-                "&maxHeight={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_rating {
-            write!(
-                f,
-                "&myRating={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.chart {
-            write!(
-                f,
-                "&chart={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_category_id {
-            write!(
-                f,
-                "&videoCategoryId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.reportAbuse` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosReportAbuseParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosReportAbuseParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `watermarks.unset` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct WatermarksUnsetParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "channelId")]
-    pub channel_id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for WatermarksUnsetParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&channelId={}",
-            percent_encode(format!("{}", self.channel_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+    /// Returns the Thumbnail with the given video IDs for Stubby or Apiary.
+    #[serde(rename = "videoId")]
+    pub video_id: String,
+}
+
+impl std::fmt::Display for ThumbnailsSetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&videoId={}",
+            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
         if let Some(ref v) = self.on_behalf_of_content_owner {
             write!(
@@ -13619,39 +14604,26 @@
     }
 }
 
-/// Parameters for the `channelBanners.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelBannersInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Unused, channel_id is currently derived from the security context of the requestor.
+/// Parameters for the `watermarks.unset` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct WatermarksUnsetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
     #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    pub channel_id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
 }
 
-impl std::fmt::Display for ChannelBannersInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
+impl std::fmt::Display for WatermarksUnsetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&channelId={}",
+            percent_encode(format!("{}", self.channel_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
         if let Some(ref v) = self.on_behalf_of_content_owner {
             write!(
                 f,
@@ -13663,125 +14635,24 @@
     }
 }
 
-/// Parameters for the `liveBroadcasts.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return broadcasts with a certain status, e.g. active broadcasts.
-    #[serde(rename = "broadcastStatus")]
-    pub broadcast_status: Option<LiveBroadcastsListBroadcastStatus>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, status and statistics.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return broadcasts with the given ids from Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Return only broadcasts with the selected type.
-    #[serde(rename = "broadcastType")]
-    pub broadcast_type: Option<LiveBroadcastsListBroadcastType>,
-}
-
-impl std::fmt::Display for LiveBroadcastsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.broadcast_status {
-            write!(
-                f,
-                "&broadcastStatus={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.broadcast_type {
-            write!(
-                f,
-                "&broadcastType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsUpdateParams {
+/// Parameters for the `playlists.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsInsertParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
     /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a broadcast's privacy status is defined in the status part. As such, if your request is updating a private or unlisted broadcast, and the request's part parameter value includes the status part, the broadcast's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the broadcast will revert to the default privacy setting.
-    #[serde(rename = "part")]
-    pub part: String,
     /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
     #[serde(rename = "onBehalfOfContentOwnerChannel")]
     pub on_behalf_of_content_owner_channel: Option<String>,
-}
-
-impl std::fmt::Display for LiveBroadcastsUpdateParams {
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for PlaylistsInsertParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -13806,285 +14677,42 @@
     }
 }
 
-/// Parameters for the `liveBroadcasts.transition` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsTransitionParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
+/// Parameters for the `playlists.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies a comma-separated list of one or more playlist resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlist resource, the snippet property contains properties like author, title, description, tags, and timeCreated. As such, if you set *part=snippet*, the API response will contain all of those properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return the playlists owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// Return the playlists owned by the specified channel ID.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Return the playlists with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Returen content in specified language
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
     /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The status to which the broadcast is going to transition.
-    #[serde(rename = "broadcastStatus")]
-    pub broadcast_status: LiveBroadcastsTransitionBroadcastStatus,
-    /// Broadcast to transition.
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsTransitionParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&broadcastStatus={}",
-            percent_encode(
-                format!("{}", self.broadcast_status).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.bind` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsBindParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Stream to bind, if not set unbind the current one.
-    #[serde(rename = "streamId")]
-    pub stream_id: Option<String>,
-    /// Broadcast to bind to the stream
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsBindParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.stream_id {
-            write!(
-                f,
-                "&streamId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
     /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
     #[serde(rename = "onBehalfOfContentOwnerChannel")]
     pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Broadcast to delete.
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatBans.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBansDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveChatBansDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatBans.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBansInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatBansInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `activities.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivitiesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The *part* parameter specifies a comma-separated list of one or more activity resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in an activity resource, the snippet property contains other properties that identify the type of activity, a display title for the activity, and so forth. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "publishedBefore")]
-    pub published_before: Option<String>,
-    #[serde(rename = "home")]
-    pub home: Option<bool>,
-    #[serde(rename = "publishedAfter")]
-    pub published_after: Option<String>,
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-}
-
-impl std::fmt::Display for ActivitiesListParams {
+}
+
+impl std::fmt::Display for PlaylistsListParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -14098,13 +14726,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.channel_id {
             write!(
                 f,
@@ -14112,34 +14733,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.published_before {
-            write!(
-                f,
-                "&publishedBefore={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.home {
-            write!(
-                f,
-                "&home={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_after {
-            write!(
-                f,
-                "&publishedAfter={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.page_token {
             write!(
                 f,
@@ -14147,63 +14740,20 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// Parameters for the `thumbnails.set` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThumbnailsSetParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Returns the Thumbnail with the given video IDs for Stubby or Apiary.
-    #[serde(rename = "videoId")]
-    pub video_id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for ThumbnailsSetParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&videoId={}",
-            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlistItems.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistItemsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.on_behalf_of_content_owner {
             write!(
                 f,
@@ -14211,83 +14761,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlistItems.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistItemsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlistItems.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return the playlist items within the given playlist.
-    #[serde(rename = "playlistId")]
-    pub playlist_id: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more playlistItem resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlistItem resource, the snippet property contains numerous fields, including the title, description, position, and resourceId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Return the playlist items associated with the given video ID.
-    #[serde(rename = "videoId")]
-    pub video_id: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistItemsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.playlist_id {
-            write!(
-                f,
-                "&playlistId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -14295,45 +14768,24 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_id {
-            write!(
-                f,
-                "&videoId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlistItems.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which identify the times portion of the video that should play when users watch the video in the playlist. If your request is updating a playlist item that sets these values, and the request's part parameter value includes the contentDetails part, the playlist item's start and end times will be updated to whatever value the request body specifies. If the request body does not specify values, the existing start and end times will be removed and replaced with the default settings.
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlists.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for mutable properties that are contained in any parts that the request body specifies. For example, a playlist's description is contained in the snippet part, which must be included in the request body. If the request does not specify a value for the snippet.description property, the playlist's existing description will be deleted.
     #[serde(rename = "part")]
     pub part: String,
     /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
@@ -14341,7 +14793,7 @@
     pub on_behalf_of_content_owner: Option<String>,
 }
 
-impl std::fmt::Display for PlaylistItemsUpdateParams {
+impl std::fmt::Display for PlaylistsUpdateParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -14365,11 +14817,11 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
     /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
+    #[serde(rename = "id")]
+    pub id: String,
 }
 
 impl std::fmt::Display for PlaylistsDeleteParams {
@@ -14390,1036 +14842,6 @@
     }
 }
 
-/// Parameters for the `playlists.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Return the playlists with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Returen content in specified language
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more playlist resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlist resource, the snippet property contains properties like author, title, description, tags, and timeCreated. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the playlists owned by the specified channel ID.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Return the playlists owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-}
-
-impl std::fmt::Display for PlaylistsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlists.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlists.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for mutable properties that are contained in any parts that the request body specifies. For example, a playlist's description is contained in the snippet part, which must be included in the request body. If the request does not specify a value for the snippet.description property, the playlist's existing description will be deleted.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for PlaylistsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for SubscriptionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for SubscriptionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return the subscriptions to the subset of these channels that the authenticated user is subscribed to.
-    #[serde(rename = "forChannelId")]
-    pub for_channel_id: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more subscription resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a subscription resource, the snippet property contains other properties, such as a display title for the subscription. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "myRecentSubscribers")]
-    pub my_recent_subscribers: Option<bool>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The order of the returned subscriptions
-    #[serde(rename = "order")]
-    pub order: Option<SubscriptionsListOrder>,
-    /// Return the subscriptions of the given channel owner.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Flag for returning the subscriptions of the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return the subscribers of the given channel owner.
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// Return the subscriptions with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-}
-
-impl std::fmt::Display for SubscriptionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.for_channel_id {
-            write!(
-                f,
-                "&forChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_recent_subscribers {
-            write!(
-                f,
-                "&myRecentSubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_subscribers {
-            write!(
-                f,
-                "&mySubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CaptionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync {
-            write!(
-                f,
-                "&sync={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Returns the captions with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Returns the captions for the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&videoId={}",
-            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.download` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsDownloadParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// tlang is the language code; machine translate the captions into this language.
-    #[serde(rename = "tlang")]
-    pub tlang: Option<String>,
-    /// Convert the captions into this format. Supported options are sbv, srt, and vtt.
-    #[serde(rename = "tfmt")]
-    pub tfmt: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The ID of the caption track to download, required for One Platform.
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CaptionsDownloadParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.tlang {
-            write!(
-                f,
-                "&tlang={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.tfmt {
-            write!(
-                f,
-                "&tfmt={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-    /// The *part* parameter specifies the caption resource parts that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CaptionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync {
-            write!(
-                f,
-                "&sync={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `i18nRegions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the i18nRegion resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-}
-
-impl std::fmt::Display for I18nRegionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `tests.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for TestsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `search.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies a comma-separated list of one or more search resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Restrict results to a particular topic.
-    #[serde(rename = "topicId")]
-    pub topic_id: Option<String>,
-    /// Indicates whether the search results should include restricted content as well as standard content.
-    #[serde(rename = "safeSearch")]
-    pub safe_search: Option<SearchListSafeSearch>,
-    /// Return results relevant to this language.
-    #[serde(rename = "relevanceLanguage")]
-    pub relevance_language: Option<String>,
-    /// Search owned by a content owner.
-    #[serde(rename = "forContentOwner")]
-    pub for_content_owner: Option<bool>,
-    /// Filter on resources published after this date.
-    #[serde(rename = "publishedAfter")]
-    pub published_after: Option<String>,
-    /// Restrict the search to only retrieve videos uploaded using the project id of the authenticated user.
-    #[serde(rename = "forDeveloper")]
-    pub for_developer: Option<bool>,
-    /// Filter on distance from the location (specified above).
-    #[serde(rename = "locationRadius")]
-    pub location_radius: Option<String>,
-    /// Filter on the license of the videos.
-    #[serde(rename = "videoLicense")]
-    pub video_license: Option<SearchListVideoLicense>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Display the content as seen by viewers in this country.
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// Sort order of the results.
-    #[serde(rename = "order")]
-    pub order: Option<SearchListOrder>,
-    /// Search for the private videos of the authenticated user.
-    #[serde(rename = "forMine")]
-    pub for_mine: Option<bool>,
-    /// Filter on the livestream status of the videos.
-    #[serde(rename = "eventType")]
-    pub event_type: Option<SearchListEventType>,
-    /// Filter on the definition of the videos.
-    #[serde(rename = "videoDefinition")]
-    pub video_definition: Option<SearchListVideoDefinition>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Filter on location of the video
-    #[serde(rename = "location")]
-    pub location: Option<String>,
-    /// Filter on embeddable videos.
-    #[serde(rename = "videoEmbeddable")]
-    pub video_embeddable: Option<SearchListVideoEmbeddable>,
-    /// Restrict results to a particular set of resource types from One Platform.
-    #[serde(rename = "type")]
-    pub typ: Option<String>,
-    /// Filter on videos of a specific type.
-    #[serde(rename = "videoType")]
-    pub video_type: Option<SearchListVideoType>,
-    /// Search related to a resource.
-    #[serde(rename = "relatedToVideoId")]
-    pub related_to_video_id: Option<String>,
-    /// Filter on videos in a specific category.
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: Option<String>,
-    /// Textual search terms to match.
-    #[serde(rename = "q")]
-    pub q: Option<String>,
-    /// Add a filter on the channel search.
-    #[serde(rename = "channelType")]
-    pub channel_type: Option<SearchListChannelType>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Filter on the presence of captions on the videos.
-    #[serde(rename = "videoCaption")]
-    pub video_caption: Option<SearchListVideoCaption>,
-    /// Filter on resources published before this date.
-    #[serde(rename = "publishedBefore")]
-    pub published_before: Option<String>,
-    /// Filter on 3d videos.
-    #[serde(rename = "videoDimension")]
-    pub video_dimension: Option<SearchListVideoDimension>,
-    /// Filter on resources belonging to this channelId.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Filter on the duration of the videos.
-    #[serde(rename = "videoDuration")]
-    pub video_duration: Option<SearchListVideoDuration>,
-    /// Filter on syndicated videos.
-    #[serde(rename = "videoSyndicated")]
-    pub video_syndicated: Option<SearchListVideoSyndicated>,
-}
-
-impl std::fmt::Display for SearchListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.topic_id {
-            write!(
-                f,
-                "&topicId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.safe_search {
-            write!(
-                f,
-                "&safeSearch={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.relevance_language {
-            write!(
-                f,
-                "&relevanceLanguage={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_content_owner {
-            write!(
-                f,
-                "&forContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_after {
-            write!(
-                f,
-                "&publishedAfter={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_developer {
-            write!(
-                f,
-                "&forDeveloper={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.location_radius {
-            write!(
-                f,
-                "&locationRadius={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_license {
-            write!(
-                f,
-                "&videoLicense={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_mine {
-            write!(
-                f,
-                "&forMine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.event_type {
-            write!(
-                f,
-                "&eventType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_definition {
-            write!(
-                f,
-                "&videoDefinition={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.location {
-            write!(
-                f,
-                "&location={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_embeddable {
-            write!(
-                f,
-                "&videoEmbeddable={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.typ {
-            write!(
-                f,
-                "&type={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_type {
-            write!(
-                f,
-                "&videoType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.related_to_video_id {
-            write!(
-                f,
-                "&relatedToVideoId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_category_id {
-            write!(
-                f,
-                "&videoCategoryId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.q {
-            write!(
-                f,
-                "&q={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_type {
-            write!(
-                f,
-                "&channelType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_caption {
-            write!(
-                f,
-                "&videoCaption={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_before {
-            write!(
-                f,
-                "&publishedBefore={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_dimension {
-            write!(
-                f,
-                "&videoDimension={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_duration {
-            write!(
-                f,
-                "&videoDuration={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_syndicated {
-            write!(
-                f,
-                "&videoSyndicated={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `abuseReports.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseReportsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for AbuseReportsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `membershipsLevels.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the membershipsLevel resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for MembershipsLevelsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
 /// Parameters for the `videoAbuseReportReasons.list` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct VideoAbuseReportReasonsListParams {
@@ -15451,57 +14873,64 @@
     }
 }
 
-/// Parameters for the `members.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembersListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Parameter that specifies which channel members to return.
-    #[serde(rename = "mode")]
-    pub mode: Option<MembersListMode>,
-    /// Filter members in the results set to the ones that have access to a level.
-    #[serde(rename = "hasAccessToLevel")]
-    pub has_access_to_level: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
+/// Parameters for the `commentThreads.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Returns the comment threads of the specified video.
+    #[serde(rename = "videoId")]
+    pub video_id: Option<String>,
+    /// Returns the comment threads with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-    /// Comma separated list of channel IDs. Only data about members that are part of this list will be included in the response.
-    #[serde(rename = "filterByMemberChannelId")]
-    pub filter_by_member_channel_id: Option<String>,
-    /// The *part* parameter specifies the member resource parts that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for MembersListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.mode {
-            write!(
-                f,
-                "&mode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.has_access_to_level {
-            write!(
-                f,
-                "&hasAccessToLevel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
+    /// The *part* parameter specifies a comma-separated list of one or more commentThread resource properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The requested text format for the returned comments.
+    #[serde(rename = "textFormat")]
+    pub text_format: Option<CommentThreadsListTextFormat>,
+    /// Limits the returned comment threads to those with the specified moderation status. Not compatible with the 'id' filter. Valid values: published, heldForReview, likelySpam.
+    #[serde(rename = "moderationStatus")]
+    pub moderation_status: Option<CommentThreadsListModerationStatus>,
+    /// Returns the comment threads for all the channel comments (ie does not include comments left on videos).
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Returns the comment threads of all videos of the channel and the channel comments as well.
+    #[serde(rename = "allThreadsRelatedToChannelId")]
+    pub all_threads_related_to_channel_id: Option<String>,
+    #[serde(rename = "order")]
+    pub order: Option<CommentThreadsListOrder>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Limits the returned comment threads to those matching the specified key words. Not compatible with the 'id' filter.
+    #[serde(rename = "searchTerms")]
+    pub search_terms: Option<String>,
+}
+
+impl std::fmt::Display for CommentThreadsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.video_id {
+            write!(
+                f,
+                "&videoId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -15512,68 +14941,202 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.filter_by_member_channel_id {
-            write!(
-                f,
-                "&filterByMemberChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-///
+        if let Some(ref v) = self.text_format {
+            write!(
+                f,
+                "&textFormat={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.moderation_status {
+            write!(
+                f,
+                "&moderationStatus={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.all_threads_related_to_channel_id {
+            write!(
+                f,
+                "&allThreadsRelatedToChannelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.search_terms {
+            write!(
+                f,
+                "&searchTerms={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `commentThreads.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentThreadsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `commentThreads.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies a comma-separated list of commentThread resource properties that the API response will include. You must at least include the snippet part in the parameter value since that part contains all of the properties that the API request can update.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentThreadsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct YoutubeParams {
-    /// Data format for response.
-    #[serde(rename = "alt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt: Option<YoutubeParamsAlt>,
-    /// V1 error format.
-    #[serde(rename = "$.xgafv")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dollar_xgafv: Option<YoutubeParamsdollar_xgafv>,
-    /// OAuth 2.0 token for the current user.
-    #[serde(rename = "oauth_token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub oauth_token: Option<String>,
+    /// API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.
+    #[serde(rename = "key")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub key: Option<String>,
+    /// JSONP
+    #[serde(rename = "callback")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub callback: Option<String>,
+    /// Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.
+    #[serde(rename = "quotaUser")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub quota_user: Option<String>,
+    /// Legacy upload protocol for media (e.g. "media", "multipart").
+    #[serde(rename = "uploadType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload_type: Option<String>,
+    /// Selector specifying which fields to include in a partial response.
+    #[serde(rename = "fields")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fields: Option<String>,
     /// Upload protocol for media (e.g. "raw", "multipart").
     #[serde(rename = "upload_protocol")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub upload_protocol: Option<String>,
-    /// Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.
-    #[serde(rename = "quotaUser")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub quota_user: Option<String>,
-    /// JSONP
-    #[serde(rename = "callback")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub callback: Option<String>,
-    /// API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.
-    #[serde(rename = "key")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub key: Option<String>,
-    /// Selector specifying which fields to include in a partial response.
-    #[serde(rename = "fields")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fields: Option<String>,
     /// OAuth access token.
     #[serde(rename = "access_token")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub access_token: Option<String>,
-    /// Legacy upload protocol for media (e.g. "media", "multipart").
-    #[serde(rename = "uploadType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload_type: Option<String>,
+    /// Data format for response.
+    #[serde(rename = "alt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt: Option<YoutubeParamsAlt>,
+    /// OAuth 2.0 token for the current user.
+    #[serde(rename = "oauth_token")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub oauth_token: Option<String>,
     /// Returns response with indentations and line breaks.
     #[serde(rename = "prettyPrint")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub pretty_print: Option<bool>,
+    /// V1 error format.
+    #[serde(rename = "$.xgafv")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dollar_xgafv: Option<YoutubeParamsdollar_xgafv>,
 }
 
 impl std::fmt::Display for YoutubeParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.key {
+            write!(
+                f,
+                "&key={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.callback {
+            write!(
+                f,
+                "&callback={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.quota_user {
+            write!(
+                f,
+                "&quotaUser={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.upload_type {
+            write!(
+                f,
+                "&uploadType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.fields {
+            write!(
+                f,
+                "&fields={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.upload_protocol {
+            write!(
+                f,
+                "&upload_protocol={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.access_token {
+            write!(
+                f,
+                "&access_token={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.alt {
             write!(
                 f,
@@ -15581,6 +15144,20 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.oauth_token {
+            write!(
+                f,
+                "&oauth_token={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.pretty_print {
+            write!(
+                f,
+                "&prettyPrint={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.dollar_xgafv {
             write!(
                 f,
@@ -15588,69 +15165,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.oauth_token {
-            write!(
-                f,
-                "&oauth_token={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.upload_protocol {
-            write!(
-                f,
-                "&upload_protocol={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.quota_user {
-            write!(
-                f,
-                "&quotaUser={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.callback {
-            write!(
-                f,
-                "&callback={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.key {
-            write!(
-                f,
-                "&key={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.fields {
-            write!(
-                f,
-                "&fields={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.access_token {
-            write!(
-                f,
-                "&access_token={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.upload_type {
-            write!(
-                f,
-                "&uploadType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.pretty_print {
-            write!(
-                f,
-                "&prettyPrint={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         Ok(())
     }
 }
@@ -15667,7 +15181,7 @@
 
 impl I18nLanguagesService {
     /// Create a new I18nLanguagesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nLanguagesService {
         I18nLanguagesService {
@@ -15752,8 +15266,8 @@
     }
 }
 
-/// The Youtube VideoCategories service represents the VideoCategories resource.
-pub struct VideoCategoriesService {
+/// The Youtube MembershipsLevels service represents the MembershipsLevels resource.
+pub struct MembershipsLevelsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -15762,12 +15276,12 @@
     root_url: String,
 }
 
-impl VideoCategoriesService {
-    /// Create a new VideoCategoriesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl MembershipsLevelsService {
+    /// Create a new MembershipsLevelsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideoCategoriesService {
-        VideoCategoriesService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembershipsLevelsService {
+        MembershipsLevelsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -15819,18 +15333,20 @@
             .collect();
     }
 
-    /// Retrieves a list of resources, possibly filtered.
+    /// Retrieves a list of all pricing levels offered by a creator to the fans.
     pub async fn list(
         &self,
-        params: &VideoCategoriesListParams,
-    ) -> Result<VideoCategoryListResponse> {
-        let rel_path = format!("youtube/v3/videoCategories",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+        params: &MembershipsLevelsListParams,
+    ) -> Result<MembershipsLevelListResponse> {
+        let rel_path = format!("youtube/v3/membershipsLevels",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -15864,7 +15380,7 @@
 
 impl ChannelsService {
     /// Create a new ChannelsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelsService {
         ChannelsService {
@@ -15919,37 +15435,6 @@
             .collect();
     }
 
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &ChannelsListParams) -> Result<ChannelListResponse> {
-        let rel_path = format!("youtube/v3/channels",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubepartnerChannelAudit
-                .as_ref()
-                .to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
     /// Updates an existing resource.
     pub async fn update(&self, params: &ChannelsUpdateParams, req: &Channel) -> Result<Channel> {
         let rel_path = format!("youtube/v3/channels",);
@@ -15979,150 +15464,18 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
     }
-}
-
-/// The Youtube LiveChatModerators service represents the LiveChatModerators resource.
-pub struct LiveChatModeratorsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveChatModeratorsService {
-    /// Create a new LiveChatModeratorsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatModeratorsService {
-        LiveChatModeratorsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &LiveChatModeratorsInsertParams,
-        req: &LiveChatModerator,
-    ) -> Result<LiveChatModerator> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a chat moderator.
-    pub async fn delete(&self, params: &LiveChatModeratorsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &LiveChatModeratorsListParams,
-    ) -> Result<LiveChatModeratorListResponse> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+    pub async fn list(&self, params: &ChannelsListParams) -> Result<ChannelListResponse> {
+        let rel_path = format!("youtube/v3/channels",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubepartnerChannelAudit
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -16156,7 +15509,7 @@
 
 impl SuperChatEventsService {
     /// Create a new SuperChatEventsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SuperChatEventsService {
         SuperChatEventsService {
@@ -16244,255 +15597,8 @@
     }
 }
 
-/// The Youtube Comments service represents the Comments resource.
-pub struct CommentsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CommentsService {
-    /// Create a new CommentsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentsService {
-        CommentsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &CommentsInsertParams, req: &Comment) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &CommentsListParams) -> Result<CommentListResponse> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &CommentsUpdateParams, req: &Comment) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
-    pub async fn mark_as_spam(&self, params: &CommentsMarkAsSpamParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/markAsSpam",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Sets the moderation status of one or more comments.
-    pub async fn set_moderation_status(
-        &self,
-        params: &CommentsSetModerationStatusParams,
-    ) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/setModerationStatus",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &CommentsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube ThirdPartyLinks service represents the ThirdPartyLinks resource.
-pub struct ThirdPartyLinksService {
+/// The Youtube Members service represents the Members resource.
+pub struct MembersService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -16501,493 +15607,12 @@
     root_url: String,
 }
 
-impl ThirdPartyLinksService {
-    /// Create a new ThirdPartyLinksService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ThirdPartyLinksService {
-        ThirdPartyLinksService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &self,
-        params: &ThirdPartyLinksUpdateParams,
-        req: &ThirdPartyLink,
-    ) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &ThirdPartyLinksInsertParams,
-        req: &ThirdPartyLink,
-    ) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &ThirdPartyLinksListParams) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &ThirdPartyLinksDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube LiveChatMessages service represents the LiveChatMessages resource.
-pub struct LiveChatMessagesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveChatMessagesService {
-    /// Create a new LiveChatMessagesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl MembersService {
+    /// Create a new MembersService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatMessagesService {
-        LiveChatMessagesService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Deletes a chat message.
-    pub async fn delete(&self, params: &LiveChatMessagesDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &LiveChatMessagesListParams,
-    ) -> Result<LiveChatMessageListResponse> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &LiveChatMessagesInsertParams,
-        req: &LiveChatMessage,
-    ) -> Result<LiveChatMessage> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube CommentThreads service represents the CommentThreads resource.
-pub struct CommentThreadsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CommentThreadsService {
-    /// Create a new CommentThreadsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentThreadsService {
-        CommentThreadsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &CommentThreadsInsertParams,
-        req: &CommentThread,
-    ) -> Result<CommentThread> {
-        let rel_path = format!("youtube/v3/commentThreads",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &CommentThreadsListParams,
-    ) -> Result<CommentThreadListResponse> {
-        let rel_path = format!("youtube/v3/commentThreads",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &self,
-        params: &CommentThreadsUpdateParams,
-        req: &CommentThread,
-    ) -> Result<CommentThread> {
-        let rel_path = format!("youtube/v3/commentThreads",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-}
-
-/// The Youtube ChannelSections service represents the ChannelSections resource.
-pub struct ChannelSectionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl ChannelSectionsService {
-    /// Create a new ChannelSectionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelSectionsService {
-        ChannelSectionsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembersService {
+        MembersService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -17039,409 +15664,17 @@
             .collect();
     }
 
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &ChannelSectionsInsertParams,
-        req: &ChannelSection,
-    ) -> Result<ChannelSection> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &ChannelSectionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &ChannelSectionsListParams,
-    ) -> Result<ChannelSectionListResponse> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &self,
-        params: &ChannelSectionsUpdateParams,
-        req: &ChannelSection,
-    ) -> Result<ChannelSection> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-}
-
-/// The Youtube LiveStreams service represents the LiveStreams resource.
-pub struct LiveStreamsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveStreamsService {
-    /// Create a new LiveStreamsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveStreamsService {
-        LiveStreamsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Updates an existing stream for the authenticated user.
-    pub async fn update(
-        &self,
-        params: &LiveStreamsUpdateParams,
-        req: &LiveStream,
-    ) -> Result<LiveStream> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &self,
-        params: &LiveStreamsInsertParams,
-        req: &LiveStream,
-    ) -> Result<LiveStream> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes an existing stream for the authenticated user.
-    pub async fn delete(&self, params: &LiveStreamsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieve the list of streams associated with the given channel. --
-    pub async fn list(&self, params: &LiveStreamsListParams) -> Result<LiveStreamListResponse> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Videos service represents the Videos resource.
-pub struct VideosService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl VideosService {
-    /// Create a new VideosService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideosService {
-        VideosService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
-    pub async fn get_rating(
-        &self,
-        params: &VideosGetRatingParams,
-    ) -> Result<VideoRatingListResponse> {
-        let rel_path = format!("youtube/v3/videos/getRating",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+    /// Retrieves a list of members that match the request criteria for a channel.
+    pub async fn list(&self, params: &MembersListParams) -> Result<MemberListResponse> {
+        let rel_path = format!("youtube/v3/members",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -17461,498 +15694,6 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &VideosInsertParams, req: &Video) -> Result<Video> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
-    pub async fn insert_upload(
-        &self,
-        params: &VideosInsertParams,
-        req: &Video,
-        data: hyper::body::Bytes,
-    ) -> Result<Video> {
-        let rel_path = format!("/upload/youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn insert_resumable_upload<'client>(
-        &'client self,
-        params: &VideosInsertParams,
-        req: &Video,
-    ) -> Result<ResumableUpload<'client, Video>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &VideosUpdateParams, req: &Video) -> Result<Video> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Adds a like or dislike rating to a video or removes a rating from a video.
-    pub async fn rate(&self, params: &VideosRateParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos/rate",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &VideosListParams) -> Result<VideoListResponse> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &VideosDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Report abuse for a video.
-    pub async fn report_abuse(
-        &self,
-        params: &VideosReportAbuseParams,
-        req: &VideoAbuseReport,
-    ) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos/reportAbuse",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube Watermarks service represents the Watermarks resource.
-pub struct WatermarksService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl WatermarksService {
-    /// Create a new WatermarksService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> WatermarksService {
-        WatermarksService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Allows removal of channel watermark.
-    pub async fn unset(&self, params: &WatermarksUnsetParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/watermarks/unset",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Allows upload of watermark image and setting it for a channel.
-    pub async fn set(&self, params: &WatermarksSetParams, req: &InvideoBranding) -> Result<()> {
-        let rel_path = format!("youtube/v3/watermarks/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Allows upload of watermark image and setting it for a channel.
-    ///
-    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
-    pub async fn set_upload(
-        &self,
-        params: &WatermarksSetParams,
-        req: &InvideoBranding,
-        data: hyper::body::Bytes,
-    ) -> Result<()> {
-        let rel_path = format!("/upload/youtube/v3/watermarks/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// Allows upload of watermark image and setting it for a channel.
-    ///
-    /// This method is a variant of `set()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn set_resumable_upload<'client>(
-        &'client self,
-        params: &WatermarksSetParams,
-        req: &InvideoBranding,
-    ) -> Result<ResumableUpload<'client, ()>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/watermarks/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
 }
 
 /// The Youtube ChannelBanners service represents the ChannelBanners resource.
@@ -17967,7 +15708,7 @@
 
 impl ChannelBannersService {
     /// Create a new ChannelBannersService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelBannersService {
         ChannelBannersService {
@@ -18149,8 +15890,302 @@
     }
 }
 
-/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
-pub struct LiveBroadcastsService {
+/// The Youtube PlaylistItems service represents the PlaylistItems resource.
+pub struct PlaylistItemsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl PlaylistItemsService {
+    /// Create a new PlaylistItemsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistItemsService {
+        PlaylistItemsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &self,
+        params: &PlaylistItemsUpdateParams,
+        req: &PlaylistItem,
+    ) -> Result<PlaylistItem> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &PlaylistItemsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &PlaylistItemsInsertParams,
+        req: &PlaylistItem,
+    ) -> Result<PlaylistItem> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &PlaylistItemsListParams) -> Result<PlaylistItemListResponse> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube VideoCategories service represents the VideoCategories resource.
+pub struct VideoCategoriesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl VideoCategoriesService {
+    /// Create a new VideoCategoriesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideoCategoriesService {
+        VideoCategoriesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &VideoCategoriesListParams,
+    ) -> Result<VideoCategoryListResponse> {
+        let rel_path = format!("youtube/v3/videoCategories",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Videos service represents the Videos resource.
+pub struct VideosService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -18159,12 +16194,385 @@
     root_url: String,
 }
 
-impl LiveBroadcastsService {
-    /// Create a new LiveBroadcastsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl VideosService {
+    /// Create a new VideosService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveBroadcastsService {
-        LiveBroadcastsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideosService {
+        VideosService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Report abuse for a video.
+    pub async fn report_abuse(
+        &self,
+        params: &VideosReportAbuseParams,
+        req: &VideoAbuseReport,
+    ) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos/reportAbuse",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &VideosUpdateParams, req: &Video) -> Result<Video> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &VideosListParams) -> Result<VideoListResponse> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &VideosDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(&self, params: &VideosInsertParams, req: &Video) -> Result<Video> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
+    pub async fn insert_upload(
+        &self,
+        params: &VideosInsertParams,
+        req: &Video,
+        data: hyper::body::Bytes,
+    ) -> Result<Video> {
+        let rel_path = format!("/upload/youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn insert_resumable_upload<'client>(
+        &'client self,
+        params: &VideosInsertParams,
+        req: &Video,
+    ) -> Result<ResumableUpload<'client, Video>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+
+    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
+    pub async fn get_rating(
+        &self,
+        params: &VideosGetRatingParams,
+    ) -> Result<VideoRatingListResponse> {
+        let rel_path = format!("youtube/v3/videos/getRating",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Adds a like or dislike rating to a video or removes a rating from a video.
+    pub async fn rate(&self, params: &VideosRateParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos/rate",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube ChannelSections service represents the ChannelSections resource.
+pub struct ChannelSectionsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ChannelSectionsService {
+    /// Create a new ChannelSectionsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelSectionsService {
+        ChannelSectionsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -18216,12 +16624,238 @@
             .collect();
     }
 
-    /// Retrieve the list of broadcasts associated with the given channel.
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &ChannelSectionsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &self,
+        params: &ChannelSectionsUpdateParams,
+        req: &ChannelSection,
+    ) -> Result<ChannelSection> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
     pub async fn list(
         &self,
-        params: &LiveBroadcastsListParams,
-    ) -> Result<LiveBroadcastListResponse> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        params: &ChannelSectionsListParams,
+    ) -> Result<ChannelSectionListResponse> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &ChannelSectionsInsertParams,
+        req: &ChannelSection,
+    ) -> Result<ChannelSection> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatModerators service represents the LiveChatModerators resource.
+pub struct LiveChatModeratorsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveChatModeratorsService {
+    /// Create a new LiveChatModeratorsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatModeratorsService {
+        LiveChatModeratorsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a chat moderator.
+    pub async fn delete(&self, params: &LiveChatModeratorsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/moderators",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &LiveChatModeratorsListParams,
+    ) -> Result<LiveChatModeratorListResponse> {
+        let rel_path = format!("youtube/v3/liveChat/moderators",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -18248,137 +16882,13 @@
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
 
-    /// Updates an existing broadcast for the authenticated user.
-    pub async fn update(
-        &self,
-        params: &LiveBroadcastsUpdateParams,
-        req: &LiveBroadcast,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Transition a broadcast to a given status.
-    pub async fn transition(
-        &self,
-        params: &LiveBroadcastsTransitionParams,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/transition",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Bind a broadcast to a stream.
-    pub async fn bind(&self, params: &LiveBroadcastsBindParams) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/bind",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Delete a given broadcast.
-    pub async fn delete(&self, params: &LiveBroadcastsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new stream for the authenticated user.
+    /// Inserts a new resource into this collection.
     pub async fn insert(
         &self,
-        params: &LiveBroadcastsInsertParams,
-        req: &LiveBroadcast,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        params: &LiveChatModeratorsInsertParams,
+        req: &LiveChatModerator,
+    ) -> Result<LiveChatModerator> {
+        let rel_path = format!("youtube/v3/liveChat/moderators",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -18407,8 +16917,8 @@
     }
 }
 
-/// The Youtube LiveChatBans service represents the LiveChatBans resource.
-pub struct LiveChatBansService {
+/// The Youtube LiveChatMessages service represents the LiveChatMessages resource.
+pub struct LiveChatMessagesService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -18417,12 +16927,175 @@
     root_url: String,
 }
 
-impl LiveChatBansService {
-    /// Create a new LiveChatBansService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl LiveChatMessagesService {
+    /// Create a new LiveChatMessagesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatBansService {
-        LiveChatBansService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatMessagesService {
+        LiveChatMessagesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &LiveChatMessagesListParams,
+    ) -> Result<LiveChatMessageListResponse> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Deletes a chat message.
+    pub async fn delete(&self, params: &LiveChatMessagesDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &LiveChatMessagesInsertParams,
+        req: &LiveChatMessage,
+    ) -> Result<LiveChatMessage> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube AbuseReports service represents the AbuseReports resource.
+pub struct AbuseReportsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl AbuseReportsService {
+    /// Create a new AbuseReportsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> AbuseReportsService {
+        AbuseReportsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -18474,9 +17147,519 @@
             .collect();
     }
 
-    /// Deletes a chat ban.
-    pub async fn delete(&self, params: &LiveChatBansDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &AbuseReportsInsertParams,
+        req: &AbuseReport,
+    ) -> Result<AbuseReport> {
+        let rel_path = format!("youtube/v3/abuseReports",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Search service represents the Search resource.
+pub struct SearchService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl SearchService {
+    /// Create a new SearchService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SearchService {
+        SearchService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of search resources
+    pub async fn list(&self, params: &SearchListParams) -> Result<SearchListResponse> {
+        let rel_path = format!("youtube/v3/search",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Tests service represents the Tests resource.
+pub struct TestsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl TestsService {
+    /// Create a new TestsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> TestsService {
+        TestsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// POST method.
+    pub async fn insert(&self, params: &TestsInsertParams, req: &TestItem) -> Result<TestItem> {
+        let rel_path = format!("youtube/v3/tests",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube ThirdPartyLinks service represents the ThirdPartyLinks resource.
+pub struct ThirdPartyLinksService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ThirdPartyLinksService {
+    /// Create a new ThirdPartyLinksService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ThirdPartyLinksService {
+        ThirdPartyLinksService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &ThirdPartyLinksDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &ThirdPartyLinksInsertParams,
+        req: &ThirdPartyLink,
+    ) -> Result<ThirdPartyLink> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &ThirdPartyLinksListParams) -> Result<ThirdPartyLink> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &self,
+        params: &ThirdPartyLinksUpdateParams,
+        req: &ThirdPartyLink,
+    ) -> Result<ThirdPartyLink> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube LiveStreams service represents the LiveStreams resource.
+pub struct LiveStreamsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveStreamsService {
+    /// Create a new LiveStreamsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveStreamsService {
+        LiveStreamsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieve the list of streams associated with the given channel. --
+    pub async fn list(&self, params: &LiveStreamsListParams) -> Result<LiveStreamListResponse> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Updates an existing stream for the authenticated user.
+    pub async fn update(
+        &self,
+        params: &LiveStreamsUpdateParams,
+        req: &LiveStream,
+    ) -> Result<LiveStream> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Deletes an existing stream for the authenticated user.
+    pub async fn delete(&self, params: &LiveStreamsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveStreams",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -18503,13 +17686,13 @@
         do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
     }
 
-    /// Inserts a new resource into this collection.
+    /// Inserts a new stream for the authenticated user.
     pub async fn insert(
         &self,
-        params: &LiveChatBansInsertParams,
-        req: &LiveChatBan,
-    ) -> Result<LiveChatBan> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
+        params: &LiveStreamsInsertParams,
+        req: &LiveStream,
+    ) -> Result<LiveStream> {
+        let rel_path = format!("youtube/v3/liveStreams",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -18550,7 +17733,7 @@
 
 impl ActivitiesService {
     /// Create a new ActivitiesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ActivitiesService {
         ActivitiesService {
@@ -18635,8 +17818,8 @@
     }
 }
 
-/// The Youtube Thumbnails service represents the Thumbnails resource.
-pub struct ThumbnailsService {
+/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
+pub struct LiveBroadcastsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -18645,197 +17828,12 @@
     root_url: String,
 }
 
-impl ThumbnailsService {
-    /// Create a new ThumbnailsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl LiveBroadcastsService {
+    /// Create a new LiveBroadcastsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ThumbnailsService {
-        ThumbnailsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    pub async fn set(&self, params: &ThumbnailsSetParams) -> Result<ThumbnailSetResponse> {
-        let rel_path = format!("youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    ///
-    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
-    pub async fn set_upload(
-        &self,
-        params: &ThumbnailsSetParams,
-        data: hyper::body::Bytes,
-    ) -> Result<ThumbnailSetResponse> {
-        let rel_path = format!("/upload/youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    ///
-    /// This method is a variant of `set()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn set_resumable_upload<'client>(
-        &'client self,
-        params: &ThumbnailsSetParams,
-    ) -> Result<ResumableUpload<'client, ThumbnailSetResponse>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-}
-
-/// The Youtube PlaylistItems service represents the PlaylistItems resource.
-pub struct PlaylistItemsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl PlaylistItemsService {
-    /// Create a new PlaylistItemsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistItemsService {
-        PlaylistItemsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveBroadcastsService {
+        LiveBroadcastsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -18887,19 +17885,141 @@
             .collect();
     }
 
-    /// Inserts a new resource into this collection.
+    /// Delete a given broadcast.
+    pub async fn delete(&self, params: &LiveBroadcastsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Transition a broadcast to a given status.
+    pub async fn transition(
+        &self,
+        params: &LiveBroadcastsTransitionParams,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/transition",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieve the list of broadcasts associated with the given channel.
+    pub async fn list(
+        &self,
+        params: &LiveBroadcastsListParams,
+    ) -> Result<LiveBroadcastListResponse> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Bind a broadcast to a stream.
+    pub async fn bind(&self, params: &LiveBroadcastsBindParams) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/bind",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new stream for the authenticated user.
     pub async fn insert(
         &self,
-        params: &PlaylistItemsInsertParams,
-        req: &PlaylistItem,
-    ) -> Result<PlaylistItem> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+        params: &LiveBroadcastsInsertParams,
+        req: &LiveBroadcast,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -18921,77 +18041,19 @@
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
 
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &PlaylistItemsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &PlaylistItemsListParams) -> Result<PlaylistItemListResponse> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Updates an existing resource.
+    /// Updates an existing broadcast for the authenticated user.
     pub async fn update(
         &self,
-        params: &PlaylistItemsUpdateParams,
-        req: &PlaylistItem,
-    ) -> Result<PlaylistItem> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+        params: &LiveBroadcastsUpdateParams,
+        req: &LiveBroadcast,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -19014,352 +18076,6 @@
     }
 }
 
-/// The Youtube Playlists service represents the Playlists resource.
-pub struct PlaylistsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl PlaylistsService {
-    /// Create a new PlaylistsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistsService {
-        PlaylistsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &PlaylistsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &PlaylistsListParams) -> Result<PlaylistListResponse> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &PlaylistsInsertParams, req: &Playlist) -> Result<Playlist> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &PlaylistsUpdateParams, req: &Playlist) -> Result<Playlist> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-}
-
-/// The Youtube Subscriptions service represents the Subscriptions resource.
-pub struct SubscriptionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl SubscriptionsService {
-    /// Create a new SubscriptionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SubscriptionsService {
-        SubscriptionsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &SubscriptionsInsertParams,
-        req: &Subscription,
-    ) -> Result<Subscription> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &SubscriptionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &SubscriptionsListParams) -> Result<SubscriptionListResponse> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
 /// The Youtube Captions service represents the Captions resource.
 pub struct CaptionsService {
     client: TlsClient,
@@ -19372,7 +18088,7 @@
 
 impl CaptionsService {
     /// Create a new CaptionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CaptionsService {
         CaptionsService {
@@ -19578,72 +18294,6 @@
         }
     }
 
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &CaptionsListParams) -> Result<CaptionListResponse> {
-        let rel_path = format!("youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Downloads a caption track.
-    ///
-    /// This method potentially downloads data. See documentation of `Download`.
-    pub async fn download<'a>(
-        &'a self,
-        params: &CaptionsDownloadParams,
-    ) -> Result<Download<'a, EmptyRequest, ()>> {
-        let rel_path = format!(
-            "youtube/v3/captions/{id}",
-            id = percent_encode(format!("{}", params.id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-
-        do_download(&self.client, &full_uri, headers, "GET".into(), opt_request).await
-    }
-
     /// Inserts a new resource into this collection.
     pub async fn insert(&self, params: &CaptionsInsertParams, req: &Caption) -> Result<Caption> {
         let rel_path = format!("youtube/v3/captions",);
@@ -19765,6 +18415,72 @@
             .context(format!("{:?}", headers)))?
         }
     }
+
+    /// Downloads a caption track.
+    ///
+    /// This method potentially downloads data. See documentation of `Download`.
+    pub async fn download<'a>(
+        &'a self,
+        params: &CaptionsDownloadParams,
+    ) -> Result<Download<'a, EmptyRequest, ()>> {
+        let rel_path = format!(
+            "youtube/v3/captions/{id}",
+            id = percent_encode(format!("{}", params.id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+
+        do_download(&self.client, &full_uri, headers, "GET".into(), opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &CaptionsListParams) -> Result<CaptionListResponse> {
+        let rel_path = format!("youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
 }
 
 /// The Youtube I18nRegions service represents the I18nRegions resource.
@@ -19779,7 +18495,7 @@
 
 impl I18nRegionsService {
     /// Create a new I18nRegionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nRegionsService {
         I18nRegionsService {
@@ -19864,8 +18580,8 @@
     }
 }
 
-/// The Youtube Tests service represents the Tests resource.
-pub struct TestsService {
+/// The Youtube Subscriptions service represents the Subscriptions resource.
+pub struct SubscriptionsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -19874,12 +18590,303 @@
     root_url: String,
 }
 
-impl TestsService {
-    /// Create a new TestsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl SubscriptionsService {
+    /// Create a new SubscriptionsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> TestsService {
-        TestsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SubscriptionsService {
+        SubscriptionsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &SubscriptionsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &SubscriptionsListParams) -> Result<SubscriptionListResponse> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &SubscriptionsInsertParams,
+        req: &Subscription,
+    ) -> Result<Subscription> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatBans service represents the LiveChatBans resource.
+pub struct LiveChatBansService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveChatBansService {
+    /// Create a new LiveChatBansService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatBansService {
+        LiveChatBansService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a chat ban.
+    pub async fn delete(&self, params: &LiveChatBansDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/bans",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &LiveChatBansInsertParams,
+        req: &LiveChatBan,
+    ) -> Result<LiveChatBan> {
+        let rel_path = format!("youtube/v3/liveChat/bans",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Comments service represents the Comments resource.
+pub struct CommentsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl CommentsService {
+    /// Create a new CommentsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentsService {
+        CommentsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -19931,15 +18938,106 @@
             .collect();
     }
 
-    /// POST method.
-    pub async fn insert(&self, params: &TestsInsertParams, req: &TestItem) -> Result<TestItem> {
-        let rel_path = format!("youtube/v3/tests",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &CommentsUpdateParams, req: &Comment) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
+    pub async fn mark_as_spam(&self, params: &CommentsMarkAsSpamParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments/markAsSpam",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Sets the moderation status of one or more comments.
+    pub async fn set_moderation_status(
+        &self,
+        params: &CommentsSetModerationStatusParams,
+    ) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments/setModerationStatus",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(&self, params: &CommentsInsertParams, req: &Comment) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -19960,10 +19058,68 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
-}
-
-/// The Youtube Search service represents the Search resource.
-pub struct SearchService {
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &CommentsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &CommentsListParams) -> Result<CommentListResponse> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Thumbnails service represents the Thumbnails resource.
+pub struct ThumbnailsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -19972,12 +19128,12 @@
     root_url: String,
 }
 
-impl SearchService {
-    /// Create a new SearchService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl ThumbnailsService {
+    /// Create a new ThumbnailsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SearchService {
-        SearchService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ThumbnailsService {
+        ThumbnailsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -20029,9 +19185,82 @@
             .collect();
     }
 
-    /// Retrieves a list of search resources
-    pub async fn list(&self, params: &SearchListParams) -> Result<SearchListResponse> {
-        let rel_path = format!("youtube/v3/search",);
+    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
+    pub async fn set(&self, params: &ThumbnailsSetParams) -> Result<ThumbnailSetResponse> {
+        let rel_path = format!("youtube/v3/thumbnails/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
+    ///
+    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
+    pub async fn set_upload(
+        &self,
+        params: &ThumbnailsSetParams,
+        data: hyper::body::Bytes,
+    ) -> Result<ThumbnailSetResponse> {
+        let rel_path = format!("/upload/youtube/v3/thumbnails/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
+    ///
+    /// This method is a variant of `set()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn set_resumable_upload<'client>(
+        &'client self,
+        params: &ThumbnailsSetParams,
+    ) -> Result<ResumableUpload<'client, ThumbnailSetResponse>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/thumbnails/set",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -20047,20 +19276,35 @@
             format!("Bearer {token}", token = tok.as_str()),
         ));
 
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube AbuseReports service represents the AbuseReports resource.
-pub struct AbuseReportsService {
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+}
+
+/// The Youtube Watermarks service represents the Watermarks resource.
+pub struct WatermarksService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -20069,12 +19313,231 @@
     root_url: String,
 }
 
-impl AbuseReportsService {
-    /// Create a new AbuseReportsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl WatermarksService {
+    /// Create a new WatermarksService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> AbuseReportsService {
-        AbuseReportsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> WatermarksService {
+        WatermarksService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Allows upload of watermark image and setting it for a channel.
+    pub async fn set(&self, params: &WatermarksSetParams, req: &InvideoBranding) -> Result<()> {
+        let rel_path = format!("youtube/v3/watermarks/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Allows upload of watermark image and setting it for a channel.
+    ///
+    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
+    pub async fn set_upload(
+        &self,
+        params: &WatermarksSetParams,
+        req: &InvideoBranding,
+        data: hyper::body::Bytes,
+    ) -> Result<()> {
+        let rel_path = format!("/upload/youtube/v3/watermarks/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// Allows upload of watermark image and setting it for a channel.
+    ///
+    /// This method is a variant of `set()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn set_resumable_upload<'client>(
+        &'client self,
+        params: &WatermarksSetParams,
+        req: &InvideoBranding,
+    ) -> Result<ResumableUpload<'client, ()>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/watermarks/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+
+    /// Allows removal of channel watermark.
+    pub async fn unset(&self, params: &WatermarksUnsetParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/watermarks/unset",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Playlists service represents the Playlists resource.
+pub struct PlaylistsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl PlaylistsService {
+    /// Create a new PlaylistsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistsService {
+        PlaylistsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -20127,18 +19590,14 @@
     }
 
     /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &AbuseReportsInsertParams,
-        req: &AbuseReport,
-    ) -> Result<AbuseReport> {
-        let rel_path = format!("youtube/v3/abuseReports",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+    pub async fn insert(&self, params: &PlaylistsInsertParams, req: &Playlist) -> Result<Playlist> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -20159,89 +19618,16 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
-}
-
-/// The Youtube MembershipsLevels service represents the MembershipsLevels resource.
-pub struct MembershipsLevelsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl MembershipsLevelsService {
-    /// Create a new MembershipsLevelsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembershipsLevelsService {
-        MembershipsLevelsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of all pricing levels offered by a creator to the fans.
-    pub async fn list(
-        &self,
-        params: &MembershipsLevelsListParams,
-    ) -> Result<MembershipsLevelListResponse> {
-        let rel_path = format!("youtube/v3/membershipsLevels",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
-                .as_ref()
-                .to_string()];
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &PlaylistsListParams) -> Result<PlaylistListResponse> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -20261,6 +19647,65 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &PlaylistsUpdateParams, req: &Playlist) -> Result<Playlist> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &PlaylistsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
 }
 
 /// The Youtube VideoAbuseReportReasons service represents the VideoAbuseReportReasons resource.
@@ -20275,7 +19720,7 @@
 
 impl VideoAbuseReportReasonsService {
     /// Create a new VideoAbuseReportReasonsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + DerefAuth>(
         client: TlsClient,
@@ -20366,8 +19811,8 @@
     }
 }
 
-/// The Youtube Members service represents the Members resource.
-pub struct MembersService {
+/// The Youtube CommentThreads service represents the CommentThreads resource.
+pub struct CommentThreadsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -20376,12 +19821,12 @@
     root_url: String,
 }
 
-impl MembersService {
-    /// Create a new MembersService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+impl CommentThreadsService {
+    /// Create a new CommentThreadsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembersService {
-        MembersService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentThreadsService {
+        CommentThreadsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -20433,17 +19878,18 @@
             .collect();
     }
 
-    /// Retrieves a list of members that match the request criteria for a channel.
-    pub async fn list(&self, params: &MembersListParams) -> Result<MemberListResponse> {
-        let rel_path = format!("youtube/v3/members",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
-                .as_ref()
-                .to_string()];
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &CommentThreadsListParams,
+    ) -> Result<CommentThreadListResponse> {
+        let rel_path = format!("youtube/v3/commentThreads",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -20463,4 +19909,72 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-}
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &CommentThreadsInsertParams,
+        req: &CommentThread,
+    ) -> Result<CommentThread> {
+        let rel_path = format!("youtube/v3/commentThreads",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &self,
+        params: &CommentThreadsUpdateParams,
+        req: &CommentThread,
+    ) -> Result<CommentThread> {
+        let rel_path = format!("youtube/v3/commentThreads",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
--- a/generate/README.md	Sun Feb 28 11:47:05 2021 -0500
+++ b/generate/README.md	Mon Mar 01 06:51:13 2021 -0500
@@ -10,7 +10,7 @@
 * To generate an API listed in the global discovery document (specified by
     `--discovery_base`, which defaults to Google's at https://www.googleapis.com/discovery/v1/apis):
   ```bash
-     generate.py --only_apis=api_id:v1
+     generate.py --apis=api_id:v1
   ```
 * To list all available APIs from the global discovery document:
   ```bash
--- a/generate/generate.py	Sun Feb 28 11:47:05 2021 -0500
+++ b/generate/generate.py	Mon Mar 01 06:51:13 2021 -0500
@@ -25,14 +25,18 @@
 
 
 def optionalize(name, optional=True):
-    return 'Option<{}>'.format(name) if optional else name
+    return "Option<{}>".format(name) if optional else name
 
+# Rust keywords
+keywords = {"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false",
+            "fn", "for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut",
+            "pub", "ref", "return", "self", "Self", "static", "struct", "super", "trait",
+            "true", "type", "unsafe", "use", "where", "while", "async", "await", "abstract",
+            "become", "box", "do", "final", "macro", "override", "priv", "typeof", "unsized",
+            "virtual", "try", "yield", "dyn", "union", "dyn"}
 
 def replace_keywords(name):
-    return {
-        'type': 'typ',
-        'enum': 'enums',
-    }.get(name, name)
+    return name if name not in keywords else  name + "_"
 
 
 def capitalize_first(name):
@@ -42,23 +46,21 @@
 
 
 def sanitize_id(s):
-    return s.replace('$', 'dollar').replace('#', 'hash').replace('.', '_')
+    return s.replace("$", "dollar").replace("#", "hash").replace(".", "_").replace("@", "at").replace("-", "_")
 
 
 def rust_identifier(name):
     def r(c):
         if not c.isupper():
             return c
-        return '_' + c.lower()
-
-    return ''.join([(r(c) if i > 0 else c.lower()) for i, c in enumerate(sanitize_id(name))])
-
+        return "_" + c.lower()
+    return replace_keywords("".join([(r(c) if i > 0 else c.lower()) for i, c in enumerate(sanitize_id(name))]))
 
 def snake_to_camel(name):
     dest = []
     capitalize = True
     for c in name:
-        if c == '_':
+        if c == "_":
             capitalize = True
             continue
         if capitalize:
@@ -66,11 +68,11 @@
             capitalize = False
             continue
         dest.append(c)
-    return ''.join(dest)
+    return "".join(dest)
 
 
 def global_params_name(api_name):
-    return snake_to_camel(api_name + 'Params')
+    return snake_to_camel(api_name + "Params")
 
 
 def parse_schema_types(name, schema, optional=True, parents=[]):
@@ -92,26 +94,26 @@
         implemented and that the generated struct (if it was a struct) depends
         on. The dict contains elements as expected by templates.SchemaStructTmpl.
     """
-    typ = ''
-    comment = ''
+    typ = ""
+    comment = ""
     structs = []
     enums = []
     try:
-        if '$ref' in schema:
+        if "$ref" in schema:
             # We just assume that there is already a type generated for the reference.
-            if schema['$ref'] not in parents:
-                return optionalize(schema['$ref'], optional), structs, enums
-            return optionalize('Box<' + schema['$ref'] + '>', optional), structs, enums
-        if 'type' in schema and schema['type'] == 'object':
+            if schema["$ref"] not in parents:
+                return optionalize(schema["$ref"], optional), structs, enums
+            return optionalize("Box<" + schema["$ref"] + ">", optional), structs, enums
+        if "type" in schema and schema["type"] == "object":
             # There are two types of objects: those with `properties` are translated into a Rust struct,
             # and those with `additionalProperties` into a HashMap<String, ...>.
 
             # Structs are represented as dicts that can be used to render the SchemaStructTmpl.
-            if 'properties' in schema:
+            if "properties" in schema:
                 name = replace_keywords(name)
                 typ = name
-                struct = {'name': name, 'description': schema.get('description', ''), 'fields': []}
-                for pn, pp in schema['properties'].items():
+                struct = {"name": name, "description": schema.get("description", ""), "fields": []}
+                for pn, pp in schema["properties"].items():
                     subtyp, substructs, subenums = parse_schema_types(name + capitalize_first(pn),
                                                                       pp,
                                                                       optional=True,
@@ -123,28 +125,28 @@
                     cleaned_pn = replace_keywords(pn)
                     jsonname = pn
                     cleaned_pn = rust_identifier(cleaned_pn)
-                    struct['fields'].append({
-                        'name':
+                    struct["fields"].append({
+                        "name":
                         cleaned_pn,
-                        'original_name':
+                        "original_name":
                         jsonname,
-                        'attr':
-                        '#[serde(rename = "{}")]'.format(jsonname) +
-                        '\n    #[serde(skip_serializing_if = "Option::is_none")]'
-                        if subtyp.startswith('Option') else '',
-                        'typ':
+                        "attr":
+                        "#[serde(rename = \"{}\")]".format(jsonname) +
+                        "\n    #[serde(skip_serializing_if = \"Option::is_none\")]"
+                        if subtyp.startswith("Option") else "",
+                        "typ":
                         subtyp,
-                        'comment':
+                        "comment":
                         comment
                     })
                     structs.extend(substructs)
                     enums.extend(subenums)
                 structs.append(struct)
-                return (optionalize(typ, optional), schema.get('description', '')), structs, enums
+                return (optionalize(typ, optional), schema.get("description", "")), structs, enums
 
-            if 'additionalProperties' in schema:
+            if "additionalProperties" in schema:
                 field, substructs, subenums = parse_schema_types(name,
-                                                                 schema['additionalProperties'],
+                                                                 schema["additionalProperties"],
                                                                  optional=False,
                                                                  parents=parents + [name])
                 structs.extend(substructs)
@@ -152,90 +154,91 @@
                     typ = field[0]
                 else:
                     typ = field
-                return (optionalize('HashMap<String,' + typ + '>', optional), schema.get('description',
-                                                                                         '')), structs, subenums
+                return (optionalize("HashMap<String," + typ + ">", optional), schema.get("description",
+                                                                                         "")), structs, subenums
 
-        if schema['type'] == 'array':
+        if schema["type"] == "array":
             typ, substructs, subenums = parse_schema_types(name,
-                                                           schema['items'],
+                                                           schema["items"],
                                                            optional=False,
                                                            parents=parents + [name])
             if type(typ) is tuple:
                 typ = typ[0]
-            return (optionalize('Vec<' + typ + '>', optional), schema.get('description',
-                                                                          '')), structs + substructs, subenums
+            return (optionalize("Vec<" + typ + ">", optional), schema.get("description",
+                                                                          "")), structs + substructs, subenums
 
-        if schema['type'] == 'string':
+        if schema["type"] == "string":
 
             # Builds a line of a rust type
-            def build(intt, typ='String'):
-                return (optionalize(typ, optional), intt + ': ' + schema.get('description', '')), structs, enums
+            def build(intt, typ="String"):
+                return (optionalize(typ, optional), intt + ": " + schema.get("description", "")), structs, enums
 
-            if 'format' in schema:
-                if schema['format'] == 'int64':
-                    return build('i64')
-                if schema['format'] == 'int32':
-                    return build('i32')
-                if schema['format'] == 'uint64':
-                    return build('u64')
-                if schema['format'] == 'uint32':
-                    return build('u32')
-                if schema['format'] == 'double':
-                    return build('f64')
-                if schema['format'] == 'float':
-                    return build('f32')
-                if schema['format'] == 'date-time':
-                    return build('DateTime', typ='DateTime<Utc>')
+            if "format" in schema:
+                if schema["format"] == "int64":
+                    return build("i64")
+                if schema["format"] == "int32":
+                    return build("i32")
+                if schema["format"] == "uint64":
+                    return build("u64")
+                if schema["format"] == "uint32":
+                    return build("u32")
+                if schema["format"] == "double":
+                    return build("f64")
+                if schema["format"] == "float":
+                    return build("f32")
+                if schema["format"] == "date-time":
+                    return build("DateTime", typ="DateTime<Utc>")
 
-            if 'enum' in schema and name:
+            if "enum" in schema and name:
                 name_ = (sanitize_id(name))
 
                 def sanitize_enum_value(v):
+                    v = replace_keywords(capitalize_first(sanitize_id(v)))
                     if v[0].isnumeric():
-                        return '_' + v
-                    return v[0].upper() + v[1:]
+                        v = "_" + v
+                    return v
 
                 values = [{
-                    'line': sanitize_enum_value(ev),
-                    'jsonvalue': ev,
-                    'desc': schema.get('enumDescriptions', [''] * (i))[i]
-                } for (i, ev) in enumerate(schema.get('enum', []))]
-                templ_params = {'name': name_, 'values': values}
-                return (optionalize(name_, optional), schema.get('description', '')), structs, [templ_params]
+                    "line": sanitize_enum_value(ev),
+                    "jsonvalue": ev,
+                    "desc": schema.get("enumDescriptions", [""] * (i))[i]
+                } for (i, ev) in enumerate(schema.get("enum", []))]
+                templ_params = {"name": name_, "values": values}
+                return (optionalize(name_, optional), schema.get("description", "")), structs, [templ_params]
 
-            return (optionalize('String', optional), schema.get('description', '')), structs, enums
+            return (optionalize("String", optional), schema.get("description", "")), structs, enums
 
-        if schema['type'] == 'boolean':
-            return (optionalize('bool', optional), schema.get('description', '')), structs, enums
+        if schema["type"] == "boolean":
+            return (optionalize("bool", optional), schema.get("description", "")), structs, enums
 
-        if schema['type'] in ('number', 'integer'):
+        if schema["type"] in ("number", "integer"):
 
             def build(intt):
-                return (optionalize(intt, optional), schema.get('description', '')), structs, enums
+                return (optionalize(intt, optional), schema.get("description", "")), structs, enums
 
-            if schema['format'] == 'float':
-                return build('f32')
-            if schema['format'] == 'double':
-                return build('f64')
-            if schema['format'] == 'int32':
-                return build('i32')
-            if schema['format'] == 'int64':
-                return build('i64')
-            if schema['format'] == 'uint32':
-                return build('u32')
-            if schema['format'] == 'uint64':
-                return build('u64')
+            if schema["format"] == "float":
+                return build("f32")
+            if schema["format"] == "double":
+                return build("f64")
+            if schema["format"] == "int32":
+                return build("i32")
+            if schema["format"] == "int64":
+                return build("i64")
+            if schema["format"] == "uint32":
+                return build("u32")
+            if schema["format"] == "uint64":
+                return build("u64")
 
-        if schema['type'] == 'any':
-            return (optionalize('String', optional), 'ANY data: ' + schema.get('description', '')), structs, enums
+        if schema["type"] == "any":
+            return (optionalize("String", optional), "ANY data: " + schema.get("description", "")), structs, enums
 
-        raise Exception('unimplemented schema type!', name)
+        raise Exception("unimplemented schema type!", name)
     except KeyError as e:
-        print('KeyError while processing:', name)
+        print("KeyError while processing:", name)
         raise e
 
 
-def generate_params_structs(resources, super_name='', global_params=None):
+def generate_params_structs(resources, super_name="", global_params=None):
     """Generate parameter structs and enums from the resources list.
 
     Every resource usually has a set of parameters, which are translated into a
@@ -254,41 +257,41 @@
     structs = []
     enums = []
     for resourcename, resource in resources.items():
-        for methodname, method in resource.get('methods', {}).items():
+        for methodname, method in resource.get("methods", {}).items():
             param_type_name = snake_to_camel(super_name + capitalize_first(resourcename) +
-                                             capitalize_first(methodname) + 'Params')
+                                             capitalize_first(methodname) + "Params")
             print("processed:", resourcename, methodname, param_type_name)
             struct = {
-                'name': param_type_name,
-                'description': 'Parameters for the `{}.{}` method.'.format(resourcename, methodname),
-                'fields': []
+                "name": param_type_name,
+                "description": "Parameters for the `{}.{}` method.".format(resourcename, methodname),
+                "fields": []
             }
             req_query_parameters = []
             opt_query_parameters = []
             opt_time_query_parameters = []
             if global_params:
-                struct['fields'].append({
-                    'name': replace_keywords(rust_identifier(global_params)),
-                    'typ': optionalize(global_params, True),
-                    'attr': '#[serde(flatten)]',
-                    'comment': 'General attributes applying to any API call'
+                struct["fields"].append({
+                    "name": rust_identifier(global_params),
+                    "typ": optionalize(global_params, True),
+                    "attr": "#[serde(flatten)]",
+                    "comment": "General attributes applying to any API call"
                 })
             # Build struct dict for rendering.
-            if 'parameters' in method:
-                for paramname, param in method['parameters'].items():
+            if "parameters" in method:
+                for paramname, param in method["parameters"].items():
                     (typ, desc), substructs, subenums = parse_schema_types(capitalize_first(resourcename)+capitalize_first(methodname)+capitalize_first(paramname),
                             param, optional=False, parents=[])
                     enums.extend(subenums)
                     field = {
-                        'name': replace_keywords(rust_identifier(paramname)),
-                        'original_name': paramname,
-                        'typ': optionalize(typ, not param.get('required', False)),
-                        'comment': desc.replace('\n', ' '),
-                        'attr': '#[serde(rename = "{}")]'.format(paramname),
+                        "name": rust_identifier(paramname),
+                        "original_name": paramname,
+                        "typ": optionalize(typ, not param.get("required", False)),
+                        "comment": desc.replace('\n', ' '),
+                        "attr": "#[serde(rename = \"{}\")]".format(paramname),
                     }
-                    struct['fields'].append(field)
-                    if param.get('location', '') == 'query':
-                        if param.get('required', False):
+                    struct["fields"].append(field)
+                    if param.get("location", "") == "query":
+                        if param.get("required", False):
                             req_query_parameters.append(field)
                         else:
                             if 'DateTime' in field['typ']:
@@ -302,8 +305,8 @@
             frags.append(chevron.render(SchemaDisplayTmpl, struct))
             structs.append(struct)
         # Generate parameter types for subresources.
-        subfrags, subenums = generate_params_structs(resource.get('resources', {}),
-                super_name=super_name + '_' + resourcename,
+        subfrags, subenums = generate_params_structs(resource.get("resources", {}),
+                super_name=super_name + "_" + resourcename,
                 global_params=global_params)
         frags.extend(subfrags)
         enums.extend(subenums)
@@ -311,7 +314,7 @@
     return structs, enums
 
 
-def resolve_parameters(string, paramsname='params'):
+def resolve_parameters(string, paramsname="params"):
     """Returns a Rust syntax for formatting the given string with API
     parameters, and a list of (snake-case) API parameters that are used. This
     is typically used to format URL paths containing required parameters for an
@@ -320,13 +323,13 @@
     pat = re.compile('\{\+?(\w+)\}')
     params = re.findall(pat, string)
     snakeparams = [rust_identifier(p) for p in params]
-    format_params = ','.join([
-        '{}=percent_encode(format!("{{}}", {}.{}).as_bytes(), NON_ALPHANUMERIC)'.format(p, paramsname, sp)
+    format_params = ",".join([
+        "{}=percent_encode(format!(\"{{}}\", {}.{}).as_bytes(), NON_ALPHANUMERIC)".format(p, paramsname, sp)
         for (p, sp) in zip(params, snakeparams)
     ])
-    string = string.replace('{+', '{')
+    string = string.replace("{+", "{")
     # Some required parameters are in the URL. This rust syntax formats the relative URL part appropriately.
-    return 'format!("{}", {})'.format(string, format_params), snakeparams
+    return "format!(\"{}\", {})".format(string, format_params), snakeparams
 
 
 def generate_service(resource, methods, discdoc, generate_subresources=True):
@@ -334,7 +337,7 @@
 
     Returns a rendered string with source code.
     """
-    service = capitalize_first(resource)
+    service = capitalize_first(snake_to_camel(rust_identifier(resource)))
     # Source code fragments implementing the methods.
     method_fragments = []
     # Source code fragments for impls of subordinate resources.
@@ -342,189 +345,189 @@
 
     # Generate methods for subresources.
     if generate_subresources:
-        for subresname, subresource in methods.get('resources', {}).items():
+        for subresname, subresource in methods.get("resources", {}).items():
             subresource_fragments.append(generate_service(service + capitalize_first(subresname), subresource, discdoc))
 
-    for methodname, method in methods.get('methods', {}).items():
+    for methodname, method in methods.get("methods", {}).items():
         # Goal: Instantiate the templates for upload and non-upload methods.
 
         # e.g. FilesGetParams
-        params_type_name = service + capitalize_first(methodname) + 'Params'
+        params_type_name = service + capitalize_first(methodname) + "Params"
         # All parameters that are optional (as URL parameters)
         parameters = {
             p: rust_identifier(p)
-            for p, pp in method.get('parameters', {}).items() if ('required' not in pp and pp['location'] != 'path')
+            for p, pp in method.get("parameters", {}).items() if ("required" not in pp and pp["location"] != "path")
         }
         # All required parameters not represented in the path.
         required_parameters = {
             p: rust_identifier(p)
-            for p, pp in method.get('parameters', {}).items() if ('required' in pp and pp['location'] != 'path')
+            for p, pp in method.get("parameters", {}).items() if ("required" in pp and pp["location"] != "path")
         }
         # Types of the function
-        in_type = method['request']['$ref'] if 'request' in method else None
-        out_type = method['response']['$ref'] if 'response' in method else '()'
+        in_type = method["request"]["$ref"] if "request" in method else None
+        out_type = method["response"]["$ref"] if "response" in method else "()"
 
-        is_download = method.get('supportsMediaDownload', False)
-        is_authd = 'scopes' in method
+        is_download = method.get("supportsMediaDownload", False)
+        is_authd = "scopes" in method
 
-        media_upload = method.get('mediaUpload', {})
+        media_upload = method.get("mediaUpload", {})
         supported_uploads = []
-        if 'simple' in media_upload.get('protocols', {}):
-            simple_upload_path = media_upload['protocols']['simple']['path']
-            supported_uploads.append('simple')
+        if "simple" in media_upload.get("protocols", {}):
+            simple_upload_path = media_upload["protocols"]["simple"]["path"]
+            supported_uploads.append("simple")
         else:
-            simple_upload_path = ''
-        if 'resumable' in media_upload.get('protocols', {}):
-            resumable_upload_path = media_upload['protocols']['resumable']['path']
-            supported_uploads.append('resumable')
+            simple_upload_path = ""
+        if "resumable" in media_upload.get("protocols", {}):
+            resumable_upload_path = media_upload["protocols"]["resumable"]["path"]
+            supported_uploads.append("resumable")
         else:
-            resumable_upload_path = ''
+            resumable_upload_path = ""
 
-        http_method = method['httpMethod']
-        has_global_params = 'parameters' in discdoc
+        http_method = method["httpMethod"]
+        has_global_params = "parameters" in discdoc
         # This relies on URL path parameters being required parameters (not
         # optional). If this invariant is not fulfilled, the Rust code may not
         # compile.
-        formatted_path, required_params = resolve_parameters(method['path'])
+        formatted_path, required_params = resolve_parameters(method["path"])
         formatted_simple_upload_path, required_params = resolve_parameters(simple_upload_path)
         formatted_resumable_upload_path, required_params = resolve_parameters(resumable_upload_path)
 
         # Guess default scope.
-        scopetype, scopeval = scopes_url_to_enum_val(discdoc['name'], method.get('scopes', [''])[-1])
-        scope_enum = scopetype + '::' + scopeval
+        scopetype, scopeval = scopes_url_to_enum_val(discdoc["name"], method.get("scopes", [""])[-1])
+        scope_enum = scopetype + "::" + scopeval
 
         if methodname == 'move':
             methodname = 'move_'
 
         if is_download:
             data_download = {
-                'name':
+                "name":
                 rust_identifier(methodname),
-                'param_type':
+                "param_type":
                 params_type_name,
-                'in_type':
+                "in_type":
                 in_type,
-                'download_in_type':
-                in_type if in_type else 'EmptyRequest',
-                'out_type':
+                "download_in_type":
+                in_type if in_type else "EmptyRequest",
+                "out_type":
                 out_type,
-                'base_path':
-                discdoc['baseUrl'],
-                'root_path':
-                discdoc['rootUrl'],
-                'rel_path_expr':
+                "base_path":
+                discdoc["baseUrl"],
+                "root_path":
+                discdoc["rootUrl"],
+                "rel_path_expr":
                 formatted_path,
-                'params': [{
-                    'param': p,
-                    'snake_param': sp
+                "params": [{
+                    "param": p,
+                    "snake_param": sp
                 } for (p, sp) in parameters.items()],
-                'required_params': [{
-                    'param': p,
-                    'snake_param': sp
+                "required_params": [{
+                    "param": p,
+                    "snake_param": sp
                 } for (p, sp) in required_parameters.items()],
-                'global_params_name':
-                rust_identifier(global_params_name(discdoc.get('name', ''))) if has_global_params else None,
-                'scopes': [{
-                    'scope': scope_enum,
+                "global_params_name":
+                rust_identifier(global_params_name(discdoc.get("name", ""))) if has_global_params else None,
+                "scopes": [{
+                    "scope": scope_enum,
                 }],
-                'description':
-                method.get('description', ''),
-                'http_method':
+                "description":
+                method.get("description", "").replace("\n", "\n/// "),
+                "http_method":
                 http_method,
-                'wants_auth':
+                "wants_auth":
                 is_authd,
             }
             method_fragments.append(chevron.render(DownloadMethodTmpl, data_download))
         else:
             data_normal = {
-                'name':
+                "name":
                 rust_identifier(methodname),
-                'param_type':
+                "param_type":
                 params_type_name,
-                'in_type':
+                "in_type":
                 in_type,
-                'out_type':
+                "out_type":
                 out_type,
-                'base_path':
-                discdoc['baseUrl'],
-                'root_path':
-                discdoc['rootUrl'],
-                'rel_path_expr':
+                "base_path":
+                discdoc["baseUrl"],
+                "root_path":
+                discdoc["rootUrl"],
+                "rel_path_expr":
                 formatted_path,
-                'params': [{
-                    'param': p,
-                    'snake_param': sp
+                "params": [{
+                    "param": p,
+                    "snake_param": sp
                 } for (p, sp) in parameters.items()],
-                'global_params_name':
-                rust_identifier(global_params_name(discdoc.get('name', ''))) if has_global_params else None,
-                'required_params': [{
-                    'param': p,
-                    'snake_param': sp
+                "global_params_name":
+                rust_identifier(global_params_name(discdoc.get("name", ""))) if has_global_params else None,
+                "required_params": [{
+                    "param": p,
+                    "snake_param": sp
                 } for (p, sp) in required_parameters.items()],
-                'scopes': [{
-                    'scope': scope_enum,
+                "scopes": [{
+                    "scope": scope_enum,
                 }],
-                'description':
-                method.get('description', ''),
-                'http_method':
+                "description":
+                method.get("description", "").replace("\n", "\n/// "),
+                "http_method":
                 http_method,
-                'wants_auth':
+                "wants_auth":
                 is_authd,
             }
             method_fragments.append(chevron.render(NormalMethodTmpl, data_normal))
 
         # We generate an additional implementation with the option of uploading data.
         data_upload = {
-            'name': rust_identifier(methodname),
-            'param_type': params_type_name,
-            'in_type': in_type,
-            'out_type': out_type,
-            'base_path': discdoc['baseUrl'],
-            'root_path': discdoc['rootUrl'],
-            'simple_rel_path_expr': formatted_simple_upload_path.lstrip('/'),
-            'resumable_rel_path_expr': formatted_resumable_upload_path.lstrip('/'),
-            'global_params_name':
-            rust_identifier(global_params_name(discdoc.get('name', ''))) if has_global_params else None,
-            'params': [{
-                'param': p,
-                'snake_param': sp
+            "name": rust_identifier(methodname),
+            "param_type": params_type_name,
+            "in_type": in_type,
+            "out_type": out_type,
+            "base_path": discdoc["baseUrl"],
+            "root_path": discdoc["rootUrl"],
+            "simple_rel_path_expr": formatted_simple_upload_path.lstrip("/"),
+            "resumable_rel_path_expr": formatted_resumable_upload_path.lstrip("/"),
+            "global_params_name":
+            rust_identifier(global_params_name(discdoc.get("name", ""))) if has_global_params else None,
+            "params": [{
+                "param": p,
+                "snake_param": sp
             } for (p, sp) in parameters.items()],
-            'required_params': [{
-                'param': p,
-                'snake_param': sp
+            "required_params": [{
+                "param": p,
+                "snake_param": sp
             } for (p, sp) in required_parameters.items()],
-            'scopes': [{
-                'scope': scope_enum,
+            "scopes": [{
+                "scope": scope_enum,
             }],
-            'description': method.get('description', ''),
-            'http_method': http_method,
-            'wants_auth': is_authd,
+            "description": method.get("description", "").replace("\n", "\n/// "),
+            "http_method": http_method,
+            "wants_auth": is_authd,
         }
-        if 'simple' in supported_uploads:
+        if "simple" in supported_uploads:
             method_fragments.append(chevron.render(UploadMethodTmpl, data_upload))
-        if 'resumable' in supported_uploads:
+        if "resumable" in supported_uploads:
             method_fragments.append(chevron.render(ResumableUploadMethodTmpl, data_upload))
 
     return chevron.render(
         ServiceImplementationTmpl, {
-            'service': service,
-            'name': capitalize_first(discdoc.get('name', '')),
-            'base_path': discdoc['baseUrl'],
-            'root_path': discdoc['rootUrl'],
-            'wants_auth': 'auth' in discdoc,
-            'methods': [{
-                'text': t
+            "service": service,
+            "name": capitalize_first(snake_to_camel(discdoc.get("name", ""))),
+            "base_path": discdoc["baseUrl"],
+            "root_path": discdoc["rootUrl"],
+            "wants_auth": "auth" in discdoc,
+            "methods": [{
+                "text": t
             } for t in method_fragments]
-        }) + '\n'.join(subresource_fragments)
+        }) + "\n".join(subresource_fragments)
 
 
 def scopes_url_to_enum_val(apiname, url):
-    split = url.split('/')
+    split = url.split("/")
     rawname = split[-1]
     if len(rawname) == 0 and len(split) > 1:
         rawname = split[-2]
-    fancy_name = snake_to_camel(rawname.replace('-', '_').replace('.', '_'))
-    return (snake_to_camel(apiname) + 'Scopes', fancy_name)
+    fancy_name = snake_to_camel(rawname.replace("-", "_").replace(".", "_"))
+    return (snake_to_camel(apiname) + "Scopes", fancy_name)
 
 
 def generate_scopes_type(name, scopes):
@@ -532,33 +535,50 @@
     containing { scope_url: { description: "..." } }.
     """
     if len(scopes) == 0:
-        return ''
-    parameters = {'scopes': []}
+        return ""
+    parameters = {"scopes": []}
     for url, desc in scopes.items():
         enum_type_name, fancy_name = scopes_url_to_enum_val(name, url)
-        parameters['name'] = enum_type_name
-        parameters['scopes'].append({'scope_name': fancy_name, 'desc': desc.get('description', ''), 'url': url})
+        parameters["name"] = enum_type_name
+        parameters["scopes"].append({"scope_name": fancy_name, "desc": desc.get("description", ""), "url": url})
     return chevron.render(OauthScopesType, parameters)
 
 
+def struct_inline_comments(s):
+    for field in s["fields"]:
+        if field.get("comment", None):
+            field["comment"] = field.get("comment", "").replace("\n", "\n/// ")
+    if s.get("desc", None):
+        s["desc"] = s.get("desc", "").replace("\n", "\n/// ")
+    if s.get("description", None):
+        s["description"] = s.get("description", "").replace("\n", "\n/// ")
+
+def enum_inline_comments(e):
+    for value in e.get("values", {}):
+        if value.get("desc", None):
+            value["desc"] = value.get("desc", "").replace("\n", "\n/// ")
+    for value in e.get("scopes", {}):
+        if value.get("desc", None):
+            value["desc"] = value.get("desc", "").replace("\n", "\n/// ")
+
 def generate_all(discdoc):
     """Generate all structs and impls, and render them into a file."""
-    print('Processing:', discdoc.get('id', ''))
-    schemas = discdoc.get('schemas', {})
-    resources = discdoc.get('resources', {})
+    print("Processing:", discdoc.get("id", ""))
+    schemas = discdoc.get("schemas", {})
+    resources = discdoc.get("resources", {})
     # Generate scopes.
-    scopes_type = generate_scopes_type(discdoc['name'], discdoc.get('auth', {}).get('oauth2', {}).get('scopes', {}))
+    scopes_type = generate_scopes_type(discdoc["name"], discdoc.get("auth", {}).get("oauth2", {}).get("scopes", {}))
 
     # Generate parameter types (*Params - those are used as "side inputs" to requests)
-    params_struct_name = global_params_name(discdoc.get('name'))
+    params_struct_name = global_params_name(discdoc.get("name"))
     parameter_types, parameter_enums = generate_params_structs(resources, global_params=params_struct_name)
 
     # Generate service impls.
     services = []
     for resource, methods in resources.items():
         services.append(generate_service(resource, methods, discdoc))
-    if 'methods' in discdoc:
-        services.append(generate_service('Global', discdoc, discdoc, generate_subresources=False))
+    if "methods" in discdoc:
+        services.append(generate_service("Global", discdoc, discdoc, generate_subresources=False))
 
     # Generate schema types.
     structs = []
@@ -569,62 +589,62 @@
         enums.extend(subenums)
 
     # Generate global parameters struct and its Display impl.
-    if 'parameters' in discdoc:
-        schema = {'type': 'object', 'properties': discdoc['parameters']}
+    if "parameters" in discdoc:
+        schema = {"type": "object", "properties": discdoc["parameters"]}
         name = replace_keywords(snake_to_camel(params_struct_name))
         typ, substructs, subenums = parse_schema_types(name, schema)
         for s in substructs:
-            s['optional_fields'] = s['fields']
+            s["optional_fields"] = s["fields"]
         parameter_types.extend(substructs)
         parameter_enums.extend(subenums)
 
     # Assemble everything into a file.
-    modname = (discdoc['id'] + '_types').replace(':', '_')
-    out_path = path.join('gen', modname + '.rs')
-    with open(out_path, 'w') as f:
+    modname = (discdoc["id"] + "_types").replace(":", "_")
+    out_path = path.join("gen", modname + ".rs")
+    with open(out_path, "w") as f:
         f.write(RustHeader)
         f.write(scopes_type)
         # Render resource structs.
         for s in structs:
-            for field in s['fields']:
-                if field.get('comment', None):
-                    field['comment'] = field.get('comment', '').replace('\n', ' ')
-                if field['name'] == 'self':
-                    field['name'] = 'self_'
-            if not s['name']:
-                print('WARN', s)
+            struct_inline_comments(s)
+            if not s["name"]:
+                print("WARN", s)
             f.write(chevron.render(SchemaStructTmpl, s))
         for e in enums:
+            enum_inline_comments(e)
             f.write(chevron.render(SchemaEnumTmpl, e))
         for e in parameter_enums:
+            enum_inline_comments(e)
             f.write(chevron.render(SchemaEnumTmpl, e))
         # Render *Params structs.
         for pt in parameter_types:
+            struct_inline_comments(pt)
             f.write(chevron.render(SchemaStructTmpl, pt))
             f.write(chevron.render(SchemaDisplayTmpl, pt))
         # Render service impls.
         for s in services:
             f.write(s)
     try:
-        subprocess.run(['rustfmt', out_path, '--edition=2018'])
+        subprocess.run(["rustfmt", out_path, "--edition=2018"])
     except:
         return
 
 
+
 def from_cache(apiId):
     try:
-        with open(path.join('cache', apiId + '.json'), 'r') as f:
-            print('Found API description in cache for', apiId)
+        with open(path.join("cache", apiId + ".json"), "r") as f:
+            print("Found API description in cache for", apiId)
             return json.load(f)
     except Exception as e:
-        print('Fetching description from cache failed:', e)
+        print("Fetching description from cache failed:", e)
         return None
 
 
 def to_cache(apiId, doc):
     try:
-        os.makedirs('cache', exist_ok=True)
-        with open(path.join('cache', apiId + '.json'), 'w') as f:
+        os.makedirs("cache", exist_ok=True)
+        with open(path.join("cache", apiId + ".json"), "w") as f:
             json.dump(doc, f)
     except Exception as e:
         print(e)
@@ -638,57 +658,57 @@
     Returns:
         List of API JSON documents.
     """
-    doc = from_cache('_global_discovery')
+    doc = from_cache("_global_discovery")
     if not doc:
         doc = json.loads(requests.get(url).text)
-        to_cache('_global_discovery', doc)
-    return [it for it in doc['items'] if (not apis or it['id'] in apis)]
+        to_cache("_global_discovery", doc)
+    return [it for it in doc["items"] if (not apis or it["id"] in apis)]
 
 
 def fetch_discovery_doc(url_or_path):
     """Fetch discovery document for a given (short) API doc from the overall discovery document."""
-    cachekey = url_or_path.replace('/', '_')
+    cachekey = url_or_path.replace("/", "_")
     cached = from_cache(cachekey)
     if cached:
         return cached
 
-    if url_or_path.startswith('http'):
+    if url_or_path.startswith("http"):
         js = json.loads(requests.get(url_or_path).text)
         to_cache(cachekey, js)
     else:
-        with open(url_or_path, 'r') as f:
+        with open(url_or_path, "r") as f:
             js = json.load(f)
     return js
 
 
 def main():
-    p = argparse.ArgumentParser(description='Generate Rust code for asynchronous REST Google APIs.')
-    p.add_argument('--discovery_base',
-                   default='https://www.googleapis.com/discovery/v1/apis',
-                   help='Base Discovery document.')
-    p.add_argument('--only_apis', default='drive:v3', help='Only process APIs with these IDs (comma-separated)')
-    p.add_argument('--doc', default='', help='Directly process Discovery document from this URL')
-    p.add_argument('--list', default=False, help='List available APIs', action='store_true')
+    p = argparse.ArgumentParser(description="Generate Rust code for asynchronous REST Google APIs.")
+    p.add_argument("--discovery_base",
+                   default="https://www.googleapis.com/discovery/v1/apis",
+                   help="Base Discovery document.")
+    p.add_argument("--apis", default="drive:v3", help="Only process APIs with these IDs (comma-separated)")
+    p.add_argument("--doc", default="", help="Directly process Discovery document from this URL")
+    p.add_argument("--list", default=False, help="List available APIs", action="store_true")
 
     args = p.parse_args()
 
-    if args.only_apis:
-        apilist = args.only_apis.split(',')
+    if args.apis:
+        apilist = args.apis.split(",")
     else:
         apilist = []
 
     if args.list:
         docs = fetch_discovery_base(args.discovery_base, [])
         for doc in docs:
-            print('API:', doc['title'], 'ID:', doc['id'])
+            print("API:", doc["title"], "ID:", doc["id"])
         return
 
     if args.doc:
         discdoc = fetch_discovery_doc(args.doc)
-        if 'error' in discdoc:
-            print('Error while fetching document for', doc['id'], ':', discdoc)
+        if "error" in discdoc:
+            print("Error while fetching document for", doc["id"], ":", discdoc)
             return
-        if 'methods' in discdoc:
+        if "methods" in discdoc:
             #raise NotImplementedError("top-level methods are not yet implemented properly. Please take care.")
             pass
         generate_all(discdoc)
@@ -698,18 +718,16 @@
 
     for doc in docs:
         try:
-            discdoc = fetch_discovery_doc(doc['discoveryRestUrl'])
-            if 'methods' in discdoc:
+            discdoc = fetch_discovery_doc(doc["discoveryRestUrl"])
+            if "methods" in discdoc:
                 raise NotImplementedError("top-level methods are not yet implemented properly. Please take care.")
-            if 'error' in discdoc:
-                print('Error while fetching document for', doc['id'], ':', discdoc)
+            if "error" in discdoc:
+                print("Error while fetching document for", doc["id"], ":", discdoc)
                 continue
             generate_all(discdoc)
         except Exception as e:
             print("Error while processing discovery doc")
-            raise e
             continue
 
-
-if __name__ == '__main__':
+if __name__ == "__main__":
     main()
--- a/generate/templates.py	Sun Feb 28 11:47:05 2021 -0500
+++ b/generate/templates.py	Mon Mar 01 06:51:13 2021 -0500
@@ -6,7 +6,7 @@
 //! (c) 2020 Lewin Bormann <lbo@spheniscida.de>
 //!
 //! ## Getting started
-//! 
+//!
 //! **Tip**: Take a look at those types ending in `...Service`. These represent API resources
 //! and contain methods to interact with an API. The remaining types are used by those methods
 //! and can be explored starting from a method you want to use.
@@ -30,8 +30,10 @@
 #[derive(Debug, Clone, Copy)]
 pub enum {{{name}}} {
     {{#scopes}}
+    {{#desc}}
     /// {{{desc}}}
     ///
+    {{/desc}}
     /// URL: {{{url}}}
     {{{scope_name}}},
     {{/scopes}}
@@ -57,7 +59,9 @@
 pub enum {{{name}}} {
     Undefined,
     {{#values}}
+    {{#desc}}
     /// {{{desc}}}
+    {{/desc}}
     #[serde(rename = "{{{jsonvalue}}}")]
     {{{line}}},
     {{/values}}
@@ -87,7 +91,9 @@
 # name
 # fields: [{name, comment, attr, typ}]
 SchemaStructTmpl = '''
+{{#description}}
 /// {{{description}}}
+{{/description}}
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct {{{name}}} {
 {{#fields}}
@@ -143,12 +149,12 @@
 }
 
 impl {{{service}}}Service {
-    /// Create a new {{service}}Service object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// Create a new {{{service}}}Service object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new
     {{#wants_auth}}<A: 'static + DerefAuth>
-    {{/wants_auth}}(client: TlsClient{{#wants_auth}}, auth: A{{/wants_auth}}) -> {{service}}Service {
+    {{/wants_auth}}(client: TlsClient{{#wants_auth}}, auth: A{{/wants_auth}}) -> {{{service}}}Service {
         {{{service}}}Service { client: client
             {{#wants_auth}}, authenticator: Box::new(auth), scopes: vec![]{{/wants_auth}},
             base_url: "{{{base_path}}}".into(), root_url: "{{{root_path}}}".into() }
@@ -207,7 +213,9 @@
 # params: [{param, snake_param}]
 # http_method
 NormalMethodTmpl = '''
+{{#description}}
 /// {{{description}}}
+{{/description}}
 pub async fn {{{name}}}(
     &self, params: &{{{param_type}}}
     {{#in_type}}, req: &{{{in_type}}}{{/in_type}}) -> Result<{{{out_type}}}> {
@@ -253,11 +261,13 @@
 # params: [{param, snake_param}]
 # http_method
 UploadMethodTmpl = '''
+{{#description}}
 /// {{{description}}}
 ///
+{{/description}}
 /// This method is a variant of `{{{name}}}()`, taking data for upload. It performs a multipart upload.
 pub async fn {{{name}}}_upload(
-    &self, params: &{{{param_type}}}, {{#in_type}}req: &{{{in_type}}},{{/in_type}} data: hyper::body::Bytes) -> Result<{{out_type}}> {
+    &self, params: &{{{param_type}}}, {{#in_type}}req: &{{{in_type}}},{{/in_type}} data: hyper::body::Bytes) -> Result<{{{out_type}}}> {
     let rel_path = {{{simple_rel_path_expr}}};
     let path = self.format_path(rel_path.as_str());
 
@@ -300,8 +310,10 @@
 # params: [{param, snake_param}]
 # http_method
 ResumableUploadMethodTmpl = '''
+{{#description}}
 /// {{{description}}}
 ///
+{{/description}}
 /// This method is a variant of `{{{name}}}()`, taking data for upload.
 /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
 /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
@@ -356,8 +368,10 @@
 # params: [{param, snake_param}]
 # http_method
 DownloadMethodTmpl = '''
+{{#description}}
 /// {{{description}}}
 ///
+{{/description}}
 /// This method potentially downloads data. See documentation of `Download`.
 pub async fn {{{name}}}<'a>(
     &'a self, params: &{{{param_type}}}, {{#in_type}}req: &'a {{{in_type}}}{{/in_type}})