changeset 208:d7f6e237b7ad

update youtube example
author Daniel Boline <ddboline@gmail.com>
date Mon, 22 Feb 2021 16:22:40 -0500
parents 3fda41657f19
children 23a0e172a3a5
files example_crates/youtube_example/src/youtube_v3_types.rs
diffstat 1 files changed, 17170 insertions(+), 17602 deletions(-) [+]
line wrap: on
line diff
--- a/example_crates/youtube_example/src/youtube_v3_types.rs	Mon Feb 22 16:22:03 2021 -0500
+++ b/example_crates/youtube_example/src/youtube_v3_types.rs	Mon Feb 22 16:22:40 2021 -0500
@@ -1,4 +1,4 @@
-#![allow(unused_variables, unused_mut, dead_code)]
+#![allow(unused_variables, unused_mut, dead_code, non_camel_case_types)]
 //! This file was generated by async-google-apis. (https://github.com/dermesser/async-google-apis)
 //!
 //! (c) 2020 Lewin Bormann <lbo@spheniscida.de>
@@ -21,2678 +21,107 @@
 /// Scopes of this API. Convertible to their string representation with `AsRef`.
 #[derive(Debug, Clone, Copy)]
 pub enum YoutubeScopes {
-    /// View and manage your assets and associated content on YouTube
-    ///
-    /// URL: https://www.googleapis.com/auth/youtubepartner
-    Youtubepartner,
-    /// See, edit, and permanently delete your YouTube videos, ratings, comments and captions
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube.force-ssl
-    YoutubeForceSsl,
+    /// 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
     YoutubepartnerChannelAudit,
-    /// 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 account
     ///
     /// 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
+    Youtubepartner,
 }
 
 impl std::convert::AsRef<str> for YoutubeScopes {
     fn as_ref(&self) -> &'static str {
         match self {
-            YoutubeScopes::Youtubepartner => "https://www.googleapis.com/auth/youtubepartner",
-            YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
-            YoutubeScopes::YoutubepartnerChannelAudit => {
-                "https://www.googleapis.com/auth/youtubepartner-channel-audit"
-            }
+            YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
+            YoutubeScopes::YoutubeUpload => "https://www.googleapis.com/auth/youtube.upload",
             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",
-        }
-    }
-}
-
-/// Details about the content to witch a subscription refers.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionContentDetails {
-    /// 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 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 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionListResponse {
-    #[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>,
-    /// 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>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// A list of subscriptions that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Subscription>>,
-    /// 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>,
+            YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
+            YoutubeScopes::Youtubepartner => "https://www.googleapis.com/auth/youtubepartner",
+        }
+    }
 }
 
 /// Details about a channelsection, including playlists and channels.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ChannelSectionContentDetails {
-    /// The channel ids for type multiple_channels.
-    #[serde(rename = "channels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channels: Option<Vec<String>>,
     /// The playlist ids for type single_playlist and multiple_playlists. For singlePlaylist, only one playlistId is allowed.
     #[serde(rename = "playlists")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub playlists: Option<Vec<String>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelListResponse {
-    /// 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>,
-    #[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>,
-    /// 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>>,
-    /// 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 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>,
-}
-
-///
-#[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>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventListResponse {
-    /// 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#superChatEventListResponse".
-    #[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>,
-    /// 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>>,
-    #[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>,
-}
-
-/// Basic details about a comment, such as its author and text.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentSnippet {
-    #[serde(rename = "authorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_id: Option<CommentSnippetAuthorChannelId>,
-    /// 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 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>,
-    /// 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 date and time when was last updated . The value is specified in ISO 8601 format.
-    #[serde(rename = "updatedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated_at: 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 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 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 date and time when the comment was orignally published. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: 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>,
-    /// 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 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 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 total number of likes this comment has received.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<u32>,
-    /// 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>,
-}
-
-/// JSON template for the status part of a channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelStatus {
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// 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 = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatFanFundingEventDetails {
-    /// 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>,
-    /// The currency in which the fund 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>,
-    /// u64: The amount of the fund.
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-}
-
-/// A *channel* resource contains information about a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Channel {
-    #[serde(rename = "contentOwnerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_owner_details: Option<ChannelContentOwnerDetails>,
-    #[serde(rename = "topicDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_details: Option<ChannelTopicDetails>,
-    #[serde(rename = "auditDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audit_details: Option<ChannelAuditDetails>,
-    /// 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>,
-    /// 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 = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ChannelSnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ChannelContentDetails>,
-    #[serde(rename = "conversionPings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conversion_pings: Option<ChannelConversionPings>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<ChannelStatistics>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<ChannelStatus>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "brandingSettings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub branding_settings: Option<ChannelBrandingSettings>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelLocalization>>,
-}
-
-/// 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>,
-}
-
-/// Describes information necessary for ingesting an RTMP or an HTTP stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct IngestionInfo {
-    /// 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 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 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>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistListResponse {
-    #[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 playlists that match the request criteria
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Playlist>>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// 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 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>,
-    /// 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 MembershipsLevelListResponse {
-    /// 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>,
-    /// 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>>,
-    /// 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>,
-}
-
-/// Branding properties for images associated with the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ImageSettings {
-    /// Banner image. Mobile size (640x175).
-    #[serde(rename = "bannerMobileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_image_url: Option<String>,
-    #[serde(rename = "smallBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_url: Option<LocalizedProperty>,
-    #[serde(rename = "largeBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_imap_script: 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 = "backgroundImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_image_url: Option<LocalizedProperty>,
-    /// Banner image. Desktop size (1060x175).
-    #[serde(rename = "bannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_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. 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>,
-    #[serde(rename = "smallBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
-    #[serde(rename = "largeBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_url: Option<LocalizedProperty>,
-    /// 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 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>,
-    /// This is used only in update requests; if it's set, we use this URL to generate all of the above banner URLs.
-    #[serde(rename = "bannerExternalUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_external_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>,
-    /// 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 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 low resolution (854x480).
-    #[serde(rename = "bannerTvLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_low_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 extra high resolution (2560x424).
-    #[serde(rename = "bannerTabletExtraHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_extra_hd_image_url: 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 LocalizedProperty {
-    #[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 = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<LanguageTag>,
-}
-
-/// Details about a social network post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSocial {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The author of the social network post.
-    #[serde(rename = "author")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author: Option<String>,
-    /// 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>,
-    /// 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 ChannelProfileDetails {
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventSnippet {
-    /// 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>,
-    #[serde(rename = "supporterDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub supporter_details: Option<ChannelProfileDetails>,
-    /// 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 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>,
-    /// 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 date and time when the event occurred. The value is specified in ISO 8601 format.
-    #[serde(rename = "createdAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub created_at: Option<String>,
-    /// Channel id where the event occurred.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "superStickerMetadata")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// The text contents of the comment left by the user.
-    #[serde(rename = "commentText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_text: Option<String>,
-    /// 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>,
-}
-
-/// 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 {
-    /// 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>,
-    #[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>,
-}
-
-/// 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 MemberListResponse {
-    /// 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 = "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>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// 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 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>,
-}
-
-/// 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<LiveChatModeratorSnippet>,
-    /// The ID that YouTube assigns to uniquely identify the moderator.
-    #[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#liveChatModerator".
-    #[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 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>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-/// A *liveChatMessage* resource represents a chat message in a YouTube Live Chat.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessage {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveChatMessageSnippet>,
-    /// 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>,
-    /// The ID that YouTube assigns to uniquely identify the message.
-    #[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 = "authorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_details: Option<LiveChatMessageAuthorDetails>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamConfigurationIssue {
-    /// The kind of error happening.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<LiveStreamConfigurationIssueType>,
-    /// How severe this issue is to the stream.
-    #[serde(rename = "severity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub severity: Option<LiveStreamConfigurationIssueSeverity>,
-    /// 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>,
-}
-
-/// Brief description of the live stream cdn settings.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CdnSettings {
-    /// 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>,
-    ///  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 resolution of the inbound video data.
-    #[serde(rename = "resolution")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resolution: Option<CdnSettingsResolution>,
-    #[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>,
-}
-
-/// Basic details about a video category, such as its localized title.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonSnippet {
-    /// 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>>,
-    /// The localized label belonging to this abuse report reason.
-    #[serde(rename = "label")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub label: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastListResponse {
-    /// 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 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>,
-    /// 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 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>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// A list of broadcasts that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveBroadcast>>,
-}
-
-/// 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 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 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 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>>,
-}
-
-/// 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>,
-}
-
-/// Project specific details about the content of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProjectDetails {
-    /// A list of project tags associated with the video during the upload.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<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>,
-}
-
-/// 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 = "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>,
-    /// 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#playlistItem".
-    #[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<PlaylistItemContentDetails>,
-}
-
-/// Basic details about a subscription's subscriber including title, description, channel ID and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionSubscriberSnippet {
-    /// 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>,
-    /// The description of the subscriber.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-/// Branding properties for the channel view.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSettings {
-    /// 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>,
-    /// Title for the featured channels tab.
-    #[serde(rename = "featuredChannelsTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_channels_title: 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>,
-    /// 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>,
-    /// 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>,
-    /// 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 list of featured channels.
-    #[serde(rename = "featuredChannelsUrls")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_channels_urls: Option<Vec<String>>,
-    /// Lists keywords associated with the channel, comma-separated.
-    #[serde(rename = "keywords")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub keywords: 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>,
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    /// Whether related channels should be proposed.
-    #[serde(rename = "showRelatedChannels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub show_related_channels: Option<bool>,
-    /// The country of the channel.
-    #[serde(rename = "country")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country: 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Entity {
-    #[serde(rename = "typeId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_id: Option<String>,
-    #[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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListResponse {
-    #[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>,
-    /// 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>,
-    /// 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>,
-    /// 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>,
-    /// Pagination information for token pagination.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<SearchResult>>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "regionCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_code: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRatingListResponse {
-    /// 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 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>,
-}
-
-/// 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>>,
-}
-
-/// 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>>,
-}
-
-/// 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 {
-    /// 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>,
-    /// 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>,
-}
-
-/// Stub token pagination template to suppress results.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TokenPagination {}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityListResponse {
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// 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>,
-    /// 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 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>>,
-    /// 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>,
-}
-
-/// 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 = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<PlaylistStatus>,
-    #[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>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
-    /// 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 = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistContentDetails>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistSnippet>,
-}
-
-/// Freebase topic information related to the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoTopicDetails {
-    /// 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 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>>,
-}
-
-/// 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>,
-    /// 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>,
-    /// ID of the item within the playlist.
-    #[serde(rename = "playlistItemId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_item_id: Option<String>,
-}
-
-/// 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 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 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 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 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 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 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 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 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 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>,
-}
-
-///
-#[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 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>,
-    #[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#videoCategoryListResponse".
-    #[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>,
-    /// 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 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>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: 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>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguageListResponse {
-    /// 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>,
-    /// 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>,
-}
-
-///
-#[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 = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<TestItemTestItemSnippet>,
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// 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>,
-}
-
-///
-#[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>,
-    /// 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>,
-    /// 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>,
-}
-
-///
-#[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 channels's avatar URL.
-    #[serde(rename = "profileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_image_url: Option<String>,
-    /// 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 channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: 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>,
-    /// The YouTube channel ID.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: 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>,
-    /// The channel's display name.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionListResponse {
-    /// 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 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>,
-}
-
-///
-#[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 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>,
-    /// 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>,
-    /// 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 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>,
-    /// 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>>,
-    /// 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>,
-}
-
-/// 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>,
-    /// 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>,
-    /// 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>,
-    /// 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>,
-    /// Priority of the live broadcast event (internal state).
-    #[serde(rename = "liveBroadcastPriority")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_priority: Option<LiveBroadcastStatusLiveBroadcastPriority>,
-}
-
-/// An *i18nLanguage* resource identifies a UI language currently supported by YouTube.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguage {
-    /// 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>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<I18nLanguageSnippet>,
-}
-
-///
-#[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 = "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>,
-    /// 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#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>,
-    /// 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 PlaylistContentDetails {
-    /// The number of videos in the playlist.
-    #[serde(rename = "itemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub item_count: Option<u32>,
-}
-
-///
-#[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 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>,
-    /// 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 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 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 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorListResponse {
-    #[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>,
-    /// 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>,
-    /// 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>,
-    /// A list of moderators that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatModerator>>,
-    #[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>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemContentDetails {
-    /// The date and time that the video was published to YouTube. The value is specified in ISO 8601 format.
-    #[serde(rename = "videoPublishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_published_at: Option<String>,
-    /// 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>,
-    /// The ID that YouTube uses to uniquely identify a video. To retrieve the video resource, set the id query parameter to this value in your API request.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// The time, measured in seconds from the start of the video, when the video should start 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.) The default value is 0.
-    #[serde(rename = "startAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start_at: Option<String>,
-    /// A user-generated note for this item.
-    #[serde(rename = "note")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub note: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportSecondaryReason {
-    /// The ID of this abuse report secondary reason.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// The localized label for this abuse report secondary reason.
-    #[serde(rename = "label")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub label: Option<String>,
-}
-
-/// Information about a video stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetailsVideoStream {
-    /// 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>,
-    /// The video codec that the stream uses.
-    #[serde(rename = "codec")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub codec: Option<String>,
-    /// The encoded video content's height in pixels.
-    #[serde(rename = "heightPixels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height_pixels: Option<u32>,
-    /// 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>,
-    /// 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 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>,
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperChatDetails {
-    /// 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 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>,
-    /// 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>,
-}
-
-///
-#[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>>,
-    /// 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>,
-    /// 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>,
-}
-
-/// 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>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<MemberSnippet>,
-}
-
-/// 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 {
-    /// 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.
-    #[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#caption".
-    #[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<CaptionSnippet>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBanSnippet {
-    #[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 typ: 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>,
-    /// The chat this ban is pertinent to.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_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 {
-    /// 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>,
-    /// The date and time of when the channel was linked to the content owner. The value is specified in ISO 8601 format.
-    #[serde(rename = "timeLinked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_linked: Option<String>,
-}
-
-/// A *comment* represents a single YouTube comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Comment {
-    /// The ID that YouTube uses to uniquely identify the comment.
-    #[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<CommentSnippet>,
-    /// 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>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<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 {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ThirdPartyLinkSnippet>,
-    /// 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>,
-    /// 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#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>,
+    /// The channel ids for type multiple_channels.
+    #[serde(rename = "channels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    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 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 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 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 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestItemTestItemSnippet {}
-
-/// 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>,
-    /// The date and time when the video was recorded. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sssZ) format.
-    #[serde(rename = "recordingDate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_date: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageSnippet {
-    #[serde(rename = "fanFundingEventDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fan_funding_event_details: Option<LiveChatFanFundingEventDetails>,
-    /// 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 = "superStickerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_details: Option<LiveChatSuperStickerDetails>,
-    /// 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 = "superChatDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_chat_details: Option<LiveChatSuperChatDetails>,
-    /// The date and time when the message was orignally published. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    #[serde(rename = "userBannedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_banned_details: Option<LiveChatUserBannedMessageDetails>,
-    #[serde(rename = "textMessageDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_message_details: Option<LiveChatTextMessageDetails>,
-    #[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 typ: Option<LiveChatMessageSnippetType>,
-    #[serde(rename = "messageDeletedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_deleted_details: Option<LiveChatMessageDeletedDetails>,
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionListResponse {
-    /// 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#channelSectionListResponse".
-    #[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>,
-    /// A list of ChannelSections that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<ChannelSection>>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// 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: 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 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>,
-}
-
-/// 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 = "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 = "playlistItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_item: Option<ActivityContentDetailsPlaylistItem>,
-    #[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>,
-    #[serde(rename = "like")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like: Option<ActivityContentDetailsLike>,
-    #[serde(rename = "bulletin")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bulletin: Option<ActivityContentDetailsBulletin>,
-    #[serde(rename = "recommendation")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recommendation: Option<ActivityContentDetailsRecommendation>,
-    #[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>,
-}
-
-/// 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 {
-    /// 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#videoCategory".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: 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>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoCategorySnippet>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistSnippet {
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<PlaylistLocalization>,
-    /// The playlist's description.
-    #[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 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>,
-    /// 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>,
-    /// The date and time that the playlist was created. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// Keyword tags associated with the playlist.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<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>,
-}
-
-/// 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>,
-}
-
-///
-#[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>,
-}
-
-/// 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>,
-    /// 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>,
-    /// 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>,
-    #[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 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>,
-}
-
-///
-#[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>,
-    /// 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>,
-    /// 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>,
-}
-
-/// 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>>,
-}
-
-/// 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 {
-    /// Channel title for the channel responsible for this activity
-    #[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 date and time that the video was uploaded. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// 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 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>,
-    /// 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>,
-    /// The title of the resource primarily associated with the activity.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub 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>,
-}
-
-/// Basic details about an i18n region, such as region code and human-readable name.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionSnippet {
-    /// The region code as a 2-letter ISO country code.
-    #[serde(rename = "gl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub gl: Option<String>,
-    /// The human-readable name of the region.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct RelatedEntity {
-    #[serde(rename = "entity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub entity: Option<Entity>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReport {
-    /// 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>,
-    /// 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 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>,
-}
-
-///
-#[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 VideoListResponse {
-    /// 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>,
-    /// 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 = "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>,
-    /// 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>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails. Basic details of a YouTube Playlist item provided by the author. Next ID: 13
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemSnippet {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// 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 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 title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub 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>,
-    /// The item's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The date and time that the item was added to the playlist. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-/// 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>,
-    /// 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 videos uploaded to the channel.
-    #[serde(rename = "videoCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_count: Option<String>,
-    /// u64: The number of comments for the channel.
+    /// 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>,
 }
 
