changeset 222:2f7355889c05

regenerate youtube
author Daniel Boline <ddboline@gmail.com>
date Sun, 28 Feb 2021 11:42:33 -0500
parents a19056bcc2c9
children 54fbd7bd5217
files example_crates/youtube_example/src/youtube_v3_types.rs
diffstat 1 files changed, 17264 insertions(+), 17264 deletions(-) [+]
line wrap: on
line diff
--- a/example_crates/youtube_example/src/youtube_v3_types.rs	Sun Feb 28 11:31:49 2021 -0500
+++ b/example_crates/youtube_example/src/youtube_v3_types.rs	Sun Feb 28 11:42:33 2021 -0500
@@ -21,18 +21,10 @@
 /// Scopes of this API. Convertible to their string representation with `AsRef`.
 #[derive(Debug, Clone, Copy)]
 pub enum YoutubeScopes {
-    /// View your YouTube account
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube.readonly
-    YoutubeReadonly,
     /// Manage your YouTube videos
     ///
     /// URL: https://www.googleapis.com/auth/youtube.upload
     YoutubeUpload,
-    /// See a list of your current active channel members, their current level, and when they became a member
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube.channel-memberships.creator
-    YoutubeChannelMembershipsCreator,
     /// View private information of your YouTube channel relevant during the audit process with a YouTube partner
     ///
     /// URL: https://www.googleapis.com/auth/youtubepartner-channel-audit
@@ -41,10 +33,18 @@
     ///
     /// URL: https://www.googleapis.com/auth/youtube
     Youtube,
+    /// View your YouTube account
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube.readonly
+    YoutubeReadonly,
     /// See, edit, and permanently delete your YouTube videos, ratings, comments and captions
     ///
     /// URL: https://www.googleapis.com/auth/youtube.force-ssl
     YoutubeForceSsl,
+    /// See a list of your current active channel members, their current level, and when they became a member
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube.channel-memberships.creator
+    YoutubeChannelMembershipsCreator,
     /// View and manage your assets and associated content on YouTube
     ///
     /// URL: https://www.googleapis.com/auth/youtubepartner
@@ -54,960 +54,32 @@
 impl std::convert::AsRef<str> for YoutubeScopes {
     fn as_ref(&self) -> &'static str {
         match self {
-            YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
             YoutubeScopes::YoutubeUpload => "https://www.googleapis.com/auth/youtube.upload",
-            YoutubeScopes::YoutubeChannelMembershipsCreator => {
-                "https://www.googleapis.com/auth/youtube.channel-memberships.creator"
-            }
             YoutubeScopes::YoutubepartnerChannelAudit => {
                 "https://www.googleapis.com/auth/youtubepartner-channel-audit"
             }
             YoutubeScopes::Youtube => "https://www.googleapis.com/auth/youtube",
+            YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
             YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
+            YoutubeScopes::YoutubeChannelMembershipsCreator => {
+                "https://www.googleapis.com/auth/youtube.channel-memberships.creator"
+            }
             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 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>>,
-    /// 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 times the video has been viewed.
-    #[serde(rename = "viewCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub view_count: Option<String>,
-    /// u64: The number of users who have indicated that they liked the video by giving it a positive rating.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<String>,
-    /// u64: The number of users who have indicated that they disliked the video by giving it a negative rating.
-    #[serde(rename = "dislikeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dislike_count: Option<String>,
-    /// u64: The number of users who currently have the video marked as a favorite video.
-    #[serde(rename = "favoriteCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub favorite_count: Option<String>,
-    /// u64: The number of comments for the video.
-    #[serde(rename = "commentCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_count: Option<String>,
-}
-
-/// Details about the content to witch a subscription refers.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionContentDetails {
-    /// The number of new items in the subscription since its content was last read.
-    #[serde(rename = "newItemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub new_item_count: Option<u32>,
-    /// The type of activity this subscription is for (only uploads, everything).
-    #[serde(rename = "activityType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub activity_type: Option<SubscriptionContentDetailsActivityType>,
-    /// The approximate number of items that the subscription points to.
-    #[serde(rename = "totalItemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_item_count: Option<u32>,
-}
-
-/// Basic information about a third party account link, including its type and type-specific information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinkSnippet {
-    /// Type of the link named after the entities that are being linked.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ThirdPartyLinkSnippetType>,
-    #[serde(rename = "channelToStoreLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_to_store_link: Option<ChannelToStoreLinkDetails>,
-}
-
-/// Stub token pagination template to suppress results.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TokenPagination {}
-
-/// Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and editor suggestions.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSuggestions {
-    /// A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.
-    #[serde(rename = "processingWarnings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_warnings: Option<Vec<VideoSuggestionsProcessingWarnings>>,
-    /// A list of suggestions that may improve YouTube's ability to process the video.
-    #[serde(rename = "processingHints")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_hints: Option<Vec<VideoSuggestionsProcessingHints>>,
-    /// A list of video editing operations that might improve the video quality or playback experience of the uploaded video.
-    #[serde(rename = "editorSuggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub editor_suggestions: Option<Vec<VideoSuggestionsEditorSuggestions>>,
-    /// A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed.
-    #[serde(rename = "processingErrors")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_errors: Option<Vec<VideoSuggestionsProcessingErrors>>,
-    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
-    #[serde(rename = "tagSuggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
-}
-
-/// Basic details about a channel, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSnippet {
-    /// The custom url of the channel.
-    #[serde(rename = "customUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub custom_url: Option<String>,
-    /// DateTime: The date and time that the channel was created.
-    #[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 reason that YouTube failed to process the caption track. This property is only present if the state property's value is failed.
-    #[serde(rename = "failureReason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub failure_reason: Option<CaptionSnippetFailureReason>,
-    /// Indicates whether caption track is formatted for "easy reader," meaning it is at a third-grade level for language learners. The default value is false.
-    #[serde(rename = "isEasyReader")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_easy_reader: Option<bool>,
-    /// The caption track's type.
-    #[serde(rename = "trackKind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub track_kind: Option<CaptionSnippetTrackKind>,
-    /// The language of the caption track. The property value is a BCP-47 language tag.
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-    /// Indicates whether YouTube synchronized the caption track to the audio track in the video. The value will be true if a sync was explicitly requested when the caption track was uploaded. For example, when calling the captions.insert or captions.update methods, you can set the sync parameter to true to instruct YouTube to sync the uploaded track to the video. If the value is false, YouTube uses the time codes in the uploaded caption track to determine when to display captions.
-    #[serde(rename = "isAutoSynced")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_auto_synced: Option<bool>,
-    /// Indicates whether the caption track uses large text for the vision-impaired. The default value is false.
-    #[serde(rename = "isLarge")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_large: Option<bool>,
-    /// DateTime: The date and time when the caption track was last updated.
-    #[serde(rename = "lastUpdated")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub last_updated: Option<DateTime<Utc>>,
-    /// The ID that YouTube uses to uniquely identify the video associated with the caption track. @mutable youtube.captions.insert
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// The caption track's status.
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<CaptionSnippetStatus>,
-    /// Indicates whether the caption track is a draft. If the value is true, then the track is not publicly visible. The default value is false. @mutable youtube.captions.insert youtube.captions.update
-    #[serde(rename = "isDraft")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_draft: Option<bool>,
-    /// Indicates whether the track contains closed captions for the deaf and hard of hearing. The default value is false.
-    #[serde(rename = "isCC")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_c_c: Option<bool>,
-    /// The name of the caption track. The name is intended to be visible to the user as an option during playback.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: 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>,
-}
-
-/// 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<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>,
+/// 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>,
 }
 
 /// 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.
@@ -1017,43 +89,89 @@
     #[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>,
+    pub snippet: Option<LiveChatModeratorSnippet>,
+}
+
+/// 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 {
+    /// 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>,
+    /// 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>,
+}
+
+/// Stub token pagination template to suppress results.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TokenPagination {}
+
+/// Live broadcast state.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastStatus {
+    /// The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<LiveBroadcastStatusPrivacyStatus>,
+    /// The broadcast's status. The status can be updated using the API's liveBroadcasts.transition method.
+    #[serde(rename = "lifeCycleStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub life_cycle_status: Option<LiveBroadcastStatusLifeCycleStatus>,
+    /// The broadcast's recording status.
+    #[serde(rename = "recordingStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_status: Option<LiveBroadcastStatusRecordingStatus>,
+    /// Priority of the live broadcast event (internal state).
+    #[serde(rename = "liveBroadcastPriority")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_priority: Option<LiveBroadcastStatusLiveBroadcastPriority>,
+    /// 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>,
+}
+
+/// LINT.IfChange Describes an invideo branding.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoBranding {
+    #[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>,
+    #[serde(rename = "timing")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub timing: Option<InvideoTiming>,
+    /// The bytes the uploaded image. Only used in api to youtube communication.
+    #[serde(rename = "imageBytes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_bytes: Option<String>,
+    /// The 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>,
 }
 
 ///
@@ -1063,719 +181,44 @@
     #[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>,
-    /// DateTime: The time that the broadcast actually ended. This value will not be available until the broadcast is over.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<DateTime<Utc>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelProfileDetails {
-    /// The channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: Option<String>,
-    /// The channel's display name.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// The channels's avatar URL.
-    #[serde(rename = "profileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_image_url: Option<String>,
-    /// The YouTube channel ID.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperStickerDetails {
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The currency in which the purchase was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-    #[serde(rename = "superStickerMetadata")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
-    #[serde(rename = "tier")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tier: Option<u32>,
-}
-
-/// Basic details about a channel section, including title, style and position.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionSnippet {
-    /// The channel section's title for multiple_playlists and multiple_channels.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel that published the channel section.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The style of the channel section.
-    #[serde(rename = "style")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub style: Option<ChannelSectionSnippetStyle>,
-    /// The language of the channel section's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<ChannelSectionLocalization>,
-    /// The type of the channel section.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ChannelSectionSnippetType>,
-    /// The position of the channel section in the channel.
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<u32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatUserBannedMessageDetails {
-    #[serde(rename = "bannedUserDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banned_user_details: Option<ChannelProfileDetails>,
-    /// The type of ban.
-    #[serde(rename = "banType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_type: Option<LiveChatUserBannedMessageDetailsBanType>,
-    /// u64: The duration of the ban. This property is only present if the banType is temporary.
-    #[serde(rename = "banDurationSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_duration_seconds: Option<String>,
-}
-
-/// Details about a social network post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSocial {
-    /// The author of the social network post.
-    #[serde(rename = "author")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author: Option<String>,
-    /// An image of the post's author.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The URL of the social network post.
-    #[serde(rename = "referenceUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reference_url: Option<String>,
-    /// The name of the social network.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ActivityContentDetailsSocialType>,
-}
-
-/// A single tag suggestion with it's relevance information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSuggestionsTagSuggestion {
-    /// 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 = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The group ID associated with the activity. A group ID identifies user events that are associated with the same user and resource. For example, if a user rates a video and marks the same video as a favorite, the entries for those events would have the same group ID in the user's activity feed. In your user interface, you can avoid repetition by grouping events with the same groupId value.
-    #[serde(rename = "groupId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub group_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel associated with the activity.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// Channel title for the channel responsible for this activity
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The type of activity that the resource describes.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<ActivitySnippetType>,
-}
-
-/// Detailed settings of a broadcast.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastContentDetails {
-    /// This setting indicates whether auto stop is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
-    #[serde(rename = "enableAutoStop")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_auto_stop: Option<bool>,
-    /// The 3D stereo layout of this broadcast. This defaults to mono.
-    #[serde(rename = "stereoLayout")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stereo_layout: Option<LiveBroadcastContentDetailsStereoLayout>,
-    /// This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. *Important:* You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends.
-    #[serde(rename = "enableDvr")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_dvr: Option<bool>,
-    /// This value uniquely identifies the live stream bound to the broadcast.
-    #[serde(rename = "boundStreamId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bound_stream_id: Option<String>,
-    /// This setting indicates whether YouTube should enable content encryption for the broadcast.
-    #[serde(rename = "enableContentEncryption")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_content_encryption: Option<bool>,
-    /// This setting indicates whether HTTP POST closed captioning is enabled for this broadcast. The ingestion URL of the closed captions is returned through the liveStreams API. This is mutually exclusive with using the closed_captions_type property, and is equivalent to setting closed_captions_type to CLOSED_CAPTIONS_HTTP_POST.
-    #[serde(rename = "enableClosedCaptions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_closed_captions: Option<bool>,
-    /// This setting indicates whether auto start is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
-    #[serde(rename = "enableAutoStart")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_auto_start: Option<bool>,
-    /// This setting indicates whether the broadcast should automatically begin with an in-stream slate when you update the broadcast's status to live. After updating the status, you then need to send a liveCuepoints.insert request that sets the cuepoint's eventState to end to remove the in-stream slate and make your broadcast stream visible to viewers.
-    #[serde(rename = "startWithSlate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start_with_slate: Option<bool>,
-    /// The mesh for projecting the video if projection is mesh. The mesh value must be a UTF-8 string containing the base-64 encoding of 3D mesh data that follows the Spherical Video V2 RFC specification for an mshp box, excluding the box size and type but including the following four reserved zero bytes for the version and flags.
-    #[serde(rename = "mesh")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mesh: Option<String>,
-    /// This setting indicates whether the broadcast video can be played in an embedded player. If you choose to archive the video (using the enableArchive property), this setting will also apply to the archived video.
-    #[serde(rename = "enableEmbed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_embed: Option<bool>,
-    /// Indicates whether this broadcast has low latency enabled.
-    #[serde(rename = "enableLowLatency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_low_latency: Option<bool>,
-    /// DateTime: The date and time that the live stream referenced by boundStreamId was last updated.
-    #[serde(rename = "boundStreamLastUpdateTimeMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bound_stream_last_update_time_ms: Option<DateTime<Utc>>,
-    #[serde(rename = "monitorStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monitor_stream: Option<MonitorStreamInfo>,
-    /// The projection format of this broadcast. This defaults to rectangular.
-    #[serde(rename = "projection")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub projection: Option<LiveBroadcastContentDetailsProjection>,
-    /// If both this and enable_low_latency are set, they must match. LATENCY_NORMAL should match enable_low_latency=false LATENCY_LOW should match enable_low_latency=true LATENCY_ULTRA_LOW should have enable_low_latency omitted.
-    #[serde(rename = "latencyPreference")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub latency_preference: Option<LiveBroadcastContentDetailsLatencyPreference>,
-    #[serde(rename = "closedCaptionsType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
-    /// Automatically start recording after the event goes live. The default value for this property is true. *Important:* You must also set the enableDvr property's value to true if you want the playback to be available immediately after the broadcast ends. If you set this property's value to true but do not also set the enableDvr property to true, there may be a delay of around one day before the archived video will be available for playback.
-    #[serde(rename = "recordFromStart")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub record_from_start: Option<bool>,
-}
-
-/// Player to be used for a video playback.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoPlayer {
-    /// An <iframe> tag that embeds a player that will play the video.
-    #[serde(rename = "embedHtml")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_html: Option<String>,
-    /// i64: The embed width
-    #[serde(rename = "embedWidth")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_width: Option<String>,
-    /// i64:
-    #[serde(rename = "embedHeight")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_height: Option<String>,
-}
-
-/// Basic broadcast information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastSnippet {
-    /// Indicates whether this broadcast is the default broadcast. Internal only.
-    #[serde(rename = "isDefaultBroadcast")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_default_broadcast: Option<bool>,
-    /// DateTime: The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<DateTime<Utc>>,
-    /// The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// DateTime: The date and time that the broadcast actually started. This information is only available once the broadcast's state is live.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<DateTime<Utc>>,
-    /// DateTime: The date and time that the broadcast was added to YouTube's live broadcast schedule.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// DateTime: The date and time that the broadcast is scheduled to start.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<DateTime<Utc>>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The broadcast's description. As with the title, you can set this field by modifying the broadcast resource or by setting the description field of the corresponding video resource.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The id of the live chat for this broadcast.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    /// DateTime: The date and time that the broadcast is scheduled to end.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<DateTime<Utc>>,
-    /// The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-/// Playlist localization setting
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistLocalization {
-    /// The localized strings for playlist's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The localized strings for playlist's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorSnippet {
-    #[serde(rename = "moderatorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderator_details: Option<ChannelProfileDetails>,
-    /// The ID of the live chat this moderator can act on.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelListResponse".
-    #[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>,
+    /// Pricing level ID.
+    #[serde(rename = "level")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub level: Option<String>,
+}
+
+/// Geographical coordinates of a point, in WGS84.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct GeoPoint {
+    /// 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>,
+    /// Altitude above the reference ellipsoid, in meters.
+    #[serde(rename = "altitude")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub altitude: Option<f64>,
+}
+
+/// 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>,
 }
 
 /// Branding properties for the watch. All deprecated.
@@ -1795,6 +238,1105 @@
     pub featured_playlist_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>,
+}
+
+/// 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>,
+}
+
+/// Basic details about a video, including title, description, uploader, thumbnails and category.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSnippet {
+    /// The language of the videos's default snippet.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: 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 description. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: 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>>,
+    /// 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>>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The YouTube video category associated with the video.
+    #[serde(rename = "categoryId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub category_id: 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>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<VideoLocalization>,
+    /// 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 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 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>,
+}
+
+/// 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>,
+    /// 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>,
+    /// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamConfigurationIssue {
+    /// How severe this issue is to the stream.
+    #[serde(rename = "severity")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub severity: Option<LiveStreamConfigurationIssueSeverity>,
+    /// The 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>,
+    /// The kind of error happening.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<LiveStreamConfigurationIssueType>,
+}
+
+/// 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>,
+}
+
+/// 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>>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSection {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ChannelSectionSnippet>,
+    #[serde(rename = "targeting")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub targeting: Option<ChannelSectionTargeting>,
+    /// 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>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ChannelSectionContentDetails>,
+}
+
+/// Details about the content to witch a subscription refers.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionContentDetails {
+    /// The type of activity this subscription is for (only uploads, everything).
+    #[serde(rename = "activityType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub activity_type: Option<SubscriptionContentDetailsActivityType>,
+    /// The approximate number of items that the subscription points to.
+    #[serde(rename = "totalItemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_item_count: Option<u32>,
+    /// The number of new items in the subscription since its content was last read.
+    #[serde(rename = "newItemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub new_item_count: Option<u32>,
+}
+
+/// 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>,
+}
+
+/// Branding properties for images associated with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ImageSettings {
+    #[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>,
+    /// This is generated when a ChannelBanner.Insert request has succeeded for the given channel.
+    #[serde(rename = "bannerExternalUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_external_url: Option<String>,
+    /// Banner image. Tablet size low resolution (1138x188).
+    #[serde(rename = "bannerTabletLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_low_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>,
+    #[serde(rename = "smallBrandedBannerImageImapScript")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
+    /// 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 medium resolution (1280x720).
+    #[serde(rename = "bannerTvMediumImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_medium_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>,
+    /// Banner image. Tablet size (1707x283).
+    #[serde(rename = "bannerTabletImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_image_url: Option<String>,
+    /// The URL for a 1px by 1px tracking pixel that can be used to collect statistics for views of the channel or video pages.
+    #[serde(rename = "trackingImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tracking_image_url: Option<String>,
+    /// Banner image. Tablet size 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. TV size high resolution (1920x1080).
+    #[serde(rename = "bannerTvHighImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_high_image_url: Option<String>,
+    /// Banner image. 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>,
+    #[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>,
+    #[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>,
+}
+
+/// A single tag suggestion with it's relevance information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSuggestionsTagSuggestion {
+    /// 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>>,
+    /// The keyword tag suggested for the video.
+    #[serde(rename = "tag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag: 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 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 currency in which the purchase was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: 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>,
+    /// The comment added by the user to this Super Chat event.
+    #[serde(rename = "userComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_comment: Option<String>,
+    /// A rendered string that displays the fund amount and currency to the user.
+    #[serde(rename = "amountDisplayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_display_string: Option<String>,
+}
+
+/// 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 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>,
+}
+
+/// 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 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 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 privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<VideoStatusPrivacyStatus>,
+    /// DateTime: The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private..
+    #[serde(rename = "publishAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub publish_at: Option<DateTime<Utc>>,
+    /// This value 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>,
+    #[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 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>,
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+}
+
+/// Information specific to a store on a merchandising platform linked to a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelToStoreLinkDetails {
+    /// Landing page of the store.
+    #[serde(rename = "storeUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub store_url: Option<String>,
+    /// Name of the store.
+    #[serde(rename = "storeName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub store_name: 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 = "subject")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subject: Option<Entity>,
+    #[serde(rename = "relatedEntities")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub related_entities: Option<Vec<RelatedEntity>>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRatingListResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoGetRatingResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// 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 ratings that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<VideoRating>>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// 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>,
+}
+
+/// Branding properties for the channel view.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSettings {
+    /// 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>,
+    /// Specifies the channel 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>,
+    /// Specifies the channel description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: 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>,
+    /// 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>,
+    /// 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>,
+    /// Whether the tab to browse the videos should be displayed.
+    #[serde(rename = "showBrowseView")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub show_browse_view: Option<bool>,
+    /// Whether user-submitted comments left on the channel page need to be approved by the channel owner to be publicly visible.
+    #[serde(rename = "moderateComments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderate_comments: Option<bool>,
+    /// Title for the featured channels tab.
+    #[serde(rename = "featuredChannelsTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_channels_title: Option<String>,
+    /// Which content tab users should see when viewing the channel.
+    #[serde(rename = "defaultTab")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_tab: Option<String>,
+}
+
+/// Internal representation of thumbnails for a YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailDetails {
+    #[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>,
+    #[serde(rename = "standard")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub standard: Option<Thumbnail>,
+}
+
+/// An *activity* resource contains information about an action that a particular channel, or user, has taken on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of action, the channel associated with the action, and the resource(s) associated with the action, such as the video that was rated or uploaded.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Activity {
+    /// Etag of this resource
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ActivityContentDetails>,
+    /// The ID that YouTube uses to uniquely identify the activity.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+///
+#[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>,
+    /// 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 = "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 = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    #[serde(rename = "textMessageDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_message_details: Option<LiveChatTextMessageDetails>,
+    #[serde(rename = "superChatDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_chat_details: Option<LiveChatSuperChatDetails>,
+    #[serde(rename = "userBannedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_banned_details: Option<LiveChatUserBannedMessageDetails>,
+    /// 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>,
+    /// 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>,
+    #[serde(rename = "messageDeletedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_deleted_details: Option<LiveChatMessageDeletedDetails>,
+    /// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorListResponse {
+    /// 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 = "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 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>,
+    /// 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>,
+    /// 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 TestItem {
+    /// i64:
+    #[serde(rename = "gaia")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub gaia: Option<String>,
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<TestItemTestItemSnippet>,
+}
+
+/// Basic details about a subscription's subscriber including title, description, channel ID and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionSubscriberSnippet {
+    /// The title of the subscriber.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The description of the subscriber.
+    #[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 ID of the subscriber.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+}
+
+/// Branding properties of a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBrandingSettings {
+    #[serde(rename = "image")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image: Option<ImageSettings>,
+    #[serde(rename = "watch")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch: Option<WatchSettings>,
+    #[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>>,
+}
+
+/// Basic details about a playlist, including title, description and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistSnippet {
+    /// The playlist's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// DateTime: The date and time that the playlist was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// 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>,
+    /// Keyword tags associated with the playlist.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<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>,
+    /// 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>,
+    #[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 language of the playlist'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<PlaylistLocalization>,
+}
+
+///
+#[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>,
+}
+
+/// 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>,
+    #[serde(rename = "replies")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub replies: Option<CommentThreadReplies>,
+    #[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>,
+    /// 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>,
+    #[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>,
+    /// 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>,
+    /// 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>,
+}
+
+///
+#[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>,
+}
+
+/// 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 = "comment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment: Option<ActivityContentDetailsComment>,
+    #[serde(rename = "subscription")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscription: Option<ActivityContentDetailsSubscription>,
+    #[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 = "recommendation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recommendation: Option<ActivityContentDetailsRecommendation>,
+    #[serde(rename = "social")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub social: Option<ActivityContentDetailsSocial>,
+    #[serde(rename = "favorite")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorite: Option<ActivityContentDetailsFavorite>,
+    #[serde(rename = "promotedItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub promoted_item: Option<ActivityContentDetailsPromotedItem>,
+    #[serde(rename = "like")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like: Option<ActivityContentDetailsLike>,
+    #[serde(rename = "upload")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload: Option<ActivityContentDetailsUpload>,
+    #[serde(rename = "channelItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_item: Option<ActivityContentDetailsChannelItem>,
+}
+
+/// 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 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 reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.
+    #[serde(rename = "processingWarnings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_warnings: Option<Vec<VideoSuggestionsProcessingWarnings>>,
+    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
+    #[serde(rename = "tagSuggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
+    /// A list of 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>>,
+}
+
+/// Basic details about a comment thread.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadSnippet {
+    /// 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 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>,
+    /// 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>,
+    /// 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>,
+}
+
+/// Information about a new playlist item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPlaylistItem {
+    /// 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>,
+    #[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>,
+}
+
+///
+#[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 LocalizedProperty {
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<LanguageTag>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<Vec<LocalizedString>>,
+    #[serde(rename = "default")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelListResponse {
+    /// 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 = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Channel>>,
+    /// 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#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 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>,
+    #[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>,
+}
+
+/// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadListResponse {
+    #[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#commentThreadListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: 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>>,
+    #[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>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The 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 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>,
+}
+
+/// 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 MemberListResponse {
+    /// 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>,
+    /// 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>,
+    /// 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>,
+    /// A list of members that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Member>>,
+}
+
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CaptionListResponse {
@@ -1802,10 +1344,6 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#captionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
     /// A list of captions that match the request criteria.
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -1814,35 +1352,1473 @@
     #[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#captionListResponse".
+    #[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>,
+}
+
+/// 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>>,
+}
+
+/// 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>,
+}
+
+/// 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 times the video has been viewed.
+    #[serde(rename = "viewCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub view_count: Option<String>,
+    /// u64: The number of users who have indicated that they liked the video by giving it a positive rating.
+    #[serde(rename = "likeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like_count: Option<String>,
+    /// u64: The number of users who currently have the video marked as a favorite video.
+    #[serde(rename = "favoriteCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorite_count: 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>,
+    /// 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>>,
+    /// 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 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>,
+    /// 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// 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#superChatEventListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchListResponse {
+    #[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>,
+    /// 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>,
+    /// Pagination information for token pagination.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<SearchResult>>,
+    /// 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 = "regionCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_code: 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#searchListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: 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>,
+}
+
+/// Basic details about a subscription, including title, description and thumbnails of the subscribed item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionSnippet {
+    /// 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>,
+    /// DateTime: The date and time that the subscription was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// 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>,
+    /// 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>,
+}
+
+/// A *i18nRegion* resource identifies a region where YouTube is available.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegion {
+    /// The ID that YouTube uses to uniquely identify the i18n region.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<I18nRegionSnippet>,
+    /// 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>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// Describes processing status and progress and availability of some other Video resource parts.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProcessingDetails {
+    #[serde(rename = "processingProgress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_progress: Option<VideoProcessingDetailsProcessingProgress>,
+    /// The video's processing status. This value indicates whether YouTube was able to process the video or if the video is still being processed.
+    #[serde(rename = "processingStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_status: Option<VideoProcessingDetailsProcessingStatus>,
+    /// This value indicates whether video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "editorSuggestionsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub editor_suggestions_availability: Option<String>,
+    /// 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 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 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 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>,
+    /// 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>,
+}
+
+/// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionListResponse {
+    #[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 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>,
+    /// A list of subscriptions that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Subscription>>,
+    /// 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>,
+    #[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>,
+}
+
+/// The conversionPings object encapsulates information about conversion pings that need to be respected by the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelConversionPings {
+    /// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
+    #[serde(rename = "pings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pings: Option<Vec<ChannelConversionPing>>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatSuperStickerDetails {
+    /// 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>,
+    #[serde(rename = "superStickerMetadata")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_metadata: Option<SuperStickerMetadata>,
+    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
+    #[serde(rename = "amountMicros")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_micros: Option<String>,
+    /// The currency in which the purchase was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+}
+
+/// Detailed settings of a broadcast.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastContentDetails {
+    /// 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>,
+    /// This setting indicates whether auto start is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
+    #[serde(rename = "enableAutoStart")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_auto_start: Option<bool>,
+    /// DateTime: The date and time that the live stream referenced by boundStreamId was last updated.
+    #[serde(rename = "boundStreamLastUpdateTimeMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bound_stream_last_update_time_ms: Option<DateTime<Utc>>,
+    /// 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>,
+    /// 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>,
+    /// 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>,
+    /// 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 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>,
+    /// 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>,
+    #[serde(rename = "closedCaptionsType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
+    /// 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 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>,
+    /// 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>,
+    #[serde(rename = "monitorStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub monitor_stream: Option<MonitorStreamInfo>,
+    /// The 3D stereo layout of this broadcast. This defaults to mono.
+    #[serde(rename = "stereoLayout")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub stereo_layout: Option<LiveBroadcastContentDetailsStereoLayout>,
+    /// This setting indicates whether 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>,
+}
+
+/// Describes a temporal position of a visual widget inside a video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoTiming {
+    /// 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>,
+    /// 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>,
+}
+
+/// Basic details about a channel, including title, description and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSnippet {
+    /// The channel's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// 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 = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The custom url of the channel.
+    #[serde(rename = "customUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub custom_url: Option<String>,
+    /// The description of the channel.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The country of the channel.
+    #[serde(rename = "country")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country: Option<String>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<ChannelLocalization>,
+    /// 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>>,
+}
+
+/// Information about a resource that received a positive (like) rating.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsLike {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct 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 = "superStickerMetadata")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_metadata: Option<SuperStickerMetadata>,
+    /// 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>,
+    /// Channel id where the event occurred.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: 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 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 currency in which the purchase was made. ISO 4217.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+    #[serde(rename = "supporterDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub supporter_details: Option<ChannelProfileDetails>,
+}
+
+///
+#[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 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>,
+    /// 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>,
+    /// Video game rating, if any.
+    #[serde(rename = "videoGameRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_game_rating: Option<VideoAgeGatingVideoGameRating>,
+}
+
+///
+#[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 previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Video>>,
+    /// 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>,
+    /// 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.
+    /// 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>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+}
+
+///
+#[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>,
+    /// 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 = "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>,
+    /// 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 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 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 ChannelSectionListResponse {
+    /// 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#channelSectionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: 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>>,
+}
+
+/// Basic details about an i18n language, such as language code and human-readable name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguageSnippet {
+    /// The human-readable name of the language in the language itself.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: Option<String>,
+    /// A short BCP-47 code that uniquely identifies a language.
+    #[serde(rename = "hl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hl: Option<String>,
+}
+
+/// 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>,
+    #[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>,
+    /// 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>,
+}
+
+/// 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 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>>,
+    /// 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>>,
+}
+
+/// 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 I18nRegionListResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// 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>,
+}
+
+/// 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>,
+    /// 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 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>,
+}
+
+/// 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 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>,
+    /// Whether or not the number of subscribers is shown for this user.
+    #[serde(rename = "hiddenSubscriberCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hidden_subscriber_count: Option<bool>,
+    /// u64: The number of videos uploaded to the channel.
+    #[serde(rename = "videoCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_count: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemContentDetails {
+    /// 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>>,
+    /// 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 stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video.
+    #[serde(rename = "endAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub end_at: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct 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 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>,
+}
+
+/// 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 {}
+
+/// 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>,
+    /// 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>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// 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>>,
+    /// 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>,
+    /// 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>,
+    /// 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>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// 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>,
+}
+
+/// 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>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<SubscriptionContentDetails>,
+    /// 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 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>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<SubscriptionSnippet>,
+}
+
+/// Information that identifies the recommended resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsRecommendation {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    #[serde(rename = "seedResourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub seed_resource_id: Option<ResourceId>,
+    /// The reason that the resource is recommended to the user.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<ActivityContentDetailsRecommendationReason>,
+}
+
+/// Basic broadcast information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastSnippet {
+    /// DateTime: The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<DateTime<Utc>>,
+    /// Indicates whether this broadcast is the default broadcast. Internal only.
+    #[serde(rename = "isDefaultBroadcast")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_default_broadcast: Option<bool>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The 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 broadcast's description. As with the title, you can set this field by modifying the broadcast resource or by setting the description field of the corresponding video resource.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// DateTime: The date and time that the broadcast is scheduled to start.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast is scheduled to end.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast was added to YouTube's live broadcast schedule.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// 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 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>>,
+    /// 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>,
+}
+
+/// Details about a social network post.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsSocial {
+    /// 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 name of the social network.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<ActivityContentDetailsSocialType>,
+    /// The URL of the social network post.
+    #[serde(rename = "referenceUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reference_url: Option<String>,
+    /// The author of the social network post.
+    #[serde(rename = "author")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author: Option<String>,
+}
+
+/// A `__videoAbuseReportReason__` resource identifies a reason that a video could be reported as abusive. Video abuse report reasons are used with `video.ReportAbuse`.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReason {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoAbuseReportReasonSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReason"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID of this abuse report reason.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// 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 {
+    /// Defines the context of the ping.
+    #[serde(rename = "context")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub context: Option<ChannelConversionPingContext>,
+    /// 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>,
+}
+
+/// 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>,
+    /// 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>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<PlaylistItemStatus>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<PlaylistItemSnippet>,
+}
+
+/// A live stream describes a live ingestion point.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStream {
+    /// 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 = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveStreamContentDetails>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// 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<LiveStreamSnippet>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamStatus>,
+    #[serde(rename = "cdn")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cdn: Option<CdnSettings>,
+}
+
+/// A channel banner returned as the response to a channel_banner.insert call.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBannerResource {
+    #[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>,
-    /// (Optional) Height of the thumbnail image.
-    #[serde(rename = "height")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height: Option<u32>,
+    /// 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 LiveChatUserBannedMessageDetails {
+    /// The type of ban.
+    #[serde(rename = "banType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_type: Option<LiveChatUserBannedMessageDetailsBanType>,
+    #[serde(rename = "bannedUserDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banned_user_details: Option<ChannelProfileDetails>,
+    /// 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>,
+}
+
+///
+#[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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageAuthorDetails {
+    /// The channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// Whether the author is a moderator of the live chat.
+    #[serde(rename = "isChatModerator")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_moderator: 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 the owner of the live chat.
+    #[serde(rename = "isChatOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_owner: 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 sponsor of the live chat.
+    #[serde(rename = "isChatSponsor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_sponsor: Option<bool>,
+    /// 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>,
+}
+
+/// Information about a video stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoFileDetailsVideoStream {
+    /// The encoded video content's width in pixels. You can calculate the video's encoding aspect ratio as width_pixels / height_pixels.
+    #[serde(rename = "widthPixels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub width_pixels: Option<u32>,
+    /// The video codec that the stream uses.
+    #[serde(rename = "codec")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub codec: Option<String>,
+    /// 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 height in pixels.
+    #[serde(rename = "heightPixels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub height_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>,
+    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
+    #[serde(rename = "vendor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub vendor: Option<String>,
+    /// The video content's display aspect ratio, which specifies the aspect ratio in which the video should be displayed.
+    #[serde(rename = "aspectRatio")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub aspect_ratio: Option<f64>,
+    /// The amount that YouTube needs to rotate the original source content to properly display the video.
+    #[serde(rename = "rotation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rotation: Option<VideoFileDetailsVideoStreamRotation>,
+}
+
+/// 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>,
+}
+
+/// 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>,
+    /// 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>,
+    #[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>,
+}
+
+/// 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>,
+}
+
+///
+#[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 PlaylistListResponse {
+    /// 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>,
+    /// 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>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// A list of playlists that match the request criteria
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Playlist>>,
+    /// 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#playlistListResponse".
+    #[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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityListResponse {
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "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 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#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>,
+    /// 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<Activity>>,
+}
+
+/// Basic details about a caption track, such as its language and name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionSnippet {
+    /// 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 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>,
+    /// 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>>,
+    /// Indicates whether the caption track is a draft. If the value is true, then the track is not publicly visible. The default value is false. @mutable youtube.captions.insert youtube.captions.update
+    #[serde(rename = "isDraft")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_draft: Option<bool>,
+    /// Indicates whether the track contains closed captions for the deaf and hard of hearing. The default value is false.
+    #[serde(rename = "isCC")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_c_c: Option<bool>,
+    /// The 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>,
+    /// The caption track's status.
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<CaptionSnippetStatus>,
+    /// 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 name of the caption track. The name is intended to be visible to the user as an option during playback.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: 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>,
+    /// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReport {
+    /// 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 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 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 language that the content was viewed in.
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
+}
+
+/// 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>,
+    /// 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 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>,
+}
+
+/// Details about a resource which is being promoted.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPromotedItem {
+    /// 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 text description to accompany the promoted item.
+    #[serde(rename = "descriptionText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description_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 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 fetch to request a promoted item.
+    #[serde(rename = "adTag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ad_tag: Option<String>,
+    /// The URL the client should 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 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 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 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 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>>,
 }
 
 /// Localized versions of certain video properties (e.g. title).
@@ -1858,82 +2834,284 @@
     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>,
+/// 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 LiveChatModeratorSnippet {
+    /// The ID of the live chat this moderator can act on.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    #[serde(rename = "moderatorDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderator_details: Option<ChannelProfileDetails>,
+}
+
+/// Player to be used for a video playback.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoPlayer {
+    /// An <iframe> tag that embeds a player that will play the video.
+    #[serde(rename = "embedHtml")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_html: Option<String>,
+    /// i64:
+    #[serde(rename = "embedHeight")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_height: Option<String>,
+    /// i64: The embed width
+    #[serde(rename = "embedWidth")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_width: 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 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>,
+}
+
+/// 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>,
     /// 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>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<ChannelStatistics>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<ChannelTopicDetails>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ChannelSnippet>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, ChannelLocalization>>,
+    #[serde(rename = "conversionPings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conversion_pings: Option<ChannelConversionPings>,
+    #[serde(rename = "brandingSettings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub branding_settings: Option<ChannelBrandingSettings>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ChannelContentDetails>,
+    #[serde(rename = "auditDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub audit_details: Option<ChannelAuditDetails>,
+    /// 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 = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<ChannelStatus>,
+    /// 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>,
+}
+
+///
+#[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 SuperStickerMetadata {
+    /// 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>,
+    /// 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 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 configurations issues on this stream
+    #[serde(rename = "configurationIssues")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
+    /// The status code of this stream
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamHealthStatusStatus>,
+}
+
+/// 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>,
+}
+
+/// Basic details about a comment, such as its author and text.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentSnippet {
+    /// 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>>,
+    /// 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 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 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 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 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 total number of likes this comment has received.
+    #[serde(rename = "likeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like_count: Option<u32>,
+    /// The comment's 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>,
+    #[serde(rename = "authorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_channel_id: Option<CommentSnippetAuthorChannelId>,
+    /// The comment's text. The format is either plain text or HTML dependent on what has been requested. Even the plain text representation may differ from the text originally posted in that it may replace video links with video titles etc.
+    #[serde(rename = "textDisplay")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_display: Option<String>,
+    /// The comment's 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 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>,
+    /// Whether the current viewer can rate this comment.
+    #[serde(rename = "canRate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub can_rate: Option<bool>,
+    /// 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 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 contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentOwnerDetails {
+    /// DateTime: The date and time when the channel was linked to the content owner.
+    #[serde(rename = "timeLinked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_linked: Option<DateTime<Utc>>,
+    /// The ID of the content owner linked to the channel.
+    #[serde(rename = "contentOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_owner: Option<String>,
+}
+
+/// 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>,
+}
+
+/// 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>,
     /// 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 {
+    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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestItemTestItemSnippet {}
+
+/// 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<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.
+    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>,
+    /// 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>,
@@ -1943,20 +3121,54 @@
     pub etag: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventListResponse {
+/// 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 audio codec that the stream uses.
+    #[serde(rename = "codec")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub codec: Option<String>,
+    /// The number of audio channels that the stream contains.
+    #[serde(rename = "channelCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_count: Option<u32>,
+}
+
+///
+#[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 = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveChatMessage>>,
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
     #[serde(rename = "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>>,
+    /// 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 = "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")]
@@ -1965,148 +3177,30 @@
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#superChatEventListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorListResponse {
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of moderators that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatModerator>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModeratorListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-/// A live stream describes a live ingestion point.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStream {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveStreamSnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveStreamContentDetails>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveStreamStatus>,
-    /// The ID that YouTube assigns to uniquely identify the stream.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "cdn")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cdn: Option<CdnSettings>,
-}
-
-/// A *video* resource represents a YouTube video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Video {
-    #[serde(rename = "monetizationDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monetization_details: Option<VideoMonetizationDetails>,
-    #[serde(rename = "suggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub suggestions: Option<VideoSuggestions>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#video".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "ageGating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub age_gating: Option<VideoAgeGating>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoSnippet>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<VideoStatus>,
-    /// The localizations object contains localized versions of the basic details about the video, such as its title and description.
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, VideoLocalization>>,
-    #[serde(rename = "processingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_details: Option<VideoProcessingDetails>,
-    #[serde(rename = "fileDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_details: Option<VideoFileDetails>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<VideoContentDetails>,
-    #[serde(rename = "liveStreamingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
-    #[serde(rename = "recordingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_details: Option<VideoRecordingDetails>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "projectDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub project_details: Option<VideoProjectDetails>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<VideoStatistics>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<VideoPlayer>,
-    /// The ID that YouTube uses to uniquely identify the video.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "topicDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_details: Option<VideoTopicDetails>,
+    /// 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>,
+}
+
+///
+#[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>,
+    /// The chat this ban is pertinent to.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    /// 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>,
 }
 
 /// 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.
@@ -2116,6 +3210,18 @@
     #[serde(rename = "fileSize")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub file_size: 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 file's type as detected by YouTube's video processing engine. Currently, YouTube only processes video files, but this field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_type: Option<VideoFileDetailsFileType>,
+    /// u64: The uploaded video file's combined (video and audio) bitrate in bits per second.
+    #[serde(rename = "bitrateBps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bitrate_bps: Option<String>,
     /// 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")]
@@ -2136,478 +3242,28 @@
     #[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>,
+}
+
+/// Information about a video that was marked as a favorite video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsFavorite {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailSetResponse {
+    /// A list of thumbnails.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<ThumbnailDetails>>,
     /// 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 bytes the uploaded image. Only used in api to youtube communication.
-    #[serde(rename = "imageBytes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_bytes: Option<String>,
-    /// The channel to which this branding links. If not present it defaults to the current channel.
-    #[serde(rename = "targetChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub target_channel_id: Option<String>,
-    #[serde(rename = "timing")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub timing: Option<InvideoTiming>,
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<InvideoPosition>,
-    /// The url of the uploaded image. Only used in apiary to api communication.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-}
-
-/// DEPRECATED Region restriction of the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoContentDetailsRegionRestriction {
-    /// A list of region codes that identify countries where the video is blocked. If this property is present and a country is not listed in its value, then the video is viewable in that country. If this property is present and contains an empty list, the video is viewable in all countries.
-    #[serde(rename = "blocked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub blocked: Option<Vec<String>>,
-    /// A list of region codes that identify countries where the video is viewable. If this property is present and a country is not listed in its value, then the video is blocked from appearing in that country. If this property is present and contains an empty list, the video is blocked in all countries.
-    #[serde(rename = "allowed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub allowed: Option<Vec<String>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRatingListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// A list of ratings that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoRating>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoGetRatingResponse".
+    /// 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>,
@@ -2623,11 +3279,192 @@
 
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategoryListResponse {
+pub struct LiveChatFanFundingEventDetails {
+    /// 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>,
+    /// 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 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 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>,
+    /// 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 = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: 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 = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<LiveBroadcastStatistics>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveBroadcastContentDetails>,
+    /// 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>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveBroadcastStatus>,
+}
+
+///
+#[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>,
+}
+
+/// A search result contains information about a YouTube video, channel, or playlist that matches the search parameters specified in an API request. While a search result points to a uniquely identifiable resource, like a video, it does not have its own persistent data.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchResult {
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<ResourceId>,
+    /// 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>,
+    /// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastListResponse {
+    #[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>>,
+    /// 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LevelDetails {
+    /// The name that should be used when referring to this level.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+}
+
+/// 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 ChannelProfileDetails {
+    /// The channel's URL.
+    #[serde(rename = "channelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_url: Option<String>,
+    /// The channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// The YouTube channel ID.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentListResponse {
+    /// 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>,
@@ -2638,167 +3475,6 @@
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategoryListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of video categories that can be associated with YouTube videos. In this map, the video category ID is the map key, and its value is the corresponding videoCategory resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoCategory>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-}
-
-/// Details about a resource which was added to a channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsChannelItem {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Information specific to a store on a merchandising platform linked to a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelToStoreLinkDetails {
-    /// Name of the store.
-    #[serde(rename = "storeName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub store_name: Option<String>,
-    /// Landing page of the store.
-    #[serde(rename = "storeUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub store_url: Option<String>,
-}
-
-/// A *playlistItem* resource identifies another resource, such as a video, that is included in a playlist. In addition, the playlistItem resource contains details about the included resource that pertain specifically to how that resource is used in that playlist. YouTube uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods. For example, if a user gives a positive rating to a video, you would insert that video into the liked videos playlist for that user's channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItem {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the playlist item.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistItemContentDetails>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistItemSnippet>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<PlaylistItemStatus>,
-}
-
-/// Paging details for lists of resources, including total number of items available and number of resources returned in a single page.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PageInfo {
-    /// The total number of results in the result set.
-    #[serde(rename = "totalResults")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_results: Option<i32>,
-    /// The number of results included in the API response.
-    #[serde(rename = "resultsPerPage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub results_per_page: Option<i32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAgeGating {
-    /// Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content.
-    #[serde(rename = "alcoholContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alcohol_content: Option<bool>,
-    /// Video game rating, if any.
-    #[serde(rename = "videoGameRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_game_rating: Option<VideoAgeGatingVideoGameRating>,
-    /// Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present.
-    #[serde(rename = "restricted")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub restricted: Option<bool>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBanSnippet {
-    /// u64: The duration of a ban, only filled if the ban has type TEMPORARY.
-    #[serde(rename = "banDurationSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_duration_seconds: Option<String>,
-    /// The type of ban.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<LiveChatBanSnippetType>,
-    /// The chat this ban is pertinent to.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    #[serde(rename = "bannedUserDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banned_user_details: Option<ChannelProfileDetails>,
-}
-
-/// A `__superChatEvent__` resource represents a Super Chat purchase on a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEvent {
-    /// The ID that YouTube assigns to uniquely identify the Super Chat event.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#superChatEvent"`.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SuperChatEventSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// DEPRECATED. b/157517979: This part was never populated after it was added. However, it sees non-zero traffic because there is generated client code in the wild that refers to it [1]. We keep this field and do NOT remove it because otherwise V3 would return an error when this part gets requested [2]. [1] https://developers.google.com/resources/api-libraries/documentation/youtube/v3/csharp/latest/classGoogle_1_1Apis_1_1YouTube_1_1v3_1_1Data_1_1VideoProjectDetails.html [2] http://google3/video/youtube/src/python/servers/data_api/common.py?l=1565-1569&rcl=344141677
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProjectDetails {}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activityListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    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>,
     /// 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")]
@@ -2807,40 +3483,86 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_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>>,
+    /// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamListResponse {
+    /// 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>,
+    /// 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 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 = "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>,
+    /// A list of live streams that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveStream>>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the 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 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 VideoAbuseReportReasonListResponse {
+    /// 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>,
+    /// 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 valid abuse reasons that are used with `video.ReportAbuse`.
     #[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>>,
+    pub items: Option<Vec<VideoAbuseReportReason>>,
 }
 
 /// Video processing progress and completion time estimate.
@@ -2862,1581 +3584,59 @@
 
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageRetractedDetails {
-    #[serde(rename = "retractedMessageId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub retracted_message_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageDeletedDetails {
-    #[serde(rename = "deletedMessageId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub deleted_message_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListResponse {
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    #[serde(rename = "regionCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_code: Option<String>,
-    /// Pagination information for token pagination.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<SearchResult>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDetails {
-    /// Ids of all levels that the user has access to. This includes the currently active level and all other levels that are included because of a higher purchase.
-    #[serde(rename = "accessibleLevels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub accessible_levels: Option<Vec<String>>,
-    /// Data about memberships duration on particular pricing levels.
-    #[serde(rename = "membershipsDurationAtLevels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_duration_at_levels: Option<Vec<MembershipsDurationAtLevel>>,
-    /// Display name for the highest level that the user has access to at the moment.
-    #[serde(rename = "highestAccessibleLevelDisplayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub highest_accessible_level_display_name: Option<String>,
-    #[serde(rename = "membershipsDuration")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_duration: Option<MembershipsDuration>,
-    /// Id of the highest level that the user has access to at the moment.
-    #[serde(rename = "highestAccessibleLevel")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub highest_accessible_level: Option<String>,
-}
-
-/// Geographical coordinates of a point, in WGS84.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct GeoPoint {
-    /// Altitude above the reference ellipsoid, in meters.
-    #[serde(rename = "altitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub altitude: Option<f64>,
-    /// Latitude in degrees.
-    #[serde(rename = "latitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub latitude: Option<f64>,
-    /// Longitude in degrees.
-    #[serde(rename = "longitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub longitude: Option<f64>,
-}
-
-/// Basic details about rating of a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRating {
-    /// The ID that YouTube uses to uniquely identify the video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// Rating of a video.
-    #[serde(rename = "rating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rating: Option<VideoRatingRating>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Entity {
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "typeId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelSnippet {
-    #[serde(rename = "levelDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub level_details: Option<LevelDetails>,
-    /// The id of the channel that's offering channel memberships.
-    #[serde(rename = "creatorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creator_channel_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguageListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguageListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of supported i18n languages. In this map, the i18n language ID is the map key, and its value is the corresponding i18nLanguage resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<I18nLanguage>>,
-}
-
-/// Information about the uploaded video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsUpload {
-    /// The ID that YouTube uses to uniquely identify the uploaded video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-}
-
-/// Freebase topic information related to the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoTopicDetails {
-    /// A list of Wikipedia URLs that provide a high-level description of the video's content.
-    #[serde(rename = "topicCategories")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_categories: Option<Vec<String>>,
-    /// Similar to topic_id, except that these topics are merely relevant to the video. These are topics that may be mentioned in, or appear in the video. You can retrieve information about each topic using Freebase Topic API.
-    #[serde(rename = "relevantTopicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub relevant_topic_ids: Option<Vec<String>>,
-    /// A list of Freebase topic IDs that are centrally associated with the video. These are topics that are centrally featured in the video, and it can be said that the video is mainly about each of these. You can retrieve information about each topic using the < a href="http://wiki.freebase.com/wiki/Topic_API">Freebase Topic API.
-    #[serde(rename = "topicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_ids: Option<Vec<String>>,
-}
-
-/// A *third party account link* resource represents a link between a YouTube account or a channel and an account on a third-party service.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLink {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thirdPartyLink".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<ThirdPartyLinkStatus>,
-    /// Etag of this resource
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The linking_token identifies a YouTube account and channel with which the third party account is linked.
-    #[serde(rename = "linkingToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub linking_token: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ThirdPartyLinkSnippet>,
-}
-
-/// Basic details about a comment, such as its author and text.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentSnippet {
-    /// Link to the author's YouTube channel, if any.
-    #[serde(rename = "authorChannelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_url: Option<String>,
-    /// The unique id of the parent comment, only set for replies.
-    #[serde(rename = "parentId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parent_id: Option<String>,
-    /// The comment's original raw text as initially posted or last updated. The original text will only be returned if it is accessible to the viewer, which is only guaranteed if the viewer is the comment's author.
-    #[serde(rename = "textOriginal")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_original: Option<String>,
-    /// The comment's moderation status. Will not be set if the comments were requested through the id filter.
-    #[serde(rename = "moderationStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderation_status: Option<CommentSnippetModerationStatus>,
-    /// The name of the user who posted the comment.
-    #[serde(rename = "authorDisplayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_display_name: Option<String>,
-    /// The URL for the avatar of the user who posted the comment.
-    #[serde(rename = "authorProfileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_profile_image_url: Option<String>,
-    /// DateTime: The date and time when the comment was last updated.
-    #[serde(rename = "updatedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated_at: Option<DateTime<Utc>>,
-    /// Whether the current viewer can rate this comment.
-    #[serde(rename = "canRate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub can_rate: Option<bool>,
-    /// The total number of likes this comment has received.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<u32>,
-    #[serde(rename = "authorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_id: Option<CommentSnippetAuthorChannelId>,
-    /// The rating the viewer has given to this comment. For the time being this will never return RATE_TYPE_DISLIKE and instead return RATE_TYPE_NONE. This may change in the future.
-    #[serde(rename = "viewerRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub viewer_rating: Option<CommentSnippetViewerRating>,
-    /// The ID of the video the comment refers to, if any.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// DateTime: The date and time when the comment was originally published.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The comment's text. The format is either plain text or HTML dependent on what has been requested. Even the plain text representation may differ from the text originally posted in that it may replace video links with video titles etc.
-    #[serde(rename = "textDisplay")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_display: Option<String>,
-    /// The id of the corresponding YouTube channel. In case of a channel comment this is the channel the comment refers to. In case of a video comment it's the video's channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MemberListResponse {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of members that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Member>>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#memberListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LevelDetails {
-    /// The name that should be used when referring to this level.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItemListResponse". Etag of this resource.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of playlist items that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<PlaylistItem>>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// Information about a resource that received a comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsComment {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Information about an audio stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetailsAudioStream {
-    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
-    #[serde(rename = "vendor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub vendor: Option<String>,
-    /// The number of audio channels that the stream contains.
-    #[serde(rename = "channelCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_count: Option<u32>,
-    /// The audio codec that the stream uses.
-    #[serde(rename = "codec")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub codec: Option<String>,
-    /// u64: The audio stream's bitrate, in bits per second.
-    #[serde(rename = "bitrateBps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bitrate_bps: Option<String>,
-}
-
-/// Basic details about a comment thread.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadSnippet {
-    /// The total number of replies (not including the top level comment).
-    #[serde(rename = "totalReplyCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_reply_count: Option<u32>,
-    #[serde(rename = "topLevelComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub top_level_comment: Option<Comment>,
-    /// Whether the current viewer of the thread can reply to it. This is viewer specific - other viewers may see a different value for this field.
-    #[serde(rename = "canReply")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub can_reply: Option<bool>,
-    /// The YouTube channel the comments in the thread refer to or the channel with the video the comments refer to. If video_id isn't set the comments refer to the channel itself.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The ID of the video the comments refer to, if any. No video_id implies a channel discussion comment.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// Whether the thread (and therefore all its comments) is visible to all YouTube users.
-    #[serde(rename = "isPublic")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_public: Option<bool>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperChatDetails {
-    /// The currency in which the purchase was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
-    #[serde(rename = "tier")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tier: Option<u32>,
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The comment added by the user to this Super Chat event.
-    #[serde(rename = "userComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_comment: Option<String>,
-}
-
-/// A *liveBroadcast* resource represents an event that will be streamed, via live video, on YouTube.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcast {
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveBroadcastContentDetails>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveBroadcastStatus>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<LiveBroadcastStatistics>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcast".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the broadcast.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveBroadcastSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperStickerMetadata {
-    /// Internationalized alt text that describes the sticker image and any animation associated with it.
-    #[serde(rename = "altText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt_text: Option<String>,
-    /// Specifies the localization language in which the alt text is returned.
-    #[serde(rename = "altTextLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt_text_language: Option<String>,
-    /// Unique identifier of the Super Sticker. This is a shorter form of the alt_text that includes pack name and a recognizable characteristic of the sticker.
-    #[serde(rename = "stickerId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sticker_id: Option<String>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistSnippet {
-    /// The channel title of the channel that the video belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The language of the playlist's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    /// Keyword tags associated with the playlist.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<String>>,
-    /// DateTime: The date and time that the playlist was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The playlist's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<PlaylistLocalization>,
-    /// The ID that YouTube uses to uniquely identify the channel that published the playlist.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The playlist's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Note: if the playlist has a custom thumbnail, this field will not be populated. The video id selected by the user that will be used as the thumbnail of this playlist. This field defaults to the first publicly viewable video in the playlist, if: 1. The user has never selected a video to be the thumbnail of the playlist. 2. The user selects a video to be the thumbnail, and then removes that video from the playlist. 3. The user selects a non-owned video to be the thumbnail, but that video becomes private, or gets deleted.
-    #[serde(rename = "thumbnailVideoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnail_video_id: Option<String>,
+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 liked videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "likes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub likes: Option<String>,
+    /// The ID of the playlist that contains the channel"s watch later playlist. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "watchLater")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch_later: Option<String>,
+    /// The ID of the playlist that contains the channel"s 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>,
+}
+
+/// 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 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.
+    /// The stream's title. The value must be between 1 and 128 characters long.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The 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 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>>,
+    #[serde(rename = "isDefaultStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_default_stream: Option<bool>,
 }
 
 /// Settings and Info of the monitor stream
@@ -4458,545 +3658,855 @@
 
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LanguageTag {
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestItem {
+pub struct PlaylistItemListResponse {
+    #[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 token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// A list of playlist items that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<PlaylistItem>>,
+    #[serde(rename = "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#playlistItemListResponse". Etag of this resource.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the 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>,
+}
+
+///
+#[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>,
+    /// 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>,
+    /// 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>,
+}
+
+/// 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>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the i18n language.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+///
+#[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>,
+}
+
+/// Details about the content of a YouTube Video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoContentDetails {
+    /// Specifies the projection format of the video.
+    #[serde(rename = "projection")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub projection: Option<VideoContentDetailsProjection>,
+    /// 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>,
+    /// 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 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>,
+    /// 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>,
+    #[serde(rename = "countryRestriction")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country_restriction: Option<AccessPolicy>,
+    /// The value of captions indicates whether the video has captions or not.
+    #[serde(rename = "caption")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub caption: Option<VideoContentDetailsCaption>,
+    /// The value of definition indicates whether the video is available in high definition or only in standard definition.
+    #[serde(rename = "definition")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub definition: Option<VideoContentDetailsDefinition>,
+    #[serde(rename = "regionRestriction")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
+    #[serde(rename = "contentRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_rating: Option<ContentRating>,
+}
+
+/// A *playlist* resource represents a YouTube playlist. A playlist is a collection of videos that can be viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not limit the number of playlists that each user creates. By default, playlists are publicly visible to other users, but playlists can be public or private. YouTube also uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Playlist {
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<PlaylistContentDetails>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
+    #[serde(rename = "player")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub player: Option<PlaylistPlayer>,
+    /// 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>,
+    /// 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 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MemberSnippet {
+    #[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>,
+    /// 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>,
+}
+
+/// Details about the live streaming metadata.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoLiveStreamingDetails {
+    /// DateTime: The time that the broadcast is scheduled to end. If the value is empty or the property is not present, then the broadcast is scheduled to contiue indefinitely.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<DateTime<Utc>>,
+    /// DateTime: The time that the broadcast is scheduled to begin.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<DateTime<Utc>>,
+    /// DateTime: The time that the broadcast actually started. This value will not be available until the broadcast begins.
+    #[serde(rename = "actualStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_start_time: Option<DateTime<Utc>>,
+    /// DateTime: The time that the broadcast actually ended. This value will not be available until the broadcast is over.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<DateTime<Utc>>,
+    /// 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>,
+    /// 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>,
+}
+
+/// A `__liveChatBan__` resource represents a ban for a YouTube live chat.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBan {
+    /// The ID that YouTube assigns to uniquely identify the ban.
+    #[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#liveChatBan"`.
+    #[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<LiveChatBanSnippet>,
+}
+
+///
+#[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>,
+    /// Id of the highest level that the user has access to at the moment.
+    #[serde(rename = "highestAccessibleLevel")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub highest_accessible_level: Option<String>,
+    #[serde(rename = "membershipsDuration")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_duration: Option<MembershipsDuration>,
+}
+
+/// A *video* resource represents a YouTube video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Video {
+    #[serde(rename = "player")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub player: Option<VideoPlayer>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<VideoTopicDetails>,
+    #[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 = "suggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub suggestions: Option<VideoSuggestions>,
+    /// 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<VideoSnippet>,
+    #[serde(rename = "ageGating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub age_gating: Option<VideoAgeGating>,
+    #[serde(rename = "liveStreamingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
+    /// 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 = "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)]
-pub enum SubscriptionContentDetailsActivityType {
-    Undefined,
-    ///
-    #[serde(rename = "subscriptionActivityTypeUnspecified")]
-    SubscriptionActivityTypeUnspecified,
-    ///
-    #[serde(rename = "all")]
-    All,
-    ///
-    #[serde(rename = "uploads")]
-    Uploads,
-}
-
-impl std::default::Default for SubscriptionContentDetailsActivityType {
-    fn default() -> SubscriptionContentDetailsActivityType {
-        SubscriptionContentDetailsActivityType::Undefined
-    }
-}
-
-impl std::fmt::Display for SubscriptionContentDetailsActivityType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SubscriptionContentDetailsActivityType::Undefined => write!(f, "undefined"),
-            SubscriptionContentDetailsActivityType::SubscriptionActivityTypeUnspecified => {
-                write!(f, "subscriptionActivityTypeUnspecified")
-            }
-            SubscriptionContentDetailsActivityType::All => write!(f, "all"),
-            SubscriptionContentDetailsActivityType::Uploads => write!(f, "uploads"),
-        };
-        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.
+    /// 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 = "projectDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub project_details: Option<VideoProjectDetails>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<VideoStatus>,
+    #[serde(rename = "processingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_details: Option<VideoProcessingDetails>,
+    #[serde(rename = "recordingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_details: Option<VideoRecordingDetails>,
+    #[serde(rename = "fileDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_details: Option<VideoFileDetails>,
+    #[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>,
+}
+
+/// 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 in Estonia.
+    #[serde(rename = "eefilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub eefilm_rating: Option<ContentRatingEefilmRating>,
+    /// 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 system for Vietnam - MCST
+    #[serde(rename = "mcstRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mcst_rating: Option<ContentRatingMcstRating>,
+    /// 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>,
+    /// 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 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>,
+    /// 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 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 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 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 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 Departamento de Justiça, Classificação, Qualificação e Títulos (DJCQT - Brazil) rating.
+    #[serde(rename = "djctqRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub djctq_rating: Option<ContentRatingDjctqRating>,
+    /// The video's rating from 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 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 Consejo de Calificación Cinematográfica (Chile) rating.
+    #[serde(rename = "cccRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ccc_rating: Option<ContentRatingCccRating>,
+    /// The video's rating from Taiwan's Ministry of Culture (文化部).
+    #[serde(rename = "moctwRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moctw_rating: Option<ContentRatingMoctwRating>,
+    /// 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 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>,
+    /// 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 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 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 TV Parental Guidelines (TVPG) rating.
+    #[serde(rename = "tvpgRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tvpg_rating: Option<ContentRatingTvpgRating>,
+    /// 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 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 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 in Poland.
+    #[serde(rename = "nbcplRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nbcpl_rating: Option<ContentRatingNbcplRating>,
+    /// 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 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 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 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 rating from the Nacionãlais Kino centrs (National Film Centre of Latvia).
+    #[serde(rename = "nkclvRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nkclv_rating: Option<ContentRatingNkclvRating>,
+    /// The video's rating from 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 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 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>,
+    /// 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 Eirin (映倫) rating. Eirin is the Japanese rating system.
+    #[serde(rename = "eirinRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub eirin_rating: Option<ContentRatingEirinRating>,
+    /// The video's rating in Greece.
+    #[serde(rename = "grfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub grfilm_rating: Option<ContentRatingGrfilmRating>,
+    /// 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 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 British Board of Film Classification (BBFC) rating.
+    #[serde(rename = "bbfcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bbfc_rating: Option<ContentRatingBbfcRating>,
+    /// The video's rating 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 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 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 Freiwillige Selbstkontrolle der Filmwirtschaft (FSK - Germany) rating.
+    #[serde(rename = "fskRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fsk_rating: Option<ContentRatingFskRating>,
+    /// 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 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 Venezuela.
+    #[serde(rename = "resorteviolenciaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resorteviolencia_rating: Option<ContentRatingResorteviolenciaRating>,
+    /// 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 Indonesia's Lembaga Sensor Film.
+    #[serde(rename = "lsfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub lsf_rating: Option<ContentRatingLsfRating>,
+    /// 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 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>,
+    /// Rating system in Turkey - Evaluation and Classification Board of the Ministry of Culture and Tourism
+    #[serde(rename = "ecbmctRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ecbmct_rating: Option<ContentRatingEcbmctRating>,
+    /// The video's rating from the Bulgarian National Film Center.
+    #[serde(rename = "nfrcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nfrc_rating: Option<ContentRatingNfrcRating>,
+    /// Rating system for Canadian TV - Canadian TV Classification System The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian English-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
+    #[serde(rename = "catvRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub catv_rating: Option<ContentRatingCatvRating>,
+    /// The video's Ministerio de Cultura (Colombia) rating.
+    #[serde(rename = "mocRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moc_rating: Option<ContentRatingMocRating>,
+    /// The video's rating from 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 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 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 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 the Maldives National Bureau of Classification.
+    #[serde(rename = "nbcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nbc_rating: Option<ContentRatingNbcRating>,
+    /// 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 in Slovakia.
+    #[serde(rename = "skfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub skfilm_rating: Option<ContentRatingSkfilmRating>,
+    /// The rating system for MENA countries, a clone of MPAA. It is needed to prevent titles go live w/o additional QC check, since some of them can be inappropriate for the countries at all. See b/33408548 for more details.
+    #[serde(rename = "menaMpaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mena_mpaa_rating: Option<ContentRatingMenaMpaaRating>,
+    /// The video's 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 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 Malta's Film Age-Classification Board.
+    #[serde(rename = "mccaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mccaa_rating: Option<ContentRatingMccaaRating>,
+    /// 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 in the Czech Republic.
+    #[serde(rename = "czfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub czfilm_rating: Option<ContentRatingCzfilmRating>,
+}
+
+/// 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>,
+    /// Privacy status of the channel.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<ChannelStatusPrivacyStatus>,
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// The long uploads status of this channel. See https://support.google.com/youtube/answer/71673 for more information.
+    #[serde(rename = "longUploadsStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub long_uploads_status: Option<ChannelStatusLongUploadsStatus>,
+    #[serde(rename = "selfDeclaredMadeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_declared_made_for_kids: Option<bool>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseType {
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+/// 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>,
+    /// Channel title for the channel responsible for this activity
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_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>>,
+    #[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 type of activity that the resource describes.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<ActivitySnippetType>,
+    /// 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>,
+}
+
+/// Basic information about a third party account link, including its type and type-specific information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinkSnippet {
     #[serde(rename = "channelToStoreLink")]
-    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(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelStatusPrivacyStatus {
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_to_store_link: Option<ChannelToStoreLinkDetails>,
+    /// Type of the link named after the entities that are being linked.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<ThirdPartyLinkSnippetType>,
+}
+
+/// 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>,
+}
+
+/// Recording information associated with the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRecordingDetails {
+    /// DateTime: The date and time when the video was recorded.
+    #[serde(rename = "recordingDate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_date: Option<DateTime<Utc>>,
+    /// The text description of the location where the video was recorded.
+    #[serde(rename = "locationDescription")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location_description: Option<String>,
+    #[serde(rename = "location")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location: Option<GeoPoint>,
+}
+
+/// 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 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>,
+    ///  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>,
+}
+
+/// 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>>,
+}
+
+/// 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>,
+}
+
+/// 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>,
+}
+
+/// 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>>,
+}
+
+/// Basic details about a channel section, including title, style and position.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionSnippet {
+    /// The type of the channel section.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<ChannelSectionSnippetType>,
+    /// The channel section's title for multiple_playlists and multiple_channels.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The position of the channel section in the channel.
+    #[serde(rename = "position")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub position: Option<u32>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<ChannelSectionLocalization>,
+    /// The style of the channel section.
+    #[serde(rename = "style")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub style: Option<ChannelSectionSnippetStyle>,
+    /// The 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 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>,
+}
+
+/// 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 {
+    /// 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>>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// 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 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>,
+    /// 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>,
+    /// The title of the search result.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusPrivacyStatus {
     Undefined,
     ///
     #[serde(rename = "public")]
@@ -5009,4369 +4519,153 @@
     Private,
 }
 
-impl std::default::Default for ChannelStatusPrivacyStatus {
-    fn default() -> ChannelStatusPrivacyStatus {
-        ChannelStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            ChannelStatusPrivacyStatus::Public => write!(f, "public"),
-            ChannelStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            ChannelStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelStatusLongUploadsStatus {
-    Undefined,
-    ///
-    #[serde(rename = "longUploadsUnspecified")]
-    LongUploadsUnspecified,
-    ///
-    #[serde(rename = "allowed")]
-    Allowed,
-    ///
-    #[serde(rename = "eligible")]
-    Eligible,
-    ///
-    #[serde(rename = "disallowed")]
-    Disallowed,
-}
-
-impl std::default::Default for ChannelStatusLongUploadsStatus {
-    fn default() -> ChannelStatusLongUploadsStatus {
-        ChannelStatusLongUploadsStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelStatusLongUploadsStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelStatusLongUploadsStatus::Undefined => write!(f, "undefined"),
-            ChannelStatusLongUploadsStatus::LongUploadsUnspecified => {
-                write!(f, "longUploadsUnspecified")
-            }
-            ChannelStatusLongUploadsStatus::Allowed => write!(f, "allowed"),
-            ChannelStatusLongUploadsStatus::Eligible => write!(f, "eligible"),
-            ChannelStatusLongUploadsStatus::Disallowed => write!(f, "disallowed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNfvcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "nfvcbUnspecified")]
-    NfvcbUnspecified,
-    /// G
-    #[serde(rename = "nfvcbG")]
-    NfvcbG,
-    /// PG
-    #[serde(rename = "nfvcbPg")]
-    NfvcbPg,
-    /// 12
-    #[serde(rename = "nfvcb12")]
-    Nfvcb12,
-    /// 12A
-    #[serde(rename = "nfvcb12a")]
-    Nfvcb12a,
-    /// 15
-    #[serde(rename = "nfvcb15")]
-    Nfvcb15,
-    /// 18
-    #[serde(rename = "nfvcb18")]
-    Nfvcb18,
-    /// RE
-    #[serde(rename = "nfvcbRe")]
-    NfvcbRe,
-    ///
-    #[serde(rename = "nfvcbUnrated")]
-    NfvcbUnrated,
-}
-
-impl std::default::Default for ContentRatingNfvcbRating {
-    fn default() -> ContentRatingNfvcbRating {
-        ContentRatingNfvcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNfvcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNfvcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingNfvcbRating::NfvcbUnspecified => write!(f, "nfvcbUnspecified"),
-            ContentRatingNfvcbRating::NfvcbG => write!(f, "nfvcbG"),
-            ContentRatingNfvcbRating::NfvcbPg => write!(f, "nfvcbPg"),
-            ContentRatingNfvcbRating::Nfvcb12 => write!(f, "nfvcb12"),
-            ContentRatingNfvcbRating::Nfvcb12a => write!(f, "nfvcb12a"),
-            ContentRatingNfvcbRating::Nfvcb15 => write!(f, "nfvcb15"),
-            ContentRatingNfvcbRating::Nfvcb18 => write!(f, "nfvcb18"),
-            ContentRatingNfvcbRating::NfvcbRe => write!(f, "nfvcbRe"),
-            ContentRatingNfvcbRating::NfvcbUnrated => write!(f, "nfvcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSmsaRating {
-    Undefined,
-    ///
-    #[serde(rename = "smsaUnspecified")]
-    SmsaUnspecified,
-    /// All ages
-    #[serde(rename = "smsaA")]
-    SmsaA,
-    /// 7
-    #[serde(rename = "smsa7")]
-    Smsa7,
-    /// 11
-    #[serde(rename = "smsa11")]
-    Smsa11,
-    /// 15
-    #[serde(rename = "smsa15")]
-    Smsa15,
-    ///
-    #[serde(rename = "smsaUnrated")]
-    SmsaUnrated,
-}
-
-impl std::default::Default for ContentRatingSmsaRating {
-    fn default() -> ContentRatingSmsaRating {
-        ContentRatingSmsaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSmsaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSmsaRating::Undefined => write!(f, "undefined"),
-            ContentRatingSmsaRating::SmsaUnspecified => write!(f, "smsaUnspecified"),
-            ContentRatingSmsaRating::SmsaA => write!(f, "smsaA"),
-            ContentRatingSmsaRating::Smsa7 => write!(f, "smsa7"),
-            ContentRatingSmsaRating::Smsa11 => write!(f, "smsa11"),
-            ContentRatingSmsaRating::Smsa15 => write!(f, "smsa15"),
-            ContentRatingSmsaRating::SmsaUnrated => write!(f, "smsaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBmukkRating {
-    Undefined,
-    ///
-    #[serde(rename = "bmukkUnspecified")]
-    BmukkUnspecified,
-    /// Unrestricted
-    #[serde(rename = "bmukkAa")]
-    BmukkAa,
-    /// 6+
-    #[serde(rename = "bmukk6")]
-    Bmukk6,
-    /// 8+
-    #[serde(rename = "bmukk8")]
-    Bmukk8,
-    /// 10+
-    #[serde(rename = "bmukk10")]
-    Bmukk10,
-    /// 12+
-    #[serde(rename = "bmukk12")]
-    Bmukk12,
-    /// 14+
-    #[serde(rename = "bmukk14")]
-    Bmukk14,
-    /// 16+
-    #[serde(rename = "bmukk16")]
-    Bmukk16,
-    ///
-    #[serde(rename = "bmukkUnrated")]
-    BmukkUnrated,
-}
-
-impl std::default::Default for ContentRatingBmukkRating {
-    fn default() -> ContentRatingBmukkRating {
-        ContentRatingBmukkRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBmukkRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBmukkRating::Undefined => write!(f, "undefined"),
-            ContentRatingBmukkRating::BmukkUnspecified => write!(f, "bmukkUnspecified"),
-            ContentRatingBmukkRating::BmukkAa => write!(f, "bmukkAa"),
-            ContentRatingBmukkRating::Bmukk6 => write!(f, "bmukk6"),
-            ContentRatingBmukkRating::Bmukk8 => write!(f, "bmukk8"),
-            ContentRatingBmukkRating::Bmukk10 => write!(f, "bmukk10"),
-            ContentRatingBmukkRating::Bmukk12 => write!(f, "bmukk12"),
-            ContentRatingBmukkRating::Bmukk14 => write!(f, "bmukk14"),
-            ContentRatingBmukkRating::Bmukk16 => write!(f, "bmukk16"),
-            ContentRatingBmukkRating::BmukkUnrated => write!(f, "bmukkUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFmocRating {
-    Undefined,
-    ///
-    #[serde(rename = "fmocUnspecified")]
-    FmocUnspecified,
-    /// U
-    #[serde(rename = "fmocU")]
-    FmocU,
-    /// 10
-    #[serde(rename = "fmoc10")]
-    Fmoc10,
-    /// 12
-    #[serde(rename = "fmoc12")]
-    Fmoc12,
-    /// 16
-    #[serde(rename = "fmoc16")]
-    Fmoc16,
-    /// 18
-    #[serde(rename = "fmoc18")]
-    Fmoc18,
-    /// E
-    #[serde(rename = "fmocE")]
-    FmocE,
-    ///
-    #[serde(rename = "fmocUnrated")]
-    FmocUnrated,
-}
-
-impl std::default::Default for ContentRatingFmocRating {
-    fn default() -> ContentRatingFmocRating {
-        ContentRatingFmocRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFmocRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFmocRating::Undefined => write!(f, "undefined"),
-            ContentRatingFmocRating::FmocUnspecified => write!(f, "fmocUnspecified"),
-            ContentRatingFmocRating::FmocU => write!(f, "fmocU"),
-            ContentRatingFmocRating::Fmoc10 => write!(f, "fmoc10"),
-            ContentRatingFmocRating::Fmoc12 => write!(f, "fmoc12"),
-            ContentRatingFmocRating::Fmoc16 => write!(f, "fmoc16"),
-            ContentRatingFmocRating::Fmoc18 => write!(f, "fmoc18"),
-            ContentRatingFmocRating::FmocE => write!(f, "fmocE"),
-            ContentRatingFmocRating::FmocUnrated => write!(f, "fmocUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNmcRating {
-    Undefined,
-    ///
-    #[serde(rename = "nmcUnspecified")]
-    NmcUnspecified,
-    /// G
-    #[serde(rename = "nmcG")]
-    NmcG,
-    /// PG
-    #[serde(rename = "nmcPg")]
-    NmcPg,
-    /// PG-13
-    #[serde(rename = "nmcPg13")]
-    NmcPg13,
-    /// PG-15
-    #[serde(rename = "nmcPg15")]
-    NmcPg15,
-    /// 15+
-    #[serde(rename = "nmc15plus")]
-    Nmc15plus,
-    /// 18+
-    #[serde(rename = "nmc18plus")]
-    Nmc18plus,
-    /// 18TC
-    #[serde(rename = "nmc18tc")]
-    Nmc18tc,
-    ///
-    #[serde(rename = "nmcUnrated")]
-    NmcUnrated,
-}
-
-impl std::default::Default for ContentRatingNmcRating {
-    fn default() -> ContentRatingNmcRating {
-        ContentRatingNmcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNmcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNmcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNmcRating::NmcUnspecified => write!(f, "nmcUnspecified"),
-            ContentRatingNmcRating::NmcG => write!(f, "nmcG"),
-            ContentRatingNmcRating::NmcPg => write!(f, "nmcPg"),
-            ContentRatingNmcRating::NmcPg13 => write!(f, "nmcPg13"),
-            ContentRatingNmcRating::NmcPg15 => write!(f, "nmcPg15"),
-            ContentRatingNmcRating::Nmc15plus => write!(f, "nmc15plus"),
-            ContentRatingNmcRating::Nmc18plus => write!(f, "nmc18plus"),
-            ContentRatingNmcRating::Nmc18tc => write!(f, "nmc18tc"),
-            ContentRatingNmcRating::NmcUnrated => write!(f, "nmcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRteRating {
-    Undefined,
-    ///
-    #[serde(rename = "rteUnspecified")]
-    RteUnspecified,
-    /// GA
-    #[serde(rename = "rteGa")]
-    RteGa,
-    /// CH
-    #[serde(rename = "rteCh")]
-    RteCh,
-    /// PS
-    #[serde(rename = "rtePs")]
-    RtePs,
-    /// MA
-    #[serde(rename = "rteMa")]
-    RteMa,
-    ///
-    #[serde(rename = "rteUnrated")]
-    RteUnrated,
-}
-
-impl std::default::Default for ContentRatingRteRating {
-    fn default() -> ContentRatingRteRating {
-        ContentRatingRteRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRteRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRteRating::Undefined => write!(f, "undefined"),
-            ContentRatingRteRating::RteUnspecified => write!(f, "rteUnspecified"),
-            ContentRatingRteRating::RteGa => write!(f, "rteGa"),
-            ContentRatingRteRating::RteCh => write!(f, "rteCh"),
-            ContentRatingRteRating::RtePs => write!(f, "rtePs"),
-            ContentRatingRteRating::RteMa => write!(f, "rteMa"),
-            ContentRatingRteRating::RteUnrated => write!(f, "rteUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFcoRating {
-    Undefined,
-    ///
-    #[serde(rename = "fcoUnspecified")]
-    FcoUnspecified,
-    /// I
-    #[serde(rename = "fcoI")]
-    FcoI,
-    /// IIA
-    #[serde(rename = "fcoIia")]
-    FcoIia,
-    /// IIB
-    #[serde(rename = "fcoIib")]
-    FcoIib,
-    /// II
-    #[serde(rename = "fcoIi")]
-    FcoIi,
-    /// III
-    #[serde(rename = "fcoIii")]
-    FcoIii,
-    ///
-    #[serde(rename = "fcoUnrated")]
-    FcoUnrated,
-}
-
-impl std::default::Default for ContentRatingFcoRating {
-    fn default() -> ContentRatingFcoRating {
-        ContentRatingFcoRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFcoRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFcoRating::Undefined => write!(f, "undefined"),
-            ContentRatingFcoRating::FcoUnspecified => write!(f, "fcoUnspecified"),
-            ContentRatingFcoRating::FcoI => write!(f, "fcoI"),
-            ContentRatingFcoRating::FcoIia => write!(f, "fcoIia"),
-            ContentRatingFcoRating::FcoIib => write!(f, "fcoIib"),
-            ContentRatingFcoRating::FcoIi => write!(f, "fcoIi"),
-            ContentRatingFcoRating::FcoIii => write!(f, "fcoIii"),
-            ContentRatingFcoRating::FcoUnrated => write!(f, "fcoUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIlfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "ilfilmUnspecified")]
-    IlfilmUnspecified,
-    /// AA
-    #[serde(rename = "ilfilmAa")]
-    IlfilmAa,
-    /// 12
-    #[serde(rename = "ilfilm12")]
-    Ilfilm12,
-    /// 14
-    #[serde(rename = "ilfilm14")]
-    Ilfilm14,
-    /// 16
-    #[serde(rename = "ilfilm16")]
-    Ilfilm16,
-    /// 18
-    #[serde(rename = "ilfilm18")]
-    Ilfilm18,
-    ///
-    #[serde(rename = "ilfilmUnrated")]
-    IlfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingIlfilmRating {
-    fn default() -> ContentRatingIlfilmRating {
-        ContentRatingIlfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIlfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIlfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingIlfilmRating::IlfilmUnspecified => write!(f, "ilfilmUnspecified"),
-            ContentRatingIlfilmRating::IlfilmAa => write!(f, "ilfilmAa"),
-            ContentRatingIlfilmRating::Ilfilm12 => write!(f, "ilfilm12"),
-            ContentRatingIlfilmRating::Ilfilm14 => write!(f, "ilfilm14"),
-            ContentRatingIlfilmRating::Ilfilm16 => write!(f, "ilfilm16"),
-            ContentRatingIlfilmRating::Ilfilm18 => write!(f, "ilfilm18"),
-            ContentRatingIlfilmRating::IlfilmUnrated => write!(f, "ilfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingGrfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "grfilmUnspecified")]
-    GrfilmUnspecified,
-    /// K
-    #[serde(rename = "grfilmK")]
-    GrfilmK,
-    /// E
-    #[serde(rename = "grfilmE")]
-    GrfilmE,
-    /// K-12
-    #[serde(rename = "grfilmK12")]
-    GrfilmK12,
-    /// K-13
-    #[serde(rename = "grfilmK13")]
-    GrfilmK13,
-    /// K-15
-    #[serde(rename = "grfilmK15")]
-    GrfilmK15,
-    /// K-17
-    #[serde(rename = "grfilmK17")]
-    GrfilmK17,
-    /// K-18
-    #[serde(rename = "grfilmK18")]
-    GrfilmK18,
-    ///
-    #[serde(rename = "grfilmUnrated")]
-    GrfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingGrfilmRating {
-    fn default() -> ContentRatingGrfilmRating {
-        ContentRatingGrfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingGrfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingGrfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingGrfilmRating::GrfilmUnspecified => write!(f, "grfilmUnspecified"),
-            ContentRatingGrfilmRating::GrfilmK => write!(f, "grfilmK"),
-            ContentRatingGrfilmRating::GrfilmE => write!(f, "grfilmE"),
-            ContentRatingGrfilmRating::GrfilmK12 => write!(f, "grfilmK12"),
-            ContentRatingGrfilmRating::GrfilmK13 => write!(f, "grfilmK13"),
-            ContentRatingGrfilmRating::GrfilmK15 => write!(f, "grfilmK15"),
-            ContentRatingGrfilmRating::GrfilmK17 => write!(f, "grfilmK17"),
-            ContentRatingGrfilmRating::GrfilmK18 => write!(f, "grfilmK18"),
-            ContentRatingGrfilmRating::GrfilmUnrated => write!(f, "grfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMoctwRating {
-    Undefined,
-    ///
-    #[serde(rename = "moctwUnspecified")]
-    MoctwUnspecified,
-    /// G
-    #[serde(rename = "moctwG")]
-    MoctwG,
-    /// P
-    #[serde(rename = "moctwP")]
-    MoctwP,
-    /// PG
-    #[serde(rename = "moctwPg")]
-    MoctwPg,
-    /// R
-    #[serde(rename = "moctwR")]
-    MoctwR,
-    ///
-    #[serde(rename = "moctwUnrated")]
-    MoctwUnrated,
-    /// R-12
-    #[serde(rename = "moctwR12")]
-    MoctwR12,
-    /// R-15
-    #[serde(rename = "moctwR15")]
-    MoctwR15,
-}
-
-impl std::default::Default for ContentRatingMoctwRating {
-    fn default() -> ContentRatingMoctwRating {
-        ContentRatingMoctwRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMoctwRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMoctwRating::Undefined => write!(f, "undefined"),
-            ContentRatingMoctwRating::MoctwUnspecified => write!(f, "moctwUnspecified"),
-            ContentRatingMoctwRating::MoctwG => write!(f, "moctwG"),
-            ContentRatingMoctwRating::MoctwP => write!(f, "moctwP"),
-            ContentRatingMoctwRating::MoctwPg => write!(f, "moctwPg"),
-            ContentRatingMoctwRating::MoctwR => write!(f, "moctwR"),
-            ContentRatingMoctwRating::MoctwUnrated => write!(f, "moctwUnrated"),
-            ContentRatingMoctwRating::MoctwR12 => write!(f, "moctwR12"),
-            ContentRatingMoctwRating::MoctwR15 => write!(f, "moctwR15"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMdaRating {
-    Undefined,
-    ///
-    #[serde(rename = "mdaUnspecified")]
-    MdaUnspecified,
-    /// G
-    #[serde(rename = "mdaG")]
-    MdaG,
-    /// PG
-    #[serde(rename = "mdaPg")]
-    MdaPg,
-    /// PG13
-    #[serde(rename = "mdaPg13")]
-    MdaPg13,
-    /// NC16
-    #[serde(rename = "mdaNc16")]
-    MdaNc16,
-    /// M18
-    #[serde(rename = "mdaM18")]
-    MdaM18,
-    /// R21
-    #[serde(rename = "mdaR21")]
-    MdaR21,
-    ///
-    #[serde(rename = "mdaUnrated")]
-    MdaUnrated,
-}
-
-impl std::default::Default for ContentRatingMdaRating {
-    fn default() -> ContentRatingMdaRating {
-        ContentRatingMdaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMdaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMdaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMdaRating::MdaUnspecified => write!(f, "mdaUnspecified"),
-            ContentRatingMdaRating::MdaG => write!(f, "mdaG"),
-            ContentRatingMdaRating::MdaPg => write!(f, "mdaPg"),
-            ContentRatingMdaRating::MdaPg13 => write!(f, "mdaPg13"),
-            ContentRatingMdaRating::MdaNc16 => write!(f, "mdaNc16"),
-            ContentRatingMdaRating::MdaM18 => write!(f, "mdaM18"),
-            ContentRatingMdaRating::MdaR21 => write!(f, "mdaR21"),
-            ContentRatingMdaRating::MdaUnrated => write!(f, "mdaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFpbRatingReasons {
-    Undefined,
-    ///
-    #[serde(rename = "fpbRatingReasonUnspecified")]
-    FpbRatingReasonUnspecified,
-    /// South Africa rating content descriptors.
-    #[serde(rename = "fpbBlasphemy")]
-    FpbBlasphemy,
-    ///
-    #[serde(rename = "fpbLanguage")]
-    FpbLanguage,
-    ///
-    #[serde(rename = "fpbNudity")]
-    FpbNudity,
-    ///
-    #[serde(rename = "fpbPrejudice")]
-    FpbPrejudice,
-    ///
-    #[serde(rename = "fpbSex")]
-    FpbSex,
-    ///
-    #[serde(rename = "fpbViolence")]
-    FpbViolence,
-    ///
-    #[serde(rename = "fpbDrugs")]
-    FpbDrugs,
-    ///
-    #[serde(rename = "fpbSexualViolence")]
-    FpbSexualViolence,
-    ///
-    #[serde(rename = "fpbHorror")]
-    FpbHorror,
-    ///
-    #[serde(rename = "fpbCriminalTechniques")]
-    FpbCriminalTechniques,
-    ///
-    #[serde(rename = "fpbImitativeActsTechniques")]
-    FpbImitativeActsTechniques,
-}
-
-impl std::default::Default for ContentRatingFpbRatingReasons {
-    fn default() -> ContentRatingFpbRatingReasons {
-        ContentRatingFpbRatingReasons::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFpbRatingReasons {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFpbRatingReasons::Undefined => write!(f, "undefined"),
-            ContentRatingFpbRatingReasons::FpbRatingReasonUnspecified => {
-                write!(f, "fpbRatingReasonUnspecified")
-            }
-            ContentRatingFpbRatingReasons::FpbBlasphemy => write!(f, "fpbBlasphemy"),
-            ContentRatingFpbRatingReasons::FpbLanguage => write!(f, "fpbLanguage"),
-            ContentRatingFpbRatingReasons::FpbNudity => write!(f, "fpbNudity"),
-            ContentRatingFpbRatingReasons::FpbPrejudice => write!(f, "fpbPrejudice"),
-            ContentRatingFpbRatingReasons::FpbSex => write!(f, "fpbSex"),
-            ContentRatingFpbRatingReasons::FpbViolence => write!(f, "fpbViolence"),
-            ContentRatingFpbRatingReasons::FpbDrugs => write!(f, "fpbDrugs"),
-            ContentRatingFpbRatingReasons::FpbSexualViolence => write!(f, "fpbSexualViolence"),
-            ContentRatingFpbRatingReasons::FpbHorror => write!(f, "fpbHorror"),
-            ContentRatingFpbRatingReasons::FpbCriminalTechniques => {
-                write!(f, "fpbCriminalTechniques")
-            }
-            ContentRatingFpbRatingReasons::FpbImitativeActsTechniques => {
-                write!(f, "fpbImitativeActsTechniques")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKfcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "kfcbUnspecified")]
-    KfcbUnspecified,
-    /// GE
-    #[serde(rename = "kfcbG")]
-    KfcbG,
-    /// PG
-    #[serde(rename = "kfcbPg")]
-    KfcbPg,
-    /// 16
-    #[serde(rename = "kfcb16plus")]
-    Kfcb16plus,
-    /// 18
-    #[serde(rename = "kfcbR")]
-    KfcbR,
-    ///
-    #[serde(rename = "kfcbUnrated")]
-    KfcbUnrated,
-}
-
-impl std::default::Default for ContentRatingKfcbRating {
-    fn default() -> ContentRatingKfcbRating {
-        ContentRatingKfcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKfcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKfcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingKfcbRating::KfcbUnspecified => write!(f, "kfcbUnspecified"),
-            ContentRatingKfcbRating::KfcbG => write!(f, "kfcbG"),
-            ContentRatingKfcbRating::KfcbPg => write!(f, "kfcbPg"),
-            ContentRatingKfcbRating::Kfcb16plus => write!(f, "kfcb16plus"),
-            ContentRatingKfcbRating::KfcbR => write!(f, "kfcbR"),
-            ContentRatingKfcbRating::KfcbUnrated => write!(f, "kfcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMocRating {
-    Undefined,
-    ///
-    #[serde(rename = "mocUnspecified")]
-    MocUnspecified,
-    /// E
-    #[serde(rename = "mocE")]
-    MocE,
-    /// T
-    #[serde(rename = "mocT")]
-    MocT,
-    /// 7
-    #[serde(rename = "moc7")]
-    Moc7,
-    /// 12
-    #[serde(rename = "moc12")]
-    Moc12,
-    /// 15
-    #[serde(rename = "moc15")]
-    Moc15,
-    /// 18
-    #[serde(rename = "moc18")]
-    Moc18,
-    /// X
-    #[serde(rename = "mocX")]
-    MocX,
-    /// Banned
-    #[serde(rename = "mocBanned")]
-    MocBanned,
-    ///
-    #[serde(rename = "mocUnrated")]
-    MocUnrated,
-}
-
-impl std::default::Default for ContentRatingMocRating {
-    fn default() -> ContentRatingMocRating {
-        ContentRatingMocRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMocRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMocRating::Undefined => write!(f, "undefined"),
-            ContentRatingMocRating::MocUnspecified => write!(f, "mocUnspecified"),
-            ContentRatingMocRating::MocE => write!(f, "mocE"),
-            ContentRatingMocRating::MocT => write!(f, "mocT"),
-            ContentRatingMocRating::Moc7 => write!(f, "moc7"),
-            ContentRatingMocRating::Moc12 => write!(f, "moc12"),
-            ContentRatingMocRating::Moc15 => write!(f, "moc15"),
-            ContentRatingMocRating::Moc18 => write!(f, "moc18"),
-            ContentRatingMocRating::MocX => write!(f, "mocX"),
-            ContentRatingMocRating::MocBanned => write!(f, "mocBanned"),
-            ContentRatingMocRating::MocUnrated => write!(f, "mocUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCncRating {
-    Undefined,
-    ///
-    #[serde(rename = "cncUnspecified")]
-    CncUnspecified,
-    /// T
-    #[serde(rename = "cncT")]
-    CncT,
-    /// 10
-    #[serde(rename = "cnc10")]
-    Cnc10,
-    /// 12
-    #[serde(rename = "cnc12")]
-    Cnc12,
-    /// 16
-    #[serde(rename = "cnc16")]
-    Cnc16,
-    /// 18
-    #[serde(rename = "cnc18")]
-    Cnc18,
-    /// E
-    #[serde(rename = "cncE")]
-    CncE,
-    /// interdiction
-    #[serde(rename = "cncInterdiction")]
-    CncInterdiction,
-    ///
-    #[serde(rename = "cncUnrated")]
-    CncUnrated,
-}
-
-impl std::default::Default for ContentRatingCncRating {
-    fn default() -> ContentRatingCncRating {
-        ContentRatingCncRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCncRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCncRating::Undefined => write!(f, "undefined"),
-            ContentRatingCncRating::CncUnspecified => write!(f, "cncUnspecified"),
-            ContentRatingCncRating::CncT => write!(f, "cncT"),
-            ContentRatingCncRating::Cnc10 => write!(f, "cnc10"),
-            ContentRatingCncRating::Cnc12 => write!(f, "cnc12"),
-            ContentRatingCncRating::Cnc16 => write!(f, "cnc16"),
-            ContentRatingCncRating::Cnc18 => write!(f, "cnc18"),
-            ContentRatingCncRating::CncE => write!(f, "cncE"),
-            ContentRatingCncRating::CncInterdiction => write!(f, "cncInterdiction"),
-            ContentRatingCncRating::CncUnrated => write!(f, "cncUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCbfcRating {
-    Undefined,
-    ///
-    #[serde(rename = "cbfcUnspecified")]
-    CbfcUnspecified,
-    /// U
-    #[serde(rename = "cbfcU")]
-    CbfcU,
-    /// U/A
-    #[serde(rename = "cbfcUA")]
-    CbfcUA,
-    /// A
-    #[serde(rename = "cbfcA")]
-    CbfcA,
-    /// S
-    #[serde(rename = "cbfcS")]
-    CbfcS,
-    ///
-    #[serde(rename = "cbfcUnrated")]
-    CbfcUnrated,
-}
-
-impl std::default::Default for ContentRatingCbfcRating {
-    fn default() -> ContentRatingCbfcRating {
-        ContentRatingCbfcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCbfcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCbfcRating::Undefined => write!(f, "undefined"),
-            ContentRatingCbfcRating::CbfcUnspecified => write!(f, "cbfcUnspecified"),
-            ContentRatingCbfcRating::CbfcU => write!(f, "cbfcU"),
-            ContentRatingCbfcRating::CbfcUA => write!(f, "cbfcUA"),
-            ContentRatingCbfcRating::CbfcA => write!(f, "cbfcA"),
-            ContentRatingCbfcRating::CbfcS => write!(f, "cbfcS"),
-            ContentRatingCbfcRating::CbfcUnrated => write!(f, "cbfcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMtrcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "mtrcbUnspecified")]
-    MtrcbUnspecified,
-    /// G
-    #[serde(rename = "mtrcbG")]
-    MtrcbG,
-    /// PG
-    #[serde(rename = "mtrcbPg")]
-    MtrcbPg,
-    /// R-13
-    #[serde(rename = "mtrcbR13")]
-    MtrcbR13,
-    /// R-16
-    #[serde(rename = "mtrcbR16")]
-    MtrcbR16,
-    /// R-18
-    #[serde(rename = "mtrcbR18")]
-    MtrcbR18,
-    /// X
-    #[serde(rename = "mtrcbX")]
-    MtrcbX,
-    ///
-    #[serde(rename = "mtrcbUnrated")]
-    MtrcbUnrated,
-}
-
-impl std::default::Default for ContentRatingMtrcbRating {
-    fn default() -> ContentRatingMtrcbRating {
-        ContentRatingMtrcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMtrcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMtrcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingMtrcbRating::MtrcbUnspecified => write!(f, "mtrcbUnspecified"),
-            ContentRatingMtrcbRating::MtrcbG => write!(f, "mtrcbG"),
-            ContentRatingMtrcbRating::MtrcbPg => write!(f, "mtrcbPg"),
-            ContentRatingMtrcbRating::MtrcbR13 => write!(f, "mtrcbR13"),
-            ContentRatingMtrcbRating::MtrcbR16 => write!(f, "mtrcbR16"),
-            ContentRatingMtrcbRating::MtrcbR18 => write!(f, "mtrcbR18"),
-            ContentRatingMtrcbRating::MtrcbX => write!(f, "mtrcbX"),
-            ContentRatingMtrcbRating::MtrcbUnrated => write!(f, "mtrcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNbcplRating {
-    Undefined,
-    ///
-    #[serde(rename = "nbcplUnspecified")]
-    NbcplUnspecified,
-    ///
-    #[serde(rename = "nbcplI")]
-    NbcplI,
-    ///
-    #[serde(rename = "nbcplIi")]
-    NbcplIi,
-    ///
-    #[serde(rename = "nbcplIii")]
-    NbcplIii,
-    ///
-    #[serde(rename = "nbcplIv")]
-    NbcplIv,
-    ///
-    #[serde(rename = "nbcpl18plus")]
-    Nbcpl18plus,
-    ///
-    #[serde(rename = "nbcplUnrated")]
-    NbcplUnrated,
-}
-
-impl std::default::Default for ContentRatingNbcplRating {
-    fn default() -> ContentRatingNbcplRating {
-        ContentRatingNbcplRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNbcplRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNbcplRating::Undefined => write!(f, "undefined"),
-            ContentRatingNbcplRating::NbcplUnspecified => write!(f, "nbcplUnspecified"),
-            ContentRatingNbcplRating::NbcplI => write!(f, "nbcplI"),
-            ContentRatingNbcplRating::NbcplIi => write!(f, "nbcplIi"),
-            ContentRatingNbcplRating::NbcplIii => write!(f, "nbcplIii"),
-            ContentRatingNbcplRating::NbcplIv => write!(f, "nbcplIv"),
-            ContentRatingNbcplRating::Nbcpl18plus => write!(f, "nbcpl18plus"),
-            ContentRatingNbcplRating::NbcplUnrated => write!(f, "nbcplUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMekuRating {
-    Undefined,
-    ///
-    #[serde(rename = "mekuUnspecified")]
-    MekuUnspecified,
-    /// S
-    #[serde(rename = "mekuS")]
-    MekuS,
-    /// 7
-    #[serde(rename = "meku7")]
-    Meku7,
-    /// 12
-    #[serde(rename = "meku12")]
-    Meku12,
-    /// 16
-    #[serde(rename = "meku16")]
-    Meku16,
-    /// 18
-    #[serde(rename = "meku18")]
-    Meku18,
-    ///
-    #[serde(rename = "mekuUnrated")]
-    MekuUnrated,
-}
-
-impl std::default::Default for ContentRatingMekuRating {
-    fn default() -> ContentRatingMekuRating {
-        ContentRatingMekuRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMekuRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMekuRating::Undefined => write!(f, "undefined"),
-            ContentRatingMekuRating::MekuUnspecified => write!(f, "mekuUnspecified"),
-            ContentRatingMekuRating::MekuS => write!(f, "mekuS"),
-            ContentRatingMekuRating::Meku7 => write!(f, "meku7"),
-            ContentRatingMekuRating::Meku12 => write!(f, "meku12"),
-            ContentRatingMekuRating::Meku16 => write!(f, "meku16"),
-            ContentRatingMekuRating::Meku18 => write!(f, "meku18"),
-            ContentRatingMekuRating::MekuUnrated => write!(f, "mekuUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAgcomRating {
-    Undefined,
-    ///
-    #[serde(rename = "agcomUnspecified")]
-    AgcomUnspecified,
-    /// T
-    #[serde(rename = "agcomT")]
-    AgcomT,
-    /// VM14
-    #[serde(rename = "agcomVm14")]
-    AgcomVm14,
-    /// VM18
-    #[serde(rename = "agcomVm18")]
-    AgcomVm18,
-    ///
-    #[serde(rename = "agcomUnrated")]
-    AgcomUnrated,
-}
-
-impl std::default::Default for ContentRatingAgcomRating {
-    fn default() -> ContentRatingAgcomRating {
-        ContentRatingAgcomRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAgcomRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAgcomRating::Undefined => write!(f, "undefined"),
-            ContentRatingAgcomRating::AgcomUnspecified => write!(f, "agcomUnspecified"),
-            ContentRatingAgcomRating::AgcomT => write!(f, "agcomT"),
-            ContentRatingAgcomRating::AgcomVm14 => write!(f, "agcomVm14"),
-            ContentRatingAgcomRating::AgcomVm18 => write!(f, "agcomVm18"),
-            ContentRatingAgcomRating::AgcomUnrated => write!(f, "agcomUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCicfRating {
-    Undefined,
-    ///
-    #[serde(rename = "cicfUnspecified")]
-    CicfUnspecified,
-    /// E
-    #[serde(rename = "cicfE")]
-    CicfE,
-    /// KT/EA
-    #[serde(rename = "cicfKtEa")]
-    CicfKtEa,
-    /// KNT/ENA
-    #[serde(rename = "cicfKntEna")]
-    CicfKntEna,
-    ///
-    #[serde(rename = "cicfUnrated")]
-    CicfUnrated,
-}
-
-impl std::default::Default for ContentRatingCicfRating {
-    fn default() -> ContentRatingCicfRating {
-        ContentRatingCicfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCicfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCicfRating::Undefined => write!(f, "undefined"),
-            ContentRatingCicfRating::CicfUnspecified => write!(f, "cicfUnspecified"),
-            ContentRatingCicfRating::CicfE => write!(f, "cicfE"),
-            ContentRatingCicfRating::CicfKtEa => write!(f, "cicfKtEa"),
-            ContentRatingCicfRating::CicfKntEna => write!(f, "cicfKntEna"),
-            ContentRatingCicfRating::CicfUnrated => write!(f, "cicfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNbcRating {
-    Undefined,
-    ///
-    #[serde(rename = "nbcUnspecified")]
-    NbcUnspecified,
-    /// G
-    #[serde(rename = "nbcG")]
-    NbcG,
-    /// PG
-    #[serde(rename = "nbcPg")]
-    NbcPg,
-    /// 12+
-    #[serde(rename = "nbc12plus")]
-    Nbc12plus,
-    /// 15+
-    #[serde(rename = "nbc15plus")]
-    Nbc15plus,
-    /// 18+
-    #[serde(rename = "nbc18plus")]
-    Nbc18plus,
-    /// 18+R
-    #[serde(rename = "nbc18plusr")]
-    Nbc18plusr,
-    /// PU
-    #[serde(rename = "nbcPu")]
-    NbcPu,
-    ///
-    #[serde(rename = "nbcUnrated")]
-    NbcUnrated,
-}
-
-impl std::default::Default for ContentRatingNbcRating {
-    fn default() -> ContentRatingNbcRating {
-        ContentRatingNbcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNbcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNbcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNbcRating::NbcUnspecified => write!(f, "nbcUnspecified"),
-            ContentRatingNbcRating::NbcG => write!(f, "nbcG"),
-            ContentRatingNbcRating::NbcPg => write!(f, "nbcPg"),
-            ContentRatingNbcRating::Nbc12plus => write!(f, "nbc12plus"),
-            ContentRatingNbcRating::Nbc15plus => write!(f, "nbc15plus"),
-            ContentRatingNbcRating::Nbc18plus => write!(f, "nbc18plus"),
-            ContentRatingNbcRating::Nbc18plusr => write!(f, "nbc18plusr"),
-            ContentRatingNbcRating::NbcPu => write!(f, "nbcPu"),
-            ContentRatingNbcRating::NbcUnrated => write!(f, "nbcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCccRating {
-    Undefined,
-    ///
-    #[serde(rename = "cccUnspecified")]
-    CccUnspecified,
-    /// Todo espectador
-    #[serde(rename = "cccTe")]
-    CccTe,
-    /// 6+ - Inconveniente para menores de 7 años
-    #[serde(rename = "ccc6")]
-    Ccc6,
-    /// 14+
-    #[serde(rename = "ccc14")]
-    Ccc14,
-    /// 18+
-    #[serde(rename = "ccc18")]
-    Ccc18,
-    /// 18+ - contenido excesivamente violento
-    #[serde(rename = "ccc18v")]
-    Ccc18v,
-    /// 18+ - contenido pornográfico
-    #[serde(rename = "ccc18s")]
-    Ccc18s,
-    ///
-    #[serde(rename = "cccUnrated")]
-    CccUnrated,
-}
-
-impl std::default::Default for ContentRatingCccRating {
-    fn default() -> ContentRatingCccRating {
-        ContentRatingCccRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCccRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCccRating::Undefined => write!(f, "undefined"),
-            ContentRatingCccRating::CccUnspecified => write!(f, "cccUnspecified"),
-            ContentRatingCccRating::CccTe => write!(f, "cccTe"),
-            ContentRatingCccRating::Ccc6 => write!(f, "ccc6"),
-            ContentRatingCccRating::Ccc14 => write!(f, "ccc14"),
-            ContentRatingCccRating::Ccc18 => write!(f, "ccc18"),
-            ContentRatingCccRating::Ccc18v => write!(f, "ccc18v"),
-            ContentRatingCccRating::Ccc18s => write!(f, "ccc18s"),
-            ContentRatingCccRating::CccUnrated => write!(f, "cccUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCzfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "czfilmUnspecified")]
-    CzfilmUnspecified,
-    /// U
-    #[serde(rename = "czfilmU")]
-    CzfilmU,
-    /// 12
-    #[serde(rename = "czfilm12")]
-    Czfilm12,
-    /// 14
-    #[serde(rename = "czfilm14")]
-    Czfilm14,
-    /// 18
-    #[serde(rename = "czfilm18")]
-    Czfilm18,
-    ///
-    #[serde(rename = "czfilmUnrated")]
-    CzfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingCzfilmRating {
-    fn default() -> ContentRatingCzfilmRating {
-        ContentRatingCzfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCzfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCzfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingCzfilmRating::CzfilmUnspecified => write!(f, "czfilmUnspecified"),
-            ContentRatingCzfilmRating::CzfilmU => write!(f, "czfilmU"),
-            ContentRatingCzfilmRating::Czfilm12 => write!(f, "czfilm12"),
-            ContentRatingCzfilmRating::Czfilm14 => write!(f, "czfilm14"),
-            ContentRatingCzfilmRating::Czfilm18 => write!(f, "czfilm18"),
-            ContentRatingCzfilmRating::CzfilmUnrated => write!(f, "czfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCsaRating {
-    Undefined,
-    ///
-    #[serde(rename = "csaUnspecified")]
-    CsaUnspecified,
-    /// T
-    #[serde(rename = "csaT")]
-    CsaT,
-    /// 10
-    #[serde(rename = "csa10")]
-    Csa10,
-    /// 12
-    #[serde(rename = "csa12")]
-    Csa12,
-    /// 16
-    #[serde(rename = "csa16")]
-    Csa16,
-    /// 18
-    #[serde(rename = "csa18")]
-    Csa18,
-    /// Interdiction
-    #[serde(rename = "csaInterdiction")]
-    CsaInterdiction,
-    ///
-    #[serde(rename = "csaUnrated")]
-    CsaUnrated,
-}
-
-impl std::default::Default for ContentRatingCsaRating {
-    fn default() -> ContentRatingCsaRating {
-        ContentRatingCsaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCsaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCsaRating::Undefined => write!(f, "undefined"),
-            ContentRatingCsaRating::CsaUnspecified => write!(f, "csaUnspecified"),
-            ContentRatingCsaRating::CsaT => write!(f, "csaT"),
-            ContentRatingCsaRating::Csa10 => write!(f, "csa10"),
-            ContentRatingCsaRating::Csa12 => write!(f, "csa12"),
-            ContentRatingCsaRating::Csa16 => write!(f, "csa16"),
-            ContentRatingCsaRating::Csa18 => write!(f, "csa18"),
-            ContentRatingCsaRating::CsaInterdiction => write!(f, "csaInterdiction"),
-            ContentRatingCsaRating::CsaUnrated => write!(f, "csaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNkclvRating {
-    Undefined,
-    ///
-    #[serde(rename = "nkclvUnspecified")]
-    NkclvUnspecified,
-    /// U
-    #[serde(rename = "nkclvU")]
-    NkclvU,
-    /// 7+
-    #[serde(rename = "nkclv7plus")]
-    Nkclv7plus,
-    /// 12+
-    #[serde(rename = "nkclv12plus")]
-    Nkclv12plus,
-    /// ! 16+
-    #[serde(rename = "nkclv16plus")]
-    Nkclv16plus,
-    /// 18+
-    #[serde(rename = "nkclv18plus")]
-    Nkclv18plus,
-    ///
-    #[serde(rename = "nkclvUnrated")]
-    NkclvUnrated,
-}
-
-impl std::default::Default for ContentRatingNkclvRating {
-    fn default() -> ContentRatingNkclvRating {
-        ContentRatingNkclvRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNkclvRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNkclvRating::Undefined => write!(f, "undefined"),
-            ContentRatingNkclvRating::NkclvUnspecified => write!(f, "nkclvUnspecified"),
-            ContentRatingNkclvRating::NkclvU => write!(f, "nkclvU"),
-            ContentRatingNkclvRating::Nkclv7plus => write!(f, "nkclv7plus"),
-            ContentRatingNkclvRating::Nkclv12plus => write!(f, "nkclv12plus"),
-            ContentRatingNkclvRating::Nkclv16plus => write!(f, "nkclv16plus"),
-            ContentRatingNkclvRating::Nkclv18plus => write!(f, "nkclv18plus"),
-            ContentRatingNkclvRating::NkclvUnrated => write!(f, "nkclvUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEcbmctRating {
-    Undefined,
-    ///
-    #[serde(rename = "ecbmctUnspecified")]
-    EcbmctUnspecified,
-    /// G
-    #[serde(rename = "ecbmctG")]
-    EcbmctG,
-    /// 7A
-    #[serde(rename = "ecbmct7a")]
-    Ecbmct7a,
-    /// 7+
-    #[serde(rename = "ecbmct7plus")]
-    Ecbmct7plus,
-    /// 13A
-    #[serde(rename = "ecbmct13a")]
-    Ecbmct13a,
-    /// 13+
-    #[serde(rename = "ecbmct13plus")]
-    Ecbmct13plus,
-    /// 15A
-    #[serde(rename = "ecbmct15a")]
-    Ecbmct15a,
-    /// 15+
-    #[serde(rename = "ecbmct15plus")]
-    Ecbmct15plus,
-    /// 18+
-    #[serde(rename = "ecbmct18plus")]
-    Ecbmct18plus,
-    ///
-    #[serde(rename = "ecbmctUnrated")]
-    EcbmctUnrated,
-}
-
-impl std::default::Default for ContentRatingEcbmctRating {
-    fn default() -> ContentRatingEcbmctRating {
-        ContentRatingEcbmctRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEcbmctRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEcbmctRating::Undefined => write!(f, "undefined"),
-            ContentRatingEcbmctRating::EcbmctUnspecified => write!(f, "ecbmctUnspecified"),
-            ContentRatingEcbmctRating::EcbmctG => write!(f, "ecbmctG"),
-            ContentRatingEcbmctRating::Ecbmct7a => write!(f, "ecbmct7a"),
-            ContentRatingEcbmctRating::Ecbmct7plus => write!(f, "ecbmct7plus"),
-            ContentRatingEcbmctRating::Ecbmct13a => write!(f, "ecbmct13a"),
-            ContentRatingEcbmctRating::Ecbmct13plus => write!(f, "ecbmct13plus"),
-            ContentRatingEcbmctRating::Ecbmct15a => write!(f, "ecbmct15a"),
-            ContentRatingEcbmctRating::Ecbmct15plus => write!(f, "ecbmct15plus"),
-            ContentRatingEcbmctRating::Ecbmct18plus => write!(f, "ecbmct18plus"),
-            ContentRatingEcbmctRating::EcbmctUnrated => write!(f, "ecbmctUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingLsfRating {
-    Undefined,
-    ///
-    #[serde(rename = "lsfUnspecified")]
-    LsfUnspecified,
-    /// SU
-    #[serde(rename = "lsfSu")]
-    LsfSu,
-    /// A
-    #[serde(rename = "lsfA")]
-    LsfA,
-    /// BO
-    #[serde(rename = "lsfBo")]
-    LsfBo,
-    /// 13
-    #[serde(rename = "lsf13")]
-    Lsf13,
-    /// R
-    #[serde(rename = "lsfR")]
-    LsfR,
-    /// 17
-    #[serde(rename = "lsf17")]
-    Lsf17,
-    /// D
-    #[serde(rename = "lsfD")]
-    LsfD,
-    /// 21
-    #[serde(rename = "lsf21")]
-    Lsf21,
-    ///
-    #[serde(rename = "lsfUnrated")]
-    LsfUnrated,
-}
-
-impl std::default::Default for ContentRatingLsfRating {
-    fn default() -> ContentRatingLsfRating {
-        ContentRatingLsfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingLsfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingLsfRating::Undefined => write!(f, "undefined"),
-            ContentRatingLsfRating::LsfUnspecified => write!(f, "lsfUnspecified"),
-            ContentRatingLsfRating::LsfSu => write!(f, "lsfSu"),
-            ContentRatingLsfRating::LsfA => write!(f, "lsfA"),
-            ContentRatingLsfRating::LsfBo => write!(f, "lsfBo"),
-            ContentRatingLsfRating::Lsf13 => write!(f, "lsf13"),
-            ContentRatingLsfRating::LsfR => write!(f, "lsfR"),
-            ContentRatingLsfRating::Lsf17 => write!(f, "lsf17"),
-            ContentRatingLsfRating::LsfD => write!(f, "lsfD"),
-            ContentRatingLsfRating::Lsf21 => write!(f, "lsf21"),
-            ContentRatingLsfRating::LsfUnrated => write!(f, "lsfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMcstRating {
-    Undefined,
-    ///
-    #[serde(rename = "mcstUnspecified")]
-    McstUnspecified,
-    /// P
-    #[serde(rename = "mcstP")]
-    McstP,
-    /// 0
-    #[serde(rename = "mcst0")]
-    Mcst0,
-    /// C13
-    #[serde(rename = "mcstC13")]
-    McstC13,
-    /// C16
-    #[serde(rename = "mcstC16")]
-    McstC16,
-    /// 16+
-    #[serde(rename = "mcst16plus")]
-    Mcst16plus,
-    /// C18
-    #[serde(rename = "mcstC18")]
-    McstC18,
-    /// MCST_G_PG
-    #[serde(rename = "mcstGPg")]
-    McstGPg,
-    ///
-    #[serde(rename = "mcstUnrated")]
-    McstUnrated,
-}
-
-impl std::default::Default for ContentRatingMcstRating {
-    fn default() -> ContentRatingMcstRating {
-        ContentRatingMcstRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMcstRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMcstRating::Undefined => write!(f, "undefined"),
-            ContentRatingMcstRating::McstUnspecified => write!(f, "mcstUnspecified"),
-            ContentRatingMcstRating::McstP => write!(f, "mcstP"),
-            ContentRatingMcstRating::Mcst0 => write!(f, "mcst0"),
-            ContentRatingMcstRating::McstC13 => write!(f, "mcstC13"),
-            ContentRatingMcstRating::McstC16 => write!(f, "mcstC16"),
-            ContentRatingMcstRating::Mcst16plus => write!(f, "mcst16plus"),
-            ContentRatingMcstRating::McstC18 => write!(f, "mcstC18"),
-            ContentRatingMcstRating::McstGPg => write!(f, "mcstGPg"),
-            ContentRatingMcstRating::McstUnrated => write!(f, "mcstUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingTvpgRating {
-    Undefined,
-    ///
-    #[serde(rename = "tvpgUnspecified")]
-    TvpgUnspecified,
-    /// TV-Y
-    #[serde(rename = "tvpgY")]
-    TvpgY,
-    /// TV-Y7
-    #[serde(rename = "tvpgY7")]
-    TvpgY7,
-    /// TV-Y7-FV
-    #[serde(rename = "tvpgY7Fv")]
-    TvpgY7Fv,
-    /// TV-G
-    #[serde(rename = "tvpgG")]
-    TvpgG,
-    /// TV-PG
-    #[serde(rename = "tvpgPg")]
-    TvpgPg,
-    /// TV-14
-    #[serde(rename = "pg14")]
-    Pg14,
-    /// TV-MA
-    #[serde(rename = "tvpgMa")]
-    TvpgMa,
-    ///
-    #[serde(rename = "tvpgUnrated")]
-    TvpgUnrated,
-}
-
-impl std::default::Default for ContentRatingTvpgRating {
-    fn default() -> ContentRatingTvpgRating {
-        ContentRatingTvpgRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingTvpgRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingTvpgRating::Undefined => write!(f, "undefined"),
-            ContentRatingTvpgRating::TvpgUnspecified => write!(f, "tvpgUnspecified"),
-            ContentRatingTvpgRating::TvpgY => write!(f, "tvpgY"),
-            ContentRatingTvpgRating::TvpgY7 => write!(f, "tvpgY7"),
-            ContentRatingTvpgRating::TvpgY7Fv => write!(f, "tvpgY7Fv"),
-            ContentRatingTvpgRating::TvpgG => write!(f, "tvpgG"),
-            ContentRatingTvpgRating::TvpgPg => write!(f, "tvpgPg"),
-            ContentRatingTvpgRating::Pg14 => write!(f, "pg14"),
-            ContentRatingTvpgRating::TvpgMa => write!(f, "tvpgMa"),
-            ContentRatingTvpgRating::TvpgUnrated => write!(f, "tvpgUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCatvRating {
-    Undefined,
-    ///
-    #[serde(rename = "catvUnspecified")]
-    CatvUnspecified,
-    /// C
-    #[serde(rename = "catvC")]
-    CatvC,
-    /// C8
-    #[serde(rename = "catvC8")]
-    CatvC8,
-    /// G
-    #[serde(rename = "catvG")]
-    CatvG,
-    /// PG
-    #[serde(rename = "catvPg")]
-    CatvPg,
-    /// 14+
-    #[serde(rename = "catv14plus")]
-    Catv14plus,
-    /// 18+
-    #[serde(rename = "catv18plus")]
-    Catv18plus,
-    ///
-    #[serde(rename = "catvUnrated")]
-    CatvUnrated,
-    ///
-    #[serde(rename = "catvE")]
-    CatvE,
-}
-
-impl std::default::Default for ContentRatingCatvRating {
-    fn default() -> ContentRatingCatvRating {
-        ContentRatingCatvRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCatvRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCatvRating::Undefined => write!(f, "undefined"),
-            ContentRatingCatvRating::CatvUnspecified => write!(f, "catvUnspecified"),
-            ContentRatingCatvRating::CatvC => write!(f, "catvC"),
-            ContentRatingCatvRating::CatvC8 => write!(f, "catvC8"),
-            ContentRatingCatvRating::CatvG => write!(f, "catvG"),
-            ContentRatingCatvRating::CatvPg => write!(f, "catvPg"),
-            ContentRatingCatvRating::Catv14plus => write!(f, "catv14plus"),
-            ContentRatingCatvRating::Catv18plus => write!(f, "catv18plus"),
-            ContentRatingCatvRating::CatvUnrated => write!(f, "catvUnrated"),
-            ContentRatingCatvRating::CatvE => write!(f, "catvE"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingResorteviolenciaRating {
-    Undefined,
-    ///
-    #[serde(rename = "resorteviolenciaUnspecified")]
-    ResorteviolenciaUnspecified,
-    /// A
-    #[serde(rename = "resorteviolenciaA")]
-    ResorteviolenciaA,
-    /// B
-    #[serde(rename = "resorteviolenciaB")]
-    ResorteviolenciaB,
-    /// C
-    #[serde(rename = "resorteviolenciaC")]
-    ResorteviolenciaC,
-    /// D
-    #[serde(rename = "resorteviolenciaD")]
-    ResorteviolenciaD,
-    /// E
-    #[serde(rename = "resorteviolenciaE")]
-    ResorteviolenciaE,
-    ///
-    #[serde(rename = "resorteviolenciaUnrated")]
-    ResorteviolenciaUnrated,
-}
-
-impl std::default::Default for ContentRatingResorteviolenciaRating {
-    fn default() -> ContentRatingResorteviolenciaRating {
-        ContentRatingResorteviolenciaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingResorteviolenciaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingResorteviolenciaRating::Undefined => write!(f, "undefined"),
-            ContentRatingResorteviolenciaRating::ResorteviolenciaUnspecified => {
-                write!(f, "resorteviolenciaUnspecified")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaA => {
-                write!(f, "resorteviolenciaA")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaB => {
-                write!(f, "resorteviolenciaB")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaC => {
-                write!(f, "resorteviolenciaC")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaD => {
-                write!(f, "resorteviolenciaD")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaE => {
-                write!(f, "resorteviolenciaE")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaUnrated => {
-                write!(f, "resorteviolenciaUnrated")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIcaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "icaaUnspecified")]
-    IcaaUnspecified,
-    /// APTA
-    #[serde(rename = "icaaApta")]
-    IcaaApta,
-    /// 7
-    #[serde(rename = "icaa7")]
-    Icaa7,
-    /// 12
-    #[serde(rename = "icaa12")]
-    Icaa12,
-    /// 13
-    #[serde(rename = "icaa13")]
-    Icaa13,
-    /// 16
-    #[serde(rename = "icaa16")]
-    Icaa16,
-    /// 18
-    #[serde(rename = "icaa18")]
-    Icaa18,
-    /// X
-    #[serde(rename = "icaaX")]
-    IcaaX,
-    ///
-    #[serde(rename = "icaaUnrated")]
-    IcaaUnrated,
-}
-
-impl std::default::Default for ContentRatingIcaaRating {
-    fn default() -> ContentRatingIcaaRating {
-        ContentRatingIcaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIcaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIcaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingIcaaRating::IcaaUnspecified => write!(f, "icaaUnspecified"),
-            ContentRatingIcaaRating::IcaaApta => write!(f, "icaaApta"),
-            ContentRatingIcaaRating::Icaa7 => write!(f, "icaa7"),
-            ContentRatingIcaaRating::Icaa12 => write!(f, "icaa12"),
-            ContentRatingIcaaRating::Icaa13 => write!(f, "icaa13"),
-            ContentRatingIcaaRating::Icaa16 => write!(f, "icaa16"),
-            ContentRatingIcaaRating::Icaa18 => write!(f, "icaa18"),
-            ContentRatingIcaaRating::IcaaX => write!(f, "icaaX"),
-            ContentRatingIcaaRating::IcaaUnrated => write!(f, "icaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingDjctqRating {
-    Undefined,
-    ///
-    #[serde(rename = "djctqUnspecified")]
-    DjctqUnspecified,
-    /// L
-    #[serde(rename = "djctqL")]
-    DjctqL,
-    /// 10
-    #[serde(rename = "djctq10")]
-    Djctq10,
-    /// 12
-    #[serde(rename = "djctq12")]
-    Djctq12,
-    /// 14
-    #[serde(rename = "djctq14")]
-    Djctq14,
-    /// 16
-    #[serde(rename = "djctq16")]
-    Djctq16,
-    /// 18
-    #[serde(rename = "djctq18")]
-    Djctq18,
-    ///
-    #[serde(rename = "djctqEr")]
-    DjctqEr,
-    ///
-    #[serde(rename = "djctqL10")]
-    DjctqL10,
-    ///
-    #[serde(rename = "djctqL12")]
-    DjctqL12,
-    ///
-    #[serde(rename = "djctqL14")]
-    DjctqL14,
-    ///
-    #[serde(rename = "djctqL16")]
-    DjctqL16,
-    ///
-    #[serde(rename = "djctqL18")]
-    DjctqL18,
-    ///
-    #[serde(rename = "djctq1012")]
-    Djctq1012,
-    ///
-    #[serde(rename = "djctq1014")]
-    Djctq1014,
-    ///
-    #[serde(rename = "djctq1016")]
-    Djctq1016,
-    ///
-    #[serde(rename = "djctq1018")]
-    Djctq1018,
-    ///
-    #[serde(rename = "djctq1214")]
-    Djctq1214,
-    ///
-    #[serde(rename = "djctq1216")]
-    Djctq1216,
-    ///
-    #[serde(rename = "djctq1218")]
-    Djctq1218,
-    ///
-    #[serde(rename = "djctq1416")]
-    Djctq1416,
-    ///
-    #[serde(rename = "djctq1418")]
-    Djctq1418,
-    ///
-    #[serde(rename = "djctq1618")]
-    Djctq1618,
-    ///
-    #[serde(rename = "djctqUnrated")]
-    DjctqUnrated,
-}
-
-impl std::default::Default for ContentRatingDjctqRating {
-    fn default() -> ContentRatingDjctqRating {
-        ContentRatingDjctqRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingDjctqRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingDjctqRating::Undefined => write!(f, "undefined"),
-            ContentRatingDjctqRating::DjctqUnspecified => write!(f, "djctqUnspecified"),
-            ContentRatingDjctqRating::DjctqL => write!(f, "djctqL"),
-            ContentRatingDjctqRating::Djctq10 => write!(f, "djctq10"),
-            ContentRatingDjctqRating::Djctq12 => write!(f, "djctq12"),
-            ContentRatingDjctqRating::Djctq14 => write!(f, "djctq14"),
-            ContentRatingDjctqRating::Djctq16 => write!(f, "djctq16"),
-            ContentRatingDjctqRating::Djctq18 => write!(f, "djctq18"),
-            ContentRatingDjctqRating::DjctqEr => write!(f, "djctqEr"),
-            ContentRatingDjctqRating::DjctqL10 => write!(f, "djctqL10"),
-            ContentRatingDjctqRating::DjctqL12 => write!(f, "djctqL12"),
-            ContentRatingDjctqRating::DjctqL14 => write!(f, "djctqL14"),
-            ContentRatingDjctqRating::DjctqL16 => write!(f, "djctqL16"),
-            ContentRatingDjctqRating::DjctqL18 => write!(f, "djctqL18"),
-            ContentRatingDjctqRating::Djctq1012 => write!(f, "djctq1012"),
-            ContentRatingDjctqRating::Djctq1014 => write!(f, "djctq1014"),
-            ContentRatingDjctqRating::Djctq1016 => write!(f, "djctq1016"),
-            ContentRatingDjctqRating::Djctq1018 => write!(f, "djctq1018"),
-            ContentRatingDjctqRating::Djctq1214 => write!(f, "djctq1214"),
-            ContentRatingDjctqRating::Djctq1216 => write!(f, "djctq1216"),
-            ContentRatingDjctqRating::Djctq1218 => write!(f, "djctq1218"),
-            ContentRatingDjctqRating::Djctq1416 => write!(f, "djctq1416"),
-            ContentRatingDjctqRating::Djctq1418 => write!(f, "djctq1418"),
-            ContentRatingDjctqRating::Djctq1618 => write!(f, "djctq1618"),
-            ContentRatingDjctqRating::DjctqUnrated => write!(f, "djctqUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKijkwijzerRating {
-    Undefined,
-    ///
-    #[serde(rename = "kijkwijzerUnspecified")]
-    KijkwijzerUnspecified,
-    /// AL
-    #[serde(rename = "kijkwijzerAl")]
-    KijkwijzerAl,
-    /// 6
-    #[serde(rename = "kijkwijzer6")]
-    Kijkwijzer6,
-    /// 9
-    #[serde(rename = "kijkwijzer9")]
-    Kijkwijzer9,
-    /// 12
-    #[serde(rename = "kijkwijzer12")]
-    Kijkwijzer12,
-    /// 16
-    #[serde(rename = "kijkwijzer16")]
-    Kijkwijzer16,
-    ///
-    #[serde(rename = "kijkwijzer18")]
-    Kijkwijzer18,
-    ///
-    #[serde(rename = "kijkwijzerUnrated")]
-    KijkwijzerUnrated,
-}
-
-impl std::default::Default for ContentRatingKijkwijzerRating {
-    fn default() -> ContentRatingKijkwijzerRating {
-        ContentRatingKijkwijzerRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKijkwijzerRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKijkwijzerRating::Undefined => write!(f, "undefined"),
-            ContentRatingKijkwijzerRating::KijkwijzerUnspecified => {
-                write!(f, "kijkwijzerUnspecified")
-            }
-            ContentRatingKijkwijzerRating::KijkwijzerAl => write!(f, "kijkwijzerAl"),
-            ContentRatingKijkwijzerRating::Kijkwijzer6 => write!(f, "kijkwijzer6"),
-            ContentRatingKijkwijzerRating::Kijkwijzer9 => write!(f, "kijkwijzer9"),
-            ContentRatingKijkwijzerRating::Kijkwijzer12 => write!(f, "kijkwijzer12"),
-            ContentRatingKijkwijzerRating::Kijkwijzer16 => write!(f, "kijkwijzer16"),
-            ContentRatingKijkwijzerRating::Kijkwijzer18 => write!(f, "kijkwijzer18"),
-            ContentRatingKijkwijzerRating::KijkwijzerUnrated => write!(f, "kijkwijzerUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEefilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "eefilmUnspecified")]
-    EefilmUnspecified,
-    /// Pere
-    #[serde(rename = "eefilmPere")]
-    EefilmPere,
-    /// L
-    #[serde(rename = "eefilmL")]
-    EefilmL,
-    /// MS-6
-    #[serde(rename = "eefilmMs6")]
-    EefilmMs6,
-    /// K-6
-    #[serde(rename = "eefilmK6")]
-    EefilmK6,
-    /// MS-12
-    #[serde(rename = "eefilmMs12")]
-    EefilmMs12,
-    /// K-12
-    #[serde(rename = "eefilmK12")]
-    EefilmK12,
-    /// K-14
-    #[serde(rename = "eefilmK14")]
-    EefilmK14,
-    /// K-16
-    #[serde(rename = "eefilmK16")]
-    EefilmK16,
-    ///
-    #[serde(rename = "eefilmUnrated")]
-    EefilmUnrated,
-}
-
-impl std::default::Default for ContentRatingEefilmRating {
-    fn default() -> ContentRatingEefilmRating {
-        ContentRatingEefilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEefilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEefilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingEefilmRating::EefilmUnspecified => write!(f, "eefilmUnspecified"),
-            ContentRatingEefilmRating::EefilmPere => write!(f, "eefilmPere"),
-            ContentRatingEefilmRating::EefilmL => write!(f, "eefilmL"),
-            ContentRatingEefilmRating::EefilmMs6 => write!(f, "eefilmMs6"),
-            ContentRatingEefilmRating::EefilmK6 => write!(f, "eefilmK6"),
-            ContentRatingEefilmRating::EefilmMs12 => write!(f, "eefilmMs12"),
-            ContentRatingEefilmRating::EefilmK12 => write!(f, "eefilmK12"),
-            ContentRatingEefilmRating::EefilmK14 => write!(f, "eefilmK14"),
-            ContentRatingEefilmRating::EefilmK16 => write!(f, "eefilmK16"),
-            ContentRatingEefilmRating::EefilmUnrated => write!(f, "eefilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCnaRating {
-    Undefined,
-    ///
-    #[serde(rename = "cnaUnspecified")]
-    CnaUnspecified,
-    /// AP
-    #[serde(rename = "cnaAp")]
-    CnaAp,
-    /// 12
-    #[serde(rename = "cna12")]
-    Cna12,
-    /// 15
-    #[serde(rename = "cna15")]
-    Cna15,
-    /// 18
-    #[serde(rename = "cna18")]
-    Cna18,
-    /// 18+
-    #[serde(rename = "cna18plus")]
-    Cna18plus,
-    ///
-    #[serde(rename = "cnaUnrated")]
-    CnaUnrated,
-}
-
-impl std::default::Default for ContentRatingCnaRating {
-    fn default() -> ContentRatingCnaRating {
-        ContentRatingCnaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCnaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCnaRating::Undefined => write!(f, "undefined"),
-            ContentRatingCnaRating::CnaUnspecified => write!(f, "cnaUnspecified"),
-            ContentRatingCnaRating::CnaAp => write!(f, "cnaAp"),
-            ContentRatingCnaRating::Cna12 => write!(f, "cna12"),
-            ContentRatingCnaRating::Cna15 => write!(f, "cna15"),
-            ContentRatingCnaRating::Cna18 => write!(f, "cna18"),
-            ContentRatingCnaRating::Cna18plus => write!(f, "cna18plus"),
-            ContentRatingCnaRating::CnaUnrated => write!(f, "cnaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingChvrsRating {
-    Undefined,
-    ///
-    #[serde(rename = "chvrsUnspecified")]
-    ChvrsUnspecified,
-    /// G
-    #[serde(rename = "chvrsG")]
-    ChvrsG,
-    /// PG
-    #[serde(rename = "chvrsPg")]
-    ChvrsPg,
-    /// 14A
-    #[serde(rename = "chvrs14a")]
-    Chvrs14a,
-    /// 18A
-    #[serde(rename = "chvrs18a")]
-    Chvrs18a,
-    /// R
-    #[serde(rename = "chvrsR")]
-    ChvrsR,
-    /// E
-    #[serde(rename = "chvrsE")]
-    ChvrsE,
-    ///
-    #[serde(rename = "chvrsUnrated")]
-    ChvrsUnrated,
-}
-
-impl std::default::Default for ContentRatingChvrsRating {
-    fn default() -> ContentRatingChvrsRating {
-        ContentRatingChvrsRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingChvrsRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingChvrsRating::Undefined => write!(f, "undefined"),
-            ContentRatingChvrsRating::ChvrsUnspecified => write!(f, "chvrsUnspecified"),
-            ContentRatingChvrsRating::ChvrsG => write!(f, "chvrsG"),
-            ContentRatingChvrsRating::ChvrsPg => write!(f, "chvrsPg"),
-            ContentRatingChvrsRating::Chvrs14a => write!(f, "chvrs14a"),
-            ContentRatingChvrsRating::Chvrs18a => write!(f, "chvrs18a"),
-            ContentRatingChvrsRating::ChvrsR => write!(f, "chvrsR"),
-            ContentRatingChvrsRating::ChvrsE => write!(f, "chvrsE"),
-            ContentRatingChvrsRating::ChvrsUnrated => write!(f, "chvrsUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSkfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "skfilmUnspecified")]
-    SkfilmUnspecified,
-    /// G
-    #[serde(rename = "skfilmG")]
-    SkfilmG,
-    /// P2
-    #[serde(rename = "skfilmP2")]
-    SkfilmP2,
-    /// P5
-    #[serde(rename = "skfilmP5")]
-    SkfilmP5,
-    /// P8
-    #[serde(rename = "skfilmP8")]
-    SkfilmP8,
-    ///
-    #[serde(rename = "skfilmUnrated")]
-    SkfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingSkfilmRating {
-    fn default() -> ContentRatingSkfilmRating {
-        ContentRatingSkfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSkfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSkfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingSkfilmRating::SkfilmUnspecified => write!(f, "skfilmUnspecified"),
-            ContentRatingSkfilmRating::SkfilmG => write!(f, "skfilmG"),
-            ContentRatingSkfilmRating::SkfilmP2 => write!(f, "skfilmP2"),
-            ContentRatingSkfilmRating::SkfilmP5 => write!(f, "skfilmP5"),
-            ContentRatingSkfilmRating::SkfilmP8 => write!(f, "skfilmP8"),
-            ContentRatingSkfilmRating::SkfilmUnrated => write!(f, "skfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAcbRating {
-    Undefined,
-    ///
-    #[serde(rename = "acbUnspecified")]
-    AcbUnspecified,
-    /// E
-    #[serde(rename = "acbE")]
-    AcbE,
-    /// Programs that have been given a P classification by the Australian Communications and Media Authority. These programs are intended for preschool children.
-    #[serde(rename = "acbP")]
-    AcbP,
-    /// Programs that have been given a C classification by the Australian Communications and Media Authority. These programs are intended for children (other than preschool children) who are younger than 14 years of age.
-    #[serde(rename = "acbC")]
-    AcbC,
-    /// G
-    #[serde(rename = "acbG")]
-    AcbG,
-    /// PG
-    #[serde(rename = "acbPg")]
-    AcbPg,
-    /// M
-    #[serde(rename = "acbM")]
-    AcbM,
-    /// MA15+
-    #[serde(rename = "acbMa15plus")]
-    AcbMa15plus,
-    /// R18+
-    #[serde(rename = "acbR18plus")]
-    AcbR18plus,
-    ///
-    #[serde(rename = "acbUnrated")]
-    AcbUnrated,
-}
-
-impl std::default::Default for ContentRatingAcbRating {
-    fn default() -> ContentRatingAcbRating {
-        ContentRatingAcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingAcbRating::AcbUnspecified => write!(f, "acbUnspecified"),
-            ContentRatingAcbRating::AcbE => write!(f, "acbE"),
-            ContentRatingAcbRating::AcbP => write!(f, "acbP"),
-            ContentRatingAcbRating::AcbC => write!(f, "acbC"),
-            ContentRatingAcbRating::AcbG => write!(f, "acbG"),
-            ContentRatingAcbRating::AcbPg => write!(f, "acbPg"),
-            ContentRatingAcbRating::AcbM => write!(f, "acbM"),
-            ContentRatingAcbRating::AcbMa15plus => write!(f, "acbMa15plus"),
-            ContentRatingAcbRating::AcbR18plus => write!(f, "acbR18plus"),
-            ContentRatingAcbRating::AcbUnrated => write!(f, "acbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMccypRating {
-    Undefined,
-    ///
-    #[serde(rename = "mccypUnspecified")]
-    MccypUnspecified,
-    /// A
-    #[serde(rename = "mccypA")]
-    MccypA,
-    /// 7
-    #[serde(rename = "mccyp7")]
-    Mccyp7,
-    /// 11
-    #[serde(rename = "mccyp11")]
-    Mccyp11,
-    /// 15
-    #[serde(rename = "mccyp15")]
-    Mccyp15,
-    ///
-    #[serde(rename = "mccypUnrated")]
-    MccypUnrated,
-}
-
-impl std::default::Default for ContentRatingMccypRating {
-    fn default() -> ContentRatingMccypRating {
-        ContentRatingMccypRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMccypRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMccypRating::Undefined => write!(f, "undefined"),
-            ContentRatingMccypRating::MccypUnspecified => write!(f, "mccypUnspecified"),
-            ContentRatingMccypRating::MccypA => write!(f, "mccypA"),
-            ContentRatingMccypRating::Mccyp7 => write!(f, "mccyp7"),
-            ContentRatingMccypRating::Mccyp11 => write!(f, "mccyp11"),
-            ContentRatingMccypRating::Mccyp15 => write!(f, "mccyp15"),
-            ContentRatingMccypRating::MccypUnrated => write!(f, "mccypUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAnatelRating {
-    Undefined,
-    ///
-    #[serde(rename = "anatelUnspecified")]
-    AnatelUnspecified,
-    /// F
-    #[serde(rename = "anatelF")]
-    AnatelF,
-    /// I
-    #[serde(rename = "anatelI")]
-    AnatelI,
-    /// I-7
-    #[serde(rename = "anatelI7")]
-    AnatelI7,
-    /// I-10
-    #[serde(rename = "anatelI10")]
-    AnatelI10,
-    /// I-12
-    #[serde(rename = "anatelI12")]
-    AnatelI12,
-    /// R
-    #[serde(rename = "anatelR")]
-    AnatelR,
-    /// A
-    #[serde(rename = "anatelA")]
-    AnatelA,
-    ///
-    #[serde(rename = "anatelUnrated")]
-    AnatelUnrated,
-}
-
-impl std::default::Default for ContentRatingAnatelRating {
-    fn default() -> ContentRatingAnatelRating {
-        ContentRatingAnatelRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAnatelRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAnatelRating::Undefined => write!(f, "undefined"),
-            ContentRatingAnatelRating::AnatelUnspecified => write!(f, "anatelUnspecified"),
-            ContentRatingAnatelRating::AnatelF => write!(f, "anatelF"),
-            ContentRatingAnatelRating::AnatelI => write!(f, "anatelI"),
-            ContentRatingAnatelRating::AnatelI7 => write!(f, "anatelI7"),
-            ContentRatingAnatelRating::AnatelI10 => write!(f, "anatelI10"),
-            ContentRatingAnatelRating::AnatelI12 => write!(f, "anatelI12"),
-            ContentRatingAnatelRating::AnatelR => write!(f, "anatelR"),
-            ContentRatingAnatelRating::AnatelA => write!(f, "anatelA"),
-            ContentRatingAnatelRating::AnatelUnrated => write!(f, "anatelUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFcbmRating {
-    Undefined,
-    ///
-    #[serde(rename = "fcbmUnspecified")]
-    FcbmUnspecified,
-    /// U
-    #[serde(rename = "fcbmU")]
-    FcbmU,
-    /// PG13
-    #[serde(rename = "fcbmPg13")]
-    FcbmPg13,
-    /// P13
-    #[serde(rename = "fcbmP13")]
-    FcbmP13,
-    /// 18
-    #[serde(rename = "fcbm18")]
-    Fcbm18,
-    /// 18SX
-    #[serde(rename = "fcbm18sx")]
-    Fcbm18sx,
-    /// 18PA
-    #[serde(rename = "fcbm18pa")]
-    Fcbm18pa,
-    /// 18SG
-    #[serde(rename = "fcbm18sg")]
-    Fcbm18sg,
-    /// 18PL
-    #[serde(rename = "fcbm18pl")]
-    Fcbm18pl,
-    ///
-    #[serde(rename = "fcbmUnrated")]
-    FcbmUnrated,
-}
-
-impl std::default::Default for ContentRatingFcbmRating {
-    fn default() -> ContentRatingFcbmRating {
-        ContentRatingFcbmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFcbmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFcbmRating::Undefined => write!(f, "undefined"),
-            ContentRatingFcbmRating::FcbmUnspecified => write!(f, "fcbmUnspecified"),
-            ContentRatingFcbmRating::FcbmU => write!(f, "fcbmU"),
-            ContentRatingFcbmRating::FcbmPg13 => write!(f, "fcbmPg13"),
-            ContentRatingFcbmRating::FcbmP13 => write!(f, "fcbmP13"),
-            ContentRatingFcbmRating::Fcbm18 => write!(f, "fcbm18"),
-            ContentRatingFcbmRating::Fcbm18sx => write!(f, "fcbm18sx"),
-            ContentRatingFcbmRating::Fcbm18pa => write!(f, "fcbm18pa"),
-            ContentRatingFcbmRating::Fcbm18sg => write!(f, "fcbm18sg"),
-            ContentRatingFcbmRating::Fcbm18pl => write!(f, "fcbm18pl"),
-            ContentRatingFcbmRating::FcbmUnrated => write!(f, "fcbmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFpbRating {
-    Undefined,
-    ///
-    #[serde(rename = "fpbUnspecified")]
-    FpbUnspecified,
-    /// A
-    #[serde(rename = "fpbA")]
-    FpbA,
-    /// PG
-    #[serde(rename = "fpbPg")]
-    FpbPg,
-    /// 7-9PG
-    #[serde(rename = "fpb79Pg")]
-    Fpb79Pg,
-    /// 10-12PG
-    #[serde(rename = "fpb1012Pg")]
-    Fpb1012Pg,
-    /// 13
-    #[serde(rename = "fpb13")]
-    Fpb13,
-    /// 16
-    #[serde(rename = "fpb16")]
-    Fpb16,
-    /// 18
-    #[serde(rename = "fpb18")]
-    Fpb18,
-    /// X18
-    #[serde(rename = "fpbX18")]
-    FpbX18,
-    /// XX
-    #[serde(rename = "fpbXx")]
-    FpbXx,
-    ///
-    #[serde(rename = "fpbUnrated")]
-    FpbUnrated,
-    /// 10
-    #[serde(rename = "fpb10")]
-    Fpb10,
-}
-
-impl std::default::Default for ContentRatingFpbRating {
-    fn default() -> ContentRatingFpbRating {
-        ContentRatingFpbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFpbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFpbRating::Undefined => write!(f, "undefined"),
-            ContentRatingFpbRating::FpbUnspecified => write!(f, "fpbUnspecified"),
-            ContentRatingFpbRating::FpbA => write!(f, "fpbA"),
-            ContentRatingFpbRating::FpbPg => write!(f, "fpbPg"),
-            ContentRatingFpbRating::Fpb79Pg => write!(f, "fpb79Pg"),
-            ContentRatingFpbRating::Fpb1012Pg => write!(f, "fpb1012Pg"),
-            ContentRatingFpbRating::Fpb13 => write!(f, "fpb13"),
-            ContentRatingFpbRating::Fpb16 => write!(f, "fpb16"),
-            ContentRatingFpbRating::Fpb18 => write!(f, "fpb18"),
-            ContentRatingFpbRating::FpbX18 => write!(f, "fpbX18"),
-            ContentRatingFpbRating::FpbXx => write!(f, "fpbXx"),
-            ContentRatingFpbRating::FpbUnrated => write!(f, "fpbUnrated"),
-            ContentRatingFpbRating::Fpb10 => write!(f, "fpb10"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCatvfrRating {
-    Undefined,
-    ///
-    #[serde(rename = "catvfrUnspecified")]
-    CatvfrUnspecified,
-    /// G
-    #[serde(rename = "catvfrG")]
-    CatvfrG,
-    /// 8+
-    #[serde(rename = "catvfr8plus")]
-    Catvfr8plus,
-    /// 13+
-    #[serde(rename = "catvfr13plus")]
-    Catvfr13plus,
-    /// 16+
-    #[serde(rename = "catvfr16plus")]
-    Catvfr16plus,
-    /// 18+
-    #[serde(rename = "catvfr18plus")]
-    Catvfr18plus,
-    ///
-    #[serde(rename = "catvfrUnrated")]
-    CatvfrUnrated,
-    ///
-    #[serde(rename = "catvfrE")]
-    CatvfrE,
-}
-
-impl std::default::Default for ContentRatingCatvfrRating {
-    fn default() -> ContentRatingCatvfrRating {
-        ContentRatingCatvfrRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCatvfrRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCatvfrRating::Undefined => write!(f, "undefined"),
-            ContentRatingCatvfrRating::CatvfrUnspecified => write!(f, "catvfrUnspecified"),
-            ContentRatingCatvfrRating::CatvfrG => write!(f, "catvfrG"),
-            ContentRatingCatvfrRating::Catvfr8plus => write!(f, "catvfr8plus"),
-            ContentRatingCatvfrRating::Catvfr13plus => write!(f, "catvfr13plus"),
-            ContentRatingCatvfrRating::Catvfr16plus => write!(f, "catvfr16plus"),
-            ContentRatingCatvfrRating::Catvfr18plus => write!(f, "catvfr18plus"),
-            ContentRatingCatvfrRating::CatvfrUnrated => write!(f, "catvfrUnrated"),
-            ContentRatingCatvfrRating::CatvfrE => write!(f, "catvfrE"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRtcRating {
-    Undefined,
-    ///
-    #[serde(rename = "rtcUnspecified")]
-    RtcUnspecified,
-    /// AA
-    #[serde(rename = "rtcAa")]
-    RtcAa,
-    /// A
-    #[serde(rename = "rtcA")]
-    RtcA,
-    /// B
-    #[serde(rename = "rtcB")]
-    RtcB,
-    /// B15
-    #[serde(rename = "rtcB15")]
-    RtcB15,
-    /// C
-    #[serde(rename = "rtcC")]
-    RtcC,
-    /// D
-    #[serde(rename = "rtcD")]
-    RtcD,
-    ///
-    #[serde(rename = "rtcUnrated")]
-    RtcUnrated,
-}
-
-impl std::default::Default for ContentRatingRtcRating {
-    fn default() -> ContentRatingRtcRating {
-        ContentRatingRtcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRtcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRtcRating::Undefined => write!(f, "undefined"),
-            ContentRatingRtcRating::RtcUnspecified => write!(f, "rtcUnspecified"),
-            ContentRatingRtcRating::RtcAa => write!(f, "rtcAa"),
-            ContentRatingRtcRating::RtcA => write!(f, "rtcA"),
-            ContentRatingRtcRating::RtcB => write!(f, "rtcB"),
-            ContentRatingRtcRating::RtcB15 => write!(f, "rtcB15"),
-            ContentRatingRtcRating::RtcC => write!(f, "rtcC"),
-            ContentRatingRtcRating::RtcD => write!(f, "rtcD"),
-            ContentRatingRtcRating::RtcUnrated => write!(f, "rtcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMedietilsynetRating {
-    Undefined,
-    ///
-    #[serde(rename = "medietilsynetUnspecified")]
-    MedietilsynetUnspecified,
-    /// A
-    #[serde(rename = "medietilsynetA")]
-    MedietilsynetA,
-    /// 6
-    #[serde(rename = "medietilsynet6")]
-    Medietilsynet6,
-    /// 7
-    #[serde(rename = "medietilsynet7")]
-    Medietilsynet7,
-    /// 9
-    #[serde(rename = "medietilsynet9")]
-    Medietilsynet9,
-    /// 11
-    #[serde(rename = "medietilsynet11")]
-    Medietilsynet11,
-    /// 12
-    #[serde(rename = "medietilsynet12")]
-    Medietilsynet12,
-    /// 15
-    #[serde(rename = "medietilsynet15")]
-    Medietilsynet15,
-    /// 18
-    #[serde(rename = "medietilsynet18")]
-    Medietilsynet18,
-    ///
-    #[serde(rename = "medietilsynetUnrated")]
-    MedietilsynetUnrated,
-}
-
-impl std::default::Default for ContentRatingMedietilsynetRating {
-    fn default() -> ContentRatingMedietilsynetRating {
-        ContentRatingMedietilsynetRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMedietilsynetRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMedietilsynetRating::Undefined => write!(f, "undefined"),
-            ContentRatingMedietilsynetRating::MedietilsynetUnspecified => {
-                write!(f, "medietilsynetUnspecified")
-            }
-            ContentRatingMedietilsynetRating::MedietilsynetA => write!(f, "medietilsynetA"),
-            ContentRatingMedietilsynetRating::Medietilsynet6 => write!(f, "medietilsynet6"),
-            ContentRatingMedietilsynetRating::Medietilsynet7 => write!(f, "medietilsynet7"),
-            ContentRatingMedietilsynetRating::Medietilsynet9 => write!(f, "medietilsynet9"),
-            ContentRatingMedietilsynetRating::Medietilsynet11 => write!(f, "medietilsynet11"),
-            ContentRatingMedietilsynetRating::Medietilsynet12 => write!(f, "medietilsynet12"),
-            ContentRatingMedietilsynetRating::Medietilsynet15 => write!(f, "medietilsynet15"),
-            ContentRatingMedietilsynetRating::Medietilsynet18 => write!(f, "medietilsynet18"),
-            ContentRatingMedietilsynetRating::MedietilsynetUnrated => {
-                write!(f, "medietilsynetUnrated")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRcnofRating {
-    Undefined,
-    ///
-    #[serde(rename = "rcnofUnspecified")]
-    RcnofUnspecified,
-    ///
-    #[serde(rename = "rcnofI")]
-    RcnofI,
-    ///
-    #[serde(rename = "rcnofIi")]
-    RcnofIi,
-    ///
-    #[serde(rename = "rcnofIii")]
-    RcnofIii,
-    ///
-    #[serde(rename = "rcnofIv")]
-    RcnofIv,
-    ///
-    #[serde(rename = "rcnofV")]
-    RcnofV,
-    ///
-    #[serde(rename = "rcnofVi")]
-    RcnofVi,
-    ///
-    #[serde(rename = "rcnofUnrated")]
-    RcnofUnrated,
-}
-
-impl std::default::Default for ContentRatingRcnofRating {
-    fn default() -> ContentRatingRcnofRating {
-        ContentRatingRcnofRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRcnofRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRcnofRating::Undefined => write!(f, "undefined"),
-            ContentRatingRcnofRating::RcnofUnspecified => write!(f, "rcnofUnspecified"),
-            ContentRatingRcnofRating::RcnofI => write!(f, "rcnofI"),
-            ContentRatingRcnofRating::RcnofIi => write!(f, "rcnofIi"),
-            ContentRatingRcnofRating::RcnofIii => write!(f, "rcnofIii"),
-            ContentRatingRcnofRating::RcnofIv => write!(f, "rcnofIv"),
-            ContentRatingRcnofRating::RcnofV => write!(f, "rcnofV"),
-            ContentRatingRcnofRating::RcnofVi => write!(f, "rcnofVi"),
-            ContentRatingRcnofRating::RcnofUnrated => write!(f, "rcnofUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBbfcRating {
-    Undefined,
-    ///
-    #[serde(rename = "bbfcUnspecified")]
-    BbfcUnspecified,
-    /// U
-    #[serde(rename = "bbfcU")]
-    BbfcU,
-    /// PG
-    #[serde(rename = "bbfcPg")]
-    BbfcPg,
-    /// 12A
-    #[serde(rename = "bbfc12a")]
-    Bbfc12a,
-    /// 12
-    #[serde(rename = "bbfc12")]
-    Bbfc12,
-    /// 15
-    #[serde(rename = "bbfc15")]
-    Bbfc15,
-    /// 18
-    #[serde(rename = "bbfc18")]
-    Bbfc18,
-    /// R18
-    #[serde(rename = "bbfcR18")]
-    BbfcR18,
-    ///
-    #[serde(rename = "bbfcUnrated")]
-    BbfcUnrated,
-}
-
-impl std::default::Default for ContentRatingBbfcRating {
-    fn default() -> ContentRatingBbfcRating {
-        ContentRatingBbfcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBbfcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBbfcRating::Undefined => write!(f, "undefined"),
-            ContentRatingBbfcRating::BbfcUnspecified => write!(f, "bbfcUnspecified"),
-            ContentRatingBbfcRating::BbfcU => write!(f, "bbfcU"),
-            ContentRatingBbfcRating::BbfcPg => write!(f, "bbfcPg"),
-            ContentRatingBbfcRating::Bbfc12a => write!(f, "bbfc12a"),
-            ContentRatingBbfcRating::Bbfc12 => write!(f, "bbfc12"),
-            ContentRatingBbfcRating::Bbfc15 => write!(f, "bbfc15"),
-            ContentRatingBbfcRating::Bbfc18 => write!(f, "bbfc18"),
-            ContentRatingBbfcRating::BbfcR18 => write!(f, "bbfcR18"),
-            ContentRatingBbfcRating::BbfcUnrated => write!(f, "bbfcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMenaMpaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "menaMpaaUnspecified")]
-    MenaMpaaUnspecified,
-    /// G
-    #[serde(rename = "menaMpaaG")]
-    MenaMpaaG,
-    /// PG
-    #[serde(rename = "menaMpaaPg")]
-    MenaMpaaPg,
-    /// PG-13
-    #[serde(rename = "menaMpaaPg13")]
-    MenaMpaaPg13,
-    /// R
-    #[serde(rename = "menaMpaaR")]
-    MenaMpaaR,
-    /// To keep the same enum values as MPAA's items have, skip NC_17.
-    #[serde(rename = "menaMpaaUnrated")]
-    MenaMpaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMenaMpaaRating {
-    fn default() -> ContentRatingMenaMpaaRating {
-        ContentRatingMenaMpaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMenaMpaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMenaMpaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMenaMpaaRating::MenaMpaaUnspecified => write!(f, "menaMpaaUnspecified"),
-            ContentRatingMenaMpaaRating::MenaMpaaG => write!(f, "menaMpaaG"),
-            ContentRatingMenaMpaaRating::MenaMpaaPg => write!(f, "menaMpaaPg"),
-            ContentRatingMenaMpaaRating::MenaMpaaPg13 => write!(f, "menaMpaaPg13"),
-            ContentRatingMenaMpaaRating::MenaMpaaR => write!(f, "menaMpaaR"),
-            ContentRatingMenaMpaaRating::MenaMpaaUnrated => write!(f, "menaMpaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingYtRating {
-    Undefined,
-    ///
-    #[serde(rename = "ytUnspecified")]
-    YtUnspecified,
-    ///
-    #[serde(rename = "ytAgeRestricted")]
-    YtAgeRestricted,
-}
-
-impl std::default::Default for ContentRatingYtRating {
-    fn default() -> ContentRatingYtRating {
-        ContentRatingYtRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingYtRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingYtRating::Undefined => write!(f, "undefined"),
-            ContentRatingYtRating::YtUnspecified => write!(f, "ytUnspecified"),
-            ContentRatingYtRating::YtAgeRestricted => write!(f, "ytAgeRestricted"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingOflcRating {
-    Undefined,
-    ///
-    #[serde(rename = "oflcUnspecified")]
-    OflcUnspecified,
-    /// G
-    #[serde(rename = "oflcG")]
-    OflcG,
-    /// PG
-    #[serde(rename = "oflcPg")]
-    OflcPg,
-    /// M
-    #[serde(rename = "oflcM")]
-    OflcM,
-    /// R13
-    #[serde(rename = "oflcR13")]
-    OflcR13,
-    /// R15
-    #[serde(rename = "oflcR15")]
-    OflcR15,
-    /// R16
-    #[serde(rename = "oflcR16")]
-    OflcR16,
-    /// R18
-    #[serde(rename = "oflcR18")]
-    OflcR18,
-    ///
-    #[serde(rename = "oflcUnrated")]
-    OflcUnrated,
-    /// RP13
-    #[serde(rename = "oflcRp13")]
-    OflcRp13,
-    /// RP16
-    #[serde(rename = "oflcRp16")]
-    OflcRp16,
-    /// RP18
-    #[serde(rename = "oflcRp18")]
-    OflcRp18,
-}
-
-impl std::default::Default for ContentRatingOflcRating {
-    fn default() -> ContentRatingOflcRating {
-        ContentRatingOflcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingOflcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingOflcRating::Undefined => write!(f, "undefined"),
-            ContentRatingOflcRating::OflcUnspecified => write!(f, "oflcUnspecified"),
-            ContentRatingOflcRating::OflcG => write!(f, "oflcG"),
-            ContentRatingOflcRating::OflcPg => write!(f, "oflcPg"),
-            ContentRatingOflcRating::OflcM => write!(f, "oflcM"),
-            ContentRatingOflcRating::OflcR13 => write!(f, "oflcR13"),
-            ContentRatingOflcRating::OflcR15 => write!(f, "oflcR15"),
-            ContentRatingOflcRating::OflcR16 => write!(f, "oflcR16"),
-            ContentRatingOflcRating::OflcR18 => write!(f, "oflcR18"),
-            ContentRatingOflcRating::OflcUnrated => write!(f, "oflcUnrated"),
-            ContentRatingOflcRating::OflcRp13 => write!(f, "oflcRp13"),
-            ContentRatingOflcRating::OflcRp16 => write!(f, "oflcRp16"),
-            ContentRatingOflcRating::OflcRp18 => write!(f, "oflcRp18"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingPefilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "pefilmUnspecified")]
-    PefilmUnspecified,
-    /// PT
-    #[serde(rename = "pefilmPt")]
-    PefilmPt,
-    /// PG
-    #[serde(rename = "pefilmPg")]
-    PefilmPg,
-    /// 14
-    #[serde(rename = "pefilm14")]
-    Pefilm14,
-    /// 18
-    #[serde(rename = "pefilm18")]
-    Pefilm18,
-    ///
-    #[serde(rename = "pefilmUnrated")]
-    PefilmUnrated,
-}
-
-impl std::default::Default for ContentRatingPefilmRating {
-    fn default() -> ContentRatingPefilmRating {
-        ContentRatingPefilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingPefilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingPefilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingPefilmRating::PefilmUnspecified => write!(f, "pefilmUnspecified"),
-            ContentRatingPefilmRating::PefilmPt => write!(f, "pefilmPt"),
-            ContentRatingPefilmRating::PefilmPg => write!(f, "pefilmPg"),
-            ContentRatingPefilmRating::Pefilm14 => write!(f, "pefilm14"),
-            ContentRatingPefilmRating::Pefilm18 => write!(f, "pefilm18"),
-            ContentRatingPefilmRating::PefilmUnrated => write!(f, "pefilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKmrbRating {
-    Undefined,
-    ///
-    #[serde(rename = "kmrbUnspecified")]
-    KmrbUnspecified,
-    /// 전체관람가
-    #[serde(rename = "kmrbAll")]
-    KmrbAll,
-    /// 12세 이상 관람가
-    #[serde(rename = "kmrb12plus")]
-    Kmrb12plus,
-    /// 15세 이상 관람가
-    #[serde(rename = "kmrb15plus")]
-    Kmrb15plus,
-    ///
-    #[serde(rename = "kmrbTeenr")]
-    KmrbTeenr,
-    /// 청소년 관람불가
-    #[serde(rename = "kmrbR")]
-    KmrbR,
-    ///
-    #[serde(rename = "kmrbUnrated")]
-    KmrbUnrated,
-}
-
-impl std::default::Default for ContentRatingKmrbRating {
-    fn default() -> ContentRatingKmrbRating {
-        ContentRatingKmrbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKmrbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKmrbRating::Undefined => write!(f, "undefined"),
-            ContentRatingKmrbRating::KmrbUnspecified => write!(f, "kmrbUnspecified"),
-            ContentRatingKmrbRating::KmrbAll => write!(f, "kmrbAll"),
-            ContentRatingKmrbRating::Kmrb12plus => write!(f, "kmrb12plus"),
-            ContentRatingKmrbRating::Kmrb15plus => write!(f, "kmrb15plus"),
-            ContentRatingKmrbRating::KmrbTeenr => write!(f, "kmrbTeenr"),
-            ContentRatingKmrbRating::KmrbR => write!(f, "kmrbR"),
-            ContentRatingKmrbRating::KmrbUnrated => write!(f, "kmrbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIfcoRating {
-    Undefined,
-    ///
-    #[serde(rename = "ifcoUnspecified")]
-    IfcoUnspecified,
-    /// G
-    #[serde(rename = "ifcoG")]
-    IfcoG,
-    /// PG
-    #[serde(rename = "ifcoPg")]
-    IfcoPg,
-    /// 12
-    #[serde(rename = "ifco12")]
-    Ifco12,
-    /// 12A
-    #[serde(rename = "ifco12a")]
-    Ifco12a,
-    /// 15
-    #[serde(rename = "ifco15")]
-    Ifco15,
-    /// 15A
-    #[serde(rename = "ifco15a")]
-    Ifco15a,
-    /// 16
-    #[serde(rename = "ifco16")]
-    Ifco16,
-    /// 18
-    #[serde(rename = "ifco18")]
-    Ifco18,
-    ///
-    #[serde(rename = "ifcoUnrated")]
-    IfcoUnrated,
-}
-
-impl std::default::Default for ContentRatingIfcoRating {
-    fn default() -> ContentRatingIfcoRating {
-        ContentRatingIfcoRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIfcoRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIfcoRating::Undefined => write!(f, "undefined"),
-            ContentRatingIfcoRating::IfcoUnspecified => write!(f, "ifcoUnspecified"),
-            ContentRatingIfcoRating::IfcoG => write!(f, "ifcoG"),
-            ContentRatingIfcoRating::IfcoPg => write!(f, "ifcoPg"),
-            ContentRatingIfcoRating::Ifco12 => write!(f, "ifco12"),
-            ContentRatingIfcoRating::Ifco12a => write!(f, "ifco12a"),
-            ContentRatingIfcoRating::Ifco15 => write!(f, "ifco15"),
-            ContentRatingIfcoRating::Ifco15a => write!(f, "ifco15a"),
-            ContentRatingIfcoRating::Ifco16 => write!(f, "ifco16"),
-            ContentRatingIfcoRating::Ifco18 => write!(f, "ifco18"),
-            ContentRatingIfcoRating::IfcoUnrated => write!(f, "ifcoUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNfrcRating {
-    Undefined,
-    ///
-    #[serde(rename = "nfrcUnspecified")]
-    NfrcUnspecified,
-    /// A
-    #[serde(rename = "nfrcA")]
-    NfrcA,
-    /// B
-    #[serde(rename = "nfrcB")]
-    NfrcB,
-    /// C
-    #[serde(rename = "nfrcC")]
-    NfrcC,
-    /// D
-    #[serde(rename = "nfrcD")]
-    NfrcD,
-    /// X
-    #[serde(rename = "nfrcX")]
-    NfrcX,
-    ///
-    #[serde(rename = "nfrcUnrated")]
-    NfrcUnrated,
-}
-
-impl std::default::Default for ContentRatingNfrcRating {
-    fn default() -> ContentRatingNfrcRating {
-        ContentRatingNfrcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNfrcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNfrcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNfrcRating::NfrcUnspecified => write!(f, "nfrcUnspecified"),
-            ContentRatingNfrcRating::NfrcA => write!(f, "nfrcA"),
-            ContentRatingNfrcRating::NfrcB => write!(f, "nfrcB"),
-            ContentRatingNfrcRating::NfrcC => write!(f, "nfrcC"),
-            ContentRatingNfrcRating::NfrcD => write!(f, "nfrcD"),
-            ContentRatingNfrcRating::NfrcX => write!(f, "nfrcX"),
-            ContentRatingNfrcRating::NfrcUnrated => write!(f, "nfrcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFskRating {
-    Undefined,
-    ///
-    #[serde(rename = "fskUnspecified")]
-    FskUnspecified,
-    /// FSK 0
-    #[serde(rename = "fsk0")]
-    Fsk0,
-    /// FSK 6
-    #[serde(rename = "fsk6")]
-    Fsk6,
-    /// FSK 12
-    #[serde(rename = "fsk12")]
-    Fsk12,
-    /// FSK 16
-    #[serde(rename = "fsk16")]
-    Fsk16,
-    /// FSK 18
-    #[serde(rename = "fsk18")]
-    Fsk18,
-    ///
-    #[serde(rename = "fskUnrated")]
-    FskUnrated,
-}
-
-impl std::default::Default for ContentRatingFskRating {
-    fn default() -> ContentRatingFskRating {
-        ContentRatingFskRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFskRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFskRating::Undefined => write!(f, "undefined"),
-            ContentRatingFskRating::FskUnspecified => write!(f, "fskUnspecified"),
-            ContentRatingFskRating::Fsk0 => write!(f, "fsk0"),
-            ContentRatingFskRating::Fsk6 => write!(f, "fsk6"),
-            ContentRatingFskRating::Fsk12 => write!(f, "fsk12"),
-            ContentRatingFskRating::Fsk16 => write!(f, "fsk16"),
-            ContentRatingFskRating::Fsk18 => write!(f, "fsk18"),
-            ContentRatingFskRating::FskUnrated => write!(f, "fskUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMibacRating {
-    Undefined,
-    ///
-    #[serde(rename = "mibacUnspecified")]
-    MibacUnspecified,
-    ///
-    #[serde(rename = "mibacT")]
-    MibacT,
-    ///
-    #[serde(rename = "mibacVap")]
-    MibacVap,
-    ///
-    #[serde(rename = "mibacVm12")]
-    MibacVm12,
-    ///
-    #[serde(rename = "mibacVm14")]
-    MibacVm14,
-    ///
-    #[serde(rename = "mibacVm18")]
-    MibacVm18,
-    ///
-    #[serde(rename = "mibacUnrated")]
-    MibacUnrated,
-}
-
-impl std::default::Default for ContentRatingMibacRating {
-    fn default() -> ContentRatingMibacRating {
-        ContentRatingMibacRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMibacRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMibacRating::Undefined => write!(f, "undefined"),
-            ContentRatingMibacRating::MibacUnspecified => write!(f, "mibacUnspecified"),
-            ContentRatingMibacRating::MibacT => write!(f, "mibacT"),
-            ContentRatingMibacRating::MibacVap => write!(f, "mibacVap"),
-            ContentRatingMibacRating::MibacVm12 => write!(f, "mibacVm12"),
-            ContentRatingMibacRating::MibacVm14 => write!(f, "mibacVm14"),
-            ContentRatingMibacRating::MibacVm18 => write!(f, "mibacVm18"),
-            ContentRatingMibacRating::MibacUnrated => write!(f, "mibacUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSmaisRating {
-    Undefined,
-    ///
-    #[serde(rename = "smaisUnspecified")]
-    SmaisUnspecified,
-    /// L
-    #[serde(rename = "smaisL")]
-    SmaisL,
-    /// 7
-    #[serde(rename = "smais7")]
-    Smais7,
-    /// 12
-    #[serde(rename = "smais12")]
-    Smais12,
-    /// 14
-    #[serde(rename = "smais14")]
-    Smais14,
-    /// 16
-    #[serde(rename = "smais16")]
-    Smais16,
-    /// 18
-    #[serde(rename = "smais18")]
-    Smais18,
-    ///
-    #[serde(rename = "smaisUnrated")]
-    SmaisUnrated,
-}
-
-impl std::default::Default for ContentRatingSmaisRating {
-    fn default() -> ContentRatingSmaisRating {
-        ContentRatingSmaisRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSmaisRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSmaisRating::Undefined => write!(f, "undefined"),
-            ContentRatingSmaisRating::SmaisUnspecified => write!(f, "smaisUnspecified"),
-            ContentRatingSmaisRating::SmaisL => write!(f, "smaisL"),
-            ContentRatingSmaisRating::Smais7 => write!(f, "smais7"),
-            ContentRatingSmaisRating::Smais12 => write!(f, "smais12"),
-            ContentRatingSmaisRating::Smais14 => write!(f, "smais14"),
-            ContentRatingSmaisRating::Smais16 => write!(f, "smais16"),
-            ContentRatingSmaisRating::Smais18 => write!(f, "smais18"),
-            ContentRatingSmaisRating::SmaisUnrated => write!(f, "smaisUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingChfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "chfilmUnspecified")]
-    ChfilmUnspecified,
-    /// 0
-    #[serde(rename = "chfilm0")]
-    Chfilm0,
-    /// 6
-    #[serde(rename = "chfilm6")]
-    Chfilm6,
-    /// 12
-    #[serde(rename = "chfilm12")]
-    Chfilm12,
-    /// 16
-    #[serde(rename = "chfilm16")]
-    Chfilm16,
-    /// 18
-    #[serde(rename = "chfilm18")]
-    Chfilm18,
-    ///
-    #[serde(rename = "chfilmUnrated")]
-    ChfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingChfilmRating {
-    fn default() -> ContentRatingChfilmRating {
-        ContentRatingChfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingChfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingChfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingChfilmRating::ChfilmUnspecified => write!(f, "chfilmUnspecified"),
-            ContentRatingChfilmRating::Chfilm0 => write!(f, "chfilm0"),
-            ContentRatingChfilmRating::Chfilm6 => write!(f, "chfilm6"),
-            ContentRatingChfilmRating::Chfilm12 => write!(f, "chfilm12"),
-            ContentRatingChfilmRating::Chfilm16 => write!(f, "chfilm16"),
-            ContentRatingChfilmRating::Chfilm18 => write!(f, "chfilm18"),
-            ContentRatingChfilmRating::ChfilmUnrated => write!(f, "chfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIncaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "incaaUnspecified")]
-    IncaaUnspecified,
-    /// ATP (Apta para todo publico)
-    #[serde(rename = "incaaAtp")]
-    IncaaAtp,
-    /// 13 (Solo apta para mayores de 13 años)
-    #[serde(rename = "incaaSam13")]
-    IncaaSam13,
-    /// 16 (Solo apta para mayores de 16 años)
-    #[serde(rename = "incaaSam16")]
-    IncaaSam16,
-    /// 18 (Solo apta para mayores de 18 años)
-    #[serde(rename = "incaaSam18")]
-    IncaaSam18,
-    /// X (Solo apta para mayores de 18 años, de exhibición condicionada)
-    #[serde(rename = "incaaC")]
-    IncaaC,
-    ///
-    #[serde(rename = "incaaUnrated")]
-    IncaaUnrated,
-}
-
-impl std::default::Default for ContentRatingIncaaRating {
-    fn default() -> ContentRatingIncaaRating {
-        ContentRatingIncaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIncaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIncaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingIncaaRating::IncaaUnspecified => write!(f, "incaaUnspecified"),
-            ContentRatingIncaaRating::IncaaAtp => write!(f, "incaaAtp"),
-            ContentRatingIncaaRating::IncaaSam13 => write!(f, "incaaSam13"),
-            ContentRatingIncaaRating::IncaaSam16 => write!(f, "incaaSam16"),
-            ContentRatingIncaaRating::IncaaSam18 => write!(f, "incaaSam18"),
-            ContentRatingIncaaRating::IncaaC => write!(f, "incaaC"),
-            ContentRatingIncaaRating::IncaaUnrated => write!(f, "incaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMpaatRating {
-    Undefined,
-    ///
-    #[serde(rename = "mpaatUnspecified")]
-    MpaatUnspecified,
-    /// GB
-    #[serde(rename = "mpaatGb")]
-    MpaatGb,
-    /// RB
-    #[serde(rename = "mpaatRb")]
-    MpaatRb,
-}
-
-impl std::default::Default for ContentRatingMpaatRating {
-    fn default() -> ContentRatingMpaatRating {
-        ContentRatingMpaatRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMpaatRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMpaatRating::Undefined => write!(f, "undefined"),
-            ContentRatingMpaatRating::MpaatUnspecified => write!(f, "mpaatUnspecified"),
-            ContentRatingMpaatRating::MpaatGb => write!(f, "mpaatGb"),
-            ContentRatingMpaatRating::MpaatRb => write!(f, "mpaatRb"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMccaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "mccaaUnspecified")]
-    MccaaUnspecified,
-    /// U
-    #[serde(rename = "mccaaU")]
-    MccaaU,
-    /// PG
-    #[serde(rename = "mccaaPg")]
-    MccaaPg,
-    /// 12A
-    #[serde(rename = "mccaa12a")]
-    Mccaa12a,
-    /// 12
-    #[serde(rename = "mccaa12")]
-    Mccaa12,
-    /// 14 - this rating was removed from the new classification structure introduced in 2013.
-    #[serde(rename = "mccaa14")]
-    Mccaa14,
-    /// 15
-    #[serde(rename = "mccaa15")]
-    Mccaa15,
-    /// 16 - this rating was removed from the new classification structure introduced in 2013.
-    #[serde(rename = "mccaa16")]
-    Mccaa16,
-    /// 18
-    #[serde(rename = "mccaa18")]
-    Mccaa18,
-    ///
-    #[serde(rename = "mccaaUnrated")]
-    MccaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMccaaRating {
-    fn default() -> ContentRatingMccaaRating {
-        ContentRatingMccaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMccaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMccaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMccaaRating::MccaaUnspecified => write!(f, "mccaaUnspecified"),
-            ContentRatingMccaaRating::MccaaU => write!(f, "mccaaU"),
-            ContentRatingMccaaRating::MccaaPg => write!(f, "mccaaPg"),
-            ContentRatingMccaaRating::Mccaa12a => write!(f, "mccaa12a"),
-            ContentRatingMccaaRating::Mccaa12 => write!(f, "mccaa12"),
-            ContentRatingMccaaRating::Mccaa14 => write!(f, "mccaa14"),
-            ContentRatingMccaaRating::Mccaa15 => write!(f, "mccaa15"),
-            ContentRatingMccaaRating::Mccaa16 => write!(f, "mccaa16"),
-            ContentRatingMccaaRating::Mccaa18 => write!(f, "mccaa18"),
-            ContentRatingMccaaRating::MccaaUnrated => write!(f, "mccaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingDjctqRatingReasons {
-    Undefined,
-    ///
-    #[serde(rename = "djctqRatingReasonUnspecified")]
-    DjctqRatingReasonUnspecified,
-    /// Brazil rating content descriptors. See http://go/brazilratings section F. Violência (Violence)
-    #[serde(rename = "djctqViolence")]
-    DjctqViolence,
-    /// Violência extrema (Extreme violence)
-    #[serde(rename = "djctqExtremeViolence")]
-    DjctqExtremeViolence,
-    /// Conteúdo sexual (Sexual content)
-    #[serde(rename = "djctqSexualContent")]
-    DjctqSexualContent,
-    /// Nudez (Nudity)
-    #[serde(rename = "djctqNudity")]
-    DjctqNudity,
-    /// Sexo (Sex)
-    #[serde(rename = "djctqSex")]
-    DjctqSex,
-    /// Sexo Explícito (Explicit sex)
-    #[serde(rename = "djctqExplicitSex")]
-    DjctqExplicitSex,
-    /// Drogas (Drugs)
-    #[serde(rename = "djctqDrugs")]
-    DjctqDrugs,
-    /// Drogas Lícitas (Legal drugs)
-    #[serde(rename = "djctqLegalDrugs")]
-    DjctqLegalDrugs,
-    /// Drogas Ilícitas (Illegal drugs)
-    #[serde(rename = "djctqIllegalDrugs")]
-    DjctqIllegalDrugs,
-    /// Linguagem Imprópria (Inappropriate language)
-    #[serde(rename = "djctqInappropriateLanguage")]
-    DjctqInappropriateLanguage,
-    /// Atos Criminosos (Criminal Acts)
-    #[serde(rename = "djctqCriminalActs")]
-    DjctqCriminalActs,
-    /// Conteúdo Impactante (Impacting content)
-    #[serde(rename = "djctqImpactingContent")]
-    DjctqImpactingContent,
-}
-
-impl std::default::Default for ContentRatingDjctqRatingReasons {
-    fn default() -> ContentRatingDjctqRatingReasons {
-        ContentRatingDjctqRatingReasons::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingDjctqRatingReasons {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingDjctqRatingReasons::Undefined => write!(f, "undefined"),
-            ContentRatingDjctqRatingReasons::DjctqRatingReasonUnspecified => {
-                write!(f, "djctqRatingReasonUnspecified")
-            }
-            ContentRatingDjctqRatingReasons::DjctqViolence => write!(f, "djctqViolence"),
-            ContentRatingDjctqRatingReasons::DjctqExtremeViolence => {
-                write!(f, "djctqExtremeViolence")
-            }
-            ContentRatingDjctqRatingReasons::DjctqSexualContent => write!(f, "djctqSexualContent"),
-            ContentRatingDjctqRatingReasons::DjctqNudity => write!(f, "djctqNudity"),
-            ContentRatingDjctqRatingReasons::DjctqSex => write!(f, "djctqSex"),
-            ContentRatingDjctqRatingReasons::DjctqExplicitSex => write!(f, "djctqExplicitSex"),
-            ContentRatingDjctqRatingReasons::DjctqDrugs => write!(f, "djctqDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqLegalDrugs => write!(f, "djctqLegalDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqIllegalDrugs => write!(f, "djctqIllegalDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqInappropriateLanguage => {
-                write!(f, "djctqInappropriateLanguage")
-            }
-            ContentRatingDjctqRatingReasons::DjctqCriminalActs => write!(f, "djctqCriminalActs"),
-            ContentRatingDjctqRatingReasons::DjctqImpactingContent => {
-                write!(f, "djctqImpactingContent")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEgfilmRating {
-    Undefined,
-    ///
-    #[serde(rename = "egfilmUnspecified")]
-    EgfilmUnspecified,
-    /// GN
-    #[serde(rename = "egfilmGn")]
-    EgfilmGn,
-    /// 18
-    #[serde(rename = "egfilm18")]
-    Egfilm18,
-    /// BN
-    #[serde(rename = "egfilmBn")]
-    EgfilmBn,
-    ///
-    #[serde(rename = "egfilmUnrated")]
-    EgfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingEgfilmRating {
-    fn default() -> ContentRatingEgfilmRating {
-        ContentRatingEgfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEgfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEgfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingEgfilmRating::EgfilmUnspecified => write!(f, "egfilmUnspecified"),
-            ContentRatingEgfilmRating::EgfilmGn => write!(f, "egfilmGn"),
-            ContentRatingEgfilmRating::Egfilm18 => write!(f, "egfilm18"),
-            ContentRatingEgfilmRating::EgfilmBn => write!(f, "egfilmBn"),
-            ContentRatingEgfilmRating::EgfilmUnrated => write!(f, "egfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCceRating {
-    Undefined,
-    ///
-    #[serde(rename = "cceUnspecified")]
-    CceUnspecified,
-    /// 4
-    #[serde(rename = "cceM4")]
-    CceM4,
-    /// 6
-    #[serde(rename = "cceM6")]
-    CceM6,
-    /// 12
-    #[serde(rename = "cceM12")]
-    CceM12,
-    /// 16
-    #[serde(rename = "cceM16")]
-    CceM16,
-    /// 18
-    #[serde(rename = "cceM18")]
-    CceM18,
-    ///
-    #[serde(rename = "cceUnrated")]
-    CceUnrated,
-    /// 14
-    #[serde(rename = "cceM14")]
-    CceM14,
-}
-
-impl std::default::Default for ContentRatingCceRating {
-    fn default() -> ContentRatingCceRating {
-        ContentRatingCceRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCceRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCceRating::Undefined => write!(f, "undefined"),
-            ContentRatingCceRating::CceUnspecified => write!(f, "cceUnspecified"),
-            ContentRatingCceRating::CceM4 => write!(f, "cceM4"),
-            ContentRatingCceRating::CceM6 => write!(f, "cceM6"),
-            ContentRatingCceRating::CceM12 => write!(f, "cceM12"),
-            ContentRatingCceRating::CceM16 => write!(f, "cceM16"),
-            ContentRatingCceRating::CceM18 => write!(f, "cceM18"),
-            ContentRatingCceRating::CceUnrated => write!(f, "cceUnrated"),
-            ContentRatingCceRating::CceM14 => write!(f, "cceM14"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCscfRating {
-    Undefined,
-    ///
-    #[serde(rename = "cscfUnspecified")]
-    CscfUnspecified,
-    /// AL
-    #[serde(rename = "cscfAl")]
-    CscfAl,
-    /// A
-    #[serde(rename = "cscfA")]
-    CscfA,
-    /// 6
-    #[serde(rename = "cscf6")]
-    Cscf6,
-    /// 9
-    #[serde(rename = "cscf9")]
-    Cscf9,
-    /// 12
-    #[serde(rename = "cscf12")]
-    Cscf12,
-    /// 16
-    #[serde(rename = "cscf16")]
-    Cscf16,
-    /// 18
-    #[serde(rename = "cscf18")]
-    Cscf18,
-    ///
-    #[serde(rename = "cscfUnrated")]
-    CscfUnrated,
-}
-
-impl std::default::Default for ContentRatingCscfRating {
-    fn default() -> ContentRatingCscfRating {
-        ContentRatingCscfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCscfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCscfRating::Undefined => write!(f, "undefined"),
-            ContentRatingCscfRating::CscfUnspecified => write!(f, "cscfUnspecified"),
-            ContentRatingCscfRating::CscfAl => write!(f, "cscfAl"),
-            ContentRatingCscfRating::CscfA => write!(f, "cscfA"),
-            ContentRatingCscfRating::Cscf6 => write!(f, "cscf6"),
-            ContentRatingCscfRating::Cscf9 => write!(f, "cscf9"),
-            ContentRatingCscfRating::Cscf12 => write!(f, "cscf12"),
-            ContentRatingCscfRating::Cscf16 => write!(f, "cscf16"),
-            ContentRatingCscfRating::Cscf18 => write!(f, "cscf18"),
-            ContentRatingCscfRating::CscfUnrated => write!(f, "cscfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRussiaRating {
-    Undefined,
-    ///
-    #[serde(rename = "russiaUnspecified")]
-    RussiaUnspecified,
-    /// 0+
-    #[serde(rename = "russia0")]
-    Russia0,
-    /// 6+
-    #[serde(rename = "russia6")]
-    Russia6,
-    /// 12+
-    #[serde(rename = "russia12")]
-    Russia12,
-    /// 16+
-    #[serde(rename = "russia16")]
-    Russia16,
-    /// 18+
-    #[serde(rename = "russia18")]
-    Russia18,
-    ///
-    #[serde(rename = "russiaUnrated")]
-    RussiaUnrated,
-}
-
-impl std::default::Default for ContentRatingRussiaRating {
-    fn default() -> ContentRatingRussiaRating {
-        ContentRatingRussiaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRussiaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRussiaRating::Undefined => write!(f, "undefined"),
-            ContentRatingRussiaRating::RussiaUnspecified => write!(f, "russiaUnspecified"),
-            ContentRatingRussiaRating::Russia0 => write!(f, "russia0"),
-            ContentRatingRussiaRating::Russia6 => write!(f, "russia6"),
-            ContentRatingRussiaRating::Russia12 => write!(f, "russia12"),
-            ContentRatingRussiaRating::Russia16 => write!(f, "russia16"),
-            ContentRatingRussiaRating::Russia18 => write!(f, "russia18"),
-            ContentRatingRussiaRating::RussiaUnrated => write!(f, "russiaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBfvcRating {
-    Undefined,
-    ///
-    #[serde(rename = "bfvcUnspecified")]
-    BfvcUnspecified,
-    /// G
-    #[serde(rename = "bfvcG")]
-    BfvcG,
-    /// E
-    #[serde(rename = "bfvcE")]
-    BfvcE,
-    /// 13
-    #[serde(rename = "bfvc13")]
-    Bfvc13,
-    /// 15
-    #[serde(rename = "bfvc15")]
-    Bfvc15,
-    /// 18
-    #[serde(rename = "bfvc18")]
-    Bfvc18,
-    /// 20
-    #[serde(rename = "bfvc20")]
-    Bfvc20,
-    /// B
-    #[serde(rename = "bfvcB")]
-    BfvcB,
-    ///
-    #[serde(rename = "bfvcUnrated")]
-    BfvcUnrated,
-}
-
-impl std::default::Default for ContentRatingBfvcRating {
-    fn default() -> ContentRatingBfvcRating {
-        ContentRatingBfvcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBfvcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBfvcRating::Undefined => write!(f, "undefined"),
-            ContentRatingBfvcRating::BfvcUnspecified => write!(f, "bfvcUnspecified"),
-            ContentRatingBfvcRating::BfvcG => write!(f, "bfvcG"),
-            ContentRatingBfvcRating::BfvcE => write!(f, "bfvcE"),
-            ContentRatingBfvcRating::Bfvc13 => write!(f, "bfvc13"),
-            ContentRatingBfvcRating::Bfvc15 => write!(f, "bfvc15"),
-            ContentRatingBfvcRating::Bfvc18 => write!(f, "bfvc18"),
-            ContentRatingBfvcRating::Bfvc20 => write!(f, "bfvc20"),
-            ContentRatingBfvcRating::BfvcB => write!(f, "bfvcB"),
-            ContentRatingBfvcRating::BfvcUnrated => write!(f, "bfvcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEirinRating {
-    Undefined,
-    ///
-    #[serde(rename = "eirinUnspecified")]
-    EirinUnspecified,
-    /// G
-    #[serde(rename = "eirinG")]
-    EirinG,
-    /// PG-12
-    #[serde(rename = "eirinPg12")]
-    EirinPg12,
-    /// R15+
-    #[serde(rename = "eirinR15plus")]
-    EirinR15plus,
-    /// R18+
-    #[serde(rename = "eirinR18plus")]
-    EirinR18plus,
-    ///
-    #[serde(rename = "eirinUnrated")]
-    EirinUnrated,
-}
-
-impl std::default::Default for ContentRatingEirinRating {
-    fn default() -> ContentRatingEirinRating {
-        ContentRatingEirinRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEirinRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEirinRating::Undefined => write!(f, "undefined"),
-            ContentRatingEirinRating::EirinUnspecified => write!(f, "eirinUnspecified"),
-            ContentRatingEirinRating::EirinG => write!(f, "eirinG"),
-            ContentRatingEirinRating::EirinPg12 => write!(f, "eirinPg12"),
-            ContentRatingEirinRating::EirinR15plus => write!(f, "eirinR15plus"),
-            ContentRatingEirinRating::EirinR18plus => write!(f, "eirinR18plus"),
-            ContentRatingEirinRating::EirinUnrated => write!(f, "eirinUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMpaaRating {
-    Undefined,
-    ///
-    #[serde(rename = "mpaaUnspecified")]
-    MpaaUnspecified,
-    /// G
-    #[serde(rename = "mpaaG")]
-    MpaaG,
-    /// PG
-    #[serde(rename = "mpaaPg")]
-    MpaaPg,
-    /// PG-13
-    #[serde(rename = "mpaaPg13")]
-    MpaaPg13,
-    /// R
-    #[serde(rename = "mpaaR")]
-    MpaaR,
-    /// NC-17
-    #[serde(rename = "mpaaNc17")]
-    MpaaNc17,
-    /// ! X
-    #[serde(rename = "mpaaX")]
-    MpaaX,
-    ///
-    #[serde(rename = "mpaaUnrated")]
-    MpaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMpaaRating {
-    fn default() -> ContentRatingMpaaRating {
-        ContentRatingMpaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMpaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMpaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMpaaRating::MpaaUnspecified => write!(f, "mpaaUnspecified"),
-            ContentRatingMpaaRating::MpaaG => write!(f, "mpaaG"),
-            ContentRatingMpaaRating::MpaaPg => write!(f, "mpaaPg"),
-            ContentRatingMpaaRating::MpaaPg13 => write!(f, "mpaaPg13"),
-            ContentRatingMpaaRating::MpaaR => write!(f, "mpaaR"),
-            ContentRatingMpaaRating::MpaaNc17 => write!(f, "mpaaNc17"),
-            ContentRatingMpaaRating::MpaaX => write!(f, "mpaaX"),
-            ContentRatingMpaaRating::MpaaUnrated => write!(f, "mpaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamHealthStatusStatus {
-    Undefined,
-    ///
-    #[serde(rename = "good")]
-    Good,
-    ///
-    #[serde(rename = "ok")]
-    Ok,
-    ///
-    #[serde(rename = "bad")]
-    Bad,
-    ///
-    #[serde(rename = "noData")]
-    NoData,
-    ///
+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 LiveBroadcastStatusLifeCycleStatus {
+    Undefined,
+    /// No value or the value is unknown.
+    #[serde(rename = "lifeCycleStatusUnspecified")]
+    LifeCycleStatusUnspecified,
+    /// Incomplete settings, but otherwise valid
+    #[serde(rename = "created")]
+    Created,
+    /// Complete settings
+    #[serde(rename = "ready")]
+    Ready,
+    /// Visible only to partner, may need special UI treatment
+    #[serde(rename = "testing")]
+    Testing,
+    /// Viper is recording; this means the "clock" is running
+    #[serde(rename = "live")]
+    Live,
+    /// The broadcast is finished.
+    #[serde(rename = "complete")]
+    Complete,
+    /// This broadcast was removed by admin action
     #[serde(rename = "revoked")]
     Revoked,
-}
-
-impl std::default::Default for LiveStreamHealthStatusStatus {
-    fn default() -> LiveStreamHealthStatusStatus {
-        LiveStreamHealthStatusStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamHealthStatusStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamHealthStatusStatus::Undefined => write!(f, "undefined"),
-            LiveStreamHealthStatusStatus::Good => write!(f, "good"),
-            LiveStreamHealthStatusStatus::Ok => write!(f, "ok"),
-            LiveStreamHealthStatusStatus::Bad => write!(f, "bad"),
-            LiveStreamHealthStatusStatus::NoData => write!(f, "noData"),
-            LiveStreamHealthStatusStatus::Revoked => write!(f, "revoked"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoPositionCornerPosition {
-    Undefined,
-    ///
-    #[serde(rename = "topLeft")]
-    TopLeft,
-    ///
-    #[serde(rename = "topRight")]
-    TopRight,
-    ///
-    #[serde(rename = "bottomLeft")]
-    BottomLeft,
-    ///
-    #[serde(rename = "bottomRight")]
-    BottomRight,
-}
-
-impl std::default::Default for InvideoPositionCornerPosition {
-    fn default() -> InvideoPositionCornerPosition {
-        InvideoPositionCornerPosition::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoPositionCornerPosition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoPositionCornerPosition::Undefined => write!(f, "undefined"),
-            InvideoPositionCornerPosition::TopLeft => write!(f, "topLeft"),
-            InvideoPositionCornerPosition::TopRight => write!(f, "topRight"),
-            InvideoPositionCornerPosition::BottomLeft => write!(f, "bottomLeft"),
-            InvideoPositionCornerPosition::BottomRight => write!(f, "bottomRight"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoPositionType {
-    Undefined,
-    ///
-    #[serde(rename = "corner")]
-    Corner,
-}
-
-impl std::default::Default for InvideoPositionType {
-    fn default() -> InvideoPositionType {
-        InvideoPositionType::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoPositionType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoPositionType::Undefined => write!(f, "undefined"),
-            InvideoPositionType::Corner => write!(f, "corner"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoTimingType {
-    Undefined,
-    ///
-    #[serde(rename = "offsetFromStart")]
-    OffsetFromStart,
-    ///
-    #[serde(rename = "offsetFromEnd")]
-    OffsetFromEnd,
-}
-
-impl std::default::Default for InvideoTimingType {
-    fn default() -> InvideoTimingType {
-        InvideoTimingType::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoTimingType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoTimingType::Undefined => write!(f, "undefined"),
-            InvideoTimingType::OffsetFromStart => write!(f, "offsetFromStart"),
-            InvideoTimingType::OffsetFromEnd => write!(f, "offsetFromEnd"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelSectionSnippetStyle {
-    Undefined,
-    ///
-    #[serde(rename = "channelsectionStyleUnspecified")]
-    ChannelsectionStyleUnspecified,
-    ///
-    #[serde(rename = "horizontalRow")]
-    HorizontalRow,
-    ///
-    #[serde(rename = "verticalList")]
-    VerticalList,
-}
-
-impl std::default::Default for ChannelSectionSnippetStyle {
-    fn default() -> ChannelSectionSnippetStyle {
-        ChannelSectionSnippetStyle::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelSectionSnippetStyle {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelSectionSnippetStyle::Undefined => write!(f, "undefined"),
-            ChannelSectionSnippetStyle::ChannelsectionStyleUnspecified => {
-                write!(f, "channelsectionStyleUnspecified")
-            }
-            ChannelSectionSnippetStyle::HorizontalRow => write!(f, "horizontalRow"),
-            ChannelSectionSnippetStyle::VerticalList => write!(f, "verticalList"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelSectionSnippetType {
-    Undefined,
-    ///
-    #[serde(rename = "channelsectionTypeUnspecified")]
-    ChannelsectionTypeUnspecified,
-    ///
-    #[serde(rename = "singlePlaylist")]
-    SinglePlaylist,
-    ///
-    #[serde(rename = "multiplePlaylists")]
-    MultiplePlaylists,
-    ///
-    #[serde(rename = "popularUploads")]
-    PopularUploads,
-    ///
-    #[serde(rename = "recentUploads")]
-    RecentUploads,
-    ///
-    #[serde(rename = "likes")]
-    Likes,
-    ///
-    #[serde(rename = "allPlaylists")]
-    AllPlaylists,
-    ///
-    #[serde(rename = "likedPlaylists")]
-    LikedPlaylists,
-    ///
-    #[serde(rename = "recentPosts")]
-    RecentPosts,
-    ///
-    #[serde(rename = "recentActivity")]
-    RecentActivity,
-    ///
-    #[serde(rename = "liveEvents")]
-    LiveEvents,
-    ///
-    #[serde(rename = "upcomingEvents")]
-    UpcomingEvents,
-    ///
-    #[serde(rename = "completedEvents")]
-    CompletedEvents,
-    ///
-    #[serde(rename = "multipleChannels")]
-    MultipleChannels,
-    ///
-    #[serde(rename = "postedVideos")]
-    PostedVideos,
-    ///
-    #[serde(rename = "postedPlaylists")]
-    PostedPlaylists,
-    ///
-    #[serde(rename = "subscriptions")]
-    Subscriptions,
-}
-
-impl std::default::Default for ChannelSectionSnippetType {
-    fn default() -> ChannelSectionSnippetType {
-        ChannelSectionSnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelSectionSnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelSectionSnippetType::Undefined => write!(f, "undefined"),
-            ChannelSectionSnippetType::ChannelsectionTypeUnspecified => {
-                write!(f, "channelsectionTypeUnspecified")
-            }
-            ChannelSectionSnippetType::SinglePlaylist => write!(f, "singlePlaylist"),
-            ChannelSectionSnippetType::MultiplePlaylists => write!(f, "multiplePlaylists"),
-            ChannelSectionSnippetType::PopularUploads => write!(f, "popularUploads"),
-            ChannelSectionSnippetType::RecentUploads => write!(f, "recentUploads"),
-            ChannelSectionSnippetType::Likes => write!(f, "likes"),
-            ChannelSectionSnippetType::AllPlaylists => write!(f, "allPlaylists"),
-            ChannelSectionSnippetType::LikedPlaylists => write!(f, "likedPlaylists"),
-            ChannelSectionSnippetType::RecentPosts => write!(f, "recentPosts"),
-            ChannelSectionSnippetType::RecentActivity => write!(f, "recentActivity"),
-            ChannelSectionSnippetType::LiveEvents => write!(f, "liveEvents"),
-            ChannelSectionSnippetType::UpcomingEvents => write!(f, "upcomingEvents"),
-            ChannelSectionSnippetType::CompletedEvents => write!(f, "completedEvents"),
-            ChannelSectionSnippetType::MultipleChannels => write!(f, "multipleChannels"),
-            ChannelSectionSnippetType::PostedVideos => write!(f, "postedVideos"),
-            ChannelSectionSnippetType::PostedPlaylists => write!(f, "postedPlaylists"),
-            ChannelSectionSnippetType::Subscriptions => write!(f, "subscriptions"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveChatUserBannedMessageDetailsBanType {
-    Undefined,
-    ///
-    #[serde(rename = "permanent")]
-    Permanent,
-    ///
-    #[serde(rename = "temporary")]
-    Temporary,
-}
-
-impl std::default::Default for LiveChatUserBannedMessageDetailsBanType {
-    fn default() -> LiveChatUserBannedMessageDetailsBanType {
-        LiveChatUserBannedMessageDetailsBanType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveChatUserBannedMessageDetailsBanType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveChatUserBannedMessageDetailsBanType::Undefined => write!(f, "undefined"),
-            LiveChatUserBannedMessageDetailsBanType::Permanent => write!(f, "permanent"),
-            LiveChatUserBannedMessageDetailsBanType::Temporary => write!(f, "temporary"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivityContentDetailsSocialType {
-    Undefined,
-    ///
-    #[serde(rename = "typeUnspecified")]
-    TypeUnspecified,
-    ///
-    #[serde(rename = "googlePlus")]
-    GooglePlus,
-    ///
-    #[serde(rename = "facebook")]
-    Facebook,
-    ///
-    #[serde(rename = "twitter")]
-    Twitter,
-}
-
-impl std::default::Default for ActivityContentDetailsSocialType {
-    fn default() -> ActivityContentDetailsSocialType {
-        ActivityContentDetailsSocialType::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivityContentDetailsSocialType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivityContentDetailsSocialType::Undefined => write!(f, "undefined"),
-            ActivityContentDetailsSocialType::TypeUnspecified => write!(f, "typeUnspecified"),
-            ActivityContentDetailsSocialType::GooglePlus => write!(f, "googlePlus"),
-            ActivityContentDetailsSocialType::Facebook => write!(f, "facebook"),
-            ActivityContentDetailsSocialType::Twitter => write!(f, "twitter"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivitySnippetType {
-    Undefined,
-    ///
-    #[serde(rename = "typeUnspecified")]
-    TypeUnspecified,
-    ///
-    #[serde(rename = "upload")]
-    Upload,
-    ///
-    #[serde(rename = "like")]
-    Like,
-    ///
-    #[serde(rename = "favorite")]
-    Favorite,
-    ///
-    #[serde(rename = "comment")]
-    Comment,
-    ///
-    #[serde(rename = "subscription")]
-    Subscription,
-    ///
-    #[serde(rename = "playlistItem")]
-    PlaylistItem,
-    ///
-    #[serde(rename = "recommendation")]
-    Recommendation,
-    ///
-    #[serde(rename = "bulletin")]
-    Bulletin,
-    ///
-    #[serde(rename = "social")]
-    Social,
-    ///
-    #[serde(rename = "channelItem")]
-    ChannelItem,
-    ///
-    #[serde(rename = "promotedItem")]
-    PromotedItem,
-}
-
-impl std::default::Default for ActivitySnippetType {
-    fn default() -> ActivitySnippetType {
-        ActivitySnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivitySnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivitySnippetType::Undefined => write!(f, "undefined"),
-            ActivitySnippetType::TypeUnspecified => write!(f, "typeUnspecified"),
-            ActivitySnippetType::Upload => write!(f, "upload"),
-            ActivitySnippetType::Like => write!(f, "like"),
-            ActivitySnippetType::Favorite => write!(f, "favorite"),
-            ActivitySnippetType::Comment => write!(f, "comment"),
-            ActivitySnippetType::Subscription => write!(f, "subscription"),
-            ActivitySnippetType::PlaylistItem => write!(f, "playlistItem"),
-            ActivitySnippetType::Recommendation => write!(f, "recommendation"),
-            ActivitySnippetType::Bulletin => write!(f, "bulletin"),
-            ActivitySnippetType::Social => write!(f, "social"),
-            ActivitySnippetType::ChannelItem => write!(f, "channelItem"),
-            ActivitySnippetType::PromotedItem => write!(f, "promotedItem"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsStereoLayout {
-    Undefined,
-    ///
-    #[serde(rename = "stereoLayoutUnspecified")]
-    StereoLayoutUnspecified,
-    ///
-    #[serde(rename = "mono")]
-    Mono,
-    ///
-    #[serde(rename = "leftRight")]
-    LeftRight,
-    ///
-    #[serde(rename = "topBottom")]
-    TopBottom,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsStereoLayout {
-    fn default() -> LiveBroadcastContentDetailsStereoLayout {
-        LiveBroadcastContentDetailsStereoLayout::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsStereoLayout {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsStereoLayout::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsStereoLayout::StereoLayoutUnspecified => {
-                write!(f, "stereoLayoutUnspecified")
-            }
-            LiveBroadcastContentDetailsStereoLayout::Mono => write!(f, "mono"),
-            LiveBroadcastContentDetailsStereoLayout::LeftRight => write!(f, "leftRight"),
-            LiveBroadcastContentDetailsStereoLayout::TopBottom => write!(f, "topBottom"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsProjection {
-    Undefined,
-    ///
-    #[serde(rename = "projectionUnspecified")]
-    ProjectionUnspecified,
-    ///
-    #[serde(rename = "rectangular")]
-    Rectangular,
-    ///
-    #[serde(rename = "360")]
-    _360,
-    ///
-    #[serde(rename = "mesh")]
-    Mesh,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsProjection {
-    fn default() -> LiveBroadcastContentDetailsProjection {
-        LiveBroadcastContentDetailsProjection::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsProjection {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsProjection::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsProjection::ProjectionUnspecified => {
-                write!(f, "projectionUnspecified")
-            }
-            LiveBroadcastContentDetailsProjection::Rectangular => write!(f, "rectangular"),
-            LiveBroadcastContentDetailsProjection::_360 => write!(f, "360"),
-            LiveBroadcastContentDetailsProjection::Mesh => write!(f, "mesh"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsLatencyPreference {
-    Undefined,
-    ///
-    #[serde(rename = "latencyPreferenceUnspecified")]
-    LatencyPreferenceUnspecified,
-    /// Best for: highest quality viewer playbacks and higher resolutions.
+    /// Transition into TESTING has been requested
+    #[serde(rename = "testStarting")]
+    TestStarting,
+    /// Transition into LIVE has been requested
+    #[serde(rename = "liveStarting")]
+    LiveStarting,
+}
+
+impl std::default::Default for LiveBroadcastStatusLifeCycleStatus {
+    fn default() -> LiveBroadcastStatusLifeCycleStatus {
+        LiveBroadcastStatusLifeCycleStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastStatusLifeCycleStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastStatusLifeCycleStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastStatusLifeCycleStatus::LifeCycleStatusUnspecified => {
+                write!(f, "lifeCycleStatusUnspecified")
+            }
+            LiveBroadcastStatusLifeCycleStatus::Created => write!(f, "created"),
+            LiveBroadcastStatusLifeCycleStatus::Ready => write!(f, "ready"),
+            LiveBroadcastStatusLifeCycleStatus::Testing => write!(f, "testing"),
+            LiveBroadcastStatusLifeCycleStatus::Live => write!(f, "live"),
+            LiveBroadcastStatusLifeCycleStatus::Complete => write!(f, "complete"),
+            LiveBroadcastStatusLifeCycleStatus::Revoked => write!(f, "revoked"),
+            LiveBroadcastStatusLifeCycleStatus::TestStarting => write!(f, "testStarting"),
+            LiveBroadcastStatusLifeCycleStatus::LiveStarting => write!(f, "liveStarting"),
+        };
+        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 LiveBroadcastStatusLiveBroadcastPriority {
+    Undefined,
+    ///
+    #[serde(rename = "liveBroadcastPriorityUnspecified")]
+    LiveBroadcastPriorityUnspecified,
+    /// Low priority broadcast: for low view count HoAs or other low priority broadcasts.
+    #[serde(rename = "low")]
+    Low,
+    /// Normal priority broadcast: for regular HoAs and broadcasts.
     #[serde(rename = "normal")]
     Normal,
-    /// 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")
-            }
+    /// High priority broadcast: for high profile HoAs, like PixelCorp ones.
+    #[serde(rename = "high")]
+    High,
+}
+
+impl std::default::Default for LiveBroadcastStatusLiveBroadcastPriority {
+    fn default() -> LiveBroadcastStatusLiveBroadcastPriority {
+        LiveBroadcastStatusLiveBroadcastPriority::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastStatusLiveBroadcastPriority {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastStatusLiveBroadcastPriority::Undefined => write!(f, "undefined"),
+            LiveBroadcastStatusLiveBroadcastPriority::LiveBroadcastPriorityUnspecified => {
+                write!(f, "liveBroadcastPriorityUnspecified")
+            }
+            LiveBroadcastStatusLiveBroadcastPriority::Low => write!(f, "low"),
+            LiveBroadcastStatusLiveBroadcastPriority::Normal => write!(f, "normal"),
+            LiveBroadcastStatusLiveBroadcastPriority::High => write!(f, "high"),
         };
         Ok(())
     }
@@ -9414,198 +4708,6 @@
 }
 
 #[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,
     ///
@@ -9820,904 +4922,34 @@
 }
 
 #[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 = "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 CdnSettingsIngestionType {
-    Undefined,
-    ///
-    #[serde(rename = "rtmp")]
-    Rtmp,
-    ///
-    #[serde(rename = "dash")]
-    Dash,
-    ///
-    #[serde(rename = "webrtc")]
-    Webrtc,
-    ///
-    #[serde(rename = "hls")]
-    Hls,
-}
-
-impl std::default::Default for CdnSettingsIngestionType {
-    fn default() -> CdnSettingsIngestionType {
-        CdnSettingsIngestionType::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsIngestionType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsIngestionType::Undefined => write!(f, "undefined"),
-            CdnSettingsIngestionType::Rtmp => write!(f, "rtmp"),
-            CdnSettingsIngestionType::Dash => write!(f, "dash"),
-            CdnSettingsIngestionType::Webrtc => write!(f, "webrtc"),
-            CdnSettingsIngestionType::Hls => write!(f, "hls"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsFrameRate {
-    Undefined,
-    ///
-    #[serde(rename = "30fps")]
-    _30fps,
-    ///
-    #[serde(rename = "60fps")]
-    _60fps,
-    ///
-    #[serde(rename = "variable")]
-    Variable,
-}
-
-impl std::default::Default for CdnSettingsFrameRate {
-    fn default() -> CdnSettingsFrameRate {
-        CdnSettingsFrameRate::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsFrameRate {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsFrameRate::Undefined => write!(f, "undefined"),
-            CdnSettingsFrameRate::_30fps => write!(f, "30fps"),
-            CdnSettingsFrameRate::_60fps => write!(f, "60fps"),
-            CdnSettingsFrameRate::Variable => write!(f, "variable"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsResolution {
-    Undefined,
-    ///
-    #[serde(rename = "240p")]
-    _240p,
-    ///
-    #[serde(rename = "360p")]
-    _360p,
-    ///
-    #[serde(rename = "480p")]
-    _480p,
-    ///
-    #[serde(rename = "720p")]
-    _720p,
-    ///
-    #[serde(rename = "1080p")]
-    _1080p,
-    ///
-    #[serde(rename = "1440p")]
-    _1440p,
-    ///
-    #[serde(rename = "2160p")]
-    _2160p,
-    ///
-    #[serde(rename = "variable")]
-    Variable,
-}
-
-impl std::default::Default for CdnSettingsResolution {
-    fn default() -> CdnSettingsResolution {
-        CdnSettingsResolution::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsResolution {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsResolution::Undefined => write!(f, "undefined"),
-            CdnSettingsResolution::_240p => write!(f, "240p"),
-            CdnSettingsResolution::_360p => write!(f, "360p"),
-            CdnSettingsResolution::_480p => write!(f, "480p"),
-            CdnSettingsResolution::_720p => write!(f, "720p"),
-            CdnSettingsResolution::_1080p => write!(f, "1080p"),
-            CdnSettingsResolution::_1440p => write!(f, "1440p"),
-            CdnSettingsResolution::_2160p => write!(f, "2160p"),
-            CdnSettingsResolution::Variable => write!(f, "variable"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusLifeCycleStatus {
-    Undefined,
-    /// No value or the value is unknown.
-    #[serde(rename = "lifeCycleStatusUnspecified")]
-    LifeCycleStatusUnspecified,
-    /// Incomplete settings, but otherwise valid
-    #[serde(rename = "created")]
-    Created,
-    /// Complete settings
-    #[serde(rename = "ready")]
-    Ready,
-    /// Visible only to partner, may need special UI treatment
-    #[serde(rename = "testing")]
-    Testing,
-    /// Viper is recording; this means the "clock" is running
-    #[serde(rename = "live")]
-    Live,
-    /// The broadcast is finished.
-    #[serde(rename = "complete")]
-    Complete,
-    /// This broadcast was removed by admin action
-    #[serde(rename = "revoked")]
-    Revoked,
-    /// Transition into TESTING has been requested
-    #[serde(rename = "testStarting")]
-    TestStarting,
-    /// Transition into LIVE has been requested
-    #[serde(rename = "liveStarting")]
-    LiveStarting,
-}
-
-impl std::default::Default for LiveBroadcastStatusLifeCycleStatus {
-    fn default() -> LiveBroadcastStatusLifeCycleStatus {
-        LiveBroadcastStatusLifeCycleStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusLifeCycleStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusLifeCycleStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusLifeCycleStatus::LifeCycleStatusUnspecified => {
-                write!(f, "lifeCycleStatusUnspecified")
-            }
-            LiveBroadcastStatusLifeCycleStatus::Created => write!(f, "created"),
-            LiveBroadcastStatusLifeCycleStatus::Ready => write!(f, "ready"),
-            LiveBroadcastStatusLifeCycleStatus::Testing => write!(f, "testing"),
-            LiveBroadcastStatusLifeCycleStatus::Live => write!(f, "live"),
-            LiveBroadcastStatusLifeCycleStatus::Complete => write!(f, "complete"),
-            LiveBroadcastStatusLifeCycleStatus::Revoked => write!(f, "revoked"),
-            LiveBroadcastStatusLifeCycleStatus::TestStarting => write!(f, "testStarting"),
-            LiveBroadcastStatusLifeCycleStatus::LiveStarting => write!(f, "liveStarting"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusLiveBroadcastPriority {
-    Undefined,
-    ///
-    #[serde(rename = "liveBroadcastPriorityUnspecified")]
-    LiveBroadcastPriorityUnspecified,
-    /// Low priority broadcast: for low view count HoAs or other low priority broadcasts.
-    #[serde(rename = "low")]
-    Low,
-    /// Normal priority broadcast: for regular HoAs and broadcasts.
-    #[serde(rename = "normal")]
-    Normal,
-    /// High priority broadcast: for high profile HoAs, like PixelCorp ones.
-    #[serde(rename = "high")]
-    High,
-}
-
-impl std::default::Default for LiveBroadcastStatusLiveBroadcastPriority {
-    fn default() -> LiveBroadcastStatusLiveBroadcastPriority {
-        LiveBroadcastStatusLiveBroadcastPriority::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusLiveBroadcastPriority {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusLiveBroadcastPriority::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusLiveBroadcastPriority::LiveBroadcastPriorityUnspecified => {
-                write!(f, "liveBroadcastPriorityUnspecified")
-            }
-            LiveBroadcastStatusLiveBroadcastPriority::Low => write!(f, "low"),
-            LiveBroadcastStatusLiveBroadcastPriority::Normal => write!(f, "normal"),
-            LiveBroadcastStatusLiveBroadcastPriority::High => write!(f, "high"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusPrivacyStatus {
-    Undefined,
-    ///
-    #[serde(rename = "public")]
-    Public,
-    ///
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    ///
-    #[serde(rename = "private")]
-    Private,
-}
-
-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(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveChatBanSnippetType {
-    Undefined,
-    /// An invalid ban type.
-    #[serde(rename = "liveChatBanTypeUnspecified")]
-    LiveChatBanTypeUnspecified,
-    /// A permanent ban.
-    #[serde(rename = "permanent")]
-    Permanent,
-    /// A temporary ban.
-    #[serde(rename = "temporary")]
-    Temporary,
-}
-
-impl std::default::Default for LiveChatBanSnippetType {
-    fn default() -> LiveChatBanSnippetType {
-        LiveChatBanSnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveChatBanSnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveChatBanSnippetType::Undefined => write!(f, "undefined"),
-            LiveChatBanSnippetType::LiveChatBanTypeUnspecified => {
-                write!(f, "liveChatBanTypeUnspecified")
-            }
-            LiveChatBanSnippetType::Permanent => write!(f, "permanent"),
-            LiveChatBanSnippetType::Temporary => write!(f, "temporary"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoRatingRating {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The entity is liked.
-    #[serde(rename = "like")]
-    Like,
-    /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for VideoRatingRating {
-    fn default() -> VideoRatingRating {
-        VideoRatingRating::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoRatingRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoRatingRating::Undefined => write!(f, "undefined"),
-            VideoRatingRating::None => write!(f, "none"),
-            VideoRatingRating::Like => write!(f, "like"),
-            VideoRatingRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentSnippetModerationStatus {
-    Undefined,
-    /// The comment is available for public display.
-    #[serde(rename = "published")]
-    Published,
-    /// The comment is awaiting review by a moderator.
-    #[serde(rename = "heldForReview")]
-    HeldForReview,
-    ///
-    #[serde(rename = "likelySpam")]
-    LikelySpam,
-    /// The comment is unfit for display.
-    #[serde(rename = "rejected")]
-    Rejected,
-}
-
-impl std::default::Default for CommentSnippetModerationStatus {
-    fn default() -> CommentSnippetModerationStatus {
-        CommentSnippetModerationStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentSnippetModerationStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentSnippetModerationStatus::Undefined => write!(f, "undefined"),
-            CommentSnippetModerationStatus::Published => write!(f, "published"),
-            CommentSnippetModerationStatus::HeldForReview => write!(f, "heldForReview"),
-            CommentSnippetModerationStatus::LikelySpam => write!(f, "likelySpam"),
-            CommentSnippetModerationStatus::Rejected => write!(f, "rejected"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentSnippetViewerRating {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The entity is liked.
-    #[serde(rename = "like")]
-    Like,
-    /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for CommentSnippetViewerRating {
-    fn default() -> CommentSnippetViewerRating {
-        CommentSnippetViewerRating::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentSnippetViewerRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentSnippetViewerRating::Undefined => write!(f, "undefined"),
-            CommentSnippetViewerRating::None => write!(f, "none"),
-            CommentSnippetViewerRating::Like => write!(f, "like"),
-            CommentSnippetViewerRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchResultSnippetLiveBroadcastContent {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for SearchResultSnippetLiveBroadcastContent {
-    fn default() -> SearchResultSnippetLiveBroadcastContent {
-        SearchResultSnippetLiveBroadcastContent::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchResultSnippetLiveBroadcastContent {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchResultSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
-            SearchResultSnippetLiveBroadcastContent::None => write!(f, "none"),
-            SearchResultSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
-            SearchResultSnippetLiveBroadcastContent::Live => write!(f, "live"),
-            SearchResultSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveChatMessageSnippetType {
-    Undefined,
-    ///
-    #[serde(rename = "invalidType")]
-    InvalidType,
-    ///
-    #[serde(rename = "textMessageEvent")]
-    TextMessageEvent,
-    ///
-    #[serde(rename = "tombstone")]
-    Tombstone,
-    ///
-    #[serde(rename = "fanFundingEvent")]
-    FanFundingEvent,
-    ///
-    #[serde(rename = "chatEndedEvent")]
-    ChatEndedEvent,
-    ///
-    #[serde(rename = "sponsorOnlyModeStartedEvent")]
-    SponsorOnlyModeStartedEvent,
-    ///
-    #[serde(rename = "sponsorOnlyModeEndedEvent")]
-    SponsorOnlyModeEndedEvent,
-    ///
-    #[serde(rename = "newSponsorEvent")]
-    NewSponsorEvent,
-    ///
-    #[serde(rename = "messageDeletedEvent")]
-    MessageDeletedEvent,
-    ///
-    #[serde(rename = "messageRetractedEvent")]
-    MessageRetractedEvent,
-    ///
-    #[serde(rename = "userBannedEvent")]
-    UserBannedEvent,
-    ///
-    #[serde(rename = "superChatEvent")]
-    SuperChatEvent,
-    ///
-    #[serde(rename = "superStickerEvent")]
-    SuperStickerEvent,
-}
-
-impl std::default::Default for LiveChatMessageSnippetType {
-    fn default() -> LiveChatMessageSnippetType {
-        LiveChatMessageSnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveChatMessageSnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveChatMessageSnippetType::Undefined => write!(f, "undefined"),
-            LiveChatMessageSnippetType::InvalidType => write!(f, "invalidType"),
-            LiveChatMessageSnippetType::TextMessageEvent => write!(f, "textMessageEvent"),
-            LiveChatMessageSnippetType::Tombstone => write!(f, "tombstone"),
-            LiveChatMessageSnippetType::FanFundingEvent => write!(f, "fanFundingEvent"),
-            LiveChatMessageSnippetType::ChatEndedEvent => write!(f, "chatEndedEvent"),
-            LiveChatMessageSnippetType::SponsorOnlyModeStartedEvent => {
-                write!(f, "sponsorOnlyModeStartedEvent")
-            }
-            LiveChatMessageSnippetType::SponsorOnlyModeEndedEvent => {
-                write!(f, "sponsorOnlyModeEndedEvent")
-            }
-            LiveChatMessageSnippetType::NewSponsorEvent => write!(f, "newSponsorEvent"),
-            LiveChatMessageSnippetType::MessageDeletedEvent => write!(f, "messageDeletedEvent"),
-            LiveChatMessageSnippetType::MessageRetractedEvent => write!(f, "messageRetractedEvent"),
-            LiveChatMessageSnippetType::UserBannedEvent => write!(f, "userBannedEvent"),
-            LiveChatMessageSnippetType::SuperChatEvent => write!(f, "superChatEvent"),
-            LiveChatMessageSnippetType::SuperStickerEvent => write!(f, "superStickerEvent"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelConversionPingContext {
-    Undefined,
-    ///
-    #[serde(rename = "subscribe")]
-    Subscribe,
-    ///
-    #[serde(rename = "unsubscribe")]
-    Unsubscribe,
-    ///
-    #[serde(rename = "cview")]
-    Cview,
-}
-
-impl std::default::Default for ChannelConversionPingContext {
-    fn default() -> ChannelConversionPingContext {
-        ChannelConversionPingContext::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelConversionPingContext {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelConversionPingContext::Undefined => write!(f, "undefined"),
-            ChannelConversionPingContext::Subscribe => write!(f, "subscribe"),
-            ChannelConversionPingContext::Unsubscribe => write!(f, "unsubscribe"),
-            ChannelConversionPingContext::Cview => write!(f, "cview"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum PlaylistStatusPrivacyStatus {
-    Undefined,
-    ///
-    #[serde(rename = "public")]
-    Public,
-    ///
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    ///
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for PlaylistStatusPrivacyStatus {
-    fn default() -> PlaylistStatusPrivacyStatus {
-        PlaylistStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for PlaylistStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            PlaylistStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            PlaylistStatusPrivacyStatus::Public => write!(f, "public"),
-            PlaylistStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            PlaylistStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoFileDetailsVideoStreamRotation {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    ///
-    #[serde(rename = "clockwise")]
-    Clockwise,
-    ///
-    #[serde(rename = "upsideDown")]
-    UpsideDown,
-    ///
-    #[serde(rename = "counterClockwise")]
-    CounterClockwise,
-    ///
-    #[serde(rename = "other")]
-    Other,
-}
-
-impl std::default::Default for VideoFileDetailsVideoStreamRotation {
-    fn default() -> VideoFileDetailsVideoStreamRotation {
-        VideoFileDetailsVideoStreamRotation::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoFileDetailsVideoStreamRotation {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoFileDetailsVideoStreamRotation::Undefined => write!(f, "undefined"),
-            VideoFileDetailsVideoStreamRotation::None => write!(f, "none"),
-            VideoFileDetailsVideoStreamRotation::Clockwise => write!(f, "clockwise"),
-            VideoFileDetailsVideoStreamRotation::UpsideDown => write!(f, "upsideDown"),
-            VideoFileDetailsVideoStreamRotation::CounterClockwise => write!(f, "counterClockwise"),
-            VideoFileDetailsVideoStreamRotation::Other => write!(f, "other"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamStatusStreamStatus {
-    Undefined,
-    ///
-    #[serde(rename = "created")]
-    Created,
-    ///
-    #[serde(rename = "ready")]
-    Ready,
-    ///
-    #[serde(rename = "active")]
-    Active,
-    ///
-    #[serde(rename = "inactive")]
-    Inactive,
-    ///
-    #[serde(rename = "error")]
-    Error,
-}
-
-impl std::default::Default for LiveStreamStatusStreamStatus {
-    fn default() -> LiveStreamStatusStreamStatus {
-        LiveStreamStatusStreamStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamStatusStreamStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamStatusStreamStatus::Undefined => write!(f, "undefined"),
-            LiveStreamStatusStreamStatus::Created => write!(f, "created"),
-            LiveStreamStatusStreamStatus::Ready => write!(f, "ready"),
-            LiveStreamStatusStreamStatus::Active => write!(f, "active"),
-            LiveStreamStatusStreamStatus::Inactive => write!(f, "inactive"),
-            LiveStreamStatusStreamStatus::Error => write!(f, "error"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusLicense {
-    Undefined,
-    ///
-    #[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.
-    #[serde(rename = "uploaded")]
-    Uploaded,
-    /// Video has been successfully processed.
-    #[serde(rename = "processed")]
-    Processed,
-    /// Processing has failed. See FailureReason.
-    #[serde(rename = "failed")]
-    Failed,
-    /// Video has been rejected. See RejectionReason.
-    #[serde(rename = "rejected")]
-    Rejected,
-    /// Video has been deleted.
-    #[serde(rename = "deleted")]
-    Deleted,
-}
-
-impl std::default::Default for VideoStatusUploadStatus {
-    fn default() -> VideoStatusUploadStatus {
-        VideoStatusUploadStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusUploadStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusUploadStatus::Undefined => write!(f, "undefined"),
-            VideoStatusUploadStatus::Uploaded => write!(f, "uploaded"),
-            VideoStatusUploadStatus::Processed => write!(f, "processed"),
-            VideoStatusUploadStatus::Failed => write!(f, "failed"),
-            VideoStatusUploadStatus::Rejected => write!(f, "rejected"),
-            VideoStatusUploadStatus::Deleted => write!(f, "deleted"),
+pub enum SubscriptionContentDetailsActivityType {
+    Undefined,
+    ///
+    #[serde(rename = "subscriptionActivityTypeUnspecified")]
+    SubscriptionActivityTypeUnspecified,
+    ///
+    #[serde(rename = "all")]
+    All,
+    ///
+    #[serde(rename = "uploads")]
+    Uploads,
+}
+
+impl std::default::Default for SubscriptionContentDetailsActivityType {
+    fn default() -> SubscriptionContentDetailsActivityType {
+        SubscriptionContentDetailsActivityType::Undefined
+    }
+}
+
+impl std::fmt::Display for SubscriptionContentDetailsActivityType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SubscriptionContentDetailsActivityType::Undefined => write!(f, "undefined"),
+            SubscriptionContentDetailsActivityType::SubscriptionActivityTypeUnspecified => {
+                write!(f, "subscriptionActivityTypeUnspecified")
+            }
+            SubscriptionContentDetailsActivityType::All => write!(f, "all"),
+            SubscriptionContentDetailsActivityType::Uploads => write!(f, "uploads"),
         };
         Ok(())
     }
@@ -10818,39 +5050,1289 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentsListTextFormat {
-    Undefined,
-    ///
-    #[serde(rename = "textFormatUnspecified")]
-    TextFormatUnspecified,
-    /// Returns the comments in HTML format. This is the default value.
-    #[serde(rename = "html")]
-    Html,
-    /// Returns the comments in plain text format.
-    #[serde(rename = "plainText")]
-    PlainText,
-}
-
-impl std::default::Default for CommentsListTextFormat {
-    fn default() -> CommentsListTextFormat {
-        CommentsListTextFormat::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentsListTextFormat {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentsListTextFormat::Undefined => write!(f, "undefined"),
-            CommentsListTextFormat::TextFormatUnspecified => write!(f, "textFormatUnspecified"),
-            CommentsListTextFormat::Html => write!(f, "html"),
-            CommentsListTextFormat::PlainText => write!(f, "plainText"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentsSetModerationStatusModerationStatus {
+pub enum VideoStatusUploadStatus {
+    Undefined,
+    /// Video has been uploaded but not processed yet.
+    #[serde(rename = "uploaded")]
+    Uploaded,
+    /// Video has been successfully processed.
+    #[serde(rename = "processed")]
+    Processed,
+    /// Processing has failed. See FailureReason.
+    #[serde(rename = "failed")]
+    Failed,
+    /// Video has been rejected. See RejectionReason.
+    #[serde(rename = "rejected")]
+    Rejected,
+    /// Video has been deleted.
+    #[serde(rename = "deleted")]
+    Deleted,
+}
+
+impl std::default::Default for VideoStatusUploadStatus {
+    fn default() -> VideoStatusUploadStatus {
+        VideoStatusUploadStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusUploadStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusUploadStatus::Undefined => write!(f, "undefined"),
+            VideoStatusUploadStatus::Uploaded => write!(f, "uploaded"),
+            VideoStatusUploadStatus::Processed => write!(f, "processed"),
+            VideoStatusUploadStatus::Failed => write!(f, "failed"),
+            VideoStatusUploadStatus::Rejected => write!(f, "rejected"),
+            VideoStatusUploadStatus::Deleted => write!(f, "deleted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusLicense {
+    Undefined,
+    ///
+    #[serde(rename = "youtube")]
+    Youtube,
+    ///
+    #[serde(rename = "creativeCommon")]
+    CreativeCommon,
+}
+
+impl std::default::Default for VideoStatusLicense {
+    fn default() -> VideoStatusLicense {
+        VideoStatusLicense::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusLicense {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusLicense::Undefined => write!(f, "undefined"),
+            VideoStatusLicense::Youtube => write!(f, "youtube"),
+            VideoStatusLicense::CreativeCommon => write!(f, "creativeCommon"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 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 LiveChatMessageSnippetType {
+    Undefined,
+    ///
+    #[serde(rename = "invalidType")]
+    InvalidType,
+    ///
+    #[serde(rename = "textMessageEvent")]
+    TextMessageEvent,
+    ///
+    #[serde(rename = "tombstone")]
+    Tombstone,
+    ///
+    #[serde(rename = "fanFundingEvent")]
+    FanFundingEvent,
+    ///
+    #[serde(rename = "chatEndedEvent")]
+    ChatEndedEvent,
+    ///
+    #[serde(rename = "sponsorOnlyModeStartedEvent")]
+    SponsorOnlyModeStartedEvent,
+    ///
+    #[serde(rename = "sponsorOnlyModeEndedEvent")]
+    SponsorOnlyModeEndedEvent,
+    ///
+    #[serde(rename = "newSponsorEvent")]
+    NewSponsorEvent,
+    ///
+    #[serde(rename = "messageDeletedEvent")]
+    MessageDeletedEvent,
+    ///
+    #[serde(rename = "messageRetractedEvent")]
+    MessageRetractedEvent,
+    ///
+    #[serde(rename = "userBannedEvent")]
+    UserBannedEvent,
+    ///
+    #[serde(rename = "superChatEvent")]
+    SuperChatEvent,
+    ///
+    #[serde(rename = "superStickerEvent")]
+    SuperStickerEvent,
+}
+
+impl std::default::Default for LiveChatMessageSnippetType {
+    fn default() -> LiveChatMessageSnippetType {
+        LiveChatMessageSnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveChatMessageSnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveChatMessageSnippetType::Undefined => write!(f, "undefined"),
+            LiveChatMessageSnippetType::InvalidType => write!(f, "invalidType"),
+            LiveChatMessageSnippetType::TextMessageEvent => write!(f, "textMessageEvent"),
+            LiveChatMessageSnippetType::Tombstone => write!(f, "tombstone"),
+            LiveChatMessageSnippetType::FanFundingEvent => write!(f, "fanFundingEvent"),
+            LiveChatMessageSnippetType::ChatEndedEvent => write!(f, "chatEndedEvent"),
+            LiveChatMessageSnippetType::SponsorOnlyModeStartedEvent => {
+                write!(f, "sponsorOnlyModeStartedEvent")
+            }
+            LiveChatMessageSnippetType::SponsorOnlyModeEndedEvent => {
+                write!(f, "sponsorOnlyModeEndedEvent")
+            }
+            LiveChatMessageSnippetType::NewSponsorEvent => write!(f, "newSponsorEvent"),
+            LiveChatMessageSnippetType::MessageDeletedEvent => write!(f, "messageDeletedEvent"),
+            LiveChatMessageSnippetType::MessageRetractedEvent => write!(f, "messageRetractedEvent"),
+            LiveChatMessageSnippetType::UserBannedEvent => write!(f, "userBannedEvent"),
+            LiveChatMessageSnippetType::SuperChatEvent => write!(f, "superChatEvent"),
+            LiveChatMessageSnippetType::SuperStickerEvent => write!(f, "superStickerEvent"),
+        };
+        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 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 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 LiveStreamStatusStreamStatus {
+    Undefined,
+    ///
+    #[serde(rename = "created")]
+    Created,
+    ///
+    #[serde(rename = "ready")]
+    Ready,
+    ///
+    #[serde(rename = "active")]
+    Active,
+    ///
+    #[serde(rename = "inactive")]
+    Inactive,
+    ///
+    #[serde(rename = "error")]
+    Error,
+}
+
+impl std::default::Default for LiveStreamStatusStreamStatus {
+    fn default() -> LiveStreamStatusStreamStatus {
+        LiveStreamStatusStreamStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamStatusStreamStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamStatusStreamStatus::Undefined => write!(f, "undefined"),
+            LiveStreamStatusStreamStatus::Created => write!(f, "created"),
+            LiveStreamStatusStreamStatus::Ready => write!(f, "ready"),
+            LiveStreamStatusStreamStatus::Active => write!(f, "active"),
+            LiveStreamStatusStreamStatus::Inactive => write!(f, "inactive"),
+            LiveStreamStatusStreamStatus::Error => write!(f, "error"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 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 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 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 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 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 PlaylistStatusPrivacyStatus {
+    Undefined,
+    ///
+    #[serde(rename = "public")]
+    Public,
+    ///
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    ///
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for PlaylistStatusPrivacyStatus {
+    fn default() -> PlaylistStatusPrivacyStatus {
+        PlaylistStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for PlaylistStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            PlaylistStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            PlaylistStatusPrivacyStatus::Public => write!(f, "public"),
+            PlaylistStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            PlaylistStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 ActivityContentDetailsSocialType {
+    Undefined,
+    ///
+    #[serde(rename = "typeUnspecified")]
+    TypeUnspecified,
+    ///
+    #[serde(rename = "googlePlus")]
+    GooglePlus,
+    ///
+    #[serde(rename = "facebook")]
+    Facebook,
+    ///
+    #[serde(rename = "twitter")]
+    Twitter,
+}
+
+impl std::default::Default for ActivityContentDetailsSocialType {
+    fn default() -> ActivityContentDetailsSocialType {
+        ActivityContentDetailsSocialType::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivityContentDetailsSocialType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivityContentDetailsSocialType::Undefined => write!(f, "undefined"),
+            ActivityContentDetailsSocialType::TypeUnspecified => write!(f, "typeUnspecified"),
+            ActivityContentDetailsSocialType::GooglePlus => write!(f, "googlePlus"),
+            ActivityContentDetailsSocialType::Facebook => write!(f, "facebook"),
+            ActivityContentDetailsSocialType::Twitter => write!(f, "twitter"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelConversionPingContext {
+    Undefined,
+    ///
+    #[serde(rename = "subscribe")]
+    Subscribe,
+    ///
+    #[serde(rename = "unsubscribe")]
+    Unsubscribe,
+    ///
+    #[serde(rename = "cview")]
+    Cview,
+}
+
+impl std::default::Default for ChannelConversionPingContext {
+    fn default() -> ChannelConversionPingContext {
+        ChannelConversionPingContext::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelConversionPingContext {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelConversionPingContext::Undefined => write!(f, "undefined"),
+            ChannelConversionPingContext::Subscribe => write!(f, "subscribe"),
+            ChannelConversionPingContext::Unsubscribe => write!(f, "unsubscribe"),
+            ChannelConversionPingContext::Cview => write!(f, "cview"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 VideoFileDetailsVideoStreamRotation {
+    Undefined,
+    ///
+    #[serde(rename = "none")]
+    None,
+    ///
+    #[serde(rename = "clockwise")]
+    Clockwise,
+    ///
+    #[serde(rename = "upsideDown")]
+    UpsideDown,
+    ///
+    #[serde(rename = "counterClockwise")]
+    CounterClockwise,
+    ///
+    #[serde(rename = "other")]
+    Other,
+}
+
+impl std::default::Default for VideoFileDetailsVideoStreamRotation {
+    fn default() -> VideoFileDetailsVideoStreamRotation {
+        VideoFileDetailsVideoStreamRotation::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoFileDetailsVideoStreamRotation {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoFileDetailsVideoStreamRotation::Undefined => write!(f, "undefined"),
+            VideoFileDetailsVideoStreamRotation::None => write!(f, "none"),
+            VideoFileDetailsVideoStreamRotation::Clockwise => write!(f, "clockwise"),
+            VideoFileDetailsVideoStreamRotation::UpsideDown => write!(f, "upsideDown"),
+            VideoFileDetailsVideoStreamRotation::CounterClockwise => write!(f, "counterClockwise"),
+            VideoFileDetailsVideoStreamRotation::Other => write!(f, "other"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 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 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 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 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 CommentSnippetViewerRating {
+    Undefined,
+    ///
+    #[serde(rename = "none")]
+    None,
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "dislike")]
+    Dislike,
+}
+
+impl std::default::Default for CommentSnippetViewerRating {
+    fn default() -> CommentSnippetViewerRating {
+        CommentSnippetViewerRating::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentSnippetViewerRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentSnippetViewerRating::Undefined => write!(f, "undefined"),
+            CommentSnippetViewerRating::None => write!(f, "none"),
+            CommentSnippetViewerRating::Like => write!(f, "like"),
+            CommentSnippetViewerRating::Dislike => write!(f, "dislike"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentSnippetModerationStatus {
     Undefined,
     /// The comment is available for public display.
     #[serde(rename = "published")]
@@ -10866,29 +6348,4137 @@
     Rejected,
 }
 
-impl std::default::Default for CommentsSetModerationStatusModerationStatus {
-    fn default() -> CommentsSetModerationStatusModerationStatus {
-        CommentsSetModerationStatusModerationStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentsSetModerationStatusModerationStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentsSetModerationStatusModerationStatus::Undefined => write!(f, "undefined"),
-            CommentsSetModerationStatusModerationStatus::Published => write!(f, "published"),
-            CommentsSetModerationStatusModerationStatus::HeldForReview => {
-                write!(f, "heldForReview")
-            }
-            CommentsSetModerationStatusModerationStatus::LikelySpam => write!(f, "likelySpam"),
-            CommentsSetModerationStatusModerationStatus::Rejected => write!(f, "rejected"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinksListType {
+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 LiveChatBanSnippetType {
+    Undefined,
+    /// An invalid ban type.
+    #[serde(rename = "liveChatBanTypeUnspecified")]
+    LiveChatBanTypeUnspecified,
+    /// A permanent ban.
+    #[serde(rename = "permanent")]
+    Permanent,
+    /// A temporary ban.
+    #[serde(rename = "temporary")]
+    Temporary,
+}
+
+impl std::default::Default for LiveChatBanSnippetType {
+    fn default() -> LiveChatBanSnippetType {
+        LiveChatBanSnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveChatBanSnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveChatBanSnippetType::Undefined => write!(f, "undefined"),
+            LiveChatBanSnippetType::LiveChatBanTypeUnspecified => {
+                write!(f, "liveChatBanTypeUnspecified")
+            }
+            LiveChatBanSnippetType::Permanent => write!(f, "permanent"),
+            LiveChatBanSnippetType::Temporary => write!(f, "temporary"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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(())
+    }
+}
+
+#[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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 ContentRatingCatvRating {
+    Undefined,
+    ///
+    #[serde(rename = "catvUnspecified")]
+    CatvUnspecified,
+    /// C
+    #[serde(rename = "catvC")]
+    CatvC,
+    /// C8
+    #[serde(rename = "catvC8")]
+    CatvC8,
+    /// G
+    #[serde(rename = "catvG")]
+    CatvG,
+    /// PG
+    #[serde(rename = "catvPg")]
+    CatvPg,
+    /// 14+
+    #[serde(rename = "catv14plus")]
+    Catv14plus,
+    /// 18+
+    #[serde(rename = "catv18plus")]
+    Catv18plus,
+    ///
+    #[serde(rename = "catvUnrated")]
+    CatvUnrated,
+    ///
+    #[serde(rename = "catvE")]
+    CatvE,
+}
+
+impl std::default::Default for ContentRatingCatvRating {
+    fn default() -> ContentRatingCatvRating {
+        ContentRatingCatvRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCatvRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCatvRating::Undefined => write!(f, "undefined"),
+            ContentRatingCatvRating::CatvUnspecified => write!(f, "catvUnspecified"),
+            ContentRatingCatvRating::CatvC => write!(f, "catvC"),
+            ContentRatingCatvRating::CatvC8 => write!(f, "catvC8"),
+            ContentRatingCatvRating::CatvG => write!(f, "catvG"),
+            ContentRatingCatvRating::CatvPg => write!(f, "catvPg"),
+            ContentRatingCatvRating::Catv14plus => write!(f, "catv14plus"),
+            ContentRatingCatvRating::Catv18plus => write!(f, "catv18plus"),
+            ContentRatingCatvRating::CatvUnrated => write!(f, "catvUnrated"),
+            ContentRatingCatvRating::CatvE => write!(f, "catvE"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMocRating {
+    Undefined,
+    ///
+    #[serde(rename = "mocUnspecified")]
+    MocUnspecified,
+    /// E
+    #[serde(rename = "mocE")]
+    MocE,
+    /// T
+    #[serde(rename = "mocT")]
+    MocT,
+    /// 7
+    #[serde(rename = "moc7")]
+    Moc7,
+    /// 12
+    #[serde(rename = "moc12")]
+    Moc12,
+    /// 15
+    #[serde(rename = "moc15")]
+    Moc15,
+    /// 18
+    #[serde(rename = "moc18")]
+    Moc18,
+    /// X
+    #[serde(rename = "mocX")]
+    MocX,
+    /// Banned
+    #[serde(rename = "mocBanned")]
+    MocBanned,
+    ///
+    #[serde(rename = "mocUnrated")]
+    MocUnrated,
+}
+
+impl std::default::Default for ContentRatingMocRating {
+    fn default() -> ContentRatingMocRating {
+        ContentRatingMocRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMocRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMocRating::Undefined => write!(f, "undefined"),
+            ContentRatingMocRating::MocUnspecified => write!(f, "mocUnspecified"),
+            ContentRatingMocRating::MocE => write!(f, "mocE"),
+            ContentRatingMocRating::MocT => write!(f, "mocT"),
+            ContentRatingMocRating::Moc7 => write!(f, "moc7"),
+            ContentRatingMocRating::Moc12 => write!(f, "moc12"),
+            ContentRatingMocRating::Moc15 => write!(f, "moc15"),
+            ContentRatingMocRating::Moc18 => write!(f, "moc18"),
+            ContentRatingMocRating::MocX => write!(f, "mocX"),
+            ContentRatingMocRating::MocBanned => write!(f, "mocBanned"),
+            ContentRatingMocRating::MocUnrated => write!(f, "mocUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 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 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 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 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 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 ContentRatingSkfilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "skfilmUnspecified")]
+    SkfilmUnspecified,
+    /// G
+    #[serde(rename = "skfilmG")]
+    SkfilmG,
+    /// P2
+    #[serde(rename = "skfilmP2")]
+    SkfilmP2,
+    /// P5
+    #[serde(rename = "skfilmP5")]
+    SkfilmP5,
+    /// P8
+    #[serde(rename = "skfilmP8")]
+    SkfilmP8,
+    ///
+    #[serde(rename = "skfilmUnrated")]
+    SkfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingSkfilmRating {
+    fn default() -> ContentRatingSkfilmRating {
+        ContentRatingSkfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingSkfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingSkfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingSkfilmRating::SkfilmUnspecified => write!(f, "skfilmUnspecified"),
+            ContentRatingSkfilmRating::SkfilmG => write!(f, "skfilmG"),
+            ContentRatingSkfilmRating::SkfilmP2 => write!(f, "skfilmP2"),
+            ContentRatingSkfilmRating::SkfilmP5 => write!(f, "skfilmP5"),
+            ContentRatingSkfilmRating::SkfilmP8 => write!(f, "skfilmP8"),
+            ContentRatingSkfilmRating::SkfilmUnrated => write!(f, "skfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMenaMpaaRating {
+    Undefined,
+    ///
+    #[serde(rename = "menaMpaaUnspecified")]
+    MenaMpaaUnspecified,
+    /// G
+    #[serde(rename = "menaMpaaG")]
+    MenaMpaaG,
+    /// PG
+    #[serde(rename = "menaMpaaPg")]
+    MenaMpaaPg,
+    /// PG-13
+    #[serde(rename = "menaMpaaPg13")]
+    MenaMpaaPg13,
+    /// R
+    #[serde(rename = "menaMpaaR")]
+    MenaMpaaR,
+    /// To keep the same enum values as MPAA's items have, skip NC_17.
+    #[serde(rename = "menaMpaaUnrated")]
+    MenaMpaaUnrated,
+}
+
+impl std::default::Default for ContentRatingMenaMpaaRating {
+    fn default() -> ContentRatingMenaMpaaRating {
+        ContentRatingMenaMpaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMenaMpaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMenaMpaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnspecified => write!(f, "menaMpaaUnspecified"),
+            ContentRatingMenaMpaaRating::MenaMpaaG => write!(f, "menaMpaaG"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg => write!(f, "menaMpaaPg"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg13 => write!(f, "menaMpaaPg13"),
+            ContentRatingMenaMpaaRating::MenaMpaaR => write!(f, "menaMpaaR"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnrated => write!(f, "menaMpaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 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 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 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 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 ChannelStatusPrivacyStatus {
+    Undefined,
+    ///
+    #[serde(rename = "public")]
+    Public,
+    ///
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    ///
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for ChannelStatusPrivacyStatus {
+    fn default() -> ChannelStatusPrivacyStatus {
+        ChannelStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            ChannelStatusPrivacyStatus::Public => write!(f, "public"),
+            ChannelStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            ChannelStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelStatusLongUploadsStatus {
+    Undefined,
+    ///
+    #[serde(rename = "longUploadsUnspecified")]
+    LongUploadsUnspecified,
+    ///
+    #[serde(rename = "allowed")]
+    Allowed,
+    ///
+    #[serde(rename = "eligible")]
+    Eligible,
+    ///
+    #[serde(rename = "disallowed")]
+    Disallowed,
+}
+
+impl std::default::Default for ChannelStatusLongUploadsStatus {
+    fn default() -> ChannelStatusLongUploadsStatus {
+        ChannelStatusLongUploadsStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelStatusLongUploadsStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelStatusLongUploadsStatus::Undefined => write!(f, "undefined"),
+            ChannelStatusLongUploadsStatus::LongUploadsUnspecified => {
+                write!(f, "longUploadsUnspecified")
+            }
+            ChannelStatusLongUploadsStatus::Allowed => write!(f, "allowed"),
+            ChannelStatusLongUploadsStatus::Eligible => write!(f, "eligible"),
+            ChannelStatusLongUploadsStatus::Disallowed => write!(f, "disallowed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 ThirdPartyLinkSnippetType {
     Undefined,
     ///
     #[serde(rename = "linkUnspecified")]
@@ -10898,46 +10488,330 @@
     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"),
+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 CdnSettingsResolution {
+    Undefined,
+    ///
+    #[serde(rename = "240p")]
+    _240p,
+    ///
+    #[serde(rename = "360p")]
+    _360p,
+    ///
+    #[serde(rename = "480p")]
+    _480p,
+    ///
+    #[serde(rename = "720p")]
+    _720p,
+    ///
+    #[serde(rename = "1080p")]
+    _1080p,
+    ///
+    #[serde(rename = "1440p")]
+    _1440p,
+    ///
+    #[serde(rename = "2160p")]
+    _2160p,
+    ///
+    #[serde(rename = "variable")]
+    Variable,
+}
+
+impl std::default::Default for CdnSettingsResolution {
+    fn default() -> CdnSettingsResolution {
+        CdnSettingsResolution::Undefined
+    }
+}
+
+impl std::fmt::Display for CdnSettingsResolution {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CdnSettingsResolution::Undefined => write!(f, "undefined"),
+            CdnSettingsResolution::_240p => write!(f, "240p"),
+            CdnSettingsResolution::_360p => write!(f, "360p"),
+            CdnSettingsResolution::_480p => write!(f, "480p"),
+            CdnSettingsResolution::_720p => write!(f, "720p"),
+            CdnSettingsResolution::_1080p => write!(f, "1080p"),
+            CdnSettingsResolution::_1440p => write!(f, "1440p"),
+            CdnSettingsResolution::_2160p => write!(f, "2160p"),
+            CdnSettingsResolution::Variable => write!(f, "variable"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 CdnSettingsIngestionType {
+    Undefined,
+    ///
+    #[serde(rename = "rtmp")]
+    Rtmp,
+    ///
+    #[serde(rename = "dash")]
+    Dash,
+    ///
+    #[serde(rename = "webrtc")]
+    Webrtc,
+    ///
+    #[serde(rename = "hls")]
+    Hls,
+}
+
+impl std::default::Default for CdnSettingsIngestionType {
+    fn default() -> CdnSettingsIngestionType {
+        CdnSettingsIngestionType::Undefined
+    }
+}
+
+impl std::fmt::Display for CdnSettingsIngestionType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CdnSettingsIngestionType::Undefined => write!(f, "undefined"),
+            CdnSettingsIngestionType::Rtmp => write!(f, "rtmp"),
+            CdnSettingsIngestionType::Dash => write!(f, "dash"),
+            CdnSettingsIngestionType::Webrtc => write!(f, "webrtc"),
+            CdnSettingsIngestionType::Hls => write!(f, "hls"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 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 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 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(())
     }
@@ -11046,6 +10920,752 @@
 }
 
 #[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 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 CommentsSetModerationStatusModerationStatus {
+    Undefined,
+    /// The comment is available for public display.
+    #[serde(rename = "published")]
+    Published,
+    /// The comment is awaiting review by a moderator.
+    #[serde(rename = "heldForReview")]
+    HeldForReview,
+    ///
+    #[serde(rename = "likelySpam")]
+    LikelySpam,
+    /// The comment is unfit for display.
+    #[serde(rename = "rejected")]
+    Rejected,
+}
+
+impl std::default::Default for CommentsSetModerationStatusModerationStatus {
+    fn default() -> CommentsSetModerationStatusModerationStatus {
+        CommentsSetModerationStatusModerationStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentsSetModerationStatusModerationStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentsSetModerationStatusModerationStatus::Undefined => write!(f, "undefined"),
+            CommentsSetModerationStatusModerationStatus::Published => write!(f, "published"),
+            CommentsSetModerationStatusModerationStatus::HeldForReview => {
+                write!(f, "heldForReview")
+            }
+            CommentsSetModerationStatusModerationStatus::LikelySpam => write!(f, "likelySpam"),
+            CommentsSetModerationStatusModerationStatus::Rejected => write!(f, "rejected"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentsListTextFormat {
+    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 CommentsListTextFormat {
+    fn default() -> CommentsListTextFormat {
+        CommentsListTextFormat::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentsListTextFormat {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentsListTextFormat::Undefined => write!(f, "undefined"),
+            CommentsListTextFormat::TextFormatUnspecified => write!(f, "textFormatUnspecified"),
+            CommentsListTextFormat::Html => write!(f, "html"),
+            CommentsListTextFormat::PlainText => write!(f, "plainText"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum MembersListMode {
+    Undefined,
+    ///
+    #[serde(rename = "listMembersModeUnknown")]
+    ListMembersModeUnknown,
+    /// Return only members that joined after the first call with this mode was made.
+    #[serde(rename = "updates")]
+    Updates,
+    /// Return all current members, from newest to oldest.
+    #[serde(rename = "all_current")]
+    All_current,
+}
+
+impl std::default::Default for MembersListMode {
+    fn default() -> MembersListMode {
+        MembersListMode::Undefined
+    }
+}
+
+impl std::fmt::Display for MembersListMode {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            MembersListMode::Undefined => write!(f, "undefined"),
+            MembersListMode::ListMembersModeUnknown => write!(f, "listMembersModeUnknown"),
+            MembersListMode::Updates => write!(f, "updates"),
+            MembersListMode::All_current => write!(f, "all_current"),
+        };
+        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 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 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 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 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 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 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 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 SearchListSafeSearch {
+    Undefined,
+    ///
+    #[serde(rename = "safeSearchSettingUnspecified")]
+    SafeSearchSettingUnspecified,
+    /// YouTube will not filter the search result set.
+    #[serde(rename = "none")]
+    None,
+    /// YouTube will filter some content from search results and, at the least, will filter content that is restricted in your locale. Based on their content, search results could be removed from search results or demoted in search results. This is the default parameter value.
+    #[serde(rename = "moderate")]
+    Moderate,
+    /// YouTube will try to exclude all restricted content from the search result set. Based on their content, search results could be removed from search results or demoted in search results.
+    #[serde(rename = "strict")]
+    Strict,
+}
+
+impl std::default::Default for SearchListSafeSearch {
+    fn default() -> SearchListSafeSearch {
+        SearchListSafeSearch::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListSafeSearch {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListSafeSearch::Undefined => write!(f, "undefined"),
+            SearchListSafeSearch::SafeSearchSettingUnspecified => {
+                write!(f, "safeSearchSettingUnspecified")
+            }
+            SearchListSafeSearch::None => write!(f, "none"),
+            SearchListSafeSearch::Moderate => write!(f, "moderate"),
+            SearchListSafeSearch::Strict => write!(f, "strict"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoType {
+    Undefined,
+    ///
+    #[serde(rename = "videoTypeUnspecified")]
+    VideoTypeUnspecified,
+    /// Return all videos.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve movies.
+    #[serde(rename = "movie")]
+    Movie,
+    /// Only retrieve episodes of shows.
+    #[serde(rename = "episode")]
+    Episode,
+}
+
+impl std::default::Default for SearchListVideoType {
+    fn default() -> SearchListVideoType {
+        SearchListVideoType::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoType::Undefined => write!(f, "undefined"),
+            SearchListVideoType::VideoTypeUnspecified => write!(f, "videoTypeUnspecified"),
+            SearchListVideoType::Any => write!(f, "any"),
+            SearchListVideoType::Movie => write!(f, "movie"),
+            SearchListVideoType::Episode => write!(f, "episode"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoEmbeddable {
+    Undefined,
+    ///
+    #[serde(rename = "videoEmbeddableUnspecified")]
+    VideoEmbeddableUnspecified,
+    /// Return all videos, embeddable or not.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve embeddable videos.
+    #[serde(rename = "true")]
+    True,
+}
+
+impl std::default::Default for SearchListVideoEmbeddable {
+    fn default() -> SearchListVideoEmbeddable {
+        SearchListVideoEmbeddable::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoEmbeddable {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoEmbeddable::Undefined => write!(f, "undefined"),
+            SearchListVideoEmbeddable::VideoEmbeddableUnspecified => {
+                write!(f, "videoEmbeddableUnspecified")
+            }
+            SearchListVideoEmbeddable::Any => write!(f, "any"),
+            SearchListVideoEmbeddable::True => write!(f, "true"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 LiveBroadcastsTransitionBroadcastStatus {
+    Undefined,
+    ///
+    #[serde(rename = "statusUnspecified")]
+    StatusUnspecified,
+    /// Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream. Note that you can only transition a broadcast to the testing state if its contentDetails.monitorStream.enableMonitorStream property is set to true.",
+    #[serde(rename = "testing")]
+    Testing,
+    /// Return only persistent broadcasts.
+    #[serde(rename = "live")]
+    Live,
+    /// The broadcast is over. YouTube stops transmitting video.
+    #[serde(rename = "complete")]
+    Complete,
+}
+
+impl std::default::Default for LiveBroadcastsTransitionBroadcastStatus {
+    fn default() -> LiveBroadcastsTransitionBroadcastStatus {
+        LiveBroadcastsTransitionBroadcastStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsTransitionBroadcastStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsTransitionBroadcastStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastsTransitionBroadcastStatus::StatusUnspecified => {
+                write!(f, "statusUnspecified")
+            }
+            LiveBroadcastsTransitionBroadcastStatus::Testing => write!(f, "testing"),
+            LiveBroadcastsTransitionBroadcastStatus::Live => write!(f, "live"),
+            LiveBroadcastsTransitionBroadcastStatus::Complete => write!(f, "complete"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsListBroadcastType {
+    Undefined,
+    ///
+    #[serde(rename = "broadcastTypeFilterUnspecified")]
+    BroadcastTypeFilterUnspecified,
+    /// Return all broadcasts.
+    #[serde(rename = "all")]
+    All,
+    /// Return only scheduled event broadcasts.
+    #[serde(rename = "event")]
+    Event,
+    /// Return only persistent broadcasts.
+    #[serde(rename = "persistent")]
+    Persistent,
+}
+
+impl std::default::Default for LiveBroadcastsListBroadcastType {
+    fn default() -> LiveBroadcastsListBroadcastType {
+        LiveBroadcastsListBroadcastType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsListBroadcastType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsListBroadcastType::Undefined => write!(f, "undefined"),
+            LiveBroadcastsListBroadcastType::BroadcastTypeFilterUnspecified => {
+                write!(f, "broadcastTypeFilterUnspecified")
+            }
+            LiveBroadcastsListBroadcastType::All => write!(f, "all"),
+            LiveBroadcastsListBroadcastType::Event => write!(f, "event"),
+            LiveBroadcastsListBroadcastType::Persistent => write!(f, "persistent"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsListBroadcastStatus {
+    Undefined,
+    ///
+    #[serde(rename = "broadcastStatusFilterUnspecified")]
+    BroadcastStatusFilterUnspecified,
+    /// Return all broadcasts.
+    #[serde(rename = "all")]
+    All,
+    /// Return current live broadcasts.
+    #[serde(rename = "active")]
+    Active,
+    /// Return broadcasts that have not yet started.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+    /// Return broadcasts that have already ended.
+    #[serde(rename = "completed")]
+    Completed,
+}
+
+impl std::default::Default for LiveBroadcastsListBroadcastStatus {
+    fn default() -> LiveBroadcastsListBroadcastStatus {
+        LiveBroadcastsListBroadcastStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsListBroadcastStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsListBroadcastStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastsListBroadcastStatus::BroadcastStatusFilterUnspecified => {
+                write!(f, "broadcastStatusFilterUnspecified")
+            }
+            LiveBroadcastsListBroadcastStatus::All => write!(f, "all"),
+            LiveBroadcastsListBroadcastStatus::Active => write!(f, "active"),
+            LiveBroadcastsListBroadcastStatus::Upcoming => write!(f, "upcoming"),
+            LiveBroadcastsListBroadcastStatus::Completed => write!(f, "completed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum VideosRateRating {
     Undefined,
     ///
@@ -11138,626 +11758,6 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsListBroadcastStatus {
-    Undefined,
-    ///
-    #[serde(rename = "broadcastStatusFilterUnspecified")]
-    BroadcastStatusFilterUnspecified,
-    /// Return all broadcasts.
-    #[serde(rename = "all")]
-    All,
-    /// Return current live broadcasts.
-    #[serde(rename = "active")]
-    Active,
-    /// Return broadcasts that have not yet started.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// Return broadcasts that have already ended.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for LiveBroadcastsListBroadcastStatus {
-    fn default() -> LiveBroadcastsListBroadcastStatus {
-        LiveBroadcastsListBroadcastStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsListBroadcastStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsListBroadcastStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastsListBroadcastStatus::BroadcastStatusFilterUnspecified => {
-                write!(f, "broadcastStatusFilterUnspecified")
-            }
-            LiveBroadcastsListBroadcastStatus::All => write!(f, "all"),
-            LiveBroadcastsListBroadcastStatus::Active => write!(f, "active"),
-            LiveBroadcastsListBroadcastStatus::Upcoming => write!(f, "upcoming"),
-            LiveBroadcastsListBroadcastStatus::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsListBroadcastType {
-    Undefined,
-    ///
-    #[serde(rename = "broadcastTypeFilterUnspecified")]
-    BroadcastTypeFilterUnspecified,
-    /// Return all broadcasts.
-    #[serde(rename = "all")]
-    All,
-    /// Return only scheduled event broadcasts.
-    #[serde(rename = "event")]
-    Event,
-    /// Return only persistent broadcasts.
-    #[serde(rename = "persistent")]
-    Persistent,
-}
-
-impl std::default::Default for LiveBroadcastsListBroadcastType {
-    fn default() -> LiveBroadcastsListBroadcastType {
-        LiveBroadcastsListBroadcastType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsListBroadcastType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsListBroadcastType::Undefined => write!(f, "undefined"),
-            LiveBroadcastsListBroadcastType::BroadcastTypeFilterUnspecified => {
-                write!(f, "broadcastTypeFilterUnspecified")
-            }
-            LiveBroadcastsListBroadcastType::All => write!(f, "all"),
-            LiveBroadcastsListBroadcastType::Event => write!(f, "event"),
-            LiveBroadcastsListBroadcastType::Persistent => write!(f, "persistent"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsTransitionBroadcastStatus {
-    Undefined,
-    ///
-    #[serde(rename = "statusUnspecified")]
-    StatusUnspecified,
-    /// Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream. Note that you can only transition a broadcast to the testing state if its contentDetails.monitorStream.enableMonitorStream property is set to true.",
-    #[serde(rename = "testing")]
-    Testing,
-    /// Return only persistent broadcasts.
-    #[serde(rename = "live")]
-    Live,
-    /// The broadcast is over. YouTube stops transmitting video.
-    #[serde(rename = "complete")]
-    Complete,
-}
-
-impl std::default::Default for LiveBroadcastsTransitionBroadcastStatus {
-    fn default() -> LiveBroadcastsTransitionBroadcastStatus {
-        LiveBroadcastsTransitionBroadcastStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsTransitionBroadcastStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsTransitionBroadcastStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastsTransitionBroadcastStatus::StatusUnspecified => {
-                write!(f, "statusUnspecified")
-            }
-            LiveBroadcastsTransitionBroadcastStatus::Testing => write!(f, "testing"),
-            LiveBroadcastsTransitionBroadcastStatus::Live => write!(f, "live"),
-            LiveBroadcastsTransitionBroadcastStatus::Complete => write!(f, "complete"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SubscriptionsListOrder {
-    Undefined,
-    ///
-    #[serde(rename = "subscriptionOrderUnspecified")]
-    SubscriptionOrderUnspecified,
-    /// Sort by relevance.
-    #[serde(rename = "relevance")]
-    Relevance,
-    /// Sort by order of activity.
-    #[serde(rename = "unread")]
-    Unread,
-    /// Sort alphabetically.
-    #[serde(rename = "alphabetical")]
-    Alphabetical,
-}
-
-impl std::default::Default for SubscriptionsListOrder {
-    fn default() -> SubscriptionsListOrder {
-        SubscriptionsListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for SubscriptionsListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SubscriptionsListOrder::Undefined => write!(f, "undefined"),
-            SubscriptionsListOrder::SubscriptionOrderUnspecified => {
-                write!(f, "subscriptionOrderUnspecified")
-            }
-            SubscriptionsListOrder::Relevance => write!(f, "relevance"),
-            SubscriptionsListOrder::Unread => write!(f, "unread"),
-            SubscriptionsListOrder::Alphabetical => write!(f, "alphabetical"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListSafeSearch {
-    Undefined,
-    ///
-    #[serde(rename = "safeSearchSettingUnspecified")]
-    SafeSearchSettingUnspecified,
-    /// YouTube will not filter the search result set.
-    #[serde(rename = "none")]
-    None,
-    /// YouTube will filter some content from search results and, at the least, will filter content that is restricted in your locale. Based on their content, search results could be removed from search results or demoted in search results. This is the default parameter value.
-    #[serde(rename = "moderate")]
-    Moderate,
-    /// YouTube will try to exclude all restricted content from the search result set. Based on their content, search results could be removed from search results or demoted in search results.
-    #[serde(rename = "strict")]
-    Strict,
-}
-
-impl std::default::Default for SearchListSafeSearch {
-    fn default() -> SearchListSafeSearch {
-        SearchListSafeSearch::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListSafeSearch {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListSafeSearch::Undefined => write!(f, "undefined"),
-            SearchListSafeSearch::SafeSearchSettingUnspecified => {
-                write!(f, "safeSearchSettingUnspecified")
-            }
-            SearchListSafeSearch::None => write!(f, "none"),
-            SearchListSafeSearch::Moderate => write!(f, "moderate"),
-            SearchListSafeSearch::Strict => write!(f, "strict"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoLicense {
-    Undefined,
-    /// Return all videos, regardless of which license they have, that match the query parameters.
-    #[serde(rename = "any")]
-    Any,
-    /// Only return videos that have the standard YouTube license.
-    #[serde(rename = "youtube")]
-    Youtube,
-    /// Only return videos that have a Creative Commons license. Users can reuse videos with this license in other videos that they create. Learn more.
-    #[serde(rename = "creativeCommon")]
-    CreativeCommon,
-}
-
-impl std::default::Default for SearchListVideoLicense {
-    fn default() -> SearchListVideoLicense {
-        SearchListVideoLicense::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoLicense {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoLicense::Undefined => write!(f, "undefined"),
-            SearchListVideoLicense::Any => write!(f, "any"),
-            SearchListVideoLicense::Youtube => write!(f, "youtube"),
-            SearchListVideoLicense::CreativeCommon => write!(f, "creativeCommon"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListOrder {
-    Undefined,
-    ///
-    #[serde(rename = "searchSortUnspecified")]
-    SearchSortUnspecified,
-    /// Resources are sorted in reverse chronological order based on the date they were created.
-    #[serde(rename = "date")]
-    Date,
-    /// Resources are sorted from highest to lowest rating.
-    #[serde(rename = "rating")]
-    Rating,
-    /// Resources are sorted from highest to lowest number of views.
-    #[serde(rename = "viewCount")]
-    ViewCount,
-    /// Resources are sorted based on their relevance to the search query. This is the default value for this parameter.
-    #[serde(rename = "relevance")]
-    Relevance,
-    /// Resources are sorted alphabetically by title.
-    #[serde(rename = "title")]
-    Title,
-    /// Channels are sorted in descending order of their number of uploaded videos.
-    #[serde(rename = "videoCount")]
-    VideoCount,
-}
-
-impl std::default::Default for SearchListOrder {
-    fn default() -> SearchListOrder {
-        SearchListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListOrder::Undefined => write!(f, "undefined"),
-            SearchListOrder::SearchSortUnspecified => write!(f, "searchSortUnspecified"),
-            SearchListOrder::Date => write!(f, "date"),
-            SearchListOrder::Rating => write!(f, "rating"),
-            SearchListOrder::ViewCount => write!(f, "viewCount"),
-            SearchListOrder::Relevance => write!(f, "relevance"),
-            SearchListOrder::Title => write!(f, "title"),
-            SearchListOrder::VideoCount => write!(f, "videoCount"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListEventType {
-    Undefined,
-    ///
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for SearchListEventType {
-    fn default() -> SearchListEventType {
-        SearchListEventType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListEventType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListEventType::Undefined => write!(f, "undefined"),
-            SearchListEventType::None => write!(f, "none"),
-            SearchListEventType::Upcoming => write!(f, "upcoming"),
-            SearchListEventType::Live => write!(f, "live"),
-            SearchListEventType::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDefinition {
-    Undefined,
-    /// Return all videos, regardless of their resolution.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve videos in standard definition.
-    #[serde(rename = "standard")]
-    Standard,
-    /// Only retrieve HD videos.
-    #[serde(rename = "high")]
-    High,
-}
-
-impl std::default::Default for SearchListVideoDefinition {
-    fn default() -> SearchListVideoDefinition {
-        SearchListVideoDefinition::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDefinition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDefinition::Undefined => write!(f, "undefined"),
-            SearchListVideoDefinition::Any => write!(f, "any"),
-            SearchListVideoDefinition::Standard => write!(f, "standard"),
-            SearchListVideoDefinition::High => write!(f, "high"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoEmbeddable {
-    Undefined,
-    ///
-    #[serde(rename = "videoEmbeddableUnspecified")]
-    VideoEmbeddableUnspecified,
-    /// Return all videos, embeddable or not.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve embeddable videos.
-    #[serde(rename = "true")]
-    True,
-}
-
-impl std::default::Default for SearchListVideoEmbeddable {
-    fn default() -> SearchListVideoEmbeddable {
-        SearchListVideoEmbeddable::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoEmbeddable {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoEmbeddable::Undefined => write!(f, "undefined"),
-            SearchListVideoEmbeddable::VideoEmbeddableUnspecified => {
-                write!(f, "videoEmbeddableUnspecified")
-            }
-            SearchListVideoEmbeddable::Any => write!(f, "any"),
-            SearchListVideoEmbeddable::True => write!(f, "true"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoType {
-    Undefined,
-    ///
-    #[serde(rename = "videoTypeUnspecified")]
-    VideoTypeUnspecified,
-    /// Return all videos.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve movies.
-    #[serde(rename = "movie")]
-    Movie,
-    /// Only retrieve episodes of shows.
-    #[serde(rename = "episode")]
-    Episode,
-}
-
-impl std::default::Default for SearchListVideoType {
-    fn default() -> SearchListVideoType {
-        SearchListVideoType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoType::Undefined => write!(f, "undefined"),
-            SearchListVideoType::VideoTypeUnspecified => write!(f, "videoTypeUnspecified"),
-            SearchListVideoType::Any => write!(f, "any"),
-            SearchListVideoType::Movie => write!(f, "movie"),
-            SearchListVideoType::Episode => write!(f, "episode"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListChannelType {
-    Undefined,
-    ///
-    #[serde(rename = "channelTypeUnspecified")]
-    ChannelTypeUnspecified,
-    /// Return all channels.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve shows.
-    #[serde(rename = "show")]
-    Show,
-}
-
-impl std::default::Default for SearchListChannelType {
-    fn default() -> SearchListChannelType {
-        SearchListChannelType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListChannelType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListChannelType::Undefined => write!(f, "undefined"),
-            SearchListChannelType::ChannelTypeUnspecified => write!(f, "channelTypeUnspecified"),
-            SearchListChannelType::Any => write!(f, "any"),
-            SearchListChannelType::Show => write!(f, "show"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoCaption {
-    Undefined,
-    ///
-    #[serde(rename = "videoCaptionUnspecified")]
-    VideoCaptionUnspecified,
-    /// Do not filter results based on caption availability.
-    #[serde(rename = "any")]
-    Any,
-    /// Only include videos that have captions.
-    #[serde(rename = "closedCaption")]
-    ClosedCaption,
-    /// Only include videos that do not have captions.
-    #[serde(rename = "none")]
-    None,
-}
-
-impl std::default::Default for SearchListVideoCaption {
-    fn default() -> SearchListVideoCaption {
-        SearchListVideoCaption::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoCaption {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoCaption::Undefined => write!(f, "undefined"),
-            SearchListVideoCaption::VideoCaptionUnspecified => write!(f, "videoCaptionUnspecified"),
-            SearchListVideoCaption::Any => write!(f, "any"),
-            SearchListVideoCaption::ClosedCaption => write!(f, "closedCaption"),
-            SearchListVideoCaption::None => write!(f, "none"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDimension {
-    Undefined,
-    ///
-    #[serde(rename = "any")]
-    Any,
-    /// Restrict search results to exclude 3D videos.
-    #[serde(rename = "2d")]
-    _2d,
-    /// Restrict search results to only include 3D videos.
-    #[serde(rename = "3d")]
-    _3d,
-}
-
-impl std::default::Default for SearchListVideoDimension {
-    fn default() -> SearchListVideoDimension {
-        SearchListVideoDimension::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDimension {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDimension::Undefined => write!(f, "undefined"),
-            SearchListVideoDimension::Any => write!(f, "any"),
-            SearchListVideoDimension::_2d => write!(f, "2d"),
-            SearchListVideoDimension::_3d => write!(f, "3d"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDuration {
-    Undefined,
-    ///
-    #[serde(rename = "videoDurationUnspecified")]
-    VideoDurationUnspecified,
-    /// Do not filter video search results based on their duration. This is the default value.
-    #[serde(rename = "any")]
-    Any,
-    /// Only include videos that are less than four minutes long.
-    #[serde(rename = "short")]
-    Short,
-    /// Only include videos that are between four and 20 minutes long (inclusive).
-    #[serde(rename = "medium")]
-    Medium,
-    /// Only include videos longer than 20 minutes.
-    #[serde(rename = "long")]
-    Long,
-}
-
-impl std::default::Default for SearchListVideoDuration {
-    fn default() -> SearchListVideoDuration {
-        SearchListVideoDuration::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDuration {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDuration::Undefined => write!(f, "undefined"),
-            SearchListVideoDuration::VideoDurationUnspecified => {
-                write!(f, "videoDurationUnspecified")
-            }
-            SearchListVideoDuration::Any => write!(f, "any"),
-            SearchListVideoDuration::Short => write!(f, "short"),
-            SearchListVideoDuration::Medium => write!(f, "medium"),
-            SearchListVideoDuration::Long => write!(f, "long"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoSyndicated {
-    Undefined,
-    ///
-    #[serde(rename = "videoSyndicatedUnspecified")]
-    VideoSyndicatedUnspecified,
-    /// Return all videos, syndicated or not.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve syndicated videos.
-    #[serde(rename = "true")]
-    True,
-}
-
-impl std::default::Default for SearchListVideoSyndicated {
-    fn default() -> SearchListVideoSyndicated {
-        SearchListVideoSyndicated::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoSyndicated {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoSyndicated::Undefined => write!(f, "undefined"),
-            SearchListVideoSyndicated::VideoSyndicatedUnspecified => {
-                write!(f, "videoSyndicatedUnspecified")
-            }
-            SearchListVideoSyndicated::Any => write!(f, "any"),
-            SearchListVideoSyndicated::True => write!(f, "true"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum MembersListMode {
-    Undefined,
-    ///
-    #[serde(rename = "listMembersModeUnknown")]
-    ListMembersModeUnknown,
-    /// Return only members that joined after the first call with this mode was made.
-    #[serde(rename = "updates")]
-    Updates,
-    /// Return all current members, from newest to oldest.
-    #[serde(rename = "all_current")]
-    All_current,
-}
-
-impl std::default::Default for MembersListMode {
-    fn default() -> MembersListMode {
-        MembersListMode::Undefined
-    }
-}
-
-impl std::fmt::Display for MembersListMode {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            MembersListMode::Undefined => write!(f, "undefined"),
-            MembersListMode::ListMembersModeUnknown => write!(f, "listMembersModeUnknown"),
-            MembersListMode::Updates => write!(f, "updates"),
-            MembersListMode::All_current => write!(f, "all_current"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum YoutubeParamsAlt {
     Undefined,
     /// Responses with Content-Type of application/json
@@ -11817,1050 +11817,9 @@
     }
 }
 
-/// 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 *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-}
-
-impl std::fmt::Display for CommentsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.parent_id {
-            write!(
-                f,
-                "&parentId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.text_format {
-            write!(
-                f,
-                "&textFormat={}",
-                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.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 {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// 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,
-}
-
-impl std::fmt::Display for CommentsSetModerationStatusParams {
-    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,
-            "&moderationStatus={}",
-            percent_encode(
-                format!("{}", self.moderation_status).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        if let Some(ref v) = self.ban_author {
-            write!(
-                f,
-                "&banAuthor={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsDeleteParams {
-    /// 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 CommentsDeleteParams {
-    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 `thirdPartyLinks.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for ThirdPartyLinksUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `thirdPartyLinks.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for ThirdPartyLinksInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `thirdPartyLinks.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Get a third party link with the given linking token.
-    #[serde(rename = "linkingToken")]
-    pub linking_token: Option<String>,
-    /// The *part* parameter specifies the thirdPartyLink resource parts that the API response will include. Supported values are linkingToken, status, and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Get a third party link of the given type.
-    #[serde(rename = "type")]
-    pub typ: Option<ThirdPartyLinksListType>,
-}
-
-impl std::fmt::Display for ThirdPartyLinksListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.linking_token {
-            write!(
-                f,
-                "&linkingToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.typ {
-            write!(
-                f,
-                "&type={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `thirdPartyLinks.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinksDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Type of the link to be deleted.
-    #[serde(rename = "type")]
-    pub typ: ThirdPartyLinksDeleteType,
-    /// Delete the partner links with the given linking token.
-    #[serde(rename = "linkingToken")]
-    pub linking_token: String,
-    /// Do not use. Required for compatibility.
-    #[serde(rename = "part")]
-    pub part: Option<String>,
-}
-
-impl std::fmt::Display for ThirdPartyLinksDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&type={}",
-            percent_encode(format!("{}", self.typ).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&linkingToken={}",
-            percent_encode(
-                format!("{}", self.linking_token).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        if let Some(ref v) = self.part {
-            write!(
-                f,
-                "&part={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveChatMessagesDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the liveChatComment resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The id of the live chat for which comments should be returned.
-    #[serde(rename = "liveChatId")]
-    pub live_chat_id: String,
-    /// Specifies the size of the profile image that should be returned for each user.
-    #[serde(rename = "profileImageSize")]
-    pub profile_image_size: Option<u32>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken property identify other pages that could be retrieved.
-    #[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>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-}
-
-impl std::fmt::Display for LiveChatMessagesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&liveChatId={}",
-            percent_encode(
-                format!("{}", self.live_chat_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        if let Some(ref v) = self.profile_image_size {
-            write!(
-                f,
-                "&profileImageSize={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes. It identifies the properties that the write operation will set as well as the properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatMessagesInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentThreadsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies a comma-separated list of one or more commentThread resource properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "order")]
-    pub order: Option<CommentThreadsListOrder>,
-    /// Returns the comment threads with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Limits the returned comment threads to those matching the specified key words. Not compatible with the 'id' filter.
-    #[serde(rename = "searchTerms")]
-    pub search_terms: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: Option<CommentThreadsListTextFormat>,
-    /// Limits the returned comment threads to those with the specified moderation status. Not compatible with the 'id' filter. Valid values: published, heldForReview, likelySpam.
-    #[serde(rename = "moderationStatus")]
-    pub moderation_status: Option<CommentThreadsListModerationStatus>,
-    /// Returns the comment threads of the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: Option<String>,
-    /// Returns the comment threads for all the channel comments (ie does not include comments left on videos).
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Returns the comment threads of all videos of the channel and the channel comments as well.
-    #[serde(rename = "allThreadsRelatedToChannelId")]
-    pub all_threads_related_to_channel_id: Option<String>,
-}
-
-impl std::fmt::Display for CommentThreadsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.search_terms {
-            write!(
-                f,
-                "&searchTerms={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                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(())
-    }
-}
-
-/// Parameters for the `channelSections.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for ChannelSectionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsDeleteParams {
+/// 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>,
@@ -12871,1507 +11830,6 @@
     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 *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-}
-
-impl std::fmt::Display for LiveStreamsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&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={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.broadcast_status {
-            write!(
-                f,
-                "&broadcastStatus={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.broadcast_type {
-            write!(
-                f,
-                "&broadcastType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsUpdateParams {
-    /// 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()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.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,
-    /// *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!(
@@ -14390,150 +11848,6 @@
     }
 }
 
-/// Parameters for the `playlists.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Return the playlists with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Returen content in specified language
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more playlist resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlist resource, the snippet property contains properties like author, title, description, tags, and timeCreated. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the playlists owned by the specified channel ID.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Return the playlists owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-}
-
-impl std::fmt::Display for PlaylistsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlists.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
 /// Parameters for the `playlists.update` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct PlaylistsUpdateParams {
@@ -14566,6 +11880,632 @@
     }
 }
 
+/// 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>,
+    /// 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>,
+    /// 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 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.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 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 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>,
+    /// Returen content in specified language
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *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 owned by the authenticated user.
+    #[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>,
+    /// 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 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.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.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.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()
+            )?;
+        }
+        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>,
+    /// 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 content in specified language
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// Return the ChannelSections with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Return the ChannelSections owned by the specified channel ID.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Return the ChannelSections owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+}
+
+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.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.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                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()
+            )?;
+        }
+        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()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelSections.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// 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 names that you can include in the parameter value are snippet and contentDetails.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ChannelSectionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_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 `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 `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 `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 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>,
+}
+
+impl std::fmt::Display for LiveChatModeratorsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&liveChatId={}",
+            percent_encode(
+                format!("{}", self.live_chat_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        if let Some(ref v) = self.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 `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 `commentThreads.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentThreadsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `commentThreads.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies a comma-separated list of commentThread resource properties that the API response will include. You must at least include the snippet part in the parameter value since that part contains all of the properties that the API request can update.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentThreadsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// 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>,
+    #[serde(rename = "order")]
+    pub order: Option<CommentThreadsListOrder>,
+    /// The requested text format for the returned comments.
+    #[serde(rename = "textFormat")]
+    pub text_format: Option<CommentThreadsListTextFormat>,
+    /// 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>,
+    /// 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 of the specified video.
+    #[serde(rename = "videoId")]
+    pub video_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>,
+    /// 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 *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,
+    /// 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 with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+}
+
+impl std::fmt::Display for CommentThreadsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.text_format {
+            write!(
+                f,
+                "&textFormat={}",
+                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.search_terms {
+            write!(
+                f,
+                "&searchTerms={}",
+                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.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.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                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.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
 /// Parameters for the `subscriptions.insert` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct SubscriptionsInsertParams {
@@ -14615,38 +12555,38 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
+    /// Return the subscriptions with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Flag for returning the subscriptions of the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    #[serde(rename = "myRecentSubscribers")]
+    pub my_recent_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>,
     /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more subscription resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a subscription resource, the snippet property contains other properties, such as a display title for the subscription. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "myRecentSubscribers")]
-    pub my_recent_subscribers: Option<bool>,
+    /// Return the subscriptions of the given channel owner.
+    #[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>,
+    /// Return the subscribers of the given channel owner.
+    #[serde(rename = "mySubscribers")]
+    pub my_subscribers: Option<bool>,
+    /// The *part* parameter specifies a comma-separated list of one or more subscription resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a subscription resource, the snippet property contains other properties, such as a display title for the subscription. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
     /// The order of the returned subscriptions
     #[serde(rename = "order")]
     pub order: Option<SubscriptionsListOrder>,
-    /// Return the subscriptions of the given channel owner.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Flag for returning the subscriptions of the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return the subscribers of the given channel owner.
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// Return the subscriptions with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
     /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
     #[serde(rename = "onBehalfOfContentOwnerChannel")]
     pub on_behalf_of_content_owner_channel: Option<String>,
@@ -14659,6 +12599,27 @@
             "&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.mine {
+            write!(
+                f,
+                "&mine={}",
+                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.for_channel_id {
             write!(
                 f,
@@ -14673,10 +12634,17 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.my_recent_subscribers {
-            write!(
-                f,
-                "&myRecentSubscribers={}",
+        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()
             )?;
         }
@@ -14687,6 +12655,13 @@
                 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.order {
             write!(
                 f,
@@ -14694,6 +12669,483 @@
                 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 `tests.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for TestsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ThirdPartyLinksUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.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>,
+    /// Do not use. Required for compatibility.
+    #[serde(rename = "part")]
+    pub part: Option<String>,
+    /// 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,
+}
+
+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.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Get a third party link of the given type.
+    #[serde(rename = "type")]
+    pub typ: Option<ThirdPartyLinksListType>,
+    /// 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,
+}
+
+impl std::fmt::Display for ThirdPartyLinksListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.typ {
+            write!(
+                f,
+                "&type={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.linking_token {
+            write!(
+                f,
+                "&linkingToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the thirdPartyLink resource parts that the API request and response will include. Supported values are linkingToken, status, and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ThirdPartyLinksInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.setModerationStatus` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsSetModerationStatusParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// 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>,
+    /// Modifies the moderation status of the comments with the given IDs
+    #[serde(rename = "id")]
+    pub id: String,
+    /// Specifies the requested moderation status. Note, comments can be in statuses, which are not available through this call. For example, this call does not allow to mark a comment as 'likely spam'. Valid values: MODERATION_STATUS_PUBLISHED, MODERATION_STATUS_HELD_FOR_REVIEW, MODERATION_STATUS_REJECTED.
+    #[serde(rename = "moderationStatus")]
+    pub moderation_status: CommentsSetModerationStatusModerationStatus,
+}
+
+impl std::fmt::Display for CommentsSetModerationStatusParams {
+    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,
+            "&moderationStatus={}",
+            percent_encode(
+                format!("{}", self.moderation_status).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        if let Some(ref v) = self.ban_author {
+            write!(
+                f,
+                "&banAuthor={}",
+                percent_encode(format!("{}", v).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>,
+    /// The requested text format for the returned comments.
+    #[serde(rename = "textFormat")]
+    pub text_format: Option<CommentsListTextFormat>,
+    /// 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 comments with the given IDs for One Platform.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Returns replies to the specified comment. Note, currently YouTube features only one level of replies (ie replies to top level comments). However replies to replies may be supported in the future.
+    #[serde(rename = "parentId")]
+    pub parent_id: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more comment resource properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.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.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.parent_id {
+            write!(
+                f,
+                "&parentId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsDeleteParams {
+    /// 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 CommentsDeleteParams {
+    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.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.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.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 `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>,
+    /// 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 = "publishedAfter")]
+    pub published_after: Option<String>,
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    #[serde(rename = "publishedBefore")]
+    pub published_before: Option<String>,
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more activity resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in an activity resource, the snippet property contains other properties that identify the type of activity, a display title for the activity, and so forth. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    #[serde(rename = "home")]
+    pub home: Option<bool>,
+}
+
+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.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_after {
+            write!(
+                f,
+                "&publishedAfter={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.channel_id {
             write!(
                 f,
@@ -14701,6 +13153,27 @@
                 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.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                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,
@@ -14708,6 +13181,689 @@
                 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()
+            )?;
+        }
+        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 `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>,
+    /// 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.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>,
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return the playlist items within the given playlist.
+    #[serde(rename = "playlistId")]
+    pub playlist_id: Option<String>,
+    /// Return the playlist items associated with the given video ID.
+    #[serde(rename = "videoId")]
+    pub video_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>,
+    /// *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 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,
+    /// 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.id {
+            write!(
+                f,
+                "&id={}",
+                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.video_id {
+            write!(
+                f,
+                "&videoId={}",
+                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()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which identify the times portion of the video that should play when users watch the video in the playlist. If your request is updating a playlist item that sets these values, and the request's part parameter value includes the contentDetails part, the playlist item's start and end times will be updated to whatever value the request body specifies. If the request body does not specify values, the existing start and end times will be removed and replaced with the default settings.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistItemsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistItemsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `thumbnails.set` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailsSetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Returns the Thumbnail with the given video IDs for Stubby or Apiary.
+    #[serde(rename = "videoId")]
+    pub video_id: String,
+}
+
+impl std::fmt::Display for ThumbnailsSetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&videoId={}",
+            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                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>,
+    /// 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,
+    /// 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>,
+    /// Parameter that specifies which channel members to return.
+    #[serde(rename = "mode")]
+    pub mode: Option<MembersListMode>,
+    /// 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 MembersListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.filter_by_member_channel_id {
+            write!(
+                f,
+                "&filterByMemberChannelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.has_access_to_level {
+            write!(
+                f,
+                "&hasAccessToLevel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mode {
+            write!(
+                f,
+                "&mode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `search.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Add a filter on the channel search.
+    #[serde(rename = "channelType")]
+    pub channel_type: Option<SearchListChannelType>,
+    /// Restrict the search to only retrieve videos uploaded using the project id of the authenticated user.
+    #[serde(rename = "forDeveloper")]
+    pub for_developer: Option<bool>,
+    /// Search for the private videos of the authenticated user.
+    #[serde(rename = "forMine")]
+    pub for_mine: Option<bool>,
+    /// Filter on syndicated videos.
+    #[serde(rename = "videoSyndicated")]
+    pub video_syndicated: Option<SearchListVideoSyndicated>,
+    /// Filter on the definition of the videos.
+    #[serde(rename = "videoDefinition")]
+    pub video_definition: Option<SearchListVideoDefinition>,
+    /// Filter on the livestream status of the videos.
+    #[serde(rename = "eventType")]
+    pub event_type: Option<SearchListEventType>,
+    /// Search related to a resource.
+    #[serde(rename = "relatedToVideoId")]
+    pub related_to_video_id: Option<String>,
+    /// Filter on distance from the location (specified above).
+    #[serde(rename = "locationRadius")]
+    pub location_radius: Option<String>,
+    /// Return results relevant to this language.
+    #[serde(rename = "relevanceLanguage")]
+    pub relevance_language: Option<String>,
+    /// Restrict results to a particular set of resource types from One Platform.
+    #[serde(rename = "type")]
+    pub typ: Option<String>,
+    /// Filter on resources belonging to this channelId.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Display the content as seen by viewers in this country.
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    /// Filter on the license of the videos.
+    #[serde(rename = "videoLicense")]
+    pub video_license: Option<SearchListVideoLicense>,
+    /// 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 3d videos.
+    #[serde(rename = "videoDimension")]
+    pub video_dimension: Option<SearchListVideoDimension>,
+    /// 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,
+    /// 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>,
+    /// Textual search terms to match.
+    #[serde(rename = "q")]
+    pub q: Option<String>,
+    /// Sort order of the results.
+    #[serde(rename = "order")]
+    pub order: Option<SearchListOrder>,
+    /// Filter on the presence of captions on the videos.
+    #[serde(rename = "videoCaption")]
+    pub video_caption: Option<SearchListVideoCaption>,
+    /// Filter on resources published after this date.
+    #[serde(rename = "publishedAfter")]
+    pub published_after: Option<String>,
+    /// Filter on resources published before this date.
+    #[serde(rename = "publishedBefore")]
+    pub published_before: Option<String>,
+    /// 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 videos of a specific type.
+    #[serde(rename = "videoType")]
+    pub video_type: Option<SearchListVideoType>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Filter on embeddable videos.
+    #[serde(rename = "videoEmbeddable")]
+    pub video_embeddable: Option<SearchListVideoEmbeddable>,
+    /// Search owned by a content owner.
+    #[serde(rename = "forContentOwner")]
+    pub for_content_owner: Option<bool>,
+    /// Filter on the duration of the videos.
+    #[serde(rename = "videoDuration")]
+    pub video_duration: Option<SearchListVideoDuration>,
+    /// Filter on location of the video
+    #[serde(rename = "location")]
+    pub location: Option<String>,
+    /// Filter on videos in a specific category.
+    #[serde(rename = "videoCategoryId")]
+    pub video_category_id: Option<String>,
+}
+
+impl std::fmt::Display for SearchListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.channel_type {
+            write!(
+                f,
+                "&channelType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_developer {
+            write!(
+                f,
+                "&forDeveloper={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_mine {
+            write!(
+                f,
+                "&forMine={}",
+                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()
+            )?;
+        }
+        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.event_type {
+            write!(
+                f,
+                "&eventType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.related_to_video_id {
+            write!(
+                f,
+                "&relatedToVideoId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.location_radius {
+            write!(
+                f,
+                "&locationRadius={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.relevance_language {
+            write!(
+                f,
+                "&relevanceLanguage={}",
+                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.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_license {
+            write!(
+                f,
+                "&videoLicense={}",
+                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_dimension {
+            write!(
+                f,
+                "&videoDimension={}",
+                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.q {
+            write!(
+                f,
+                "&q={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_caption {
+            write!(
+                f,
+                "&videoCaption={}",
+                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.published_before {
+            write!(
+                f,
+                "&publishedBefore={}",
+                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={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_type {
+            write!(
+                f,
+                "&videoType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_embeddable {
+            write!(
+                f,
+                "&videoEmbeddable={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_content_owner {
+            write!(
+                f,
+                "&forContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_duration {
+            write!(
+                f,
+                "&videoDuration={}",
+                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_category_id {
+            write!(
+                f,
+                "&videoCategoryId={}",
+                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>,
+    /// Return the channels subscribed to the authenticated user
+    #[serde(rename = "mySubscribers")]
+    pub my_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>,
+    /// Return the channel associated with a YouTube username.
+    #[serde(rename = "forUsername")]
+    pub for_username: Option<String>,
+    /// Return the channels with the specified IDs.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Return the channels within the specified guide category ID.
+    #[serde(rename = "categoryId")]
+    pub 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>,
+    /// The *part* parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set *part=contentDetails*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return the ids of channels owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// Return the channels managed by the authenticated user.
+    #[serde(rename = "managedByMe")]
+    pub managed_by_me: Option<bool>,
+}
+
+impl std::fmt::Display for ChannelsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
         if let Some(ref v) = self.my_subscribers {
             write!(
                 f,
@@ -14715,6 +13871,20 @@
                 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.for_username {
+            write!(
+                f,
+                "&forUsername={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.id {
             write!(
                 f,
@@ -14722,6 +13892,415 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.category_id {
+            write!(
+                f,
+                "&categoryId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.managed_by_me {
+            write!(
+                f,
+                "&managedByMe={}",
+                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 *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,
+    /// 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>,
+}
+
+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 `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>,
+    /// 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,
+    /// *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 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.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>,
+    /// 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,
+    /// 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>,
+}
+
+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.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>,
+    /// *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,
+    /// Broadcast to transition.
+    #[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>,
+    /// 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 {
+            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>,
+    /// 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.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *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 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_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 only broadcasts with the selected type.
+    #[serde(rename = "broadcastType")]
+    pub broadcast_type: Option<LiveBroadcastsListBroadcastType>,
+    #[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>,
+    /// *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, 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>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for 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.broadcast_type {
+            write!(
+                f,
+                "&broadcastType={}",
+                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.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                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,
@@ -14740,261 +14319,30 @@
     }
 }
 
-/// Parameters for the `captions.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CaptionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync {
-            write!(
-                f,
-                "&sync={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Returns the captions with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Returns the captions for the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&videoId={}",
-            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.download` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsDownloadParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// tlang is the language code; machine translate the captions into this language.
-    #[serde(rename = "tlang")]
-    pub tlang: Option<String>,
-    /// Convert the captions into this format. Supported options are sbv, srt, and vtt.
-    #[serde(rename = "tfmt")]
-    pub tfmt: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The ID of the caption track to download, required for One Platform.
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CaptionsDownloadParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.tlang {
-            write!(
-                f,
-                "&tlang={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.tfmt {
-            write!(
-                f,
-                "&tfmt={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-    /// The *part* parameter specifies the caption resource parts that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CaptionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync {
-            write!(
-                f,
-                "&sync={}",
+/// Parameters for the `videoAbuseReportReasons.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonsListParams {
+    /// 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 videoCategory 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 VideoAbuseReportReasonsListParams {
+    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()
             )?;
         }
@@ -15033,349 +14381,6 @@
     }
 }
 
-/// Parameters for the `tests.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for TestsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `search.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies a comma-separated list of one or more search resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Restrict results to a particular topic.
-    #[serde(rename = "topicId")]
-    pub topic_id: Option<String>,
-    /// Indicates whether the search results should include restricted content as well as standard content.
-    #[serde(rename = "safeSearch")]
-    pub safe_search: Option<SearchListSafeSearch>,
-    /// Return results relevant to this language.
-    #[serde(rename = "relevanceLanguage")]
-    pub relevance_language: Option<String>,
-    /// Search owned by a content owner.
-    #[serde(rename = "forContentOwner")]
-    pub for_content_owner: Option<bool>,
-    /// Filter on resources published after this date.
-    #[serde(rename = "publishedAfter")]
-    pub published_after: Option<String>,
-    /// Restrict the search to only retrieve videos uploaded using the project id of the authenticated user.
-    #[serde(rename = "forDeveloper")]
-    pub for_developer: Option<bool>,
-    /// Filter on distance from the location (specified above).
-    #[serde(rename = "locationRadius")]
-    pub location_radius: Option<String>,
-    /// Filter on the license of the videos.
-    #[serde(rename = "videoLicense")]
-    pub video_license: Option<SearchListVideoLicense>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Display the content as seen by viewers in this country.
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// Sort order of the results.
-    #[serde(rename = "order")]
-    pub order: Option<SearchListOrder>,
-    /// Search for the private videos of the authenticated user.
-    #[serde(rename = "forMine")]
-    pub for_mine: Option<bool>,
-    /// Filter on the livestream status of the videos.
-    #[serde(rename = "eventType")]
-    pub event_type: Option<SearchListEventType>,
-    /// Filter on the definition of the videos.
-    #[serde(rename = "videoDefinition")]
-    pub video_definition: Option<SearchListVideoDefinition>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Filter on location of the video
-    #[serde(rename = "location")]
-    pub location: Option<String>,
-    /// Filter on embeddable videos.
-    #[serde(rename = "videoEmbeddable")]
-    pub video_embeddable: Option<SearchListVideoEmbeddable>,
-    /// Restrict results to a particular set of resource types from One Platform.
-    #[serde(rename = "type")]
-    pub typ: Option<String>,
-    /// Filter on videos of a specific type.
-    #[serde(rename = "videoType")]
-    pub video_type: Option<SearchListVideoType>,
-    /// Search related to a resource.
-    #[serde(rename = "relatedToVideoId")]
-    pub related_to_video_id: Option<String>,
-    /// Filter on videos in a specific category.
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: Option<String>,
-    /// Textual search terms to match.
-    #[serde(rename = "q")]
-    pub q: Option<String>,
-    /// Add a filter on the channel search.
-    #[serde(rename = "channelType")]
-    pub channel_type: Option<SearchListChannelType>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Filter on the presence of captions on the videos.
-    #[serde(rename = "videoCaption")]
-    pub video_caption: Option<SearchListVideoCaption>,
-    /// Filter on resources published before this date.
-    #[serde(rename = "publishedBefore")]
-    pub published_before: Option<String>,
-    /// Filter on 3d videos.
-    #[serde(rename = "videoDimension")]
-    pub video_dimension: Option<SearchListVideoDimension>,
-    /// Filter on resources belonging to this channelId.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Filter on the duration of the videos.
-    #[serde(rename = "videoDuration")]
-    pub video_duration: Option<SearchListVideoDuration>,
-    /// Filter on syndicated videos.
-    #[serde(rename = "videoSyndicated")]
-    pub video_syndicated: Option<SearchListVideoSyndicated>,
-}
-
-impl std::fmt::Display for SearchListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.topic_id {
-            write!(
-                f,
-                "&topicId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.safe_search {
-            write!(
-                f,
-                "&safeSearch={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.relevance_language {
-            write!(
-                f,
-                "&relevanceLanguage={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_content_owner {
-            write!(
-                f,
-                "&forContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_after {
-            write!(
-                f,
-                "&publishedAfter={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_developer {
-            write!(
-                f,
-                "&forDeveloper={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.location_radius {
-            write!(
-                f,
-                "&locationRadius={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_license {
-            write!(
-                f,
-                "&videoLicense={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_mine {
-            write!(
-                f,
-                "&forMine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.event_type {
-            write!(
-                f,
-                "&eventType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_definition {
-            write!(
-                f,
-                "&videoDefinition={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.location {
-            write!(
-                f,
-                "&location={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_embeddable {
-            write!(
-                f,
-                "&videoEmbeddable={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.typ {
-            write!(
-                f,
-                "&type={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_type {
-            write!(
-                f,
-                "&videoType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.related_to_video_id {
-            write!(
-                f,
-                "&relatedToVideoId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_category_id {
-            write!(
-                f,
-                "&videoCategoryId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.q {
-            write!(
-                f,
-                "&q={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_type {
-            write!(
-                f,
-                "&channelType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_caption {
-            write!(
-                f,
-                "&videoCaption={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_before {
-            write!(
-                f,
-                "&publishedBefore={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_dimension {
-            write!(
-                f,
-                "&videoDimension={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_duration {
-            write!(
-                f,
-                "&videoDuration={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_syndicated {
-            write!(
-                f,
-                "&videoSyndicated={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
 /// Parameters for the `abuseReports.insert` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct AbuseReportsInsertParams {
@@ -15398,43 +14403,701 @@
     }
 }
 
-/// Parameters for the `membershipsLevels.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the membershipsLevel resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for MembershipsLevelsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `videoAbuseReportReasons.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the videoCategory resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
+/// 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>,
+    /// 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>,
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+}
+
+impl std::fmt::Display for VideoCategoriesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                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 `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 `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>,
+    /// *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 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.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.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting. In addition, not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.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.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>,
+    /// Return videos with the given ids.
+    #[serde(rename = "id")]
+    pub id: 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>,
-}
-
-impl std::fmt::Display for VideoAbuseReportReasonsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+    /// 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>,
+    #[serde(rename = "locale")]
+    pub locale: Option<String>,
+    /// Use chart that is specific to the specified video category
+    #[serde(rename = "videoCategoryId")]
+    pub video_category_id: 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,
+    /// *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 = "maxHeight")]
+    pub max_height: Option<i32>,
+    /// Return videos liked/disliked by the authenticated user. Does not support RateType.RATED_TYPE_NONE.
+    #[serde(rename = "myRating")]
+    pub my_rating: Option<VideosListMyRating>,
+    /// 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 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>,
+}
+
+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.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.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                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.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()
+            )?;
+        }
+        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.my_rating {
+            write!(
+                f,
+                "&myRating={}",
+                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.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()
+            )?;
+        }
+        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.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>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Should 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,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// Should auto-levels be applied to the upload.
+    #[serde(rename = "autoLevels")]
+    pub auto_levels: Option<bool>,
+    /// Notify the channel subscribers about the new video. As default, the notification is enabled.
+    #[serde(rename = "notifySubscribers")]
+    pub notify_subscribers: Option<bool>,
+}
+
+impl std::fmt::Display for VideosInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.stabilize {
+            write!(
+                f,
+                "&stabilize={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.auto_levels {
+            write!(
+                f,
+                "&autoLevels={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.notify_subscribers {
+            write!(
+                f,
+                "&notifySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `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>,
+    /// Return LiveStreams with the given ids from Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    #[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>,
+    /// 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 *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 *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,
+}
+
+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.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.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.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>,
+    #[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>,
+}
+
+impl std::fmt::Display for LiveStreamsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, content_details, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for LiveStreamsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `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>,
+    /// 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,
+    /// *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 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 `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>,
+    /// 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 *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>,
+    /// The id of the live chat for which comments should be returned.
+    #[serde(rename = "liveChatId")]
+    pub live_chat_id: String,
+    /// 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 *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+}
+
+impl std::fmt::Display for LiveChatMessagesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&liveChatId={}",
+            percent_encode(
+                format!("{}", self.live_chat_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
         write!(
             f,
             "&part={}",
@@ -15447,54 +15110,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// Parameters for the `members.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembersListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Parameter that specifies which channel members to return.
-    #[serde(rename = "mode")]
-    pub mode: Option<MembersListMode>,
-    /// Filter members in the results set to the ones that have access to a level.
-    #[serde(rename = "hasAccessToLevel")]
-    pub has_access_to_level: Option<String>,
-    /// The *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 {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.mode {
-            write!(
-                f,
-                "&mode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.has_access_to_level {
-            write!(
-                f,
-                "&hasAccessToLevel={}",
+        if let Some(ref v) = self.profile_image_size {
+            write!(
+                f,
+                "&profileImageSize={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -15512,10 +15131,391 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.filter_by_member_channel_id {
-            write!(
-                f,
-                "&filterByMemberChannelId={}",
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatMessages.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for LiveChatMessagesDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatMessages.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 `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>,
+    /// Return rendered funding amounts in specified language.
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// 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>,
+}
+
+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.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `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>,
+    /// *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>,
+    /// 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>,
+    /// The ID of the caption track to download, required for One Platform.
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for CaptionsDownloadParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.tlang {
+            write!(
+                f,
+                "&tlang={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                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()
+            )?;
+        }
+        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>,
+    /// 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,
+    /// *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.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Returns the captions for the specified video.
+    #[serde(rename = "videoId")]
+    pub video_id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// 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>,
+}
+
+impl std::fmt::Display for CaptionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&videoId={}",
+            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.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()
+            )?;
+        }
+        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>,
+    /// 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,
+    /// *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>,
+    /// ID of the Google+ Page for the channel that the request is on behalf of.
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.sync {
+            write!(
+                f,
+                "&sync={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.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>,
+    #[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 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 `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()
             )?;
         }
@@ -15530,22 +15530,38 @@
     #[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>,
+    /// Upload protocol for media (e.g. "raw", "multipart").
+    #[serde(rename = "upload_protocol")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload_protocol: 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>,
-    /// Upload protocol for media (e.g. "raw", "multipart").
-    #[serde(rename = "upload_protocol")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload_protocol: 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>,
     /// Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.
     #[serde(rename = "quotaUser")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub quota_user: Option<String>,
+    /// Legacy upload protocol for media (e.g. "media", "multipart").
+    #[serde(rename = "uploadType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload_type: Option<String>,
+    /// Returns response with indentations and line breaks.
+    #[serde(rename = "prettyPrint")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pretty_print: Option<bool>,
+    /// V1 error format.
+    #[serde(rename = "$.xgafv")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dollar_xgafv: Option<YoutubeParamsdollar_xgafv>,
+    /// OAuth access token.
+    #[serde(rename = "access_token")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub access_token: Option<String>,
     /// JSONP
     #[serde(rename = "callback")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -15554,22 +15570,6 @@
     #[serde(rename = "key")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub key: Option<String>,
-    /// Selector specifying which fields to include in a partial response.
-    #[serde(rename = "fields")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fields: Option<String>,
-    /// OAuth access token.
-    #[serde(rename = "access_token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub access_token: Option<String>,
-    /// Legacy upload protocol for media (e.g. "media", "multipart").
-    #[serde(rename = "uploadType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload_type: Option<String>,
-    /// 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 {
@@ -15581,10 +15581,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.dollar_xgafv {
-            write!(
-                f,
-                "&$.xgafv={}",
+        if let Some(ref v) = self.upload_protocol {
+            write!(
+                f,
+                "&upload_protocol={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -15595,10 +15595,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.upload_protocol {
-            write!(
-                f,
-                "&upload_protocol={}",
+        if let Some(ref v) = self.fields {
+            write!(
+                f,
+                "&fields={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -15609,6 +15609,34 @@
                 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()
+            )?;
+        }
+        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.access_token {
+            write!(
+                f,
+                "&access_token={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.callback {
             write!(
                 f,
@@ -15623,40 +15651,12 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.fields {
-            write!(
-                f,
-                "&fields={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.access_token {
-            write!(
-                f,
-                "&access_token={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.upload_type {
-            write!(
-                f,
-                "&uploadType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.pretty_print {
-            write!(
-                f,
-                "&prettyPrint={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// The Youtube I18nLanguages service represents the I18nLanguages resource.
-pub struct I18nLanguagesService {
+        Ok(())
+    }
+}
+
+/// The Youtube Playlists service represents the Playlists resource.
+pub struct PlaylistsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -15665,12 +15665,12 @@
     root_url: String,
 }
 
-impl I18nLanguagesService {
-    /// Create a new I18nLanguagesService object. The easiest way to call this is wrapping the Authenticator
+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) -> I18nLanguagesService {
-        I18nLanguagesService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistsService {
+        PlaylistsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -15722,9 +15722,98 @@
             .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
+    }
+
+    /// 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
+    }
+
+    /// 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
+    }
+
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &I18nLanguagesListParams) -> Result<I18nLanguageListResponse> {
-        let rel_path = format!("youtube/v3/i18nLanguages",);
+    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![];
@@ -15752,8 +15841,8 @@
     }
 }
 
-/// The Youtube VideoCategories service represents the VideoCategories resource.
-pub struct VideoCategoriesService {
+/// The Youtube ChannelSections service represents the ChannelSections resource.
+pub struct ChannelSectionsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -15762,12 +15851,12 @@
     root_url: String,
 }
 
-impl VideoCategoriesService {
-    /// Create a new VideoCategoriesService object. The easiest way to call this is wrapping the Authenticator
+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) -> VideoCategoriesService {
-        VideoCategoriesService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelSectionsService {
+        ChannelSectionsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -15822,9 +15911,9 @@
     /// Retrieves a list of resources, possibly filtered.
     pub async fn list(
         &self,
-        params: &VideoCategoriesListParams,
-    ) -> Result<VideoCategoryListResponse> {
-        let rel_path = format!("youtube/v3/videoCategories",);
+        params: &ChannelSectionsListParams,
+    ) -> Result<ChannelSectionListResponse> {
+        let rel_path = format!("youtube/v3/channelSections",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -15850,10 +15939,107 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-}
-
-/// The Youtube Channels service represents the Channels resource.
-pub struct ChannelsService {
+
+    /// 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
+    }
+
+    /// 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
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &ChannelSectionsInsertParams,
+        req: &ChannelSection,
+    ) -> Result<ChannelSection> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatBans service represents the LiveChatBans resource.
+pub struct LiveChatBansService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -15862,12 +16048,12 @@
     root_url: String,
 }
 
-impl ChannelsService {
-    /// Create a new ChannelsService object. The easiest way to call this is wrapping the Authenticator
+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) -> ChannelsService {
-        ChannelsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatBansService {
+        LiveChatBansService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -15919,46 +16105,19 @@
             .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()];
+    /// 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?;
@@ -15977,7 +16136,36 @@
 
         let opt_request: Option<&EmptyRequest> = None;
         let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// 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
     }
 }
 
@@ -16048,69 +16236,6 @@
             .collect();
     }
 
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &LiveChatModeratorsInsertParams,
-        req: &LiveChatModerator,
-    ) -> Result<LiveChatModerator> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a chat moderator.
-    pub async fn delete(&self, params: &LiveChatModeratorsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
     /// Retrieves a list of resources, possibly filtered.
     pub async fn list(
         &self,
@@ -16142,328 +16267,10 @@
         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 + 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
-    /// 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) -> SuperChatEventsService {
-        SuperChatEventsService {
-            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: &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?;
-        }
-        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 Comments service represents the Comments resource.
-pub struct CommentsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CommentsService {
-    /// Create a new CommentsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentsService {
-        CommentsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &CommentsInsertParams, req: &Comment) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &CommentsListParams) -> Result<CommentListResponse> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &CommentsUpdateParams, req: &Comment) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
-    pub async fn mark_as_spam(&self, params: &CommentsMarkAsSpamParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/markAsSpam",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Sets the moderation status of one or more comments.
-    pub async fn set_moderation_status(
-        &self,
-        params: &CommentsSetModerationStatusParams,
-    ) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/setModerationStatus",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &CommentsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments",);
+
+    /// 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![];
@@ -16489,293 +16296,14 @@
         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.
-    pub async fn update(
-        &self,
-        params: &ThirdPartyLinksUpdateParams,
-        req: &ThirdPartyLink,
-    ) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
 
     /// Inserts a new resource into this collection.
     pub async fn insert(
         &self,
-        params: &ThirdPartyLinksInsertParams,
-        req: &ThirdPartyLink,
-    ) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &ThirdPartyLinksListParams) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &ThirdPartyLinksDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube LiveChatMessages service represents the LiveChatMessages resource.
-pub struct LiveChatMessagesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveChatMessagesService {
-    /// Create a new LiveChatMessagesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// 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",);
+        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![];
@@ -16905,38 +16433,6 @@
         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,
@@ -16970,10 +16466,42 @@
         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 {
+
+    /// 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
+    }
+}
+
+/// The Youtube Subscriptions service represents the Subscriptions resource.
+pub struct SubscriptionsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -16982,12 +16510,12 @@
     root_url: String,
 }
 
-impl ChannelSectionsService {
-    /// Create a new ChannelSectionsService object. The easiest way to call this is wrapping the Authenticator
+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) -> ChannelSectionsService {
-        ChannelSectionsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SubscriptionsService {
+        SubscriptionsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -17042,10 +16570,10 @@
     /// 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",);
+        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![];
@@ -17074,8 +16602,8 @@
     }
 
     /// Deletes a resource.
-    pub async fn delete(&self, params: &ChannelSectionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/channelSections",);
+    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![];
@@ -17103,11 +16631,8 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &ChannelSectionsListParams,
-    ) -> Result<ChannelSectionListResponse> {
-        let rel_path = format!("youtube/v3/channelSections",);
+    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![];
@@ -17133,607 +16658,6 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &self,
-        params: &ChannelSectionsUpdateParams,
-        req: &ChannelSection,
-    ) -> Result<ChannelSection> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-}
-
-/// The Youtube LiveStreams service represents the LiveStreams resource.
-pub struct LiveStreamsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveStreamsService {
-    /// Create a new LiveStreamsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveStreamsService {
-        LiveStreamsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Updates an existing stream for the authenticated user.
-    pub async fn update(
-        &self,
-        params: &LiveStreamsUpdateParams,
-        req: &LiveStream,
-    ) -> Result<LiveStream> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &self,
-        params: &LiveStreamsInsertParams,
-        req: &LiveStream,
-    ) -> Result<LiveStream> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes an existing stream for the authenticated user.
-    pub async fn delete(&self, params: &LiveStreamsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieve the list of streams associated with the given channel. --
-    pub async fn list(&self, params: &LiveStreamsListParams) -> Result<LiveStreamListResponse> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Videos service represents the Videos resource.
-pub struct VideosService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl VideosService {
-    /// Create a new VideosService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideosService {
-        VideosService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
-    pub async fn get_rating(
-        &self,
-        params: &VideosGetRatingParams,
-    ) -> Result<VideoRatingListResponse> {
-        let rel_path = format!("youtube/v3/videos/getRating",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            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: &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.
@@ -17955,6 +16879,2064 @@
     }
 }
 
+/// 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 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.
+    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
+    }
+
+    /// 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
+    }
+
+    /// 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
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &ThirdPartyLinksInsertParams,
+        req: &ThirdPartyLink,
+    ) -> Result<ThirdPartyLink> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// 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();
+    }
+
+    /// 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
+    }
+
+    /// 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
+    }
+
+    /// 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
+    }
+
+    /// 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
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &CommentsUpdateParams, req: &Comment) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(&self, params: &CommentsInsertParams, req: &Comment) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Activities service represents the Activities resource.
+pub struct ActivitiesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    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 + DerefAuth>(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(&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 MembershipsLevels service represents the MembershipsLevels resource.
+pub struct MembershipsLevelsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl MembershipsLevelsService {
+    /// Create a new MembershipsLevelsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembershipsLevelsService {
+        MembershipsLevelsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of all pricing levels offered by a creator to the fans.
+    pub async fn list(
+        &self,
+        params: &MembershipsLevelsListParams,
+    ) -> Result<MembershipsLevelListResponse> {
+        let rel_path = format!("youtube/v3/membershipsLevels",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
+            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 + 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
+    }
+
+    /// 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
+    }
+
+    /// 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
+    }
+}
+
+/// 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 Members service represents the Members resource.
+pub struct MembersService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl MembersService {
+    /// Create a new MembersService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembersService {
+        MembersService {
+            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 members that match the request criteria for a channel.
+    pub async fn list(&self, params: &MembersListParams) -> Result<MemberListResponse> {
+        let rel_path = format!("youtube/v3/members",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        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 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 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 LiveBroadcasts service represents the LiveBroadcasts resource.
+pub struct LiveBroadcastsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    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 + DerefAuth>(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(
+        &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
+    }
+
+    /// 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
+    }
+
+    /// Transition a broadcast to a given status.
+    pub async fn transition(
+        &self,
+        params: &LiveBroadcastsTransitionParams,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/transition",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// 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?;
+        }
+        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
+    }
+
+    /// 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
+    }
+
+    /// 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
+    }
+}
+
+/// The Youtube VideoAbuseReportReasons service represents the VideoAbuseReportReasons resource.
+pub struct VideoAbuseReportReasonsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl VideoAbuseReportReasonsService {
+    /// Create a new VideoAbuseReportReasonsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(
+        client: TlsClient,
+        auth: A,
+    ) -> VideoAbuseReportReasonsService {
+        VideoAbuseReportReasonsService {
+            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: &VideoAbuseReportReasonsListParams,
+    ) -> Result<VideoAbuseReportReasonListResponse> {
+        let rel_path = format!("youtube/v3/videoAbuseReportReasons",);
+        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 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 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 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?;
+        }
+        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 ChannelBanners service represents the ChannelBanners resource.
 pub struct ChannelBannersService {
     client: TlsClient,
@@ -18149,8 +19131,8 @@
     }
 }
 
-/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
-pub struct LiveBroadcastsService {
+/// The Youtube Videos service represents the Videos resource.
+pub struct VideosService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -18159,12 +19141,12 @@
     root_url: String,
 }
 
-impl LiveBroadcastsService {
-    /// Create a new LiveBroadcastsService object. The easiest way to call this is wrapping the Authenticator
+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) -> LiveBroadcastsService {
-        LiveBroadcastsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideosService {
+        VideosService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -18216,18 +19198,47 @@
             .collect();
     }
 
-    /// Retrieve the list of broadcasts associated with the given channel.
-    pub async fn list(
+    /// 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
+    }
+
+    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
+    pub async fn get_rating(
         &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()];
+        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?;
@@ -18248,19 +19259,15 @@
         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()];
+    /// 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?;
@@ -18282,18 +19289,15 @@
         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()];
+    /// 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?;
@@ -18314,77 +19318,48 @@
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
 
-    /// Bind a broadcast to a stream.
-    pub async fn bind(&self, params: &LiveBroadcastsBindParams) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/bind",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Delete a given broadcast.
-    pub async fn delete(&self, params: &LiveBroadcastsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
+    /// 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
+    }
+
+    /// Report abuse for a video.
+    pub async fn report_abuse(
         &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()];
+        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?;
@@ -18405,10 +19380,132 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
-}
-
-/// The Youtube LiveChatBans service represents the LiveChatBans resource.
-pub struct LiveChatBansService {
+
+    /// 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)))?
+        }
+    }
+}
+
+/// The Youtube LiveStreams service represents the LiveStreams resource.
+pub struct LiveStreamsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -18417,12 +19514,12 @@
     root_url: String,
 }
 
-impl LiveChatBansService {
-    /// Create a new LiveChatBansService object. The easiest way to call this is wrapping the Authenticator
+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) -> LiveChatBansService {
-        LiveChatBansService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveStreamsService {
+        LiveStreamsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -18474,9 +19571,38 @@
             .collect();
     }
 
-    /// Deletes a chat ban.
-    pub async fn delete(&self, params: &LiveChatBansDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
+    /// 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
+    }
+
+    /// Deletes an existing stream for the authenticated user.
+    pub async fn delete(&self, params: &LiveStreamsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveStreams",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -18503,13 +19629,13 @@
         do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
     }
 
-    /// Inserts a new resource into this collection.
+    /// Inserts a new stream for the authenticated user.
     pub async fn insert(
         &self,
-        params: &LiveChatBansInsertParams,
-        req: &LiveChatBan,
-    ) -> Result<LiveChatBan> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
+        params: &LiveStreamsInsertParams,
+        req: &LiveStream,
+    ) -> Result<LiveStream> {
+        let rel_path = format!("youtube/v3/liveStreams",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -18536,10 +19662,44 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
-}
-
-/// The Youtube Activities service represents the Activities resource.
-pub struct ActivitiesService {
+
+    /// 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
+    }
+}
+
+/// The Youtube LiveChatMessages service represents the LiveChatMessages resource.
+pub struct LiveChatMessagesService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -18548,12 +19708,12 @@
     root_url: String,
 }
 
-impl ActivitiesService {
-    /// Create a new ActivitiesService 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) -> ActivitiesService {
-        ActivitiesService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatMessagesService {
+        LiveChatMessagesService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -18606,8 +19766,11 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &ActivitiesListParams) -> Result<ActivityListResponse> {
-        let rel_path = format!("youtube/v3/activities",);
+    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![];
@@ -18633,10 +19796,73 @@
         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 {
+
+    /// Deletes a chat message.
+    pub async fn delete(&self, params: &LiveChatMessagesDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &LiveChatMessagesInsertParams,
+        req: &LiveChatMessage,
+    ) -> Result<LiveChatMessage> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube SuperChatEvents service represents the SuperChatEvents resource.
+pub struct SuperChatEventsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -18645,197 +19871,12 @@
     root_url: String,
 }
 
-impl ThumbnailsService {
-    /// Create a new ThumbnailsService 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 + DerefAuth>(client: TlsClient, auth: A) -> ThumbnailsService {
-        ThumbnailsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    pub async fn set(&self, params: &ThumbnailsSetParams) -> Result<ThumbnailSetResponse> {
-        let rel_path = format!("youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    ///
-    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
-    pub async fn set_upload(
-        &self,
-        params: &ThumbnailsSetParams,
-        data: hyper::body::Bytes,
-    ) -> Result<ThumbnailSetResponse> {
-        let rel_path = format!("/upload/youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    ///
-    /// This method is a variant of `set()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn set_resumable_upload<'client>(
-        &'client self,
-        params: &ThumbnailsSetParams,
-    ) -> Result<ResumableUpload<'client, ThumbnailSetResponse>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-}
-
-/// The Youtube PlaylistItems service represents the PlaylistItems resource.
-pub struct PlaylistItemsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl PlaylistItemsService {
-    /// Create a new PlaylistItemsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistItemsService {
-        PlaylistItemsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SuperChatEventsService {
+        SuperChatEventsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -18887,458 +19928,18 @@
             .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(
+    pub async fn list(
         &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()];
+        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?;
@@ -19427,186 +20028,6 @@
             .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`.
@@ -19765,10 +20186,190 @@
             .context(format!("{:?}", headers)))?
         }
     }
-}
-
-/// The Youtube I18nRegions service represents the I18nRegions resource.
-pub struct I18nRegionsService {
+
+    /// 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
+    }
+
+    /// 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)))?
+        }
+    }
+
+    /// 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
+    }
+}
+
+/// The Youtube I18nLanguages service represents the I18nLanguages resource.
+pub struct I18nLanguagesService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -19777,12 +20378,12 @@
     root_url: String,
 }
 
-impl I18nRegionsService {
-    /// Create a new I18nRegionsService 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 + DerefAuth>(client: TlsClient, auth: A) -> I18nRegionsService {
-        I18nRegionsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nLanguagesService {
+        I18nLanguagesService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -19835,203 +20436,8 @@
     }
 
     /// 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",);
+    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![];
@@ -20058,409 +20464,3 @@
         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 + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl MembershipsLevelsService {
-    /// Create a new MembershipsLevelsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembershipsLevelsService {
-        MembershipsLevelsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of all pricing levels offered by a creator to the fans.
-    pub async fn list(
-        &self,
-        params: &MembershipsLevelsListParams,
-    ) -> Result<MembershipsLevelListResponse> {
-        let rel_path = format!("youtube/v3/membershipsLevels",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
-                .as_ref()
-                .to_string()];
-            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 VideoAbuseReportReasons service represents the VideoAbuseReportReasons resource.
-pub struct VideoAbuseReportReasonsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl VideoAbuseReportReasonsService {
-    /// Create a new VideoAbuseReportReasonsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(
-        client: TlsClient,
-        auth: A,
-    ) -> VideoAbuseReportReasonsService {
-        VideoAbuseReportReasonsService {
-            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: &VideoAbuseReportReasonsListParams,
-    ) -> Result<VideoAbuseReportReasonListResponse> {
-        let rel_path = format!("youtube/v3/videoAbuseReportReasons",);
-        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 Members service represents the Members resource.
-pub struct MembersService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl MembersService {
-    /// Create a new MembersService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembersService {
-        MembersService {
-            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 members that match the request criteria for a channel.
-    pub async fn list(&self, params: &MembersListParams) -> Result<MemberListResponse> {
-        let rel_path = format!("youtube/v3/members",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
-                .as_ref()
-                .to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        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
-    }
-}