changeset 186:0fd7f1413b65

Update youtube example with enums api
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 29 Jan 2021 11:44:05 +0100
parents 9e5b86630da1
children 9057a045fd41
files example_crates/youtube_example/Cargo.lock example_crates/youtube_example/src/youtube_v3_types.rs
diffstat 2 files changed, 17382 insertions(+), 11048 deletions(-) [+]
line wrap: on
line diff
--- a/example_crates/youtube_example/Cargo.lock	Fri Jan 29 11:43:46 2021 +0100
+++ b/example_crates/youtube_example/Cargo.lock	Fri Jan 29 11:44:05 2021 +0100
@@ -23,7 +23,7 @@
 
 [[package]]
 name = "async-google-apis-common"
-version = "0.1.7"
+version = "0.2.0"
 dependencies = [
  "anyhow",
  "chrono",
--- a/example_crates/youtube_example/src/youtube_v3_types.rs	Fri Jan 29 11:43:46 2021 +0100
+++ b/example_crates/youtube_example/src/youtube_v3_types.rs	Fri Jan 29 11:44:05 2021 +0100
@@ -18,6 +18,10 @@
 /// Scopes of this API. Convertible to their string representation with `AsRef`.
 #[derive(Debug, Clone, Copy)]
 pub enum YoutubeScopes {
+    /// View and manage your assets and associated content on YouTube
+    ///
+    /// URL: https://www.googleapis.com/auth/youtubepartner
+    Youtubepartner,
     /// See, edit, and permanently delete your YouTube videos, ratings, comments and captions
     ///
     /// URL: https://www.googleapis.com/auth/youtube.force-ssl
@@ -30,27 +34,24 @@
     ///
     /// URL: https://www.googleapis.com/auth/youtube.channel-memberships.creator
     YoutubeChannelMembershipsCreator,
-    /// Manage your YouTube account
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube
-    Youtube,
     /// Manage your YouTube videos
     ///
     /// URL: https://www.googleapis.com/auth/youtube.upload
     YoutubeUpload,
-    /// View and manage your assets and associated content on YouTube
-    ///
-    /// URL: https://www.googleapis.com/auth/youtubepartner
-    Youtubepartner,
     /// View your YouTube account
     ///
     /// URL: https://www.googleapis.com/auth/youtube.readonly
     YoutubeReadonly,
+    /// Manage your YouTube account
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube
+    Youtube,
 }
 
 impl std::convert::AsRef<str> for YoutubeScopes {
     fn as_ref(&self) -> &'static str {
         match self {
+            YoutubeScopes::Youtubepartner => "https://www.googleapis.com/auth/youtubepartner",
             YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
             YoutubeScopes::YoutubepartnerChannelAudit => {
                 "https://www.googleapis.com/auth/youtubepartner-channel-audit"
@@ -58,436 +59,67 @@
             YoutubeScopes::YoutubeChannelMembershipsCreator => {
                 "https://www.googleapis.com/auth/youtube.channel-memberships.creator"
             }
-            YoutubeScopes::Youtube => "https://www.googleapis.com/auth/youtube",
             YoutubeScopes::YoutubeUpload => "https://www.googleapis.com/auth/youtube.upload",
-            YoutubeScopes::Youtubepartner => "https://www.googleapis.com/auth/youtubepartner",
             YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
-        }
-    }
-}
-
-/// Describes processing status and progress and availability of some other Video resource parts.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProcessingDetails {
-    /// This value indicates whether 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>,
-    #[serde(rename = "processingProgress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_progress: Option<VideoProcessingDetailsProcessingProgress>,
-    /// 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>,
-    /// 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<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 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<String>,
-    /// This value indicates whether video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
-    #[serde(rename = "editorSuggestionsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub editor_suggestions_availability: Option<String>,
-}
-
-/// 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 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 fetch to request a promoted item.
-    #[serde(rename = "adTag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ad_tag: Option<String>,
-    /// The URL the client should ping to indicate that the user was shown this promoted item.
-    #[serde(rename = "creativeViewUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creative_view_url: Option<String>,
-    /// The list of forecasting URLs. The client should ping all of these URLs when a promoted item is not available, to indicate that a promoted item could have been shown.
-    #[serde(rename = "forecastingUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub forecasting_url: Option<Vec<String>>,
-    /// The 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 URL the client should ping to indicate that the user clicked through on this promoted item.
-    #[serde(rename = "clickTrackingUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub click_tracking_url: Option<String>,
-    /// The URL the client should direct the user to, if the user chooses to visit the advertiser's website.
-    #[serde(rename = "destinationUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub destination_url: Option<String>,
-    /// The 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 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<String>,
-}
-
-/// 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<String>,
-    #[serde(rename = "healthStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub health_status: Option<LiveStreamHealthStatus>,
-}
-
-/// 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 playlist, including title, description and thumbnails. Basic details of a YouTube Playlist item provided by the author. Next ID: 13
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemSnippet {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The ID that YouTube uses to uniquely identify thGe playlist that the playlist item is in.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-    /// The item's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// 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 item's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The order in which the item appears in the playlist. The value uses a zero-based index, so the first item has a position of 0, the second item has a position of 1, and so forth.
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<u32>,
-    /// The date and time that the item was added to the playlist. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// 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>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistSnippet {
-    /// Keyword tags associated with the playlist.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<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 date and time that the playlist was created. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// 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>,
-    #[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>,
-    /// The playlist's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#captionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of captions that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Caption>>,
-    /// 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>,
+            YoutubeScopes::Youtube => "https://www.googleapis.com/auth/youtube",
+        }
+    }
+}
+
+/// Details about the content to witch a subscription refers.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionContentDetails {
+    /// The approximate number of items that the subscription points to.
+    #[serde(rename = "totalItemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_item_count: Option<u32>,
+    /// The type of activity this subscription is for (only uploads, everything).
+    #[serde(rename = "activityType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub activity_type: Option<SubscriptionContentDetailsActivityType>,
+    /// The number of new items in the subscription since its content was last read.
+    #[serde(rename = "newItemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub new_item_count: Option<u32>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionListResponse {
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
     /// Serialized EventId of the request which produced this response.
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-}
-
-/// Branding properties for images associated with the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ImageSettings {
-    /// 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. Mobile size (640x175).
-    #[serde(rename = "bannerMobileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_image_url: Option<String>,
-    #[serde(rename = "largeBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_imap_script: Option<LocalizedProperty>,
-    /// 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 = "watchIconImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch_icon_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>,
-    /// This is used only in update requests; if it's set, we use this URL to generate all of the above banner URLs.
-    #[serde(rename = "bannerExternalUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_external_url: Option<String>,
-    /// Banner image. TV size medium resolution (1280x720).
-    #[serde(rename = "bannerTvMediumImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_medium_image_url: Option<String>,
-    /// Banner image. Tablet size (1707x283).
-    #[serde(rename = "bannerTabletImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_image_url: Option<String>,
-    /// Banner image. Mobile size high resolution (1280x360).
-    #[serde(rename = "bannerMobileHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_hd_image_url: Option<String>,
-    /// Banner image. TV size high resolution (1920x1080).
-    #[serde(rename = "bannerTvHighImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_high_image_url: Option<String>,
-    #[serde(rename = "smallBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_url: Option<LocalizedProperty>,
-    /// 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>,
-    #[serde(rename = "largeBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_url: Option<LocalizedProperty>,
-    /// 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. Tablet size low resolution (1138x188).
-    #[serde(rename = "bannerTabletLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_low_image_url: Option<String>,
-    /// The URL for a 1px by 1px tracking pixel that can be used to collect statistics for views of the channel or video pages.
-    #[serde(rename = "trackingImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tracking_image_url: Option<String>,
-    #[serde(rename = "smallBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
-    /// 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. 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>,
-    #[serde(rename = "backgroundImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_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>,
-}
-
-/// Stub token pagination template to suppress results.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TokenPagination {}
-
-/// 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>>,
-}
-
-/// 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<String>,
-    #[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>,
-}
-
-/// A *video* resource represents a YouTube video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Video {
-    /// 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 = "fileDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_details: Option<VideoFileDetails>,
-    #[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>,
-    /// 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>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<VideoContentDetails>,
-    #[serde(rename = "monetizationDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monetization_details: Option<VideoMonetizationDetails>,
-    #[serde(rename = "recordingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_details: Option<VideoRecordingDetails>,
-    /// 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 = "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 = "suggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub suggestions: Option<VideoSuggestions>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<VideoPlayer>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<VideoStatistics>,
-    #[serde(rename = "liveStreamingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// A list of subscriptions that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Subscription>>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamSnippet {
-    #[serde(rename = "isDefaultStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_default_stream: Option<bool>,
-    /// The date and time that the stream was created. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// 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>,
-    /// 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>,
-}
-
-/// 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 = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<ResourceId>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SearchResultSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscriptionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
 }
 
 /// Details about a channelsection, including playlists and channels.
@@ -503,34 +135,83 @@
     pub playlists: Option<Vec<String>>,
 }
 
-/// Basic details about rating of a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRating {
-    /// Rating of a video.
-    #[serde(rename = "rating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rating: 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadListResponse {
-    /// 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>,
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelListResponse {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Channel>>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-    /// A list of comment threads that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<CommentThread>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevelSnippet {
+    #[serde(rename = "levelDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub level_details: Option<LevelDetails>,
+    /// The id of the channel that's offering channel memberships.
+    #[serde(rename = "creatorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creator_channel_id: Option<String>,
+}
+
+/// A channel banner returned as the response to a channel_banner.insert call.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBannerResource {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelBannerResource".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The URL of this banner image.
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEventListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#superChatEventListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -538,6 +219,14 @@
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// A list of Super Chat purchases that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<SuperChatEvent>>,
     #[serde(rename = "tokenPagination")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub token_pagination: Option<TokenPagination>,
@@ -545,85 +234,70 @@
     #[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 `__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>,
-}
-
-/// 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<String>,
-    /// 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 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>,
-}
-
-///
-#[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>,
-}
-
-/// Information about an audio stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetailsAudioStream {
-    /// 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>,
-    /// 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 audio stream's bitrate, in bits per second.
-    #[serde(rename = "bitrateBps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bitrate_bps: 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>,
+}
+
+/// Basic details about a comment, such as its author and text.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentSnippet {
+    #[serde(rename = "authorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_channel_id: Option<CommentSnippetAuthorChannelId>,
+    /// The comment's original raw text as initially posted or last updated. The original text will only be returned if it is accessible to the viewer, which is only guaranteed if the viewer is the comment's author.
+    #[serde(rename = "textOriginal")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_original: Option<String>,
+    /// The URL for the avatar of the user who posted the comment.
+    #[serde(rename = "authorProfileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_profile_image_url: Option<String>,
+    /// The unique id of the parent comment, only set for replies.
+    #[serde(rename = "parentId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parent_id: Option<String>,
+    /// The date and time when was last updated . The value is specified in ISO 8601 format.
+    #[serde(rename = "updatedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub updated_at: Option<String>,
+    /// Whether the current viewer can rate this comment.
+    #[serde(rename = "canRate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub can_rate: Option<bool>,
+    /// The name of the user who posted the comment.
+    #[serde(rename = "authorDisplayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_display_name: Option<String>,
+    /// The ID of the video the comment refers to, if any.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The date and time when the comment was orignally published. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+    /// The id of the corresponding YouTube channel. In case of a channel comment this is the channel the comment refers to. In case of a video comment it's the video's channel.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The comment's moderation status. Will not be set if the comments were requested through the id filter.
+    #[serde(rename = "moderationStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderation_status: Option<CommentSnippetModerationStatus>,
+    /// The rating the viewer has given to this comment. For the time being this will never return RATE_TYPE_DISLIKE and instead return RATE_TYPE_NONE. This may change in the future.
+    #[serde(rename = "viewerRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub viewer_rating: Option<CommentSnippetViewerRating>,
+    /// The comment's text. The format is either plain text or HTML dependent on what has been requested. Even the plain text representation may differ from the text originally posted in that it may replace video links with video titles etc.
+    #[serde(rename = "textDisplay")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_display: Option<String>,
+    /// The total number of likes this comment has received.
+    #[serde(rename = "likeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like_count: Option<u32>,
+    /// Link to the author's YouTube channel, if any.
+    #[serde(rename = "authorChannelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_channel_url: Option<String>,
 }
 
 /// JSON template for the status part of a channel.
@@ -636,455 +310,107 @@
     #[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<String>,
-    /// 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<String>,
     #[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 SponsorListResponse {
-    #[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>,
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#sponsorListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The `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 sponsors that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Sponsor>>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-}
-
-/// 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<String>>,
-    /// 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<String>>,
-    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
-    #[serde(rename = "tagSuggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
-    /// A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed.
-    #[serde(rename = "processingErrors")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_errors: Option<Vec<String>>,
-    /// 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<String>>,
-}
-
-/// Basic details about a comment, such as its author and text.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentSnippet {
-    /// 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 date and time when the comment was orignally published. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// The total number of likes this comment has received.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<u32>,
-    /// The date and time when was last updated . The value is specified in ISO 8601 format.
-    #[serde(rename = "updatedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated_at: Option<String>,
-    /// 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 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 unique id of the parent comment, only set for replies.
-    #[serde(rename = "parentId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parent_id: Option<String>,
-    /// The id of the corresponding YouTube channel. In case of a channel comment this is the channel the comment refers to. In case of a video comment it's the video's channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// 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<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>,
-    /// Whether the current viewer can rate this comment.
-    #[serde(rename = "canRate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub can_rate: Option<bool>,
-    /// 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 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>,
-    #[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<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 {
-    /// 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<MembershipsLevelSnippet>,
-    /// The ID that YouTube assigns to uniquely identify the memberships level.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// 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>,
-}
-
-///
-#[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>,
-    /// The date and time that the video was published to YouTube. The value is specified in ISO 8601 format.
-    #[serde(rename = "videoPublishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_published_at: Option<String>,
-    /// A user-generated note for this item.
-    #[serde(rename = "note")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub note: Option<String>,
-    /// The time, measured in seconds from the start of the video, when the video should stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video.
-    #[serde(rename = "endAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub end_at: Option<String>,
-    /// The ID that YouTube uses to uniquely identify a video. To retrieve the video resource, set the id query parameter to this value in your API request.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-}
-
-///
-#[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>,
-    /// 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>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-/// 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 contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked with the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelContentOwnerDetails {
-    /// The ID of the content owner linked to the channel.
-    #[serde(rename = "contentOwner")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_owner: Option<String>,
-    /// The date and time of when the channel was linked to the content owner. The value is specified in ISO 8601 format.
-    #[serde(rename = "timeLinked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_linked: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperChatDetails {
+    /// Privacy status of the channel.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<ChannelStatusPrivacyStatus>,
+    /// The long uploads status of this channel. See https://support.google.com/youtube/answer/71673 for more information.
+    #[serde(rename = "longUploadsStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub long_uploads_status: Option<ChannelStatusLongUploadsStatus>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatFanFundingEventDetails {
+    /// The comment added by the user to this fan funding event.
+    #[serde(rename = "userComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_comment: Option<String>,
+    /// The currency in which the fund was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
     /// A rendered string that displays the fund amount and currency to the user.
     #[serde(rename = "amountDisplayString")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub amount_display_string: Option<String>,
-    /// 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>,
-    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
+    /// u64: The amount of the fund.
     #[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>,
-    /// The currency in which the purchase was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-}
-
-/// Details about a channel bulletin post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsBulletin {
+}
+
+/// A *channel* resource contains information about a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Channel {
+    #[serde(rename = "contentOwnerDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_owner_details: Option<ChannelContentOwnerDetails>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<ChannelTopicDetails>,
+    #[serde(rename = "auditDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub audit_details: Option<ChannelAuditDetails>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channel".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ChannelSnippet>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ChannelContentDetails>,
+    #[serde(rename = "conversionPings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conversion_pings: Option<ChannelConversionPings>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<ChannelStatistics>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<ChannelStatus>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "brandingSettings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub branding_settings: Option<ChannelBrandingSettings>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, ChannelLocalization>>,
+}
+
+/// Information about a video that was marked as a favorite video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsFavorite {
     #[serde(rename = "resourceId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub resource_id: Option<ResourceId>,
 }
 
-/// Statistics about a channel: number of subscribers, number of videos in the channel, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelStatistics {
-    /// 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 comments for the channel.
-    #[serde(rename = "commentCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_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 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>,
-}
-
-///
-#[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 ChannelListResponse {
-    /// 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>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Channel>>,
-    /// 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 visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseReport {
-    #[serde(rename = "relatedEntities")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub related_entities: Option<Vec<RelatedEntity>>,
-    #[serde(rename = "abuseTypes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub abuse_types: Option<Vec<AbuseType>>,
-    #[serde(rename = "subject")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subject: Option<Entity>,
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-/// 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>,
-    /// The date and time that the broadcast actually started. This information is only available once the broadcast's state is live. The value is specified in ISO 8601 format.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<String>,
-    /// The 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>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The date and time that the broadcast is scheduled to end. The value is specified in ISO 8601 format.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<String>,
-    /// The id of the live chat for this broadcast.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    /// The date and time that the broadcast is scheduled to start. The value is specified in ISO 8601 format.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The date and time that the broadcast was added to YouTube's live broadcast schedule. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete. The value is specified in ISO 8601 format.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<String>,
-}
-
 /// Describes information necessary for ingesting an RTMP or an HTTP stream.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct IngestionInfo {
-    /// This ingestion url may be used instead of backupIngestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
-    #[serde(rename = "rtmpsBackupIngestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rtmps_backup_ingestion_address: Option<String>,
+    /// The 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>,
-    /// The HTTP or RTMP stream name that YouTube assigns to the video stream.
-    #[serde(rename = "streamName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stream_name: Option<String>,
     /// This ingestion url may be used instead of ingestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
     #[serde(rename = "rtmpsIngestionAddress")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -1093,6 +419,10 @@
     #[serde(rename = "ingestionAddress")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub ingestion_address: Option<String>,
+    /// This ingestion url may be used instead of backupIngestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
+    #[serde(rename = "rtmpsBackupIngestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rtmps_backup_ingestion_address: Option<String>,
 }
 
 /// Information about the uploaded video.
@@ -1104,173 +434,9 @@
     pub video_id: 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 = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<PlaylistStatus>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlist".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<PlaylistPlayer>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistSnippet>,
-    /// The ID that YouTube uses to uniquely identify the playlist.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistContentDetails>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LocalizedString {
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentListResponse {
-    /// A list of comments that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Comment>>,
-    /// 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>,
-    /// 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>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// 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>,
-}
-
-/// Basic details about a subscription's subscriber including title, description, channel ID and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionSubscriberSnippet {
-    /// The description of the subscriber.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The title of the subscriber.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The channel ID of the subscriber.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-/// Internal representation of thumbnails for a YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThumbnailDetails {
-    #[serde(rename = "medium")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub medium: Option<Thumbnail>,
-    #[serde(rename = "high")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub high: 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 = "maxres")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub maxres: Option<Thumbnail>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityListResponse {
-    /// 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>>,
-    #[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>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activityListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistListResponse {
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
@@ -1278,52 +444,42 @@
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
+    /// A list of playlists that match the request criteria
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Playlist>>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
 }
 
-/// 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>,
-    /// Priority of the live broadcast event (internal state).
-    #[serde(rename = "liveBroadcastPriority")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_priority: Option<String>,
-    /// The broadcast's recording status.
-    #[serde(rename = "recordingStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_status: Option<String>,
-    /// 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<String>,
-    /// 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 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<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastListResponse {
-    /// A list of broadcasts that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveBroadcast>>,
-    /// 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 MembershipsLevelListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
     /// Serialized EventId of the request which produced this response.
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -1332,11 +488,293 @@
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
+    /// A list of pricing levels offered by a creator to the fans.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<MembershipsLevel>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// Branding properties for images associated with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ImageSettings {
+    /// Banner image. Mobile size (640x175).
+    #[serde(rename = "bannerMobileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_image_url: Option<String>,
+    #[serde(rename = "smallBrandedBannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub small_branded_banner_image_url: Option<LocalizedProperty>,
+    #[serde(rename = "largeBrandedBannerImageImapScript")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub large_branded_banner_image_imap_script: Option<LocalizedProperty>,
+    /// Banner image. Mobile size high resolution (1280x360).
+    #[serde(rename = "bannerMobileHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_hd_image_url: Option<String>,
+    #[serde(rename = "backgroundImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub background_image_url: Option<LocalizedProperty>,
+    /// Banner image. Desktop size (1060x175).
+    #[serde(rename = "bannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_image_url: Option<String>,
+    /// Banner image. Tablet size high resolution (2276x377).
+    #[serde(rename = "bannerTabletHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_hd_image_url: Option<String>,
+    /// Banner image. TV size extra high resolution (2120x1192).
+    #[serde(rename = "bannerTvImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_image_url: Option<String>,
+    /// Banner image. Mobile size medium/high resolution (960x263).
+    #[serde(rename = "bannerMobileMediumHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_medium_hd_image_url: Option<String>,
+    #[serde(rename = "smallBrandedBannerImageImapScript")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
+    #[serde(rename = "largeBrandedBannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub large_branded_banner_image_url: Option<LocalizedProperty>,
+    /// The URL for a 1px by 1px tracking pixel that can be used to collect statistics for views of the channel or video pages.
+    #[serde(rename = "trackingImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tracking_image_url: Option<String>,
+    /// Banner image. TV size high resolution (1920x1080).
+    #[serde(rename = "bannerTvHighImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_high_image_url: Option<String>,
+    #[serde(rename = "watchIconImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch_icon_image_url: Option<String>,
+    /// This is used only in update requests; if it's set, we use this URL to generate all of the above banner URLs.
+    #[serde(rename = "bannerExternalUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_external_url: Option<String>,
+    /// Banner image. TV size medium resolution (1280x720).
+    #[serde(rename = "bannerTvMediumImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_medium_image_url: Option<String>,
+    /// Banner image. Tablet size low resolution (1138x188).
+    #[serde(rename = "bannerTabletLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_low_image_url: Option<String>,
+    /// Banner image. Tablet size (1707x283).
+    #[serde(rename = "bannerTabletImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_image_url: Option<String>,
+    /// Banner image. Mobile size high resolution (1440x395).
+    #[serde(rename = "bannerMobileExtraHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_extra_hd_image_url: Option<String>,
+    /// Banner image. TV size low resolution (854x480).
+    #[serde(rename = "bannerTvLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_low_image_url: Option<String>,
+    /// Banner image. Mobile size low resolution (320x88).
+    #[serde(rename = "bannerMobileLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_low_image_url: Option<String>,
+    /// Banner image. Tablet size extra high resolution (2560x424).
+    #[serde(rename = "bannerTabletExtraHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_extra_hd_image_url: Option<String>,
+}
+
+/// ChannelSection localization setting
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionLocalization {
+    /// The localized strings for channel section's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LocalizedProperty {
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<Vec<LocalizedString>>,
+    #[serde(rename = "default")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default: Option<String>,
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<LanguageTag>,
+}
+
+/// Details about a social network post.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsSocial {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// The author of the social network post.
+    #[serde(rename = "author")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author: Option<String>,
+    /// The URL of the social network post.
+    #[serde(rename = "referenceUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reference_url: Option<String>,
+    /// The name of the social network.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<ActivityContentDetailsSocialType>,
+    /// An image of the post's author.
+    #[serde(rename = "imageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_url: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelProfileDetails {
+    /// The channel's URL.
+    #[serde(rename = "channelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_url: Option<String>,
+    /// The YouTube channel ID.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEventSnippet {
+    /// The tier for the paid message, which is based on the amount of money spent to purchase the message.
+    #[serde(rename = "messageType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_type: Option<u32>,
+    #[serde(rename = "supporterDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub supporter_details: Option<ChannelProfileDetails>,
+    /// The currency in which the purchase was made. ISO 4217.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+    /// A rendered string that displays the purchase amount and currency (e.g., "$1.00"). The string is rendered for the given language.
+    #[serde(rename = "displayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_string: Option<String>,
+    /// u64: The purchase amount, in micros of the purchase currency. e.g., 1 is represented as 1000000.
+    #[serde(rename = "amountMicros")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_micros: Option<String>,
+    /// The date and time when the event occurred. The value is specified in ISO 8601 format.
+    #[serde(rename = "createdAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub created_at: Option<String>,
+    /// Channel id where the event occurred.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    #[serde(rename = "superStickerMetadata")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_metadata: Option<SuperStickerMetadata>,
+    /// The text contents of the comment left by the user.
+    #[serde(rename = "commentText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment_text: Option<String>,
+    /// True if this event is a Super Sticker event.
+    #[serde(rename = "isSuperStickerEvent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_super_sticker_event: Option<bool>,
+}
+
+/// A `__videoAbuseReportReason__` resource identifies a reason that a video could be reported as abusive. Video abuse report reasons are used with `video.ReportAbuse`.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReason {
+    /// The ID of this abuse report reason.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReason"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoAbuseReportReasonSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelConversionPing {
+    /// The url (without the schema) that the player shall send the ping to. It's at caller's descretion to decide which schema to use (http vs https) Example of a returned url: //googleads.g.doubleclick.net/pagead/ viewthroughconversion/962985656/?data=path%3DtHe_path%3Btype%3D cview%3Butuid%3DGISQtTNGYqaYl4sKxoVvKA&labe=default The caller must append biscotti authentication (ms param in case of mobile, for example) to this ping.
+    #[serde(rename = "conversionUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conversion_url: Option<String>,
+    /// Defines the context of the ping.
+    #[serde(rename = "context")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub context: Option<ChannelConversionPingContext>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MemberListResponse {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#memberListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcastListResponse".
+    /// A list of members that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Member>>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// A *liveChatModerator* resource represents a moderator for a YouTube live chat. A chat moderator has the ability to ban/unban users from a chat, remove message, etc.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModerator {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveChatModeratorSnippet>,
+    /// The ID that YouTube assigns to uniquely identify the moderator.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModerator".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
@@ -1344,285 +782,363 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailSetResponse {
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// A list of thumbnails.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<ThumbnailDetails>>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thumbnailSetResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// Information about a resource that received a positive (like) rating.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsLike {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// A *liveChatMessage* resource represents a chat message in a YouTube Live Chat.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessage {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveChatMessageSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessage".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the message.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "authorDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_details: Option<LiveChatMessageAuthorDetails>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamConfigurationIssue {
+    /// The kind of error happening.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<LiveStreamConfigurationIssueType>,
+    /// How severe this issue is to the stream.
+    #[serde(rename = "severity")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub severity: Option<LiveStreamConfigurationIssueSeverity>,
+    /// The short-form reason for this issue.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<String>,
+    /// The long-form description of the issue and how to resolve it.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+}
+
+/// Brief description of the live stream cdn settings.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CdnSettings {
+    /// The format of the video stream that you are sending to Youtube.
+    #[serde(rename = "format")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub format: Option<String>,
+    ///  The method or protocol used to transmit the video stream.
+    #[serde(rename = "ingestionType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ingestion_type: Option<CdnSettingsIngestionType>,
+    /// The resolution of the inbound video data.
+    #[serde(rename = "resolution")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resolution: Option<CdnSettingsResolution>,
+    #[serde(rename = "ingestionInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ingestion_info: Option<IngestionInfo>,
+    /// The frame rate of the inbound video data.
+    #[serde(rename = "frameRate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub frame_rate: Option<CdnSettingsFrameRate>,
+}
+
+/// Basic details about a video category, such as its localized title.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonSnippet {
+    /// The secondary reasons associated with this reason, if any are available. (There might be 0 or more.)
+    #[serde(rename = "secondaryReasons")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub secondary_reasons: Option<Vec<VideoAbuseReportSecondaryReason>>,
+    /// The localized label belonging to this abuse report reason.
+    #[serde(rename = "label")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub label: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcastListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
     #[serde(rename = "tokenPagination")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub token_pagination: Option<TokenPagination>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
-}
-
-/// A 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 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestItemTestItemSnippet {}
-
-/// Statistics about the video, such as the number of times the video was viewed or liked.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoStatistics {
-    /// u64: The number of users who 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 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 comments for the video.
-    #[serde(rename = "commentCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_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>,
-}
-
-/// 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>,
-    /// (Optional) Height of the thumbnail image.
-    #[serde(rename = "height")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height: Option<u32>,
-    /// The thumbnail image's URL.
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDetails {
-    /// 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>,
-    /// 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>>,
-    /// 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>>,
-    /// 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>,
-}
-
-/// 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 country the channel section is targeting.
-    #[serde(rename = "countries")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub countries: 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>>,
-}
-
-/// A *third party account link* resource represents a link between a YouTube account or a channel and an account on a third-party service.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLink {
-    /// The linking_token identifies a YouTube account and channel with which the third party account is linked.
-    #[serde(rename = "linkingToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub linking_token: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ThirdPartyLinkSnippet>,
-    /// 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<ThirdPartyLinkStatus>,
-    /// 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>,
-}
-
-/// 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>>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperStickerDetails {
-    /// 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>,
-    #[serde(rename = "superStickerMetadata")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
-    #[serde(rename = "tier")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tier: Option<u32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestItem {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<TestItemTestItemSnippet>,
+    /// A list of broadcasts that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveBroadcast>>,
+}
+
+/// Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and editor suggestions.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSuggestions {
+    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
+    #[serde(rename = "tagSuggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
+    /// A list of video editing operations that might improve the video quality or playback experience of the uploaded video.
+    #[serde(rename = "editorSuggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub editor_suggestions: Option<Vec<VideoSuggestionsEditorSuggestions>>,
+    /// A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.
+    #[serde(rename = "processingWarnings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_warnings: Option<Vec<VideoSuggestionsProcessingWarnings>>,
+    /// A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed.
+    #[serde(rename = "processingErrors")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_errors: Option<Vec<VideoSuggestionsProcessingErrors>>,
+    /// A list of suggestions that may improve YouTube's ability to process the video.
+    #[serde(rename = "processingHints")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_hints: Option<Vec<VideoSuggestionsProcessingHints>>,
+}
+
+/// Playlist localization setting
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistLocalization {
+    /// The localized strings for playlist's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The localized strings for playlist's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// Project specific details about the content of a YouTube Video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProjectDetails {
+    /// A list of project tags associated with the video during the upload.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<String>>,
+}
+
+/// Channel localization setting
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelLocalization {
+    /// The localized strings for channel's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The localized strings for channel's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// A *playlistItem* resource identifies another resource, such as a video, that is included in a playlist. In addition, the playlistItem resource contains details about the included resource that pertain specifically to how that resource is used in that playlist. YouTube uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods. For example, if a user gives a positive rating to a video, you would insert that video into the liked videos playlist for that user's channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItem {
+    /// The ID that YouTube uses to uniquely identify the playlist item.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-    /// i64:
-    #[serde(rename = "gaia")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub gaia: Option<String>,
-}
-
-///
-#[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>,
-}
-
-/// Basic details about an i18n region, such as region code and human-readable name.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionSnippet {
-    /// The region code as a 2-letter ISO country code.
-    #[serde(rename = "gl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub gl: Option<String>,
-    /// The human-readable name of the region.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct 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>,
-}
-
-/// Basic details about a channel, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSnippet {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<PlaylistItemSnippet>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<PlaylistItemStatus>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<PlaylistItemContentDetails>,
+}
+
+/// Basic details about a subscription's subscriber including title, description, channel ID and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionSubscriberSnippet {
+    /// The channel ID of the subscriber.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The title of the subscriber.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The description of the subscriber.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+}
+
+/// Branding properties for the channel view.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSettings {
+    /// A prominent color that can be rendered on this channel page.
+    #[serde(rename = "profileColor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_color: Option<String>,
+    /// Title for the featured channels tab.
+    #[serde(rename = "featuredChannelsTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_channels_title: Option<String>,
+    /// The trailer of the channel, for users that are not subscribers.
+    #[serde(rename = "unsubscribedTrailer")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub unsubscribed_trailer: Option<String>,
+    /// Specifies the channel title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// Specifies the channel description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// Whether the tab to browse the videos should be displayed.
+    #[serde(rename = "showBrowseView")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub show_browse_view: Option<bool>,
+    /// Which content tab users should see when viewing the channel.
+    #[serde(rename = "defaultTab")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_tab: Option<String>,
+    /// The list of featured channels.
+    #[serde(rename = "featuredChannelsUrls")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_channels_urls: Option<Vec<String>>,
+    /// Lists keywords associated with the channel, comma-separated.
+    #[serde(rename = "keywords")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub keywords: Option<String>,
+    /// Whether user-submitted comments left on the channel page need to be approved by the channel owner to be publicly visible.
+    #[serde(rename = "moderateComments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderate_comments: Option<bool>,
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+    /// Whether related channels should be proposed.
+    #[serde(rename = "showRelatedChannels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub show_related_channels: Option<bool>,
     /// The country of the channel.
     #[serde(rename = "country")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub country: Option<String>,
-    /// The date and time that the channel was created. The value is specified in < a href="//www.w3.org/TR/NOTE-datetime">ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// 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 channel's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
+    /// The ID for a Google Analytics account to track and measure traffic to the channels.
+    #[serde(rename = "trackingAnalyticsAccountId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tracking_analytics_account_id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Entity {
+    #[serde(rename = "typeId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_id: Option<String>,
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: Option<String>,
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchListResponse {
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-    /// 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".
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchListResponse".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
@@ -1630,97 +1146,17 @@
     #[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>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistContentDetails {
-    /// The number of videos in the playlist.
-    #[serde(rename = "itemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub item_count: Option<u32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatTextMessageDetails {
-    /// The user's message.
-    #[serde(rename = "messageText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_text: Option<String>,
-}
-
-/// 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<String>,
-}
-
-/// Details about the content of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoContentDetails {
-    /// 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<String>,
-    /// 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>,
-    /// Specifies the projection format of the video.
-    #[serde(rename = "projection")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub projection: 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>,
-    /// 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 = "countryRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country_restriction: Option<AccessPolicy>,
-    /// 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<String>,
-    #[serde(rename = "regionRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
-    #[serde(rename = "contentRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_rating: Option<ContentRating>,
-    /// The value of 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>,
+    /// Pagination information for token pagination.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<SearchResult>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    #[serde(rename = "regionCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_code: Option<String>,
 }
 
 ///
@@ -1748,234 +1184,358 @@
     pub event_id: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReport {
-    /// The high-level, or primary, reason that the content is abusive. The value is an abuse report reason ID.
-    #[serde(rename = "reasonId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason_id: Option<String>,
-    /// The language that the content was viewed in.
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-    /// Additional comments regarding the abuse report.
+/// DEPRECATED Region restriction of the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoContentDetailsRegionRestriction {
+    /// A list of region codes that identify countries where the video is blocked. If this property is present and a country is not listed in its value, then the video is viewable in that country. If this property is present and contains an empty list, the video is viewable in all countries.
+    #[serde(rename = "blocked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub blocked: Option<Vec<String>>,
+    /// A list of region codes that identify countries where the video is viewable. If this property is present and a country is not listed in its value, then the video is blocked from appearing in that country. If this property is present and contains an empty list, the video is blocked in all countries.
+    #[serde(rename = "allowed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub allowed: Option<Vec<String>>,
+}
+
+/// Comments written in (direct or indirect) reply to the top level comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadReplies {
+    /// A limited number of replies. Unless the number of replies returned equals total_reply_count in the snippet the returned replies are only a subset of the total number of replies.
     #[serde(rename = "comments")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub comments: Option<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 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>,
-}
-
-/// A *channel* resource contains information about a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Channel {
-    #[serde(rename = "topicDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_details: Option<ChannelTopicDetails>,
-    /// 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 = "contentOwnerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_owner_details: Option<ChannelContentOwnerDetails>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<ChannelStatistics>,
-    /// 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 = "auditDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audit_details: Option<ChannelAuditDetails>,
-    #[serde(rename = "brandingSettings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub branding_settings: Option<ChannelBrandingSettings>,
-    #[serde(rename = "conversionPings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conversion_pings: Option<ChannelConversionPings>,
+    pub comments: Option<Vec<Comment>>,
+}
+
+/// A search result contains information about a YouTube video, channel, or playlist that matches the search parameters specified in an API request. While a search result points to a uniquely identifiable resource, like a video, it does not have its own persistent data.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchResult {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ChannelSnippet>,
+    pub snippet: Option<SearchResultSnippet>,
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<ResourceId>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchResult".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// Stub token pagination template to suppress results.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TokenPagination {}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityListResponse {
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activityListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Activity>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+}
+
+/// A *playlist* resource represents a YouTube playlist. A playlist is a collection of videos that can be viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not limit the number of playlists that each user creates. By default, playlists are publicly visible to other users, but playlists can be public or private. YouTube also uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Playlist {
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<PlaylistStatus>,
+    #[serde(rename = "player")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub player: Option<PlaylistPlayer>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlist".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// Localizations for different languages
     #[serde(rename = "localizations")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelLocalization>>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ChannelContentDetails>,
-    /// 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<ChannelStatus>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBanSnippet {
-    /// The type of ban.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
-    /// The chat this ban is pertinent to.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    /// 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>,
-    #[serde(rename = "bannedUserDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banned_user_details: Option<ChannelProfileDetails>,
-}
-
-/// 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>,
-}
-
-/// 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<String>,
-    #[serde(rename = "channelToStoreLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_to_store_link: Option<ChannelToStoreLinkDetails>,
-}
-
-/// 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>,
-}
-
-/// Basic details about an activity, including title, description, thumbnails, activity type and group. Next ID: 12
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivitySnippet {
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// 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<String>,
-    /// The description of the resource primarily associated with the activity. @mutable youtube.activities.insert
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The title of the resource primarily associated with the activity.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel associated with the activity.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The date and time that the video was uploaded. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    /// Channel title for the channel responsible for this activity
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: 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 {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<LiveBroadcastStatistics>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveBroadcastStatus>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcast".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the broadcast.
+    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
+    /// The ID that YouTube uses to uniquely identify the playlist.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
     #[serde(rename = "contentDetails")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveBroadcastContentDetails>,
+    pub content_details: Option<PlaylistContentDetails>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveBroadcastSnippet>,
-}
-
-/// 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 PlaylistListResponse {
-    /// A list of playlists that match the request criteria
+    pub snippet: Option<PlaylistSnippet>,
+}
+
+/// Freebase topic information related to the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoTopicDetails {
+    /// A list of Freebase topic IDs that are centrally associated with the video. These are topics that are centrally featured in the video, and it can be said that the video is mainly about each of these. You can retrieve information about each topic using the < a href="http://wiki.freebase.com/wiki/Topic_API">Freebase Topic API.
+    #[serde(rename = "topicIds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_ids: Option<Vec<String>>,
+    /// A list of Wikipedia URLs that provide a high-level description of the video's content.
+    #[serde(rename = "topicCategories")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_categories: Option<Vec<String>>,
+    /// Similar to topic_id, except that these topics are merely relevant to the video. These are topics that may be mentioned in, or appear in the video. You can retrieve information about each topic using Freebase Topic API.
+    #[serde(rename = "relevantTopicIds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub relevant_topic_ids: Option<Vec<String>>,
+}
+
+/// Information about a new playlist item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPlaylistItem {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// The value that YouTube uses to uniquely identify the playlist.
+    #[serde(rename = "playlistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_id: Option<String>,
+    /// ID of the item within the playlist.
+    #[serde(rename = "playlistItemId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_item_id: Option<String>,
+}
+
+/// Details about a resource which is being promoted.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPromotedItem {
+    /// The text description to accompany the promoted item.
+    #[serde(rename = "descriptionText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description_text: Option<String>,
+    /// The URL the client should ping to indicate that the user was shown this promoted item.
+    #[serde(rename = "creativeViewUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creative_view_url: Option<String>,
+    /// The list of forecasting URLs. The client should ping all of these URLs when a promoted item is not available, to indicate that a promoted item could have been shown.
+    #[serde(rename = "forecastingUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub forecasting_url: Option<Vec<String>>,
+    /// The list of impression URLs. The client should ping all of these URLs to indicate that the user was shown this promoted item.
+    #[serde(rename = "impressionUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub impression_url: Option<Vec<String>>,
+    /// The URL the client should ping to indicate that the user clicked through on this promoted item.
+    #[serde(rename = "clickTrackingUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub click_tracking_url: Option<String>,
+    /// The URL the client should direct the user to, if the user chooses to visit the advertiser's website.
+    #[serde(rename = "destinationUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub destination_url: Option<String>,
+    /// The URL the client should fetch to request a promoted item.
+    #[serde(rename = "adTag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ad_tag: Option<String>,
+    /// The custom call-to-action button text. If specified, it will override the default button text for the cta_type.
+    #[serde(rename = "customCtaButtonText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub custom_cta_button_text: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the promoted video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The type of call-to-action, a message to the user indicating action that can be taken.
+    #[serde(rename = "ctaType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cta_type: Option<ActivityContentDetailsPromotedItemCtaType>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistPlayer {
+    /// An <iframe> tag that embeds a player that will play the playlist.
+    #[serde(rename = "embedHtml")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embed_html: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategoryListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategoryListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// A list of video categories that can be associated with YouTube videos. In this map, the video category ID is the map key, and its value is the corresponding videoCategory resource.
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Playlist>>,
-    /// 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>,
+    pub items: Option<Vec<VideoCategory>>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguageListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguageListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// A list of supported i18n languages. In this map, the i18n language ID is the map key, and its value is the corresponding i18nLanguage resource.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<I18nLanguage>>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestItem {
+    /// i64:
+    #[serde(rename = "gaia")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub gaia: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<TestItemTestItemSnippet>,
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+/// Detailed settings of a stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamContentDetails {
+    /// Indicates whether the stream is reusable, which means that it can be bound to multiple broadcasts. It is common for broadcasters to reuse the same stream for many different broadcasts if those broadcasts occur at different times. If you set this value to false, then the stream will not be reusable, which means that it can only be bound to one broadcast. Non-reusable streams differ from reusable streams in the following ways: - A non-reusable stream can only be bound to one broadcast. - A non-reusable stream might be deleted by an automated process after the broadcast ends. - The liveStreams.list method does not list non-reusable streams if you call the method and set the mine parameter to true. The only way to use that method to retrieve the resource for a non-reusable stream is to use the id parameter to identify the stream.
+    #[serde(rename = "isReusable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_reusable: Option<bool>,
+    /// The ingestion URL where the closed captions of this stream are sent.
+    #[serde(rename = "closedCaptionsIngestionUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub closed_captions_ingestion_url: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperStickerMetadata {
+    /// Unique identifier of the Super Sticker. This is a shorter form of the alt_text that includes pack name and a recognizable characteristic of the sticker.
+    #[serde(rename = "stickerId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub sticker_id: Option<String>,
+    /// Specifies the localization language in which the alt text is returned.
+    #[serde(rename = "altTextLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt_text_language: Option<String>,
+    /// Internationalized alt text that describes the sticker image and any animation associated with it.
+    #[serde(rename = "altText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt_text: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageAuthorDetails {
+    /// Whether the author's identity has been verified by YouTube.
+    #[serde(rename = "isVerified")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_verified: Option<bool>,
+    /// The channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+    /// Whether the author is the owner of the live chat.
+    #[serde(rename = "isChatOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_owner: Option<bool>,
+    /// The channel's URL.
+    #[serde(rename = "channelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_url: Option<String>,
+    /// Whether the author is a sponsor of the live chat.
+    #[serde(rename = "isChatSponsor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_sponsor: Option<bool>,
+    /// The YouTube channel ID.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// Whether the author is a moderator of the live chat.
+    #[serde(rename = "isChatModerator")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_moderator: Option<bool>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegionListResponse {
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -1984,13 +1544,238 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
+    /// A list of regions where YouTube is available. In this map, the i18n region ID is the map key, and its value is the corresponding i18nRegion resource.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<I18nRegion>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorSnippet {
+    #[serde(rename = "moderatorDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderator_details: Option<ChannelProfileDetails>,
+    /// The ID of the live chat this moderator can act on.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamListResponse {
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
     #[serde(rename = "tokenPagination")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub token_pagination: Option<TokenPagination>,
+    /// A list of live streams that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveStream>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStreamListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// Live broadcast state.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastStatus {
+    /// The broadcast's status. The status can be updated using the API's liveBroadcasts.transition method.
+    #[serde(rename = "lifeCycleStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub life_cycle_status: Option<LiveBroadcastStatusLifeCycleStatus>,
+    /// This field will be set to True if the creator declares the broadcast to be kids only: go/live-cw-work.
+    #[serde(rename = "selfDeclaredMadeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_declared_made_for_kids: Option<bool>,
+    /// Whether the broadcast is made for kids or not, decided by YouTube instead of the creator. This field is read only.
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// The broadcast's recording status.
+    #[serde(rename = "recordingStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_status: Option<LiveBroadcastStatusRecordingStatus>,
+    /// The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<LiveBroadcastStatusPrivacyStatus>,
+    /// Priority of the live broadcast event (internal state).
+    #[serde(rename = "liveBroadcastPriority")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_priority: Option<LiveBroadcastStatusLiveBroadcastPriority>,
+}
+
+/// An *i18nLanguage* resource identifies a UI language currently supported by YouTube.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguage {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguage".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the i18n language.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<I18nLanguageSnippet>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentListResponse {
+    /// A list of comments that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Comment>>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistContentDetails {
+    /// The number of videos in the playlist.
+    #[serde(rename = "itemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub item_count: Option<u32>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageDeletedDetails {
+    #[serde(rename = "deletedMessageId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub deleted_message_id: Option<String>,
+}
+
+/// Describes processing status and progress and availability of some other Video resource parts.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProcessingDetails {
+    /// The video's processing status. This value indicates whether YouTube was able to process the video or if the video is still being processed.
+    #[serde(rename = "processingStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_status: Option<VideoProcessingDetailsProcessingStatus>,
+    /// This value indicates whether file details are available for the uploaded video. You can retrieve a video's file details by requesting the fileDetails part in your videos.list() request.
+    #[serde(rename = "fileDetailsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_details_availability: Option<String>,
+    /// This value indicates whether keyword (tag) suggestions are available for the video. Tags can be added to a video's metadata to make it easier for other users to find the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "tagSuggestionsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag_suggestions_availability: Option<String>,
+    /// This value indicates whether video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "editorSuggestionsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub editor_suggestions_availability: Option<String>,
+    #[serde(rename = "processingProgress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_progress: Option<VideoProcessingDetailsProcessingProgress>,
+    /// The reason that YouTube failed to process the video. This property will only have a value if the processingStatus property's value is failed.
+    #[serde(rename = "processingFailureReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_failure_reason: Option<VideoProcessingDetailsProcessingFailureReason>,
+    /// This value indicates whether the video processing engine has generated suggestions that might improve YouTube's ability to process the the video, warnings that explain video processing problems, or errors that cause video processing problems. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "processingIssuesAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_issues_availability: Option<String>,
+    /// This value indicates whether thumbnail images have been generated for the video.
+    #[serde(rename = "thumbnailsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails_availability: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorListResponse {
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModeratorListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// A list of moderators that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveChatModerator>>,
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
@@ -1998,39 +1783,47 @@
     #[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>,
-}
-
-/// A live stream describes a live ingestion point.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStream {
-    /// 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>,
-    /// 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 = "cdn")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cdn: Option<CdnSettings>,
-    /// 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<LiveStreamStatus>,
-    #[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>,
+}
+
+/// Basic details about a video category, such as its localized title.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategorySnippet {
+    #[serde(rename = "assignable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub assignable: Option<bool>,
+    /// The video category's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The YouTube channel that created the video category.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemContentDetails {
+    /// The date and time that the video was published to YouTube. The value is specified in ISO 8601 format.
+    #[serde(rename = "videoPublishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_published_at: Option<String>,
+    /// The time, measured in seconds from the start of the video, when the video should stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video.
+    #[serde(rename = "endAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub end_at: Option<String>,
+    /// The ID that YouTube uses to uniquely identify a video. To retrieve the video resource, set the id query parameter to this value in your API request.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The time, measured in seconds from the start of the video, when the video should start playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) The default value is 0.
+    #[serde(rename = "startAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub start_at: Option<String>,
+    /// A user-generated note for this item.
+    #[serde(rename = "note")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub note: Option<String>,
 }
 
 ///
@@ -2046,164 +1839,96 @@
     pub label: Option<String>,
 }
 
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDurationAtLevel {
-    /// The cumulative time the user has been a member for the given level in complete months (the time is rounded down to the nearest integer).
-    #[serde(rename = "memberTotalDurationMonths")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_total_duration_months: Option<i32>,
-    /// Pricing level ID.
-    #[serde(rename = "level")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub level: Option<String>,
-    /// The date and time when the user became a continuous member for the given level.
-    #[serde(rename = "memberSince")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_since: Option<String>,
-}
-
-///
-#[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 PlaylistItemListResponse {
-    /// A list of playlist items that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<PlaylistItem>>,
-    /// 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>,
-    #[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 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 = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-}
-
-/// 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>,
-}
-
-/// 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 LocalizedProperty {
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<LanguageTag>,
-    #[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>>,
-}
-
-/// A *comment* represents a single YouTube comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Comment {
-    /// 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#comment".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the comment.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CommentSnippet>,
-}
-
-/// 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>,
-}
-
-/// 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".
+/// Information about a video stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoFileDetailsVideoStream {
+    /// The amount that YouTube needs to rotate the original source content to properly display the video.
+    #[serde(rename = "rotation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rotation: Option<VideoFileDetailsVideoStreamRotation>,
+    /// The video codec that the stream uses.
+    #[serde(rename = "codec")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub codec: Option<String>,
+    /// The encoded video content's height in pixels.
+    #[serde(rename = "heightPixels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub height_pixels: Option<u32>,
+    /// The encoded video content's width in pixels. You can calculate the video's encoding aspect ratio as width_pixels / height_pixels.
+    #[serde(rename = "widthPixels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub width_pixels: Option<u32>,
+    /// u64: The video stream's bitrate, in bits per second.
+    #[serde(rename = "bitrateBps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bitrate_bps: Option<String>,
+    /// The video stream's frame rate, in frames per second.
+    #[serde(rename = "frameRateFps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub frame_rate_fps: Option<f64>,
+    /// The video content's display aspect ratio, which specifies the aspect ratio in which the video should be displayed.
+    #[serde(rename = "aspectRatio")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub aspect_ratio: Option<f64>,
+    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
+    #[serde(rename = "vendor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub vendor: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatSuperChatDetails {
+    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
+    #[serde(rename = "amountMicros")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_micros: Option<String>,
+    /// The comment added by the user to this Super Chat event.
+    #[serde(rename = "userComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_comment: Option<String>,
+    /// The currency in which the purchase was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+    /// A rendered string that displays the fund amount and currency to the user.
+    #[serde(rename = "amountDisplayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_display_string: Option<String>,
+    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
+    #[serde(rename = "tier")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tier: Option<u32>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsDetails {
+    /// Ids of all levels that the user has access to. This includes the currently active level and all other levels that are included because of a higher purchase.
+    #[serde(rename = "accessibleLevels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub accessible_levels: Option<Vec<String>>,
+    /// Data about memberships duration on particular pricing levels.
+    #[serde(rename = "membershipsDurationAtLevels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_duration_at_levels: Option<Vec<MembershipsDurationAtLevel>>,
+    /// Id of the highest level that the user has access to at the moment.
+    #[serde(rename = "highestAccessibleLevel")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub highest_accessible_level: Option<String>,
+    /// Display name for the highest level that the user has access to at the moment.
+    #[serde(rename = "highestAccessibleLevelDisplayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub highest_accessible_level_display_name: Option<String>,
+    #[serde(rename = "membershipsDuration")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_duration: Option<MembershipsDuration>,
+}
+
+/// A *member* resource represents a member for a YouTube channel. A member provides recurring monetary support to a creator and receives special benefits.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Member {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#member".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
@@ -2211,103 +1936,9 @@
     #[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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguageListResponse {
-    /// A list of supported i18n languages. In this map, the i18n language ID is the map key, and its value is the corresponding i18nLanguage resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<I18nLanguage>>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguageListResponse".
-    #[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>,
-}
-
-/// 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 = "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>,
-}
-
-/// Details about the live streaming metadata.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoLiveStreamingDetails {
-    /// The time that the broadcast is scheduled to begin. The value is specified in ISO 8601 format.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<String>,
-    /// The time that the broadcast is scheduled to end. The value is specified in ISO 8601 format. If the value is empty or the property is not present, then the broadcast is scheduled to continue indefinitely.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<String>,
-    /// The 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>,
-    /// The time that the broadcast actually ended. The value is specified in ISO 8601 format. This value will not be available until the broadcast is over.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<String>,
-    /// The time that the broadcast actually started. The value is specified in ISO 8601 format. This value will not be available until the broadcast begins.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatFanFundingEventDetails {
-    /// The comment added by the user to this fan funding event.
-    #[serde(rename = "userComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_comment: Option<String>,
-    /// 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>,
-    /// The currency in which the fund was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<MemberSnippet>,
 }
 
 /// A *caption* resource represents a YouTube caption track. A caption track is associated with exactly one YouTube video.
@@ -2321,214 +1952,59 @@
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#caption".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub snippet: Option<CaptionSnippet>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-/// 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<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 {
-    /// 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<String>,
-    #[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 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 value that YouTube uses to uniquely identify the channel that published the resource that the search result identifies.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The title of the search result.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The creation date and time of the resource that the search result identifies. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-}
-
-/// Branding properties for the channel view.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSettings {
-    /// The ID for a Google Analytics account to track and measure traffic to the channels.
-    #[serde(rename = "trackingAnalyticsAccountId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tracking_analytics_account_id: Option<String>,
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    /// Specifies the channel description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// Specifies the channel title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub 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>,
-    /// 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>,
-    /// 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>,
-    /// Whether related channels should be proposed.
-    #[serde(rename = "showRelatedChannels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub show_related_channels: 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>,
-    /// Which content tab users should see when viewing the channel.
-    #[serde(rename = "defaultTab")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_tab: Option<String>,
-    /// The list of featured channels.
-    #[serde(rename = "featuredChannelsUrls")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_channels_urls: Option<Vec<String>>,
-    /// The country of the channel.
-    #[serde(rename = "country")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country: 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategoryListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategoryListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// 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>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-}
-
-///
-#[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>,
-    /// A list of valid abuse reasons that are used with `video.ReportAbuse`.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoAbuseReportReason>>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// 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>,
-}
-
-/// 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 VideoListResponse {
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoListResponse".
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBanSnippet {
+    #[serde(rename = "bannedUserDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banned_user_details: Option<ChannelProfileDetails>,
+    /// The type of ban.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<LiveChatBanSnippetType>,
+    /// u64: The duration of a ban, only filled if the ban has type TEMPORARY.
+    #[serde(rename = "banDurationSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_duration_seconds: Option<String>,
+    /// The chat this ban is pertinent to.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+}
+
+/// The contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentOwnerDetails {
+    /// The ID of the content owner linked to the channel.
+    #[serde(rename = "contentOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_owner: Option<String>,
+    /// The date and time of when the channel was linked to the content owner. The value is specified in ISO 8601 format.
+    #[serde(rename = "timeLinked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_linked: Option<String>,
+}
+
+/// A *comment* represents a single YouTube comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Comment {
+    /// The ID that YouTube uses to uniquely identify the comment.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<CommentSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#comment".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
@@ -2536,253 +2012,271 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Video>>,
+}
+
+/// A *third party account link* resource represents a link between a YouTube account or a channel and an account on a third-party service.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLink {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ThirdPartyLinkSnippet>,
+    /// The linking_token identifies a YouTube account and channel with which the third party account is linked.
+    #[serde(rename = "linkingToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub linking_token: Option<String>,
+    /// Etag of this resource
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thirdPartyLink".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<ThirdPartyLinkStatus>,
+}
+
+/// Statistics about the video, such as the number of times the video was viewed or liked.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoStatistics {
+    /// u64: The number of comments for the video.
+    #[serde(rename = "commentCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment_count: Option<String>,
+    /// u64: The number of users who have indicated that they disliked the video by giving it a negative rating.
+    #[serde(rename = "dislikeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dislike_count: Option<String>,
+    /// u64: The number of users who have indicated that they liked the video by giving it a positive rating.
+    #[serde(rename = "likeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like_count: Option<String>,
+    /// u64: The number of users who currently have the video marked as a favorite video.
+    #[serde(rename = "favoriteCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorite_count: Option<String>,
+    /// u64: The number of times the video has been viewed.
+    #[serde(rename = "viewCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub view_count: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestItemTestItemSnippet {}
+
+/// Recording information associated with the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRecordingDetails {
+    #[serde(rename = "location")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location: Option<GeoPoint>,
+    /// The text description of the location where the video was recorded.
+    #[serde(rename = "locationDescription")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location_description: Option<String>,
+    /// The date and time when the video was recorded. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sssZ) format.
+    #[serde(rename = "recordingDate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_date: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageSnippet {
+    #[serde(rename = "fanFundingEventDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fan_funding_event_details: Option<LiveChatFanFundingEventDetails>,
+    /// Whether the message has display content that should be displayed to users.
+    #[serde(rename = "hasDisplayContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub has_display_content: Option<bool>,
+    #[serde(rename = "superStickerDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_details: Option<LiveChatSuperStickerDetails>,
+    /// Contains a string that can be displayed to the user. If this field is not present the message is silent, at the moment only messages of type TOMBSTONE and CHAT_ENDED_EVENT are silent.
+    #[serde(rename = "displayMessage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_message: Option<String>,
+    #[serde(rename = "superChatDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_chat_details: Option<LiveChatSuperChatDetails>,
+    /// The date and time when the message was orignally published. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    #[serde(rename = "userBannedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_banned_details: Option<LiveChatUserBannedMessageDetails>,
+    #[serde(rename = "textMessageDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_message_details: Option<LiveChatTextMessageDetails>,
+    #[serde(rename = "messageRetractedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_retracted_details: Option<LiveChatMessageRetractedDetails>,
+    /// The type of message, this will always be present, it determines the contents of the message as well as which fields will be present.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<LiveChatMessageSnippetType>,
+    #[serde(rename = "messageDeletedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_deleted_details: Option<LiveChatMessageDeletedDetails>,
+    /// The ID of the user that authored this message, this field is not always filled. textMessageEvent - the user that wrote the message fanFundingEvent - the user that funded the broadcast newSponsorEvent - the user that just became a sponsor messageDeletedEvent - the moderator that took the action messageRetractedEvent - the author that retracted their message userBannedEvent - the moderator that took the action superChatEvent - the user that made the purchase
+    #[serde(rename = "authorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_channel_id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionListResponse {
     /// Serialized EventId of the request which produced this response.
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamHealthStatus {
-    /// u64: The last time this status was updated (in seconds)
-    #[serde(rename = "lastUpdateTimeSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub last_update_time_seconds: Option<String>,
-    /// The status code of this stream
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<String>,
-    /// The configurations issues on this stream
-    #[serde(rename = "configurationIssues")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
-}
-
-/// 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>,
-}
-
-/// Basic details about a subscription, including title, description and thumbnails of the subscribed item.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionSnippet {
-    /// The ID that YouTube uses to uniquely identify the subscriber's channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// Channel title for the channel that the subscription belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The subscription's details.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The subscription's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The date and time that the subscription was created. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-}
-
-/// Project specific details about the content of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProjectDetails {
-    /// A list of project tags associated with the video during the upload.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<String>>,
-}
-
-///
-#[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>,
-    /// 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>,
-    /// 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>,
-}
-
-/// An *i18nLanguage* resource identifies a UI language currently supported by YouTube.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguage {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<I18nLanguageSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguage".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the i18n language.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// 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<String>,
-    /// Defines the position type.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelListResponse {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSectionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
-    /// A list of pricing levels offered by a creator to the fans.
+    /// A list of ChannelSections that match the request criteria.
     #[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>,
+    pub items: Option<Vec<ChannelSection>>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// The 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>,
-}
-
-/// An *activity* resource contains information about an action that a particular channel, or user, has taken on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of action, the channel associated with the action, and the resource(s) associated with the action, such as the video that was rated or uploaded.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Activity {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ActivitySnippet>,
-    /// 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 = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ActivityContentDetails>,
-    /// The ID that YouTube uses to uniquely identify the activity.
+}
+
+/// Video processing progress and completion time estimate.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProcessingDetailsProcessingProgress {
+    /// u64: An estimate of the total number of parts that need to be processed for the video. The number may be updated with more precise estimates while YouTube processes the video.
+    #[serde(rename = "partsTotal")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parts_total: Option<String>,
+    /// u64: The number of parts of the video that YouTube has already processed. You can estimate the percentage of the video that YouTube has already processed by calculating: 100 * parts_processed / parts_total Note that since the estimated number of parts could increase without a corresponding increase in the number of parts that have already been processed, it is possible that the calculated progress could periodically decrease while YouTube processes a video.
+    #[serde(rename = "partsProcessed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parts_processed: Option<String>,
+    /// u64: An estimate of the amount of time, in millseconds, that YouTube needs to finish processing the video.
+    #[serde(rename = "timeLeftMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_left_ms: Option<String>,
+}
+
+/// Details about the content of an activity: the video that was shared, the channel that was subscribed to, etc.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetails {
+    #[serde(rename = "social")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub social: Option<ActivityContentDetailsSocial>,
+    #[serde(rename = "promotedItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub promoted_item: Option<ActivityContentDetailsPromotedItem>,
+    #[serde(rename = "favorite")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorite: Option<ActivityContentDetailsFavorite>,
+    #[serde(rename = "playlistItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_item: Option<ActivityContentDetailsPlaylistItem>,
+    #[serde(rename = "channelItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_item: Option<ActivityContentDetailsChannelItem>,
+    #[serde(rename = "comment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment: Option<ActivityContentDetailsComment>,
+    #[serde(rename = "like")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like: Option<ActivityContentDetailsLike>,
+    #[serde(rename = "bulletin")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bulletin: Option<ActivityContentDetailsBulletin>,
+    #[serde(rename = "recommendation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recommendation: Option<ActivityContentDetailsRecommendation>,
+    #[serde(rename = "subscription")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscription: Option<ActivityContentDetailsSubscription>,
+    #[serde(rename = "upload")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload: Option<ActivityContentDetailsUpload>,
+}
+
+/// A *videoCategory* resource identifies a category that has been or could be associated with uploaded videos.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategory {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategory".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the video category.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-    /// 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 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>,
-    /// The date and time when the event occurred. The value is specified in ISO 8601 format.
-    #[serde(rename = "createdAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub created_at: Option<String>,
-    /// A rendered string that displays the purchase amount and currency (e.g., "$1.00"). The string is rendered for the given language.
-    #[serde(rename = "displayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_string: Option<String>,
-    /// The tier for the paid message, which is based on the amount of money spent to purchase the message.
-    #[serde(rename = "messageType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_type: Option<u32>,
-    /// The text contents of the comment left by the user.
-    #[serde(rename = "commentText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_text: Option<String>,
-    /// True if this event is a Super Sticker event.
-    #[serde(rename = "isSuperStickerEvent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_super_sticker_event: Option<bool>,
-    #[serde(rename = "superStickerMetadata")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// Channel id where the event occurred.
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoCategorySnippet>,
+}
+
+/// Basic details about a playlist, including title, description and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistSnippet {
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<PlaylistLocalization>,
+    /// The playlist's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel that published the playlist.
     #[serde(rename = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
-    #[serde(rename = "supporterDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub supporter_details: Option<ChannelProfileDetails>,
-    /// The currency in which the purchase was made. ISO 4217.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-}
-
-/// 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>>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The playlist's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The channel title of the channel that the video belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The language of the playlist's default title and description.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+    /// The date and time that the playlist was created. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+    /// Keyword tags associated with the playlist.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<String>>,
+}
+
+/// Information about the playlist item's privacy status.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemStatus {
+    /// This resource's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<PlaylistItemStatusPrivacyStatus>,
 }
 
 /// Localized versions of certain video properties (e.g. title).
@@ -2800,127 +2294,172 @@
 
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct RelatedEntity {
-    #[serde(rename = "entity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub entity: Option<Entity>,
-}
-
-/// 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>,
-    /// 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 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>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<VideoLocalization>,
-    /// Channel title for the channel that the video belongs to.
+pub struct PlaylistStatus {
+    /// The playlist's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<PlaylistStatusPrivacyStatus>,
+}
+
+/// Basic details about a comment thread.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadSnippet {
+    /// The total number of replies (not including the top level comment).
+    #[serde(rename = "totalReplyCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_reply_count: Option<u32>,
+    /// The YouTube channel the comments in the thread refer to or the channel with the video the comments refer to. If video_id isn't set the comments refer to the channel itself.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// Whether the thread (and therefore all its comments) is visible to all YouTube users.
+    #[serde(rename = "isPublic")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_public: Option<bool>,
+    #[serde(rename = "topLevelComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub top_level_comment: Option<Comment>,
+    /// Whether the current viewer of the thread can reply to it. This is viewer specific - other viewers may see a different value for this field.
+    #[serde(rename = "canReply")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub can_reply: Option<bool>,
+    /// The ID of the video the comments refer to, if any. No video_id implies a channel discussion comment.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAgeGating {
+    /// Video game rating, if any.
+    #[serde(rename = "videoGameRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_game_rating: Option<VideoAgeGatingVideoGameRating>,
+    /// Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content.
+    #[serde(rename = "alcoholContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alcohol_content: Option<bool>,
+    /// Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present.
+    #[serde(rename = "restricted")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub restricted: Option<bool>,
+}
+
+/// The conversionPings object encapsulates information about conversion pings that need to be respected by the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelConversionPings {
+    /// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
+    #[serde(rename = "pings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pings: Option<Vec<ChannelConversionPing>>,
+}
+
+/// Basic details about an activity, including title, description, thumbnails, activity type and group. Next ID: 12
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivitySnippet {
+    /// Channel title for the channel responsible for this activity
     #[serde(rename = "channelTitle")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_title: Option<String>,
-    /// The YouTube video category associated with the video.
-    #[serde(rename = "categoryId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub category_id: 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>,
     #[serde(rename = "thumbnails")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub thumbnails: Option<ThumbnailDetails>,
-    /// The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: 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>>,
-    /// 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<String>,
     /// The date and time that the video was uploaded. The value is specified in ISO 8601 format.
     #[serde(rename = "publishedAt")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub published_at: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelSnippet {
-    #[serde(rename = "levelDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub level_details: Option<LevelDetails>,
-    /// The id of the channel that's offering channel memberships.
-    #[serde(rename = "creatorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creator_channel_id: Option<String>,
-}
-
-/// Basic 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 AbuseType {
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// 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.
+    /// The group ID associated with the activity. A group ID identifies user events that are associated with the same user and resource. For example, if a user rates a video and marks the same video as a favorite, the entries for those events would have the same group ID in the user's activity feed. In your user interface, you can avoid repetition by grouping events with the same groupId value.
+    #[serde(rename = "groupId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub group_id: Option<String>,
+    /// The description of the resource primarily associated with the activity. @mutable youtube.activities.insert
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel associated with the activity.
     #[serde(rename = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
-    /// The video category's title.
+    /// The title of the resource primarily associated with the activity.
     #[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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Pagination information for token pagination.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<SearchResult>>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
+    /// The type of activity that the resource describes.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<ActivitySnippetType>,
+}
+
+/// Basic details about an i18n region, such as region code and human-readable name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegionSnippet {
+    /// The region code as a 2-letter ISO country code.
+    #[serde(rename = "gl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub gl: Option<String>,
+    /// The human-readable name of the region.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct RelatedEntity {
+    #[serde(rename = "entity")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub entity: Option<Entity>,
+}
+
+/// The third-party link status object contains information about the status of the link.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinkStatus {
+    #[serde(rename = "linkStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub link_status: Option<ThirdPartyLinkStatusLinkStatus>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReport {
+    /// The high-level, or primary, reason that the content is abusive. The value is an abuse report reason ID.
+    #[serde(rename = "reasonId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The language that the content was viewed in.
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
+    /// Additional comments regarding the abuse report.
+    #[serde(rename = "comments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comments: Option<String>,
+    /// The specific, or secondary, reason that this content is abusive (if available). The value is an abuse report reason ID that is a valid secondary reason for the primary reason.
+    #[serde(rename = "secondaryReasonId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub secondary_reason_id: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LanguageTag {
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoListResponse {
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
@@ -2928,91 +2467,126 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    #[serde(rename = "regionCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_code: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
     #[serde(rename = "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 = "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>,
-}
-
-///
-#[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<String>,
-    #[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>,
-}
-
-/// 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>>,
-}
-
-/// The auditDetails object encapsulates channel data that is relevant for YouTube Partners during the audit process.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelAuditDetails {
-    /// Whether or not the channel has any copyright strikes.
-    #[serde(rename = "copyrightStrikesGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub copyright_strikes_good_standing: Option<bool>,
-    /// Whether or not the channel has any unresolved claims.
-    #[serde(rename = "contentIdClaimsGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_id_claims_good_standing: Option<bool>,
-    /// Whether or not the channel respects the community guidelines.
-    #[serde(rename = "communityGuidelinesGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub community_guidelines_good_standing: Option<bool>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelProfileDetails {
-    /// The YouTube channel ID.
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Basic details about rating of a video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRating {
+    /// The ID that YouTube uses to uniquely identify the video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// Rating of a video.
+    #[serde(rename = "rating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rating: Option<VideoRatingRating>,
+}
+
+/// Basic details about a playlist, including title, description and thumbnails. Basic details of a YouTube Playlist item provided by the author. Next ID: 13
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemSnippet {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// Channel title for the channel that the playlist item belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The ID that YouTube uses to uniquely identify thGe playlist that the playlist item is in.
+    #[serde(rename = "playlistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_id: Option<String>,
+    /// The item's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The order in which the item appears in the playlist. The value uses a zero-based index, so the first item has a position of 0, the second item has a position of 1, and so forth.
+    #[serde(rename = "position")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub position: Option<u32>,
+    /// The item's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The date and time that the item was added to the playlist. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The ID that YouTube uses to uniquely identify the user that added the item to the playlist.
     #[serde(rename = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
-    /// 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 channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: Option<String>,
+}
+
+/// Basic details about an i18n language, such as language code and human-readable name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguageSnippet {
+    /// A short BCP-47 code that uniquely identifies a language.
+    #[serde(rename = "hl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hl: Option<String>,
+    /// The human-readable name of the language in the language itself.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: Option<String>,
+}
+
+/// Statistics about a channel: number of subscribers, number of videos in the channel, etc.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelStatistics {
+    /// u64: The number of times the channel has been viewed.
+    #[serde(rename = "viewCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub view_count: Option<String>,
+    /// Whether or not the number of subscribers is shown for this user.
+    #[serde(rename = "hiddenSubscriberCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hidden_subscriber_count: Option<bool>,
+    /// u64: The number of subscribers that the channel has.
+    #[serde(rename = "subscriberCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscriber_count: Option<String>,
+    /// u64: The number of videos uploaded to the channel.
+    #[serde(rename = "videoCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_count: Option<String>,
+    /// u64: The number of comments for the channel.
+    #[serde(rename = "commentCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment_count: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageRetractedDetails {
+    #[serde(rename = "retractedMessageId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub retracted_message_id: Option<String>,
 }
 
 /// Statistics about the live broadcast. These represent a snapshot of the values at the time of the request. Statistics are only returned for live broadcasts.
@@ -3024,6 +2598,647 @@
     pub total_chat_count: Option<String>,
 }
 
+/// Rights management policy for YouTube resources.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AccessPolicy {
+    /// A list of region codes that identify countries where the default policy do not apply.
+    #[serde(rename = "exception")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub exception: Option<Vec<String>>,
+    /// The value of allowed indicates whether the access to the policy is allowed or denied by default.
+    #[serde(rename = "allowed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub allowed: Option<bool>,
+}
+
+/// Details about monetization of a YouTube Video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoMonetizationDetails {
+    #[serde(rename = "access")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub access: Option<AccessPolicy>,
+}
+
+/// Branding properties for the watch. All deprecated.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct WatchSettings {
+    /// The background color for the video watch page's branded area.
+    #[serde(rename = "textColor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_color: Option<String>,
+    /// An ID that uniquely identifies a playlist that displays next to the video player.
+    #[serde(rename = "featuredPlaylistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_playlist_id: Option<String>,
+    /// The text color for the video watch page's branded area.
+    #[serde(rename = "backgroundColor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub background_color: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatTextMessageDetails {
+    /// The user's message.
+    #[serde(rename = "messageText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_text: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsDurationAtLevel {
+    /// The date and time when the user became a continuous member for the given level.
+    #[serde(rename = "memberSince")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_since: Option<String>,
+    /// The cumulative time the user has been a member for the given level in complete months (the time is rounded down to the nearest integer).
+    #[serde(rename = "memberTotalDurationMonths")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_total_duration_months: Option<i32>,
+    /// Pricing level ID.
+    #[serde(rename = "level")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub level: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSection {
+    #[serde(rename = "targeting")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub targeting: Option<ChannelSectionTargeting>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, ChannelSectionLocalization>>,
+    /// The ID that YouTube uses to uniquely identify the channel section.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSection".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ChannelSectionContentDetails>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ChannelSectionSnippet>,
+}
+
+/// 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>,
+}
+
+/// Basic details about a caption track, such as its language and name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionSnippet {
+    /// The date and time when the caption track was last updated. The value is specified in ISO 8601 format.
+    #[serde(rename = "lastUpdated")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub last_updated: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the video associated with the caption track. @mutable youtube.captions.insert
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// Indicates whether the caption track uses large text for the vision-impaired. The default value is false.
+    #[serde(rename = "isLarge")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_large: Option<bool>,
+    /// The reason that YouTube failed to process the caption track. This property is only present if the state property's value is failed.
+    #[serde(rename = "failureReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub failure_reason: Option<CaptionSnippetFailureReason>,
+    /// Indicates whether YouTube synchronized the caption track to the audio track in the video. The value will be true if a sync was explicitly requested when the caption track was uploaded. For example, when calling the captions.insert or captions.update methods, you can set the sync parameter to true to instruct YouTube to sync the uploaded track to the video. If the value is false, YouTube uses the time codes in the uploaded caption track to determine when to display captions.
+    #[serde(rename = "isAutoSynced")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_auto_synced: Option<bool>,
+    /// The caption track's type.
+    #[serde(rename = "trackKind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub track_kind: Option<CaptionSnippetTrackKind>,
+    /// Indicates whether caption track is formatted for "easy reader," meaning it is at a third-grade level for language learners. The default value is false.
+    #[serde(rename = "isEasyReader")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_easy_reader: Option<bool>,
+    /// The language of the caption track. The property value is a BCP-47 language tag.
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
+    /// The type of audio track associated with the caption track.
+    #[serde(rename = "audioTrackType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub audio_track_type: Option<CaptionSnippetAudioTrackType>,
+    /// Indicates whether 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>,
+    /// Indicates whether the caption track is a draft. If the value is true, then the track is not publicly visible. The default value is false. @mutable youtube.captions.insert youtube.captions.update
+    #[serde(rename = "isDraft")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_draft: Option<bool>,
+    /// The caption track's status.
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<CaptionSnippetStatus>,
+}
+
+/// Information specific to a store on a merchandising platform linked to a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelToStoreLinkDetails {
+    /// Name of the store.
+    #[serde(rename = "storeName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub store_name: Option<String>,
+    /// Landing page of the store.
+    #[serde(rename = "storeUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub store_url: Option<String>,
+}
+
+/// Details about the live streaming metadata.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoLiveStreamingDetails {
+    /// 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>,
+    /// The time that the broadcast actually started. The value is specified in ISO 8601 format. This value will not be available until the broadcast begins.
+    #[serde(rename = "actualStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_start_time: Option<String>,
+    /// The time that the broadcast is scheduled to end. The value is specified in ISO 8601 format. If the value is empty or the property is not present, then the broadcast is scheduled to continue indefinitely.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<String>,
+    /// The time that the broadcast actually ended. The value is specified in ISO 8601 format. This value will not be available until the broadcast is over.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<String>,
+    /// The time that the broadcast is scheduled to begin. The value is specified in ISO 8601 format.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SponsorSnippet {
+    /// The cumulative time a user has been a sponsor in months.
+    #[serde(rename = "cumulativeDurationMonths")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cumulative_duration_months: Option<i32>,
+    #[serde(rename = "sponsorDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub sponsor_details: Option<ChannelProfileDetails>,
+    /// The id of the channel being sponsored.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The date and time when the user became a sponsor. The value is specified in ISO 8601 (`YYYY-MM-DDThh:mm:ss.sZ`) format.
+    #[serde(rename = "sponsorSince")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub sponsor_since: Option<String>,
+}
+
+/// A thumbnail is an image representing a YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Thumbnail {
+    /// The thumbnail image's URL.
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: Option<String>,
+    /// (Optional) Height of the thumbnail image.
+    #[serde(rename = "height")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub height: Option<u32>,
+    /// (Optional) Width of the thumbnail image.
+    #[serde(rename = "width")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub width: Option<u32>,
+}
+
+/// A *i18nRegion* resource identifies a region where YouTube is available.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegion {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegion".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<I18nRegionSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the i18n region.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+/// A live stream describes a live ingestion point.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStream {
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamStatus>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveStreamContentDetails>,
+    /// The ID that YouTube assigns to uniquely identify the stream.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveStreamSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "cdn")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cdn: Option<CdnSettings>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// Describes original video file properties, including technical details about audio and video streams, but also metadata information like content length, digitization time, or geotagging information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoFileDetails {
+    /// u64: The length of the uploaded video in milliseconds.
+    #[serde(rename = "durationMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub duration_ms: Option<String>,
+    /// The date and time when the uploaded video file was created. The value is specified in ISO 8601 format. Currently, the following ISO 8601 formats are supported: - Date only: YYYY-MM-DD - Naive time: YYYY-MM-DDTHH:MM:SS - Time with timezone: YYYY-MM-DDTHH:MM:SS+HH:MM
+    #[serde(rename = "creationTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creation_time: Option<String>,
+    /// The uploaded video file's container format.
+    #[serde(rename = "container")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub container: Option<String>,
+    /// The uploaded file's type as detected by YouTube's video processing engine. Currently, YouTube only processes video files, but this field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_type: Option<VideoFileDetailsFileType>,
+    /// The uploaded file's name. This field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_name: Option<String>,
+    /// A list of video streams contained in the uploaded video file. Each item in the list contains detailed metadata about a video stream.
+    #[serde(rename = "videoStreams")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_streams: Option<Vec<VideoFileDetailsVideoStream>>,
+    /// u64: The uploaded video file's combined (video and audio) bitrate in bits per second.
+    #[serde(rename = "bitrateBps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bitrate_bps: Option<String>,
+    /// u64: The uploaded file's size in bytes. This field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileSize")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_size: Option<String>,
+    /// A list of audio streams contained in the uploaded video file. Each item in the list contains detailed metadata about an audio stream.
+    #[serde(rename = "audioStreams")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub audio_streams: Option<Vec<VideoFileDetailsAudioStream>>,
+}
+
+///
+#[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>,
+    /// 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>,
+    #[serde(rename = "superStickerMetadata")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_metadata: Option<SuperStickerMetadata>,
+    /// The currency in which the purchase was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+}
+
+/// Details about a channel bulletin post.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsBulletin {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// Paging details for lists of resources, including total number of items available and number of resources returned in a single page.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PageInfo {
+    /// The number of results included in the API response.
+    #[serde(rename = "resultsPerPage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub results_per_page: Option<i32>,
+    /// The total number of results in the result set.
+    #[serde(rename = "totalResults")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_results: Option<i32>,
+}
+
+/// Basic details about a video, including title, description, uploader, thumbnails and category.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSnippet {
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// Channel title for the channel that the video belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The date and time that the video was uploaded. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+    /// The default_audio_language property specifies the language spoken in the video's default audio track.
+    #[serde(rename = "defaultAudioLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_audio_language: Option<String>,
+    /// A list of keyword tags associated with the video. Tags may contain spaces.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<String>>,
+    /// The YouTube video category associated with the video.
+    #[serde(rename = "categoryId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub category_id: Option<String>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<VideoLocalization>,
+    /// The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The video's description. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// Indicates if the video is an upcoming/active live broadcast. Or it's "none" if the video is not an upcoming/active live broadcast.
+    #[serde(rename = "liveBroadcastContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_content: Option<VideoSnippetLiveBroadcastContent>,
+    /// The video's title. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The language of the videos's default snippet.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsDuration {
+    /// The cumulative time the user has been a member across all levels in complete months (the time is rounded down to the nearest integer).
+    #[serde(rename = "memberTotalDurationMonths")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_total_duration_months: Option<i32>,
+    /// The date and time when the user became a continuous member across all levels.
+    #[serde(rename = "memberSince")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_since: Option<String>,
+}
+
+/// Information that identifies the recommended resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsRecommendation {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// The reason that the resource is recommended to the user.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<ActivityContentDetailsRecommendationReason>,
+    #[serde(rename = "seedResourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub seed_resource_id: Option<ResourceId>,
+}
+
+/// Details about the content of a YouTube Video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoContentDetails {
+    #[serde(rename = "countryRestriction")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country_restriction: Option<AccessPolicy>,
+    /// The value of is_license_content indicates whether the video is licensed content.
+    #[serde(rename = "licensedContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub licensed_content: Option<bool>,
+    /// The value of captions indicates whether the video has captions or not.
+    #[serde(rename = "caption")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub caption: Option<VideoContentDetailsCaption>,
+    /// The length of the video. The tag value is an ISO 8601 duration in the format PT#M#S, in which the letters PT indicate that the value specifies a period of time, and the letters M and S refer to length in minutes and seconds, respectively. The # characters preceding the M and S letters are both integers that specify the number of minutes (or seconds) of the video. For example, a value of PT15M51S indicates that the video is 15 minutes and 51 seconds long.
+    #[serde(rename = "duration")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub duration: Option<String>,
+    #[serde(rename = "contentRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_rating: Option<ContentRating>,
+    /// Indicates whether the video uploader has provided a custom thumbnail image for the video. This property is only visible to the video uploader.
+    #[serde(rename = "hasCustomThumbnail")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub has_custom_thumbnail: Option<bool>,
+    /// Specifies the projection format of the video.
+    #[serde(rename = "projection")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub projection: Option<VideoContentDetailsProjection>,
+    #[serde(rename = "regionRestriction")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
+    /// The value of definition indicates whether the video is available in high definition or only in standard definition.
+    #[serde(rename = "definition")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub definition: Option<VideoContentDetailsDefinition>,
+    /// The value of dimension indicates whether the video is available in 3D or in 2D.
+    #[serde(rename = "dimension")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dimension: Option<String>,
+}
+
+/// Internal representation of thumbnails for a YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailDetails {
+    #[serde(rename = "standard")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub standard: Option<Thumbnail>,
+    #[serde(rename = "high")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub high: Option<Thumbnail>,
+    #[serde(rename = "medium")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub medium: Option<Thumbnail>,
+    #[serde(rename = "default")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default: Option<Thumbnail>,
+    #[serde(rename = "maxres")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub maxres: Option<Thumbnail>,
+}
+
+/// Brief description of the live stream status.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamStatus {
+    #[serde(rename = "streamStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub stream_status: Option<LiveStreamStatusStreamStatus>,
+    #[serde(rename = "healthStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub health_status: Option<LiveStreamHealthStatus>,
+}
+
+/// Basic details about a video category, such as its localized title. Next Id: 17
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoStatus {
+    #[serde(rename = "selfDeclaredMadeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_declared_made_for_kids: Option<bool>,
+    /// The status of the uploaded video.
+    #[serde(rename = "uploadStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload_status: Option<VideoStatusUploadStatus>,
+    /// The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub publish_at: Option<String>,
+    /// This value indicates if the extended video statistics on the watch page can be viewed by everyone. Note that the view count, likes, etc will still be visible if this is disabled. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "publicStatsViewable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub public_stats_viewable: Option<bool>,
+    /// This value explains why YouTube rejected an uploaded video. This property is only present if the uploadStatus property indicates that the upload was rejected.
+    #[serde(rename = "rejectionReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rejection_reason: Option<VideoStatusRejectionReason>,
+    /// This value explains why a video failed to upload. This property is only present if the uploadStatus property indicates that the upload failed.
+    #[serde(rename = "failureReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub failure_reason: Option<VideoStatusFailureReason>,
+    /// The video's license. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "license")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub license: Option<VideoStatusLicense>,
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// This value indicates if the video can be embedded on another website. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "embeddable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub embeddable: Option<bool>,
+    /// The video's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<VideoStatusPrivacyStatus>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseReport {
+    #[serde(rename = "abuseTypes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub abuse_types: Option<Vec<AbuseType>>,
+    #[serde(rename = "subject")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subject: Option<Entity>,
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "relatedEntities")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub related_entities: Option<Vec<RelatedEntity>>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LocalizedString {
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+/// A `__superChatEvent__` resource represents a Super Chat purchase on a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEvent {
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#superChatEvent"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the Super Chat event.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<SuperChatEventSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+}
+
+/// A resource id is a generic reference that points to another YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ResourceId {
+    /// The type of the API resource.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel. This property is only present if the resourceId.kind value is youtube#channel.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a video. This property is only present if the resourceId.kind value is youtube#video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a playlist. This property is only present if the resourceId.kind value is youtube#playlist.
+    #[serde(rename = "playlistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_id: Option<String>,
+}
+
 /// A `__sponsor__` resource represents a sponsor for a YouTube channel. A sponsor provides recurring monetary support to a creator and receives special benefits.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct Sponsor {
@@ -3040,1041 +3255,71 @@
     pub etag: Option<String>,
 }
 
-///
-#[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>,
-    /// The kind of error happening.
+/// The auditDetails object encapsulates channel data that is relevant for YouTube Partners during the audit process.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelAuditDetails {
+    /// Whether or not the channel respects the community guidelines.
+    #[serde(rename = "communityGuidelinesGoodStanding")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub community_guidelines_good_standing: Option<bool>,
+    /// Whether or not the channel has any copyright strikes.
+    #[serde(rename = "copyrightStrikesGoodStanding")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub copyright_strikes_good_standing: Option<bool>,
+    /// Whether or not the channel has any unresolved claims.
+    #[serde(rename = "contentIdClaimsGoodStanding")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_id_claims_good_standing: Option<bool>,
+}
+
+/// Describes a temporal position of a visual widget inside a video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoTiming {
+    /// Describes a timing type. If the value is offsetFromStart, then the offsetMs field represents an offset from the start of the video. If the value is offsetFromEnd, then the offsetMs field represents an offset from the end of the video.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
-    /// How severe this issue is to the stream.
-    #[serde(rename = "severity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub severity: Option<String>,
-}
-
-/// Basic details about a caption track, such as its language and name.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionSnippet {
-    /// Indicates whether 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 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>,
-    /// Indicates whether the caption track is a draft. If the value is true, then the track is not publicly visible. The default value is false. @mutable youtube.captions.insert youtube.captions.update
-    #[serde(rename = "isDraft")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_draft: Option<bool>,
-    /// The 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<String>,
-    /// The caption track's status.
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<String>,
-    /// Indicates whether the caption track uses large text for the vision-impaired. The default value is false.
-    #[serde(rename = "isLarge")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_large: Option<bool>,
-    /// The date and time when the caption track was last updated. The value is specified in ISO 8601 format.
-    #[serde(rename = "lastUpdated")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub last_updated: Option<String>,
-    /// The type of audio track associated with the caption track.
-    #[serde(rename = "audioTrackType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audio_track_type: 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>,
-    /// 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 caption track's type.
-    #[serde(rename = "trackKind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub track_kind: Option<String>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-/// Basic details about a comment thread.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadSnippet {
-    /// The ID of the video the comments refer to, if any. No video_id implies a channel discussion comment.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// The total number of replies (not including the top level comment).
-    #[serde(rename = "totalReplyCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_reply_count: Option<u32>,
-    /// The YouTube channel the comments in the thread refer to or the channel with the video the comments refer to. If video_id isn't set the comments refer to the channel itself.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// Whether the thread (and therefore all its comments) is visible to all YouTube users.
-    #[serde(rename = "isPublic")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_public: Option<bool>,
-    /// 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>,
-    #[serde(rename = "topLevelComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub top_level_comment: Option<Comment>,
-}
-
-/// 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>,
-}
-
-/// 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 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>,
-    /// 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>,
-    /// 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 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<String>,
-    /// The encoded video content's height in pixels.
-    #[serde(rename = "heightPixels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height_pixels: Option<u32>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SponsorSnippet {
-    #[serde(rename = "sponsorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sponsor_details: Option<ChannelProfileDetails>,
-    /// The cumulative time a user has been a sponsor in months.
-    #[serde(rename = "cumulativeDurationMonths")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cumulative_duration_months: Option<i32>,
-    /// The id of the channel being sponsored.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The date and time when the user became a sponsor. The value is specified in ISO 8601 (`YYYY-MM-DDThh:mm:ss.sZ`) format.
-    #[serde(rename = "sponsorSince")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sponsor_since: Option<String>,
-}
-
-/// 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>,
-}
-
-/// A *comment thread* represents information that applies to a top level comment and all its replies. It can also include the top level comment itself and some of the replies.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThread {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CommentThreadSnippet>,
-    /// The ID that YouTube uses to uniquely identify the comment thread.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "replies")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub replies: Option<CommentThreadReplies>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// 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>,
-}
-
-/// 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 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<String>,
-    /// The video's Motion Picture Association of America (MPAA) rating.
-    #[serde(rename = "mpaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mpaa_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// The video's rating in Peru.
-    #[serde(rename = "pefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pefilm_rating: Option<String>,
-    /// 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<String>,
-    /// The video's Ministerio de Cultura (Colombia) rating.
-    #[serde(rename = "mocRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moc_rating: Option<String>,
-    /// 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<String>,
-    /// The video's rating system for Vietnam - MCST
-    #[serde(rename = "mcstRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mcst_rating: Option<String>,
-    /// 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<String>>,
-    /// 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<String>,
-    /// 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<String>,
-    /// Rating system in France - Commission de classification cinematographique
-    #[serde(rename = "cncRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cnc_rating: Option<String>,
-    /// The video's rating from the Bulgarian National Film Center.
-    #[serde(rename = "nfrcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nfrc_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// The video's TV Parental Guidelines (TVPG) rating.
-    #[serde(rename = "tvpgRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tvpg_rating: Option<String>,
-    /// 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<String>,
-    /// The video's rating in Greece.
-    #[serde(rename = "grfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub grfilm_rating: Option<String>,
-    /// The video's rating in Slovakia.
-    #[serde(rename = "skfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub skfilm_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// The video's rating from Malaysia's Film Censorship Board.
-    #[serde(rename = "fcbmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fcbm_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// The video's rating in Venezuela.
-    #[serde(rename = "resorteviolenciaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resorteviolencia_rating: Option<String>,
-    /// The video's rating in Iceland.
-    #[serde(rename = "smaisRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub smais_rating: Option<String>,
-    /// The video's Canadian Home Video Rating System (CHVRS) rating.
-    #[serde(rename = "chvrsRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub chvrs_rating: Option<String>,
-    /// The National Media Council ratings system for United Arab Emirates.
-    #[serde(rename = "nmcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nmc_rating: Option<String>,
-    /// 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<String>,
-    /// The video's rating in the Czech Republic.
-    #[serde(rename = "czfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub czfilm_rating: Option<String>,
-    /// The video's rating in Estonia.
-    #[serde(rename = "eefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub eefilm_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// A rating that YouTube uses to identify age-restricted content.
-    #[serde(rename = "ytRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub yt_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// The video's rating from Taiwan's Ministry of Culture (文化部).
-    #[serde(rename = "moctwRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moctw_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// The video's British Board of Film Classification (BBFC) rating.
-    #[serde(rename = "bbfcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bbfc_rating: Option<String>,
-    /// 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<String>,
-    /// The video's rating from Indonesia's Lembaga Sensor Film.
-    #[serde(rename = "lsfRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub lsf_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// The video's Freiwillige Selbstkontrolle der Filmwirtschaft (FSK - Germany) rating.
-    #[serde(rename = "fskRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fsk_rating: Option<String>,
-    /// The video's rating from the Kenya Film Classification Board.
-    #[serde(rename = "kfcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kfcb_rating: Option<String>,
-    /// 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<String>>,
-    /// The video's rating in Poland.
-    #[serde(rename = "nbcplRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nbcpl_rating: Option<String>,
-    /// 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<String>,
-    /// The video's rating in Egypt.
-    #[serde(rename = "egfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub egfilm_rating: Option<String>,
-    /// The video's rating from Medietilsynet, the Norwegian Media Authority.
-    #[serde(rename = "medietilsynetRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub medietilsynet_rating: Option<String>,
-    /// The video's rating in Switzerland.
-    #[serde(rename = "chfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub chfilm_rating: Option<String>,
-    /// 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<String>,
-    /// The video's rating in Israel.
-    #[serde(rename = "ilfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ilfilm_rating: Option<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-    /// 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<String>,
-}
-
-/// Brief description of the live stream cdn settings.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CdnSettings {
-    /// The format of the video stream that you are sending to Youtube.
-    #[serde(rename = "format")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub format: Option<String>,
-    /// The frame rate of the inbound video data.
-    #[serde(rename = "frameRate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub frame_rate: Option<String>,
-    /// The resolution of the inbound video data.
-    #[serde(rename = "resolution")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resolution: Option<String>,
-    #[serde(rename = "ingestionInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_info: Option<IngestionInfo>,
-    ///  The method or protocol used to transmit the video stream.
-    #[serde(rename = "ingestionType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_type: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSection {
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelSectionLocalization>>,
-    #[serde(rename = "targeting")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub targeting: Option<ChannelSectionTargeting>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ChannelSectionSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSection".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel section.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ChannelSectionContentDetails>,
-}
-
-///
-#[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>,
-}
-
-/// 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 playlist. This property is only present if the resourceId.kind value is youtube#playlist.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel. This property is only present if the resourceId.kind value is youtube#channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a video. This property is only present if the resourceId.kind value is youtube#video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// The type of the API resource.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-///
-#[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>,
-}
-
-/// 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 = "subscription")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscription: Option<ActivityContentDetailsSubscription>,
-    #[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 = "social")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub social: Option<ActivityContentDetailsSocial>,
-    #[serde(rename = "playlistItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_item: Option<ActivityContentDetailsPlaylistItem>,
-    #[serde(rename = "upload")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload: Option<ActivityContentDetailsUpload>,
-    #[serde(rename = "comment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment: Option<ActivityContentDetailsComment>,
-    #[serde(rename = "channelItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_item: Option<ActivityContentDetailsChannelItem>,
-    #[serde(rename = "recommendation")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recommendation: Option<ActivityContentDetailsRecommendation>,
-    #[serde(rename = "like")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like: Option<ActivityContentDetailsLike>,
-    #[serde(rename = "bulletin")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bulletin: Option<ActivityContentDetailsBulletin>,
-}
-
-/// A *liveChatModerator* resource represents a moderator for a YouTube live chat. A chat moderator has the ability to ban/unban users from a chat, remove message, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModerator {
-    /// The ID that YouTube assigns to uniquely identify the moderator.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// 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>,
-    #[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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MemberListResponse {
-    /// 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 members that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Member>>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#memberListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
+    pub typ: Option<InvideoTimingType>,
+    /// u64: Defines the duration in milliseconds for which the promotion should be displayed. If missing, the client should use the default.
+    #[serde(rename = "durationMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub duration_ms: Option<String>,
+    /// u64: Defines the time at which the promotion will appear. Depending on the value of type the value of the offsetMs field will represent a time offset from the start or from the end of the video, expressed in milliseconds.
+    #[serde(rename = "offsetMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub offset_ms: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageListResponse {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessageListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The amount of time the client should wait before polling again.
+    #[serde(rename = "pollingIntervalMillis")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub polling_interval_millis: Option<u32>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
-    /// 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 VideoAgeGating {
-    /// Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present.
-    #[serde(rename = "restricted")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub restricted: Option<bool>,
-    /// Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content.
-    #[serde(rename = "alcoholContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alcohol_content: Option<bool>,
-    /// Video game rating, if any.
-    #[serde(rename = "videoGameRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_game_rating: Option<String>,
-}
-
-/// LINT.IfChange Describes an invideo branding.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct InvideoBranding {
-    /// The channel to which this branding links. If not present it defaults to the current channel.
-    #[serde(rename = "targetChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub target_channel_id: Option<String>,
-    #[serde(rename = "timing")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub timing: Option<InvideoTiming>,
-    /// The bytes the uploaded image. Only used in api to youtube communication.
-    #[serde(rename = "imageBytes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_bytes: Option<String>,
-    /// The url of the uploaded image. Only used in apiary to api communication.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<InvideoPosition>,
-}
-
-/// 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>,
-}
-
-/// 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>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SuperChatEventSnippet>,
-    /// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageAuthorDetails {
-    /// 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>,
-    /// 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>,
-    /// The channel's display name.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// The channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: Option<String>,
-    /// The YouTube channel ID.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The channels's avatar URL.
-    #[serde(rename = "profileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_image_url: Option<String>,
-    /// 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>,
-}
-
-/// 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>,
-}
-
-/// 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>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageSnippet {
-    /// 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>,
-    /// The date and time when the message was orignally published. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<String>,
-    #[serde(rename = "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>,
-    /// 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<String>,
-    #[serde(rename = "messageDeletedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_deleted_details: Option<LiveChatMessageDeletedDetails>,
-    #[serde(rename = "messageRetractedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_retracted_details: Option<LiveChatMessageRetractedDetails>,
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    #[serde(rename = "superChatDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_chat_details: Option<LiveChatSuperChatDetails>,
-    #[serde(rename = "fanFundingEventDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fan_funding_event_details: Option<LiveChatFanFundingEventDetails>,
-    #[serde(rename = "superStickerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_details: Option<LiveChatSuperStickerDetails>,
-    #[serde(rename = "textMessageDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_message_details: Option<LiveChatTextMessageDetails>,
-    /// 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>,
-}
-
-/// 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 {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistItemSnippet>,
-    /// 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>,
-    /// 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<PlaylistItemStatus>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistItemContentDetails>,
-    /// 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>,
-}
-
-/// Branding properties for the watch. All deprecated.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct WatchSettings {
-    /// The text color for the video watch page's branded area.
-    #[serde(rename = "backgroundColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_color: Option<String>,
-    /// An ID that uniquely identifies a playlist that displays next to the video player.
-    #[serde(rename = "featuredPlaylistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_playlist_id: Option<String>,
-    /// The background color for the video watch page's branded area.
-    #[serde(rename = "textColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_color: Option<String>,
-}
-
-/// Recording information associated with the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRecordingDetails {
-    /// 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>,
-    /// The date and time when the video was recorded. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sssZ) format.
-    #[serde(rename = "recordingDate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_date: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// A list of regions where YouTube is available. In this map, the i18n region ID is the map key, and its value is the corresponding i18nRegion resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<I18nRegion>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// 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 LiveChatModeratorListResponse {
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    /// The date and time when the underlying stream went offline. The value is specified in ISO 8601 format.
+    #[serde(rename = "offlineAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub offline_at: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-    /// 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 = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveChatMessage>>,
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
-    #[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#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>>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventListResponse {
-    #[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")]
@@ -4083,354 +3328,41 @@
     #[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>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#superChatEventListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The 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 SponsorListResponse {
     #[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>,
-}
-
-/// 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>>,
-}
-
-/// 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>,
-}
-
-/// Details about a social network post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSocial {
-    /// 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>,
-    /// The name of the social network.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// An image of the post's author.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-}
-
-/// Video processing progress and completion time estimate.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProcessingDetailsProcessingProgress {
-    /// u64: An estimate of the amount of time, in millseconds, that YouTube needs to finish processing the video.
-    #[serde(rename = "timeLeftMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_left_ms: Option<String>,
-    /// u64: An estimate of the total number of parts that need to be processed for the video. The number may be updated with more precise estimates while YouTube processes the video.
-    #[serde(rename = "partsTotal")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parts_total: Option<String>,
-    /// u64: The number of parts of the video that YouTube has already processed. You can estimate the percentage of the video that YouTube has already processed by calculating: 100 * parts_processed / parts_total Note that since the estimated number of parts could increase without a corresponding increase in the number of parts that have already been processed, it is possible that the calculated progress could periodically decrease while YouTube processes a video.
-    #[serde(rename = "partsProcessed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parts_processed: Option<String>,
-}
-
-/// 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<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<String>,
-}
-
-///
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionListResponse {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelSectionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// A list of ChannelSections that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<ChannelSection>>,
-    /// 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 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 ThumbnailSetResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thumbnailSetResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
+    #[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>,
-    /// A list of thumbnails.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<ThumbnailDetails>>,
-}
-
-/// 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>,
-}
-
-/// Basic details about a video category, such as its localized title. Next Id: 17
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoStatus {
-    /// The video's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<String>,
-    /// This value indicates if the video can be embedded on another website. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "embeddable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embeddable: Option<bool>,
-    /// This value 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<String>,
-    /// The status of the uploaded video.
-    #[serde(rename = "uploadStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload_status: Option<String>,
-    /// 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<String>,
-    /// The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private. The value is specified in ISO 8601 format.
-    #[serde(rename = "publishAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub publish_at: Option<String>,
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-    /// This value indicates if the extended video statistics on the watch page can be viewed by everyone. Note that the view count, likes, etc will still be visible if this is disabled. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "publicStatsViewable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub public_stats_viewable: Option<bool>,
-    /// The video's license. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "license")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub license: Option<String>,
-}
-
-/// Detailed settings of a broadcast.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastContentDetails {
-    /// This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. *Important:* You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends.
-    #[serde(rename = "enableDvr")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_dvr: Option<bool>,
-    #[serde(rename = "monitorStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monitor_stream: Option<MonitorStreamInfo>,
-    /// The date and time that the live stream referenced by boundStreamId was last updated.
-    #[serde(rename = "boundStreamLastUpdateTimeMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bound_stream_last_update_time_ms: Option<String>,
-    /// This 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>,
-    /// 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>,
-    /// 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>,
-    #[serde(rename = "closedCaptionsType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub closed_captions_type: Option<String>,
-    /// 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<String>,
-    /// 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>,
-    /// Indicates whether this broadcast has low latency enabled.
-    #[serde(rename = "enableLowLatency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_low_latency: 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<String>,
-    /// 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>,
-    /// 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>,
-    /// 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>,
-}
-
-///
-#[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 LiveChatMessageListResponse {
-    #[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#sponsorListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The token that can be used as the value of the `pageToken` parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The visitorId identifies the visitor.
+    /// 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#liveChatMessageListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The amount of time the client should wait before polling again.
-    #[serde(rename = "pollingIntervalMillis")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub polling_interval_millis: Option<u32>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// A list of sponsors that match the request criteria.
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatMessage>>,
-    /// 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 date and time when the underlying stream went offline. The value is specified in ISO 8601 format.
-    #[serde(rename = "offlineAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub offline_at: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
+    pub items: Option<Vec<Sponsor>>,
 }
 
 /// Settings and Info of the monitor stream
@@ -4450,98 +3382,1063 @@
     pub enable_monitor_stream: Option<bool>,
 }
 
-/// 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<String>,
-    /// 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>,
-}
-
-/// Describes original video file properties, including technical details about audio and video streams, but also metadata information like content length, digitization time, or geotagging information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetails {
-    /// u64: The uploaded file's size in bytes. This field is present whether a video file or another type of file was uploaded.
-    #[serde(rename = "fileSize")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_size: Option<String>,
-    /// The date and time when the uploaded video file was created. The value is specified in ISO 8601 format. Currently, the following ISO 8601 formats are supported: - Date only: YYYY-MM-DD - Naive time: YYYY-MM-DDTHH:MM:SS - Time with timezone: YYYY-MM-DDTHH:MM:SS+HH:MM
-    #[serde(rename = "creationTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creation_time: Option<String>,
-    /// u64: The 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 audio streams contained in the uploaded video file. Each item in the list contains detailed metadata about an audio stream.
-    #[serde(rename = "audioStreams")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audio_streams: Option<Vec<VideoFileDetailsAudioStream>>,
-    /// The 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<String>,
-    /// The uploaded file's name. This field is present whether a video file or another type of file was uploaded.
-    #[serde(rename = "fileName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_name: Option<String>,
-    /// The uploaded video file's container format.
-    #[serde(rename = "container")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub container: Option<String>,
-    /// u64: The length of the uploaded video in milliseconds.
-    #[serde(rename = "durationMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub duration_ms: Option<String>,
-    /// A list of video streams contained in the uploaded video file. Each item in the list contains detailed metadata about a video stream.
-    #[serde(rename = "videoStreams")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_streams: Option<Vec<VideoFileDetailsVideoStream>>,
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadListResponse {
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThreadListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of comment threads that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<CommentThread>>,
+}
+
+/// ChannelSection targeting setting.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionTargeting {
+    /// The region the channel section is targeting.
+    #[serde(rename = "regions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub regions: Option<Vec<String>>,
+    /// The country the channel section is targeting.
+    #[serde(rename = "countries")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub countries: Option<Vec<String>>,
+    /// The language the channel section is targeting.
+    #[serde(rename = "languages")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub languages: Option<Vec<String>>,
+}
+
+/// The id of the author's YouTube channel, if any.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentSnippetAuthorChannelId {
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MemberSnippet {
+    #[serde(rename = "membershipsDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_details: Option<MembershipsDetails>,
+    /// The id of the channel that's offering memberships.
+    #[serde(rename = "creatorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creator_channel_id: Option<String>,
+    #[serde(rename = "memberDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_details: Option<ChannelProfileDetails>,
+}
+
+/// Details about a resource which was added to a channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsChannelItem {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonListResponse {
+    /// A list of valid abuse reasons that are used with `video.ReportAbuse`.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<VideoAbuseReportReason>>,
+    /// The `visitorId` identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReasonListResponse"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// 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>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionListResponse {
+    /// 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#captionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// A list of captions that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Caption>>,
+    /// 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>,
 }
 
 /// Basic details about a channel section, including title, style and position.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ChannelSectionSnippet {
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<ChannelSectionLocalization>,
+    /// The channel section's title for multiple_playlists and multiple_channels.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel that published the channel section.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
     /// The position of the channel section in the channel.
     #[serde(rename = "position")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub position: Option<u32>,
-    /// The type of the channel section.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub typ: Option<String>,
-    /// The style of the channel section.
-    #[serde(rename = "style")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub style: Option<String>,
     /// 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 ID that YouTube uses to uniquely identify the channel that published the channel section.
+    /// The style of the channel section.
+    #[serde(rename = "style")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub style: Option<ChannelSectionSnippetStyle>,
+    /// The type of the channel section.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<ChannelSectionSnippetType>,
+}
+
+/// Basic details about a subscription, including title, description and thumbnails of the subscribed item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionSnippet {
+    /// The subscription's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the subscriber's channel.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// Channel title for the channel that the subscription belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The subscription's details.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// The date and time that the subscription was created. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+}
+
+/// Information about a resource that received a comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsComment {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatUserBannedMessageDetails {
+    /// u64: The duration of the ban. This property is only present if the banType is temporary.
+    #[serde(rename = "banDurationSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_duration_seconds: Option<String>,
+    #[serde(rename = "bannedUserDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banned_user_details: Option<ChannelProfileDetails>,
+    /// The type of ban.
+    #[serde(rename = "banType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_type: Option<LiveChatUserBannedMessageDetailsBanType>,
+}
+
+/// A *comment thread* represents information that applies to a top level comment and all its replies. It can also include the top level comment itself and some of the replies.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThread {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<CommentThreadSnippet>,
+    /// 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 = "replies")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub replies: Option<CommentThreadReplies>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThread".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+}
+
+/// A *video* resource represents a YouTube video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Video {
+    #[serde(rename = "recordingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_details: Option<VideoRecordingDetails>,
+    /// The ID that YouTube uses to uniquely identify the video.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "fileDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_details: Option<VideoFileDetails>,
+    #[serde(rename = "projectDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub project_details: Option<VideoProjectDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<VideoTopicDetails>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<VideoStatistics>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<VideoContentDetails>,
+    #[serde(rename = "suggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub suggestions: Option<VideoSuggestions>,
+    #[serde(rename = "processingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_details: Option<VideoProcessingDetails>,
+    #[serde(rename = "monetizationDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub monetization_details: Option<VideoMonetizationDetails>,
+    /// The localizations object contains localized versions of the basic details about the video, such as its title and description.
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, VideoLocalization>>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoSnippet>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#video".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<VideoStatus>,
+    #[serde(rename = "liveStreamingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
+    #[serde(rename = "ageGating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub age_gating: Option<VideoAgeGating>,
+    #[serde(rename = "player")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub player: Option<VideoPlayer>,
+}
+
+/// Information about a channel that a user subscribed to.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsSubscription {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// LINT.IfChange Describes an invideo branding.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoBranding {
+    /// The url of the uploaded image. Only used in apiary to api communication.
+    #[serde(rename = "imageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_url: Option<String>,
+    /// The channel to which this branding links. If not present it defaults to the current channel.
+    #[serde(rename = "targetChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub target_channel_id: Option<String>,
+    /// The bytes the uploaded image. Only used in api to youtube communication.
+    #[serde(rename = "imageBytes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_bytes: Option<String>,
+    #[serde(rename = "position")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub position: Option<InvideoPosition>,
+    #[serde(rename = "timing")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub timing: Option<InvideoTiming>,
+}
+
+/// Detailed settings of a broadcast.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastContentDetails {
+    /// This value uniquely identifies the live stream bound to the broadcast.
+    #[serde(rename = "boundStreamId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bound_stream_id: Option<String>,
+    /// This setting indicates whether YouTube should enable content encryption for the broadcast.
+    #[serde(rename = "enableContentEncryption")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_content_encryption: Option<bool>,
+    /// Indicates whether this broadcast has low latency enabled.
+    #[serde(rename = "enableLowLatency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_low_latency: Option<bool>,
+    /// This setting indicates whether auto stop is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
+    #[serde(rename = "enableAutoStop")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_auto_stop: Option<bool>,
+    /// This setting indicates whether the broadcast should automatically begin with an in-stream slate when you update the broadcast's status to live. After updating the status, you then need to send a liveCuepoints.insert request that sets the cuepoint's eventState to end to remove the in-stream slate and make your broadcast stream visible to viewers.
+    #[serde(rename = "startWithSlate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub start_with_slate: Option<bool>,
+    /// The mesh for projecting the video if projection is mesh. The mesh value must be a UTF-8 string containing the base-64 encoding of 3D mesh data that follows the Spherical Video V2 RFC specification for an mshp box, excluding the box size and type but including the following four reserved zero bytes for the version and flags.
+    #[serde(rename = "mesh")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mesh: Option<String>,
+    /// The date and time that the live stream referenced by boundStreamId was last updated.
+    #[serde(rename = "boundStreamLastUpdateTimeMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bound_stream_last_update_time_ms: Option<String>,
+    /// This setting indicates whether auto start is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
+    #[serde(rename = "enableAutoStart")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_auto_start: Option<bool>,
+    /// Automatically start recording after the event goes live. The default value for this property is true. *Important:* You must also set the enableDvr property's value to true if you want the playback to be available immediately after the broadcast ends. If you set this property's value to true but do not also set the enableDvr property to true, there may be a delay of around one day before the archived video will be available for playback.
+    #[serde(rename = "recordFromStart")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub record_from_start: Option<bool>,
+    /// The projection format of this broadcast. This defaults to rectangular.
+    #[serde(rename = "projection")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub projection: Option<LiveBroadcastContentDetailsProjection>,
+    /// This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. *Important:* You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends.
+    #[serde(rename = "enableDvr")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_dvr: Option<bool>,
+    #[serde(rename = "closedCaptionsType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
+    /// If both this and enable_low_latency are set, they must match. LATENCY_NORMAL should match enable_low_latency=false LATENCY_LOW should match enable_low_latency=true LATENCY_ULTRA_LOW should have enable_low_latency omitted.
+    #[serde(rename = "latencyPreference")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub latency_preference: Option<LiveBroadcastContentDetailsLatencyPreference>,
+    /// This setting indicates whether the broadcast video can be played in an embedded player. If you choose to archive the video (using the enableArchive property), this setting will also apply to the archived video.
+    #[serde(rename = "enableEmbed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_embed: Option<bool>,
+    #[serde(rename = "monitorStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub monitor_stream: Option<MonitorStreamInfo>,
+    /// This setting indicates whether HTTP POST closed captioning is enabled for this broadcast. The ingestion URL of the closed captions is returned through the liveStreams API. This is mutually exclusive with using the closed_captions_type property, and is equivalent to setting closed_captions_type to CLOSED_CAPTIONS_HTTP_POST.
+    #[serde(rename = "enableClosedCaptions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_closed_captions: Option<bool>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentDetailsRelatedPlaylists {
+    /// The ID of the playlist that contains the channel"s favorite videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "favorites")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorites: Option<String>,
+    /// The ID of the playlist that contains the channel"s watch later playlist. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "watchLater")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch_later: Option<String>,
+    /// The ID of the playlist that contains the channel"s watch history. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "watchHistory")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch_history: Option<String>,
+    /// The ID of the playlist that contains the channel"s liked videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
+    #[serde(rename = "likes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub likes: Option<String>,
+    /// The ID of the playlist that contains the channel"s uploaded videos. Use the videos.insert method to upload new videos and the videos.delete method to delete previously uploaded videos.
+    #[serde(rename = "uploads")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub uploads: Option<String>,
+}
+
+/// Details about the content of a channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentDetails {
+    #[serde(rename = "relatedPlaylists")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub related_playlists: Option<ChannelContentDetailsRelatedPlaylists>,
+}
+
+/// An *activity* resource contains information about an action that a particular channel, or user, has taken on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of action, the channel associated with the action, and the resource(s) associated with the action, such as the video that was rated or uploaded.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Activity {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ActivitySnippet>,
+    /// The ID that YouTube uses to uniquely identify the activity.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activity".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Etag of this resource
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ActivityContentDetails>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamSnippet {
+    /// The stream's description. The value cannot be longer than 10000 characters.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel that is transmitting the stream.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The stream's title. The value must be between 1 and 128 characters long.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    #[serde(rename = "isDefaultStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_default_stream: Option<bool>,
+    /// The date and time that the stream was created. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+}
+
+/// A *liveBroadcast* resource represents an event that will be streamed, via live video, on YouTube.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcast {
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcast".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the broadcast.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveBroadcastSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveBroadcastContentDetails>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<LiveBroadcastStatistics>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveBroadcastStatus>,
+}
+
+/// A *membershipsLevel* resource represents an offer made by YouTube creators for their fans. Users can become members of the channel by joining one of the available levels. They will provide recurring monetary support and receives special benefits.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevel {
+    /// The ID that YouTube assigns to uniquely identify the memberships level.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<MembershipsLevelSnippet>,
+}
+
+/// Basic broadcast information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastSnippet {
+    /// The broadcast's description. As with the title, you can set this field by modifying the broadcast resource or by setting the description field of the corresponding video resource.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// Indicates whether this broadcast is the default broadcast. Internal only.
+    #[serde(rename = "isDefaultBroadcast")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_default_broadcast: Option<bool>,
+    /// The date and time that the broadcast actually started. This information is only available once the broadcast's state is live. The value is specified in ISO 8601 format.
+    #[serde(rename = "actualStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_start_time: Option<String>,
+    /// The date and time that the broadcast is scheduled to end. The value is specified in ISO 8601 format.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast.
     #[serde(rename = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
-    /// The channel section's title for multiple_playlists and multiple_channels.
+    /// The date and time that the broadcast was added to YouTube's live broadcast schedule. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+    /// The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource.
     #[serde(rename = "title")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub title: Option<String>,
+    /// The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete. The value is specified in ISO 8601 format.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The id of the live chat for this broadcast.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    /// The date and time that the broadcast is scheduled to start. The value is specified in ISO 8601 format.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<String>,
+}
+
+/// Ratings schemes. The country-specific ratings are mostly for movies and shows. LINT.IfChange
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ContentRating {
+    /// The video's rating from Malta's Film Age-Classification Board.
+    #[serde(rename = "mccaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mccaa_rating: Option<ContentRatingMccaaRating>,
+    /// The video's Canadian Home Video Rating System (CHVRS) rating.
+    #[serde(rename = "chvrsRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub chvrs_rating: Option<ContentRatingChvrsRating>,
+    /// The video's rating from the Danish Film Institute's (Det Danske Filminstitut) Media Council for Children and Young People.
+    #[serde(rename = "mccypRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mccyp_rating: Option<ContentRatingMccypRating>,
+    /// The video's rating in Greece.
+    #[serde(rename = "grfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub grfilm_rating: Option<ContentRatingGrfilmRating>,
+    /// The video's rating from Finland's Kansallinen Audiovisuaalinen Instituutti (National Audiovisual Institute).
+    #[serde(rename = "mekuRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub meku_rating: Option<ContentRatingMekuRating>,
+    /// The video's rating from the Maldives National Bureau of Classification.
+    #[serde(rename = "nbcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nbc_rating: Option<ContentRatingNbcRating>,
+    /// The video's rating from South Africa's Film and Publication Board.
+    #[serde(rename = "fpbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fpb_rating: Option<ContentRatingFpbRating>,
+    /// The video's rating in Switzerland.
+    #[serde(rename = "chfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub chfilm_rating: Option<ContentRatingChfilmRating>,
+    /// The video's rating from Statens medieråd (Sweden's National Media Council).
+    #[serde(rename = "smsaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub smsa_rating: Option<ContentRatingSmsaRating>,
+    /// Reasons that explain why the video received its FPB (South Africa) rating.
+    #[serde(rename = "fpbRatingReasons")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fpb_rating_reasons: Option<Vec<ContentRatingFpbRatingReasons>>,
+    /// The video's Korea Media Rating Board (영상물등급위원회) rating. The KMRB rates videos in South Korea.
+    #[serde(rename = "kmrbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kmrb_rating: Option<ContentRatingKmrbRating>,
+    /// The video's Instituto de la Cinematografía y de las Artes Audiovisuales (ICAA - Spain) rating.
+    #[serde(rename = "icaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub icaa_rating: Option<ContentRatingIcaaRating>,
+    /// The video's rating from the Bulgarian National Film Center.
+    #[serde(rename = "nfrcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nfrc_rating: Option<ContentRatingNfrcRating>,
+    /// The video's rating from Medietilsynet, the Norwegian Media Authority.
+    #[serde(rename = "medietilsynetRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub medietilsynet_rating: Option<ContentRatingMedietilsynetRating>,
+    /// The video's rating from the Ministero dei Beni e delle Attività Culturali e del Turismo (Italy).
+    #[serde(rename = "mibacRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mibac_rating: Option<ContentRatingMibacRating>,
+    /// The video's rating from the Movie and Television Review and Classification Board (Philippines).
+    #[serde(rename = "mtrcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mtrcb_rating: Option<ContentRatingMtrcbRating>,
+    /// The video's rating in Poland.
+    #[serde(rename = "nbcplRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nbcpl_rating: Option<ContentRatingNbcplRating>,
+    /// The video's rating from Hong Kong's Office for Film, Newspaper and Article Administration.
+    #[serde(rename = "fcoRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fco_rating: Option<ContentRatingFcoRating>,
+    /// The video's General Directorate of Radio, Television and Cinematography (Mexico) rating.
+    #[serde(rename = "rtcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rtc_rating: Option<ContentRatingRtcRating>,
+    /// The video's rating from Ireland's Raidió Teilifís Éireann.
+    #[serde(rename = "rteRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rte_rating: Option<ContentRatingRteRating>,
+    /// The rating system for MENA countries, a clone of MPAA. It is needed to prevent titles go live w/o additional QC check, since some of them can be inappropriate for the countries at all. See b/33408548 for more details.
+    #[serde(rename = "menaMpaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mena_mpaa_rating: Option<ContentRatingMenaMpaaRating>,
+    /// The video's rating from Taiwan's Ministry of Culture (文化部).
+    #[serde(rename = "moctwRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moctw_rating: Option<ContentRatingMoctwRating>,
+    /// The video's NICAM/Kijkwijzer rating from the Nederlands Instituut voor de Classificatie van Audiovisuele Media (Netherlands).
+    #[serde(rename = "kijkwijzerRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kijkwijzer_rating: Option<ContentRatingKijkwijzerRating>,
+    /// The video's Office of Film and Literature Classification (OFLC - New Zealand) rating.
+    #[serde(rename = "oflcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub oflc_rating: Option<ContentRatingOflcRating>,
+    /// The video's rating in Estonia.
+    #[serde(rename = "eefilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub eefilm_rating: Option<ContentRatingEefilmRating>,
+    /// A rating that YouTube uses to identify age-restricted content.
+    #[serde(rename = "ytRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub yt_rating: Option<ContentRatingYtRating>,
+    /// The video's rating from the Nacionãlais Kino centrs (National Film Centre of Latvia).
+    #[serde(rename = "nkclvRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nkclv_rating: Option<ContentRatingNkclvRating>,
+    /// The video's British Board of Film Classification (BBFC) rating.
+    #[serde(rename = "bbfcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bbfc_rating: Option<ContentRatingBbfcRating>,
+    /// The video's National Film Registry of the Russian Federation (MKRF - Russia) rating.
+    #[serde(rename = "russiaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub russia_rating: Option<ContentRatingRussiaRating>,
+    /// The video's Motion Picture Association of America (MPAA) rating.
+    #[serde(rename = "mpaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mpaa_rating: Option<ContentRatingMpaaRating>,
+    /// The video's Eirin (映倫) rating. Eirin is the Japanese rating system.
+    #[serde(rename = "eirinRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub eirin_rating: Option<ContentRatingEirinRating>,
+    /// The video's rating from the Hungarian Nemzeti Filmiroda, the Rating Committee of the National Office of Film.
+    #[serde(rename = "rcnofRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rcnof_rating: Option<ContentRatingRcnofRating>,
+    /// The video's Central Board of Film Certification (CBFC - India) rating.
+    #[serde(rename = "cbfcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cbfc_rating: Option<ContentRatingCbfcRating>,
+    /// The video's rating in Iceland.
+    #[serde(rename = "smaisRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub smais_rating: Option<ContentRatingSmaisRating>,
+    /// The video's rating system for Vietnam - MCST
+    #[serde(rename = "mcstRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mcst_rating: Option<ContentRatingMcstRating>,
+    /// The video's rating from Portugal's Comissão de Classificação de Espect´culos.
+    #[serde(rename = "cceRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cce_rating: Option<ContentRatingCceRating>,
+    /// The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian French-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
+    #[serde(rename = "catvfrRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub catvfr_rating: Option<ContentRatingCatvfrRating>,
+    /// The video's Departamento de Justiça, Classificação, Qualificação e Títulos (DJCQT - Brazil) rating.
+    #[serde(rename = "djctqRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub djctq_rating: Option<ContentRatingDjctqRating>,
+    /// The video's rating in the Czech Republic.
+    #[serde(rename = "czfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub czfilm_rating: Option<ContentRatingCzfilmRating>,
+    /// The video's rating from the Commission de Contrôle des Films (Belgium).
+    #[serde(rename = "cicfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cicf_rating: Option<ContentRatingCicfRating>,
+    /// The video's rating from Italy's Autorità per le Garanzie nelle Comunicazioni (AGCOM).
+    #[serde(rename = "agcomRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub agcom_rating: Option<ContentRatingAgcomRating>,
+    /// The video's rating in Israel.
+    #[serde(rename = "ilfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ilfilm_rating: Option<ContentRatingIlfilmRating>,
+    /// The video's rating from Thailand's Board of Film and Video Censors.
+    #[serde(rename = "bfvcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bfvc_rating: Option<ContentRatingBfvcRating>,
+    /// The video's rating in Peru.
+    #[serde(rename = "pefilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pefilm_rating: Option<ContentRatingPefilmRating>,
+    /// The video's rating from France's Conseil supérieur de l’audiovisuel, which rates broadcast content.
+    #[serde(rename = "csaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub csa_rating: Option<ContentRatingCsaRating>,
+    /// The video's rating in Egypt.
+    #[serde(rename = "egfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub egfilm_rating: Option<ContentRatingEgfilmRating>,
+    /// The video's rating from Malaysia's Film Censorship Board.
+    #[serde(rename = "fcbmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fcbm_rating: Option<ContentRatingFcbmRating>,
+    /// The video's rating in Slovakia.
+    #[serde(rename = "skfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub skfilm_rating: Option<ContentRatingSkfilmRating>,
+    /// Reasons that explain why the video received its DJCQT (Brazil) rating.
+    #[serde(rename = "djctqRatingReasons")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub djctq_rating_reasons: Option<Vec<ContentRatingDjctqRatingReasons>>,
+    /// The National Media Council ratings system for United Arab Emirates.
+    #[serde(rename = "nmcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nmc_rating: Option<ContentRatingNmcRating>,
+    /// The video's rating from Singapore's Media Development Authority (MDA) and, specifically, it's Board of Film Censors (BFC).
+    #[serde(rename = "mdaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mda_rating: Option<ContentRatingMdaRating>,
+    /// The video's rating from Romania's CONSILIUL NATIONAL AL AUDIOVIZUALULUI (CNA).
+    #[serde(rename = "cnaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cna_rating: Option<ContentRatingCnaRating>,
+    /// The video's Irish Film Classification Office (IFCO - Ireland) rating. See the IFCO website for more information.
+    #[serde(rename = "ifcoRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ifco_rating: Option<ContentRatingIfcoRating>,
+    /// The video's Australian Classification Board (ACB) or Australian Communications and Media Authority (ACMA) rating. ACMA ratings are used to classify children's television programming.
+    #[serde(rename = "acbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub acb_rating: Option<ContentRatingAcbRating>,
+    /// The video's Ministerio de Cultura (Colombia) rating.
+    #[serde(rename = "mocRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moc_rating: Option<ContentRatingMocRating>,
+    /// The video's INCAA (Instituto Nacional de Cine y Artes Audiovisuales - Argentina) rating.
+    #[serde(rename = "incaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub incaa_rating: Option<ContentRatingIncaaRating>,
+    /// The video's Freiwillige Selbstkontrolle der Filmwirtschaft (FSK - Germany) rating.
+    #[serde(rename = "fskRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fsk_rating: Option<ContentRatingFskRating>,
+    /// The video's rating from the Austrian Board of Media Classification (Bundesministerium für Unterricht, Kunst und Kultur).
+    #[serde(rename = "bmukkRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bmukk_rating: Option<ContentRatingBmukkRating>,
+    /// The video's rating from the Kenya Film Classification Board.
+    #[serde(rename = "kfcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kfcb_rating: Option<ContentRatingKfcbRating>,
+    /// The video's rating from Nigeria's National Film and Video Censors Board.
+    #[serde(rename = "nfvcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nfvcb_rating: Option<ContentRatingNfvcbRating>,
+    /// This property has been deprecated. Use the contentDetails.contentRating.cncRating instead.
+    #[serde(rename = "fmocRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fmoc_rating: Option<ContentRatingFmocRating>,
+    /// The video's Anatel (Asociación Nacional de Televisión) rating for Chilean television.
+    #[serde(rename = "anatelRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub anatel_rating: Option<ContentRatingAnatelRating>,
+    /// Rating system in Turkey - Evaluation and Classification Board of the Ministry of Culture and Tourism
+    #[serde(rename = "ecbmctRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ecbmct_rating: Option<ContentRatingEcbmctRating>,
+    /// The video's rating from Indonesia's Lembaga Sensor Film.
+    #[serde(rename = "lsfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub lsf_rating: Option<ContentRatingLsfRating>,
+    /// Rating system in France - Commission de classification cinematographique
+    #[serde(rename = "cncRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cnc_rating: Option<ContentRatingCncRating>,
+    /// The rating system for trailer, DVD, and Ad in the US. See http://movielabs.com/md/ratings/v2.3/html/US_MPAAT_Ratings.html.
+    #[serde(rename = "mpaatRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mpaat_rating: Option<ContentRatingMpaatRating>,
+    /// The video's Consejo de Calificación Cinematográfica (Chile) rating.
+    #[serde(rename = "cccRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ccc_rating: Option<ContentRatingCccRating>,
+    /// Rating system for Canadian TV - Canadian TV Classification System The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian English-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
+    #[serde(rename = "catvRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub catv_rating: Option<ContentRatingCatvRating>,
+    /// The video's rating from Luxembourg's Commission de surveillance de la classification des films (CSCF).
+    #[serde(rename = "cscfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cscf_rating: Option<ContentRatingCscfRating>,
+    /// The video's rating in Venezuela.
+    #[serde(rename = "resorteviolenciaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resorteviolencia_rating: Option<ContentRatingResorteviolenciaRating>,
+    /// The video's TV Parental Guidelines (TVPG) rating.
+    #[serde(rename = "tvpgRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tvpg_rating: Option<ContentRatingTvpgRating>,
+}
+
+/// A `__liveChatBan__` resource represents a ban for a YouTube live chat.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBan {
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveChatBanSnippet>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#liveChatBan"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the ban.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+/// Branding properties of a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBrandingSettings {
+    #[serde(rename = "watch")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch: Option<WatchSettings>,
+    /// Additional experimental branding properties.
+    #[serde(rename = "hints")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hints: Option<Vec<PropertyValue>>,
+    #[serde(rename = "channel")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel: Option<ChannelSettings>,
+    #[serde(rename = "image")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image: Option<ImageSettings>,
+}
+
+/// Describes the spatial position of a visual widget inside a video. It is a union of various position types, out of which only will be set one.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoPosition {
+    /// Defines the position type.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub typ: Option<InvideoPositionType>,
+    /// Describes in which corner of the video the visual widget will appear.
+    #[serde(rename = "cornerPosition")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub corner_position: Option<InvideoPositionCornerPosition>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamHealthStatus {
+    /// u64: The last time this status was updated (in seconds)
+    #[serde(rename = "lastUpdateTimeSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub last_update_time_seconds: Option<String>,
+    /// The status code of this stream
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamHealthStatusStatus>,
+    /// The configurations issues on this stream
+    #[serde(rename = "configurationIssues")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
+}
+
+/// Basic details about a search result, including title, description and thumbnails of the item referenced by the search result.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchResultSnippet {
+    /// The title of the channel that published the resource that the search result identifies.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// It indicates if the resource (video or channel) has upcoming/active live broadcast content. Or it's "none" if there is not any upcoming/active live broadcasts.
+    #[serde(rename = "liveBroadcastContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_content: Option<SearchResultSnippetLiveBroadcastContent>,
+    /// A description of the search result.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The value that YouTube uses to uniquely identify the channel that published the resource that the search result identifies.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The title of the search result.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The creation date and time of the resource that the search result identifies. The value is specified in ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemListResponse {
+    /// A list of playlist items that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<PlaylistItem>>,
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The 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>,
+    /// 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>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+}
+
+///
+#[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>,
+}
+
+/// Freebase topic information related to the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelTopicDetails {
+    /// A list of Freebase topic IDs associated with the channel. You can retrieve information about each topic using the Freebase Topic API.
+    #[serde(rename = "topicIds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_ids: Option<Vec<String>>,
+    /// A list of Wikipedia URLs that describe the channel's content.
+    #[serde(rename = "topicCategories")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_categories: Option<Vec<String>>,
 }
 
 /// A *subscription* resource contains information about a YouTube user subscription. A subscription notifies a user when new videos are added to a channel or when another user takes one of several actions on YouTube, such as uploading a video, rating a video, or commenting on a video.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct Subscription {
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<SubscriptionContentDetails>,
+    /// The ID that YouTube uses to uniquely identify the subscription.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    #[serde(rename = "subscriberSnippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscriber_snippet: Option<SubscriptionSubscriberSnippet>,
     /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscription".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -4553,54 +4450,133 @@
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub snippet: Option<SubscriptionSnippet>,
-    /// The ID that YouTube uses to uniquely identify the subscription.
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<SubscriptionContentDetails>,
+}
+
+/// 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>,
+    /// 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>,
+    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
+    #[serde(rename = "vendor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub vendor: Option<String>,
+}
+
+/// A single tag suggestion with it's relevance information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSuggestionsTagSuggestion {
+    /// The keyword tag suggested for the video.
+    #[serde(rename = "tag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag: Option<String>,
+    /// A set of video categories for which the tag is relevant. You can use this information to display appropriate tag suggestions based on the video category that the video uploader associates with the video. By default, tag suggestions are relevant for all categories if there are no restricts defined for the keyword.
+    #[serde(rename = "categoryRestricts")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub category_restricts: Option<Vec<String>>,
+}
+
+/// Geographical coordinates of a point, in WGS84.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct GeoPoint {
+    /// Altitude above the reference ellipsoid, in meters.
+    #[serde(rename = "altitude")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub altitude: Option<f64>,
+    /// Longitude in degrees.
+    #[serde(rename = "longitude")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub longitude: Option<f64>,
+    /// Latitude in degrees.
+    #[serde(rename = "latitude")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub latitude: Option<f64>,
+}
+
+/// A pair Property / Value.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PropertyValue {
+    /// A property.
+    #[serde(rename = "property")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub property: Option<String>,
+    /// The property's value.
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+///
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseType {
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-    #[serde(rename = "subscriberSnippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscriber_snippet: Option<SubscriptionSubscriberSnippet>,
+}
+
+/// Basic details about a channel, including title, description and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSnippet {
+    /// The date and time that the channel was created. The value is specified in < a href="//www.w3.org/TR/NOTE-datetime">ISO 8601 format.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<ChannelLocalization>,
+    /// The language of the channel's default title and description.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+    /// The description of the channel.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The channel's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The country of the channel.
+    #[serde(rename = "country")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country: Option<String>,
+    /// The custom url of the channel.
+    #[serde(rename = "customUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub custom_url: Option<String>,
 }
 
 ///
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct YoutubeParams {
-    /// 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>,
     /// JSONP
     #[serde(rename = "callback")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub callback: Option<String>,
-    /// API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.
-    #[serde(rename = "key")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub key: Option<String>,
+    /// OAuth access token.
+    #[serde(rename = "access_token")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub access_token: Option<String>,
     /// Data format for response.
     #[serde(rename = "alt")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt: Option<String>,
-    /// V1 error format.
-    #[serde(rename = "$.xgafv")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dollar_xgafv: Option<String>,
-    /// Returns response with indentations and line breaks.
-    #[serde(rename = "prettyPrint")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pretty_print: Option<bool>,
-    /// OAuth 2.0 token for the current user.
-    #[serde(rename = "oauth_token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub oauth_token: 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>,
+    pub alt: Option<YoutubeParamsAlt>,
     /// Upload protocol for media (e.g. "raw", "multipart").
     #[serde(rename = "upload_protocol")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -4609,522 +4585,6410 @@
     #[serde(rename = "quotaUser")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub quota_user: Option<String>,
-}
-
-/// 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 = "publishedBefore")]
-    pub published_before: Option<String>,
-    #[serde(rename = "publishedAfter")]
-    pub published_after: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// 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 = "home")]
-    pub home: Option<bool>,
+    /// Returns response with indentations and line breaks.
+    #[serde(rename = "prettyPrint")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pretty_print: Option<bool>,
+    /// API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.
+    #[serde(rename = "key")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub key: Option<String>,
+    /// V1 error format.
+    #[serde(rename = "$.xgafv")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dollar_xgafv: Option<YoutubeParamsdollar_xgafv>,
+    /// Legacy upload protocol for media (e.g. "media", "multipart").
+    #[serde(rename = "uploadType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub upload_type: Option<String>,
+    /// Selector specifying which fields to include in a partial response.
+    #[serde(rename = "fields")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fields: Option<String>,
+    /// OAuth 2.0 token for the current user.
+    #[serde(rename = "oauth_token")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub oauth_token: Option<String>,
+}
+
+#[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 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 ChannelStatusPrivacyStatus {
+    Undefined,
+    ///
+    #[serde(rename = "public")]
+    Public,
+    ///
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    ///
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for ChannelStatusPrivacyStatus {
+    fn default() -> ChannelStatusPrivacyStatus {
+        ChannelStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            ChannelStatusPrivacyStatus::Public => write!(f, "public"),
+            ChannelStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            ChannelStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelStatusLongUploadsStatus {
+    Undefined,
+    ///
+    #[serde(rename = "longUploadsUnspecified")]
+    LongUploadsUnspecified,
+    ///
+    #[serde(rename = "allowed")]
+    Allowed,
+    ///
+    #[serde(rename = "eligible")]
+    Eligible,
+    ///
+    #[serde(rename = "disallowed")]
+    Disallowed,
+}
+
+impl std::default::Default for ChannelStatusLongUploadsStatus {
+    fn default() -> ChannelStatusLongUploadsStatus {
+        ChannelStatusLongUploadsStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelStatusLongUploadsStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelStatusLongUploadsStatus::Undefined => write!(f, "undefined"),
+            ChannelStatusLongUploadsStatus::LongUploadsUnspecified => {
+                write!(f, "longUploadsUnspecified")
+            }
+            ChannelStatusLongUploadsStatus::Allowed => write!(f, "allowed"),
+            ChannelStatusLongUploadsStatus::Eligible => write!(f, "eligible"),
+            ChannelStatusLongUploadsStatus::Disallowed => write!(f, "disallowed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivityContentDetailsSocialType {
+    Undefined,
+    ///
+    #[serde(rename = "typeUnspecified")]
+    TypeUnspecified,
+    ///
+    #[serde(rename = "googlePlus")]
+    GooglePlus,
+    ///
+    #[serde(rename = "facebook")]
+    Facebook,
+    ///
+    #[serde(rename = "twitter")]
+    Twitter,
+}
+
+impl std::default::Default for ActivityContentDetailsSocialType {
+    fn default() -> ActivityContentDetailsSocialType {
+        ActivityContentDetailsSocialType::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivityContentDetailsSocialType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivityContentDetailsSocialType::Undefined => write!(f, "undefined"),
+            ActivityContentDetailsSocialType::TypeUnspecified => write!(f, "typeUnspecified"),
+            ActivityContentDetailsSocialType::GooglePlus => write!(f, "googlePlus"),
+            ActivityContentDetailsSocialType::Facebook => write!(f, "facebook"),
+            ActivityContentDetailsSocialType::Twitter => write!(f, "twitter"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 LiveStreamConfigurationIssueType {
+    Undefined,
+    ///
+    #[serde(rename = "gopSizeOver")]
+    GopSizeOver,
+    ///
+    #[serde(rename = "gopSizeLong")]
+    GopSizeLong,
+    ///
+    #[serde(rename = "gopSizeShort")]
+    GopSizeShort,
+    ///
+    #[serde(rename = "openGop")]
+    OpenGop,
+    ///
+    #[serde(rename = "badContainer")]
+    BadContainer,
+    ///
+    #[serde(rename = "audioBitrateHigh")]
+    AudioBitrateHigh,
+    ///
+    #[serde(rename = "audioBitrateLow")]
+    AudioBitrateLow,
+    ///
+    #[serde(rename = "audioSampleRate")]
+    AudioSampleRate,
+    ///
+    #[serde(rename = "bitrateHigh")]
+    BitrateHigh,
+    ///
+    #[serde(rename = "bitrateLow")]
+    BitrateLow,
+    ///
+    #[serde(rename = "audioCodec")]
+    AudioCodec,
+    ///
+    #[serde(rename = "videoCodec")]
+    VideoCodec,
+    ///
+    #[serde(rename = "noAudioStream")]
+    NoAudioStream,
+    ///
+    #[serde(rename = "noVideoStream")]
+    NoVideoStream,
+    ///
+    #[serde(rename = "multipleVideoStreams")]
+    MultipleVideoStreams,
+    ///
+    #[serde(rename = "multipleAudioStreams")]
+    MultipleAudioStreams,
+    ///
+    #[serde(rename = "audioTooManyChannels")]
+    AudioTooManyChannels,
+    ///
+    #[serde(rename = "interlacedVideo")]
+    InterlacedVideo,
+    ///
+    #[serde(rename = "frameRateHigh")]
+    FrameRateHigh,
+    ///
+    #[serde(rename = "resolutionMismatch")]
+    ResolutionMismatch,
+    ///
+    #[serde(rename = "videoCodecMismatch")]
+    VideoCodecMismatch,
+    ///
+    #[serde(rename = "videoInterlaceMismatch")]
+    VideoInterlaceMismatch,
+    ///
+    #[serde(rename = "videoProfileMismatch")]
+    VideoProfileMismatch,
+    ///
+    #[serde(rename = "videoBitrateMismatch")]
+    VideoBitrateMismatch,
+    ///
+    #[serde(rename = "framerateMismatch")]
+    FramerateMismatch,
+    ///
+    #[serde(rename = "gopMismatch")]
+    GopMismatch,
+    ///
+    #[serde(rename = "audioSampleRateMismatch")]
+    AudioSampleRateMismatch,
+    ///
+    #[serde(rename = "audioStereoMismatch")]
+    AudioStereoMismatch,
+    ///
+    #[serde(rename = "audioCodecMismatch")]
+    AudioCodecMismatch,
+    ///
+    #[serde(rename = "audioBitrateMismatch")]
+    AudioBitrateMismatch,
+    ///
+    #[serde(rename = "videoResolutionSuboptimal")]
+    VideoResolutionSuboptimal,
+    ///
+    #[serde(rename = "videoResolutionUnsupported")]
+    VideoResolutionUnsupported,
+    ///
+    #[serde(rename = "videoIngestionStarved")]
+    VideoIngestionStarved,
+    ///
+    #[serde(rename = "videoIngestionFasterThanRealtime")]
+    VideoIngestionFasterThanRealtime,
+}
+
+impl std::default::Default for LiveStreamConfigurationIssueType {
+    fn default() -> LiveStreamConfigurationIssueType {
+        LiveStreamConfigurationIssueType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamConfigurationIssueType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamConfigurationIssueType::Undefined => write!(f, "undefined"),
+            LiveStreamConfigurationIssueType::GopSizeOver => write!(f, "gopSizeOver"),
+            LiveStreamConfigurationIssueType::GopSizeLong => write!(f, "gopSizeLong"),
+            LiveStreamConfigurationIssueType::GopSizeShort => write!(f, "gopSizeShort"),
+            LiveStreamConfigurationIssueType::OpenGop => write!(f, "openGop"),
+            LiveStreamConfigurationIssueType::BadContainer => write!(f, "badContainer"),
+            LiveStreamConfigurationIssueType::AudioBitrateHigh => write!(f, "audioBitrateHigh"),
+            LiveStreamConfigurationIssueType::AudioBitrateLow => write!(f, "audioBitrateLow"),
+            LiveStreamConfigurationIssueType::AudioSampleRate => write!(f, "audioSampleRate"),
+            LiveStreamConfigurationIssueType::BitrateHigh => write!(f, "bitrateHigh"),
+            LiveStreamConfigurationIssueType::BitrateLow => write!(f, "bitrateLow"),
+            LiveStreamConfigurationIssueType::AudioCodec => write!(f, "audioCodec"),
+            LiveStreamConfigurationIssueType::VideoCodec => write!(f, "videoCodec"),
+            LiveStreamConfigurationIssueType::NoAudioStream => write!(f, "noAudioStream"),
+            LiveStreamConfigurationIssueType::NoVideoStream => write!(f, "noVideoStream"),
+            LiveStreamConfigurationIssueType::MultipleVideoStreams => {
+                write!(f, "multipleVideoStreams")
+            }
+            LiveStreamConfigurationIssueType::MultipleAudioStreams => {
+                write!(f, "multipleAudioStreams")
+            }
+            LiveStreamConfigurationIssueType::AudioTooManyChannels => {
+                write!(f, "audioTooManyChannels")
+            }
+            LiveStreamConfigurationIssueType::InterlacedVideo => write!(f, "interlacedVideo"),
+            LiveStreamConfigurationIssueType::FrameRateHigh => write!(f, "frameRateHigh"),
+            LiveStreamConfigurationIssueType::ResolutionMismatch => write!(f, "resolutionMismatch"),
+            LiveStreamConfigurationIssueType::VideoCodecMismatch => write!(f, "videoCodecMismatch"),
+            LiveStreamConfigurationIssueType::VideoInterlaceMismatch => {
+                write!(f, "videoInterlaceMismatch")
+            }
+            LiveStreamConfigurationIssueType::VideoProfileMismatch => {
+                write!(f, "videoProfileMismatch")
+            }
+            LiveStreamConfigurationIssueType::VideoBitrateMismatch => {
+                write!(f, "videoBitrateMismatch")
+            }
+            LiveStreamConfigurationIssueType::FramerateMismatch => write!(f, "framerateMismatch"),
+            LiveStreamConfigurationIssueType::GopMismatch => write!(f, "gopMismatch"),
+            LiveStreamConfigurationIssueType::AudioSampleRateMismatch => {
+                write!(f, "audioSampleRateMismatch")
+            }
+            LiveStreamConfigurationIssueType::AudioStereoMismatch => {
+                write!(f, "audioStereoMismatch")
+            }
+            LiveStreamConfigurationIssueType::AudioCodecMismatch => write!(f, "audioCodecMismatch"),
+            LiveStreamConfigurationIssueType::AudioBitrateMismatch => {
+                write!(f, "audioBitrateMismatch")
+            }
+            LiveStreamConfigurationIssueType::VideoResolutionSuboptimal => {
+                write!(f, "videoResolutionSuboptimal")
+            }
+            LiveStreamConfigurationIssueType::VideoResolutionUnsupported => {
+                write!(f, "videoResolutionUnsupported")
+            }
+            LiveStreamConfigurationIssueType::VideoIngestionStarved => {
+                write!(f, "videoIngestionStarved")
+            }
+            LiveStreamConfigurationIssueType::VideoIngestionFasterThanRealtime => {
+                write!(f, "videoIngestionFasterThanRealtime")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveStreamConfigurationIssueSeverity {
+    Undefined,
+    ///
+    #[serde(rename = "info")]
+    Info,
+    ///
+    #[serde(rename = "warning")]
+    Warning,
+    ///
+    #[serde(rename = "error")]
+    Error,
+}
+
+impl std::default::Default for LiveStreamConfigurationIssueSeverity {
+    fn default() -> LiveStreamConfigurationIssueSeverity {
+        LiveStreamConfigurationIssueSeverity::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamConfigurationIssueSeverity {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamConfigurationIssueSeverity::Undefined => write!(f, "undefined"),
+            LiveStreamConfigurationIssueSeverity::Info => write!(f, "info"),
+            LiveStreamConfigurationIssueSeverity::Warning => write!(f, "warning"),
+            LiveStreamConfigurationIssueSeverity::Error => write!(f, "error"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum 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 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 VideoSuggestionsEditorSuggestions {
+    Undefined,
+    /// Picture brightness levels seem off and could be corrected.
+    #[serde(rename = "videoAutoLevels")]
+    VideoAutoLevels,
+    /// The video appears shaky and could be stabilized.
+    #[serde(rename = "videoStabilize")]
+    VideoStabilize,
+    /// Margins (mattes) detected around the picture could be cropped.
+    #[serde(rename = "videoCrop")]
+    VideoCrop,
+    /// The audio track appears silent and could be swapped with a better quality one.
+    #[serde(rename = "audioQuietAudioSwap")]
+    AudioQuietAudioSwap,
+}
+
+impl std::default::Default for VideoSuggestionsEditorSuggestions {
+    fn default() -> VideoSuggestionsEditorSuggestions {
+        VideoSuggestionsEditorSuggestions::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsEditorSuggestions {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsEditorSuggestions::Undefined => write!(f, "undefined"),
+            VideoSuggestionsEditorSuggestions::VideoAutoLevels => write!(f, "videoAutoLevels"),
+            VideoSuggestionsEditorSuggestions::VideoStabilize => write!(f, "videoStabilize"),
+            VideoSuggestionsEditorSuggestions::VideoCrop => write!(f, "videoCrop"),
+            VideoSuggestionsEditorSuggestions::AudioQuietAudioSwap => {
+                write!(f, "audioQuietAudioSwap")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSuggestionsProcessingWarnings {
+    Undefined,
+    /// Unrecognized file format, transcoding is likely to fail.
+    #[serde(rename = "unknownContainer")]
+    UnknownContainer,
+    /// Unrecognized video codec, transcoding is likely to fail.
+    #[serde(rename = "unknownVideoCodec")]
+    UnknownVideoCodec,
+    /// Unrecognized audio codec, transcoding is likely to fail.
+    #[serde(rename = "unknownAudioCodec")]
+    UnknownAudioCodec,
+    /// Conflicting container and stream resolutions.
+    #[serde(rename = "inconsistentResolution")]
+    InconsistentResolution,
+    /// Edit lists are not currently supported.
+    #[serde(rename = "hasEditlist")]
+    HasEditlist,
+    /// Video codec that is known to cause problems was used.
+    #[serde(rename = "problematicVideoCodec")]
+    ProblematicVideoCodec,
+    /// Audio codec that is known to cause problems was used.
+    #[serde(rename = "problematicAudioCodec")]
+    ProblematicAudioCodec,
+    /// Unsupported VR video stereo mode.
+    #[serde(rename = "unsupportedVrStereoMode")]
+    UnsupportedVrStereoMode,
+    /// Unsupported spherical video projection type.
+    #[serde(rename = "unsupportedSphericalProjectionType")]
+    UnsupportedSphericalProjectionType,
+    /// Unsupported HDR pixel format.
+    #[serde(rename = "unsupportedHdrPixelFormat")]
+    UnsupportedHdrPixelFormat,
+    /// Unspecified HDR color metadata.
+    #[serde(rename = "unsupportedHdrColorMetadata")]
+    UnsupportedHdrColorMetadata,
+    /// Problematic HDR lookup table attached.
+    #[serde(rename = "problematicHdrLookupTable")]
+    ProblematicHdrLookupTable,
+}
+
+impl std::default::Default for VideoSuggestionsProcessingWarnings {
+    fn default() -> VideoSuggestionsProcessingWarnings {
+        VideoSuggestionsProcessingWarnings::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsProcessingWarnings {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsProcessingWarnings::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingWarnings::UnknownContainer => write!(f, "unknownContainer"),
+            VideoSuggestionsProcessingWarnings::UnknownVideoCodec => write!(f, "unknownVideoCodec"),
+            VideoSuggestionsProcessingWarnings::UnknownAudioCodec => write!(f, "unknownAudioCodec"),
+            VideoSuggestionsProcessingWarnings::InconsistentResolution => {
+                write!(f, "inconsistentResolution")
+            }
+            VideoSuggestionsProcessingWarnings::HasEditlist => write!(f, "hasEditlist"),
+            VideoSuggestionsProcessingWarnings::ProblematicVideoCodec => {
+                write!(f, "problematicVideoCodec")
+            }
+            VideoSuggestionsProcessingWarnings::ProblematicAudioCodec => {
+                write!(f, "problematicAudioCodec")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedVrStereoMode => {
+                write!(f, "unsupportedVrStereoMode")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedSphericalProjectionType => {
+                write!(f, "unsupportedSphericalProjectionType")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedHdrPixelFormat => {
+                write!(f, "unsupportedHdrPixelFormat")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedHdrColorMetadata => {
+                write!(f, "unsupportedHdrColorMetadata")
+            }
+            VideoSuggestionsProcessingWarnings::ProblematicHdrLookupTable => {
+                write!(f, "problematicHdrLookupTable")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSuggestionsProcessingErrors {
+    Undefined,
+    /// File contains audio only (e.g., an MP3 file).
+    #[serde(rename = "audioFile")]
+    AudioFile,
+    /// Image file (e.g., a JPEG image).
+    #[serde(rename = "imageFile")]
+    ImageFile,
+    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
+    #[serde(rename = "projectFile")]
+    ProjectFile,
+    /// Other non-video file.
+    #[serde(rename = "notAVideoFile")]
+    NotAVideoFile,
+    /// Document or text file (e.g., MS Word document).
+    #[serde(rename = "docFile")]
+    DocFile,
+    /// An archive file (e.g., a ZIP archive).
+    #[serde(rename = "archiveFile")]
+    ArchiveFile,
+    /// Unsupported spatial audio layout type.
+    #[serde(rename = "unsupportedSpatialAudioLayout")]
+    UnsupportedSpatialAudioLayout,
+}
+
+impl std::default::Default for VideoSuggestionsProcessingErrors {
+    fn default() -> VideoSuggestionsProcessingErrors {
+        VideoSuggestionsProcessingErrors::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsProcessingErrors {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsProcessingErrors::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingErrors::AudioFile => write!(f, "audioFile"),
+            VideoSuggestionsProcessingErrors::ImageFile => write!(f, "imageFile"),
+            VideoSuggestionsProcessingErrors::ProjectFile => write!(f, "projectFile"),
+            VideoSuggestionsProcessingErrors::NotAVideoFile => write!(f, "notAVideoFile"),
+            VideoSuggestionsProcessingErrors::DocFile => write!(f, "docFile"),
+            VideoSuggestionsProcessingErrors::ArchiveFile => write!(f, "archiveFile"),
+            VideoSuggestionsProcessingErrors::UnsupportedSpatialAudioLayout => {
+                write!(f, "unsupportedSpatialAudioLayout")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSuggestionsProcessingHints {
+    Undefined,
+    /// The MP4 file is not streamable, this will slow down the processing. MOOV atom was not found at the beginning of the file.
+    #[serde(rename = "nonStreamableMov")]
+    NonStreamableMov,
+    /// Probably a better quality version of the video exists. The video has wide screen aspect ratio, but is not an HD video.
+    #[serde(rename = "sendBestQualityVideo")]
+    SendBestQualityVideo,
+    /// Uploaded video is spherical video.
+    #[serde(rename = "sphericalVideo")]
+    SphericalVideo,
+    /// Uploaded video has spatial audio.
+    #[serde(rename = "spatialAudio")]
+    SpatialAudio,
+    /// Uploaded video is VR video.
+    #[serde(rename = "vrVideo")]
+    VrVideo,
+    /// Uploaded video is HDR video.
+    #[serde(rename = "hdrVideo")]
+    HdrVideo,
+}
+
+impl std::default::Default for VideoSuggestionsProcessingHints {
+    fn default() -> VideoSuggestionsProcessingHints {
+        VideoSuggestionsProcessingHints::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSuggestionsProcessingHints {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSuggestionsProcessingHints::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingHints::NonStreamableMov => write!(f, "nonStreamableMov"),
+            VideoSuggestionsProcessingHints::SendBestQualityVideo => {
+                write!(f, "sendBestQualityVideo")
+            }
+            VideoSuggestionsProcessingHints::SphericalVideo => write!(f, "sphericalVideo"),
+            VideoSuggestionsProcessingHints::SpatialAudio => write!(f, "spatialAudio"),
+            VideoSuggestionsProcessingHints::VrVideo => write!(f, "vrVideo"),
+            VideoSuggestionsProcessingHints::HdrVideo => write!(f, "hdrVideo"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivityContentDetailsPromotedItemCtaType {
+    Undefined,
+    ///
+    #[serde(rename = "ctaTypeUnspecified")]
+    CtaTypeUnspecified,
+    ///
+    #[serde(rename = "visitAdvertiserSite")]
+    VisitAdvertiserSite,
+}
+
+impl std::default::Default for ActivityContentDetailsPromotedItemCtaType {
+    fn default() -> ActivityContentDetailsPromotedItemCtaType {
+        ActivityContentDetailsPromotedItemCtaType::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivityContentDetailsPromotedItemCtaType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivityContentDetailsPromotedItemCtaType::Undefined => write!(f, "undefined"),
+            ActivityContentDetailsPromotedItemCtaType::CtaTypeUnspecified => {
+                write!(f, "ctaTypeUnspecified")
+            }
+            ActivityContentDetailsPromotedItemCtaType::VisitAdvertiserSite => {
+                write!(f, "visitAdvertiserSite")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusLifeCycleStatus {
+    Undefined,
+    /// No value or the value is unknown.
+    #[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 LiveBroadcastStatusRecordingStatus {
+    Undefined,
+    /// No value or the value is unknown.
+    #[serde(rename = "liveBroadcastRecordingStatusUnspecified")]
+    LiveBroadcastRecordingStatusUnspecified,
+    /// The recording has not yet been started.
+    #[serde(rename = "notRecording")]
+    NotRecording,
+    /// The recording is currently on.
+    #[serde(rename = "recording")]
+    Recording,
+    /// The recording is completed, and cannot be started again.
+    #[serde(rename = "recorded")]
+    Recorded,
+}
+
+impl std::default::Default for LiveBroadcastStatusRecordingStatus {
+    fn default() -> LiveBroadcastStatusRecordingStatus {
+        LiveBroadcastStatusRecordingStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastStatusRecordingStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastStatusRecordingStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastStatusRecordingStatus::LiveBroadcastRecordingStatusUnspecified => {
+                write!(f, "liveBroadcastRecordingStatusUnspecified")
+            }
+            LiveBroadcastStatusRecordingStatus::NotRecording => write!(f, "notRecording"),
+            LiveBroadcastStatusRecordingStatus::Recording => write!(f, "recording"),
+            LiveBroadcastStatusRecordingStatus::Recorded => write!(f, "recorded"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusPrivacyStatus {
+    Undefined,
+    ///
+    #[serde(rename = "public")]
+    Public,
+    ///
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    ///
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for LiveBroadcastStatusPrivacyStatus {
+    fn default() -> LiveBroadcastStatusPrivacyStatus {
+        LiveBroadcastStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastStatusPrivacyStatus::Public => write!(f, "public"),
+            LiveBroadcastStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            LiveBroadcastStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusLiveBroadcastPriority {
+    Undefined,
+    ///
+    #[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 VideoProcessingDetailsProcessingStatus {
+    Undefined,
+    ///
+    #[serde(rename = "processing")]
+    Processing,
+    ///
+    #[serde(rename = "succeeded")]
+    Succeeded,
+    ///
+    #[serde(rename = "failed")]
+    Failed,
+    ///
+    #[serde(rename = "terminated")]
+    Terminated,
+}
+
+impl std::default::Default for VideoProcessingDetailsProcessingStatus {
+    fn default() -> VideoProcessingDetailsProcessingStatus {
+        VideoProcessingDetailsProcessingStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoProcessingDetailsProcessingStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoProcessingDetailsProcessingStatus::Undefined => write!(f, "undefined"),
+            VideoProcessingDetailsProcessingStatus::Processing => write!(f, "processing"),
+            VideoProcessingDetailsProcessingStatus::Succeeded => write!(f, "succeeded"),
+            VideoProcessingDetailsProcessingStatus::Failed => write!(f, "failed"),
+            VideoProcessingDetailsProcessingStatus::Terminated => write!(f, "terminated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoProcessingDetailsProcessingFailureReason {
+    Undefined,
+    ///
+    #[serde(rename = "uploadFailed")]
+    UploadFailed,
+    ///
+    #[serde(rename = "transcodeFailed")]
+    TranscodeFailed,
+    ///
+    #[serde(rename = "streamingFailed")]
+    StreamingFailed,
+    ///
+    #[serde(rename = "other")]
+    Other,
+}
+
+impl std::default::Default for VideoProcessingDetailsProcessingFailureReason {
+    fn default() -> VideoProcessingDetailsProcessingFailureReason {
+        VideoProcessingDetailsProcessingFailureReason::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoProcessingDetailsProcessingFailureReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoProcessingDetailsProcessingFailureReason::Undefined => write!(f, "undefined"),
+            VideoProcessingDetailsProcessingFailureReason::UploadFailed => {
+                write!(f, "uploadFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::TranscodeFailed => {
+                write!(f, "transcodeFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::StreamingFailed => {
+                write!(f, "streamingFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::Other => write!(f, "other"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoFileDetailsVideoStreamRotation {
+    Undefined,
+    ///
+    #[serde(rename = "none")]
+    None,
+    ///
+    #[serde(rename = "clockwise")]
+    Clockwise,
+    ///
+    #[serde(rename = "upsideDown")]
+    UpsideDown,
+    ///
+    #[serde(rename = "counterClockwise")]
+    CounterClockwise,
+    ///
+    #[serde(rename = "other")]
+    Other,
+}
+
+impl std::default::Default for VideoFileDetailsVideoStreamRotation {
+    fn default() -> VideoFileDetailsVideoStreamRotation {
+        VideoFileDetailsVideoStreamRotation::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoFileDetailsVideoStreamRotation {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoFileDetailsVideoStreamRotation::Undefined => write!(f, "undefined"),
+            VideoFileDetailsVideoStreamRotation::None => write!(f, "none"),
+            VideoFileDetailsVideoStreamRotation::Clockwise => write!(f, "clockwise"),
+            VideoFileDetailsVideoStreamRotation::UpsideDown => write!(f, "upsideDown"),
+            VideoFileDetailsVideoStreamRotation::CounterClockwise => write!(f, "counterClockwise"),
+            VideoFileDetailsVideoStreamRotation::Other => write!(f, "other"),
+        };
+        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 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 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 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 VideoAgeGatingVideoGameRating {
+    Undefined,
+    ///
+    #[serde(rename = "anyone")]
+    Anyone,
+    ///
+    #[serde(rename = "m15Plus")]
+    M15Plus,
+    ///
+    #[serde(rename = "m16Plus")]
+    M16Plus,
+    ///
+    #[serde(rename = "m17Plus")]
+    M17Plus,
+}
+
+impl std::default::Default for VideoAgeGatingVideoGameRating {
+    fn default() -> VideoAgeGatingVideoGameRating {
+        VideoAgeGatingVideoGameRating::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoAgeGatingVideoGameRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoAgeGatingVideoGameRating::Undefined => write!(f, "undefined"),
+            VideoAgeGatingVideoGameRating::Anyone => write!(f, "anyone"),
+            VideoAgeGatingVideoGameRating::M15Plus => write!(f, "m15Plus"),
+            VideoAgeGatingVideoGameRating::M16Plus => write!(f, "m16Plus"),
+            VideoAgeGatingVideoGameRating::M17Plus => write!(f, "m17Plus"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivitySnippetType {
+    Undefined,
+    ///
+    #[serde(rename = "typeUnspecified")]
+    TypeUnspecified,
+    ///
+    #[serde(rename = "upload")]
+    Upload,
+    ///
+    #[serde(rename = "like")]
+    Like,
+    ///
+    #[serde(rename = "favorite")]
+    Favorite,
+    ///
+    #[serde(rename = "comment")]
+    Comment,
+    ///
+    #[serde(rename = "subscription")]
+    Subscription,
+    ///
+    #[serde(rename = "playlistItem")]
+    PlaylistItem,
+    ///
+    #[serde(rename = "recommendation")]
+    Recommendation,
+    ///
+    #[serde(rename = "bulletin")]
+    Bulletin,
+    ///
+    #[serde(rename = "social")]
+    Social,
+    ///
+    #[serde(rename = "channelItem")]
+    ChannelItem,
+    ///
+    #[serde(rename = "promotedItem")]
+    PromotedItem,
+}
+
+impl std::default::Default for ActivitySnippetType {
+    fn default() -> ActivitySnippetType {
+        ActivitySnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivitySnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivitySnippetType::Undefined => write!(f, "undefined"),
+            ActivitySnippetType::TypeUnspecified => write!(f, "typeUnspecified"),
+            ActivitySnippetType::Upload => write!(f, "upload"),
+            ActivitySnippetType::Like => write!(f, "like"),
+            ActivitySnippetType::Favorite => write!(f, "favorite"),
+            ActivitySnippetType::Comment => write!(f, "comment"),
+            ActivitySnippetType::Subscription => write!(f, "subscription"),
+            ActivitySnippetType::PlaylistItem => write!(f, "playlistItem"),
+            ActivitySnippetType::Recommendation => write!(f, "recommendation"),
+            ActivitySnippetType::Bulletin => write!(f, "bulletin"),
+            ActivitySnippetType::Social => write!(f, "social"),
+            ActivitySnippetType::ChannelItem => write!(f, "channelItem"),
+            ActivitySnippetType::PromotedItem => write!(f, "promotedItem"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinkStatusLinkStatus {
+    Undefined,
+    ///
+    #[serde(rename = "unknown")]
+    Unknown,
+    ///
+    #[serde(rename = "failed")]
+    Failed,
+    ///
+    #[serde(rename = "pending")]
+    Pending,
+    ///
+    #[serde(rename = "linked")]
+    Linked,
+}
+
+impl std::default::Default for ThirdPartyLinkStatusLinkStatus {
+    fn default() -> ThirdPartyLinkStatusLinkStatus {
+        ThirdPartyLinkStatusLinkStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinkStatusLinkStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinkStatusLinkStatus::Undefined => write!(f, "undefined"),
+            ThirdPartyLinkStatusLinkStatus::Unknown => write!(f, "unknown"),
+            ThirdPartyLinkStatusLinkStatus::Failed => write!(f, "failed"),
+            ThirdPartyLinkStatusLinkStatus::Pending => write!(f, "pending"),
+            ThirdPartyLinkStatusLinkStatus::Linked => write!(f, "linked"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoRatingRating {
+    Undefined,
+    ///
+    #[serde(rename = "none")]
+    None,
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "dislike")]
+    Dislike,
+}
+
+impl std::default::Default for VideoRatingRating {
+    fn default() -> VideoRatingRating {
+        VideoRatingRating::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoRatingRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoRatingRating::Undefined => write!(f, "undefined"),
+            VideoRatingRating::None => write!(f, "none"),
+            VideoRatingRating::Like => write!(f, "like"),
+            VideoRatingRating::Dislike => write!(f, "dislike"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinkSnippetType {
+    Undefined,
+    ///
+    #[serde(rename = "linkUnspecified")]
+    LinkUnspecified,
+    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
+    #[serde(rename = "channelToStoreLink")]
+    ChannelToStoreLink,
+}
+
+impl std::default::Default for ThirdPartyLinkSnippetType {
+    fn default() -> ThirdPartyLinkSnippetType {
+        ThirdPartyLinkSnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinkSnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinkSnippetType::Undefined => write!(f, "undefined"),
+            ThirdPartyLinkSnippetType::LinkUnspecified => write!(f, "linkUnspecified"),
+            ThirdPartyLinkSnippetType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetFailureReason {
+    Undefined,
+    ///
+    #[serde(rename = "unknownFormat")]
+    UnknownFormat,
+    ///
+    #[serde(rename = "unsupportedFormat")]
+    UnsupportedFormat,
+    ///
+    #[serde(rename = "processingFailed")]
+    ProcessingFailed,
+}
+
+impl std::default::Default for CaptionSnippetFailureReason {
+    fn default() -> CaptionSnippetFailureReason {
+        CaptionSnippetFailureReason::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetFailureReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetFailureReason::Undefined => write!(f, "undefined"),
+            CaptionSnippetFailureReason::UnknownFormat => write!(f, "unknownFormat"),
+            CaptionSnippetFailureReason::UnsupportedFormat => write!(f, "unsupportedFormat"),
+            CaptionSnippetFailureReason::ProcessingFailed => write!(f, "processingFailed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetTrackKind {
+    Undefined,
+    ///
+    #[serde(rename = "standard")]
+    Standard,
+    ///
+    #[serde(rename = "ASR")]
+    ASR,
+    ///
+    #[serde(rename = "forced")]
+    Forced,
+}
+
+impl std::default::Default for CaptionSnippetTrackKind {
+    fn default() -> CaptionSnippetTrackKind {
+        CaptionSnippetTrackKind::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetTrackKind {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetTrackKind::Undefined => write!(f, "undefined"),
+            CaptionSnippetTrackKind::Standard => write!(f, "standard"),
+            CaptionSnippetTrackKind::ASR => write!(f, "ASR"),
+            CaptionSnippetTrackKind::Forced => write!(f, "forced"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetAudioTrackType {
+    Undefined,
+    ///
+    #[serde(rename = "unknown")]
+    Unknown,
+    ///
+    #[serde(rename = "primary")]
+    Primary,
+    ///
+    #[serde(rename = "commentary")]
+    Commentary,
+    ///
+    #[serde(rename = "descriptive")]
+    Descriptive,
+}
+
+impl std::default::Default for CaptionSnippetAudioTrackType {
+    fn default() -> CaptionSnippetAudioTrackType {
+        CaptionSnippetAudioTrackType::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetAudioTrackType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetAudioTrackType::Undefined => write!(f, "undefined"),
+            CaptionSnippetAudioTrackType::Unknown => write!(f, "unknown"),
+            CaptionSnippetAudioTrackType::Primary => write!(f, "primary"),
+            CaptionSnippetAudioTrackType::Commentary => write!(f, "commentary"),
+            CaptionSnippetAudioTrackType::Descriptive => write!(f, "descriptive"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetStatus {
+    Undefined,
+    ///
+    #[serde(rename = "serving")]
+    Serving,
+    ///
+    #[serde(rename = "syncing")]
+    Syncing,
+    ///
+    #[serde(rename = "failed")]
+    Failed,
+}
+
+impl std::default::Default for CaptionSnippetStatus {
+    fn default() -> CaptionSnippetStatus {
+        CaptionSnippetStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CaptionSnippetStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CaptionSnippetStatus::Undefined => write!(f, "undefined"),
+            CaptionSnippetStatus::Serving => write!(f, "serving"),
+            CaptionSnippetStatus::Syncing => write!(f, "syncing"),
+            CaptionSnippetStatus::Failed => write!(f, "failed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoFileDetailsFileType {
+    Undefined,
+    /// Known video file (e.g., an MP4 file).
+    #[serde(rename = "video")]
+    Video,
+    /// Audio only file (e.g., an MP3 file).
+    #[serde(rename = "audio")]
+    Audio,
+    /// Image file (e.g., a JPEG image).
+    #[serde(rename = "image")]
+    Image,
+    /// Archive file (e.g., a ZIP archive).
+    #[serde(rename = "archive")]
+    Archive,
+    /// Document or text file (e.g., MS Word document).
+    #[serde(rename = "document")]
+    Document,
+    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
+    #[serde(rename = "project")]
+    Project,
+    /// Other non-video file type.
+    #[serde(rename = "other")]
+    Other,
+}
+
+impl std::default::Default for VideoFileDetailsFileType {
+    fn default() -> VideoFileDetailsFileType {
+        VideoFileDetailsFileType::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoFileDetailsFileType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoFileDetailsFileType::Undefined => write!(f, "undefined"),
+            VideoFileDetailsFileType::Video => write!(f, "video"),
+            VideoFileDetailsFileType::Audio => write!(f, "audio"),
+            VideoFileDetailsFileType::Image => write!(f, "image"),
+            VideoFileDetailsFileType::Archive => write!(f, "archive"),
+            VideoFileDetailsFileType::Document => write!(f, "document"),
+            VideoFileDetailsFileType::Project => write!(f, "project"),
+            VideoFileDetailsFileType::Other => write!(f, "other"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSnippetLiveBroadcastContent {
+    Undefined,
+    ///
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+    /// The live broadcast is active.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast has been completed.
+    #[serde(rename = "completed")]
+    Completed,
+}
+
+impl std::default::Default for VideoSnippetLiveBroadcastContent {
+    fn default() -> VideoSnippetLiveBroadcastContent {
+        VideoSnippetLiveBroadcastContent::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoSnippetLiveBroadcastContent {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
+            VideoSnippetLiveBroadcastContent::None => write!(f, "none"),
+            VideoSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
+            VideoSnippetLiveBroadcastContent::Live => write!(f, "live"),
+            VideoSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivityContentDetailsRecommendationReason {
+    Undefined,
+    ///
+    #[serde(rename = "reasonUnspecified")]
+    ReasonUnspecified,
+    ///
+    #[serde(rename = "videoFavorited")]
+    VideoFavorited,
+    ///
+    #[serde(rename = "videoLiked")]
+    VideoLiked,
+    ///
+    #[serde(rename = "videoWatched")]
+    VideoWatched,
+}
+
+impl std::default::Default for ActivityContentDetailsRecommendationReason {
+    fn default() -> ActivityContentDetailsRecommendationReason {
+        ActivityContentDetailsRecommendationReason::Undefined
+    }
+}
+
+impl std::fmt::Display for ActivityContentDetailsRecommendationReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ActivityContentDetailsRecommendationReason::Undefined => write!(f, "undefined"),
+            ActivityContentDetailsRecommendationReason::ReasonUnspecified => {
+                write!(f, "reasonUnspecified")
+            }
+            ActivityContentDetailsRecommendationReason::VideoFavorited => {
+                write!(f, "videoFavorited")
+            }
+            ActivityContentDetailsRecommendationReason::VideoLiked => write!(f, "videoLiked"),
+            ActivityContentDetailsRecommendationReason::VideoWatched => write!(f, "videoWatched"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsCaption {
+    Undefined,
+    ///
+    #[serde(rename = "true")]
+    True,
+    ///
+    #[serde(rename = "false")]
+    False,
+}
+
+impl std::default::Default for VideoContentDetailsCaption {
+    fn default() -> VideoContentDetailsCaption {
+        VideoContentDetailsCaption::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoContentDetailsCaption {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoContentDetailsCaption::Undefined => write!(f, "undefined"),
+            VideoContentDetailsCaption::True => write!(f, "true"),
+            VideoContentDetailsCaption::False => write!(f, "false"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsProjection {
+    Undefined,
+    ///
+    #[serde(rename = "rectangular")]
+    Rectangular,
+    ///
+    #[serde(rename = "360")]
+    _360,
+}
+
+impl std::default::Default for VideoContentDetailsProjection {
+    fn default() -> VideoContentDetailsProjection {
+        VideoContentDetailsProjection::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoContentDetailsProjection {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoContentDetailsProjection::Undefined => write!(f, "undefined"),
+            VideoContentDetailsProjection::Rectangular => write!(f, "rectangular"),
+            VideoContentDetailsProjection::_360 => write!(f, "360"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsDefinition {
+    Undefined,
+    /// sd
+    #[serde(rename = "sd")]
+    Sd,
+    /// hd
+    #[serde(rename = "hd")]
+    Hd,
+}
+
+impl std::default::Default for VideoContentDetailsDefinition {
+    fn default() -> VideoContentDetailsDefinition {
+        VideoContentDetailsDefinition::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoContentDetailsDefinition {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoContentDetailsDefinition::Undefined => write!(f, "undefined"),
+            VideoContentDetailsDefinition::Sd => write!(f, "sd"),
+            VideoContentDetailsDefinition::Hd => write!(f, "hd"),
+        };
+        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 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 VideoStatusRejectionReason {
+    Undefined,
+    /// Copyright infringement.
+    #[serde(rename = "copyright")]
+    Copyright,
+    /// Inappropriate video content.
+    #[serde(rename = "inappropriate")]
+    Inappropriate,
+    /// Duplicate upload in the same channel.
+    #[serde(rename = "duplicate")]
+    Duplicate,
+    /// Terms of use violation.
+    #[serde(rename = "termsOfUse")]
+    TermsOfUse,
+    /// Uploader account was suspended.
+    #[serde(rename = "uploaderAccountSuspended")]
+    UploaderAccountSuspended,
+    /// Video duration was too long.
+    #[serde(rename = "length")]
+    Length,
+    /// Blocked by content owner.
+    #[serde(rename = "claim")]
+    Claim,
+    /// Uploader closed his/her account.
+    #[serde(rename = "uploaderAccountClosed")]
+    UploaderAccountClosed,
+    /// Trademark infringement.
+    #[serde(rename = "trademark")]
+    Trademark,
+    /// An unspecified legal reason.
+    #[serde(rename = "legal")]
+    Legal,
+}
+
+impl std::default::Default for VideoStatusRejectionReason {
+    fn default() -> VideoStatusRejectionReason {
+        VideoStatusRejectionReason::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusRejectionReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusRejectionReason::Undefined => write!(f, "undefined"),
+            VideoStatusRejectionReason::Copyright => write!(f, "copyright"),
+            VideoStatusRejectionReason::Inappropriate => write!(f, "inappropriate"),
+            VideoStatusRejectionReason::Duplicate => write!(f, "duplicate"),
+            VideoStatusRejectionReason::TermsOfUse => write!(f, "termsOfUse"),
+            VideoStatusRejectionReason::UploaderAccountSuspended => {
+                write!(f, "uploaderAccountSuspended")
+            }
+            VideoStatusRejectionReason::Length => write!(f, "length"),
+            VideoStatusRejectionReason::Claim => write!(f, "claim"),
+            VideoStatusRejectionReason::UploaderAccountClosed => write!(f, "uploaderAccountClosed"),
+            VideoStatusRejectionReason::Trademark => write!(f, "trademark"),
+            VideoStatusRejectionReason::Legal => write!(f, "legal"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusFailureReason {
+    Undefined,
+    /// Unable to convert video content.
+    #[serde(rename = "conversion")]
+    Conversion,
+    /// Invalid file format.
+    #[serde(rename = "invalidFile")]
+    InvalidFile,
+    /// Empty file.
+    #[serde(rename = "emptyFile")]
+    EmptyFile,
+    /// File was too small.
+    #[serde(rename = "tooSmall")]
+    TooSmall,
+    /// Unsupported codec.
+    #[serde(rename = "codec")]
+    Codec,
+    /// Upload wasn't finished.
+    #[serde(rename = "uploadAborted")]
+    UploadAborted,
+}
+
+impl std::default::Default for VideoStatusFailureReason {
+    fn default() -> VideoStatusFailureReason {
+        VideoStatusFailureReason::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusFailureReason {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusFailureReason::Undefined => write!(f, "undefined"),
+            VideoStatusFailureReason::Conversion => write!(f, "conversion"),
+            VideoStatusFailureReason::InvalidFile => write!(f, "invalidFile"),
+            VideoStatusFailureReason::EmptyFile => write!(f, "emptyFile"),
+            VideoStatusFailureReason::TooSmall => write!(f, "tooSmall"),
+            VideoStatusFailureReason::Codec => write!(f, "codec"),
+            VideoStatusFailureReason::UploadAborted => write!(f, "uploadAborted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusLicense {
+    Undefined,
+    ///
+    #[serde(rename = "youtube")]
+    Youtube,
+    ///
+    #[serde(rename = "creativeCommon")]
+    CreativeCommon,
+}
+
+impl std::default::Default for VideoStatusLicense {
+    fn default() -> VideoStatusLicense {
+        VideoStatusLicense::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusLicense {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusLicense::Undefined => write!(f, "undefined"),
+            VideoStatusLicense::Youtube => write!(f, "youtube"),
+            VideoStatusLicense::CreativeCommon => write!(f, "creativeCommon"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusPrivacyStatus {
+    Undefined,
+    ///
+    #[serde(rename = "public")]
+    Public,
+    ///
+    #[serde(rename = "unlisted")]
+    Unlisted,
+    ///
+    #[serde(rename = "private")]
+    Private,
+}
+
+impl std::default::Default for VideoStatusPrivacyStatus {
+    fn default() -> VideoStatusPrivacyStatus {
+        VideoStatusPrivacyStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for VideoStatusPrivacyStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideoStatusPrivacyStatus::Undefined => write!(f, "undefined"),
+            VideoStatusPrivacyStatus::Public => write!(f, "public"),
+            VideoStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+            VideoStatusPrivacyStatus::Private => write!(f, "private"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoTimingType {
+    Undefined,
+    ///
+    #[serde(rename = "offsetFromStart")]
+    OffsetFromStart,
+    ///
+    #[serde(rename = "offsetFromEnd")]
+    OffsetFromEnd,
+}
+
+impl std::default::Default for InvideoTimingType {
+    fn default() -> InvideoTimingType {
+        InvideoTimingType::Undefined
+    }
+}
+
+impl std::fmt::Display for InvideoTimingType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            InvideoTimingType::Undefined => write!(f, "undefined"),
+            InvideoTimingType::OffsetFromStart => write!(f, "offsetFromStart"),
+            InvideoTimingType::OffsetFromEnd => write!(f, "offsetFromEnd"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelSectionSnippetStyle {
+    Undefined,
+    ///
+    #[serde(rename = "channelsectionStyleUnspecified")]
+    ChannelsectionStyleUnspecified,
+    ///
+    #[serde(rename = "horizontalRow")]
+    HorizontalRow,
+    ///
+    #[serde(rename = "verticalList")]
+    VerticalList,
+}
+
+impl std::default::Default for ChannelSectionSnippetStyle {
+    fn default() -> ChannelSectionSnippetStyle {
+        ChannelSectionSnippetStyle::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelSectionSnippetStyle {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelSectionSnippetStyle::Undefined => write!(f, "undefined"),
+            ChannelSectionSnippetStyle::ChannelsectionStyleUnspecified => {
+                write!(f, "channelsectionStyleUnspecified")
+            }
+            ChannelSectionSnippetStyle::HorizontalRow => write!(f, "horizontalRow"),
+            ChannelSectionSnippetStyle::VerticalList => write!(f, "verticalList"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelSectionSnippetType {
+    Undefined,
+    ///
+    #[serde(rename = "channelsectionTypeUnspecified")]
+    ChannelsectionTypeUnspecified,
+    ///
+    #[serde(rename = "singlePlaylist")]
+    SinglePlaylist,
+    ///
+    #[serde(rename = "multiplePlaylists")]
+    MultiplePlaylists,
+    ///
+    #[serde(rename = "popularUploads")]
+    PopularUploads,
+    ///
+    #[serde(rename = "recentUploads")]
+    RecentUploads,
+    ///
+    #[serde(rename = "likes")]
+    Likes,
+    ///
+    #[serde(rename = "allPlaylists")]
+    AllPlaylists,
+    ///
+    #[serde(rename = "likedPlaylists")]
+    LikedPlaylists,
+    ///
+    #[serde(rename = "recentPosts")]
+    RecentPosts,
+    ///
+    #[serde(rename = "recentActivity")]
+    RecentActivity,
+    ///
+    #[serde(rename = "liveEvents")]
+    LiveEvents,
+    ///
+    #[serde(rename = "upcomingEvents")]
+    UpcomingEvents,
+    ///
+    #[serde(rename = "completedEvents")]
+    CompletedEvents,
+    ///
+    #[serde(rename = "multipleChannels")]
+    MultipleChannels,
+    ///
+    #[serde(rename = "postedVideos")]
+    PostedVideos,
+    ///
+    #[serde(rename = "postedPlaylists")]
+    PostedPlaylists,
+    ///
+    #[serde(rename = "subscriptions")]
+    Subscriptions,
+}
+
+impl std::default::Default for ChannelSectionSnippetType {
+    fn default() -> ChannelSectionSnippetType {
+        ChannelSectionSnippetType::Undefined
+    }
+}
+
+impl std::fmt::Display for ChannelSectionSnippetType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ChannelSectionSnippetType::Undefined => write!(f, "undefined"),
+            ChannelSectionSnippetType::ChannelsectionTypeUnspecified => {
+                write!(f, "channelsectionTypeUnspecified")
+            }
+            ChannelSectionSnippetType::SinglePlaylist => write!(f, "singlePlaylist"),
+            ChannelSectionSnippetType::MultiplePlaylists => write!(f, "multiplePlaylists"),
+            ChannelSectionSnippetType::PopularUploads => write!(f, "popularUploads"),
+            ChannelSectionSnippetType::RecentUploads => write!(f, "recentUploads"),
+            ChannelSectionSnippetType::Likes => write!(f, "likes"),
+            ChannelSectionSnippetType::AllPlaylists => write!(f, "allPlaylists"),
+            ChannelSectionSnippetType::LikedPlaylists => write!(f, "likedPlaylists"),
+            ChannelSectionSnippetType::RecentPosts => write!(f, "recentPosts"),
+            ChannelSectionSnippetType::RecentActivity => write!(f, "recentActivity"),
+            ChannelSectionSnippetType::LiveEvents => write!(f, "liveEvents"),
+            ChannelSectionSnippetType::UpcomingEvents => write!(f, "upcomingEvents"),
+            ChannelSectionSnippetType::CompletedEvents => write!(f, "completedEvents"),
+            ChannelSectionSnippetType::MultipleChannels => write!(f, "multipleChannels"),
+            ChannelSectionSnippetType::PostedVideos => write!(f, "postedVideos"),
+            ChannelSectionSnippetType::PostedPlaylists => write!(f, "postedPlaylists"),
+            ChannelSectionSnippetType::Subscriptions => write!(f, "subscriptions"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveChatUserBannedMessageDetailsBanType {
+    Undefined,
+    ///
+    #[serde(rename = "permanent")]
+    Permanent,
+    ///
+    #[serde(rename = "temporary")]
+    Temporary,
+}
+
+impl std::default::Default for LiveChatUserBannedMessageDetailsBanType {
+    fn default() -> LiveChatUserBannedMessageDetailsBanType {
+        LiveChatUserBannedMessageDetailsBanType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveChatUserBannedMessageDetailsBanType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveChatUserBannedMessageDetailsBanType::Undefined => write!(f, "undefined"),
+            LiveChatUserBannedMessageDetailsBanType::Permanent => write!(f, "permanent"),
+            LiveChatUserBannedMessageDetailsBanType::Temporary => write!(f, "temporary"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsProjection {
+    Undefined,
+    ///
+    #[serde(rename = "projectionUnspecified")]
+    ProjectionUnspecified,
+    ///
+    #[serde(rename = "rectangular")]
+    Rectangular,
+    ///
+    #[serde(rename = "360")]
+    _360,
+    ///
+    #[serde(rename = "mesh")]
+    Mesh,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsProjection {
+    fn default() -> LiveBroadcastContentDetailsProjection {
+        LiveBroadcastContentDetailsProjection::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsProjection {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsProjection::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsProjection::ProjectionUnspecified => {
+                write!(f, "projectionUnspecified")
+            }
+            LiveBroadcastContentDetailsProjection::Rectangular => write!(f, "rectangular"),
+            LiveBroadcastContentDetailsProjection::_360 => write!(f, "360"),
+            LiveBroadcastContentDetailsProjection::Mesh => write!(f, "mesh"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsClosedCaptionsType {
+    Undefined,
+    ///
+    #[serde(rename = "closedCaptionsTypeUnspecified")]
+    ClosedCaptionsTypeUnspecified,
+    ///
+    #[serde(rename = "closedCaptionsDisabled")]
+    ClosedCaptionsDisabled,
+    ///
+    #[serde(rename = "closedCaptionsHttpPost")]
+    ClosedCaptionsHttpPost,
+    ///
+    #[serde(rename = "closedCaptionsEmbedded")]
+    ClosedCaptionsEmbedded,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsClosedCaptionsType {
+    fn default() -> LiveBroadcastContentDetailsClosedCaptionsType {
+        LiveBroadcastContentDetailsClosedCaptionsType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsClosedCaptionsType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsClosedCaptionsType::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsTypeUnspecified => {
+                write!(f, "closedCaptionsTypeUnspecified")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsDisabled => {
+                write!(f, "closedCaptionsDisabled")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsHttpPost => {
+                write!(f, "closedCaptionsHttpPost")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsEmbedded => {
+                write!(f, "closedCaptionsEmbedded")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsLatencyPreference {
+    Undefined,
+    ///
+    #[serde(rename = "latencyPreferenceUnspecified")]
+    LatencyPreferenceUnspecified,
+    /// Best for: highest quality viewer playbacks and higher resolutions.
+    #[serde(rename = "normal")]
+    Normal,
+    /// Best for: near real-time interaction, with minimal playback buffering.
+    #[serde(rename = "low")]
+    Low,
+    /// Best for: real-time interaction Does not support: Closed captions, 1440p, and 4k resolutions
+    #[serde(rename = "ultraLow")]
+    UltraLow,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsLatencyPreference {
+    fn default() -> LiveBroadcastContentDetailsLatencyPreference {
+        LiveBroadcastContentDetailsLatencyPreference::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsLatencyPreference {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsLatencyPreference::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsLatencyPreference::LatencyPreferenceUnspecified => {
+                write!(f, "latencyPreferenceUnspecified")
+            }
+            LiveBroadcastContentDetailsLatencyPreference::Normal => write!(f, "normal"),
+            LiveBroadcastContentDetailsLatencyPreference::Low => write!(f, "low"),
+            LiveBroadcastContentDetailsLatencyPreference::UltraLow => write!(f, "ultraLow"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMccaaRating {
+    Undefined,
+    ///
+    #[serde(rename = "mccaaUnspecified")]
+    MccaaUnspecified,
+    /// U
+    #[serde(rename = "mccaaU")]
+    MccaaU,
+    /// PG
+    #[serde(rename = "mccaaPg")]
+    MccaaPg,
+    /// 12A
+    #[serde(rename = "mccaa12a")]
+    Mccaa12a,
+    /// 12
+    #[serde(rename = "mccaa12")]
+    Mccaa12,
+    /// 14 - this rating was removed from the new classification structure introduced in 2013.
+    #[serde(rename = "mccaa14")]
+    Mccaa14,
+    /// 15
+    #[serde(rename = "mccaa15")]
+    Mccaa15,
+    /// 16 - this rating was removed from the new classification structure introduced in 2013.
+    #[serde(rename = "mccaa16")]
+    Mccaa16,
+    /// 18
+    #[serde(rename = "mccaa18")]
+    Mccaa18,
+    ///
+    #[serde(rename = "mccaaUnrated")]
+    MccaaUnrated,
+}
+
+impl std::default::Default for ContentRatingMccaaRating {
+    fn default() -> ContentRatingMccaaRating {
+        ContentRatingMccaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMccaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMccaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMccaaRating::MccaaUnspecified => write!(f, "mccaaUnspecified"),
+            ContentRatingMccaaRating::MccaaU => write!(f, "mccaaU"),
+            ContentRatingMccaaRating::MccaaPg => write!(f, "mccaaPg"),
+            ContentRatingMccaaRating::Mccaa12a => write!(f, "mccaa12a"),
+            ContentRatingMccaaRating::Mccaa12 => write!(f, "mccaa12"),
+            ContentRatingMccaaRating::Mccaa14 => write!(f, "mccaa14"),
+            ContentRatingMccaaRating::Mccaa15 => write!(f, "mccaa15"),
+            ContentRatingMccaaRating::Mccaa16 => write!(f, "mccaa16"),
+            ContentRatingMccaaRating::Mccaa18 => write!(f, "mccaa18"),
+            ContentRatingMccaaRating::MccaaUnrated => write!(f, "mccaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingChvrsRating {
+    Undefined,
+    ///
+    #[serde(rename = "chvrsUnspecified")]
+    ChvrsUnspecified,
+    /// G
+    #[serde(rename = "chvrsG")]
+    ChvrsG,
+    /// PG
+    #[serde(rename = "chvrsPg")]
+    ChvrsPg,
+    /// 14A
+    #[serde(rename = "chvrs14a")]
+    Chvrs14a,
+    /// 18A
+    #[serde(rename = "chvrs18a")]
+    Chvrs18a,
+    /// R
+    #[serde(rename = "chvrsR")]
+    ChvrsR,
+    /// E
+    #[serde(rename = "chvrsE")]
+    ChvrsE,
+    ///
+    #[serde(rename = "chvrsUnrated")]
+    ChvrsUnrated,
+}
+
+impl std::default::Default for ContentRatingChvrsRating {
+    fn default() -> ContentRatingChvrsRating {
+        ContentRatingChvrsRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingChvrsRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingChvrsRating::Undefined => write!(f, "undefined"),
+            ContentRatingChvrsRating::ChvrsUnspecified => write!(f, "chvrsUnspecified"),
+            ContentRatingChvrsRating::ChvrsG => write!(f, "chvrsG"),
+            ContentRatingChvrsRating::ChvrsPg => write!(f, "chvrsPg"),
+            ContentRatingChvrsRating::Chvrs14a => write!(f, "chvrs14a"),
+            ContentRatingChvrsRating::Chvrs18a => write!(f, "chvrs18a"),
+            ContentRatingChvrsRating::ChvrsR => write!(f, "chvrsR"),
+            ContentRatingChvrsRating::ChvrsE => write!(f, "chvrsE"),
+            ContentRatingChvrsRating::ChvrsUnrated => write!(f, "chvrsUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMccypRating {
+    Undefined,
+    ///
+    #[serde(rename = "mccypUnspecified")]
+    MccypUnspecified,
+    /// A
+    #[serde(rename = "mccypA")]
+    MccypA,
+    /// 7
+    #[serde(rename = "mccyp7")]
+    Mccyp7,
+    /// 11
+    #[serde(rename = "mccyp11")]
+    Mccyp11,
+    /// 15
+    #[serde(rename = "mccyp15")]
+    Mccyp15,
+    ///
+    #[serde(rename = "mccypUnrated")]
+    MccypUnrated,
+}
+
+impl std::default::Default for ContentRatingMccypRating {
+    fn default() -> ContentRatingMccypRating {
+        ContentRatingMccypRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMccypRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMccypRating::Undefined => write!(f, "undefined"),
+            ContentRatingMccypRating::MccypUnspecified => write!(f, "mccypUnspecified"),
+            ContentRatingMccypRating::MccypA => write!(f, "mccypA"),
+            ContentRatingMccypRating::Mccyp7 => write!(f, "mccyp7"),
+            ContentRatingMccypRating::Mccyp11 => write!(f, "mccyp11"),
+            ContentRatingMccypRating::Mccyp15 => write!(f, "mccyp15"),
+            ContentRatingMccypRating::MccypUnrated => write!(f, "mccypUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingGrfilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "grfilmUnspecified")]
+    GrfilmUnspecified,
+    /// K
+    #[serde(rename = "grfilmK")]
+    GrfilmK,
+    /// E
+    #[serde(rename = "grfilmE")]
+    GrfilmE,
+    /// K-12
+    #[serde(rename = "grfilmK12")]
+    GrfilmK12,
+    /// K-13
+    #[serde(rename = "grfilmK13")]
+    GrfilmK13,
+    /// K-15
+    #[serde(rename = "grfilmK15")]
+    GrfilmK15,
+    /// K-17
+    #[serde(rename = "grfilmK17")]
+    GrfilmK17,
+    /// K-18
+    #[serde(rename = "grfilmK18")]
+    GrfilmK18,
+    ///
+    #[serde(rename = "grfilmUnrated")]
+    GrfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingGrfilmRating {
+    fn default() -> ContentRatingGrfilmRating {
+        ContentRatingGrfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingGrfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingGrfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingGrfilmRating::GrfilmUnspecified => write!(f, "grfilmUnspecified"),
+            ContentRatingGrfilmRating::GrfilmK => write!(f, "grfilmK"),
+            ContentRatingGrfilmRating::GrfilmE => write!(f, "grfilmE"),
+            ContentRatingGrfilmRating::GrfilmK12 => write!(f, "grfilmK12"),
+            ContentRatingGrfilmRating::GrfilmK13 => write!(f, "grfilmK13"),
+            ContentRatingGrfilmRating::GrfilmK15 => write!(f, "grfilmK15"),
+            ContentRatingGrfilmRating::GrfilmK17 => write!(f, "grfilmK17"),
+            ContentRatingGrfilmRating::GrfilmK18 => write!(f, "grfilmK18"),
+            ContentRatingGrfilmRating::GrfilmUnrated => write!(f, "grfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMekuRating {
+    Undefined,
+    ///
+    #[serde(rename = "mekuUnspecified")]
+    MekuUnspecified,
+    /// S
+    #[serde(rename = "mekuS")]
+    MekuS,
+    /// 7
+    #[serde(rename = "meku7")]
+    Meku7,
+    /// 12
+    #[serde(rename = "meku12")]
+    Meku12,
+    /// 16
+    #[serde(rename = "meku16")]
+    Meku16,
+    /// 18
+    #[serde(rename = "meku18")]
+    Meku18,
+    ///
+    #[serde(rename = "mekuUnrated")]
+    MekuUnrated,
+}
+
+impl std::default::Default for ContentRatingMekuRating {
+    fn default() -> ContentRatingMekuRating {
+        ContentRatingMekuRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMekuRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMekuRating::Undefined => write!(f, "undefined"),
+            ContentRatingMekuRating::MekuUnspecified => write!(f, "mekuUnspecified"),
+            ContentRatingMekuRating::MekuS => write!(f, "mekuS"),
+            ContentRatingMekuRating::Meku7 => write!(f, "meku7"),
+            ContentRatingMekuRating::Meku12 => write!(f, "meku12"),
+            ContentRatingMekuRating::Meku16 => write!(f, "meku16"),
+            ContentRatingMekuRating::Meku18 => write!(f, "meku18"),
+            ContentRatingMekuRating::MekuUnrated => write!(f, "mekuUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNbcRating {
+    Undefined,
+    ///
+    #[serde(rename = "nbcUnspecified")]
+    NbcUnspecified,
+    /// G
+    #[serde(rename = "nbcG")]
+    NbcG,
+    /// PG
+    #[serde(rename = "nbcPg")]
+    NbcPg,
+    /// 12+
+    #[serde(rename = "nbc12plus")]
+    Nbc12plus,
+    /// 15+
+    #[serde(rename = "nbc15plus")]
+    Nbc15plus,
+    /// 18+
+    #[serde(rename = "nbc18plus")]
+    Nbc18plus,
+    /// 18+R
+    #[serde(rename = "nbc18plusr")]
+    Nbc18plusr,
+    /// PU
+    #[serde(rename = "nbcPu")]
+    NbcPu,
+    ///
+    #[serde(rename = "nbcUnrated")]
+    NbcUnrated,
+}
+
+impl std::default::Default for ContentRatingNbcRating {
+    fn default() -> ContentRatingNbcRating {
+        ContentRatingNbcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNbcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNbcRating::Undefined => write!(f, "undefined"),
+            ContentRatingNbcRating::NbcUnspecified => write!(f, "nbcUnspecified"),
+            ContentRatingNbcRating::NbcG => write!(f, "nbcG"),
+            ContentRatingNbcRating::NbcPg => write!(f, "nbcPg"),
+            ContentRatingNbcRating::Nbc12plus => write!(f, "nbc12plus"),
+            ContentRatingNbcRating::Nbc15plus => write!(f, "nbc15plus"),
+            ContentRatingNbcRating::Nbc18plus => write!(f, "nbc18plus"),
+            ContentRatingNbcRating::Nbc18plusr => write!(f, "nbc18plusr"),
+            ContentRatingNbcRating::NbcPu => write!(f, "nbcPu"),
+            ContentRatingNbcRating::NbcUnrated => write!(f, "nbcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFpbRating {
+    Undefined,
+    ///
+    #[serde(rename = "fpbUnspecified")]
+    FpbUnspecified,
+    /// A
+    #[serde(rename = "fpbA")]
+    FpbA,
+    /// PG
+    #[serde(rename = "fpbPg")]
+    FpbPg,
+    /// 7-9PG
+    #[serde(rename = "fpb79Pg")]
+    Fpb79Pg,
+    /// 10-12PG
+    #[serde(rename = "fpb1012Pg")]
+    Fpb1012Pg,
+    /// 13
+    #[serde(rename = "fpb13")]
+    Fpb13,
+    /// 16
+    #[serde(rename = "fpb16")]
+    Fpb16,
+    /// 18
+    #[serde(rename = "fpb18")]
+    Fpb18,
+    /// X18
+    #[serde(rename = "fpbX18")]
+    FpbX18,
+    /// XX
+    #[serde(rename = "fpbXx")]
+    FpbXx,
+    ///
+    #[serde(rename = "fpbUnrated")]
+    FpbUnrated,
+    /// 10
+    #[serde(rename = "fpb10")]
+    Fpb10,
+}
+
+impl std::default::Default for ContentRatingFpbRating {
+    fn default() -> ContentRatingFpbRating {
+        ContentRatingFpbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFpbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFpbRating::Undefined => write!(f, "undefined"),
+            ContentRatingFpbRating::FpbUnspecified => write!(f, "fpbUnspecified"),
+            ContentRatingFpbRating::FpbA => write!(f, "fpbA"),
+            ContentRatingFpbRating::FpbPg => write!(f, "fpbPg"),
+            ContentRatingFpbRating::Fpb79Pg => write!(f, "fpb79Pg"),
+            ContentRatingFpbRating::Fpb1012Pg => write!(f, "fpb1012Pg"),
+            ContentRatingFpbRating::Fpb13 => write!(f, "fpb13"),
+            ContentRatingFpbRating::Fpb16 => write!(f, "fpb16"),
+            ContentRatingFpbRating::Fpb18 => write!(f, "fpb18"),
+            ContentRatingFpbRating::FpbX18 => write!(f, "fpbX18"),
+            ContentRatingFpbRating::FpbXx => write!(f, "fpbXx"),
+            ContentRatingFpbRating::FpbUnrated => write!(f, "fpbUnrated"),
+            ContentRatingFpbRating::Fpb10 => write!(f, "fpb10"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingChfilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "chfilmUnspecified")]
+    ChfilmUnspecified,
+    /// 0
+    #[serde(rename = "chfilm0")]
+    Chfilm0,
+    /// 6
+    #[serde(rename = "chfilm6")]
+    Chfilm6,
+    /// 12
+    #[serde(rename = "chfilm12")]
+    Chfilm12,
+    /// 16
+    #[serde(rename = "chfilm16")]
+    Chfilm16,
+    /// 18
+    #[serde(rename = "chfilm18")]
+    Chfilm18,
+    ///
+    #[serde(rename = "chfilmUnrated")]
+    ChfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingChfilmRating {
+    fn default() -> ContentRatingChfilmRating {
+        ContentRatingChfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingChfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingChfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingChfilmRating::ChfilmUnspecified => write!(f, "chfilmUnspecified"),
+            ContentRatingChfilmRating::Chfilm0 => write!(f, "chfilm0"),
+            ContentRatingChfilmRating::Chfilm6 => write!(f, "chfilm6"),
+            ContentRatingChfilmRating::Chfilm12 => write!(f, "chfilm12"),
+            ContentRatingChfilmRating::Chfilm16 => write!(f, "chfilm16"),
+            ContentRatingChfilmRating::Chfilm18 => write!(f, "chfilm18"),
+            ContentRatingChfilmRating::ChfilmUnrated => write!(f, "chfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSmsaRating {
+    Undefined,
+    ///
+    #[serde(rename = "smsaUnspecified")]
+    SmsaUnspecified,
+    /// All ages
+    #[serde(rename = "smsaA")]
+    SmsaA,
+    /// 7
+    #[serde(rename = "smsa7")]
+    Smsa7,
+    /// 11
+    #[serde(rename = "smsa11")]
+    Smsa11,
+    /// 15
+    #[serde(rename = "smsa15")]
+    Smsa15,
+    ///
+    #[serde(rename = "smsaUnrated")]
+    SmsaUnrated,
+}
+
+impl std::default::Default for ContentRatingSmsaRating {
+    fn default() -> ContentRatingSmsaRating {
+        ContentRatingSmsaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingSmsaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingSmsaRating::Undefined => write!(f, "undefined"),
+            ContentRatingSmsaRating::SmsaUnspecified => write!(f, "smsaUnspecified"),
+            ContentRatingSmsaRating::SmsaA => write!(f, "smsaA"),
+            ContentRatingSmsaRating::Smsa7 => write!(f, "smsa7"),
+            ContentRatingSmsaRating::Smsa11 => write!(f, "smsa11"),
+            ContentRatingSmsaRating::Smsa15 => write!(f, "smsa15"),
+            ContentRatingSmsaRating::SmsaUnrated => write!(f, "smsaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFpbRatingReasons {
+    Undefined,
+    ///
+    #[serde(rename = "fpbRatingReasonUnspecified")]
+    FpbRatingReasonUnspecified,
+    /// South Africa rating content descriptors.
+    #[serde(rename = "fpbBlasphemy")]
+    FpbBlasphemy,
+    ///
+    #[serde(rename = "fpbLanguage")]
+    FpbLanguage,
+    ///
+    #[serde(rename = "fpbNudity")]
+    FpbNudity,
+    ///
+    #[serde(rename = "fpbPrejudice")]
+    FpbPrejudice,
+    ///
+    #[serde(rename = "fpbSex")]
+    FpbSex,
+    ///
+    #[serde(rename = "fpbViolence")]
+    FpbViolence,
+    ///
+    #[serde(rename = "fpbDrugs")]
+    FpbDrugs,
+    ///
+    #[serde(rename = "fpbSexualViolence")]
+    FpbSexualViolence,
+    ///
+    #[serde(rename = "fpbHorror")]
+    FpbHorror,
+    ///
+    #[serde(rename = "fpbCriminalTechniques")]
+    FpbCriminalTechniques,
+    ///
+    #[serde(rename = "fpbImitativeActsTechniques")]
+    FpbImitativeActsTechniques,
+}
+
+impl std::default::Default for ContentRatingFpbRatingReasons {
+    fn default() -> ContentRatingFpbRatingReasons {
+        ContentRatingFpbRatingReasons::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFpbRatingReasons {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFpbRatingReasons::Undefined => write!(f, "undefined"),
+            ContentRatingFpbRatingReasons::FpbRatingReasonUnspecified => {
+                write!(f, "fpbRatingReasonUnspecified")
+            }
+            ContentRatingFpbRatingReasons::FpbBlasphemy => write!(f, "fpbBlasphemy"),
+            ContentRatingFpbRatingReasons::FpbLanguage => write!(f, "fpbLanguage"),
+            ContentRatingFpbRatingReasons::FpbNudity => write!(f, "fpbNudity"),
+            ContentRatingFpbRatingReasons::FpbPrejudice => write!(f, "fpbPrejudice"),
+            ContentRatingFpbRatingReasons::FpbSex => write!(f, "fpbSex"),
+            ContentRatingFpbRatingReasons::FpbViolence => write!(f, "fpbViolence"),
+            ContentRatingFpbRatingReasons::FpbDrugs => write!(f, "fpbDrugs"),
+            ContentRatingFpbRatingReasons::FpbSexualViolence => write!(f, "fpbSexualViolence"),
+            ContentRatingFpbRatingReasons::FpbHorror => write!(f, "fpbHorror"),
+            ContentRatingFpbRatingReasons::FpbCriminalTechniques => {
+                write!(f, "fpbCriminalTechniques")
+            }
+            ContentRatingFpbRatingReasons::FpbImitativeActsTechniques => {
+                write!(f, "fpbImitativeActsTechniques")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKmrbRating {
+    Undefined,
+    ///
+    #[serde(rename = "kmrbUnspecified")]
+    KmrbUnspecified,
+    /// 전체관람가
+    #[serde(rename = "kmrbAll")]
+    KmrbAll,
+    /// 12세 이상 관람가
+    #[serde(rename = "kmrb12plus")]
+    Kmrb12plus,
+    /// 15세 이상 관람가
+    #[serde(rename = "kmrb15plus")]
+    Kmrb15plus,
+    ///
+    #[serde(rename = "kmrbTeenr")]
+    KmrbTeenr,
+    /// 청소년 관람불가
+    #[serde(rename = "kmrbR")]
+    KmrbR,
+    ///
+    #[serde(rename = "kmrbUnrated")]
+    KmrbUnrated,
+}
+
+impl std::default::Default for ContentRatingKmrbRating {
+    fn default() -> ContentRatingKmrbRating {
+        ContentRatingKmrbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingKmrbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingKmrbRating::Undefined => write!(f, "undefined"),
+            ContentRatingKmrbRating::KmrbUnspecified => write!(f, "kmrbUnspecified"),
+            ContentRatingKmrbRating::KmrbAll => write!(f, "kmrbAll"),
+            ContentRatingKmrbRating::Kmrb12plus => write!(f, "kmrb12plus"),
+            ContentRatingKmrbRating::Kmrb15plus => write!(f, "kmrb15plus"),
+            ContentRatingKmrbRating::KmrbTeenr => write!(f, "kmrbTeenr"),
+            ContentRatingKmrbRating::KmrbR => write!(f, "kmrbR"),
+            ContentRatingKmrbRating::KmrbUnrated => write!(f, "kmrbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIcaaRating {
+    Undefined,
+    ///
+    #[serde(rename = "icaaUnspecified")]
+    IcaaUnspecified,
+    /// APTA
+    #[serde(rename = "icaaApta")]
+    IcaaApta,
+    /// 7
+    #[serde(rename = "icaa7")]
+    Icaa7,
+    /// 12
+    #[serde(rename = "icaa12")]
+    Icaa12,
+    /// 13
+    #[serde(rename = "icaa13")]
+    Icaa13,
+    /// 16
+    #[serde(rename = "icaa16")]
+    Icaa16,
+    /// 18
+    #[serde(rename = "icaa18")]
+    Icaa18,
+    /// X
+    #[serde(rename = "icaaX")]
+    IcaaX,
+    ///
+    #[serde(rename = "icaaUnrated")]
+    IcaaUnrated,
+}
+
+impl std::default::Default for ContentRatingIcaaRating {
+    fn default() -> ContentRatingIcaaRating {
+        ContentRatingIcaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIcaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIcaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingIcaaRating::IcaaUnspecified => write!(f, "icaaUnspecified"),
+            ContentRatingIcaaRating::IcaaApta => write!(f, "icaaApta"),
+            ContentRatingIcaaRating::Icaa7 => write!(f, "icaa7"),
+            ContentRatingIcaaRating::Icaa12 => write!(f, "icaa12"),
+            ContentRatingIcaaRating::Icaa13 => write!(f, "icaa13"),
+            ContentRatingIcaaRating::Icaa16 => write!(f, "icaa16"),
+            ContentRatingIcaaRating::Icaa18 => write!(f, "icaa18"),
+            ContentRatingIcaaRating::IcaaX => write!(f, "icaaX"),
+            ContentRatingIcaaRating::IcaaUnrated => write!(f, "icaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNfrcRating {
+    Undefined,
+    ///
+    #[serde(rename = "nfrcUnspecified")]
+    NfrcUnspecified,
+    /// A
+    #[serde(rename = "nfrcA")]
+    NfrcA,
+    /// B
+    #[serde(rename = "nfrcB")]
+    NfrcB,
+    /// C
+    #[serde(rename = "nfrcC")]
+    NfrcC,
+    /// D
+    #[serde(rename = "nfrcD")]
+    NfrcD,
+    /// X
+    #[serde(rename = "nfrcX")]
+    NfrcX,
+    ///
+    #[serde(rename = "nfrcUnrated")]
+    NfrcUnrated,
+}
+
+impl std::default::Default for ContentRatingNfrcRating {
+    fn default() -> ContentRatingNfrcRating {
+        ContentRatingNfrcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNfrcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNfrcRating::Undefined => write!(f, "undefined"),
+            ContentRatingNfrcRating::NfrcUnspecified => write!(f, "nfrcUnspecified"),
+            ContentRatingNfrcRating::NfrcA => write!(f, "nfrcA"),
+            ContentRatingNfrcRating::NfrcB => write!(f, "nfrcB"),
+            ContentRatingNfrcRating::NfrcC => write!(f, "nfrcC"),
+            ContentRatingNfrcRating::NfrcD => write!(f, "nfrcD"),
+            ContentRatingNfrcRating::NfrcX => write!(f, "nfrcX"),
+            ContentRatingNfrcRating::NfrcUnrated => write!(f, "nfrcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMedietilsynetRating {
+    Undefined,
+    ///
+    #[serde(rename = "medietilsynetUnspecified")]
+    MedietilsynetUnspecified,
+    /// A
+    #[serde(rename = "medietilsynetA")]
+    MedietilsynetA,
+    /// 6
+    #[serde(rename = "medietilsynet6")]
+    Medietilsynet6,
+    /// 7
+    #[serde(rename = "medietilsynet7")]
+    Medietilsynet7,
+    /// 9
+    #[serde(rename = "medietilsynet9")]
+    Medietilsynet9,
+    /// 11
+    #[serde(rename = "medietilsynet11")]
+    Medietilsynet11,
+    /// 12
+    #[serde(rename = "medietilsynet12")]
+    Medietilsynet12,
+    /// 15
+    #[serde(rename = "medietilsynet15")]
+    Medietilsynet15,
+    /// 18
+    #[serde(rename = "medietilsynet18")]
+    Medietilsynet18,
+    ///
+    #[serde(rename = "medietilsynetUnrated")]
+    MedietilsynetUnrated,
+}
+
+impl std::default::Default for ContentRatingMedietilsynetRating {
+    fn default() -> ContentRatingMedietilsynetRating {
+        ContentRatingMedietilsynetRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMedietilsynetRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMedietilsynetRating::Undefined => write!(f, "undefined"),
+            ContentRatingMedietilsynetRating::MedietilsynetUnspecified => {
+                write!(f, "medietilsynetUnspecified")
+            }
+            ContentRatingMedietilsynetRating::MedietilsynetA => write!(f, "medietilsynetA"),
+            ContentRatingMedietilsynetRating::Medietilsynet6 => write!(f, "medietilsynet6"),
+            ContentRatingMedietilsynetRating::Medietilsynet7 => write!(f, "medietilsynet7"),
+            ContentRatingMedietilsynetRating::Medietilsynet9 => write!(f, "medietilsynet9"),
+            ContentRatingMedietilsynetRating::Medietilsynet11 => write!(f, "medietilsynet11"),
+            ContentRatingMedietilsynetRating::Medietilsynet12 => write!(f, "medietilsynet12"),
+            ContentRatingMedietilsynetRating::Medietilsynet15 => write!(f, "medietilsynet15"),
+            ContentRatingMedietilsynetRating::Medietilsynet18 => write!(f, "medietilsynet18"),
+            ContentRatingMedietilsynetRating::MedietilsynetUnrated => {
+                write!(f, "medietilsynetUnrated")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMibacRating {
+    Undefined,
+    ///
+    #[serde(rename = "mibacUnspecified")]
+    MibacUnspecified,
+    ///
+    #[serde(rename = "mibacT")]
+    MibacT,
+    ///
+    #[serde(rename = "mibacVap")]
+    MibacVap,
+    ///
+    #[serde(rename = "mibacVm12")]
+    MibacVm12,
+    ///
+    #[serde(rename = "mibacVm14")]
+    MibacVm14,
+    ///
+    #[serde(rename = "mibacVm18")]
+    MibacVm18,
+    ///
+    #[serde(rename = "mibacUnrated")]
+    MibacUnrated,
+}
+
+impl std::default::Default for ContentRatingMibacRating {
+    fn default() -> ContentRatingMibacRating {
+        ContentRatingMibacRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMibacRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMibacRating::Undefined => write!(f, "undefined"),
+            ContentRatingMibacRating::MibacUnspecified => write!(f, "mibacUnspecified"),
+            ContentRatingMibacRating::MibacT => write!(f, "mibacT"),
+            ContentRatingMibacRating::MibacVap => write!(f, "mibacVap"),
+            ContentRatingMibacRating::MibacVm12 => write!(f, "mibacVm12"),
+            ContentRatingMibacRating::MibacVm14 => write!(f, "mibacVm14"),
+            ContentRatingMibacRating::MibacVm18 => write!(f, "mibacVm18"),
+            ContentRatingMibacRating::MibacUnrated => write!(f, "mibacUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMtrcbRating {
+    Undefined,
+    ///
+    #[serde(rename = "mtrcbUnspecified")]
+    MtrcbUnspecified,
+    /// G
+    #[serde(rename = "mtrcbG")]
+    MtrcbG,
+    /// PG
+    #[serde(rename = "mtrcbPg")]
+    MtrcbPg,
+    /// R-13
+    #[serde(rename = "mtrcbR13")]
+    MtrcbR13,
+    /// R-16
+    #[serde(rename = "mtrcbR16")]
+    MtrcbR16,
+    /// R-18
+    #[serde(rename = "mtrcbR18")]
+    MtrcbR18,
+    /// X
+    #[serde(rename = "mtrcbX")]
+    MtrcbX,
+    ///
+    #[serde(rename = "mtrcbUnrated")]
+    MtrcbUnrated,
+}
+
+impl std::default::Default for ContentRatingMtrcbRating {
+    fn default() -> ContentRatingMtrcbRating {
+        ContentRatingMtrcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMtrcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMtrcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingMtrcbRating::MtrcbUnspecified => write!(f, "mtrcbUnspecified"),
+            ContentRatingMtrcbRating::MtrcbG => write!(f, "mtrcbG"),
+            ContentRatingMtrcbRating::MtrcbPg => write!(f, "mtrcbPg"),
+            ContentRatingMtrcbRating::MtrcbR13 => write!(f, "mtrcbR13"),
+            ContentRatingMtrcbRating::MtrcbR16 => write!(f, "mtrcbR16"),
+            ContentRatingMtrcbRating::MtrcbR18 => write!(f, "mtrcbR18"),
+            ContentRatingMtrcbRating::MtrcbX => write!(f, "mtrcbX"),
+            ContentRatingMtrcbRating::MtrcbUnrated => write!(f, "mtrcbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNbcplRating {
+    Undefined,
+    ///
+    #[serde(rename = "nbcplUnspecified")]
+    NbcplUnspecified,
+    ///
+    #[serde(rename = "nbcplI")]
+    NbcplI,
+    ///
+    #[serde(rename = "nbcplIi")]
+    NbcplIi,
+    ///
+    #[serde(rename = "nbcplIii")]
+    NbcplIii,
+    ///
+    #[serde(rename = "nbcplIv")]
+    NbcplIv,
+    ///
+    #[serde(rename = "nbcpl18plus")]
+    Nbcpl18plus,
+    ///
+    #[serde(rename = "nbcplUnrated")]
+    NbcplUnrated,
+}
+
+impl std::default::Default for ContentRatingNbcplRating {
+    fn default() -> ContentRatingNbcplRating {
+        ContentRatingNbcplRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNbcplRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNbcplRating::Undefined => write!(f, "undefined"),
+            ContentRatingNbcplRating::NbcplUnspecified => write!(f, "nbcplUnspecified"),
+            ContentRatingNbcplRating::NbcplI => write!(f, "nbcplI"),
+            ContentRatingNbcplRating::NbcplIi => write!(f, "nbcplIi"),
+            ContentRatingNbcplRating::NbcplIii => write!(f, "nbcplIii"),
+            ContentRatingNbcplRating::NbcplIv => write!(f, "nbcplIv"),
+            ContentRatingNbcplRating::Nbcpl18plus => write!(f, "nbcpl18plus"),
+            ContentRatingNbcplRating::NbcplUnrated => write!(f, "nbcplUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFcoRating {
+    Undefined,
+    ///
+    #[serde(rename = "fcoUnspecified")]
+    FcoUnspecified,
+    /// I
+    #[serde(rename = "fcoI")]
+    FcoI,
+    /// IIA
+    #[serde(rename = "fcoIia")]
+    FcoIia,
+    /// IIB
+    #[serde(rename = "fcoIib")]
+    FcoIib,
+    /// II
+    #[serde(rename = "fcoIi")]
+    FcoIi,
+    /// III
+    #[serde(rename = "fcoIii")]
+    FcoIii,
+    ///
+    #[serde(rename = "fcoUnrated")]
+    FcoUnrated,
+}
+
+impl std::default::Default for ContentRatingFcoRating {
+    fn default() -> ContentRatingFcoRating {
+        ContentRatingFcoRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFcoRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFcoRating::Undefined => write!(f, "undefined"),
+            ContentRatingFcoRating::FcoUnspecified => write!(f, "fcoUnspecified"),
+            ContentRatingFcoRating::FcoI => write!(f, "fcoI"),
+            ContentRatingFcoRating::FcoIia => write!(f, "fcoIia"),
+            ContentRatingFcoRating::FcoIib => write!(f, "fcoIib"),
+            ContentRatingFcoRating::FcoIi => write!(f, "fcoIi"),
+            ContentRatingFcoRating::FcoIii => write!(f, "fcoIii"),
+            ContentRatingFcoRating::FcoUnrated => write!(f, "fcoUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRtcRating {
+    Undefined,
+    ///
+    #[serde(rename = "rtcUnspecified")]
+    RtcUnspecified,
+    /// AA
+    #[serde(rename = "rtcAa")]
+    RtcAa,
+    /// A
+    #[serde(rename = "rtcA")]
+    RtcA,
+    /// B
+    #[serde(rename = "rtcB")]
+    RtcB,
+    /// B15
+    #[serde(rename = "rtcB15")]
+    RtcB15,
+    /// C
+    #[serde(rename = "rtcC")]
+    RtcC,
+    /// D
+    #[serde(rename = "rtcD")]
+    RtcD,
+    ///
+    #[serde(rename = "rtcUnrated")]
+    RtcUnrated,
+}
+
+impl std::default::Default for ContentRatingRtcRating {
+    fn default() -> ContentRatingRtcRating {
+        ContentRatingRtcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRtcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRtcRating::Undefined => write!(f, "undefined"),
+            ContentRatingRtcRating::RtcUnspecified => write!(f, "rtcUnspecified"),
+            ContentRatingRtcRating::RtcAa => write!(f, "rtcAa"),
+            ContentRatingRtcRating::RtcA => write!(f, "rtcA"),
+            ContentRatingRtcRating::RtcB => write!(f, "rtcB"),
+            ContentRatingRtcRating::RtcB15 => write!(f, "rtcB15"),
+            ContentRatingRtcRating::RtcC => write!(f, "rtcC"),
+            ContentRatingRtcRating::RtcD => write!(f, "rtcD"),
+            ContentRatingRtcRating::RtcUnrated => write!(f, "rtcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRteRating {
+    Undefined,
+    ///
+    #[serde(rename = "rteUnspecified")]
+    RteUnspecified,
+    /// GA
+    #[serde(rename = "rteGa")]
+    RteGa,
+    /// CH
+    #[serde(rename = "rteCh")]
+    RteCh,
+    /// PS
+    #[serde(rename = "rtePs")]
+    RtePs,
+    /// MA
+    #[serde(rename = "rteMa")]
+    RteMa,
+    ///
+    #[serde(rename = "rteUnrated")]
+    RteUnrated,
+}
+
+impl std::default::Default for ContentRatingRteRating {
+    fn default() -> ContentRatingRteRating {
+        ContentRatingRteRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRteRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRteRating::Undefined => write!(f, "undefined"),
+            ContentRatingRteRating::RteUnspecified => write!(f, "rteUnspecified"),
+            ContentRatingRteRating::RteGa => write!(f, "rteGa"),
+            ContentRatingRteRating::RteCh => write!(f, "rteCh"),
+            ContentRatingRteRating::RtePs => write!(f, "rtePs"),
+            ContentRatingRteRating::RteMa => write!(f, "rteMa"),
+            ContentRatingRteRating::RteUnrated => write!(f, "rteUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMenaMpaaRating {
+    Undefined,
+    ///
+    #[serde(rename = "menaMpaaUnspecified")]
+    MenaMpaaUnspecified,
+    /// G
+    #[serde(rename = "menaMpaaG")]
+    MenaMpaaG,
+    /// PG
+    #[serde(rename = "menaMpaaPg")]
+    MenaMpaaPg,
+    /// PG-13
+    #[serde(rename = "menaMpaaPg13")]
+    MenaMpaaPg13,
+    /// R
+    #[serde(rename = "menaMpaaR")]
+    MenaMpaaR,
+    /// To keep the same enum values as MPAA's items have, skip NC_17.
+    #[serde(rename = "menaMpaaUnrated")]
+    MenaMpaaUnrated,
+}
+
+impl std::default::Default for ContentRatingMenaMpaaRating {
+    fn default() -> ContentRatingMenaMpaaRating {
+        ContentRatingMenaMpaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMenaMpaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMenaMpaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnspecified => write!(f, "menaMpaaUnspecified"),
+            ContentRatingMenaMpaaRating::MenaMpaaG => write!(f, "menaMpaaG"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg => write!(f, "menaMpaaPg"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg13 => write!(f, "menaMpaaPg13"),
+            ContentRatingMenaMpaaRating::MenaMpaaR => write!(f, "menaMpaaR"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnrated => write!(f, "menaMpaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMoctwRating {
+    Undefined,
+    ///
+    #[serde(rename = "moctwUnspecified")]
+    MoctwUnspecified,
+    /// G
+    #[serde(rename = "moctwG")]
+    MoctwG,
+    /// P
+    #[serde(rename = "moctwP")]
+    MoctwP,
+    /// PG
+    #[serde(rename = "moctwPg")]
+    MoctwPg,
+    /// R
+    #[serde(rename = "moctwR")]
+    MoctwR,
+    ///
+    #[serde(rename = "moctwUnrated")]
+    MoctwUnrated,
+    /// R-12
+    #[serde(rename = "moctwR12")]
+    MoctwR12,
+    /// R-15
+    #[serde(rename = "moctwR15")]
+    MoctwR15,
+}
+
+impl std::default::Default for ContentRatingMoctwRating {
+    fn default() -> ContentRatingMoctwRating {
+        ContentRatingMoctwRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMoctwRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMoctwRating::Undefined => write!(f, "undefined"),
+            ContentRatingMoctwRating::MoctwUnspecified => write!(f, "moctwUnspecified"),
+            ContentRatingMoctwRating::MoctwG => write!(f, "moctwG"),
+            ContentRatingMoctwRating::MoctwP => write!(f, "moctwP"),
+            ContentRatingMoctwRating::MoctwPg => write!(f, "moctwPg"),
+            ContentRatingMoctwRating::MoctwR => write!(f, "moctwR"),
+            ContentRatingMoctwRating::MoctwUnrated => write!(f, "moctwUnrated"),
+            ContentRatingMoctwRating::MoctwR12 => write!(f, "moctwR12"),
+            ContentRatingMoctwRating::MoctwR15 => write!(f, "moctwR15"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKijkwijzerRating {
+    Undefined,
+    ///
+    #[serde(rename = "kijkwijzerUnspecified")]
+    KijkwijzerUnspecified,
+    /// AL
+    #[serde(rename = "kijkwijzerAl")]
+    KijkwijzerAl,
+    /// 6
+    #[serde(rename = "kijkwijzer6")]
+    Kijkwijzer6,
+    /// 9
+    #[serde(rename = "kijkwijzer9")]
+    Kijkwijzer9,
+    /// 12
+    #[serde(rename = "kijkwijzer12")]
+    Kijkwijzer12,
+    /// 16
+    #[serde(rename = "kijkwijzer16")]
+    Kijkwijzer16,
+    ///
+    #[serde(rename = "kijkwijzer18")]
+    Kijkwijzer18,
+    ///
+    #[serde(rename = "kijkwijzerUnrated")]
+    KijkwijzerUnrated,
+}
+
+impl std::default::Default for ContentRatingKijkwijzerRating {
+    fn default() -> ContentRatingKijkwijzerRating {
+        ContentRatingKijkwijzerRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingKijkwijzerRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingKijkwijzerRating::Undefined => write!(f, "undefined"),
+            ContentRatingKijkwijzerRating::KijkwijzerUnspecified => {
+                write!(f, "kijkwijzerUnspecified")
+            }
+            ContentRatingKijkwijzerRating::KijkwijzerAl => write!(f, "kijkwijzerAl"),
+            ContentRatingKijkwijzerRating::Kijkwijzer6 => write!(f, "kijkwijzer6"),
+            ContentRatingKijkwijzerRating::Kijkwijzer9 => write!(f, "kijkwijzer9"),
+            ContentRatingKijkwijzerRating::Kijkwijzer12 => write!(f, "kijkwijzer12"),
+            ContentRatingKijkwijzerRating::Kijkwijzer16 => write!(f, "kijkwijzer16"),
+            ContentRatingKijkwijzerRating::Kijkwijzer18 => write!(f, "kijkwijzer18"),
+            ContentRatingKijkwijzerRating::KijkwijzerUnrated => write!(f, "kijkwijzerUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingOflcRating {
+    Undefined,
+    ///
+    #[serde(rename = "oflcUnspecified")]
+    OflcUnspecified,
+    /// G
+    #[serde(rename = "oflcG")]
+    OflcG,
+    /// PG
+    #[serde(rename = "oflcPg")]
+    OflcPg,
+    /// M
+    #[serde(rename = "oflcM")]
+    OflcM,
+    /// R13
+    #[serde(rename = "oflcR13")]
+    OflcR13,
+    /// R15
+    #[serde(rename = "oflcR15")]
+    OflcR15,
+    /// R16
+    #[serde(rename = "oflcR16")]
+    OflcR16,
+    /// R18
+    #[serde(rename = "oflcR18")]
+    OflcR18,
+    ///
+    #[serde(rename = "oflcUnrated")]
+    OflcUnrated,
+    /// RP13
+    #[serde(rename = "oflcRp13")]
+    OflcRp13,
+    /// RP16
+    #[serde(rename = "oflcRp16")]
+    OflcRp16,
+    /// RP18
+    #[serde(rename = "oflcRp18")]
+    OflcRp18,
+}
+
+impl std::default::Default for ContentRatingOflcRating {
+    fn default() -> ContentRatingOflcRating {
+        ContentRatingOflcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingOflcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingOflcRating::Undefined => write!(f, "undefined"),
+            ContentRatingOflcRating::OflcUnspecified => write!(f, "oflcUnspecified"),
+            ContentRatingOflcRating::OflcG => write!(f, "oflcG"),
+            ContentRatingOflcRating::OflcPg => write!(f, "oflcPg"),
+            ContentRatingOflcRating::OflcM => write!(f, "oflcM"),
+            ContentRatingOflcRating::OflcR13 => write!(f, "oflcR13"),
+            ContentRatingOflcRating::OflcR15 => write!(f, "oflcR15"),
+            ContentRatingOflcRating::OflcR16 => write!(f, "oflcR16"),
+            ContentRatingOflcRating::OflcR18 => write!(f, "oflcR18"),
+            ContentRatingOflcRating::OflcUnrated => write!(f, "oflcUnrated"),
+            ContentRatingOflcRating::OflcRp13 => write!(f, "oflcRp13"),
+            ContentRatingOflcRating::OflcRp16 => write!(f, "oflcRp16"),
+            ContentRatingOflcRating::OflcRp18 => write!(f, "oflcRp18"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEefilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "eefilmUnspecified")]
+    EefilmUnspecified,
+    /// Pere
+    #[serde(rename = "eefilmPere")]
+    EefilmPere,
+    /// L
+    #[serde(rename = "eefilmL")]
+    EefilmL,
+    /// MS-6
+    #[serde(rename = "eefilmMs6")]
+    EefilmMs6,
+    /// K-6
+    #[serde(rename = "eefilmK6")]
+    EefilmK6,
+    /// MS-12
+    #[serde(rename = "eefilmMs12")]
+    EefilmMs12,
+    /// K-12
+    #[serde(rename = "eefilmK12")]
+    EefilmK12,
+    /// K-14
+    #[serde(rename = "eefilmK14")]
+    EefilmK14,
+    /// K-16
+    #[serde(rename = "eefilmK16")]
+    EefilmK16,
+    ///
+    #[serde(rename = "eefilmUnrated")]
+    EefilmUnrated,
+}
+
+impl std::default::Default for ContentRatingEefilmRating {
+    fn default() -> ContentRatingEefilmRating {
+        ContentRatingEefilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEefilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEefilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingEefilmRating::EefilmUnspecified => write!(f, "eefilmUnspecified"),
+            ContentRatingEefilmRating::EefilmPere => write!(f, "eefilmPere"),
+            ContentRatingEefilmRating::EefilmL => write!(f, "eefilmL"),
+            ContentRatingEefilmRating::EefilmMs6 => write!(f, "eefilmMs6"),
+            ContentRatingEefilmRating::EefilmK6 => write!(f, "eefilmK6"),
+            ContentRatingEefilmRating::EefilmMs12 => write!(f, "eefilmMs12"),
+            ContentRatingEefilmRating::EefilmK12 => write!(f, "eefilmK12"),
+            ContentRatingEefilmRating::EefilmK14 => write!(f, "eefilmK14"),
+            ContentRatingEefilmRating::EefilmK16 => write!(f, "eefilmK16"),
+            ContentRatingEefilmRating::EefilmUnrated => write!(f, "eefilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingYtRating {
+    Undefined,
+    ///
+    #[serde(rename = "ytUnspecified")]
+    YtUnspecified,
+    ///
+    #[serde(rename = "ytAgeRestricted")]
+    YtAgeRestricted,
+}
+
+impl std::default::Default for ContentRatingYtRating {
+    fn default() -> ContentRatingYtRating {
+        ContentRatingYtRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingYtRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingYtRating::Undefined => write!(f, "undefined"),
+            ContentRatingYtRating::YtUnspecified => write!(f, "ytUnspecified"),
+            ContentRatingYtRating::YtAgeRestricted => write!(f, "ytAgeRestricted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNkclvRating {
+    Undefined,
+    ///
+    #[serde(rename = "nkclvUnspecified")]
+    NkclvUnspecified,
+    /// U
+    #[serde(rename = "nkclvU")]
+    NkclvU,
+    /// 7+
+    #[serde(rename = "nkclv7plus")]
+    Nkclv7plus,
+    /// 12+
+    #[serde(rename = "nkclv12plus")]
+    Nkclv12plus,
+    /// ! 16+
+    #[serde(rename = "nkclv16plus")]
+    Nkclv16plus,
+    /// 18+
+    #[serde(rename = "nkclv18plus")]
+    Nkclv18plus,
+    ///
+    #[serde(rename = "nkclvUnrated")]
+    NkclvUnrated,
+}
+
+impl std::default::Default for ContentRatingNkclvRating {
+    fn default() -> ContentRatingNkclvRating {
+        ContentRatingNkclvRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNkclvRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNkclvRating::Undefined => write!(f, "undefined"),
+            ContentRatingNkclvRating::NkclvUnspecified => write!(f, "nkclvUnspecified"),
+            ContentRatingNkclvRating::NkclvU => write!(f, "nkclvU"),
+            ContentRatingNkclvRating::Nkclv7plus => write!(f, "nkclv7plus"),
+            ContentRatingNkclvRating::Nkclv12plus => write!(f, "nkclv12plus"),
+            ContentRatingNkclvRating::Nkclv16plus => write!(f, "nkclv16plus"),
+            ContentRatingNkclvRating::Nkclv18plus => write!(f, "nkclv18plus"),
+            ContentRatingNkclvRating::NkclvUnrated => write!(f, "nkclvUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBbfcRating {
+    Undefined,
+    ///
+    #[serde(rename = "bbfcUnspecified")]
+    BbfcUnspecified,
+    /// U
+    #[serde(rename = "bbfcU")]
+    BbfcU,
+    /// PG
+    #[serde(rename = "bbfcPg")]
+    BbfcPg,
+    /// 12A
+    #[serde(rename = "bbfc12a")]
+    Bbfc12a,
+    /// 12
+    #[serde(rename = "bbfc12")]
+    Bbfc12,
+    /// 15
+    #[serde(rename = "bbfc15")]
+    Bbfc15,
+    /// 18
+    #[serde(rename = "bbfc18")]
+    Bbfc18,
+    /// R18
+    #[serde(rename = "bbfcR18")]
+    BbfcR18,
+    ///
+    #[serde(rename = "bbfcUnrated")]
+    BbfcUnrated,
+}
+
+impl std::default::Default for ContentRatingBbfcRating {
+    fn default() -> ContentRatingBbfcRating {
+        ContentRatingBbfcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingBbfcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingBbfcRating::Undefined => write!(f, "undefined"),
+            ContentRatingBbfcRating::BbfcUnspecified => write!(f, "bbfcUnspecified"),
+            ContentRatingBbfcRating::BbfcU => write!(f, "bbfcU"),
+            ContentRatingBbfcRating::BbfcPg => write!(f, "bbfcPg"),
+            ContentRatingBbfcRating::Bbfc12a => write!(f, "bbfc12a"),
+            ContentRatingBbfcRating::Bbfc12 => write!(f, "bbfc12"),
+            ContentRatingBbfcRating::Bbfc15 => write!(f, "bbfc15"),
+            ContentRatingBbfcRating::Bbfc18 => write!(f, "bbfc18"),
+            ContentRatingBbfcRating::BbfcR18 => write!(f, "bbfcR18"),
+            ContentRatingBbfcRating::BbfcUnrated => write!(f, "bbfcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRussiaRating {
+    Undefined,
+    ///
+    #[serde(rename = "russiaUnspecified")]
+    RussiaUnspecified,
+    /// 0+
+    #[serde(rename = "russia0")]
+    Russia0,
+    /// 6+
+    #[serde(rename = "russia6")]
+    Russia6,
+    /// 12+
+    #[serde(rename = "russia12")]
+    Russia12,
+    /// 16+
+    #[serde(rename = "russia16")]
+    Russia16,
+    /// 18+
+    #[serde(rename = "russia18")]
+    Russia18,
+    ///
+    #[serde(rename = "russiaUnrated")]
+    RussiaUnrated,
+}
+
+impl std::default::Default for ContentRatingRussiaRating {
+    fn default() -> ContentRatingRussiaRating {
+        ContentRatingRussiaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRussiaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRussiaRating::Undefined => write!(f, "undefined"),
+            ContentRatingRussiaRating::RussiaUnspecified => write!(f, "russiaUnspecified"),
+            ContentRatingRussiaRating::Russia0 => write!(f, "russia0"),
+            ContentRatingRussiaRating::Russia6 => write!(f, "russia6"),
+            ContentRatingRussiaRating::Russia12 => write!(f, "russia12"),
+            ContentRatingRussiaRating::Russia16 => write!(f, "russia16"),
+            ContentRatingRussiaRating::Russia18 => write!(f, "russia18"),
+            ContentRatingRussiaRating::RussiaUnrated => write!(f, "russiaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMpaaRating {
+    Undefined,
+    ///
+    #[serde(rename = "mpaaUnspecified")]
+    MpaaUnspecified,
+    /// G
+    #[serde(rename = "mpaaG")]
+    MpaaG,
+    /// PG
+    #[serde(rename = "mpaaPg")]
+    MpaaPg,
+    /// PG-13
+    #[serde(rename = "mpaaPg13")]
+    MpaaPg13,
+    /// R
+    #[serde(rename = "mpaaR")]
+    MpaaR,
+    /// NC-17
+    #[serde(rename = "mpaaNc17")]
+    MpaaNc17,
+    /// ! X
+    #[serde(rename = "mpaaX")]
+    MpaaX,
+    ///
+    #[serde(rename = "mpaaUnrated")]
+    MpaaUnrated,
+}
+
+impl std::default::Default for ContentRatingMpaaRating {
+    fn default() -> ContentRatingMpaaRating {
+        ContentRatingMpaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMpaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMpaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMpaaRating::MpaaUnspecified => write!(f, "mpaaUnspecified"),
+            ContentRatingMpaaRating::MpaaG => write!(f, "mpaaG"),
+            ContentRatingMpaaRating::MpaaPg => write!(f, "mpaaPg"),
+            ContentRatingMpaaRating::MpaaPg13 => write!(f, "mpaaPg13"),
+            ContentRatingMpaaRating::MpaaR => write!(f, "mpaaR"),
+            ContentRatingMpaaRating::MpaaNc17 => write!(f, "mpaaNc17"),
+            ContentRatingMpaaRating::MpaaX => write!(f, "mpaaX"),
+            ContentRatingMpaaRating::MpaaUnrated => write!(f, "mpaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEirinRating {
+    Undefined,
+    ///
+    #[serde(rename = "eirinUnspecified")]
+    EirinUnspecified,
+    /// G
+    #[serde(rename = "eirinG")]
+    EirinG,
+    /// PG-12
+    #[serde(rename = "eirinPg12")]
+    EirinPg12,
+    /// R15+
+    #[serde(rename = "eirinR15plus")]
+    EirinR15plus,
+    /// R18+
+    #[serde(rename = "eirinR18plus")]
+    EirinR18plus,
+    ///
+    #[serde(rename = "eirinUnrated")]
+    EirinUnrated,
+}
+
+impl std::default::Default for ContentRatingEirinRating {
+    fn default() -> ContentRatingEirinRating {
+        ContentRatingEirinRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEirinRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEirinRating::Undefined => write!(f, "undefined"),
+            ContentRatingEirinRating::EirinUnspecified => write!(f, "eirinUnspecified"),
+            ContentRatingEirinRating::EirinG => write!(f, "eirinG"),
+            ContentRatingEirinRating::EirinPg12 => write!(f, "eirinPg12"),
+            ContentRatingEirinRating::EirinR15plus => write!(f, "eirinR15plus"),
+            ContentRatingEirinRating::EirinR18plus => write!(f, "eirinR18plus"),
+            ContentRatingEirinRating::EirinUnrated => write!(f, "eirinUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRcnofRating {
+    Undefined,
+    ///
+    #[serde(rename = "rcnofUnspecified")]
+    RcnofUnspecified,
+    ///
+    #[serde(rename = "rcnofI")]
+    RcnofI,
+    ///
+    #[serde(rename = "rcnofIi")]
+    RcnofIi,
+    ///
+    #[serde(rename = "rcnofIii")]
+    RcnofIii,
+    ///
+    #[serde(rename = "rcnofIv")]
+    RcnofIv,
+    ///
+    #[serde(rename = "rcnofV")]
+    RcnofV,
+    ///
+    #[serde(rename = "rcnofVi")]
+    RcnofVi,
+    ///
+    #[serde(rename = "rcnofUnrated")]
+    RcnofUnrated,
+}
+
+impl std::default::Default for ContentRatingRcnofRating {
+    fn default() -> ContentRatingRcnofRating {
+        ContentRatingRcnofRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingRcnofRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingRcnofRating::Undefined => write!(f, "undefined"),
+            ContentRatingRcnofRating::RcnofUnspecified => write!(f, "rcnofUnspecified"),
+            ContentRatingRcnofRating::RcnofI => write!(f, "rcnofI"),
+            ContentRatingRcnofRating::RcnofIi => write!(f, "rcnofIi"),
+            ContentRatingRcnofRating::RcnofIii => write!(f, "rcnofIii"),
+            ContentRatingRcnofRating::RcnofIv => write!(f, "rcnofIv"),
+            ContentRatingRcnofRating::RcnofV => write!(f, "rcnofV"),
+            ContentRatingRcnofRating::RcnofVi => write!(f, "rcnofVi"),
+            ContentRatingRcnofRating::RcnofUnrated => write!(f, "rcnofUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCbfcRating {
+    Undefined,
+    ///
+    #[serde(rename = "cbfcUnspecified")]
+    CbfcUnspecified,
+    /// U
+    #[serde(rename = "cbfcU")]
+    CbfcU,
+    /// U/A
+    #[serde(rename = "cbfcUA")]
+    CbfcUA,
+    /// A
+    #[serde(rename = "cbfcA")]
+    CbfcA,
+    /// S
+    #[serde(rename = "cbfcS")]
+    CbfcS,
+    ///
+    #[serde(rename = "cbfcUnrated")]
+    CbfcUnrated,
+}
+
+impl std::default::Default for ContentRatingCbfcRating {
+    fn default() -> ContentRatingCbfcRating {
+        ContentRatingCbfcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCbfcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCbfcRating::Undefined => write!(f, "undefined"),
+            ContentRatingCbfcRating::CbfcUnspecified => write!(f, "cbfcUnspecified"),
+            ContentRatingCbfcRating::CbfcU => write!(f, "cbfcU"),
+            ContentRatingCbfcRating::CbfcUA => write!(f, "cbfcUA"),
+            ContentRatingCbfcRating::CbfcA => write!(f, "cbfcA"),
+            ContentRatingCbfcRating::CbfcS => write!(f, "cbfcS"),
+            ContentRatingCbfcRating::CbfcUnrated => write!(f, "cbfcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSmaisRating {
+    Undefined,
+    ///
+    #[serde(rename = "smaisUnspecified")]
+    SmaisUnspecified,
+    /// L
+    #[serde(rename = "smaisL")]
+    SmaisL,
+    /// 7
+    #[serde(rename = "smais7")]
+    Smais7,
+    /// 12
+    #[serde(rename = "smais12")]
+    Smais12,
+    /// 14
+    #[serde(rename = "smais14")]
+    Smais14,
+    /// 16
+    #[serde(rename = "smais16")]
+    Smais16,
+    /// 18
+    #[serde(rename = "smais18")]
+    Smais18,
+    ///
+    #[serde(rename = "smaisUnrated")]
+    SmaisUnrated,
+}
+
+impl std::default::Default for ContentRatingSmaisRating {
+    fn default() -> ContentRatingSmaisRating {
+        ContentRatingSmaisRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingSmaisRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingSmaisRating::Undefined => write!(f, "undefined"),
+            ContentRatingSmaisRating::SmaisUnspecified => write!(f, "smaisUnspecified"),
+            ContentRatingSmaisRating::SmaisL => write!(f, "smaisL"),
+            ContentRatingSmaisRating::Smais7 => write!(f, "smais7"),
+            ContentRatingSmaisRating::Smais12 => write!(f, "smais12"),
+            ContentRatingSmaisRating::Smais14 => write!(f, "smais14"),
+            ContentRatingSmaisRating::Smais16 => write!(f, "smais16"),
+            ContentRatingSmaisRating::Smais18 => write!(f, "smais18"),
+            ContentRatingSmaisRating::SmaisUnrated => write!(f, "smaisUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMcstRating {
+    Undefined,
+    ///
+    #[serde(rename = "mcstUnspecified")]
+    McstUnspecified,
+    /// P
+    #[serde(rename = "mcstP")]
+    McstP,
+    /// 0
+    #[serde(rename = "mcst0")]
+    Mcst0,
+    /// C13
+    #[serde(rename = "mcstC13")]
+    McstC13,
+    /// C16
+    #[serde(rename = "mcstC16")]
+    McstC16,
+    /// 16+
+    #[serde(rename = "mcst16plus")]
+    Mcst16plus,
+    /// C18
+    #[serde(rename = "mcstC18")]
+    McstC18,
+    /// MCST_G_PG
+    #[serde(rename = "mcstGPg")]
+    McstGPg,
+    ///
+    #[serde(rename = "mcstUnrated")]
+    McstUnrated,
+}
+
+impl std::default::Default for ContentRatingMcstRating {
+    fn default() -> ContentRatingMcstRating {
+        ContentRatingMcstRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMcstRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMcstRating::Undefined => write!(f, "undefined"),
+            ContentRatingMcstRating::McstUnspecified => write!(f, "mcstUnspecified"),
+            ContentRatingMcstRating::McstP => write!(f, "mcstP"),
+            ContentRatingMcstRating::Mcst0 => write!(f, "mcst0"),
+            ContentRatingMcstRating::McstC13 => write!(f, "mcstC13"),
+            ContentRatingMcstRating::McstC16 => write!(f, "mcstC16"),
+            ContentRatingMcstRating::Mcst16plus => write!(f, "mcst16plus"),
+            ContentRatingMcstRating::McstC18 => write!(f, "mcstC18"),
+            ContentRatingMcstRating::McstGPg => write!(f, "mcstGPg"),
+            ContentRatingMcstRating::McstUnrated => write!(f, "mcstUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCceRating {
+    Undefined,
+    ///
+    #[serde(rename = "cceUnspecified")]
+    CceUnspecified,
+    /// 4
+    #[serde(rename = "cceM4")]
+    CceM4,
+    /// 6
+    #[serde(rename = "cceM6")]
+    CceM6,
+    /// 12
+    #[serde(rename = "cceM12")]
+    CceM12,
+    /// 16
+    #[serde(rename = "cceM16")]
+    CceM16,
+    /// 18
+    #[serde(rename = "cceM18")]
+    CceM18,
+    ///
+    #[serde(rename = "cceUnrated")]
+    CceUnrated,
+    /// 14
+    #[serde(rename = "cceM14")]
+    CceM14,
+}
+
+impl std::default::Default for ContentRatingCceRating {
+    fn default() -> ContentRatingCceRating {
+        ContentRatingCceRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCceRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCceRating::Undefined => write!(f, "undefined"),
+            ContentRatingCceRating::CceUnspecified => write!(f, "cceUnspecified"),
+            ContentRatingCceRating::CceM4 => write!(f, "cceM4"),
+            ContentRatingCceRating::CceM6 => write!(f, "cceM6"),
+            ContentRatingCceRating::CceM12 => write!(f, "cceM12"),
+            ContentRatingCceRating::CceM16 => write!(f, "cceM16"),
+            ContentRatingCceRating::CceM18 => write!(f, "cceM18"),
+            ContentRatingCceRating::CceUnrated => write!(f, "cceUnrated"),
+            ContentRatingCceRating::CceM14 => write!(f, "cceM14"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCatvfrRating {
+    Undefined,
+    ///
+    #[serde(rename = "catvfrUnspecified")]
+    CatvfrUnspecified,
+    /// G
+    #[serde(rename = "catvfrG")]
+    CatvfrG,
+    /// 8+
+    #[serde(rename = "catvfr8plus")]
+    Catvfr8plus,
+    /// 13+
+    #[serde(rename = "catvfr13plus")]
+    Catvfr13plus,
+    /// 16+
+    #[serde(rename = "catvfr16plus")]
+    Catvfr16plus,
+    /// 18+
+    #[serde(rename = "catvfr18plus")]
+    Catvfr18plus,
+    ///
+    #[serde(rename = "catvfrUnrated")]
+    CatvfrUnrated,
+    ///
+    #[serde(rename = "catvfrE")]
+    CatvfrE,
+}
+
+impl std::default::Default for ContentRatingCatvfrRating {
+    fn default() -> ContentRatingCatvfrRating {
+        ContentRatingCatvfrRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCatvfrRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCatvfrRating::Undefined => write!(f, "undefined"),
+            ContentRatingCatvfrRating::CatvfrUnspecified => write!(f, "catvfrUnspecified"),
+            ContentRatingCatvfrRating::CatvfrG => write!(f, "catvfrG"),
+            ContentRatingCatvfrRating::Catvfr8plus => write!(f, "catvfr8plus"),
+            ContentRatingCatvfrRating::Catvfr13plus => write!(f, "catvfr13plus"),
+            ContentRatingCatvfrRating::Catvfr16plus => write!(f, "catvfr16plus"),
+            ContentRatingCatvfrRating::Catvfr18plus => write!(f, "catvfr18plus"),
+            ContentRatingCatvfrRating::CatvfrUnrated => write!(f, "catvfrUnrated"),
+            ContentRatingCatvfrRating::CatvfrE => write!(f, "catvfrE"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingDjctqRating {
+    Undefined,
+    ///
+    #[serde(rename = "djctqUnspecified")]
+    DjctqUnspecified,
+    /// L
+    #[serde(rename = "djctqL")]
+    DjctqL,
+    /// 10
+    #[serde(rename = "djctq10")]
+    Djctq10,
+    /// 12
+    #[serde(rename = "djctq12")]
+    Djctq12,
+    /// 14
+    #[serde(rename = "djctq14")]
+    Djctq14,
+    /// 16
+    #[serde(rename = "djctq16")]
+    Djctq16,
+    /// 18
+    #[serde(rename = "djctq18")]
+    Djctq18,
+    ///
+    #[serde(rename = "djctqEr")]
+    DjctqEr,
+    ///
+    #[serde(rename = "djctqL10")]
+    DjctqL10,
+    ///
+    #[serde(rename = "djctqL12")]
+    DjctqL12,
+    ///
+    #[serde(rename = "djctqL14")]
+    DjctqL14,
+    ///
+    #[serde(rename = "djctqL16")]
+    DjctqL16,
+    ///
+    #[serde(rename = "djctqL18")]
+    DjctqL18,
+    ///
+    #[serde(rename = "djctq1012")]
+    Djctq1012,
+    ///
+    #[serde(rename = "djctq1014")]
+    Djctq1014,
+    ///
+    #[serde(rename = "djctq1016")]
+    Djctq1016,
+    ///
+    #[serde(rename = "djctq1018")]
+    Djctq1018,
+    ///
+    #[serde(rename = "djctq1214")]
+    Djctq1214,
+    ///
+    #[serde(rename = "djctq1216")]
+    Djctq1216,
+    ///
+    #[serde(rename = "djctq1218")]
+    Djctq1218,
+    ///
+    #[serde(rename = "djctq1416")]
+    Djctq1416,
+    ///
+    #[serde(rename = "djctq1418")]
+    Djctq1418,
+    ///
+    #[serde(rename = "djctq1618")]
+    Djctq1618,
+    ///
+    #[serde(rename = "djctqUnrated")]
+    DjctqUnrated,
+}
+
+impl std::default::Default for ContentRatingDjctqRating {
+    fn default() -> ContentRatingDjctqRating {
+        ContentRatingDjctqRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingDjctqRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingDjctqRating::Undefined => write!(f, "undefined"),
+            ContentRatingDjctqRating::DjctqUnspecified => write!(f, "djctqUnspecified"),
+            ContentRatingDjctqRating::DjctqL => write!(f, "djctqL"),
+            ContentRatingDjctqRating::Djctq10 => write!(f, "djctq10"),
+            ContentRatingDjctqRating::Djctq12 => write!(f, "djctq12"),
+            ContentRatingDjctqRating::Djctq14 => write!(f, "djctq14"),
+            ContentRatingDjctqRating::Djctq16 => write!(f, "djctq16"),
+            ContentRatingDjctqRating::Djctq18 => write!(f, "djctq18"),
+            ContentRatingDjctqRating::DjctqEr => write!(f, "djctqEr"),
+            ContentRatingDjctqRating::DjctqL10 => write!(f, "djctqL10"),
+            ContentRatingDjctqRating::DjctqL12 => write!(f, "djctqL12"),
+            ContentRatingDjctqRating::DjctqL14 => write!(f, "djctqL14"),
+            ContentRatingDjctqRating::DjctqL16 => write!(f, "djctqL16"),
+            ContentRatingDjctqRating::DjctqL18 => write!(f, "djctqL18"),
+            ContentRatingDjctqRating::Djctq1012 => write!(f, "djctq1012"),
+            ContentRatingDjctqRating::Djctq1014 => write!(f, "djctq1014"),
+            ContentRatingDjctqRating::Djctq1016 => write!(f, "djctq1016"),
+            ContentRatingDjctqRating::Djctq1018 => write!(f, "djctq1018"),
+            ContentRatingDjctqRating::Djctq1214 => write!(f, "djctq1214"),
+            ContentRatingDjctqRating::Djctq1216 => write!(f, "djctq1216"),
+            ContentRatingDjctqRating::Djctq1218 => write!(f, "djctq1218"),
+            ContentRatingDjctqRating::Djctq1416 => write!(f, "djctq1416"),
+            ContentRatingDjctqRating::Djctq1418 => write!(f, "djctq1418"),
+            ContentRatingDjctqRating::Djctq1618 => write!(f, "djctq1618"),
+            ContentRatingDjctqRating::DjctqUnrated => write!(f, "djctqUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCzfilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "czfilmUnspecified")]
+    CzfilmUnspecified,
+    /// U
+    #[serde(rename = "czfilmU")]
+    CzfilmU,
+    /// 12
+    #[serde(rename = "czfilm12")]
+    Czfilm12,
+    /// 14
+    #[serde(rename = "czfilm14")]
+    Czfilm14,
+    /// 18
+    #[serde(rename = "czfilm18")]
+    Czfilm18,
+    ///
+    #[serde(rename = "czfilmUnrated")]
+    CzfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingCzfilmRating {
+    fn default() -> ContentRatingCzfilmRating {
+        ContentRatingCzfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCzfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCzfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingCzfilmRating::CzfilmUnspecified => write!(f, "czfilmUnspecified"),
+            ContentRatingCzfilmRating::CzfilmU => write!(f, "czfilmU"),
+            ContentRatingCzfilmRating::Czfilm12 => write!(f, "czfilm12"),
+            ContentRatingCzfilmRating::Czfilm14 => write!(f, "czfilm14"),
+            ContentRatingCzfilmRating::Czfilm18 => write!(f, "czfilm18"),
+            ContentRatingCzfilmRating::CzfilmUnrated => write!(f, "czfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCicfRating {
+    Undefined,
+    ///
+    #[serde(rename = "cicfUnspecified")]
+    CicfUnspecified,
+    /// E
+    #[serde(rename = "cicfE")]
+    CicfE,
+    /// KT/EA
+    #[serde(rename = "cicfKtEa")]
+    CicfKtEa,
+    /// KNT/ENA
+    #[serde(rename = "cicfKntEna")]
+    CicfKntEna,
+    ///
+    #[serde(rename = "cicfUnrated")]
+    CicfUnrated,
+}
+
+impl std::default::Default for ContentRatingCicfRating {
+    fn default() -> ContentRatingCicfRating {
+        ContentRatingCicfRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCicfRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCicfRating::Undefined => write!(f, "undefined"),
+            ContentRatingCicfRating::CicfUnspecified => write!(f, "cicfUnspecified"),
+            ContentRatingCicfRating::CicfE => write!(f, "cicfE"),
+            ContentRatingCicfRating::CicfKtEa => write!(f, "cicfKtEa"),
+            ContentRatingCicfRating::CicfKntEna => write!(f, "cicfKntEna"),
+            ContentRatingCicfRating::CicfUnrated => write!(f, "cicfUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAgcomRating {
+    Undefined,
+    ///
+    #[serde(rename = "agcomUnspecified")]
+    AgcomUnspecified,
+    /// T
+    #[serde(rename = "agcomT")]
+    AgcomT,
+    /// VM14
+    #[serde(rename = "agcomVm14")]
+    AgcomVm14,
+    /// VM18
+    #[serde(rename = "agcomVm18")]
+    AgcomVm18,
+    ///
+    #[serde(rename = "agcomUnrated")]
+    AgcomUnrated,
+}
+
+impl std::default::Default for ContentRatingAgcomRating {
+    fn default() -> ContentRatingAgcomRating {
+        ContentRatingAgcomRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingAgcomRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingAgcomRating::Undefined => write!(f, "undefined"),
+            ContentRatingAgcomRating::AgcomUnspecified => write!(f, "agcomUnspecified"),
+            ContentRatingAgcomRating::AgcomT => write!(f, "agcomT"),
+            ContentRatingAgcomRating::AgcomVm14 => write!(f, "agcomVm14"),
+            ContentRatingAgcomRating::AgcomVm18 => write!(f, "agcomVm18"),
+            ContentRatingAgcomRating::AgcomUnrated => write!(f, "agcomUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIlfilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "ilfilmUnspecified")]
+    IlfilmUnspecified,
+    /// AA
+    #[serde(rename = "ilfilmAa")]
+    IlfilmAa,
+    /// 12
+    #[serde(rename = "ilfilm12")]
+    Ilfilm12,
+    /// 14
+    #[serde(rename = "ilfilm14")]
+    Ilfilm14,
+    /// 16
+    #[serde(rename = "ilfilm16")]
+    Ilfilm16,
+    /// 18
+    #[serde(rename = "ilfilm18")]
+    Ilfilm18,
+    ///
+    #[serde(rename = "ilfilmUnrated")]
+    IlfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingIlfilmRating {
+    fn default() -> ContentRatingIlfilmRating {
+        ContentRatingIlfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIlfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIlfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingIlfilmRating::IlfilmUnspecified => write!(f, "ilfilmUnspecified"),
+            ContentRatingIlfilmRating::IlfilmAa => write!(f, "ilfilmAa"),
+            ContentRatingIlfilmRating::Ilfilm12 => write!(f, "ilfilm12"),
+            ContentRatingIlfilmRating::Ilfilm14 => write!(f, "ilfilm14"),
+            ContentRatingIlfilmRating::Ilfilm16 => write!(f, "ilfilm16"),
+            ContentRatingIlfilmRating::Ilfilm18 => write!(f, "ilfilm18"),
+            ContentRatingIlfilmRating::IlfilmUnrated => write!(f, "ilfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBfvcRating {
+    Undefined,
+    ///
+    #[serde(rename = "bfvcUnspecified")]
+    BfvcUnspecified,
+    /// G
+    #[serde(rename = "bfvcG")]
+    BfvcG,
+    /// E
+    #[serde(rename = "bfvcE")]
+    BfvcE,
+    /// 13
+    #[serde(rename = "bfvc13")]
+    Bfvc13,
+    /// 15
+    #[serde(rename = "bfvc15")]
+    Bfvc15,
+    /// 18
+    #[serde(rename = "bfvc18")]
+    Bfvc18,
+    /// 20
+    #[serde(rename = "bfvc20")]
+    Bfvc20,
+    /// B
+    #[serde(rename = "bfvcB")]
+    BfvcB,
+    ///
+    #[serde(rename = "bfvcUnrated")]
+    BfvcUnrated,
+}
+
+impl std::default::Default for ContentRatingBfvcRating {
+    fn default() -> ContentRatingBfvcRating {
+        ContentRatingBfvcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingBfvcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingBfvcRating::Undefined => write!(f, "undefined"),
+            ContentRatingBfvcRating::BfvcUnspecified => write!(f, "bfvcUnspecified"),
+            ContentRatingBfvcRating::BfvcG => write!(f, "bfvcG"),
+            ContentRatingBfvcRating::BfvcE => write!(f, "bfvcE"),
+            ContentRatingBfvcRating::Bfvc13 => write!(f, "bfvc13"),
+            ContentRatingBfvcRating::Bfvc15 => write!(f, "bfvc15"),
+            ContentRatingBfvcRating::Bfvc18 => write!(f, "bfvc18"),
+            ContentRatingBfvcRating::Bfvc20 => write!(f, "bfvc20"),
+            ContentRatingBfvcRating::BfvcB => write!(f, "bfvcB"),
+            ContentRatingBfvcRating::BfvcUnrated => write!(f, "bfvcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingPefilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "pefilmUnspecified")]
+    PefilmUnspecified,
+    /// PT
+    #[serde(rename = "pefilmPt")]
+    PefilmPt,
+    /// PG
+    #[serde(rename = "pefilmPg")]
+    PefilmPg,
+    /// 14
+    #[serde(rename = "pefilm14")]
+    Pefilm14,
+    /// 18
+    #[serde(rename = "pefilm18")]
+    Pefilm18,
+    ///
+    #[serde(rename = "pefilmUnrated")]
+    PefilmUnrated,
+}
+
+impl std::default::Default for ContentRatingPefilmRating {
+    fn default() -> ContentRatingPefilmRating {
+        ContentRatingPefilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingPefilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingPefilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingPefilmRating::PefilmUnspecified => write!(f, "pefilmUnspecified"),
+            ContentRatingPefilmRating::PefilmPt => write!(f, "pefilmPt"),
+            ContentRatingPefilmRating::PefilmPg => write!(f, "pefilmPg"),
+            ContentRatingPefilmRating::Pefilm14 => write!(f, "pefilm14"),
+            ContentRatingPefilmRating::Pefilm18 => write!(f, "pefilm18"),
+            ContentRatingPefilmRating::PefilmUnrated => write!(f, "pefilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCsaRating {
+    Undefined,
+    ///
+    #[serde(rename = "csaUnspecified")]
+    CsaUnspecified,
+    /// T
+    #[serde(rename = "csaT")]
+    CsaT,
+    /// 10
+    #[serde(rename = "csa10")]
+    Csa10,
+    /// 12
+    #[serde(rename = "csa12")]
+    Csa12,
+    /// 16
+    #[serde(rename = "csa16")]
+    Csa16,
+    /// 18
+    #[serde(rename = "csa18")]
+    Csa18,
+    /// Interdiction
+    #[serde(rename = "csaInterdiction")]
+    CsaInterdiction,
+    ///
+    #[serde(rename = "csaUnrated")]
+    CsaUnrated,
+}
+
+impl std::default::Default for ContentRatingCsaRating {
+    fn default() -> ContentRatingCsaRating {
+        ContentRatingCsaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCsaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCsaRating::Undefined => write!(f, "undefined"),
+            ContentRatingCsaRating::CsaUnspecified => write!(f, "csaUnspecified"),
+            ContentRatingCsaRating::CsaT => write!(f, "csaT"),
+            ContentRatingCsaRating::Csa10 => write!(f, "csa10"),
+            ContentRatingCsaRating::Csa12 => write!(f, "csa12"),
+            ContentRatingCsaRating::Csa16 => write!(f, "csa16"),
+            ContentRatingCsaRating::Csa18 => write!(f, "csa18"),
+            ContentRatingCsaRating::CsaInterdiction => write!(f, "csaInterdiction"),
+            ContentRatingCsaRating::CsaUnrated => write!(f, "csaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEgfilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "egfilmUnspecified")]
+    EgfilmUnspecified,
+    /// GN
+    #[serde(rename = "egfilmGn")]
+    EgfilmGn,
+    /// 18
+    #[serde(rename = "egfilm18")]
+    Egfilm18,
+    /// BN
+    #[serde(rename = "egfilmBn")]
+    EgfilmBn,
+    ///
+    #[serde(rename = "egfilmUnrated")]
+    EgfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingEgfilmRating {
+    fn default() -> ContentRatingEgfilmRating {
+        ContentRatingEgfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEgfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEgfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingEgfilmRating::EgfilmUnspecified => write!(f, "egfilmUnspecified"),
+            ContentRatingEgfilmRating::EgfilmGn => write!(f, "egfilmGn"),
+            ContentRatingEgfilmRating::Egfilm18 => write!(f, "egfilm18"),
+            ContentRatingEgfilmRating::EgfilmBn => write!(f, "egfilmBn"),
+            ContentRatingEgfilmRating::EgfilmUnrated => write!(f, "egfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFcbmRating {
+    Undefined,
+    ///
+    #[serde(rename = "fcbmUnspecified")]
+    FcbmUnspecified,
+    /// U
+    #[serde(rename = "fcbmU")]
+    FcbmU,
+    /// PG13
+    #[serde(rename = "fcbmPg13")]
+    FcbmPg13,
+    /// P13
+    #[serde(rename = "fcbmP13")]
+    FcbmP13,
+    /// 18
+    #[serde(rename = "fcbm18")]
+    Fcbm18,
+    /// 18SX
+    #[serde(rename = "fcbm18sx")]
+    Fcbm18sx,
+    /// 18PA
+    #[serde(rename = "fcbm18pa")]
+    Fcbm18pa,
+    /// 18SG
+    #[serde(rename = "fcbm18sg")]
+    Fcbm18sg,
+    /// 18PL
+    #[serde(rename = "fcbm18pl")]
+    Fcbm18pl,
+    ///
+    #[serde(rename = "fcbmUnrated")]
+    FcbmUnrated,
+}
+
+impl std::default::Default for ContentRatingFcbmRating {
+    fn default() -> ContentRatingFcbmRating {
+        ContentRatingFcbmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFcbmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFcbmRating::Undefined => write!(f, "undefined"),
+            ContentRatingFcbmRating::FcbmUnspecified => write!(f, "fcbmUnspecified"),
+            ContentRatingFcbmRating::FcbmU => write!(f, "fcbmU"),
+            ContentRatingFcbmRating::FcbmPg13 => write!(f, "fcbmPg13"),
+            ContentRatingFcbmRating::FcbmP13 => write!(f, "fcbmP13"),
+            ContentRatingFcbmRating::Fcbm18 => write!(f, "fcbm18"),
+            ContentRatingFcbmRating::Fcbm18sx => write!(f, "fcbm18sx"),
+            ContentRatingFcbmRating::Fcbm18pa => write!(f, "fcbm18pa"),
+            ContentRatingFcbmRating::Fcbm18sg => write!(f, "fcbm18sg"),
+            ContentRatingFcbmRating::Fcbm18pl => write!(f, "fcbm18pl"),
+            ContentRatingFcbmRating::FcbmUnrated => write!(f, "fcbmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSkfilmRating {
+    Undefined,
+    ///
+    #[serde(rename = "skfilmUnspecified")]
+    SkfilmUnspecified,
+    /// G
+    #[serde(rename = "skfilmG")]
+    SkfilmG,
+    /// P2
+    #[serde(rename = "skfilmP2")]
+    SkfilmP2,
+    /// P5
+    #[serde(rename = "skfilmP5")]
+    SkfilmP5,
+    /// P8
+    #[serde(rename = "skfilmP8")]
+    SkfilmP8,
+    ///
+    #[serde(rename = "skfilmUnrated")]
+    SkfilmUnrated,
+}
+
+impl std::default::Default for ContentRatingSkfilmRating {
+    fn default() -> ContentRatingSkfilmRating {
+        ContentRatingSkfilmRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingSkfilmRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingSkfilmRating::Undefined => write!(f, "undefined"),
+            ContentRatingSkfilmRating::SkfilmUnspecified => write!(f, "skfilmUnspecified"),
+            ContentRatingSkfilmRating::SkfilmG => write!(f, "skfilmG"),
+            ContentRatingSkfilmRating::SkfilmP2 => write!(f, "skfilmP2"),
+            ContentRatingSkfilmRating::SkfilmP5 => write!(f, "skfilmP5"),
+            ContentRatingSkfilmRating::SkfilmP8 => write!(f, "skfilmP8"),
+            ContentRatingSkfilmRating::SkfilmUnrated => write!(f, "skfilmUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingDjctqRatingReasons {
+    Undefined,
+    ///
+    #[serde(rename = "djctqRatingReasonUnspecified")]
+    DjctqRatingReasonUnspecified,
+    /// Brazil rating content descriptors. See http://go/brazilratings section F. Violência (Violence)
+    #[serde(rename = "djctqViolence")]
+    DjctqViolence,
+    /// Violência extrema (Extreme violence)
+    #[serde(rename = "djctqExtremeViolence")]
+    DjctqExtremeViolence,
+    /// Conteúdo sexual (Sexual content)
+    #[serde(rename = "djctqSexualContent")]
+    DjctqSexualContent,
+    /// Nudez (Nudity)
+    #[serde(rename = "djctqNudity")]
+    DjctqNudity,
+    /// Sexo (Sex)
+    #[serde(rename = "djctqSex")]
+    DjctqSex,
+    /// Sexo Explícito (Explicit sex)
+    #[serde(rename = "djctqExplicitSex")]
+    DjctqExplicitSex,
+    /// Drogas (Drugs)
+    #[serde(rename = "djctqDrugs")]
+    DjctqDrugs,
+    /// Drogas Lícitas (Legal drugs)
+    #[serde(rename = "djctqLegalDrugs")]
+    DjctqLegalDrugs,
+    /// Drogas Ilícitas (Illegal drugs)
+    #[serde(rename = "djctqIllegalDrugs")]
+    DjctqIllegalDrugs,
+    /// Linguagem Imprópria (Inappropriate language)
+    #[serde(rename = "djctqInappropriateLanguage")]
+    DjctqInappropriateLanguage,
+    /// Atos Criminosos (Criminal Acts)
+    #[serde(rename = "djctqCriminalActs")]
+    DjctqCriminalActs,
+    /// Conteúdo Impactante (Impacting content)
+    #[serde(rename = "djctqImpactingContent")]
+    DjctqImpactingContent,
+}
+
+impl std::default::Default for ContentRatingDjctqRatingReasons {
+    fn default() -> ContentRatingDjctqRatingReasons {
+        ContentRatingDjctqRatingReasons::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingDjctqRatingReasons {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingDjctqRatingReasons::Undefined => write!(f, "undefined"),
+            ContentRatingDjctqRatingReasons::DjctqRatingReasonUnspecified => {
+                write!(f, "djctqRatingReasonUnspecified")
+            }
+            ContentRatingDjctqRatingReasons::DjctqViolence => write!(f, "djctqViolence"),
+            ContentRatingDjctqRatingReasons::DjctqExtremeViolence => {
+                write!(f, "djctqExtremeViolence")
+            }
+            ContentRatingDjctqRatingReasons::DjctqSexualContent => write!(f, "djctqSexualContent"),
+            ContentRatingDjctqRatingReasons::DjctqNudity => write!(f, "djctqNudity"),
+            ContentRatingDjctqRatingReasons::DjctqSex => write!(f, "djctqSex"),
+            ContentRatingDjctqRatingReasons::DjctqExplicitSex => write!(f, "djctqExplicitSex"),
+            ContentRatingDjctqRatingReasons::DjctqDrugs => write!(f, "djctqDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqLegalDrugs => write!(f, "djctqLegalDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqIllegalDrugs => write!(f, "djctqIllegalDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqInappropriateLanguage => {
+                write!(f, "djctqInappropriateLanguage")
+            }
+            ContentRatingDjctqRatingReasons::DjctqCriminalActs => write!(f, "djctqCriminalActs"),
+            ContentRatingDjctqRatingReasons::DjctqImpactingContent => {
+                write!(f, "djctqImpactingContent")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNmcRating {
+    Undefined,
+    ///
+    #[serde(rename = "nmcUnspecified")]
+    NmcUnspecified,
+    /// G
+    #[serde(rename = "nmcG")]
+    NmcG,
+    /// PG
+    #[serde(rename = "nmcPg")]
+    NmcPg,
+    /// PG-13
+    #[serde(rename = "nmcPg13")]
+    NmcPg13,
+    /// PG-15
+    #[serde(rename = "nmcPg15")]
+    NmcPg15,
+    /// 15+
+    #[serde(rename = "nmc15plus")]
+    Nmc15plus,
+    /// 18+
+    #[serde(rename = "nmc18plus")]
+    Nmc18plus,
+    /// 18TC
+    #[serde(rename = "nmc18tc")]
+    Nmc18tc,
+    ///
+    #[serde(rename = "nmcUnrated")]
+    NmcUnrated,
+}
+
+impl std::default::Default for ContentRatingNmcRating {
+    fn default() -> ContentRatingNmcRating {
+        ContentRatingNmcRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNmcRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNmcRating::Undefined => write!(f, "undefined"),
+            ContentRatingNmcRating::NmcUnspecified => write!(f, "nmcUnspecified"),
+            ContentRatingNmcRating::NmcG => write!(f, "nmcG"),
+            ContentRatingNmcRating::NmcPg => write!(f, "nmcPg"),
+            ContentRatingNmcRating::NmcPg13 => write!(f, "nmcPg13"),
+            ContentRatingNmcRating::NmcPg15 => write!(f, "nmcPg15"),
+            ContentRatingNmcRating::Nmc15plus => write!(f, "nmc15plus"),
+            ContentRatingNmcRating::Nmc18plus => write!(f, "nmc18plus"),
+            ContentRatingNmcRating::Nmc18tc => write!(f, "nmc18tc"),
+            ContentRatingNmcRating::NmcUnrated => write!(f, "nmcUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMdaRating {
+    Undefined,
+    ///
+    #[serde(rename = "mdaUnspecified")]
+    MdaUnspecified,
+    /// G
+    #[serde(rename = "mdaG")]
+    MdaG,
+    /// PG
+    #[serde(rename = "mdaPg")]
+    MdaPg,
+    /// PG13
+    #[serde(rename = "mdaPg13")]
+    MdaPg13,
+    /// NC16
+    #[serde(rename = "mdaNc16")]
+    MdaNc16,
+    /// M18
+    #[serde(rename = "mdaM18")]
+    MdaM18,
+    /// R21
+    #[serde(rename = "mdaR21")]
+    MdaR21,
+    ///
+    #[serde(rename = "mdaUnrated")]
+    MdaUnrated,
+}
+
+impl std::default::Default for ContentRatingMdaRating {
+    fn default() -> ContentRatingMdaRating {
+        ContentRatingMdaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMdaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMdaRating::Undefined => write!(f, "undefined"),
+            ContentRatingMdaRating::MdaUnspecified => write!(f, "mdaUnspecified"),
+            ContentRatingMdaRating::MdaG => write!(f, "mdaG"),
+            ContentRatingMdaRating::MdaPg => write!(f, "mdaPg"),
+            ContentRatingMdaRating::MdaPg13 => write!(f, "mdaPg13"),
+            ContentRatingMdaRating::MdaNc16 => write!(f, "mdaNc16"),
+            ContentRatingMdaRating::MdaM18 => write!(f, "mdaM18"),
+            ContentRatingMdaRating::MdaR21 => write!(f, "mdaR21"),
+            ContentRatingMdaRating::MdaUnrated => write!(f, "mdaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCnaRating {
+    Undefined,
+    ///
+    #[serde(rename = "cnaUnspecified")]
+    CnaUnspecified,
+    /// AP
+    #[serde(rename = "cnaAp")]
+    CnaAp,
+    /// 12
+    #[serde(rename = "cna12")]
+    Cna12,
+    /// 15
+    #[serde(rename = "cna15")]
+    Cna15,
+    /// 18
+    #[serde(rename = "cna18")]
+    Cna18,
+    /// 18+
+    #[serde(rename = "cna18plus")]
+    Cna18plus,
+    ///
+    #[serde(rename = "cnaUnrated")]
+    CnaUnrated,
+}
+
+impl std::default::Default for ContentRatingCnaRating {
+    fn default() -> ContentRatingCnaRating {
+        ContentRatingCnaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCnaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCnaRating::Undefined => write!(f, "undefined"),
+            ContentRatingCnaRating::CnaUnspecified => write!(f, "cnaUnspecified"),
+            ContentRatingCnaRating::CnaAp => write!(f, "cnaAp"),
+            ContentRatingCnaRating::Cna12 => write!(f, "cna12"),
+            ContentRatingCnaRating::Cna15 => write!(f, "cna15"),
+            ContentRatingCnaRating::Cna18 => write!(f, "cna18"),
+            ContentRatingCnaRating::Cna18plus => write!(f, "cna18plus"),
+            ContentRatingCnaRating::CnaUnrated => write!(f, "cnaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIfcoRating {
+    Undefined,
+    ///
+    #[serde(rename = "ifcoUnspecified")]
+    IfcoUnspecified,
+    /// G
+    #[serde(rename = "ifcoG")]
+    IfcoG,
+    /// PG
+    #[serde(rename = "ifcoPg")]
+    IfcoPg,
+    /// 12
+    #[serde(rename = "ifco12")]
+    Ifco12,
+    /// 12A
+    #[serde(rename = "ifco12a")]
+    Ifco12a,
+    /// 15
+    #[serde(rename = "ifco15")]
+    Ifco15,
+    /// 15A
+    #[serde(rename = "ifco15a")]
+    Ifco15a,
+    /// 16
+    #[serde(rename = "ifco16")]
+    Ifco16,
+    /// 18
+    #[serde(rename = "ifco18")]
+    Ifco18,
+    ///
+    #[serde(rename = "ifcoUnrated")]
+    IfcoUnrated,
+}
+
+impl std::default::Default for ContentRatingIfcoRating {
+    fn default() -> ContentRatingIfcoRating {
+        ContentRatingIfcoRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIfcoRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIfcoRating::Undefined => write!(f, "undefined"),
+            ContentRatingIfcoRating::IfcoUnspecified => write!(f, "ifcoUnspecified"),
+            ContentRatingIfcoRating::IfcoG => write!(f, "ifcoG"),
+            ContentRatingIfcoRating::IfcoPg => write!(f, "ifcoPg"),
+            ContentRatingIfcoRating::Ifco12 => write!(f, "ifco12"),
+            ContentRatingIfcoRating::Ifco12a => write!(f, "ifco12a"),
+            ContentRatingIfcoRating::Ifco15 => write!(f, "ifco15"),
+            ContentRatingIfcoRating::Ifco15a => write!(f, "ifco15a"),
+            ContentRatingIfcoRating::Ifco16 => write!(f, "ifco16"),
+            ContentRatingIfcoRating::Ifco18 => write!(f, "ifco18"),
+            ContentRatingIfcoRating::IfcoUnrated => write!(f, "ifcoUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAcbRating {
+    Undefined,
+    ///
+    #[serde(rename = "acbUnspecified")]
+    AcbUnspecified,
+    /// E
+    #[serde(rename = "acbE")]
+    AcbE,
+    /// Programs that have been given a P classification by the Australian Communications and Media Authority. These programs are intended for preschool children.
+    #[serde(rename = "acbP")]
+    AcbP,
+    /// Programs that have been given a C classification by the Australian Communications and Media Authority. These programs are intended for children (other than preschool children) who are younger than 14 years of age.
+    #[serde(rename = "acbC")]
+    AcbC,
+    /// G
+    #[serde(rename = "acbG")]
+    AcbG,
+    /// PG
+    #[serde(rename = "acbPg")]
+    AcbPg,
+    /// M
+    #[serde(rename = "acbM")]
+    AcbM,
+    /// MA15+
+    #[serde(rename = "acbMa15plus")]
+    AcbMa15plus,
+    /// R18+
+    #[serde(rename = "acbR18plus")]
+    AcbR18plus,
+    ///
+    #[serde(rename = "acbUnrated")]
+    AcbUnrated,
+}
+
+impl std::default::Default for ContentRatingAcbRating {
+    fn default() -> ContentRatingAcbRating {
+        ContentRatingAcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingAcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingAcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingAcbRating::AcbUnspecified => write!(f, "acbUnspecified"),
+            ContentRatingAcbRating::AcbE => write!(f, "acbE"),
+            ContentRatingAcbRating::AcbP => write!(f, "acbP"),
+            ContentRatingAcbRating::AcbC => write!(f, "acbC"),
+            ContentRatingAcbRating::AcbG => write!(f, "acbG"),
+            ContentRatingAcbRating::AcbPg => write!(f, "acbPg"),
+            ContentRatingAcbRating::AcbM => write!(f, "acbM"),
+            ContentRatingAcbRating::AcbMa15plus => write!(f, "acbMa15plus"),
+            ContentRatingAcbRating::AcbR18plus => write!(f, "acbR18plus"),
+            ContentRatingAcbRating::AcbUnrated => write!(f, "acbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMocRating {
+    Undefined,
+    ///
+    #[serde(rename = "mocUnspecified")]
+    MocUnspecified,
+    /// E
+    #[serde(rename = "mocE")]
+    MocE,
+    /// T
+    #[serde(rename = "mocT")]
+    MocT,
+    /// 7
+    #[serde(rename = "moc7")]
+    Moc7,
+    /// 12
+    #[serde(rename = "moc12")]
+    Moc12,
+    /// 15
+    #[serde(rename = "moc15")]
+    Moc15,
+    /// 18
+    #[serde(rename = "moc18")]
+    Moc18,
+    /// X
+    #[serde(rename = "mocX")]
+    MocX,
+    /// Banned
+    #[serde(rename = "mocBanned")]
+    MocBanned,
+    ///
+    #[serde(rename = "mocUnrated")]
+    MocUnrated,
+}
+
+impl std::default::Default for ContentRatingMocRating {
+    fn default() -> ContentRatingMocRating {
+        ContentRatingMocRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMocRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMocRating::Undefined => write!(f, "undefined"),
+            ContentRatingMocRating::MocUnspecified => write!(f, "mocUnspecified"),
+            ContentRatingMocRating::MocE => write!(f, "mocE"),
+            ContentRatingMocRating::MocT => write!(f, "mocT"),
+            ContentRatingMocRating::Moc7 => write!(f, "moc7"),
+            ContentRatingMocRating::Moc12 => write!(f, "moc12"),
+            ContentRatingMocRating::Moc15 => write!(f, "moc15"),
+            ContentRatingMocRating::Moc18 => write!(f, "moc18"),
+            ContentRatingMocRating::MocX => write!(f, "mocX"),
+            ContentRatingMocRating::MocBanned => write!(f, "mocBanned"),
+            ContentRatingMocRating::MocUnrated => write!(f, "mocUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIncaaRating {
+    Undefined,
+    ///
+    #[serde(rename = "incaaUnspecified")]
+    IncaaUnspecified,
+    /// ATP (Apta para todo publico)
+    #[serde(rename = "incaaAtp")]
+    IncaaAtp,
+    /// 13 (Solo apta para mayores de 13 años)
+    #[serde(rename = "incaaSam13")]
+    IncaaSam13,
+    /// 16 (Solo apta para mayores de 16 años)
+    #[serde(rename = "incaaSam16")]
+    IncaaSam16,
+    /// 18 (Solo apta para mayores de 18 años)
+    #[serde(rename = "incaaSam18")]
+    IncaaSam18,
+    /// X (Solo apta para mayores de 18 años, de exhibición condicionada)
+    #[serde(rename = "incaaC")]
+    IncaaC,
+    ///
+    #[serde(rename = "incaaUnrated")]
+    IncaaUnrated,
+}
+
+impl std::default::Default for ContentRatingIncaaRating {
+    fn default() -> ContentRatingIncaaRating {
+        ContentRatingIncaaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingIncaaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingIncaaRating::Undefined => write!(f, "undefined"),
+            ContentRatingIncaaRating::IncaaUnspecified => write!(f, "incaaUnspecified"),
+            ContentRatingIncaaRating::IncaaAtp => write!(f, "incaaAtp"),
+            ContentRatingIncaaRating::IncaaSam13 => write!(f, "incaaSam13"),
+            ContentRatingIncaaRating::IncaaSam16 => write!(f, "incaaSam16"),
+            ContentRatingIncaaRating::IncaaSam18 => write!(f, "incaaSam18"),
+            ContentRatingIncaaRating::IncaaC => write!(f, "incaaC"),
+            ContentRatingIncaaRating::IncaaUnrated => write!(f, "incaaUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFskRating {
+    Undefined,
+    ///
+    #[serde(rename = "fskUnspecified")]
+    FskUnspecified,
+    /// FSK 0
+    #[serde(rename = "fsk0")]
+    Fsk0,
+    /// FSK 6
+    #[serde(rename = "fsk6")]
+    Fsk6,
+    /// FSK 12
+    #[serde(rename = "fsk12")]
+    Fsk12,
+    /// FSK 16
+    #[serde(rename = "fsk16")]
+    Fsk16,
+    /// FSK 18
+    #[serde(rename = "fsk18")]
+    Fsk18,
+    ///
+    #[serde(rename = "fskUnrated")]
+    FskUnrated,
+}
+
+impl std::default::Default for ContentRatingFskRating {
+    fn default() -> ContentRatingFskRating {
+        ContentRatingFskRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFskRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFskRating::Undefined => write!(f, "undefined"),
+            ContentRatingFskRating::FskUnspecified => write!(f, "fskUnspecified"),
+            ContentRatingFskRating::Fsk0 => write!(f, "fsk0"),
+            ContentRatingFskRating::Fsk6 => write!(f, "fsk6"),
+            ContentRatingFskRating::Fsk12 => write!(f, "fsk12"),
+            ContentRatingFskRating::Fsk16 => write!(f, "fsk16"),
+            ContentRatingFskRating::Fsk18 => write!(f, "fsk18"),
+            ContentRatingFskRating::FskUnrated => write!(f, "fskUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBmukkRating {
+    Undefined,
+    ///
+    #[serde(rename = "bmukkUnspecified")]
+    BmukkUnspecified,
+    /// Unrestricted
+    #[serde(rename = "bmukkAa")]
+    BmukkAa,
+    /// 6+
+    #[serde(rename = "bmukk6")]
+    Bmukk6,
+    /// 8+
+    #[serde(rename = "bmukk8")]
+    Bmukk8,
+    /// 10+
+    #[serde(rename = "bmukk10")]
+    Bmukk10,
+    /// 12+
+    #[serde(rename = "bmukk12")]
+    Bmukk12,
+    /// 14+
+    #[serde(rename = "bmukk14")]
+    Bmukk14,
+    /// 16+
+    #[serde(rename = "bmukk16")]
+    Bmukk16,
+    ///
+    #[serde(rename = "bmukkUnrated")]
+    BmukkUnrated,
+}
+
+impl std::default::Default for ContentRatingBmukkRating {
+    fn default() -> ContentRatingBmukkRating {
+        ContentRatingBmukkRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingBmukkRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingBmukkRating::Undefined => write!(f, "undefined"),
+            ContentRatingBmukkRating::BmukkUnspecified => write!(f, "bmukkUnspecified"),
+            ContentRatingBmukkRating::BmukkAa => write!(f, "bmukkAa"),
+            ContentRatingBmukkRating::Bmukk6 => write!(f, "bmukk6"),
+            ContentRatingBmukkRating::Bmukk8 => write!(f, "bmukk8"),
+            ContentRatingBmukkRating::Bmukk10 => write!(f, "bmukk10"),
+            ContentRatingBmukkRating::Bmukk12 => write!(f, "bmukk12"),
+            ContentRatingBmukkRating::Bmukk14 => write!(f, "bmukk14"),
+            ContentRatingBmukkRating::Bmukk16 => write!(f, "bmukk16"),
+            ContentRatingBmukkRating::BmukkUnrated => write!(f, "bmukkUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKfcbRating {
+    Undefined,
+    ///
+    #[serde(rename = "kfcbUnspecified")]
+    KfcbUnspecified,
+    /// GE
+    #[serde(rename = "kfcbG")]
+    KfcbG,
+    /// PG
+    #[serde(rename = "kfcbPg")]
+    KfcbPg,
+    /// 16
+    #[serde(rename = "kfcb16plus")]
+    Kfcb16plus,
+    /// 18
+    #[serde(rename = "kfcbR")]
+    KfcbR,
+    ///
+    #[serde(rename = "kfcbUnrated")]
+    KfcbUnrated,
+}
+
+impl std::default::Default for ContentRatingKfcbRating {
+    fn default() -> ContentRatingKfcbRating {
+        ContentRatingKfcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingKfcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingKfcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingKfcbRating::KfcbUnspecified => write!(f, "kfcbUnspecified"),
+            ContentRatingKfcbRating::KfcbG => write!(f, "kfcbG"),
+            ContentRatingKfcbRating::KfcbPg => write!(f, "kfcbPg"),
+            ContentRatingKfcbRating::Kfcb16plus => write!(f, "kfcb16plus"),
+            ContentRatingKfcbRating::KfcbR => write!(f, "kfcbR"),
+            ContentRatingKfcbRating::KfcbUnrated => write!(f, "kfcbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNfvcbRating {
+    Undefined,
+    ///
+    #[serde(rename = "nfvcbUnspecified")]
+    NfvcbUnspecified,
+    /// G
+    #[serde(rename = "nfvcbG")]
+    NfvcbG,
+    /// PG
+    #[serde(rename = "nfvcbPg")]
+    NfvcbPg,
+    /// 12
+    #[serde(rename = "nfvcb12")]
+    Nfvcb12,
+    /// 12A
+    #[serde(rename = "nfvcb12a")]
+    Nfvcb12a,
+    /// 15
+    #[serde(rename = "nfvcb15")]
+    Nfvcb15,
+    /// 18
+    #[serde(rename = "nfvcb18")]
+    Nfvcb18,
+    /// RE
+    #[serde(rename = "nfvcbRe")]
+    NfvcbRe,
+    ///
+    #[serde(rename = "nfvcbUnrated")]
+    NfvcbUnrated,
+}
+
+impl std::default::Default for ContentRatingNfvcbRating {
+    fn default() -> ContentRatingNfvcbRating {
+        ContentRatingNfvcbRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingNfvcbRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingNfvcbRating::Undefined => write!(f, "undefined"),
+            ContentRatingNfvcbRating::NfvcbUnspecified => write!(f, "nfvcbUnspecified"),
+            ContentRatingNfvcbRating::NfvcbG => write!(f, "nfvcbG"),
+            ContentRatingNfvcbRating::NfvcbPg => write!(f, "nfvcbPg"),
+            ContentRatingNfvcbRating::Nfvcb12 => write!(f, "nfvcb12"),
+            ContentRatingNfvcbRating::Nfvcb12a => write!(f, "nfvcb12a"),
+            ContentRatingNfvcbRating::Nfvcb15 => write!(f, "nfvcb15"),
+            ContentRatingNfvcbRating::Nfvcb18 => write!(f, "nfvcb18"),
+            ContentRatingNfvcbRating::NfvcbRe => write!(f, "nfvcbRe"),
+            ContentRatingNfvcbRating::NfvcbUnrated => write!(f, "nfvcbUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFmocRating {
+    Undefined,
+    ///
+    #[serde(rename = "fmocUnspecified")]
+    FmocUnspecified,
+    /// U
+    #[serde(rename = "fmocU")]
+    FmocU,
+    /// 10
+    #[serde(rename = "fmoc10")]
+    Fmoc10,
+    /// 12
+    #[serde(rename = "fmoc12")]
+    Fmoc12,
+    /// 16
+    #[serde(rename = "fmoc16")]
+    Fmoc16,
+    /// 18
+    #[serde(rename = "fmoc18")]
+    Fmoc18,
+    /// E
+    #[serde(rename = "fmocE")]
+    FmocE,
+    ///
+    #[serde(rename = "fmocUnrated")]
+    FmocUnrated,
+}
+
+impl std::default::Default for ContentRatingFmocRating {
+    fn default() -> ContentRatingFmocRating {
+        ContentRatingFmocRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingFmocRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingFmocRating::Undefined => write!(f, "undefined"),
+            ContentRatingFmocRating::FmocUnspecified => write!(f, "fmocUnspecified"),
+            ContentRatingFmocRating::FmocU => write!(f, "fmocU"),
+            ContentRatingFmocRating::Fmoc10 => write!(f, "fmoc10"),
+            ContentRatingFmocRating::Fmoc12 => write!(f, "fmoc12"),
+            ContentRatingFmocRating::Fmoc16 => write!(f, "fmoc16"),
+            ContentRatingFmocRating::Fmoc18 => write!(f, "fmoc18"),
+            ContentRatingFmocRating::FmocE => write!(f, "fmocE"),
+            ContentRatingFmocRating::FmocUnrated => write!(f, "fmocUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAnatelRating {
+    Undefined,
+    ///
+    #[serde(rename = "anatelUnspecified")]
+    AnatelUnspecified,
+    /// F
+    #[serde(rename = "anatelF")]
+    AnatelF,
+    /// I
+    #[serde(rename = "anatelI")]
+    AnatelI,
+    /// I-7
+    #[serde(rename = "anatelI7")]
+    AnatelI7,
+    /// I-10
+    #[serde(rename = "anatelI10")]
+    AnatelI10,
+    /// I-12
+    #[serde(rename = "anatelI12")]
+    AnatelI12,
+    /// R
+    #[serde(rename = "anatelR")]
+    AnatelR,
+    /// A
+    #[serde(rename = "anatelA")]
+    AnatelA,
+    ///
+    #[serde(rename = "anatelUnrated")]
+    AnatelUnrated,
+}
+
+impl std::default::Default for ContentRatingAnatelRating {
+    fn default() -> ContentRatingAnatelRating {
+        ContentRatingAnatelRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingAnatelRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingAnatelRating::Undefined => write!(f, "undefined"),
+            ContentRatingAnatelRating::AnatelUnspecified => write!(f, "anatelUnspecified"),
+            ContentRatingAnatelRating::AnatelF => write!(f, "anatelF"),
+            ContentRatingAnatelRating::AnatelI => write!(f, "anatelI"),
+            ContentRatingAnatelRating::AnatelI7 => write!(f, "anatelI7"),
+            ContentRatingAnatelRating::AnatelI10 => write!(f, "anatelI10"),
+            ContentRatingAnatelRating::AnatelI12 => write!(f, "anatelI12"),
+            ContentRatingAnatelRating::AnatelR => write!(f, "anatelR"),
+            ContentRatingAnatelRating::AnatelA => write!(f, "anatelA"),
+            ContentRatingAnatelRating::AnatelUnrated => write!(f, "anatelUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEcbmctRating {
+    Undefined,
+    ///
+    #[serde(rename = "ecbmctUnspecified")]
+    EcbmctUnspecified,
+    /// G
+    #[serde(rename = "ecbmctG")]
+    EcbmctG,
+    /// 7A
+    #[serde(rename = "ecbmct7a")]
+    Ecbmct7a,
+    /// 7+
+    #[serde(rename = "ecbmct7plus")]
+    Ecbmct7plus,
+    /// 13A
+    #[serde(rename = "ecbmct13a")]
+    Ecbmct13a,
+    /// 13+
+    #[serde(rename = "ecbmct13plus")]
+    Ecbmct13plus,
+    /// 15A
+    #[serde(rename = "ecbmct15a")]
+    Ecbmct15a,
+    /// 15+
+    #[serde(rename = "ecbmct15plus")]
+    Ecbmct15plus,
+    /// 18+
+    #[serde(rename = "ecbmct18plus")]
+    Ecbmct18plus,
+    ///
+    #[serde(rename = "ecbmctUnrated")]
+    EcbmctUnrated,
+}
+
+impl std::default::Default for ContentRatingEcbmctRating {
+    fn default() -> ContentRatingEcbmctRating {
+        ContentRatingEcbmctRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingEcbmctRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingEcbmctRating::Undefined => write!(f, "undefined"),
+            ContentRatingEcbmctRating::EcbmctUnspecified => write!(f, "ecbmctUnspecified"),
+            ContentRatingEcbmctRating::EcbmctG => write!(f, "ecbmctG"),
+            ContentRatingEcbmctRating::Ecbmct7a => write!(f, "ecbmct7a"),
+            ContentRatingEcbmctRating::Ecbmct7plus => write!(f, "ecbmct7plus"),
+            ContentRatingEcbmctRating::Ecbmct13a => write!(f, "ecbmct13a"),
+            ContentRatingEcbmctRating::Ecbmct13plus => write!(f, "ecbmct13plus"),
+            ContentRatingEcbmctRating::Ecbmct15a => write!(f, "ecbmct15a"),
+            ContentRatingEcbmctRating::Ecbmct15plus => write!(f, "ecbmct15plus"),
+            ContentRatingEcbmctRating::Ecbmct18plus => write!(f, "ecbmct18plus"),
+            ContentRatingEcbmctRating::EcbmctUnrated => write!(f, "ecbmctUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingLsfRating {
+    Undefined,
+    ///
+    #[serde(rename = "lsfUnspecified")]
+    LsfUnspecified,
+    /// SU
+    #[serde(rename = "lsfSu")]
+    LsfSu,
+    /// A
+    #[serde(rename = "lsfA")]
+    LsfA,
+    /// BO
+    #[serde(rename = "lsfBo")]
+    LsfBo,
+    /// 13
+    #[serde(rename = "lsf13")]
+    Lsf13,
+    /// R
+    #[serde(rename = "lsfR")]
+    LsfR,
+    /// 17
+    #[serde(rename = "lsf17")]
+    Lsf17,
+    /// D
+    #[serde(rename = "lsfD")]
+    LsfD,
+    /// 21
+    #[serde(rename = "lsf21")]
+    Lsf21,
+    ///
+    #[serde(rename = "lsfUnrated")]
+    LsfUnrated,
+}
+
+impl std::default::Default for ContentRatingLsfRating {
+    fn default() -> ContentRatingLsfRating {
+        ContentRatingLsfRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingLsfRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingLsfRating::Undefined => write!(f, "undefined"),
+            ContentRatingLsfRating::LsfUnspecified => write!(f, "lsfUnspecified"),
+            ContentRatingLsfRating::LsfSu => write!(f, "lsfSu"),
+            ContentRatingLsfRating::LsfA => write!(f, "lsfA"),
+            ContentRatingLsfRating::LsfBo => write!(f, "lsfBo"),
+            ContentRatingLsfRating::Lsf13 => write!(f, "lsf13"),
+            ContentRatingLsfRating::LsfR => write!(f, "lsfR"),
+            ContentRatingLsfRating::Lsf17 => write!(f, "lsf17"),
+            ContentRatingLsfRating::LsfD => write!(f, "lsfD"),
+            ContentRatingLsfRating::Lsf21 => write!(f, "lsf21"),
+            ContentRatingLsfRating::LsfUnrated => write!(f, "lsfUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCncRating {
+    Undefined,
+    ///
+    #[serde(rename = "cncUnspecified")]
+    CncUnspecified,
+    /// T
+    #[serde(rename = "cncT")]
+    CncT,
+    /// 10
+    #[serde(rename = "cnc10")]
+    Cnc10,
+    /// 12
+    #[serde(rename = "cnc12")]
+    Cnc12,
+    /// 16
+    #[serde(rename = "cnc16")]
+    Cnc16,
+    /// 18
+    #[serde(rename = "cnc18")]
+    Cnc18,
+    /// E
+    #[serde(rename = "cncE")]
+    CncE,
+    /// interdiction
+    #[serde(rename = "cncInterdiction")]
+    CncInterdiction,
+    ///
+    #[serde(rename = "cncUnrated")]
+    CncUnrated,
+}
+
+impl std::default::Default for ContentRatingCncRating {
+    fn default() -> ContentRatingCncRating {
+        ContentRatingCncRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCncRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCncRating::Undefined => write!(f, "undefined"),
+            ContentRatingCncRating::CncUnspecified => write!(f, "cncUnspecified"),
+            ContentRatingCncRating::CncT => write!(f, "cncT"),
+            ContentRatingCncRating::Cnc10 => write!(f, "cnc10"),
+            ContentRatingCncRating::Cnc12 => write!(f, "cnc12"),
+            ContentRatingCncRating::Cnc16 => write!(f, "cnc16"),
+            ContentRatingCncRating::Cnc18 => write!(f, "cnc18"),
+            ContentRatingCncRating::CncE => write!(f, "cncE"),
+            ContentRatingCncRating::CncInterdiction => write!(f, "cncInterdiction"),
+            ContentRatingCncRating::CncUnrated => write!(f, "cncUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMpaatRating {
+    Undefined,
+    ///
+    #[serde(rename = "mpaatUnspecified")]
+    MpaatUnspecified,
+    /// GB
+    #[serde(rename = "mpaatGb")]
+    MpaatGb,
+    /// RB
+    #[serde(rename = "mpaatRb")]
+    MpaatRb,
+}
+
+impl std::default::Default for ContentRatingMpaatRating {
+    fn default() -> ContentRatingMpaatRating {
+        ContentRatingMpaatRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingMpaatRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingMpaatRating::Undefined => write!(f, "undefined"),
+            ContentRatingMpaatRating::MpaatUnspecified => write!(f, "mpaatUnspecified"),
+            ContentRatingMpaatRating::MpaatGb => write!(f, "mpaatGb"),
+            ContentRatingMpaatRating::MpaatRb => write!(f, "mpaatRb"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCccRating {
+    Undefined,
+    ///
+    #[serde(rename = "cccUnspecified")]
+    CccUnspecified,
+    /// Todo espectador
+    #[serde(rename = "cccTe")]
+    CccTe,
+    /// 6+ - Inconveniente para menores de 7 años
+    #[serde(rename = "ccc6")]
+    Ccc6,
+    /// 14+
+    #[serde(rename = "ccc14")]
+    Ccc14,
+    /// 18+
+    #[serde(rename = "ccc18")]
+    Ccc18,
+    /// 18+ - contenido excesivamente violento
+    #[serde(rename = "ccc18v")]
+    Ccc18v,
+    /// 18+ - contenido pornográfico
+    #[serde(rename = "ccc18s")]
+    Ccc18s,
+    ///
+    #[serde(rename = "cccUnrated")]
+    CccUnrated,
+}
+
+impl std::default::Default for ContentRatingCccRating {
+    fn default() -> ContentRatingCccRating {
+        ContentRatingCccRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCccRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCccRating::Undefined => write!(f, "undefined"),
+            ContentRatingCccRating::CccUnspecified => write!(f, "cccUnspecified"),
+            ContentRatingCccRating::CccTe => write!(f, "cccTe"),
+            ContentRatingCccRating::Ccc6 => write!(f, "ccc6"),
+            ContentRatingCccRating::Ccc14 => write!(f, "ccc14"),
+            ContentRatingCccRating::Ccc18 => write!(f, "ccc18"),
+            ContentRatingCccRating::Ccc18v => write!(f, "ccc18v"),
+            ContentRatingCccRating::Ccc18s => write!(f, "ccc18s"),
+            ContentRatingCccRating::CccUnrated => write!(f, "cccUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCatvRating {
+    Undefined,
+    ///
+    #[serde(rename = "catvUnspecified")]
+    CatvUnspecified,
+    /// C
+    #[serde(rename = "catvC")]
+    CatvC,
+    /// C8
+    #[serde(rename = "catvC8")]
+    CatvC8,
+    /// G
+    #[serde(rename = "catvG")]
+    CatvG,
+    /// PG
+    #[serde(rename = "catvPg")]
+    CatvPg,
+    /// 14+
+    #[serde(rename = "catv14plus")]
+    Catv14plus,
+    /// 18+
+    #[serde(rename = "catv18plus")]
+    Catv18plus,
+    ///
+    #[serde(rename = "catvUnrated")]
+    CatvUnrated,
+    ///
+    #[serde(rename = "catvE")]
+    CatvE,
+}
+
+impl std::default::Default for ContentRatingCatvRating {
+    fn default() -> ContentRatingCatvRating {
+        ContentRatingCatvRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCatvRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCatvRating::Undefined => write!(f, "undefined"),
+            ContentRatingCatvRating::CatvUnspecified => write!(f, "catvUnspecified"),
+            ContentRatingCatvRating::CatvC => write!(f, "catvC"),
+            ContentRatingCatvRating::CatvC8 => write!(f, "catvC8"),
+            ContentRatingCatvRating::CatvG => write!(f, "catvG"),
+            ContentRatingCatvRating::CatvPg => write!(f, "catvPg"),
+            ContentRatingCatvRating::Catv14plus => write!(f, "catv14plus"),
+            ContentRatingCatvRating::Catv18plus => write!(f, "catv18plus"),
+            ContentRatingCatvRating::CatvUnrated => write!(f, "catvUnrated"),
+            ContentRatingCatvRating::CatvE => write!(f, "catvE"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCscfRating {
+    Undefined,
+    ///
+    #[serde(rename = "cscfUnspecified")]
+    CscfUnspecified,
+    /// AL
+    #[serde(rename = "cscfAl")]
+    CscfAl,
+    /// A
+    #[serde(rename = "cscfA")]
+    CscfA,
+    /// 6
+    #[serde(rename = "cscf6")]
+    Cscf6,
+    /// 9
+    #[serde(rename = "cscf9")]
+    Cscf9,
+    /// 12
+    #[serde(rename = "cscf12")]
+    Cscf12,
+    /// 16
+    #[serde(rename = "cscf16")]
+    Cscf16,
+    /// 18
+    #[serde(rename = "cscf18")]
+    Cscf18,
+    ///
+    #[serde(rename = "cscfUnrated")]
+    CscfUnrated,
+}
+
+impl std::default::Default for ContentRatingCscfRating {
+    fn default() -> ContentRatingCscfRating {
+        ContentRatingCscfRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingCscfRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingCscfRating::Undefined => write!(f, "undefined"),
+            ContentRatingCscfRating::CscfUnspecified => write!(f, "cscfUnspecified"),
+            ContentRatingCscfRating::CscfAl => write!(f, "cscfAl"),
+            ContentRatingCscfRating::CscfA => write!(f, "cscfA"),
+            ContentRatingCscfRating::Cscf6 => write!(f, "cscf6"),
+            ContentRatingCscfRating::Cscf9 => write!(f, "cscf9"),
+            ContentRatingCscfRating::Cscf12 => write!(f, "cscf12"),
+            ContentRatingCscfRating::Cscf16 => write!(f, "cscf16"),
+            ContentRatingCscfRating::Cscf18 => write!(f, "cscf18"),
+            ContentRatingCscfRating::CscfUnrated => write!(f, "cscfUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingResorteviolenciaRating {
+    Undefined,
+    ///
+    #[serde(rename = "resorteviolenciaUnspecified")]
+    ResorteviolenciaUnspecified,
+    /// A
+    #[serde(rename = "resorteviolenciaA")]
+    ResorteviolenciaA,
+    /// B
+    #[serde(rename = "resorteviolenciaB")]
+    ResorteviolenciaB,
+    /// C
+    #[serde(rename = "resorteviolenciaC")]
+    ResorteviolenciaC,
+    /// D
+    #[serde(rename = "resorteviolenciaD")]
+    ResorteviolenciaD,
+    /// E
+    #[serde(rename = "resorteviolenciaE")]
+    ResorteviolenciaE,
+    ///
+    #[serde(rename = "resorteviolenciaUnrated")]
+    ResorteviolenciaUnrated,
+}
+
+impl std::default::Default for ContentRatingResorteviolenciaRating {
+    fn default() -> ContentRatingResorteviolenciaRating {
+        ContentRatingResorteviolenciaRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingResorteviolenciaRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingResorteviolenciaRating::Undefined => write!(f, "undefined"),
+            ContentRatingResorteviolenciaRating::ResorteviolenciaUnspecified => {
+                write!(f, "resorteviolenciaUnspecified")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaA => {
+                write!(f, "resorteviolenciaA")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaB => {
+                write!(f, "resorteviolenciaB")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaC => {
+                write!(f, "resorteviolenciaC")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaD => {
+                write!(f, "resorteviolenciaD")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaE => {
+                write!(f, "resorteviolenciaE")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaUnrated => {
+                write!(f, "resorteviolenciaUnrated")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingTvpgRating {
+    Undefined,
+    ///
+    #[serde(rename = "tvpgUnspecified")]
+    TvpgUnspecified,
+    /// TV-Y
+    #[serde(rename = "tvpgY")]
+    TvpgY,
+    /// TV-Y7
+    #[serde(rename = "tvpgY7")]
+    TvpgY7,
+    /// TV-Y7-FV
+    #[serde(rename = "tvpgY7Fv")]
+    TvpgY7Fv,
+    /// TV-G
+    #[serde(rename = "tvpgG")]
+    TvpgG,
+    /// TV-PG
+    #[serde(rename = "tvpgPg")]
+    TvpgPg,
+    /// TV-14
+    #[serde(rename = "pg14")]
+    Pg14,
+    /// TV-MA
+    #[serde(rename = "tvpgMa")]
+    TvpgMa,
+    ///
+    #[serde(rename = "tvpgUnrated")]
+    TvpgUnrated,
+}
+
+impl std::default::Default for ContentRatingTvpgRating {
+    fn default() -> ContentRatingTvpgRating {
+        ContentRatingTvpgRating::Undefined
+    }
+}
+
+impl std::fmt::Display for ContentRatingTvpgRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ContentRatingTvpgRating::Undefined => write!(f, "undefined"),
+            ContentRatingTvpgRating::TvpgUnspecified => write!(f, "tvpgUnspecified"),
+            ContentRatingTvpgRating::TvpgY => write!(f, "tvpgY"),
+            ContentRatingTvpgRating::TvpgY7 => write!(f, "tvpgY7"),
+            ContentRatingTvpgRating::TvpgY7Fv => write!(f, "tvpgY7Fv"),
+            ContentRatingTvpgRating::TvpgG => write!(f, "tvpgG"),
+            ContentRatingTvpgRating::TvpgPg => write!(f, "tvpgPg"),
+            ContentRatingTvpgRating::Pg14 => write!(f, "pg14"),
+            ContentRatingTvpgRating::TvpgMa => write!(f, "tvpgMa"),
+            ContentRatingTvpgRating::TvpgUnrated => write!(f, "tvpgUnrated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoPositionType {
+    Undefined,
+    ///
+    #[serde(rename = "corner")]
+    Corner,
+}
+
+impl std::default::Default for InvideoPositionType {
+    fn default() -> InvideoPositionType {
+        InvideoPositionType::Undefined
+    }
+}
+
+impl std::fmt::Display for InvideoPositionType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            InvideoPositionType::Undefined => write!(f, "undefined"),
+            InvideoPositionType::Corner => write!(f, "corner"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoPositionCornerPosition {
+    Undefined,
+    ///
+    #[serde(rename = "topLeft")]
+    TopLeft,
+    ///
+    #[serde(rename = "topRight")]
+    TopRight,
+    ///
+    #[serde(rename = "bottomLeft")]
+    BottomLeft,
+    ///
+    #[serde(rename = "bottomRight")]
+    BottomRight,
+}
+
+impl std::default::Default for InvideoPositionCornerPosition {
+    fn default() -> InvideoPositionCornerPosition {
+        InvideoPositionCornerPosition::Undefined
+    }
+}
+
+impl std::fmt::Display for InvideoPositionCornerPosition {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            InvideoPositionCornerPosition::Undefined => write!(f, "undefined"),
+            InvideoPositionCornerPosition::TopLeft => write!(f, "topLeft"),
+            InvideoPositionCornerPosition::TopRight => write!(f, "topRight"),
+            InvideoPositionCornerPosition::BottomLeft => write!(f, "bottomLeft"),
+            InvideoPositionCornerPosition::BottomRight => write!(f, "bottomRight"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveStreamHealthStatusStatus {
+    Undefined,
+    ///
+    #[serde(rename = "good")]
+    Good,
+    ///
+    #[serde(rename = "ok")]
+    Ok,
+    ///
+    #[serde(rename = "bad")]
+    Bad,
+    ///
+    #[serde(rename = "noData")]
+    NoData,
+    ///
+    #[serde(rename = "revoked")]
+    Revoked,
+}
+
+impl std::default::Default for LiveStreamHealthStatusStatus {
+    fn default() -> LiveStreamHealthStatusStatus {
+        LiveStreamHealthStatusStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveStreamHealthStatusStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveStreamHealthStatusStatus::Undefined => write!(f, "undefined"),
+            LiveStreamHealthStatusStatus::Good => write!(f, "good"),
+            LiveStreamHealthStatusStatus::Ok => write!(f, "ok"),
+            LiveStreamHealthStatusStatus::Bad => write!(f, "bad"),
+            LiveStreamHealthStatusStatus::NoData => write!(f, "noData"),
+            LiveStreamHealthStatusStatus::Revoked => write!(f, "revoked"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchResultSnippetLiveBroadcastContent {
+    Undefined,
+    ///
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+    /// The live broadcast is active.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast has been completed.
+    #[serde(rename = "completed")]
+    Completed,
+}
+
+impl std::default::Default for SearchResultSnippetLiveBroadcastContent {
+    fn default() -> SearchResultSnippetLiveBroadcastContent {
+        SearchResultSnippetLiveBroadcastContent::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchResultSnippetLiveBroadcastContent {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchResultSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
+            SearchResultSnippetLiveBroadcastContent::None => write!(f, "none"),
+            SearchResultSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
+            SearchResultSnippetLiveBroadcastContent::Live => write!(f, "live"),
+            SearchResultSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum YoutubeParamsAlt {
+    Undefined,
+    /// Responses with Content-Type of application/json
+    #[serde(rename = "json")]
+    Json,
+    /// Media download with context-dependent Content-Type
+    #[serde(rename = "media")]
+    Media,
+    /// Responses with Content-Type of application/x-protobuf
+    #[serde(rename = "proto")]
+    Proto,
+}
+
+impl std::default::Default for YoutubeParamsAlt {
+    fn default() -> YoutubeParamsAlt {
+        YoutubeParamsAlt::Undefined
+    }
+}
+
+impl std::fmt::Display for YoutubeParamsAlt {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            YoutubeParamsAlt::Undefined => write!(f, "undefined"),
+            YoutubeParamsAlt::Json => write!(f, "json"),
+            YoutubeParamsAlt::Media => write!(f, "media"),
+            YoutubeParamsAlt::Proto => write!(f, "proto"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum YoutubeParamsdollar_xgafv {
+    Undefined,
+    /// v1 error format
+    #[serde(rename = "1")]
+    _1,
+    /// v2 error format
+    #[serde(rename = "2")]
+    _2,
+}
+
+impl std::default::Default for YoutubeParamsdollar_xgafv {
+    fn default() -> YoutubeParamsdollar_xgafv {
+        YoutubeParamsdollar_xgafv::Undefined
+    }
+}
+
+impl std::fmt::Display for YoutubeParamsdollar_xgafv {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            YoutubeParamsdollar_xgafv::Undefined => write!(f, "undefined"),
+            YoutubeParamsdollar_xgafv::_1 => write!(f, "1"),
+            YoutubeParamsdollar_xgafv::_2 => write!(f, "2"),
+        };
+        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>,
+    /// 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<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 the comments with the given IDs for One Platform.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-}
-
-impl std::fmt::Display for ActivitiesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.published_before {
-            write!(
-                f,
-                "&publishedBefore={}",
-                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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                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.home {
-            write!(
-                f,
-                "&home={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        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>,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// Returns the captions 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>,
-}
-
-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 {
-            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()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.download` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsDownloadParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// Convert the captions into this format. Supported options are sbv, srt, and vtt.
-    #[serde(rename = "tfmt")]
-    pub tfmt: Option<String>,
-    /// tlang is the language code; machine translate the captions into this language.
-    #[serde(rename = "tlang")]
-    pub tlang: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// 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.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.tfmt {
-            write!(
-                f,
-                "&tfmt={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.tlang {
-            write!(
-                f,
-                "&tlang={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.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>,
-    /// ID of the Google+ Page for the channel that the request is 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 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>,
-}
-
-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 {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync {
-            write!(
-                f,
-                "&sync={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        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>,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// 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.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.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>,
-    /// *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,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `abuseReports.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseReportsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for AbuseReportsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `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.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for mutable properties that are contained in any parts that the request body specifies. For example, a playlist's description is contained in the snippet part, which must be included in the request body. If the request does not specify a value for the snippet.description property, the playlist's existing description will be deleted.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for PlaylistsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlists.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return the playlists owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Returen content 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>,
-    /// Return the playlists with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// *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 playlists owned by the specified channel ID.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The *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,
-}
-
-impl std::fmt::Display for PlaylistsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.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={}",
+}
+
+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.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()
             )?;
         }
@@ -5135,1334 +10999,6 @@
                 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()
-            )?;
-        }
-        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.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlists.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for LiveBroadcastsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.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>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *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>,
-    /// 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_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()
-            )?;
-        }
-        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.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>,
-    /// 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,
-}
-
-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 status to which the broadcast is going to transition.
-    #[serde(rename = "broadcastStatus")]
-    pub broadcast_status: 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 *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsTransitionParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&broadcastStatus={}",
-            percent_encode(
-                format!("{}", self.broadcast_status).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return broadcasts with the given ids from Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: 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<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>,
-    /// *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>,
-    /// 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 only broadcasts with the selected type.
-    #[serde(rename = "broadcastType")]
-    pub broadcast_type: Option<String>,
-}
-
-impl std::fmt::Display for LiveBroadcastsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.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.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.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.broadcast_type {
-            write!(
-                f,
-                "&broadcastType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.control` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsControlParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The wall clock time at which the action should be executed. Only one of offset_time_ms and walltime may be set at a time.
-    #[serde(rename = "walltime")]
-    pub walltime: Option<String>,
-    /// Whether display or hide slate.
-    #[serde(rename = "displaySlate")]
-    pub display_slate: 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>,
-    /// u64: The exact time when the actions (e.g. slate on) are executed. It is an offset from the first frame of the monitor stream. If not set, it means "now" or ASAP. This field should not be set if the monitor stream is disabled, otherwise an error will be returned.
-    #[serde(rename = "offsetTimeMs")]
-    pub offset_time_ms: Option<String>,
-    /// *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 operate.
-    #[serde(rename = "id")]
-    pub id: String,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsControlParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.walltime {
-            write!(
-                f,
-                "&walltime={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.display_slate {
-            write!(
-                f,
-                "&displaySlate={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.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.offset_time_ms {
-            write!(
-                f,
-                "&offsetTimeMs={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// 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 `liveChatMessages.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes. It identifies the properties that the write operation will set as well as the properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatMessagesInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// 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 *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,
-    /// Specifies the localization language in which the system messages should be returned.
-    #[serde(rename = "hl")]
-    pub hl: Option<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>,
-}
-
-impl std::fmt::Display for LiveChatMessagesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&liveChatId={}",
-            percent_encode(
-                format!("{}", self.live_chat_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.profile_image_size {
-            write!(
-                f,
-                "&profileImageSize={}",
-                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 `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 `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>,
-    /// *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>,
-    /// Sort order of the results.
-    #[serde(rename = "order")]
-    pub order: Option<String>,
-    /// Restrict results to a particular set of resource types from One Platform.
-    #[serde(rename = "type")]
-    pub typ: Option<String>,
-    /// Filter on embeddable videos.
-    #[serde(rename = "videoEmbeddable")]
-    pub video_embeddable: Option<String>,
-    /// Filter on resources published before this date.
-    #[serde(rename = "publishedBefore")]
-    pub published_before: 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>,
-    /// Filter on distance from the location (specified above).
-    #[serde(rename = "locationRadius")]
-    pub location_radius: Option<String>,
-    /// Filter on the livestream status of the videos.
-    #[serde(rename = "eventType")]
-    pub event_type: Option<String>,
-    /// Filter on videos of a specific type.
-    #[serde(rename = "videoType")]
-    pub video_type: Option<String>,
-    /// Restrict results to a particular topic.
-    #[serde(rename = "topicId")]
-    pub topic_id: Option<String>,
-    /// 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 the presence of captions on the videos.
-    #[serde(rename = "videoCaption")]
-    pub video_caption: Option<String>,
-    /// Search for the private videos of the authenticated user.
-    #[serde(rename = "forMine")]
-    pub for_mine: Option<bool>,
-    /// Filter on 3d videos.
-    #[serde(rename = "videoDimension")]
-    pub video_dimension: Option<String>,
-    /// Filter on the license of the videos.
-    #[serde(rename = "videoLicense")]
-    pub video_license: Option<String>,
-    /// Search related to a resource.
-    #[serde(rename = "relatedToVideoId")]
-    pub related_to_video_id: Option<String>,
-    /// Filter on the duration of the videos.
-    #[serde(rename = "videoDuration")]
-    pub video_duration: Option<String>,
-    /// Filter on the definition of the videos.
-    #[serde(rename = "videoDefinition")]
-    pub video_definition: Option<String>,
-    /// Add a filter on the channel search.
-    #[serde(rename = "channelType")]
-    pub channel_type: Option<String>,
-    /// Indicates whether the search results should include restricted content as well as standard content.
-    #[serde(rename = "safeSearch")]
-    pub safe_search: Option<String>,
-    /// Filter on videos in a specific category.
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: Option<String>,
-    /// Return results relevant to this language.
-    #[serde(rename = "relevanceLanguage")]
-    pub relevance_language: Option<String>,
-    /// Filter on location of the video
-    #[serde(rename = "location")]
-    pub location: 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>,
-    /// Display the content as seen by viewers in this country.
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// Filter on syndicated videos.
-    #[serde(rename = "videoSyndicated")]
-    pub video_syndicated: Option<String>,
-    /// Filter on resources belonging to this channelId.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Search owned by a content owner.
-    #[serde(rename = "forContentOwner")]
-    pub for_content_owner: Option<bool>,
-    /// Textual search terms to match.
-    #[serde(rename = "q")]
-    pub q: Option<String>,
-    /// 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,
-}
-
-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.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                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.typ {
-            write!(
-                f,
-                "&type={}",
-                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.published_before {
-            write!(
-                f,
-                "&publishedBefore={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.location_radius {
-            write!(
-                f,
-                "&locationRadius={}",
-                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_type {
-            write!(
-                f,
-                "&videoType={}",
-                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.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.video_caption {
-            write!(
-                f,
-                "&videoCaption={}",
-                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_dimension {
-            write!(
-                f,
-                "&videoDimension={}",
-                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.related_to_video_id {
-            write!(
-                f,
-                "&relatedToVideoId={}",
-                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_definition {
-            write!(
-                f,
-                "&videoDefinition={}",
-                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.safe_search {
-            write!(
-                f,
-                "&safeSearch={}",
-                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.relevance_language {
-            write!(
-                f,
-                "&relevanceLanguage={}",
-                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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_syndicated {
-            write!(
-                f,
-                "&videoSyndicated={}",
-                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.for_content_owner {
-            write!(
-                f,
-                "&forContentOwner={}",
-                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()
-            )?;
-        }
-        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>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveStreamsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            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.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.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// 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 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>,
-    /// Return LiveStreams with the given ids from Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more 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>,
-    /// *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>,
-    /// 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 LiveStreamsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for SubscriptionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// 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>,
-    /// Return the subscribers of the given channel owner.
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// The order of the returned subscriptions
-    #[serde(rename = "order")]
-    pub order: Option<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>,
-    /// Return the subscriptions 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 subscription resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a subscription resource, the snippet property contains other properties, such as a display title for the subscription. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Flag for returning the subscriptions of the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// 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 SubscriptionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.for_channel_id {
-            write!(
-                f,
-                "&forChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_subscribers {
-            write!(
-                f,
-                "&mySubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_recent_subscribers {
-            write!(
-                f,
-                "&myRecentSubscribers={}",
-                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.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,
@@ -6477,626 +11013,88 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for SubscriptionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `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>,
-    /// Type of the link to be deleted.
-    #[serde(rename = "type")]
-    pub typ: String,
-    /// 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 `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>,
-    /// 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<String>,
-    /// Get a third party link with the given linking token.
-    #[serde(rename = "linkingToken")]
-    pub linking_token: Option<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 `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>,
-    /// Filter members in the results set to the ones that have access to a level.
-    #[serde(rename = "hasAccessToLevel")]
-    pub has_access_to_level: Option<String>,
-    /// The *part* parameter specifies the member resource parts that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// 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<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>,
-}
-
-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.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()
-            )?;
-        }
-        if let Some(ref v) = self.filter_by_member_channel_id {
-            write!(
-                f,
-                "&filterByMemberChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
+        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,
-}
-
-impl std::fmt::Display for ChannelSectionsDeleteParams {
+    /// 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: 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>,
+}
+
+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()
         )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return the ChannelSections owned by the specified channel ID.
-    #[serde(rename = "channelId")]
-    pub channel_id: 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>,
-    /// The *part* parameter specifies a comma-separated list of one or more channelSection resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, and contentDetails. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channelSection resource, the snippet property contains other properties, such as a display title for the channelSection. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the ChannelSections owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return content in specified language
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-}
-
-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.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                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.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        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.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 `sponsors.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SponsorsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// 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 sponsors to return.
-    #[serde(rename = "filter")]
-    pub filter: Option<String>,
-    /// The *part* parameter specifies the sponsor resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The *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 SponsorsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.filter {
-            write!(
-                f,
-                "&filter={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        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 `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 `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 `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,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// Returns the video categories with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-}
-
-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 `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 {
+        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.markAsSpam` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsMarkAsSpamParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Flags the comments with the given IDs as spam in the caller's opinion.
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for CommentsMarkAsSpamParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentsInsertParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -7150,60 +11148,40 @@
     }
 }
 
-/// 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>,
-    /// Returns the comments with the given IDs for One Platform.
+/// Parameters for the `captions.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Returns the captions with the given IDs for Stubby or Apiary.
     #[serde(rename = "id")]
     pub id: Option<String>,
-    /// 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 *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>,
-    /// 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,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: 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()
+    /// ID of the Google+ Page for the channel that the request is on behalf of.
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Returns the captions for the specified video.
+    #[serde(rename = "videoId")]
+    pub video_id: String,
+}
+
+impl std::fmt::Display for CaptionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&videoId={}",
+            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
         if let Some(ref v) = self.id {
             write!(
@@ -7212,10 +11190,1056 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.parent_id {
-            write!(
-                f,
-                "&parentId={}",
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the caption resource parts that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
+    #[serde(rename = "sync")]
+    pub sync: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.sync {
+            write!(
+                f,
+                "&sync={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.download` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsDownloadParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+    /// tlang is the language code; machine translate the captions into this language.
+    #[serde(rename = "tlang")]
+    pub tlang: Option<String>,
+    /// The ID of the caption track to download, required for One Platform.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// Convert the captions into this format. Supported options are sbv, srt, and vtt.
+    #[serde(rename = "tfmt")]
+    pub tfmt: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsDownloadParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.tlang {
+            write!(
+                f,
+                "&tlang={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.tfmt {
+            write!(
+                f,
+                "&tfmt={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// ID of the Google+ Page for the channel that the request is on behalf of.
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
+    #[serde(rename = "sync")]
+    pub sync: Option<bool>,
+}
+
+impl std::fmt::Display for CaptionsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.sync {
+            write!(
+                f,
+                "&sync={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `i18nRegions.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *part* parameter specifies the i18nRegion resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for I18nRegionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelBanners.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBannersInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Unused, channel_id is currently derived from the security context of the requestor.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for ChannelBannersInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `watermarks.unset` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct WatermarksUnsetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    #[serde(rename = "channelId")]
+    pub channel_id: String,
+}
+
+impl std::fmt::Display for WatermarksUnsetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&channelId={}",
+            percent_encode(format!("{}", self.channel_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `watermarks.set` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct WatermarksSetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    #[serde(rename = "channelId")]
+    pub channel_id: String,
+}
+
+impl std::fmt::Display for WatermarksSetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&channelId={}",
+            percent_encode(format!("{}", self.channel_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `superChatEvents.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEventsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// The *part* parameter specifies the superChatEvent resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return rendered funding amounts in specified language.
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+}
+
+impl std::fmt::Display for SuperChatEventsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `membershipsLevels.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevelsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the membershipsLevel resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for MembershipsLevelsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Notify the channel subscribers about the new video. As default, the notification is enabled.
+    #[serde(rename = "notifySubscribers")]
+    pub notify_subscribers: Option<bool>,
+    /// Should stabilize be applied to the upload.
+    #[serde(rename = "stabilize")]
+    pub stabilize: Option<bool>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Should auto-levels be applied to the upload.
+    #[serde(rename = "autoLevels")]
+    pub auto_levels: Option<bool>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.notify_subscribers {
+            write!(
+                f,
+                "&notifySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.stabilize {
+            write!(
+                f,
+                "&stabilize={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.auto_levels {
+            write!(
+                f,
+                "&autoLevels={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.getRating` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosGetRatingParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for VideosGetRatingParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    #[serde(rename = "locale")]
+    pub locale: Option<String>,
+    #[serde(rename = "maxHeight")]
+    pub max_height: Option<i32>,
+    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Use chart that is specific to the specified video category
+    #[serde(rename = "videoCategoryId")]
+    pub video_category_id: Option<String>,
+    /// Return videos with the given ids.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return videos liked/disliked by the authenticated user. Does not support RateType.RATED_TYPE_NONE.
+    #[serde(rename = "myRating")]
+    pub my_rating: Option<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>,
+    /// Return the videos that are in the specified chart.
+    #[serde(rename = "chart")]
+    pub chart: Option<String>,
+    /// Return the player with maximum height specified in
+    #[serde(rename = "maxWidth")]
+    pub max_width: Option<i32>,
+    /// Use a chart that is specific to the specified region
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+}
+
+impl std::fmt::Display for VideosListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.locale {
+            write!(
+                f,
+                "&locale={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_height {
+            write!(
+                f,
+                "&maxHeight={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_category_id {
+            write!(
+                f,
+                "&videoCategoryId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_rating {
+            write!(
+                f,
+                "&myRating={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.chart {
+            write!(
+                f,
+                "&chart={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_width {
+            write!(
+                f,
+                "&maxWidth={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.rate` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosRateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    #[serde(rename = "rating")]
+    pub rating: String,
+}
+
+impl std::fmt::Display for VideosRateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&rating={}",
+            percent_encode(format!("{}", self.rating).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.reportAbuse` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosReportAbuseParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosReportAbuseParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting. In addition, not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for VideosUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Type of the link to be deleted.
+    #[serde(rename = "type")]
+    pub typ: String,
+    /// Do not use. Required for compatibility.
+    #[serde(rename = "part")]
+    pub part: Option<String>,
+    /// Delete the partner links with the given linking token.
+    #[serde(rename = "linkingToken")]
+    pub linking_token: String,
+}
+
+impl std::fmt::Display for ThirdPartyLinksDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&type={}",
+            percent_encode(format!("{}", self.typ).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&linkingToken={}",
+            percent_encode(
+                format!("{}", self.linking_token).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        if let Some(ref v) = self.part {
+            write!(
+                f,
+                "&part={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `thirdPartyLinks.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinksUpdateParams {
+    /// 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>,
+    /// Get a third party link of the given type.
+    #[serde(rename = "type")]
+    pub typ: 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.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 `i18nLanguages.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguagesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *part* parameter specifies the i18nLanguage resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for I18nLanguagesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `thumbnails.set` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailsSetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Returns the Thumbnail with the given video IDs for Stubby or Apiary.
+    #[serde(rename = "videoId")]
+    pub video_id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for ThumbnailsSetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&videoId={}",
+            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `activities.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivitiesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "publishedAfter")]
+    pub published_after: Option<String>,
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    #[serde(rename = "publishedBefore")]
+    pub published_before: Option<String>,
+    #[serde(rename = "home")]
+    pub home: Option<bool>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// The *part* parameter specifies a comma-separated list of one or more activity resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in an activity resource, the snippet property contains other properties that identify the type of activity, a display title for the activity, and so forth. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+}
+
+impl std::fmt::Display for ActivitiesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.published_after {
+            write!(
+                f,
+                "&publishedAfter={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_before {
+            write!(
+                f,
+                "&publishedBefore={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.home {
+            write!(
+                f,
+                "&home={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -7233,110 +12257,178 @@
                 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()
-            )?;
-        }
-        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.
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlists.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for PlaylistsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlists.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
     #[serde(rename = "id")]
     pub id: String,
 }
 
-impl std::fmt::Display for CommentsMarkAsSpamParams {
+impl std::fmt::Display for PlaylistsDeleteParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
             "&id={}",
             percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
-        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>,
-    /// 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: String,
-    /// Modifies the moderation status of the comments with the given IDs
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CommentsSetModerationStatusParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&moderationStatus={}",
-            percent_encode(
-                format!("{}", self.moderation_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.ban_author {
-            write!(
-                f,
-                "&banAuthor={}",
-                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>,
-    /// Return rendered funding amounts in specified language.
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlists.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for mutable properties that are contained in any parts that the request body specifies. For example, a playlist's description is contained in the snippet part, which must be included in the request body. If the request does not specify a value for the snippet.description property, the playlist's existing description will be deleted.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlists.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Return the playlists owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more playlist resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlist resource, the snippet property contains properties like author, title, description, tags, and timeCreated. As such, if you set *part=snippet*, the API response will contain all of those properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Returen content in specified language
     #[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,
+    /// Return the playlists with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return the playlists owned by the specified channel ID.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
     /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-}
-
-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()
-        )?;
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for PlaylistsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.hl {
             write!(
                 f,
@@ -7344,6 +12436,20 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.page_token {
             write!(
                 f,
@@ -7358,6 +12464,84 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videoCategories.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategoriesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    /// Returns the video categories with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *part* parameter specifies the videoCategory resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for VideoCategoriesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatModerators.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for LiveChatModeratorsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
         Ok(())
     }
 }
@@ -7390,9 +12574,6 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
     /// The *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,
@@ -7402,6 +12583,9 @@
     /// The id of the live chat for which moderators should be returned.
     #[serde(rename = "liveChatId")]
     pub live_chat_id: String,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
 }
 
 impl std::fmt::Display for LiveChatModeratorsListParams {
@@ -7420,13 +12604,6 @@
             )
             .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,
@@ -7434,102 +12611,34 @@
                 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 `i18nLanguages.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguagesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// The *part* parameter specifies the i18nLanguage resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for I18nLanguagesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `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()
-            )?;
-        }
+        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 `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(())
     }
 }
@@ -7540,35 +12649,35 @@
     /// 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>,
     /// Returns the comment threads for all the channel comments (ie does not include comments left on videos).
     #[serde(rename = "channelId")]
     pub channel_id: Option<String>,
+    /// The requested text format for the returned comments.
+    #[serde(rename = "textFormat")]
+    pub text_format: Option<String>,
+    #[serde(rename = "order")]
+    pub order: 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>,
     /// Returns the comment threads with the given IDs for Stubby or Apiary.
     #[serde(rename = "id")]
     pub id: Option<String>,
     /// Returns the comment threads of all videos of the channel and the channel comments as well.
     #[serde(rename = "allThreadsRelatedToChannelId")]
     pub all_threads_related_to_channel_id: Option<String>,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: Option<String>,
     /// Limits the returned comment threads to those with the specified moderation status. Not compatible with the 'id' filter. Valid values: published, heldForReview, likelySpam.
     #[serde(rename = "moderationStatus")]
     pub moderation_status: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more commentThread resource properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
     /// Returns the comment threads of the specified video.
     #[serde(rename = "videoId")]
     pub video_id: Option<String>,
-    /// 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>,
-    #[serde(rename = "order")]
-    pub order: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more commentThread resource properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
@@ -7581,13 +12690,6 @@
             "&part={}",
             percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.channel_id {
             write!(
                 f,
@@ -7595,6 +12697,27 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.text_format {
+            write!(
+                f,
+                "&textFormat={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.search_terms {
+            write!(
+                f,
+                "&searchTerms={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.id {
             write!(
                 f,
@@ -7609,13 +12732,6 @@
                 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,
@@ -7623,6 +12739,13 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.video_id {
             write!(
                 f,
@@ -7630,20 +12753,6 @@
                 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.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -7699,26 +12808,53 @@
     }
 }
 
-/// Parameters for the `i18nRegions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the i18nRegion resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
+/// Parameters for the `channelSections.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more channelSection resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, and contentDetails. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channelSection resource, the snippet property contains other properties, such as a display title for the channelSection. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return the ChannelSections owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// Return content in specified language
     #[serde(rename = "hl")]
     pub hl: Option<String>,
-}
-
-impl std::fmt::Display for I18nRegionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
+    /// Return the ChannelSections owned by the specified channel ID.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Return the ChannelSections with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+}
+
+impl std::fmt::Display for ChannelSectionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.hl {
             write!(
                 f,
@@ -7726,39 +12862,333 @@
                 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 {
+        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.id {
+            write!(
+                f,
+                "&id={}",
+                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>,
     /// *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.
+    /// 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 `liveChatMessages.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken property identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
+    /// The id of the live chat for which comments should be returned.
+    #[serde(rename = "liveChatId")]
+    pub live_chat_id: String,
+    /// Specifies the localization language in which the system messages should be returned.
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// Specifies the size of the profile image that should be returned for each user.
+    #[serde(rename = "profileImageSize")]
+    pub profile_image_size: Option<u32>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-    /// Return the playlist items within the given playlist.
-    #[serde(rename = "playlistId")]
-    pub playlist_id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more playlistItem resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlistItem resource, the snippet property contains numerous fields, including the title, description, position, and resourceId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
+    /// The *part* parameter specifies the liveChatComment resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveChatMessagesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&liveChatId={}",
+            percent_encode(
+                format!("{}", self.live_chat_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        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.profile_image_size {
+            write!(
+                f,
+                "&profileImageSize={}",
+                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 `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 `subscriptions.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for SubscriptionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `subscriptions.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for SubscriptionsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `subscriptions.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *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>,
+    /// Return the subscriptions of the given channel owner.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Return the subscriptions with the given IDs for Stubby or Apiary.
     #[serde(rename = "id")]
     pub id: Option<String>,
-    /// Return the playlist items associated with the given video ID.
-    #[serde(rename = "videoId")]
-    pub video_id: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistItemsListParams {
+    #[serde(rename = "myRecentSubscribers")]
+    pub my_recent_subscribers: Option<bool>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// The order of the returned subscriptions
+    #[serde(rename = "order")]
+    pub order: Option<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>,
+    /// Return the subscriptions to the subset of these channels that the authenticated user is subscribed to.
+    #[serde(rename = "forChannelId")]
+    pub for_channel_id: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more subscription resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a subscription resource, the snippet property contains other properties, such as a display title for the subscription. If you set *part=snippet*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Flag for returning the subscriptions of the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+}
+
+impl std::fmt::Display for SubscriptionsListParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -7772,6 +13202,34 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_recent_subscribers {
+            write!(
+                f,
+                "&myRecentSubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.page_token {
             write!(
                 f,
@@ -7779,6 +13237,13 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -7786,24 +13251,421 @@
                 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.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_id {
-            write!(
-                f,
-                "&videoId={}",
+        if let Some(ref v) = self.my_subscribers {
+            write!(
+                f,
+                "&mySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_channel_id {
+            write!(
+                f,
+                "&forChannelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatBans.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBansDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[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 `search.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Filter on the definition of the videos.
+    #[serde(rename = "videoDefinition")]
+    pub video_definition: Option<String>,
+    /// Return results relevant to this language.
+    #[serde(rename = "relevanceLanguage")]
+    pub relevance_language: Option<String>,
+    /// Filter on the duration of the videos.
+    #[serde(rename = "videoDuration")]
+    pub video_duration: Option<String>,
+    /// Filter on the livestream status of the videos.
+    #[serde(rename = "eventType")]
+    pub event_type: Option<String>,
+    /// Filter on embeddable videos.
+    #[serde(rename = "videoEmbeddable")]
+    pub video_embeddable: Option<String>,
+    /// Search related to a resource.
+    #[serde(rename = "relatedToVideoId")]
+    pub related_to_video_id: Option<String>,
+    /// Filter on videos of a specific type.
+    #[serde(rename = "videoType")]
+    pub video_type: Option<String>,
+    /// Filter on 3d videos.
+    #[serde(rename = "videoDimension")]
+    pub video_dimension: 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>,
+    /// Restrict results to a particular set of resource types from One Platform.
+    #[serde(rename = "type")]
+    pub typ: Option<String>,
+    /// Filter on syndicated videos.
+    #[serde(rename = "videoSyndicated")]
+    pub video_syndicated: Option<String>,
+    /// Restrict the search to only retrieve videos uploaded using the project id of the authenticated user.
+    #[serde(rename = "forDeveloper")]
+    pub for_developer: Option<bool>,
+    /// Add a filter on the channel search.
+    #[serde(rename = "channelType")]
+    pub channel_type: Option<String>,
+    /// Filter on the license of the videos.
+    #[serde(rename = "videoLicense")]
+    pub video_license: 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>,
+    /// Display the content as seen by viewers in this country.
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+    /// Textual search terms to match.
+    #[serde(rename = "q")]
+    pub q: Option<String>,
+    /// Filter on resources published after this date.
+    #[serde(rename = "publishedAfter")]
+    pub published_after: Option<String>,
+    /// Filter on videos in a specific category.
+    #[serde(rename = "videoCategoryId")]
+    pub video_category_id: Option<String>,
+    /// Filter on the presence of captions on the videos.
+    #[serde(rename = "videoCaption")]
+    pub video_caption: Option<String>,
+    /// Filter on resources published before this date.
+    #[serde(rename = "publishedBefore")]
+    pub published_before: Option<String>,
+    /// Search owned by a content owner.
+    #[serde(rename = "forContentOwner")]
+    pub for_content_owner: Option<bool>,
+    /// The *part* parameter specifies a comma-separated list of one or more search resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Sort order of the results.
+    #[serde(rename = "order")]
+    pub order: Option<String>,
+    /// Indicates whether the search results should include restricted content as well as standard content.
+    #[serde(rename = "safeSearch")]
+    pub safe_search: Option<String>,
+    /// Restrict results to a particular topic.
+    #[serde(rename = "topicId")]
+    pub topic_id: Option<String>,
+    /// Filter on resources belonging to this channelId.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Filter on distance from the location (specified above).
+    #[serde(rename = "locationRadius")]
+    pub location_radius: Option<String>,
+    /// Search for the private videos of the authenticated user.
+    #[serde(rename = "forMine")]
+    pub for_mine: Option<bool>,
+    /// Filter on location of the video
+    #[serde(rename = "location")]
+    pub location: Option<String>,
+}
+
+impl std::fmt::Display for SearchListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.video_definition {
+            write!(
+                f,
+                "&videoDefinition={}",
+                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.video_duration {
+            write!(
+                f,
+                "&videoDuration={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.event_type {
+            write!(
+                f,
+                "&eventType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_embeddable {
+            write!(
+                f,
+                "&videoEmbeddable={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.related_to_video_id {
+            write!(
+                f,
+                "&relatedToVideoId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_type {
+            write!(
+                f,
+                "&videoType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_dimension {
+            write!(
+                f,
+                "&videoDimension={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.typ {
+            write!(
+                f,
+                "&type={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_syndicated {
+            write!(
+                f,
+                "&videoSyndicated={}",
+                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.channel_type {
+            write!(
+                f,
+                "&channelType={}",
+                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.q {
+            write!(
+                f,
+                "&q={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_after {
+            write!(
+                f,
+                "&publishedAfter={}",
+                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.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.for_content_owner {
+            write!(
+                f,
+                "&forContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.safe_search {
+            write!(
+                f,
+                "&safeSearch={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.topic_id {
+            write!(
+                f,
+                "&topicId={}",
+                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.location_radius {
+            write!(
+                f,
+                "&locationRadius={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_mine {
+            write!(
+                f,
+                "&forMine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.location {
+            write!(
+                f,
+                "&location={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which identify the times portion of the video that should play when users watch the video in the playlist. If your request is updating a playlist item that sets these values, and the request's part parameter value includes the contentDetails part, the playlist item's start and end times will be updated to whatever value the request body specifies. If the request body does not specify values, the existing start and end times will be removed and replaced with the default settings.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for PlaylistItemsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -7843,38 +13705,6 @@
     }
 }
 
-/// Parameters for the `playlistItems.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which identify the times portion of the video that should play when users watch the video in the playlist. If your request is updating a playlist item that sets these values, and the request's part parameter value includes the contentDetails part, the playlist item's start and end times will be updated to whatever value the request body specifies. If the request body does not specify values, the existing start and end times will be removed and replaced with the default settings.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for PlaylistItemsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
 /// Parameters for the `playlistItems.delete` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct PlaylistItemsDeleteParams {
@@ -7906,6 +13736,87 @@
     }
 }
 
+/// Parameters for the `playlistItems.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Return the playlist items associated with the given video ID.
+    #[serde(rename = "videoId")]
+    pub video_id: Option<String>,
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Return the playlist items within the given playlist.
+    #[serde(rename = "playlistId")]
+    pub playlist_id: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// The *part* parameter specifies a comma-separated list of one or more playlistItem resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlistItem resource, the snippet property contains numerous fields, including the title, description, position, and resourceId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for PlaylistItemsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.video_id {
+            write!(
+                f,
+                "&videoId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.playlist_id {
+            write!(
+                f,
+                "&playlistId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
 /// Parameters for the `videoAbuseReportReasons.list` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct VideoAbuseReportReasonsListParams {
@@ -7937,20 +13848,251 @@
     }
 }
 
-/// 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>,
+/// Parameters for the `abuseReports.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseReportsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for AbuseReportsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `channels.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Return the channels managed by the authenticated user.
+    #[serde(rename = "managedByMe")]
+    pub managed_by_me: Option<bool>,
+    /// The *part* parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set *part=contentDetails*, the API response will also contain all of those nested properties.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Return the channel associated with a YouTube username.
+    #[serde(rename = "forUsername")]
+    pub for_username: Option<String>,
+    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Return the ids of channels owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// Return the channels with the specified IDs.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return the channels subscribed to the authenticated user
+    #[serde(rename = "mySubscribers")]
+    pub my_subscribers: Option<bool>,
+    /// Return the channels within the specified guide category ID.
+    #[serde(rename = "categoryId")]
+    pub category_id: Option<String>,
+}
+
+impl std::fmt::Display for ChannelsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.managed_by_me {
+            write!(
+                f,
+                "&managedByMe={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_username {
+            write!(
+                f,
+                "&forUsername={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_subscribers {
+            write!(
+                f,
+                "&mySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.category_id {
+            write!(
+                f,
+                "&categoryId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channels.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *onBehalfOfContentOwner* parameter indicates that the authenticated user is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with needs to be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The API currently only allows the parameter value to be set to either brandingSettings or invideoPromotion. (You cannot update both of those parts with a single request.) Note that this method overrides the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ChannelsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `sponsors.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SponsorsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Parameter that specifies which channel sponsors to return.
+    #[serde(rename = "filter")]
+    pub filter: Option<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 sponsor resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+}
+
+impl std::fmt::Display for SponsorsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.filter {
+            write!(
+                f,
+                "&filter={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
     #[serde(rename = "id")]
     pub id: String,
-    /// *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 {
+}
+
+impl std::fmt::Display for LiveStreamsDeleteParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -7964,41 +14106,143 @@
                 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: String,
-}
-
-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.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosInsertParams {
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveStream resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, cdn, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return LiveStreams with the given ids from Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+}
+
+impl std::fmt::Display for LiveStreamsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveStreamsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsUpdateParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
@@ -8008,21 +14252,12 @@
     /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
     #[serde(rename = "onBehalfOfContentOwnerChannel")]
     pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Should stabilize be applied to the upload.
-    #[serde(rename = "stabilize")]
-    pub stabilize: Option<bool>,
-    /// 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>,
-    /// 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 {
+    /// 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,
@@ -8043,46 +14278,335 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.stabilize {
-            write!(
-                f,
-                "&stabilize={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.auto_levels {
-            write!(
-                f,
-                "&autoLevels={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.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>,
-    /// 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.
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a broadcast's privacy status is defined in the status part. As such, if your request is updating a private or unlisted broadcast, and the request's part parameter value includes the status part, the broadcast's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the broadcast will revert to the default privacy setting.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveBroadcastsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Broadcast to delete.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for LiveBroadcastsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Return broadcasts with the given ids from Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, status and statistics.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Return broadcasts with a certain status, e.g. active broadcasts.
+    #[serde(rename = "broadcastStatus")]
+    pub broadcast_status: Option<String>,
+    /// Return only broadcasts with the selected type.
+    #[serde(rename = "broadcastType")]
+    pub broadcast_type: 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>,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
 }
 
-impl std::fmt::Display for VideosUpdateParams {
+impl std::fmt::Display for LiveBroadcastsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.broadcast_status {
+            write!(
+                f,
+                "&broadcastStatus={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.broadcast_type {
+            write!(
+                f,
+                "&broadcastType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.bind` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsBindParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Stream to bind, if not set unbind the current one.
+    #[serde(rename = "streamId")]
+    pub stream_id: Option<String>,
+    /// Broadcast to bind to the stream
+    #[serde(rename = "id")]
+    pub id: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveBroadcastsBindParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.stream_id {
+            write!(
+                f,
+                "&streamId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.transition` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsTransitionParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Broadcast to transition.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// The status to which the broadcast is going to transition.
+    #[serde(rename = "broadcastStatus")]
+    pub broadcast_status: 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,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&broadcastStatus={}",
+            percent_encode(
+                format!("{}", self.broadcast_status).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for LiveBroadcastsInsertParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -8096,25 +14620,53 @@
                 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,
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.control` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsControlParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
     /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
     #[serde(rename = "onBehalfOfContentOwner")]
     pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosGetRatingParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// u64: The exact time when the actions (e.g. slate on) are executed. It is an offset from the first frame of the monitor stream. If not set, it means "now" or ASAP. This field should not be set if the monitor stream is disabled, otherwise an error will be returned.
+    #[serde(rename = "offsetTimeMs")]
+    pub offset_time_ms: Option<String>,
+    /// Whether display or hide slate.
+    #[serde(rename = "displaySlate")]
+    pub display_slate: Option<bool>,
+    /// Broadcast to operate.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// The wall clock time at which the action should be executed. Only one of offset_time_ms and walltime may be set at a time.
+    #[serde(rename = "walltime")]
+    pub walltime: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for LiveBroadcastsControlParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
         write!(
             f,
             "&id={}",
@@ -8127,104 +14679,71 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return the videos that are in the specified chart.
-    #[serde(rename = "chart")]
-    pub chart: 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 = "locale")]
-    pub locale: 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>,
-    /// Return videos liked/disliked by the authenticated user. Does not support RateType.RATED_TYPE_NONE.
-    #[serde(rename = "myRating")]
-    pub my_rating: Option<String>,
-    #[serde(rename = "maxHeight")]
-    pub max_height: Option<i32>,
-    /// 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.
+        if let Some(ref v) = self.offset_time_ms {
+            write!(
+                f,
+                "&offsetTimeMs={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.display_slate {
+            write!(
+                f,
+                "&displaySlate={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.walltime {
+            write!(
+                f,
+                "&walltime={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `members.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembersListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies the member resource parts that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
-    /// Return videos with the given ids.
-    #[serde(rename = "id")]
-    pub 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,
-    /// Use a chart that is specific to the specified region
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// Return the player with maximum height specified in
-    #[serde(rename = "maxWidth")]
-    pub max_width: 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.
+    /// Comma separated list of channel IDs. Only data about members that are part of this list will be included in the response.
+    #[serde(rename = "filterByMemberChannelId")]
+    pub filter_by_member_channel_id: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-    /// Use chart that is specific to the specified video category
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: 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.chart {
-            write!(
-                f,
-                "&chart={}",
-                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.locale {
-            write!(
-                f,
-                "&locale={}",
-                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.my_rating {
-            write!(
-                f,
-                "&myRating={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_height {
-            write!(
-                f,
-                "&maxHeight={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
+    /// Parameter that specifies which channel members to return.
+    #[serde(rename = "mode")]
+    pub mode: Option<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>,
+}
+
+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.page_token {
             write!(
                 f,
@@ -8232,24 +14751,10 @@
                 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.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_width {
-            write!(
-                f,
-                "&maxWidth={}",
+        if let Some(ref v) = self.filter_by_member_channel_id {
+            write!(
+                f,
+                "&filterByMemberChannelId={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -8260,188 +14765,17 @@
                 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 `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 `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>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Return the channels 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 channel associated with a YouTube username.
-    #[serde(rename = "forUsername")]
-    pub for_username: 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>,
-    /// Return the channels within the specified guide category ID.
-    #[serde(rename = "categoryId")]
-    pub category_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>,
-    /// 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.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_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.for_username {
-            write!(
-                f,
-                "&forUsername={}",
-                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()
-            )?;
-        }
-        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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `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={}",
+        if let Some(ref v) = self.mode {
+            write!(
+                f,
+                "&mode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.has_access_to_level {
+            write!(
+                f,
+                "&hasAccessToLevel={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -8451,6 +14785,13 @@
 
 impl std::fmt::Display for YoutubeParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.callback {
+            write!(
+                f,
+                "&callback={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.access_token {
             write!(
                 f,
@@ -8458,27 +14799,6 @@
                 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.callback {
-            write!(
-                f,
-                "&callback={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.key {
-            write!(
-                f,
-                "&key={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.alt {
             write!(
                 f,
@@ -8486,34 +14806,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.dollar_xgafv {
-            write!(
-                f,
-                "&$.xgafv={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.pretty_print {
-            write!(
-                f,
-                "&prettyPrint={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.oauth_token {
-            write!(
-                f,
-                "&oauth_token={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.fields {
-            write!(
-                f,
-                "&fields={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.upload_protocol {
             write!(
                 f,
@@ -8528,12 +14820,54 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// The Youtube Activities service represents the Activities resource.
-pub struct ActivitiesService {
+        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.key {
+            write!(
+                f,
+                "&key={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.dollar_xgafv {
+            write!(
+                f,
+                "&$.xgafv={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.upload_type {
+            write!(
+                f,
+                "&uploadType={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.fields {
+            write!(
+                f,
+                "&fields={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.oauth_token {
+            write!(
+                f,
+                "&oauth_token={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// The Youtube Comments service represents the Comments resource.
+pub struct CommentsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
     scopes: Vec<String>,
@@ -8542,15 +14876,15 @@
     root_url: String,
 }
 
-impl ActivitiesService {
-    /// Create a new ActivitiesService object. The easiest way to call this is wrapping the Authenticator
+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 + std::ops::Deref<Target = Authenticator>>(
         client: TlsClient,
         auth: A,
-    ) -> ActivitiesService {
-        ActivitiesService {
+    ) -> CommentsService {
+        CommentsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -8603,14 +14937,14 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut self, params: &ActivitiesListParams) -> Result<ActivityListResponse> {
-        let rel_path = format!("youtube/v3/activities",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+    pub async fn list(&mut self, params: &CommentsListParams) -> Result<CommentListResponse> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -8630,6 +14964,164 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
+
+    /// Sets the moderation status of one or more comments.
+    pub async fn set_moderation_status(
+        &mut self,
+        params: &CommentsSetModerationStatusParams,
+    ) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments/setModerationStatus",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
+    pub async fn mark_as_spam(&mut self, params: &CommentsMarkAsSpamParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments/markAsSpam",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &CommentsInsertParams,
+        req: &Comment,
+    ) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &mut self,
+        params: &CommentsUpdateParams,
+        req: &Comment,
+    ) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&mut self, params: &CommentsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
 }
 
 /// The Youtube Captions service represents the Captions resource.
@@ -8731,6 +15223,161 @@
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
 
+    /// Deletes a resource.
+    pub async fn delete(&mut self, params: &CaptionsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &CaptionsInsertParams,
+        req: &Caption,
+    ) -> Result<Caption> {
+        let rel_path = format!("youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
+    pub async fn insert_upload(
+        &mut self,
+        params: &CaptionsInsertParams,
+        req: &Caption,
+        data: hyper::body::Bytes,
+    ) -> Result<Caption> {
+        let rel_path = format!("/upload/youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn insert_resumable_upload<'client>(
+        &'client mut self,
+        params: &CaptionsInsertParams,
+        req: &Caption,
+    ) -> Result<ResumableUpload<'client, Caption>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+
     /// Downloads a caption track.
     ///
     /// This method potentially downloads data. See documentation of `Download`.
@@ -8740,7 +15387,7 @@
     ) -> Result<Download<'a, EmptyRequest, ()>> {
         let rel_path = format!(
             "youtube/v3/captions/{id}",
-            id = percent_encode(params.id.as_bytes(), NON_ALPHANUMERIC)
+            id = percent_encode(format!("{}", params.id).as_bytes(), NON_ALPHANUMERIC)
         );
         let path = self.format_path(rel_path.as_str());
 
@@ -8893,1258 +15540,10 @@
             .context(format!("{:?}", headers)))?
         }
     }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-    ) -> Result<Caption> {
-        let rel_path = format!("youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
-    pub async fn insert_upload(
-        &mut self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-        data: hyper::body::Bytes,
-    ) -> Result<Caption> {
-        let rel_path = format!("/upload/youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn insert_resumable_upload<'client>(
-        &'client mut self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-    ) -> Result<ResumableUpload<'client, Caption>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &CaptionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube AbuseReports service represents the AbuseReports resource.
-pub struct AbuseReportsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl AbuseReportsService {
-    /// Create a new AbuseReportsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> AbuseReportsService {
-        AbuseReportsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &AbuseReportsInsertParams,
-        req: &AbuseReport,
-    ) -> Result<AbuseReport> {
-        let rel_path = format!("youtube/v3/abuseReports",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube Playlists service represents the Playlists resource.
-pub struct PlaylistsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl PlaylistsService {
-    /// Create a new PlaylistsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> PlaylistsService {
-        PlaylistsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &PlaylistsInsertParams,
-        req: &Playlist,
-    ) -> Result<Playlist> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut self,
-        params: &PlaylistsUpdateParams,
-        req: &Playlist,
-    ) -> Result<Playlist> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut self, params: &PlaylistsListParams) -> Result<PlaylistListResponse> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &PlaylistsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
-pub struct LiveBroadcastsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveBroadcastsService {
-    /// Create a new LiveBroadcastsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> LiveBroadcastsService {
-        LiveBroadcastsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &mut self,
-        params: &LiveBroadcastsInsertParams,
-        req: &LiveBroadcast,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Bind a broadcast to a stream.
-    pub async fn bind(&mut self, params: &LiveBroadcastsBindParams) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/bind",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Updates an existing broadcast for the authenticated user.
-    pub async fn update(
-        &mut self,
-        params: &LiveBroadcastsUpdateParams,
-        req: &LiveBroadcast,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Transition a broadcast to a given status.
-    pub async fn transition(
-        &mut self,
-        params: &LiveBroadcastsTransitionParams,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/transition",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieve the list of broadcasts associated with the given channel.
-    pub async fn list(
-        &mut self,
-        params: &LiveBroadcastsListParams,
-    ) -> Result<LiveBroadcastListResponse> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Slate and recording control of the live broadcast. Support actions: slate on/off, recording start/stop/pause/resume. Design doc: goto/yt-api-liveBroadcast-control
-    pub async fn control(&mut self, params: &LiveBroadcastsControlParams) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/control",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Delete a given broadcast.
-    pub async fn delete(&mut self, params: &LiveBroadcastsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube LiveChatMessages service represents the LiveChatMessages resource.
-pub struct LiveChatMessagesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveChatMessagesService {
-    /// Create a new LiveChatMessagesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> LiveChatMessagesService {
-        LiveChatMessagesService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &LiveChatMessagesInsertParams,
-        req: &LiveChatMessage,
-    ) -> Result<LiveChatMessage> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut self,
-        params: &LiveChatMessagesListParams,
-    ) -> Result<LiveChatMessageListResponse> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes a chat message.
-    pub async fn delete(&mut self, params: &LiveChatMessagesDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube LiveChatBans service represents the LiveChatBans resource.
-pub struct LiveChatBansService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveChatBansService {
-    /// Create a new LiveChatBansService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> LiveChatBansService {
-        LiveChatBansService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &LiveChatBansInsertParams,
-        req: &LiveChatBan,
-    ) -> Result<LiveChatBan> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a chat ban.
-    pub async fn delete(&mut self, params: &LiveChatBansDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube Tests service represents the Tests resource.
-pub struct TestsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl TestsService {
-    /// Create a new TestsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> TestsService {
-        TestsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// POST method.
-    pub async fn insert(&mut self, params: &TestsInsertParams, req: &TestItem) -> Result<TestItem> {
-        let rel_path = format!("youtube/v3/tests",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube Search service represents the Search resource.
-pub struct SearchService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl SearchService {
-    /// Create a new SearchService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> SearchService {
-        SearchService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of search resources
-    pub async fn list(&mut self, params: &SearchListParams) -> Result<SearchListResponse> {
-        let rel_path = format!("youtube/v3/search",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube LiveStreams service represents the LiveStreams resource.
-pub struct LiveStreamsService {
+}
+
+/// The Youtube I18nRegions service represents the I18nRegions resource.
+pub struct I18nRegionsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
     scopes: Vec<String>,
@@ -10153,1341 +15552,15 @@
     root_url: String,
 }
 
-impl LiveStreamsService {
-    /// Create a new LiveStreamsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> LiveStreamsService {
-        LiveStreamsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &mut self,
-        params: &LiveStreamsInsertParams,
-        req: &LiveStream,
-    ) -> Result<LiveStream> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Updates an existing stream for the authenticated user.
-    pub async fn update(
-        &mut self,
-        params: &LiveStreamsUpdateParams,
-        req: &LiveStream,
-    ) -> Result<LiveStream> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Deletes an existing stream for the authenticated user.
-    pub async fn delete(&mut self, params: &LiveStreamsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieve the list of streams associated with the given channel. --
-    pub async fn list(&mut self, params: &LiveStreamsListParams) -> Result<LiveStreamListResponse> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Subscriptions service represents the Subscriptions resource.
-pub struct SubscriptionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl SubscriptionsService {
-    /// Create a new SubscriptionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> SubscriptionsService {
-        SubscriptionsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &SubscriptionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut self,
-        params: &SubscriptionsListParams,
-    ) -> Result<SubscriptionListResponse> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &SubscriptionsInsertParams,
-        req: &Subscription,
-    ) -> Result<Subscription> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube ThirdPartyLinks service represents the ThirdPartyLinks resource.
-pub struct ThirdPartyLinksService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl ThirdPartyLinksService {
-    /// Create a new ThirdPartyLinksService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> ThirdPartyLinksService {
-        ThirdPartyLinksService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut self,
-        params: &ThirdPartyLinksUpdateParams,
-        req: &ThirdPartyLink,
-    ) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &ThirdPartyLinksDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &ThirdPartyLinksInsertParams,
-        req: &ThirdPartyLink,
-    ) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut self, params: &ThirdPartyLinksListParams) -> Result<ThirdPartyLink> {
-        let rel_path = format!("youtube/v3/thirdPartyLinks",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Members service represents the Members resource.
-pub struct MembersService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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(&mut self, params: &MembersListParams) -> Result<MemberListResponse> {
-        let rel_path = format!("youtube/v3/members",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref 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 ChannelSections service represents the ChannelSections resource.
-pub struct ChannelSectionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl ChannelSectionsService {
-    /// Create a new ChannelSectionsService object. The easiest way to call this is wrapping the Authenticator
+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 + std::ops::Deref<Target = Authenticator>>(
         client: TlsClient,
         auth: A,
-    ) -> ChannelSectionsService {
-        ChannelSectionsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &ChannelSectionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut self,
-        params: &ChannelSectionsListParams,
-    ) -> Result<ChannelSectionListResponse> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut self,
-        params: &ChannelSectionsUpdateParams,
-        req: &ChannelSection,
-    ) -> Result<ChannelSection> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &ChannelSectionsInsertParams,
-        req: &ChannelSection,
-    ) -> Result<ChannelSection> {
-        let rel_path = format!("youtube/v3/channelSections",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube Sponsors service represents the Sponsors resource.
-pub struct SponsorsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl SponsorsService {
-    /// Create a new SponsorsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> SponsorsService {
-        SponsorsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of sponsors that match the request criteria for a channel.
-    pub async fn list(&mut self, params: &SponsorsListParams) -> Result<SponsorListResponse> {
-        let rel_path = format!("youtube/v3/sponsors",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Watermarks service represents the Watermarks resource.
-pub struct WatermarksService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl WatermarksService {
-    /// Create a new WatermarksService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> WatermarksService {
-        WatermarksService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Allows upload of watermark image and setting it for a channel.
-    pub async fn set(&mut self, params: &WatermarksSetParams, req: &InvideoBranding) -> Result<()> {
-        let rel_path = format!("youtube/v3/watermarks/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Allows upload of watermark image and setting it for a channel.
-    ///
-    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
-    pub async fn set_upload(
-        &mut self,
-        params: &WatermarksSetParams,
-        req: &InvideoBranding,
-        data: hyper::body::Bytes,
-    ) -> Result<()> {
-        let rel_path = format!("/upload/youtube/v3/watermarks/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// Allows upload of watermark image and setting it for a channel.
-    ///
-    /// This method is a variant of `set()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn set_resumable_upload<'client>(
-        &'client mut self,
-        params: &WatermarksSetParams,
-        req: &InvideoBranding,
-    ) -> Result<ResumableUpload<'client, ()>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/watermarks/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-
-    /// Allows removal of channel watermark.
-    pub async fn unset(&mut self, params: &WatermarksUnsetParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/watermarks/unset",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube Thumbnails service represents the Thumbnails resource.
-pub struct ThumbnailsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl ThumbnailsService {
-    /// Create a new ThumbnailsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> ThumbnailsService {
-        ThumbnailsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    pub async fn set(&mut self, params: &ThumbnailsSetParams) -> Result<ThumbnailSetResponse> {
-        let rel_path = format!("youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    ///
-    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
-    pub async fn set_upload(
-        &mut self,
-        params: &ThumbnailsSetParams,
-        data: hyper::body::Bytes,
-    ) -> Result<ThumbnailSetResponse> {
-        let rel_path = format!("/upload/youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
-    ///
-    /// This method is a variant of `set()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn set_resumable_upload<'client>(
-        &'client mut self,
-        params: &ThumbnailsSetParams,
-    ) -> Result<ResumableUpload<'client, ThumbnailSetResponse>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/thumbnails/set",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-}
-
-/// The Youtube VideoCategories service represents the VideoCategories resource.
-pub struct VideoCategoriesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl VideoCategoriesService {
-    /// Create a new VideoCategoriesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> VideoCategoriesService {
-        VideoCategoriesService {
+    ) -> I18nRegionsService {
+        I18nRegionsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -11540,744 +15613,8 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut self,
-        params: &VideoCategoriesListParams,
-    ) -> Result<VideoCategoryListResponse> {
-        let rel_path = format!("youtube/v3/videoCategories",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube MembershipsLevels service represents the MembershipsLevels resource.
-pub struct MembershipsLevelsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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(
-        &mut 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::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 Comments service represents the Comments resource.
-pub struct CommentsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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();
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut self,
-        params: &CommentsUpdateParams,
-        req: &Comment,
-    ) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &CommentsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &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(&mut self, params: &CommentsListParams) -> Result<CommentListResponse> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref 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
-    }
-
-    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
-    pub async fn mark_as_spam(&mut self, params: &CommentsMarkAsSpamParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/markAsSpam",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Sets the moderation status of one or more comments.
-    pub async fn set_moderation_status(
-        &mut self,
-        params: &CommentsSetModerationStatusParams,
-    ) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/setModerationStatus",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube SuperChatEvents service represents the SuperChatEvents resource.
-pub struct SuperChatEventsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    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 + std::ops::Deref<Target = Authenticator>>(
-        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(
-        &mut 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 LiveChatModerators service represents the LiveChatModerators resource.
-pub struct LiveChatModeratorsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveChatModeratorsService {
-    /// Create a new LiveChatModeratorsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> LiveChatModeratorsService {
-        LiveChatModeratorsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &mut self,
-        params: &LiveChatModeratorsInsertParams,
-        req: &LiveChatModerator,
-    ) -> Result<LiveChatModerator> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut self,
-        params: &LiveChatModeratorsListParams,
-    ) -> Result<LiveChatModeratorListResponse> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes a chat moderator.
-    pub async fn delete(&mut self, params: &LiveChatModeratorsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube I18nLanguages service represents the I18nLanguages resource.
-pub struct I18nLanguagesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl I18nLanguagesService {
-    /// Create a new I18nLanguagesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
-        client: TlsClient,
-        auth: A,
-    ) -> I18nLanguagesService {
-        I18nLanguagesService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &mut self,
-        params: &I18nLanguagesListParams,
-    ) -> Result<I18nLanguageListResponse> {
-        let rel_path = format!("youtube/v3/i18nLanguages",);
+    pub async fn list(&mut 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![];
@@ -12502,6 +15839,1921 @@
     }
 }
 
+/// The Youtube Watermarks service represents the Watermarks resource.
+pub struct WatermarksService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl WatermarksService {
+    /// Create a new WatermarksService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> WatermarksService {
+        WatermarksService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Allows removal of channel watermark.
+    pub async fn unset(&mut self, params: &WatermarksUnsetParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/watermarks/unset",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Allows upload of watermark image and setting it for a channel.
+    pub async fn set(&mut self, params: &WatermarksSetParams, req: &InvideoBranding) -> Result<()> {
+        let rel_path = format!("youtube/v3/watermarks/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Allows upload of watermark image and setting it for a channel.
+    ///
+    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
+    pub async fn set_upload(
+        &mut self,
+        params: &WatermarksSetParams,
+        req: &InvideoBranding,
+        data: hyper::body::Bytes,
+    ) -> Result<()> {
+        let rel_path = format!("/upload/youtube/v3/watermarks/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// Allows upload of watermark image and setting it for a channel.
+    ///
+    /// This method is a variant of `set()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn set_resumable_upload<'client>(
+        &'client mut self,
+        params: &WatermarksSetParams,
+        req: &InvideoBranding,
+    ) -> Result<ResumableUpload<'client, ()>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/watermarks/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref 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 SuperChatEvents service represents the SuperChatEvents resource.
+pub struct SuperChatEventsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    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 + std::ops::Deref<Target = Authenticator>>(
+        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(
+        &mut 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 MembershipsLevels service represents the MembershipsLevels resource.
+pub struct MembershipsLevelsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    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 + std::ops::Deref<Target = Authenticator>>(
+        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(
+        &mut 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::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Videos service represents the Videos resource.
+pub struct VideosService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl VideosService {
+    /// Create a new VideosService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> VideosService {
+        VideosService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&mut self, params: &VideosDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(&mut self, params: &VideosInsertParams, req: &Video) -> Result<Video> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
+    pub async fn insert_upload(
+        &mut self,
+        params: &VideosInsertParams,
+        req: &Video,
+        data: hyper::body::Bytes,
+    ) -> Result<Video> {
+        let rel_path = format!("/upload/youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn insert_resumable_upload<'client>(
+        &'client mut self,
+        params: &VideosInsertParams,
+        req: &Video,
+    ) -> Result<ResumableUpload<'client, Video>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+
+    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
+    pub async fn get_rating(
+        &mut self,
+        params: &VideosGetRatingParams,
+    ) -> Result<VideoRatingListResponse> {
+        let rel_path = format!("youtube/v3/videos/getRating",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&mut self, params: &VideosListParams) -> Result<VideoListResponse> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Adds a like or dislike rating to a video or removes a rating from a video.
+    pub async fn rate(&mut self, params: &VideosRateParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos/rate",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Report abuse for a video.
+    pub async fn report_abuse(
+        &mut self,
+        params: &VideosReportAbuseParams,
+        req: &VideoAbuseReport,
+    ) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos/reportAbuse",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&mut self, params: &VideosUpdateParams, req: &Video) -> Result<Video> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube ThirdPartyLinks service represents the ThirdPartyLinks resource.
+pub struct ThirdPartyLinksService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ThirdPartyLinksService {
+    /// Create a new ThirdPartyLinksService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> ThirdPartyLinksService {
+        ThirdPartyLinksService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&mut self, params: &ThirdPartyLinksDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &mut self,
+        params: &ThirdPartyLinksUpdateParams,
+        req: &ThirdPartyLink,
+    ) -> Result<ThirdPartyLink> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &ThirdPartyLinksInsertParams,
+        req: &ThirdPartyLink,
+    ) -> Result<ThirdPartyLink> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&mut self, params: &ThirdPartyLinksListParams) -> Result<ThirdPartyLink> {
+        let rel_path = format!("youtube/v3/thirdPartyLinks",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube I18nLanguages service represents the I18nLanguages resource.
+pub struct I18nLanguagesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl I18nLanguagesService {
+    /// Create a new I18nLanguagesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> I18nLanguagesService {
+        I18nLanguagesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &mut self,
+        params: &I18nLanguagesListParams,
+    ) -> Result<I18nLanguageListResponse> {
+        let rel_path = format!("youtube/v3/i18nLanguages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Thumbnails service represents the Thumbnails resource.
+pub struct ThumbnailsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ThumbnailsService {
+    /// Create a new ThumbnailsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> ThumbnailsService {
+        ThumbnailsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
+    pub async fn set(&mut self, params: &ThumbnailsSetParams) -> Result<ThumbnailSetResponse> {
+        let rel_path = format!("youtube/v3/thumbnails/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
+    ///
+    /// This method is a variant of `set()`, taking data for upload. It performs a multipart upload.
+    pub async fn set_upload(
+        &mut self,
+        params: &ThumbnailsSetParams,
+        data: hyper::body::Bytes,
+    ) -> Result<ThumbnailSetResponse> {
+        let rel_path = format!("/upload/youtube/v3/thumbnails/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// As this is not an insert in a strict sense (it supports uploading/setting of a thumbnail for multiple videos, which doesn't result in creation of a single resource), I use a custom verb here.
+    ///
+    /// This method is a variant of `set()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn set_resumable_upload<'client>(
+        &'client mut self,
+        params: &ThumbnailsSetParams,
+    ) -> Result<ResumableUpload<'client, ThumbnailSetResponse>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/thumbnails/set",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+}
+
+/// The Youtube Activities service represents the Activities resource.
+pub struct ActivitiesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ActivitiesService {
+    /// Create a new ActivitiesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> ActivitiesService {
+        ActivitiesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&mut self, params: &ActivitiesListParams) -> Result<ActivityListResponse> {
+        let rel_path = format!("youtube/v3/activities",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Playlists service represents the Playlists resource.
+pub struct PlaylistsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl PlaylistsService {
+    /// Create a new PlaylistsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> PlaylistsService {
+        PlaylistsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &PlaylistsInsertParams,
+        req: &Playlist,
+    ) -> Result<Playlist> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&mut self, params: &PlaylistsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &mut self,
+        params: &PlaylistsUpdateParams,
+        req: &Playlist,
+    ) -> Result<Playlist> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&mut self, params: &PlaylistsListParams) -> Result<PlaylistListResponse> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube VideoCategories service represents the VideoCategories resource.
+pub struct VideoCategoriesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl VideoCategoriesService {
+    /// Create a new VideoCategoriesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> VideoCategoriesService {
+        VideoCategoriesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &mut self,
+        params: &VideoCategoriesListParams,
+    ) -> Result<VideoCategoryListResponse> {
+        let rel_path = format!("youtube/v3/videoCategories",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatModerators service represents the LiveChatModerators resource.
+pub struct LiveChatModeratorsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveChatModeratorsService {
+    /// Create a new LiveChatModeratorsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> LiveChatModeratorsService {
+        LiveChatModeratorsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a chat moderator.
+    pub async fn delete(&mut self, params: &LiveChatModeratorsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/moderators",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &LiveChatModeratorsInsertParams,
+        req: &LiveChatModerator,
+    ) -> Result<LiveChatModerator> {
+        let rel_path = format!("youtube/v3/liveChat/moderators",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &mut self,
+        params: &LiveChatModeratorsListParams,
+    ) -> Result<LiveChatModeratorListResponse> {
+        let rel_path = format!("youtube/v3/liveChat/moderators",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Tests service represents the Tests resource.
+pub struct TestsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl TestsService {
+    /// Create a new TestsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> TestsService {
+        TestsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// POST method.
+    pub async fn insert(&mut self, params: &TestsInsertParams, req: &TestItem) -> Result<TestItem> {
+        let rel_path = format!("youtube/v3/tests",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
 /// The Youtube CommentThreads service represents the CommentThreads resource.
 pub struct CommentThreadsService {
     client: TlsClient,
@@ -12673,8 +17925,8 @@
     }
 }
 
-/// The Youtube I18nRegions service represents the I18nRegions resource.
-pub struct I18nRegionsService {
+/// The Youtube ChannelSections service represents the ChannelSections resource.
+pub struct ChannelSectionsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
     scopes: Vec<String>,
@@ -12683,15 +17935,215 @@
     root_url: String,
 }
 
-impl I18nRegionsService {
-    /// Create a new I18nRegionsService 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 + std::ops::Deref<Target = Authenticator>>(
         client: TlsClient,
         auth: A,
-    ) -> I18nRegionsService {
-        I18nRegionsService {
+    ) -> ChannelSectionsService {
+        ChannelSectionsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &mut self,
+        params: &ChannelSectionsListParams,
+    ) -> Result<ChannelSectionListResponse> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &mut self,
+        params: &ChannelSectionsUpdateParams,
+        req: &ChannelSection,
+    ) -> Result<ChannelSection> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&mut self, params: &ChannelSectionsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &ChannelSectionsInsertParams,
+        req: &ChannelSection,
+    ) -> Result<ChannelSection> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatMessages service represents the LiveChatMessages resource.
+pub struct LiveChatMessagesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveChatMessagesService {
+    /// Create a new LiveChatMessagesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> LiveChatMessagesService {
+        LiveChatMessagesService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -12744,8 +18196,474 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut self, params: &I18nRegionsListParams) -> Result<I18nRegionListResponse> {
-        let rel_path = format!("youtube/v3/i18nRegions",);
+    pub async fn list(
+        &mut self,
+        params: &LiveChatMessagesListParams,
+    ) -> Result<LiveChatMessageListResponse> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &LiveChatMessagesInsertParams,
+        req: &LiveChatMessage,
+    ) -> Result<LiveChatMessage> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Deletes a chat message.
+    pub async fn delete(&mut self, params: &LiveChatMessagesDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+}
+
+/// The Youtube Subscriptions service represents the Subscriptions resource.
+pub struct SubscriptionsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl SubscriptionsService {
+    /// Create a new SubscriptionsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> SubscriptionsService {
+        SubscriptionsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &SubscriptionsInsertParams,
+        req: &Subscription,
+    ) -> Result<Subscription> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&mut self, params: &SubscriptionsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &mut self,
+        params: &SubscriptionsListParams,
+    ) -> Result<SubscriptionListResponse> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatBans service represents the LiveChatBans resource.
+pub struct LiveChatBansService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveChatBansService {
+    /// Create a new LiveChatBansService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> LiveChatBansService {
+        LiveChatBansService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a chat ban.
+    pub async fn delete(&mut self, params: &LiveChatBansDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/bans",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &mut self,
+        params: &LiveChatBansInsertParams,
+        req: &LiveChatBan,
+    ) -> Result<LiveChatBan> {
+        let rel_path = format!("youtube/v3/liveChat/bans",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Search service represents the Search resource.
+pub struct SearchService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl SearchService {
+    /// Create a new SearchService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> SearchService {
+        SearchService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of search resources
+    pub async fn list(&mut self, params: &SearchListParams) -> Result<SearchListResponse> {
+        let rel_path = format!("youtube/v3/search",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -12843,11 +18761,12 @@
             .collect();
     }
 
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
+    /// Updates an existing resource.
+    pub async fn update(
         &mut self,
-        params: &PlaylistItemsListParams,
-    ) -> Result<PlaylistItemListResponse> {
+        params: &PlaylistItemsUpdateParams,
+        req: &PlaylistItem,
+    ) -> Result<PlaylistItem> {
         let rel_path = format!("youtube/v3/playlistItems",);
         let path = self.format_path(rel_path.as_str());
 
@@ -12872,7 +18791,8 @@
         let full_uri = path + &url_params;
 
         let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
     }
 
     /// Inserts a new resource into this collection.
@@ -12909,40 +18829,6 @@
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
 
-    /// Updates an existing resource.
-    pub async fn update(
-        &mut self,
-        params: &PlaylistItemsUpdateParams,
-        req: &PlaylistItem,
-    ) -> Result<PlaylistItem> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
     /// Deletes a resource.
     pub async fn delete(&mut self, params: &PlaylistItemsDeleteParams) -> Result<()> {
         let rel_path = format!("youtube/v3/playlistItems",);
@@ -12971,6 +18857,38 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
     }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &mut self,
+        params: &PlaylistItemsListParams,
+    ) -> Result<PlaylistItemListResponse> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref 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.
@@ -13076,8 +18994,8 @@
     }
 }
 
-/// The Youtube Videos service represents the Videos resource.
-pub struct VideosService {
+/// The Youtube AbuseReports service represents the AbuseReports resource.
+pub struct AbuseReportsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
     scopes: Vec<String>,
@@ -13086,15 +19004,15 @@
     root_url: String,
 }
 
-impl VideosService {
-    /// Create a new VideosService object. The easiest way to call this is wrapping the Authenticator
+impl AbuseReportsService {
+    /// Create a new AbuseReportsService object. The easiest way to call this is wrapping the Authenticator
     /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
     pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
         client: TlsClient,
         auth: A,
-    ) -> VideosService {
-        VideosService {
+    ) -> AbuseReportsService {
+        AbuseReportsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -13146,290 +19064,19 @@
             .collect();
     }
 
-    /// Deletes a resource.
-    pub async fn delete(&mut self, params: &VideosDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Adds a like or dislike rating to a video or removes a rating from a video.
-    pub async fn rate(&mut self, params: &VideosRateParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos/rate",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
     /// Inserts a new resource into this collection.
-    pub async fn insert(&mut self, params: &VideosInsertParams, req: &Video) -> Result<Video> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
-    pub async fn insert_upload(
+    pub async fn insert(
         &mut self,
-        params: &VideosInsertParams,
-        req: &Video,
-        data: hyper::body::Bytes,
-    ) -> Result<Video> {
-        let rel_path = format!("/upload/youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn insert_resumable_upload<'client>(
-        &'client mut self,
-        params: &VideosInsertParams,
-        req: &Video,
-    ) -> Result<ResumableUpload<'client, Video>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&mut self, params: &VideosUpdateParams, req: &Video) -> Result<Video> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
-    pub async fn get_rating(
-        &mut self,
-        params: &VideosGetRatingParams,
-    ) -> Result<VideoRatingListResponse> {
-        let rel_path = format!("youtube/v3/videos/getRating",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&mut self, params: &VideosListParams) -> Result<VideoListResponse> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Report abuse for a video.
-    pub async fn report_abuse(
-        &mut self,
-        params: &VideosReportAbuseParams,
-        req: &VideoAbuseReport,
-    ) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos/reportAbuse",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+        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?;
@@ -13587,3 +19234,690 @@
         do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
     }
 }
+
+/// The Youtube Sponsors service represents the Sponsors resource.
+pub struct SponsorsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl SponsorsService {
+    /// Create a new SponsorsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> SponsorsService {
+        SponsorsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of sponsors that match the request criteria for a channel.
+    pub async fn list(&mut self, params: &SponsorsListParams) -> Result<SponsorListResponse> {
+        let rel_path = format!("youtube/v3/sponsors",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube LiveStreams service represents the LiveStreams resource.
+pub struct LiveStreamsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveStreamsService {
+    /// Create a new LiveStreamsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> LiveStreamsService {
+        LiveStreamsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes an existing stream for the authenticated user.
+    pub async fn delete(&mut self, params: &LiveStreamsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Retrieve the list of streams associated with the given channel. --
+    pub async fn list(&mut self, params: &LiveStreamsListParams) -> Result<LiveStreamListResponse> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Inserts a new stream for the authenticated user.
+    pub async fn insert(
+        &mut self,
+        params: &LiveStreamsInsertParams,
+        req: &LiveStream,
+    ) -> Result<LiveStream> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing stream for the authenticated user.
+    pub async fn update(
+        &mut self,
+        params: &LiveStreamsUpdateParams,
+        req: &LiveStream,
+    ) -> Result<LiveStream> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
+pub struct LiveBroadcastsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveBroadcastsService {
+    /// Create a new LiveBroadcastsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Rc`: `new(client.clone(), Rc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + std::ops::Deref<Target = Authenticator>>(
+        client: TlsClient,
+        auth: A,
+    ) -> LiveBroadcastsService {
+        LiveBroadcastsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Updates an existing broadcast for the authenticated user.
+    pub async fn update(
+        &mut self,
+        params: &LiveBroadcastsUpdateParams,
+        req: &LiveBroadcast,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+
+    /// Delete a given broadcast.
+    pub async fn delete(&mut self, params: &LiveBroadcastsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Retrieve the list of broadcasts associated with the given channel.
+    pub async fn list(
+        &mut self,
+        params: &LiveBroadcastsListParams,
+    ) -> Result<LiveBroadcastListResponse> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Bind a broadcast to a stream.
+    pub async fn bind(&mut self, params: &LiveBroadcastsBindParams) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/bind",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Transition a broadcast to a given status.
+    pub async fn transition(
+        &mut self,
+        params: &LiveBroadcastsTransitionParams,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/transition",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new stream for the authenticated user.
+    pub async fn insert(
+        &mut self,
+        params: &LiveBroadcastsInsertParams,
+        req: &LiveBroadcast,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Slate and recording control of the live broadcast. Support actions: slate on/off, recording start/stop/pause/resume. Design doc: goto/yt-api-liveBroadcast-control
+    pub async fn control(&mut self, params: &LiveBroadcastsControlParams) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/control",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Members service represents the Members resource.
+pub struct MembersService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + std::ops::Deref<Target = Authenticator>>,
+    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 + std::ops::Deref<Target = Authenticator>>(
+        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(&mut self, params: &MembersListParams) -> Result<MemberListResponse> {
+        let rel_path = format!("youtube/v3/members",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref 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
+    }
+}