-///
-#[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>,
-}
-
-/// 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.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastStatistics {
-    /// u64: The total number of live chat messages currently on the broadcast. The property and its value will be present if the broadcast is public, has the live chat feature enabled, and has at least one message. Note that this field will not be filled after the broadcast ends. So this property would not identify the number of chat messages for an archived video of a completed live broadcast.
-    #[serde(rename = "totalChatCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_chat_count: 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>,
-}
-
-/// 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>,
-}
-
-/// 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>,
-    /// 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 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>,
-}
-
-///
-#[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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDurationAtLevel {
-    /// 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>,
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSection {
-    #[serde(rename = "targeting")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub targeting: Option<ChannelSectionTargeting>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelSectionLocalization>>,
-    /// 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>,
-    /// 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>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ChannelSectionSnippet>,
+/// 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.
@@ -2707,45 +136,344 @@
     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.
+    #[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.
+    #[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>>,
+}
+
+/// 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.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastStatistics {
+    /// u64: The total number of live chat messages currently on the broadcast. The property and its value will be present if the broadcast is public, has the live chat feature enabled, and has at least one message. Note that this field will not be filled after the broadcast ends. So this property would not identify the number of chat messages for an archived video of a completed live broadcast.
+    #[serde(rename = "totalChatCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    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 {
+    #[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".
+    #[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>,
+}
+
+/// 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>,
+}
+
 /// Basic details about a caption track, such as its language and name.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CaptionSnippet {
-    /// The date and time when the caption track was last updated. The value is specified in ISO 8601 format.
-    #[serde(rename = "lastUpdated")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub last_updated: Option<String>,
-    /// 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>,
-    /// 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 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 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 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>,
-    /// 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 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 type of audio track associated with the caption track.
-    #[serde(rename = "audioTrackType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audio_track_type: Option<CaptionSnippetAudioTrackType>,
+    /// 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 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")]
@@ -2754,183 +482,665 @@
     #[serde(rename = "name")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub name: Option<String>,
-    /// 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>,
-    /// The caption track's status.
+    /// The type of audio track associated with the caption track.
+    #[serde(rename = "audioTrackType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub audio_track_type: Option<CaptionSnippetAudioTrackType>,
+}
+
+/// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentDetailsRelatedPlaylists {
+    /// 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.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentDetails {
+    #[serde(rename = "relatedPlaylists")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    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
     #[serde(rename = "status")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<CaptionSnippetStatus>,
-}
-
-/// 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>,
+    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>,
+}
+
+///
+#[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")]
+    pub note: Option<String>,
+    /// The ID that YouTube uses to uniquely identify a video. To retrieve the video resource, set the id query parameter to this value in your API request.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The time, measured in seconds from the start of the video, when the video should start 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.) The default value is 0.
+    #[serde(rename = "startAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub start_at: Option<String>,
+    /// DateTime: The date and time that the video was published to YouTube.
+    #[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 {
+    /// 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".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// 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 = "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>,
+    #[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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEventSnippet {
+    /// 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>,
+    #[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>,
+    /// DateTime: The date and time when the event occurred.
+    #[serde(rename = "createdAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub created_at: Option<DateTime<Utc>>,
+    /// The text contents of the comment left by the user.
+    #[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>,
+    /// 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".
+    #[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<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".
+    #[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 comment.
+    #[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>,
-    /// The time that the broadcast actually started. The value is specified in ISO 8601 format. 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<String>,
-    /// The time that the broadcast is scheduled to end. The value is specified in ISO 8601 format. If the value is empty or the property is not present, then the broadcast is scheduled to continue indefinitely.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<String>,
-    /// The time that the broadcast actually ended. The value is specified in ISO 8601 format. This value will not be available until the broadcast is over.
+    /// 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<String>,
-    /// The time that the broadcast is scheduled to begin. The value is specified in ISO 8601 format.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SponsorSnippet {
-    /// The cumulative time a user has been a sponsor in months.
-    #[serde(rename = "cumulativeDurationMonths")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cumulative_duration_months: Option<i32>,
-    #[serde(rename = "sponsorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sponsor_details: Option<ChannelProfileDetails>,
-    /// The id of the channel being sponsored.
+    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 = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
-    /// The date and time when the user became a sponsor. The value is specified in ISO 8601 (`YYYY-MM-DDThh:mm:ss.sZ`) format.
-    #[serde(rename = "sponsorSince")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sponsor_since: Option<String>,
-}
-
-/// A thumbnail is an image representing a YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Thumbnail {
-    /// 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>,
-    /// (Optional) Width of the thumbnail image.
-    #[serde(rename = "width")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub width: Option<u32>,
-}
-
-/// A *i18nRegion* resource identifies a region where YouTube is available.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegion {
-    /// 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>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<I18nRegionSnippet>,
-    /// 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>,
-}
-
-/// 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>,
-    /// 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>,
-    #[serde(rename = "cdn")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cdn: Option<CdnSettings>,
-    /// 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>,
-}
-
-/// 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 length of the uploaded video in milliseconds.
-    #[serde(rename = "durationMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub duration_ms: Option<String>,
-    /// 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>,
-    /// 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>,
-    /// 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>,
-    /// 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>>,
-    /// 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>,
-    /// 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>>,
 }
 
 ///
@@ -2940,6 +1150,13 @@
     #[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")]
@@ -2948,549 +1165,198 @@
     #[serde(rename = "tier")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub tier: Option<u32>,
-    #[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>,
-}
-
-/// 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>,
-}
-
-/// 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>,
-}
-
-/// Basic details about a video, including title, description, uploader, thumbnails and category.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSnippet {
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// 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 date and time that the video was uploaded. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: 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>,
-    /// 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 YouTube video category associated with the video.
-    #[serde(rename = "categoryId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub category_id: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<VideoLocalization>,
-    /// The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.
+}
+
+/// 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 video's description. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// 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>,
-    /// 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>,
-    /// The language of the videos's default snippet.
+    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDuration {
-    /// 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>,
-    /// 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>,
-}
-
-/// Information that identifies the recommended resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsRecommendation {
+    #[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 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>,
-}
-
-/// Details about the content of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoContentDetails {
-    #[serde(rename = "countryRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country_restriction: Option<AccessPolicy>,
-    /// 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 captions indicates whether the video has captions or not.
-    #[serde(rename = "caption")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub caption: Option<VideoContentDetailsCaption>,
-    /// 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 = "contentRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_rating: Option<ContentRating>,
-    /// 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>,
-    #[serde(rename = "regionRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
-    /// 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>,
-    /// 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>,
-}
-
-/// Internal representation of thumbnails for a YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThumbnailDetails {
-    #[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>,
-    #[serde(rename = "medium")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub medium: Option<Thumbnail>,
-    #[serde(rename = "default")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default: Option<Thumbnail>,
-    #[serde(rename = "maxres")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub maxres: Option<Thumbnail>,
-}
-
-/// Brief description of the live stream status.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamStatus {
-    #[serde(rename = "streamStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stream_status: Option<LiveStreamStatusStreamStatus>,
-    #[serde(rename = "healthStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub health_status: Option<LiveStreamHealthStatus>,
-}
-
-/// Basic details about a video category, such as its localized title. Next Id: 17
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoStatus {
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-    /// The status of the uploaded video.
-    #[serde(rename = "uploadStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload_status: Option<VideoStatusUploadStatus>,
-    /// 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. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub publish_at: Option<String>,
-    /// 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>,
-    /// 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>,
-    /// 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 video's license. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "license")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub license: Option<VideoStatusLicense>,
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// 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>,
-    /// The video's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<VideoStatusPrivacyStatus>,
-}
-
-///
-#[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 = "subject")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subject: Option<Entity>,
+    /// 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 {
+    /// The keyword tag suggested for the video.
+    #[serde(rename = "tag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag: Option<String>,
+    /// A set of video categories for which the tag is relevant. You can use this information to display appropriate tag suggestions based on the video category that the video uploader associates with the video. By default, tag suggestions are relevant for all categories if there are no restricts defined for the keyword.
+    #[serde(rename = "categoryRestricts")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    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 = "relatedEntities")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub related_entities: Option<Vec<RelatedEntity>>,
-}
-
-///
-#[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>,
-}
-
-/// 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>,
-    /// 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>,
-    /// 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 channel. This property is only present if the resourceId.kind value is youtube#channel.
+    #[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>,
-    /// 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>,
-}
-
-/// A `__sponsor__` resource represents a sponsor for a YouTube channel. A sponsor provides recurring monetary support to a creator and receives special benefits.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Sponsor {
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#sponsor"`.
-    #[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<SponsorSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// 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 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 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>,
-}
-
-/// 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.
+    /// 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<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>,
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageListResponse {
-    /// 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>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The date and time when the underlying stream went offline. The value is specified in ISO 8601 format.
-    #[serde(rename = "offlineAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub offline_at: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatMessage>>,
-    #[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>,
-    /// 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 SponsorListResponse {
-    #[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>,
-    /// 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#sponsorListResponse".
-    #[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 next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: 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>,
-    /// A list of sponsors that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Sponsor>>,
-}
-
-/// 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>,
-}
-
-///
-#[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>,
-    #[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>,
-    #[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>,
-    /// 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 comment threads that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<CommentThread>>,
-}
-
-/// ChannelSection targeting setting.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionTargeting {
-    /// 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>>,
-    /// The language the channel section is targeting.
-    #[serde(rename = "languages")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub languages: 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MemberSnippet {
-    #[serde(rename = "membershipsDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_details: Option<MembershipsDetails>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonListResponse {
-    /// 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>>,
-    /// 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#videoAbuseReportReasonListResponse"`.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
+    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.
@@ -3510,13 +1376,432 @@
     pub embed_height: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionListResponse {
+/// 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".
+    #[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>,
+    /// 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 {
+    /// 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")]
@@ -3525,6 +1810,157 @@
     #[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")]
@@ -3533,852 +1969,833 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-}
-
-/// Basic details about a channel section, including title, style and position.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionSnippet {
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<ChannelSectionLocalization>,
-    /// 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 position of the channel section in the channel.
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<u32>,
-    /// 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>,
-    /// The style of the channel section.
-    #[serde(rename = "style")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub style: Option<ChannelSectionSnippetStyle>,
-    /// The type of the channel section.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ChannelSectionSnippetType>,
-}
-
-/// 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 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 details.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The date and time that the subscription was created. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: 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>,
-}
-
-///
-#[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>,
-}
-
-/// 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 = "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<CommentThreadSnippet>,
-    /// The ID that YouTube uses to uniquely identify the comment thread.
+    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 = "replies")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub replies: Option<CommentThreadReplies>,
-    /// 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 = "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 = "fileDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_details: Option<VideoFileDetails>,
-    #[serde(rename = "projectDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub project_details: Option<VideoProjectDetails>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
     #[serde(rename = "topicDetails")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub topic_details: Option<VideoTopicDetails>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<VideoStatistics>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<VideoContentDetails>,
-    #[serde(rename = "suggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub suggestions: Option<VideoSuggestions>,
-    #[serde(rename = "processingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_details: Option<VideoProcessingDetails>,
-    #[serde(rename = "monetizationDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monetization_details: Option<VideoMonetizationDetails>,
-    /// 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 = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoSnippet>,
-    /// 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 = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<VideoStatus>,
-    #[serde(rename = "liveStreamingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
-    #[serde(rename = "ageGating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub age_gating: Option<VideoAgeGating>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<VideoPlayer>,
-}
-
-/// Information about a channel that a user subscribed to.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSubscription {
+}
+
+/// 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>>,
+}
+
+/// A `__liveChatBan__` resource represents a ban for a YouTube live chat.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBan {
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#liveChatBan"`.
+    #[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<LiveChatBanSnippet>,
+    /// 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 ban.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    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 {
+    /// 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>,
+    /// 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".
+    #[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>,
+    #[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>>,
+    /// 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>>,
+    /// 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#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 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>,
-    /// 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>,
     /// 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>,
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<InvideoPosition>,
+    /// 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>,
-}
-
-/// Detailed settings of a broadcast.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastContentDetails {
-    /// 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>,
-    /// Indicates whether this broadcast has low latency enabled.
-    #[serde(rename = "enableLowLatency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_low_latency: Option<bool>,
-    /// 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>,
-    /// 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>,
-    /// 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<String>,
-    /// 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>,
-    /// 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>,
-    /// 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>,
-    #[serde(rename = "closedCaptionsType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
-    /// 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 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>,
-    #[serde(rename = "monitorStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monitor_stream: Option<MonitorStreamInfo>,
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelContentDetailsRelatedPlaylists {
-    /// 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 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 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 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 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>,
-}
-
-/// Details about the content of a channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelContentDetails {
-    #[serde(rename = "relatedPlaylists")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub related_playlists: Option<ChannelContentDetailsRelatedPlaylists>,
-}
-
-/// 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 = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ActivitySnippet>,
-    /// The ID that YouTube uses to uniquely identify the activity.
+    #[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>,
-    /// 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>,
-    /// 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<ActivityContentDetails>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamSnippet {
-    /// 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>,
-    /// 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 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>,
-    #[serde(rename = "isDefaultStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_default_stream: Option<bool>,
-    /// The date and time that the stream was created. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: 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 {
-    /// 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.
+    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>,
-    #[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>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveBroadcastContentDetails>,
-    #[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>,
-}
-
-/// 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 {
-    /// 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".
+    /// 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<MembershipsLevelSnippet>,
-}
-
-/// Basic broadcast information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastSnippet {
-    /// 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>,
-    /// 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>,
-    /// The date and time that the broadcast actually started. This information is only available once the broadcast's state is live. The value is specified in ISO 8601 format.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<String>,
-    /// The date and time that the broadcast is scheduled to end. The value is specified in ISO 8601 format.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<String>,
-    /// 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>,
-    /// The date and time that the broadcast was added to YouTube's live broadcast schedule. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// 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>,
-    /// The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete. The value is specified in ISO 8601 format.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// 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 date and time that the broadcast is scheduled to start. The value is specified in ISO 8601 format.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: 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 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 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 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 in Greece.
-    #[serde(rename = "grfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub grfilm_rating: Option<ContentRatingGrfilmRating>,
-    /// 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 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 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 in Switzerland.
-    #[serde(rename = "chfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub chfilm_rating: Option<ContentRatingChfilmRating>,
-    /// 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>,
-    /// 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 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 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 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 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 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 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 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 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 Ireland's Raidió Teilifís Éireann.
-    #[serde(rename = "rteRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rte_rating: Option<ContentRatingRteRating>,
-    /// 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 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 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 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 Estonia.
-    #[serde(rename = "eefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub eefilm_rating: Option<ContentRatingEefilmRating>,
-    /// 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 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 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 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 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 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 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 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 Iceland.
-    #[serde(rename = "smaisRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub smais_rating: Option<ContentRatingSmaisRating>,
-    /// 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 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 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 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 in the Czech Republic.
-    #[serde(rename = "czfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub czfilm_rating: Option<ContentRatingCzfilmRating>,
-    /// 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 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 in Israel.
-    #[serde(rename = "ilfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ilfilm_rating: Option<ContentRatingIlfilmRating>,
-    /// 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 rating in Peru.
-    #[serde(rename = "pefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pefilm_rating: Option<ContentRatingPefilmRating>,
-    /// 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 in Egypt.
-    #[serde(rename = "egfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub egfilm_rating: Option<ContentRatingEgfilmRating>,
-    /// 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 in Slovakia.
-    #[serde(rename = "skfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub skfilm_rating: Option<ContentRatingSkfilmRating>,
-    /// 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 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 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>,
-    /// 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 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 Ministerio de Cultura (Colombia) rating.
-    #[serde(rename = "mocRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moc_rating: Option<ContentRatingMocRating>,
-    /// 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 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 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 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 from Nigeria's National Film and Video Censors Board.
-    #[serde(rename = "nfvcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nfvcb_rating: Option<ContentRatingNfvcbRating>,
-    /// 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 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>,
-    /// 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>,
-    /// Rating system in France - Commission de classification cinematographique
-    #[serde(rename = "cncRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cnc_rating: Option<ContentRatingCncRating>,
-    /// 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 Consejo de Calificación Cinematográfica (Chile) rating.
-    #[serde(rename = "cccRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ccc_rating: Option<ContentRatingCccRating>,
-    /// 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 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 in Venezuela.
-    #[serde(rename = "resorteviolenciaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resorteviolencia_rating: Option<ContentRatingResorteviolenciaRating>,
-    /// The video's TV Parental Guidelines (TVPG) rating.
-    #[serde(rename = "tvpgRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tvpg_rating: Option<ContentRatingTvpgRating>,
-}
-
-/// A `__liveChatBan__` resource represents a ban for a YouTube live chat.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBan {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveChatBanSnippet>,
+    pub snippet: Option<SuperChatEventSnippet>,
     /// 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#liveChatBan"`.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the ban.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// Branding properties of a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelBrandingSettings {
-    #[serde(rename = "watch")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch: Option<WatchSettings>,
-    /// 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 = "image")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image: Option<ImageSettings>,
-}
-
-/// 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 {
-    /// Defines the position type.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<InvideoPositionType>,
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamHealthStatus {
-    /// 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
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveStreamHealthStatusStatus>,
-    /// The configurations issues on this stream
-    #[serde(rename = "configurationIssues")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
-}
-
-/// 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>,
-    #[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>,
-    /// A description of the search result.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// 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>,
-    /// The title of the search result.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The creation date and time of the resource that the search result identifies. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemListResponse {
-    /// 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>>,
+}
+
+/// 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")]
+    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>,
@@ -4393,6 +2810,93 @@
     #[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")]
@@ -4401,13 +2905,1038 @@
     #[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#playlistItemListResponse". Etag of this resource.
+    #[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")]
+    pub next_page_token: Option<String>,
+    #[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".
+    #[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>,
+    #[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.
+    #[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>,
+    /// 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.
+    #[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>,
+}
+
+/// 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>,
+    #[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 = "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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportSecondaryReason {
+    /// The localized label for this abuse report secondary reason.
+    #[serde(rename = "label")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub label: Option<String>,
+    /// The ID of this abuse report secondary reason.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    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 {
+    #[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>,
+    /// 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>,
 }
 
 ///
@@ -4419,52 +3948,59 @@
     pub display_name: Option<String>,
 }
 
-/// Freebase topic information related to the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelTopicDetails {
-    /// 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>>,
-    /// 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 *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>,
-    /// 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<SubscriptionSnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<SubscriptionContentDetails>,
+///
+#[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 {
-    /// 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>,
     /// The number of audio channels that the stream contains.
     #[serde(rename = "channelCount")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -4473,50 +4009,456 @@
     #[serde(rename = "codec")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub codec: 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>,
-}
-
-/// A single tag suggestion with it's relevance information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSuggestionsTagSuggestion {
-    /// The keyword tag suggested for the video.
-    #[serde(rename = "tag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tag: Option<String>,
-    /// A set of video categories for which the tag is relevant. You can use this information to display appropriate tag suggestions based on the video category that the video uploader associates with the video. By default, tag suggestions are relevant for all categories if there are no restricts defined for the keyword.
-    #[serde(rename = "categoryRestricts")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub category_restricts: Option<Vec<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>,
-    /// Longitude in degrees.
-    #[serde(rename = "longitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub longitude: Option<f64>,
-    /// Latitude in degrees.
-    #[serde(rename = "latitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub latitude: Option<f64>,
-}
-
-/// 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.
+    /// 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`.
+    #[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>,
+    /// 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.
+    #[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>,
@@ -4524,45 +4466,43 @@
 
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseType {
+pub struct TestItem {
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-}
-
-/// Basic details about a channel, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSnippet {
-    /// The date and time that the channel was created. The value is specified in < a href="//www.w3.org/TR/NOTE-datetime">ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<ChannelLocalization>,
-    /// 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 description of the channel.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The channel's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The country of the channel.
-    #[serde(rename = "country")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country: Option<String>,
-    /// The custom url of the channel.
-    #[serde(rename = "customUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub custom_url: 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>,
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
@@ -4600,68 +4540,456 @@
 }
 
 #[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"),
+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.
+    #[serde(rename = "channelToStoreLink")]
+    ChannelToStoreLink,
+}
+
+impl std::default::Default for ThirdPartyLinkSnippetType {
+    fn default() -> ThirdPartyLinkSnippetType {
+        ThirdPartyLinkSnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinkSnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinkSnippetType::Undefined => write!(f, "undefined"),
+            ThirdPartyLinkSnippetType::LinkUnspecified => write!(f, "linkUnspecified"),
+            ThirdPartyLinkSnippetType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSuggestionsProcessingWarnings {
+    Undefined,
+    /// Unrecognized file format, transcoding is likely to fail.
+    #[serde(rename = "unknownContainer")]
+    UnknownContainer,
+    /// Unrecognized video codec, transcoding is likely to fail.
+    #[serde(rename = "unknownVideoCodec")]
+    UnknownVideoCodec,
+    /// Unrecognized audio codec, transcoding is likely to fail.
+    #[serde(rename = "unknownAudioCodec")]
+    UnknownAudioCodec,
+    /// Conflicting container and stream resolutions.
+    #[serde(rename = "inconsistentResolution")]
+    InconsistentResolution,
+    /// Edit lists are not currently supported.
+    #[serde(rename = "hasEditlist")]
+    HasEditlist,
+    /// Video codec that is known to cause problems was used.
+    #[serde(rename = "problematicVideoCodec")]
+    ProblematicVideoCodec,
+    /// Audio codec that is known to cause problems was used.
+    #[serde(rename = "problematicAudioCodec")]
+    ProblematicAudioCodec,
+    /// Unsupported VR video stereo mode.
+    #[serde(rename = "unsupportedVrStereoMode")]
+    UnsupportedVrStereoMode,
+    /// Unsupported spherical video projection type.
+    #[serde(rename = "unsupportedSphericalProjectionType")]
+    UnsupportedSphericalProjectionType,
+    /// Unsupported HDR pixel format.
+    #[serde(rename = "unsupportedHdrPixelFormat")]
+    UnsupportedHdrPixelFormat,
+    /// Unspecified HDR color metadata.
+    #[serde(rename = "unsupportedHdrColorMetadata")]
+    UnsupportedHdrColorMetadata,
+    /// Problematic HDR lookup table attached.
+    #[serde(rename = "problematicHdrLookupTable")]
+    ProblematicHdrLookupTable,
+}
+
+impl std::default::Default for VideoSuggestionsProcessingWarnings {
+    fn default() -> VideoSuggestionsProcessingWarnings {
+        VideoSuggestionsProcessingWarnings::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsProcessingWarnings {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsProcessingWarnings::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingWarnings::UnknownContainer => write!(f, "unknownContainer"),
+            VideoSuggestionsProcessingWarnings::UnknownVideoCodec => write!(f, "unknownVideoCodec"),
+            VideoSuggestionsProcessingWarnings::UnknownAudioCodec => write!(f, "unknownAudioCodec"),
+            VideoSuggestionsProcessingWarnings::InconsistentResolution => {
+                write!(f, "inconsistentResolution")
+            }
+            VideoSuggestionsProcessingWarnings::HasEditlist => write!(f, "hasEditlist"),
+            VideoSuggestionsProcessingWarnings::ProblematicVideoCodec => {
+                write!(f, "problematicVideoCodec")
+            }
+            VideoSuggestionsProcessingWarnings::ProblematicAudioCodec => {
+                write!(f, "problematicAudioCodec")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedVrStereoMode => {
+                write!(f, "unsupportedVrStereoMode")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedSphericalProjectionType => {
+                write!(f, "unsupportedSphericalProjectionType")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedHdrPixelFormat => {
+                write!(f, "unsupportedHdrPixelFormat")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedHdrColorMetadata => {
+                write!(f, "unsupportedHdrColorMetadata")
+            }
+            VideoSuggestionsProcessingWarnings::ProblematicHdrLookupTable => {
+                write!(f, "problematicHdrLookupTable")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[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).
+    #[serde(rename = "audioFile")]
+    AudioFile,
+    /// Image file (e.g., a JPEG image).
+    #[serde(rename = "imageFile")]
+    ImageFile,
+    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
+    #[serde(rename = "projectFile")]
+    ProjectFile,
+    /// Other non-video file.
+    #[serde(rename = "notAVideoFile")]
+    NotAVideoFile,
+    /// Document or text file (e.g., MS Word document).
+    #[serde(rename = "docFile")]
+    DocFile,
+    /// An archive file (e.g., a ZIP archive).
+    #[serde(rename = "archiveFile")]
+    ArchiveFile,
+    /// Unsupported spatial audio layout type.
+    #[serde(rename = "unsupportedSpatialAudioLayout")]
+    UnsupportedSpatialAudioLayout,
+}
+
+impl std::default::Default for VideoSuggestionsProcessingErrors {
+    fn default() -> VideoSuggestionsProcessingErrors {
+        VideoSuggestionsProcessingErrors::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsProcessingErrors {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsProcessingErrors::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingErrors::AudioFile => write!(f, "audioFile"),
+            VideoSuggestionsProcessingErrors::ImageFile => write!(f, "imageFile"),
+            VideoSuggestionsProcessingErrors::ProjectFile => write!(f, "projectFile"),
+            VideoSuggestionsProcessingErrors::NotAVideoFile => write!(f, "notAVideoFile"),
+            VideoSuggestionsProcessingErrors::DocFile => write!(f, "docFile"),
+            VideoSuggestionsProcessingErrors::ArchiveFile => write!(f, "archiveFile"),
+            VideoSuggestionsProcessingErrors::UnsupportedSpatialAudioLayout => {
+                write!(f, "unsupportedSpatialAudioLayout")
+            }
+        };
+        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 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(())
     }
@@ -4738,6 +5066,4056 @@
 }
 
 #[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,
     ///
@@ -4774,32 +9152,486 @@
 }
 
 #[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"),
+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(())
     }
@@ -4988,32 +9820,48 @@
 }
 
 #[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"),
+pub enum VideoFileDetailsFileType {
+    Undefined,
+    /// Known video file (e.g., an MP4 file).
+    #[serde(rename = "video")]
+    Video,
+    /// Audio only file (e.g., an MP3 file).
+    #[serde(rename = "audio")]
+    Audio,
+    /// Image file (e.g., a JPEG image).
+    #[serde(rename = "image")]
+    Image,
+    /// Archive file (e.g., a ZIP archive).
+    #[serde(rename = "archive")]
+    Archive,
+    /// Document or text file (e.g., MS Word document).
+    #[serde(rename = "document")]
+    Document,
+    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
+    #[serde(rename = "project")]
+    Project,
+    /// Other non-video file type.
+    #[serde(rename = "other")]
+    Other,
+}
+
+impl std::default::Default for VideoFileDetailsFileType {
+    fn default() -> VideoFileDetailsFileType {
+        VideoFileDetailsFileType::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoFileDetailsFileType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoFileDetailsFileType::Undefined => write!(f, "undefined"),
+            VideoFileDetailsFileType::Video => write!(f, "video"),
+            VideoFileDetailsFileType::Audio => write!(f, "audio"),
+            VideoFileDetailsFileType::Image => write!(f, "image"),
+            VideoFileDetailsFileType::Archive => write!(f, "archive"),
+            VideoFileDetailsFileType::Document => write!(f, "document"),
+            VideoFileDetailsFileType::Project => write!(f, "project"),
+            VideoFileDetailsFileType::Other => write!(f, "other"),
         };
         Ok(())
     }
@@ -5056,6 +9904,38 @@
 }
 
 #[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,
     ///
@@ -5108,288 +9988,6 @@
 }
 
 #[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 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.
-    #[serde(rename = "unknownContainer")]
-    UnknownContainer,
-    /// Unrecognized video codec, transcoding is likely to fail.
-    #[serde(rename = "unknownVideoCodec")]
-    UnknownVideoCodec,
-    /// Unrecognized audio codec, transcoding is likely to fail.
-    #[serde(rename = "unknownAudioCodec")]
-    UnknownAudioCodec,
-    /// Conflicting container and stream resolutions.
-    #[serde(rename = "inconsistentResolution")]
-    InconsistentResolution,
-    /// Edit lists are not currently supported.
-    #[serde(rename = "hasEditlist")]
-    HasEditlist,
-    /// Video codec that is known to cause problems was used.
-    #[serde(rename = "problematicVideoCodec")]
-    ProblematicVideoCodec,
-    /// Audio codec that is known to cause problems was used.
-    #[serde(rename = "problematicAudioCodec")]
-    ProblematicAudioCodec,
-    /// Unsupported VR video stereo mode.
-    #[serde(rename = "unsupportedVrStereoMode")]
-    UnsupportedVrStereoMode,
-    /// Unsupported spherical video projection type.
-    #[serde(rename = "unsupportedSphericalProjectionType")]
-    UnsupportedSphericalProjectionType,
-    /// Unsupported HDR pixel format.
-    #[serde(rename = "unsupportedHdrPixelFormat")]
-    UnsupportedHdrPixelFormat,
-    /// Unspecified HDR color metadata.
-    #[serde(rename = "unsupportedHdrColorMetadata")]
-    UnsupportedHdrColorMetadata,
-    /// Problematic HDR lookup table attached.
-    #[serde(rename = "problematicHdrLookupTable")]
-    ProblematicHdrLookupTable,
-}
-
-impl std::default::Default for VideoSuggestionsProcessingWarnings {
-    fn default() -> VideoSuggestionsProcessingWarnings {
-        VideoSuggestionsProcessingWarnings::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoSuggestionsProcessingWarnings {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoSuggestionsProcessingWarnings::Undefined => write!(f, "undefined"),
-            VideoSuggestionsProcessingWarnings::UnknownContainer => write!(f, "unknownContainer"),
-            VideoSuggestionsProcessingWarnings::UnknownVideoCodec => write!(f, "unknownVideoCodec"),
-            VideoSuggestionsProcessingWarnings::UnknownAudioCodec => write!(f, "unknownAudioCodec"),
-            VideoSuggestionsProcessingWarnings::InconsistentResolution => {
-                write!(f, "inconsistentResolution")
-            }
-            VideoSuggestionsProcessingWarnings::HasEditlist => write!(f, "hasEditlist"),
-            VideoSuggestionsProcessingWarnings::ProblematicVideoCodec => {
-                write!(f, "problematicVideoCodec")
-            }
-            VideoSuggestionsProcessingWarnings::ProblematicAudioCodec => {
-                write!(f, "problematicAudioCodec")
-            }
-            VideoSuggestionsProcessingWarnings::UnsupportedVrStereoMode => {
-                write!(f, "unsupportedVrStereoMode")
-            }
-            VideoSuggestionsProcessingWarnings::UnsupportedSphericalProjectionType => {
-                write!(f, "unsupportedSphericalProjectionType")
-            }
-            VideoSuggestionsProcessingWarnings::UnsupportedHdrPixelFormat => {
-                write!(f, "unsupportedHdrPixelFormat")
-            }
-            VideoSuggestionsProcessingWarnings::UnsupportedHdrColorMetadata => {
-                write!(f, "unsupportedHdrColorMetadata")
-            }
-            VideoSuggestionsProcessingWarnings::ProblematicHdrLookupTable => {
-                write!(f, "problematicHdrLookupTable")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoSuggestionsProcessingErrors {
-    Undefined,
-    /// File contains audio only (e.g., an MP3 file).
-    #[serde(rename = "audioFile")]
-    AudioFile,
-    /// Image file (e.g., a JPEG image).
-    #[serde(rename = "imageFile")]
-    ImageFile,
-    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
-    #[serde(rename = "projectFile")]
-    ProjectFile,
-    /// Other non-video file.
-    #[serde(rename = "notAVideoFile")]
-    NotAVideoFile,
-    /// Document or text file (e.g., MS Word document).
-    #[serde(rename = "docFile")]
-    DocFile,
-    /// An archive file (e.g., a ZIP archive).
-    #[serde(rename = "archiveFile")]
-    ArchiveFile,
-    /// Unsupported spatial audio layout type.
-    #[serde(rename = "unsupportedSpatialAudioLayout")]
-    UnsupportedSpatialAudioLayout,
-}
-
-impl std::default::Default for VideoSuggestionsProcessingErrors {
-    fn default() -> VideoSuggestionsProcessingErrors {
-        VideoSuggestionsProcessingErrors::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoSuggestionsProcessingErrors {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoSuggestionsProcessingErrors::Undefined => write!(f, "undefined"),
-            VideoSuggestionsProcessingErrors::AudioFile => write!(f, "audioFile"),
-            VideoSuggestionsProcessingErrors::ImageFile => write!(f, "imageFile"),
-            VideoSuggestionsProcessingErrors::ProjectFile => write!(f, "projectFile"),
-            VideoSuggestionsProcessingErrors::NotAVideoFile => write!(f, "notAVideoFile"),
-            VideoSuggestionsProcessingErrors::DocFile => write!(f, "docFile"),
-            VideoSuggestionsProcessingErrors::ArchiveFile => write!(f, "archiveFile"),
-            VideoSuggestionsProcessingErrors::UnsupportedSpatialAudioLayout => {
-                write!(f, "unsupportedSpatialAudioLayout")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[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 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 LiveBroadcastStatusLifeCycleStatus {
     Undefined,
     /// No value or the value is unknown.
@@ -5448,76 +10046,6 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusRecordingStatus {
-    Undefined,
-    /// No value or the value is unknown.
-    #[serde(rename = "liveBroadcastRecordingStatusUnspecified")]
-    LiveBroadcastRecordingStatusUnspecified,
-    /// The recording has not yet been started.
-    #[serde(rename = "notRecording")]
-    NotRecording,
-    /// The recording is currently on.
-    #[serde(rename = "recording")]
-    Recording,
-    /// The recording is completed, and cannot be started again.
-    #[serde(rename = "recorded")]
-    Recorded,
-}
-
-impl std::default::Default for LiveBroadcastStatusRecordingStatus {
-    fn default() -> LiveBroadcastStatusRecordingStatus {
-        LiveBroadcastStatusRecordingStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusRecordingStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusRecordingStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusRecordingStatus::LiveBroadcastRecordingStatusUnspecified => {
-                write!(f, "liveBroadcastRecordingStatusUnspecified")
-            }
-            LiveBroadcastStatusRecordingStatus::NotRecording => write!(f, "notRecording"),
-            LiveBroadcastStatusRecordingStatus::Recording => write!(f, "recording"),
-            LiveBroadcastStatusRecordingStatus::Recorded => write!(f, "recorded"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusPrivacyStatus {
-    Undefined,
-    ///
-    #[serde(rename = "public")]
-    Public,
-    ///
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    ///
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for LiveBroadcastStatusPrivacyStatus {
-    fn default() -> LiveBroadcastStatusPrivacyStatus {
-        LiveBroadcastStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusPrivacyStatus::Public => write!(f, "public"),
-            LiveBroadcastStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            LiveBroadcastStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum LiveBroadcastStatusLiveBroadcastPriority {
     Undefined,
     ///
@@ -5556,118 +10084,138 @@
 }
 
 #[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 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"),
+pub enum LiveBroadcastStatusPrivacyStatus {
+    Undefined,
+    ///
+    #[serde(rename = "public")]
+    Public,
+    ///
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    ///
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for LiveBroadcastStatusPrivacyStatus {
+    fn default() -> LiveBroadcastStatusPrivacyStatus {
+        LiveBroadcastStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastStatusPrivacyStatus::Public => write!(f, "public"),
+            LiveBroadcastStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            LiveBroadcastStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusRecordingStatus {
+    Undefined,
+    /// No value or the value is unknown.
+    #[serde(rename = "liveBroadcastRecordingStatusUnspecified")]
+    LiveBroadcastRecordingStatusUnspecified,
+    /// The recording has not yet been started.
+    #[serde(rename = "notRecording")]
+    NotRecording,
+    /// The recording is currently on.
+    #[serde(rename = "recording")]
+    Recording,
+    /// The recording is completed, and cannot be started again.
+    #[serde(rename = "recorded")]
+    Recorded,
+}
+
+impl std::default::Default for LiveBroadcastStatusRecordingStatus {
+    fn default() -> LiveBroadcastStatusRecordingStatus {
+        LiveBroadcastStatusRecordingStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastStatusRecordingStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastStatusRecordingStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastStatusRecordingStatus::LiveBroadcastRecordingStatusUnspecified => {
+                write!(f, "liveBroadcastRecordingStatusUnspecified")
+            }
+            LiveBroadcastStatusRecordingStatus::NotRecording => write!(f, "notRecording"),
+            LiveBroadcastStatusRecordingStatus::Recording => write!(f, "recording"),
+            LiveBroadcastStatusRecordingStatus::Recorded => write!(f, "recorded"),
+        };
+        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 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(())
     }
@@ -5708,6 +10256,142 @@
 }
 
 #[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"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum LiveChatMessageSnippetType {
     Undefined,
     ///
@@ -5784,32 +10468,32 @@
 }
 
 #[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"),
+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(())
     }
@@ -5848,540 +10532,40 @@
 }
 
 #[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 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 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 VideoRatingRating {
+pub enum VideoFileDetailsVideoStreamRotation {
     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 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.
-    #[serde(rename = "channelToStoreLink")]
-    ChannelToStoreLink,
-}
-
-impl std::default::Default for ThirdPartyLinkSnippetType {
-    fn default() -> ThirdPartyLinkSnippetType {
-        ThirdPartyLinkSnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for ThirdPartyLinkSnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ThirdPartyLinkSnippetType::Undefined => write!(f, "undefined"),
-            ThirdPartyLinkSnippetType::LinkUnspecified => write!(f, "linkUnspecified"),
-            ThirdPartyLinkSnippetType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
-        };
-        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 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 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 VideoFileDetailsFileType {
-    Undefined,
-    /// Known video file (e.g., an MP4 file).
-    #[serde(rename = "video")]
-    Video,
-    /// Audio only file (e.g., an MP3 file).
-    #[serde(rename = "audio")]
-    Audio,
-    /// Image file (e.g., a JPEG image).
-    #[serde(rename = "image")]
-    Image,
-    /// Archive file (e.g., a ZIP archive).
-    #[serde(rename = "archive")]
-    Archive,
-    /// Document or text file (e.g., MS Word document).
-    #[serde(rename = "document")]
-    Document,
-    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
-    #[serde(rename = "project")]
-    Project,
-    /// Other non-video file type.
+    ///
+    #[serde(rename = "clockwise")]
+    Clockwise,
+    ///
+    #[serde(rename = "upsideDown")]
+    UpsideDown,
+    ///
+    #[serde(rename = "counterClockwise")]
+    CounterClockwise,
+    ///
     #[serde(rename = "other")]
     Other,
 }
 
-impl std::default::Default for VideoFileDetailsFileType {
-    fn default() -> VideoFileDetailsFileType {
-        VideoFileDetailsFileType::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoFileDetailsFileType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoFileDetailsFileType::Undefined => write!(f, "undefined"),
-            VideoFileDetailsFileType::Video => write!(f, "video"),
-            VideoFileDetailsFileType::Audio => write!(f, "audio"),
-            VideoFileDetailsFileType::Image => write!(f, "image"),
-            VideoFileDetailsFileType::Archive => write!(f, "archive"),
-            VideoFileDetailsFileType::Document => write!(f, "document"),
-            VideoFileDetailsFileType::Project => write!(f, "project"),
-            VideoFileDetailsFileType::Other => write!(f, "other"),
-        };
-        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 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 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 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 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"),
+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(())
     }
@@ -6428,6 +10612,78 @@
 }
 
 #[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 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.
@@ -6530,78 +10786,6 @@
 }
 
 #[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 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 VideoStatusPrivacyStatus {
     Undefined,
     ///
@@ -6634,4212 +10818,6 @@
 }
 
 #[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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 CommentsListTextFormat {
     Undefined,
     ///
@@ -10910,6 +10888,196 @@
 }
 
 #[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.
+    #[serde(rename = "html")]
+    Html,
+    /// Returns the comments in plain text format.
+    #[serde(rename = "plainText")]
+    PlainText,
+}
+
+impl std::default::Default for CommentThreadsListTextFormat {
+    fn default() -> CommentThreadsListTextFormat {
+        CommentThreadsListTextFormat::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentThreadsListTextFormat {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentThreadsListTextFormat::Undefined => write!(f, "undefined"),
+            CommentThreadsListTextFormat::TextFormatUnspecified => {
+                write!(f, "textFormatUnspecified")
+            }
+            CommentThreadsListTextFormat::Html => write!(f, "html"),
+            CommentThreadsListTextFormat::PlainText => write!(f, "plainText"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentThreadsListModerationStatus {
+    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 CommentThreadsListModerationStatus {
+    fn default() -> CommentThreadsListModerationStatus {
+        CommentThreadsListModerationStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentThreadsListModerationStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentThreadsListModerationStatus::Undefined => write!(f, "undefined"),
+            CommentThreadsListModerationStatus::Published => write!(f, "published"),
+            CommentThreadsListModerationStatus::HeldForReview => write!(f, "heldForReview"),
+            CommentThreadsListModerationStatus::LikelySpam => write!(f, "likelySpam"),
+            CommentThreadsListModerationStatus::Rejected => write!(f, "rejected"),
+        };
+        Ok(())
+    }
+}
+
+#[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,
     ///
@@ -10970,698 +11138,6 @@
 }
 
 #[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 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 CommentThreadsListTextFormat {
-    Undefined,
-    ///
-    #[serde(rename = "textFormatUnspecified")]
-    TextFormatUnspecified,
-    /// Returns the comments in HTML format. This is the default value.
-    #[serde(rename = "html")]
-    Html,
-    /// Returns the comments in plain text format.
-    #[serde(rename = "plainText")]
-    PlainText,
-}
-
-impl std::default::Default for CommentThreadsListTextFormat {
-    fn default() -> CommentThreadsListTextFormat {
-        CommentThreadsListTextFormat::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentThreadsListTextFormat {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentThreadsListTextFormat::Undefined => write!(f, "undefined"),
-            CommentThreadsListTextFormat::TextFormatUnspecified => {
-                write!(f, "textFormatUnspecified")
-            }
-            CommentThreadsListTextFormat::Html => write!(f, "html"),
-            CommentThreadsListTextFormat::PlainText => write!(f, "plainText"),
-        };
-        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 CommentThreadsListModerationStatus {
-    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 CommentThreadsListModerationStatus {
-    fn default() -> CommentThreadsListModerationStatus {
-        CommentThreadsListModerationStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentThreadsListModerationStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentThreadsListModerationStatus::Undefined => write!(f, "undefined"),
-            CommentThreadsListModerationStatus::Published => write!(f, "published"),
-            CommentThreadsListModerationStatus::HeldForReview => write!(f, "heldForReview"),
-            CommentThreadsListModerationStatus::LikelySpam => write!(f, "likelySpam"),
-            CommentThreadsListModerationStatus::Rejected => write!(f, "rejected"),
-        };
-        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 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 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 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 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 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 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 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 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 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 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 SponsorsListFilter {
-    Undefined,
-    ///
-    #[serde(rename = "sponsorFilterUnknown")]
-    SponsorFilterUnknown,
-    /// Return the most recent sponsors, from newest to oldest.
-    #[serde(rename = "newest")]
-    Newest,
-    /// Return all sponsors, from newest to oldest.
-    #[serde(rename = "all")]
-    All,
-}
-
-impl std::default::Default for SponsorsListFilter {
-    fn default() -> SponsorsListFilter {
-        SponsorsListFilter::Undefined
-    }
-}
-
-impl std::fmt::Display for SponsorsListFilter {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SponsorsListFilter::Undefined => write!(f, "undefined"),
-            SponsorsListFilter::SponsorFilterUnknown => write!(f, "sponsorFilterUnknown"),
-            SponsorsListFilter::Newest => write!(f, "newest"),
-            SponsorsListFilter::All => write!(f, "all"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum LiveBroadcastsListBroadcastStatus {
     Undefined,
     ///
@@ -11780,6 +11256,476 @@
 }
 
 #[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.
+    #[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,
     ///
@@ -11871,27 +11817,433 @@
     }
 }
 
+/// Parameters for the `i18nLanguages.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguagesListParams {
+    /// 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>,
+}
+
+impl std::fmt::Display for I18nLanguagesListParams {
+    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 `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()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channels.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *onBehalfOfContentOwner* parameter indicates that the authenticated user 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 needs to 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 API currently only allows the parameter value to be set to either brandingSettings or invideoPromotion. (You cannot update both of those parts with a single request.) Note that this method overrides the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ChannelsUpdateParams {
+    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 `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 `liveChatModerators.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorsDeleteParams {
+    /// 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 LiveChatModeratorsDeleteParams {
+    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 `liveChatModerators.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The id of the live chat for which moderators should be returned.
+    #[serde(rename = "liveChatId")]
+    pub live_chat_id: 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 {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&liveChatId={}",
+            percent_encode(
+                format!("{}", self.live_chat_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.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,
+                "&maxResults={}",
+                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>,
+    /// Return rendered funding amounts in specified language.
+    #[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.
+    #[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()
+        )?;
+        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()
+            )?;
+        }
+        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 `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 {
     /// 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.
+    #[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>,
-    /// 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 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>,
     /// 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>,
@@ -11904,6 +12256,20 @@
             "&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.parent_id {
             write!(
                 f,
@@ -11918,20 +12284,6 @@
                 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.page_token {
             write!(
                 f,
@@ -11943,6 +12295,50 @@
     }
 }
 
+/// Parameters for the `comments.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsUpdateParams {
+    /// 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. 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 CommentsUpdateParams {
+    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.markAsSpam` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsMarkAsSpamParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Flags the comments with the given IDs as spam in the caller's opinion.
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for CommentsMarkAsSpamParams {
+    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 `comments.setModerationStatus` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CommentsSetModerationStatusParams {
@@ -11952,12 +12348,12 @@
     /// Modifies the moderation status of the comments with the given IDs
     #[serde(rename = "id")]
     pub id: String,
+    /// 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,
-    /// 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>,
 }
 
 impl std::fmt::Display for CommentsSetModerationStatusParams {
@@ -11987,72 +12383,6 @@
     }
 }
 
-/// Parameters for the `comments.markAsSpam` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsMarkAsSpamParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Flags the comments with the given IDs as spam in the caller's opinion.
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CommentsMarkAsSpamParams {
-    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 `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.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsUpdateParams {
-    /// 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. 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 CommentsUpdateParams {
-    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 {
@@ -12074,881 +12404,6 @@
     }
 }
 
-/// 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>,
-    /// 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 with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: 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>,
-    /// *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>,
-    /// Returns the captions for the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: 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 {
-            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.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.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>,
-    /// *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>,
-    /// tlang is the language code; machine translate the captions into this language.
-    #[serde(rename = "tlang")]
-    pub tlang: 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>,
-}
-
-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_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.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()
-            )?;
-        }
-        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>,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: 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,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-}
-
-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.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>,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// 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,
-}
-
-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 `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>,
-    /// 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>,
-    /// 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 ChannelBannersInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        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()
-            )?;
-        }
-        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 `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>,
-    /// *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 = "channelId")]
-    pub channel_id: 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,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `watermarks.set` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct WatermarksSetParams {
-    /// 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 = "channelId")]
-    pub channel_id: String,
-}
-
-impl std::fmt::Display for WatermarksSetParams {
-    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,
-                "&onBehalfOfContentOwner={}",
-                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 *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 superChatEvent resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: 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.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,
-                "&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()
-            )?;
-        }
-        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 `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>,
-    /// Notify the channel subscribers about the new video. As default, the notification is enabled.
-    #[serde(rename = "notifySubscribers")]
-    pub notify_subscribers: Option<bool>,
-    /// Should stabilize be applied to the upload.
-    #[serde(rename = "stabilize")]
-    pub stabilize: Option<bool>,
-    /// 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>,
-    /// *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 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.notify_subscribers {
-            write!(
-                f,
-                "&notifySubscribers={}",
-                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.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.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                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>,
-    /// *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 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.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>,
-    /// 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>,
-    #[serde(rename = "locale")]
-    pub locale: Option<String>,
-    #[serde(rename = "maxHeight")]
-    pub max_height: 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 *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 chart that is specific to the specified video category
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: Option<String>,
-    /// Return videos with the given ids.
-    #[serde(rename = "id")]
-    pub id: 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>,
-    /// 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,
-    /// *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 videos that are in the specified chart.
-    #[serde(rename = "chart")]
-    pub chart: Option<VideosListChart>,
-    /// Return the player with maximum height specified in
-    #[serde(rename = "maxWidth")]
-    pub max_width: Option<i32>,
-    /// Use a chart that is specific to the specified region
-    #[serde(rename = "regionCode")]
-    pub region_code: 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.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                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.hl {
-            write!(
-                f,
-                "&hl={}",
-                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.video_category_id {
-            write!(
-                f,
-                "&videoCategoryId={}",
-                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.my_rating {
-            write!(
-                f,
-                "&myRating={}",
-                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.chart {
-            write!(
-                f,
-                "&chart={}",
-                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.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                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 = "id")]
-    pub id: String,
-    #[serde(rename = "rating")]
-    pub rating: VideosRateRating,
-}
-
-impl std::fmt::Display for VideosRateParams {
-    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,
-            "&rating={}",
-            percent_encode(format!("{}", self.rating).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>,
-    /// *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 `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,
-    /// Do not use. Required for compatibility.
-    #[serde(rename = "part")]
-    pub part: Option<String>,
-    /// Delete the partner links with the given linking token.
-    #[serde(rename = "linkingToken")]
-    pub linking_token: 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 `thirdPartyLinks.update` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ThirdPartyLinksUpdateParams {
@@ -13002,12 +12457,12 @@
     /// 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>,
-    /// 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,
 }
 
 impl std::fmt::Display for ThirdPartyLinksListParams {
@@ -13035,486 +12490,98 @@
     }
 }
 
-/// Parameters for the `i18nLanguages.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguagesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[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 {
-    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 `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 `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 = "publishedAfter")]
-    pub published_after: Option<String>,
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    #[serde(rename = "publishedBefore")]
-    pub published_before: Option<String>,
-    #[serde(rename = "home")]
-    pub home: 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,
-    /// 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 = "regionCode")]
-    pub region_code: 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.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.mine {
-            write!(
-                f,
-                "&mine={}",
-                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.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()
-            )?;
-        }
-        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>,
-    /// *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.
-    #[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,
-            "&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 `playlists.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsDeleteParams {
-    /// 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>,
+/// 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 PlaylistsDeleteParams {
+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()
         )?;
-        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>,
-    /// 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.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<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 `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>,
-    /// Return the playlists owned by 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>,
-    /// 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,
-    /// Returen content in specified language
+        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.
+    #[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>,
-    /// Return the playlists with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// 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>,
     /// 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>,
-    /// *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 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.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.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.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,
-                "&maxResults={}",
-                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 `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 = "regionCode")]
-    pub region_code: Option<String>,
-    /// Returns the video categories with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    #[serde(rename = "hl")]
-    pub hl: 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,
-}
-
-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.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.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatModerators.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorsDeleteParams {
-    /// 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 LiveChatModeratorsDeleteParams {
-    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 `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 `liveChatModerators.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// 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 *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 *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 LiveChatModeratorsListParams {
+}
+
+impl std::fmt::Display for LiveChatMessagesListParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -13530,10 +12597,10 @@
             )
             .to_string()
         )?;
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
+        if let Some(ref v) = self.profile_image_size {
+            write!(
+                f,
+                "&profileImageSize={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -13544,138 +12611,10 @@
                 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 `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 for all the channel comments (ie does not include comments left on videos).
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: Option<CommentThreadsListTextFormat>,
-    #[serde(rename = "order")]
-    pub order: Option<CommentThreadsListOrder>,
-    /// 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>,
-    /// Returns the comment threads with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub 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>,
-    /// 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>,
-    /// 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 the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: Option<String>,
-    /// 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 *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 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.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        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.order {
-            write!(
-                f,
-                "&order={}",
-                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.id {
-            write!(
-                f,
-                "&id={}",
-                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.moderation_status {
-            write!(
-                f,
-                "&moderationStatus={}",
-                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.video_id {
-            write!(
-                f,
-                "&videoId={}",
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -13690,18 +12629,18 @@
     }
 }
 
-/// 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 {
+/// 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,
@@ -13734,64 +12673,57 @@
     }
 }
 
-/// 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>,
-    /// *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 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>,
-    /// 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>,
-    /// Return the ChannelSections with the given IDs for Stubby or Apiary.
+/// 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>,
-}
-
-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.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.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={}",
+    /// 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()
             )?;
         }
@@ -13802,69 +12734,84 @@
                 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>,
-    /// *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 names that you can include in the parameter value are snippet and contentDetails.
-    #[serde(rename = "part")]
-    pub part: 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.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>,
-    #[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 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()
-            )?;
-        }
+        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={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        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.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(())
     }
 }
@@ -13911,43 +12858,847 @@
     }
 }
 
-/// 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 *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 `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,
+                "&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()
+            )?;
+        }
+        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 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>,
-    /// Specifies the size of the profile image that should be returned for each user.
-    #[serde(rename = "profileImageSize")]
-    pub profile_image_size: Option<u32>,
     /// 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 liveChatComment 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 LiveChatMessagesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&liveChatId={}",
-            percent_encode(
-                format!("{}", self.live_chat_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
+}
+
+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,
+                "&maxResults={}",
+                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.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 {
+    /// 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()
+        )?;
+        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.set` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct WatermarksSetParams {
+    /// 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 WatermarksSetParams {
+    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,
+                "&onBehalfOfContentOwner={}",
+                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 `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={}",
@@ -13960,17 +13711,390 @@
                 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.profile_image_size {
-            write!(
-                f,
-                "&profileImageSize={}",
+        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 {
+    /// 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 `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>,
+    /// *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>,
+    /// 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 {
+    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()
             )?;
         }
@@ -13981,49 +14105,463 @@
                 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 `liveChatMessages.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesDeleteParams {
+        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.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,
+                "&pageToken={}",
+                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.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,
-}
-
-impl std::fmt::Display for LiveChatMessagesDeleteParams {
+    /// *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,
+                "&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.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.
+    #[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 `playlists.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsDeleteParams {
+    /// 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 PlaylistsDeleteParams {
     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 `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(())
     }
 }
@@ -14077,41 +14615,41 @@
     /// 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>,
-    /// 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 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>,
-    #[serde(rename = "myRecentSubscribers")]
-    pub my_recent_subscribers: 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>,
-    /// The order of the returned subscriptions
-    #[serde(rename = "order")]
-    pub order: Option<SubscriptionsListOrder>,
-    /// 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 subscribers of the given channel owner.
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// 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>,
-    /// 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,
-    /// 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 {
@@ -14121,6 +14659,155 @@
             "&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,
@@ -14128,20 +14815,59 @@
                 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.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                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,
@@ -14149,92 +14875,175 @@
                 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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                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.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                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.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()
-            )?;
-        }
-        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>,
+        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 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 {
+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,
@@ -14251,45 +15060,30 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
-    /// Filter on the definition of the videos.
-    #[serde(rename = "videoDefinition")]
-    pub video_definition: Option<SearchListVideoDefinition>,
+    /// 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>,
-    /// Filter on the duration of the videos.
-    #[serde(rename = "videoDuration")]
-    pub video_duration: Option<SearchListVideoDuration>,
-    /// Filter on the livestream status of the videos.
-    #[serde(rename = "eventType")]
-    pub event_type: Option<SearchListEventType>,
-    /// Filter on embeddable videos.
-    #[serde(rename = "videoEmbeddable")]
-    pub video_embeddable: Option<SearchListVideoEmbeddable>,
-    /// Search related to a resource.
-    #[serde(rename = "relatedToVideoId")]
-    pub related_to_video_id: Option<String>,
-    /// Filter on videos of a specific type.
-    #[serde(rename = "videoType")]
-    pub video_type: Option<SearchListVideoType>,
-    /// Filter on 3d videos.
-    #[serde(rename = "videoDimension")]
-    pub video_dimension: Option<SearchListVideoDimension>,
-    /// *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 results to a particular set of resource types from One Platform.
-    #[serde(rename = "type")]
-    pub typ: Option<String>,
-    /// Filter on syndicated videos.
-    #[serde(rename = "videoSyndicated")]
-    pub video_syndicated: Option<SearchListVideoSyndicated>,
+    /// 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>,
-    /// Add a filter on the channel search.
-    #[serde(rename = "channelType")]
-    pub channel_type: Option<SearchListChannelType>,
+    /// 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>,
@@ -14299,51 +15093,66 @@
     /// 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>,
-    /// Filter on resources published after this date.
-    #[serde(rename = "publishedAfter")]
-    pub published_after: Option<String>,
-    /// Filter on videos in a specific category.
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: 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>,
-    /// 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,
-    /// Sort order of the results.
-    #[serde(rename = "order")]
-    pub order: Option<SearchListOrder>,
-    /// Indicates whether the search results should include restricted content as well as standard content.
-    #[serde(rename = "safeSearch")]
-    pub safe_search: Option<SearchListSafeSearch>,
-    /// Restrict results to a particular topic.
-    #[serde(rename = "topicId")]
-    pub topic_id: 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>,
-    /// 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 distance from the location (specified above).
-    #[serde(rename = "locationRadius")]
-    pub location_radius: Option<String>,
-    /// Search for the private videos of the authenticated user.
-    #[serde(rename = "forMine")]
-    pub for_mine: Option<bool>,
-    /// Filter on location of the video
-    #[serde(rename = "location")]
-    pub location: 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 {
@@ -14353,10 +15162,17 @@
             "&part={}",
             percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
-        if let Some(ref v) = self.video_definition {
-            write!(
-                f,
-                "&videoDefinition={}",
+        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()
             )?;
         }
@@ -14367,66 +15183,17 @@
                 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.event_type {
-            write!(
-                f,
-                "&eventType={}",
-                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.related_to_video_id {
-            write!(
-                f,
-                "&relatedToVideoId={}",
-                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.video_dimension {
-            write!(
-                f,
-                "&videoDimension={}",
-                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.typ {
-            write!(
-                f,
-                "&type={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_syndicated {
-            write!(
-                f,
-                "&videoSyndicated={}",
+        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()
             )?;
         }
@@ -14437,10 +15204,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.channel_type {
-            write!(
-                f,
-                "&channelType={}",
+        if let Some(ref v) = self.location_radius {
+            write!(
+                f,
+                "&locationRadius={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -14465,17 +15232,73 @@
                 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.published_after {
-            write!(
-                f,
-                "&publishedAfter={}",
+        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()
             )?;
         }
@@ -14486,6 +15309,27 @@
                 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,
@@ -14500,31 +15344,10 @@
                 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.order {
-            write!(
-                f,
-                "&order={}",
-                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.topic_id {
-            write!(
-                f,
-                "&topicId={}",
+        if let Some(ref v) = self.video_dimension {
+            write!(
+                f,
+                "&videoDimension={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -14535,210 +15358,64 @@
                 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_radius {
-            write!(
-                f,
-                "&locationRadius={}",
-                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.location {
-            write!(
-                f,
-                "&location={}",
-                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>,
-    /// *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 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,
-}
-
-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.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>,
-    /// *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>,
+        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 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.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>,
-    /// *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 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>,
-    /// 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 associated with the given video ID.
-    #[serde(rename = "videoId")]
-    pub video_id: Option<String>,
-    #[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 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>,
-    /// 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,
-}
-
-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.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()
-            )?;
-        }
-        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.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,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_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(())
     }
 }
@@ -14774,893 +15451,30 @@
     }
 }
 
-/// 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 `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>,
-    /// Return the channels managed by the authenticated user.
-    #[serde(rename = "managedByMe")]
-    pub managed_by_me: Option<bool>,
-    /// 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,
-    /// 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>,
-    /// 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>,
-    /// *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 *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 ids of channels owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return the channels with the specified IDs.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Return the channels subscribed to the authenticated user
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// Return the channels within the specified guide category ID.
-    #[serde(rename = "categoryId")]
-    pub category_id: 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.managed_by_me {
-            write!(
-                f,
-                "&managedByMe={}",
-                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.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,
-                "&onBehalfOfContentOwner={}",
-                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.mine {
-            write!(
-                f,
-                "&mine={}",
-                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.my_subscribers {
-            write!(
-                f,
-                "&mySubscribers={}",
-                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()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channels.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *onBehalfOfContentOwner* parameter indicates that the authenticated user 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 needs to 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 API currently only allows the parameter value to be set to either brandingSettings or invideoPromotion. (You cannot update both of those parts with a single request.) Note that this method overrides the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for ChannelsUpdateParams {
-    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 `sponsors.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SponsorsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Parameter that specifies which channel sponsors to return.
-    #[serde(rename = "filter")]
-    pub filter: Option<SponsorsListFilter>,
-    /// 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 sponsor 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>,
-}
-
-impl std::fmt::Display for SponsorsListParams {
-    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.filter {
-            write!(
-                f,
-                "&filter={}",
-                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 `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>,
-    /// *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>,
-    #[serde(rename = "id")]
-    pub id: 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.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 *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,
-    /// Return LiveStreams with the given ids from Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub 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>,
-    /// 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>,
-    /// *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 *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 = "mine")]
-    pub mine: Option<bool>,
-}
-
-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.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_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()
-            )?;
-        }
-        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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                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()
-            )?;
-        }
-        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>,
-    /// 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.
-    #[serde(rename = "part")]
-    pub part: 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.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>,
-    /// 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, 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 {
-            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.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>,
-    /// 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, 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,
-}
-
-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_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.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>,
-    /// Broadcast to delete.
-    #[serde(rename = "id")]
-    pub id: 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 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.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>,
-    /// Return broadcasts 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 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 a certain status, e.g. active broadcasts.
-    #[serde(rename = "broadcastStatus")]
-    pub broadcast_status: Option<LiveBroadcastsListBroadcastStatus>,
-    /// Return only broadcasts with the selected type.
-    #[serde(rename = "broadcastType")]
-    pub broadcast_type: Option<LiveBroadcastsListBroadcastType>,
-    /// 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>,
-    #[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>,
-    /// *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 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.id {
-            write!(
-                f,
-                "&id={}",
-                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.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_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()
-            )?;
-        }
-        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 {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                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>,
-    /// 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,
-    /// 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.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 *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>,
-    /// *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>,
-    /// Broadcast to transition.
-    #[serde(rename = "id")]
-    pub id: String,
-    /// The status to which the broadcast is going to transition.
-    #[serde(rename = "broadcastStatus")]
-    pub broadcast_status: LiveBroadcastsTransitionBroadcastStatus,
-}
-
-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,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&broadcastStatus={}",
-            percent_encode(
-                format!("{}", self.broadcast_status).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>,
-    /// 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>,
-    /// 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 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 `liveBroadcasts.control` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsControlParams {
-    /// 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,
-    /// u64: The exact time when the actions (e.g. slate on) are executed. It is an offset from the first frame of the monitor stream. If not set, it means "now" or ASAP. This field should not be set if the monitor stream is disabled, otherwise an error will be returned.
-    #[serde(rename = "offsetTimeMs")]
-    pub offset_time_ms: Option<String>,
-    /// Whether display or hide slate.
-    #[serde(rename = "displaySlate")]
-    pub display_slate: Option<bool>,
-    /// Broadcast to operate.
-    #[serde(rename = "id")]
-    pub id: String,
-    /// The wall clock time at which the action should be executed. Only one of offset_time_ms and walltime may be set at a time.
-    #[serde(rename = "walltime")]
-    pub walltime: 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 LiveBroadcastsControlParams {
-    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.offset_time_ms {
-            write!(
-                f,
-                "&offsetTimeMs={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.display_slate {
-            write!(
-                f,
-                "&displaySlate={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.walltime {
-            write!(
-                f,
-                "&walltime={}",
-                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 `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>,
-    /// 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,
-    /// 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>,
-    /// 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>,
     /// 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>,
+    /// 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 {
@@ -15670,27 +15484,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.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.mode {
             write!(
                 f,
@@ -15705,6 +15498,27 @@
                 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,
+                "&maxResults={}",
+                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(())
     }
 }
@@ -15712,18 +15526,18 @@
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct YoutubeParams {
-    /// JSONP
-    #[serde(rename = "callback")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub callback: Option<String>,
-    /// OAuth access token.
-    #[serde(rename = "access_token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub access_token: Option<String>,
     /// 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>,
     /// Upload protocol for media (e.g. "raw", "multipart").
     #[serde(rename = "upload_protocol")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -15732,48 +15546,34 @@
     #[serde(rename = "quotaUser")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub quota_user: Option<String>,
-    /// Returns response with indentations and line breaks.
-    #[serde(rename = "prettyPrint")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pretty_print: Option<bool>,
+    /// 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>,
-    /// V1 error format.
-    #[serde(rename = "$.xgafv")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dollar_xgafv: Option<YoutubeParamsdollar_xgafv>,
-    /// 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>,
-    /// OAuth 2.0 token for the current user.
-    #[serde(rename = "oauth_token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub oauth_token: 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>,
+    /// Returns response with indentations and line breaks.
+    #[serde(rename = "prettyPrint")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pretty_print: Option<bool>,
 }
 
 impl std::fmt::Display for YoutubeParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        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.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,
@@ -15781,6 +15581,20 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.dollar_xgafv {
+            write!(
+                f,
+                "&$.xgafv={}",
+                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,
@@ -15795,10 +15609,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.pretty_print {
-            write!(
-                f,
-                "&prettyPrint={}",
+        if let Some(ref v) = self.callback {
+            write!(
+                f,
+                "&callback={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -15809,20 +15623,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.dollar_xgafv {
-            write!(
-                f,
-                "&$.xgafv={}",
-                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,
@@ -15830,36 +15630,47 @@
                 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()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// The Youtube Comments service represents the Comments resource.
-pub struct CommentsService {
+        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(())
+    }
+}
+
+/// The Youtube I18nLanguages service represents the I18nLanguages resource.
+pub struct I18nLanguagesService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    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
+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))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> CommentsService {
-        CommentsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nLanguagesService {
+        I18nLanguagesService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -15912,14 +15723,114 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut 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()];
+    pub async fn list(&self, params: &I18nLanguagesListParams) -> Result<I18nLanguageListResponse> {
+        let rel_path = format!("youtube/v3/i18nLanguages",);
+        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 `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) -> 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?;
@@ -15939,75 +15850,211 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-
-    /// Sets the moderation status of one or more comments.
-    pub async fn set_moderation_status(
-        &mut 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
-    }
-
-    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
-    pub async fn mark_as_spam(&mut 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
+}
+
+/// The Youtube Channels service represents the Channels resource.
+pub struct ChannelsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+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))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelsService {
+        ChannelsService {
+            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: &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",);
+        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 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(
-        &mut self,
-        params: &CommentsInsertParams,
-        req: &Comment,
-    ) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
+        &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![];
@@ -16035,43 +16082,9 @@
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
 
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut 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
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &CommentsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments",);
+    /// 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![];
@@ -16097,27 +16110,56 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
     }
-}
-
-/// The Youtube Captions service represents the Captions resource.
-pub struct CaptionsService {
+
+    /// 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()];
+            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 SuperChatEvents service represents the SuperChatEvents resource.
+pub struct SuperChatEventsService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
 
     base_url: String,
     root_url: String,
 }
 
-impl CaptionsService {
-    /// Create a new CaptionsService object. The easiest way to call this is wrapping the Authenticator
+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))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> CaptionsService {
-        CaptionsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SuperChatEventsService {
+        SuperChatEventsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -16170,14 +16212,17 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut 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()];
+    pub async fn list(
+        &self,
+        params: &SuperChatEventsListParams,
+    ) -> Result<SuperChatEventListResponse> {
+        let rel_path = format!("youtube/v3/superChatEvents",);
+        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?;
@@ -16197,49 +16242,84 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &CaptionsDeleteParams) -> Result<()> {
-        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, "DELETE", 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 `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(
-        &mut self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-    ) -> Result<Caption> {
-        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()];
+    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?;
@@ -16261,148 +16341,44 @@
         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(
-        &mut self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-        data: hyper::body::Bytes,
-    ) -> Result<Caption> {
-        let rel_path = format!("/upload/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!("?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 mut self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-    ) -> Result<ResumableUpload<'client, Caption>> {
-        let rel_path = format!("/resumable/upload/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!("?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)))?
-        }
-    }
-
-    /// Downloads a caption track.
-    ///
-    /// This method potentially downloads data. See documentation of `Download`.
-    pub async fn download<'a>(
-        &'a mut 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: &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(
-        &mut self,
-        params: &CaptionsUpdateParams,
-        req: &Caption,
-    ) -> Result<Caption> {
-        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()];
+    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?;
@@ -16424,72 +16400,199 @@
         do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
     }
 
-    /// Updates an existing resource.
-    ///
-    /// This method is a variant of `update()`, taking data for upload. It performs a multipart upload.
-    pub async fn update_upload(
-        &mut self,
-        params: &CaptionsUpdateParams,
-        req: &Caption,
-        data: hyper::body::Bytes,
-    ) -> Result<Caption> {
-        let rel_path = format!("/upload/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!("?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, "PUT", opt_request, data).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 {
+    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 `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.
-    ///
-    /// This method is a variant of `update()`, 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 update_resumable_upload<'client>(
-        &'client mut self,
-        params: &CaptionsUpdateParams,
-        req: &Caption,
-    ) -> Result<ResumableUpload<'client, Caption>> {
-        let rel_path = format!("/resumable/upload/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!("?uploadType=resumable{params}", params = params);
+    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));
         }
@@ -16498,44 +16601,393 @@
 
         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, "PUT", 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 I18nRegions service represents the I18nRegions resource.
-pub struct I18nRegionsService {
+        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 + std::ops::Deref<Target = Authenticator>>,
+    authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
 
     base_url: String,
     root_url: String,
 }
 
-impl I18nRegionsService {
-    /// Create a new I18nRegionsService object. The easiest way to call this is wrapping the Authenticator
+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))`.
+    /// 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 + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> I18nRegionsService {
-        I18nRegionsService {
+    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 {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -16587,9 +17039,403 @@
             .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(&mut self, params: &I18nRegionsListParams) -> Result<I18nRegionListResponse> {
-        let rel_path = format!("youtube/v3/i18nRegions",);
+    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![];
@@ -16615,12 +17461,504 @@
         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.
 pub struct ChannelBannersService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
 
     base_url: String,
@@ -16631,10 +17969,7 @@
     /// Create a new ChannelBannersService 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 + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> ChannelBannersService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelBannersService {
         ChannelBannersService {
             client: client,
             authenticator: Box::new(auth),
@@ -16689,7 +18024,7 @@
 
     /// Inserts a new resource into this collection.
     pub async fn insert(
-        &mut self,
+        &self,
         params: &ChannelBannersInsertParams,
         req: &ChannelBannerResource,
     ) -> Result<ChannelBannerResource> {
@@ -16725,7 +18060,7 @@
     ///
     /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
     pub async fn insert_upload(
-        &mut self,
+        &self,
         params: &ChannelBannersInsertParams,
         req: &ChannelBannerResource,
         data: hyper::body::Bytes,
@@ -16766,7 +18101,7 @@
     /// 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 mut self,
+        &'client self,
         params: &ChannelBannersInsertParams,
         req: &ChannelBannerResource,
     ) -> Result<ResumableUpload<'client, ChannelBannerResource>> {
@@ -16814,25 +18149,22 @@
     }
 }
 
-/// The Youtube Watermarks service represents the Watermarks resource.
-pub struct WatermarksService {
+/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
+pub struct LiveBroadcastsService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    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
+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))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> WatermarksService {
-        WatermarksService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveBroadcastsService {
+        LiveBroadcastsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -16884,15 +18216,84 @@
             .collect();
     }
 
-    /// Allows removal of channel watermark.
-    pub async fn unset(&mut 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()];
+    /// 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
+    }
+
+    /// 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?;
@@ -16913,15 +18314,77 @@
         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(&mut 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()];
+    /// 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.
+    pub async fn insert(
+        &self,
+        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?;
@@ -16942,73 +18405,127 @@
         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(
-        &mut 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 mut 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);
+}
+
+/// 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 `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) -> 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));
         }
@@ -17017,44 +18534,26 @@
 
         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 SuperChatEvents service represents the SuperChatEvents resource.
-pub struct SuperChatEventsService {
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Activities service represents the Activities resource.
+pub struct ActivitiesService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
 
     base_url: String,
     root_url: String,
 }
 
-impl SuperChatEventsService {
-    /// Create a new SuperChatEventsService object. The easiest way to call this is wrapping the Authenticator
+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))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> SuperChatEventsService {
-        SuperChatEventsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ActivitiesService {
+        ActivitiesService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -17107,11 +18606,8 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut self,
-        params: &SuperChatEventsListParams,
-    ) -> Result<SuperChatEventListResponse> {
-        let rel_path = format!("youtube/v3/superChatEvents",);
+    pub async fn list(&self, params: &ActivitiesListParams) -> Result<ActivityListResponse> {
+        let rel_path = format!("youtube/v3/activities",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -17139,10 +18635,1536 @@
     }
 }
 
+/// The Youtube Thumbnails service represents the Thumbnails resource.
+pub struct ThumbnailsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    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))`.
+    /// 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 {
+            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: &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
+    }
+
+    /// 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.
+    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
+    }
+}
+
+/// 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,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+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))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CaptionsService {
+        CaptionsService {
+            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: &CaptionsDeleteParams) -> Result<()> {
+        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, "DELETE", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &CaptionsUpdateParams, req: &Caption) -> Result<Caption> {
+        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;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    ///
+    /// This method is a variant of `update()`, taking data for upload. It performs a multipart upload.
+    pub async fn update_upload(
+        &self,
+        params: &CaptionsUpdateParams,
+        req: &Caption,
+        data: hyper::body::Bytes,
+    ) -> Result<Caption> {
+        let rel_path = format!("/upload/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!("?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, "PUT", opt_request, data).await
+    }
+
+    /// Updates an existing resource.
+    ///
+    /// This method is a variant of `update()`, 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 update_resumable_upload<'client>(
+        &'client self,
+        params: &CaptionsUpdateParams,
+        req: &Caption,
+    ) -> Result<ResumableUpload<'client, Caption>> {
+        let rel_path = format!("/resumable/upload/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!("?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, "PUT", 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 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",);
+        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: &CaptionsInsertParams,
+        req: &Caption,
+        data: hyper::body::Bytes,
+    ) -> Result<Caption> {
+        let rel_path = format!("/upload/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!("?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: &CaptionsInsertParams,
+        req: &Caption,
+    ) -> Result<ResumableUpload<'client, Caption>> {
+        let rel_path = format!("/resumable/upload/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!("?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 I18nRegions service represents the I18nRegions resource.
+pub struct I18nRegionsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+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))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nRegionsService {
+        I18nRegionsService {
+            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: &I18nRegionsListParams) -> Result<I18nRegionListResponse> {
+        let rel_path = format!("youtube/v3/i18nRegions",);
+        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 `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) -> 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 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 `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) -> 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 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 `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) -> AbuseReportsService {
+        AbuseReportsService {
+            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: &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 MembershipsLevels service represents the MembershipsLevels resource.
 pub struct MembershipsLevelsService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
 
     base_url: String,
@@ -17153,10 +20175,7 @@
     /// 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 + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> MembershipsLevelsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembershipsLevelsService {
         MembershipsLevelsService {
             client: client,
             authenticator: Box::new(auth),
@@ -17211,7 +20230,7 @@
 
     /// Retrieves a list of all pricing levels offered by a creator to the fans.
     pub async fn list(
-        &mut self,
+        &self,
         params: &MembershipsLevelsListParams,
     ) -> Result<MembershipsLevelListResponse> {
         let rel_path = format!("youtube/v3/membershipsLevels",);
@@ -17220,2631 +20239,9 @@
         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 + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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();
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut 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(&mut 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(
-        &mut 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 mut 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(
-        &mut 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
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut 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
-    }
-
-    /// Adds a like or dislike rating to a video or removes a rating from a video.
-    pub async fn rate(&mut 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
-    }
-
-    /// Report abuse for a video.
-    pub async fn report_abuse(
-        &mut 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(&mut 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
-    }
-}
-
-/// The Youtube ThirdPartyLinks service represents the ThirdPartyLinks resource.
-pub struct ThirdPartyLinksService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        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(&mut 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
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut 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(
-        &mut 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(&mut 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
-    }
-}
-
-/// The Youtube I18nLanguages service represents the I18nLanguages resource.
-pub struct I18nLanguagesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-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))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> I18nLanguagesService {
-        I18nLanguagesService {
-            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(
-        &mut self,
-        params: &I18nLanguagesListParams,
-    ) -> Result<I18nLanguageListResponse> {
-        let rel_path = format!("youtube/v3/i18nLanguages",);
-        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 Thumbnails service represents the Thumbnails resource.
-pub struct ThumbnailsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    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))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        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(&mut 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(
-        &mut 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 mut 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 Activities service represents the Activities resource.
-pub struct ActivitiesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-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))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> ActivitiesService {
-        ActivitiesService {
-            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(&mut self, params: &ActivitiesListParams) -> Result<ActivityListResponse> {
-        let rel_path = format!("youtube/v3/activities",);
-        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 Playlists service represents the Playlists resource.
-pub struct PlaylistsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut 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
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut 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
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut 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
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut 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
-    }
-}
-
-/// The Youtube VideoCategories service represents the VideoCategories resource.
-pub struct VideoCategoriesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        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(
-        &mut 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 LiveChatModerators service represents the LiveChatModerators resource.
-pub struct LiveChatModeratorsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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(&mut 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
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut 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
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut 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()];
-            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 + std::ops::Deref<Target = Authenticator>>,
-    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 `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        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(&mut 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 CommentThreads service represents the CommentThreads resource.
-pub struct CommentThreadsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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();
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut 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(
-        &mut 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
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut 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
-    }
-}
-
-/// The Youtube ChannelSections service represents the ChannelSections resource.
-pub struct ChannelSectionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> ChannelSectionsService {
-        ChannelSectionsService {
-            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(
-        &mut 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(
-        &mut 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
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut 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
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut 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 LiveChatMessages service represents the LiveChatMessages resource.
-pub struct LiveChatMessagesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        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(
-        &mut 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(
-        &mut 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
-    }
-
-    /// Deletes a chat message.
-    pub async fn delete(&mut 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
-    }
-}
-
-/// The Youtube Subscriptions service represents the Subscriptions resource.
-pub struct SubscriptionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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(
-        &mut 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(&mut 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(
-        &mut 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 LiveChatBans service represents the LiveChatBans resource.
-pub struct LiveChatBansService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        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(&mut 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(
-        &mut 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 Search service represents the Search resource.
-pub struct SearchService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        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(&mut 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 PlaylistItems service represents the PlaylistItems resource.
-pub struct PlaylistItemsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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(
-        &mut 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
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut 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
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut 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(
-        &mut 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()];
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -19869,7 +20266,7 @@
 /// The Youtube VideoAbuseReportReasons service represents the VideoAbuseReportReasons resource.
 pub struct VideoAbuseReportReasonsService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
 
     base_url: String,
@@ -19880,7 +20277,7 @@
     /// Create a new VideoAbuseReportReasonsService 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 + std::ops::Deref<Target = Authenticator>>(
+    pub fn new<A: 'static + DerefAuth>(
         client: TlsClient,
         auth: A,
     ) -> VideoAbuseReportReasonsService {
@@ -19938,7 +20335,7 @@
 
     /// Retrieves a list of resources, possibly filtered.
     pub async fn list(
-        &mut self,
+        &self,
         params: &VideoAbuseReportReasonsListParams,
     ) -> Result<VideoAbuseReportReasonListResponse> {
         let rel_path = format!("youtube/v3/videoAbuseReportReasons",);
@@ -19969,838 +20366,10 @@
     }
 }
 
-/// The Youtube AbuseReports service represents the AbuseReports resource.
-pub struct AbuseReportsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> AbuseReportsService {
-        AbuseReportsService {
-            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(
-        &mut 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 Channels service represents the Channels resource.
-pub struct ChannelsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-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))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> ChannelsService {
-        ChannelsService {
-            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(&mut 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(
-        &mut self,
-        params: &ChannelsUpdateParams,
-        req: &Channel,
-    ) -> Result<Channel> {
-        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::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 Sponsors service represents the Sponsors resource.
-pub struct SponsorsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl SponsorsService {
-    /// Create a new SponsorsService 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 + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> SponsorsService {
-        SponsorsService {
-            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 sponsors that match the request criteria for a channel.
-    pub async fn list(&mut self, params: &SponsorsListParams) -> Result<SponsorListResponse> {
-        let rel_path = format!("youtube/v3/sponsors",);
-        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 LiveStreams service represents the LiveStreams resource.
-pub struct LiveStreamsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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();
-    }
-
-    /// Deletes an existing stream for the authenticated user.
-    pub async fn delete(&mut 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(&mut 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
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &mut 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
-    }
-
-    /// Updates an existing stream for the authenticated user.
-    pub async fn update(
-        &mut 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
-    }
-}
-
-/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
-pub struct LiveBroadcastsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    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))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> LiveBroadcastsService {
-        LiveBroadcastsService {
-            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 broadcast for the authenticated user.
-    pub async fn update(
-        &mut 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
-    }
-
-    /// Delete a given broadcast.
-    pub async fn delete(&mut 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
-    }
-
-    /// Retrieve the list of broadcasts associated with the given channel.
-    pub async fn list(
-        &mut 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(&mut 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
-    }
-
-    /// Transition a broadcast to a given status.
-    pub async fn transition(
-        &mut 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
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &mut self,
-        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?;
-        }
-        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
-    }
-
-    /// Slate and recording control of the live broadcast. Support actions: slate on/off, recording start/stop/pause/resume. Design doc: goto/yt-api-liveBroadcast-control
-    pub async fn control(&mut self, params: &LiveBroadcastsControlParams) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/control",);
-        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
-    }
-}
-
 /// The Youtube Members service represents the Members resource.
 pub struct MembersService {
     client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
 
     base_url: String,
@@ -20811,10 +20380,7 @@
     /// Create a new MembersService 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 + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> MembersService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembersService {
         MembersService {
             client: client,
             authenticator: Box::new(auth),
@@ -20868,14 +20434,16 @@
     }
 
     /// Retrieves a list of members that match the request criteria for a channel.
-    pub async fn list(&mut self, params: &MembersListParams) -> Result<MemberListResponse> {
+    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::Youtubepartner.as_ref().to_string()];
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;